Skip to content
Snippets Groups Projects
Edm4hepWriterAnaElemTool.h 6.11 KiB
Newer Older
#ifndef Edm4hepWriterAnaElemTool_h
#define Edm4hepWriterAnaElemTool_h

#include "GaudiKernel/AlgTool.h"
#include "k4FWCore/DataHandle.h"
#include "DetSimInterface/IAnaElemTool.h"
#include "DetSimInterface/CommonUserEventInfo.hh"
#include "DetSimInterface/CommonUserTrackInfo.hh"

#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;