Newer
Older
#ifndef Edm4hepWriterAnaElemTool_h
#define Edm4hepWriterAnaElemTool_h
#include <map>
#include "GaudiKernel/AlgTool.h"
#include "k4FWCore/DataHandle.h"
#include "DetSimInterface/IAnaElemTool.h"
#include "DetSimInterface/CommonUserEventInfo.hh"
#include "DetSimInterface/CommonUserTrackInfo.hh"
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include "edm4hep/MCParticleCollection.h"
#include "edm4hep/SimTrackerHitCollection.h"
#include "edm4hep/SimCalorimeterHitCollection.h"
#include "edm4hep/CaloHitContributionCollection.h"
class Edm4hepWriterAnaElemTool: public extends<AlgTool, IAnaElemTool> {
public:
using extends::extends;
/// IAnaElemTool interface
// Run
virtual void BeginOfRunAction(const G4Run*) override;
virtual void EndOfRunAction(const G4Run*) override;
// Event
virtual void BeginOfEventAction(const G4Event*) override;
virtual void EndOfEventAction(const G4Event*) override;
// Tracking
virtual void PreUserTrackingAction(const G4Track*) override;
virtual void PostUserTrackingAction(const G4Track*) override;
// Stepping
virtual void UserSteppingAction(const G4Step*) override;
/// Overriding initialize and finalize
StatusCode initialize() override;
StatusCode finalize() override;
private:
// In order to associate MCParticle with contribution, we need to access MC Particle.
// - collection MCParticle: the particles in Generator
DataHandle<edm4hep::MCParticleCollection> m_mcParGenCol{"MCParticleGen",
Gaudi::DataHandle::Writer, this};
// - collection MCParticleG4: the simulated particles in Geant4
DataHandle<edm4hep::MCParticleCollection> m_mcParCol{"MCParticle",
Gaudi::DataHandle::Writer, this};
edm4hep::MCParticleCollection* mcCol;
// Generic collections for Tracker and Calorimeter
DataHandle<edm4hep::SimTrackerHitCollection> m_trackerCol{"SimTrackerCol",
Gaudi::DataHandle::Writer, this};
DataHandle<edm4hep::SimCalorimeterHitCollection> m_calorimeterCol{"SimCalorimeterCol",
Gaudi::DataHandle::Writer, this};
DataHandle<edm4hep::CaloHitContributionCollection> m_caloContribCol{"SimCaloContributionCol",
Gaudi::DataHandle::Writer, this};
// Dedicated collections for CEPC
DataHandle<edm4hep::SimTrackerHitCollection> m_VXDCol{"VXDCollection",
Gaudi::DataHandle::Writer, this};
DataHandle<edm4hep::SimTrackerHitCollection> m_FTDCol{"FTDCollection",
Gaudi::DataHandle::Writer, this};
DataHandle<edm4hep::SimTrackerHitCollection> m_SITCol{"SITCollection",
Gaudi::DataHandle::Writer, this};
DataHandle<edm4hep::SimTrackerHitCollection> m_TPCCol{"TPCCollection",
Gaudi::DataHandle::Writer, this};
DataHandle<edm4hep::SimTrackerHitCollection> m_SETCol{"SETCollection",
Gaudi::DataHandle::Writer, this};
// Ecal
DataHandle<edm4hep::SimCalorimeterHitCollection> m_EcalBarrelCol{"EcalBarrelCollection",
Gaudi::DataHandle::Writer, this};
DataHandle<edm4hep::CaloHitContributionCollection> m_EcalBarrelContributionCol{
"EcalBarrelContributionCollection",
Gaudi::DataHandle::Writer, this};
DataHandle<edm4hep::SimCalorimeterHitCollection> m_EcalEndcapsCol{"EcalEndcapsCollection",
Gaudi::DataHandle::Writer, this};
DataHandle<edm4hep::CaloHitContributionCollection> m_EcalEndcapsContributionCol{
"EcalEndcapsContributionCollection",
Gaudi::DataHandle::Writer, this};
DataHandle<edm4hep::SimCalorimeterHitCollection> m_EcalEndcapRingCol{"EcalEndcapRingCollection",
Gaudi::DataHandle::Writer, this};
DataHandle<edm4hep::CaloHitContributionCollection> m_EcalEndcapRingContributionCol{
"EcalEndcapRingContributionCollection",
Gaudi::DataHandle::Writer, this};
// Hcal
DataHandle<edm4hep::SimCalorimeterHitCollection> m_HcalBarrelCol{"HcalBarrelCollection",
Gaudi::DataHandle::Writer, this};
DataHandle<edm4hep::CaloHitContributionCollection> m_HcalBarrelContributionCol{
"HcalBarrelContributionCollection",
Gaudi::DataHandle::Writer, this};
DataHandle<edm4hep::SimCalorimeterHitCollection> m_HcalEndcapsCol{"HcalEndcapsCollection",
Gaudi::DataHandle::Writer, this};
DataHandle<edm4hep::CaloHitContributionCollection> m_HcalEndcapsContributionCol{
"HcalEndcapsContributionCollection",
Gaudi::DataHandle::Writer, this};
DataHandle<edm4hep::SimCalorimeterHitCollection> m_HcalEndcapRingCol{"HcalEndcapRingCollection",
Gaudi::DataHandle::Writer, this};
DataHandle<edm4hep::CaloHitContributionCollection> m_HcalEndcapRingContributionCol{
"HcalEndcapRingContributionCollection",
Gaudi::DataHandle::Writer, this};
// Coil
DataHandle<edm4hep::SimTrackerHitCollection> m_COILCol{"COILCollection",
Gaudi::DataHandle::Writer, this};
// Muon
DataHandle<edm4hep::SimCalorimeterHitCollection> m_MuonBarrelCol{"MuonBarrelCollection",
Gaudi::DataHandle::Writer, this};
DataHandle<edm4hep::CaloHitContributionCollection> m_MuonBarrelContributionCol{
"MuonBarrelContributionCollection",
Gaudi::DataHandle::Writer, this};
DataHandle<edm4hep::SimCalorimeterHitCollection> m_MuonEndcapsCol{"MuonEndcapsCollection",
Gaudi::DataHandle::Writer, this};
DataHandle<edm4hep::CaloHitContributionCollection> m_MuonEndcapsContributionCol{
"MuonEndcapsContributionCollection",
Gaudi::DataHandle::Writer, this};
// Drift Chamber
// - DriftChamberHitsCollection
DataHandle<edm4hep::SimTrackerHitCollection> m_DriftChamberHitsCol{
"DriftChamberHitsCollection",
Gaudi::DataHandle::Writer, this};
private:
// in order to associate the hit contribution with the primary track,
// we have a bookkeeping of every track.
// The primary track will assign the same key/value.
// Following is an example:
// 1 -> 1,
// 2 -> 2,
// 3 -> 1,
// Now, if parent of trk #4 is trk #3, using the mapping {3->1} could
// locate the primary trk #1.
std::map<int, int> m_track2primary;
CommonUserEventInfo* m_userinfo = nullptr;