diff --git a/PhysicsAnalysis/TopPhys/xAOD/TopAnalysis/Root/EventSaverFlatNtuple.cxx b/PhysicsAnalysis/TopPhys/xAOD/TopAnalysis/Root/EventSaverFlatNtuple.cxx index ff59ee21dc3097dcb67922a5c0230edca628b7d5..7297444bd3bccb5ca97de14a8ff616225a8194e7 100644 --- a/PhysicsAnalysis/TopPhys/xAOD/TopAnalysis/Root/EventSaverFlatNtuple.cxx +++ b/PhysicsAnalysis/TopPhys/xAOD/TopAnalysis/Root/EventSaverFlatNtuple.cxx @@ -3356,8 +3356,8 @@ namespace top { m_mu_true_type[i] = 0; m_mu_true_origin[i] = 0; m_mu_true_isPrompt[i] = 0; - m_mu_prodVtx_z[i] = 0; - m_mu_prodVtx_perp[i] = 0; + m_mu_prodVtx_z[i] = -999; + m_mu_prodVtx_perp[i] = -999; if (muPtr->isAvailable<unsigned int>("particleType")) { m_mu_true_type[i] = muPtr->auxdata<unsigned int>("particleType"); } else if (muPtr->isAvailable<unsigned int>("classifierParticleType")) { diff --git a/PhysicsAnalysis/TopPhys/xAOD/TopHLUpgrade/Root/UpgradeObjectLoader.cxx b/PhysicsAnalysis/TopPhys/xAOD/TopHLUpgrade/Root/UpgradeObjectLoader.cxx index f275f6a6f1566982269f966752d84a8914c980d9..7d758e5c932891bae250c799516cfde3638eab09 100644 --- a/PhysicsAnalysis/TopPhys/xAOD/TopHLUpgrade/Root/UpgradeObjectLoader.cxx +++ b/PhysicsAnalysis/TopPhys/xAOD/TopHLUpgrade/Root/UpgradeObjectLoader.cxx @@ -127,6 +127,10 @@ ParticleLevelEvent UpgradeObjectLoader::load() { const xAOD::TruthParticleContainer * origmuons(0); top::check( evtStore()->retrieve( origmuons, m_config->sgKeyTruthMuons() ), "xAOD::TEvent::retrieve failed for Truth Muons" ); + // get truth particles + const xAOD::TruthParticleContainer * truthpart(0); + top::check( evtStore()->retrieve( truthpart, m_config->sgKeyMCParticle() ), + "xAOD::TEvent::retrieve failed for Truth Particles" ); // Shallow copy auto muons_shallowCopy = xAOD::shallowCopyContainer( *origmuons ); @@ -151,15 +155,27 @@ ParticleLevelEvent UpgradeObjectLoader::load() { else muon->auxdata<int>("passReco") = 0; // apply all cuts - if( m_objectSelector_Muon->apply( *muon ) ) m_selectedMuons->push_back( muon ); - - //add production vertex info - const ElementLink<xAOD::TruthVertexContainer> prodVtxLink = - muon->auxdata<ElementLink< xAOD::TruthVertexContainer > >("prodVtxLink"); - if(prodVtxLink.isValid()) { - const xAOD::TruthVertex *tvtx = *prodVtxLink; - muon->auxdata<float>("prodVtx_z") = tvtx->z(); - muon->auxdata<float>("prodVtx_perp") = tvtx->perp(); + if( m_objectSelector_Muon->apply( *muon ) ) { + + //find matching truth particle by barcode + //this is done after selection to spend less time looping all TPs + for (const auto tp : *truthpart) { + if (muon->barcode() == tp->barcode()) { + //Add production vertex info- only truthparticle has a working + //prodVtxLink + const ElementLink<xAOD::TruthVertexContainer> prodVtxLink = + tp->auxdata<ElementLink< xAOD::TruthVertexContainer > > + ("prodVtxLink"); + if(prodVtxLink.isValid()) { + const xAOD::TruthVertex *tvtx = *prodVtxLink; + muon->auxdata<float>("prodVtx_z") = tvtx->z(); + muon->auxdata<float>("prodVtx_perp") = tvtx->perp(); + } + break; + } + } + + m_selectedMuons->push_back( muon ); } }