From 695be9530d08fb3d02851ebc05ed65ba0a1d2431 Mon Sep 17 00:00:00 2001 From: Andre Sailer <andre.philippe.sailer@cern.ch> Date: Fri, 8 Apr 2016 08:31:23 +0000 Subject: [PATCH] Fix for particle history mixup The G4event primary map does not know about the final state particles, apparently. Need to find the G4Primaries we know about in the primaryMap and look the the corresponding TrackID that was updated inside Geant4 --- DDG4/src/Geant4ParticleHandler.cpp | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/DDG4/src/Geant4ParticleHandler.cpp b/DDG4/src/Geant4ParticleHandler.cpp index 2b3021f7d..3ed0126eb 100644 --- a/DDG4/src/Geant4ParticleHandler.cpp +++ b/DDG4/src/Geant4ParticleHandler.cpp @@ -48,14 +48,12 @@ using namespace DD4hep::Simulation; typedef ReferenceBitMask<int> PropertyMask; namespace { - G4PrimaryParticle* primary(int id, const G4Event& evt) { - for(int i=0, ni=evt.GetNumberOfPrimaryVertex(); i<ni; ++i) { - G4PrimaryVertex* v = evt.GetPrimaryVertex(i); - for(int j=0, nj=v->GetNumberOfParticle(); j<nj; ++j) { - G4PrimaryParticle* p = v->GetPrimary(j); - if ( id == p->GetTrackID() ) { - return p; - } + const G4PrimaryParticle* primary(int id, Geant4PrimaryMap::Primaries const& primaryMap) { + Geant4PrimaryMap::Primaries::const_iterator iprim = primaryMap.begin(); + Geant4PrimaryMap::Primaries::const_iterator primEnd = primaryMap.end(); + for (; iprim != primEnd; ++iprim) { + if( iprim->first->GetTrackID() == id ){ + return iprim->first; } } return 0; @@ -213,7 +211,7 @@ void Geant4ParticleHandler::begin(const G4Track* track) { G4ThreeVector m = h.momentum(); const G4ThreeVector& v = h.vertex(); int reason = (kine > m_kinEnergyCut) ? G4PARTICLE_ABOVE_ENERGY_THRESHOLD : 0; - G4PrimaryParticle* prim = primary(h.id(),context()->event().event()); + const G4PrimaryParticle* prim = primary(h.id(),m_primaryMap->primaryMap); Particle* prim_part = 0; if ( prim ) { -- GitLab