From a0bec289d34f9d153fbc080cfcf3cf26ea0650db Mon Sep 17 00:00:00 2001 From: Kevin Finelli <kevin.finelli@cern.ch> Date: Tue, 10 Jul 2018 15:15:58 -0400 Subject: [PATCH] Fix prodVtx info by linking muons to TruthParticle Former-commit-id: ea7fa9ba5fa80c50de233a03cba594af9feb6ce1 --- .../TopAnalysis/Root/EventSaverFlatNtuple.cxx | 4 +-- .../TopHLUpgrade/Root/UpgradeObjectLoader.cxx | 34 ++++++++++++++----- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/PhysicsAnalysis/TopPhys/xAOD/TopAnalysis/Root/EventSaverFlatNtuple.cxx b/PhysicsAnalysis/TopPhys/xAOD/TopAnalysis/Root/EventSaverFlatNtuple.cxx index ff59ee21dc3..7297444bd3b 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 f275f6a6f15..7d758e5c932 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 ); } } -- GitLab