diff --git a/Simulation/DetSimAna/src/Edm4hepWriterAnaElemTool.cpp b/Simulation/DetSimAna/src/Edm4hepWriterAnaElemTool.cpp index 851e8c5595c78a934fb8dc569d53352b026201f2..7d6c24ccf06fcf649ba792fbebb0d2814a4b0f2b 100644 --- a/Simulation/DetSimAna/src/Edm4hepWriterAnaElemTool.cpp +++ b/Simulation/DetSimAna/src/Edm4hepWriterAnaElemTool.cpp @@ -6,6 +6,7 @@ #include "G4EventManager.hh" #include "G4TrackingManager.hh" #include "G4SteppingManager.hh" +#include "G4GammaGeneralProcess.hh" #include "DD4hep/Detector.h" #include "DD4hep/Plugins.h" @@ -363,6 +364,37 @@ Edm4hepWriterAnaElemTool::PreUserTrackingAction(const G4Track* track) { void Edm4hepWriterAnaElemTool::PostUserTrackingAction(const G4Track* track) { + // + // cache all the necessary processes + // + static G4VProcess* proc_decay = nullptr; + static G4VProcess* photon_general = nullptr; // default + static G4VProcess* photon_conv = nullptr; // "/process/em/UseGeneralProcess false" + if (!proc_decay || (!(photon_general || photon_conv))) { + G4ProcessManager* pm + = track->GetDefinition()->GetProcessManager(); + G4int nprocesses = pm->GetProcessListLength(); + G4ProcessVector* pv = pm->GetProcessList(); + + for(G4int i=0; i<nprocesses; ++i){ + info() << " process: " << (*pv)[i]->GetProcessName() << endmsg; + if((*pv)[i]->GetProcessName()=="Decay"){ + proc_decay = (*pv)[i]; + } else if((*pv)[i]->GetProcessName()=="GammaGeneralProc"){ + photon_general = (*pv)[i]; + photon_conv = dynamic_cast<G4GammaGeneralProcess*>(photon_general)->GetEmProcess("conv"); + info() << "gamma general proc: " << photon_general + << " conv: " << photon_conv + << endmsg; + } else if((*pv)[i]->GetProcessName()=="conv"){ + photon_conv = (*pv)[i]; + } + } + + } + + + int curtrkid = track->GetTrackID(); // starts from 1 int curparid = track->GetParentID(); int idxedm4hep = -1; @@ -405,22 +437,6 @@ Edm4hepWriterAnaElemTool::PostUserTrackingAction(const G4Track* track) { // Update the flags of the primary particles // =================================================================== - // processes - static G4VProcess* proc_decay = nullptr; - if (!proc_decay) { - G4ProcessManager* pm - = track->GetDefinition()->GetProcessManager(); - G4int nprocesses = pm->GetProcessListLength(); - G4ProcessVector* pv = pm->GetProcessList(); - - for(G4int i=0; i<nprocesses; ++i){ - if((*pv)[i]->GetProcessName()=="Decay"){ - proc_decay = (*pv)[i]; - } - } - - } - // flags bool is_decay = false; @@ -437,8 +453,9 @@ Edm4hepWriterAnaElemTool::PostUserTrackingAction(const G4Track* track) { const G4VProcess* creatorProcess = sectrk->GetCreatorProcess(); // select the necessary processes - if (creatorProcess==proc_decay) { - debug() << "Creator Process is Decay for secondary particle: " + if (creatorProcess==proc_decay || creatorProcess==photon_general || creatorProcess==photon_conv) { + debug() << "Creator Process is " << creatorProcess->GetProcessName() + << " for secondary particle: " << " idx: " << i << " trkid: " << sectrk->GetTrackID() // not valid until track << " particle: " << secparticle->GetParticleName() @@ -447,7 +464,7 @@ Edm4hepWriterAnaElemTool::PostUserTrackingAction(const G4Track* track) { << " time: " << sectrk->GetGlobalTime() << " momentum: " << sectrk->GetMomentum() // << endmsg; - is_decay = true; + if (creatorProcess==proc_decay) is_decay = true; // create secondaries in MC particles // todo: convert the const collection to non-const