From 396a9772fb61b756692c7ab5a62bbfe4c5c38f83 Mon Sep 17 00:00:00 2001 From: Roger Naranjo <roger.naranjo@cern.ch> Date: Thu, 27 Sep 2018 10:01:05 +0000 Subject: [PATCH] ATLASRECTS-4590: cache for the caloExtension in the MCTruthClassifier Former-commit-id: 88b65db6cfafb374796947c1bd300379a34eed58 --- .../MCTruthClassifier/CMakeLists.txt | 7 ++-- .../MCTruthClassifier/IMCTruthClassifier.h | 19 ++++++++--- .../MCTruthClassifier/MCTruthClassifier.h | 5 +-- .../Root/MCTruthClassifier.cxx | 15 --------- .../src/MCTruthClassifierAthena.cxx | 11 ++++--- .../src/egammaTruthAssociationAlg.cxx | 33 ++++++++----------- .../src/egammaTruthAssociationAlg.h | 8 +++-- 7 files changed, 46 insertions(+), 52 deletions(-) diff --git a/PhysicsAnalysis/MCTruthClassifier/CMakeLists.txt b/PhysicsAnalysis/MCTruthClassifier/CMakeLists.txt index 64ff08b6822..a6abcb25ed9 100644 --- a/PhysicsAnalysis/MCTruthClassifier/CMakeLists.txt +++ b/PhysicsAnalysis/MCTruthClassifier/CMakeLists.txt @@ -17,14 +17,15 @@ elseif( XAOD_ANALYSIS ) else() set( extra_deps GaudiKernel Reconstruction/RecoTools/ParticlesInConeTools + Reconstruction/RecoTools/RecoToolInterfaces PRIVATE Generators/TruthUtils - Reconstruction/RecoTools/RecoToolInterfaces Tracking/TrkEvent/TrkEventPrimitives Tracking/TrkEvent/TrkParametersIdentificationHelpers + Tracking/TrkEvent/TrkCaloExtension Control/AthenaKernel ) - set( extra_libs GaudiKernel - PRIVATE_LINK_LIBRARIES GeneratorObjects RecoToolInterfaces + set( extra_libs GaudiKernel RecoToolInterfaces + PRIVATE_LINK_LIBRARIES GeneratorObjects TrkEventPrimitives TrkParametersIdentificationHelpers ) endif() diff --git a/PhysicsAnalysis/MCTruthClassifier/MCTruthClassifier/IMCTruthClassifier.h b/PhysicsAnalysis/MCTruthClassifier/MCTruthClassifier/IMCTruthClassifier.h index 8ac2f28ad4a..f0b6804bbdc 100644 --- a/PhysicsAnalysis/MCTruthClassifier/MCTruthClassifier/IMCTruthClassifier.h +++ b/PhysicsAnalysis/MCTruthClassifier/MCTruthClassifier/IMCTruthClassifier.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration */ /////////////////////////////////////////////////////////////////// @@ -13,7 +13,7 @@ Interface for the PhysicsAnalysis/MCTruthClassifier/MCTruthclassifier @author Frederic Derue derue@lpnhe.in2p3.fr CREATED : 01/09/2008 - MODIFIED : + MODIFIED : */ #include "AsgTools/IAsgTool.h" @@ -26,15 +26,20 @@ #include "xAODEgamma/PhotonFwd.h" #include "xAODTracking/TrackParticleFwd.h" #include "xAODCaloEvent/CaloClusterFwd.h" + #include "xAODTruth/TruthParticle.h" #include "xAODMuon/Muon.h" #include "xAODJet/Jet.h" +#include <memory> +#include <unordered_map> + #define MCTRUTHCLASSIFIER_CONST #ifndef XAOD_ANALYSIS +#include "RecoToolInterfaces/IParticleCaloExtensionTool.h" namespace HepMC { class GenParticle; } @@ -45,8 +50,9 @@ class IMCTruthClassifier : virtual public asg::IAsgTool { ASG_TOOL_INTERFACE(IMCTruthClassifier) public: - - +#ifndef XAOD_ANALYSIS + typedef std::unordered_map<size_t,std::unique_ptr<Trk::CaloExtension>> Cache; +#endif // Additional information that can be returned by the classifier. // Originally, these were all held in member variables in the classifier, // but that prevents the classifier methods from being made const. @@ -55,6 +61,7 @@ class IMCTruthClassifier : virtual public asg::IAsgTool { class Info { public: + const xAOD::TruthParticle* genPart = nullptr; MCTruthPartClassifier::ParticleOutCome particleOutCome = MCTruthPartClassifier::UnknownOutCome; @@ -75,7 +82,9 @@ class IMCTruthClassifier : virtual public asg::IAsgTool { const xAOD::TruthParticle* photonMother = nullptr; const xAOD::TruthParticle* bkgElecMother = nullptr; - +#ifndef XAOD_ANALYSIS + Cache *extrapolationCache = nullptr; +#endif std::vector<const xAOD::TruthParticle*> egPartPtr; std::vector<float> egPartdR; std::vector<std::pair<MCTruthPartClassifier::ParticleType,MCTruthPartClassifier::ParticleOrigin> > egPartClas; diff --git a/PhysicsAnalysis/MCTruthClassifier/MCTruthClassifier/MCTruthClassifier.h b/PhysicsAnalysis/MCTruthClassifier/MCTruthClassifier/MCTruthClassifier.h index 50a352f5006..3e15deae450 100644 --- a/PhysicsAnalysis/MCTruthClassifier/MCTruthClassifier/MCTruthClassifier.h +++ b/PhysicsAnalysis/MCTruthClassifier/MCTruthClassifier/MCTruthClassifier.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration */ #ifndef MCTRUTHCLASSIFIER_MCTRUTHCLASSIFIER_H @@ -17,6 +17,7 @@ Updated: #include "AsgTools/AsgTool.h" #include "MCTruthClassifier/MCTruthClassifierDefs.h" #include "MCTruthClassifier/IMCTruthClassifier.h" + // EDM includes #include "xAODTruth/TruthParticleContainerFwd.h" @@ -128,7 +129,7 @@ class MCTruthClassifier : virtual public IMCTruthClassifier , public asg::AsgToo // static double partCharge(const xAOD::TruthParticle*); #ifndef XAOD_ANALYSIS - bool genPartToCalo(const xAOD::CaloCluster* , const xAOD::TruthParticle* , bool, double&, bool& ) const; + bool genPartToCalo(const xAOD::CaloCluster* , const xAOD::TruthParticle* , bool, double&, bool&, Cache * ) const; const xAOD::TruthParticle* egammaClusMatch(const xAOD::CaloCluster*, bool, Info* info) const; #endif diff --git a/PhysicsAnalysis/MCTruthClassifier/Root/MCTruthClassifier.cxx b/PhysicsAnalysis/MCTruthClassifier/Root/MCTruthClassifier.cxx index 0389a685078..401a600c4e0 100644 --- a/PhysicsAnalysis/MCTruthClassifier/Root/MCTruthClassifier.cxx +++ b/PhysicsAnalysis/MCTruthClassifier/Root/MCTruthClassifier.cxx @@ -152,7 +152,6 @@ MCTruthClassifier::particleTruthClassifier(const xAOD::TruthParticle *thePart, ParticleOrigin partOrig = NonDefined; if (info) { - *info = Info(); info->genPart = thePart; } @@ -330,7 +329,6 @@ MCTruthClassifier::particleTruthClassifier(const xAOD::TrackParticle *trkPtr, const xAOD::TruthParticle* genPart = getGenPart(trkPtr); if (info) { - *info = Info(); info->genPart = genPart; } @@ -369,7 +367,6 @@ MCTruthClassifier::particleTruthClassifier(const xAOD::Electron* elec, } if (info) { - *info = Info(); info->genPart = genPart; } @@ -392,8 +389,6 @@ MCTruthClassifier::particleTruthClassifier(const xAOD::Photon* phot, ParticleType parttype = Unknown; ParticleOrigin partorig = NonDefined; - if (info) - *info = Info(); const xAOD::CaloCluster* clus=phot->caloCluster(); if(!clus) return std::make_pair(parttype,partorig); @@ -441,9 +436,6 @@ MCTruthClassifier::particleTruthClassifier(const xAOD::Muon* mu, //----------------------------------------------------------------------------------------- ATH_MSG_DEBUG( "Executing muon Classifier" ); - - if (info) - *info = Info(); ParticleType parttype = Unknown; ParticleOrigin partorig = NonDefined; @@ -479,9 +471,6 @@ MCTruthClassifier::particleTruthClassifier(const xAOD::CaloCluster* clus, ParticleType parttype = Unknown; ParticleOrigin partorig = NonDefined; - if (info){ - *info = Info(); - } if(!clus){ return std::make_pair(parttype,partorig); } @@ -512,10 +501,6 @@ MCTruthClassifier::particleTruthClassifier(const xAOD::Jet* jet, bool DR, ATH_MSG_DEBUG( "Executing Classifier with jet Input" ); - if (info){ - *info = Info(); - } - ParticleType parttype = UnknownJet; ParticleOrigin partorig = NonDefined; ParticleType tempparttype = UnknownJet; diff --git a/PhysicsAnalysis/MCTruthClassifier/src/MCTruthClassifierAthena.cxx b/PhysicsAnalysis/MCTruthClassifier/src/MCTruthClassifierAthena.cxx index ea6dab830fb..c7a727b0f9e 100644 --- a/PhysicsAnalysis/MCTruthClassifier/src/MCTruthClassifierAthena.cxx +++ b/PhysicsAnalysis/MCTruthClassifier/src/MCTruthClassifierAthena.cxx @@ -152,7 +152,7 @@ MCTruthClassifier::egammaClusMatch(const xAOD::CaloCluster* clus, double dR(-999.); bool isNCone=false; - bool isExt = genPartToCalo(clus, thePart,isFwrdEle, dR, isNCone); + bool isExt = genPartToCalo(clus, thePart,isFwrdEle, dR, isNCone, info->extrapolationCache); if (!isExt) continue; theMatchPart = barcode_to_particle(truthParticleContainerReadHandle.ptr(),thePart->barcode()%m_barcodeShift); @@ -237,7 +237,7 @@ MCTruthClassifier::egammaClusMatch(const xAOD::CaloCluster* clus, double dR(-999.); bool isNCone=false; - bool isExt = genPartToCalo(clus, thePart, false , dR, isNCone); + bool isExt = genPartToCalo(clus, thePart, false , dR, isNCone, info->extrapolationCache); if(!isExt) continue; theMatchPart = barcode_to_particle(truthParticleContainerReadHandle.ptr(),thePart->barcode()%m_barcodeShift); @@ -293,14 +293,15 @@ bool MCTruthClassifier::genPartToCalo(const xAOD::CaloCluster* clus, const xAOD::TruthParticle* thePart, bool isFwrdEle, double& dRmatch, - bool & isNarrowCone) const { + bool & isNarrowCone, + Cache *cache) const { dRmatch = -999.; isNarrowCone = false; if ( thePart == 0 ) return false ; - std::unique_ptr<Trk::CaloExtension> caloExtension =m_caloExtensionTool->caloExtension(*thePart); - if( !caloExtension|| caloExtension->caloLayerIntersections().empty() ){ + const Trk::CaloExtension* caloExtension =m_caloExtensionTool->caloExtension(*thePart, *cache ); + if( caloExtension == nullptr || caloExtension->caloLayerIntersections().empty() ){ ATH_MSG_WARNING("extrapolation of Truth Particle with eta " << thePart->eta() <<" and Pt " << thePart->pt() << " to calo failed"); return false; diff --git a/Reconstruction/egamma/egammaAlgs/src/egammaTruthAssociationAlg.cxx b/Reconstruction/egamma/egammaAlgs/src/egammaTruthAssociationAlg.cxx index 7255d0ef60c..6f8c1b53f3f 100644 --- a/Reconstruction/egamma/egammaAlgs/src/egammaTruthAssociationAlg.cxx +++ b/Reconstruction/egamma/egammaAlgs/src/egammaTruthAssociationAlg.cxx @@ -17,6 +17,9 @@ #include "xAODTruth/TruthParticleAuxContainer.h" #include "xAODTruth/TruthEventContainer.h" +#include "egammaInterfaces/IEMExtrapolationTools.h" + + typedef ElementLink<xAOD::TruthParticleContainer> TruthLink_t; typedef ElementLink<xAOD::CaloClusterContainer> ClusterLink_t; typedef ElementLink<xAOD::ElectronContainer> ElectronLink_t; @@ -218,8 +221,13 @@ StatusCode egammaTruthAssociationAlg::match(const xAOD::TruthParticleContainer& writeDecorHandles<T> decoHandles(hkeys); + //Extrapolation Cache + Cache extrapolationCache{}; + for (auto particle : *decoHandles.readHandle()){ - MCTruthInfo_t info = particleTruthClassifier(particle); + + MCTruthInfo_t info = particleTruthClassifier(particle, &extrapolationCache); + const xAOD::TruthParticle* truthParticle = info.genPart; if (truthParticle) { ElementLink<xAOD::TruthParticleContainer> link(truthParticle, truthParticles); @@ -292,16 +300,12 @@ egammaTruthAssociationAlg::writeDecorHandles<T>::writeDecorHandles(const egammaT // ========================================================================== template<class T> egammaTruthAssociationAlg::MCTruthInfo_t -egammaTruthAssociationAlg::particleTruthClassifier(const T* particle) { +egammaTruthAssociationAlg::particleTruthClassifier(const T* particle, Cache *extrapolationCache) { MCTruthInfo_t info; -#ifdef MCTRUTHCLASSIFIER_CONST IMCTruthClassifier::Info mcinfo; + mcinfo.extrapolationCache = extrapolationCache; auto ret = m_mcTruthClassifier->particleTruthClassifier(particle, &mcinfo); info.genPart = mcinfo.genPart; -#else - auto ret = m_mcTruthClassifier->particleTruthClassifier(particle); - info.genPart = m_mcTruthClassifier->getGenPart(); -#endif info.first = ret.first; info.second = ret.second; return info; @@ -309,28 +313,17 @@ egammaTruthAssociationAlg::particleTruthClassifier(const T* particle) { /** Template specialisation for electrons: * second pass based on the cluster to find true photons **/ template<> egammaTruthAssociationAlg::MCTruthInfo_t -egammaTruthAssociationAlg::particleTruthClassifier<xAOD::Electron>(const xAOD::Electron* electron) { +egammaTruthAssociationAlg::particleTruthClassifier<xAOD::Electron>(const xAOD::Electron* electron, Cache *extrapolationCache) { MCTruthInfo_t info; -#ifdef MCTRUTHCLASSIFIER_CONST IMCTruthClassifier::Info mcinfo; + mcinfo.extrapolationCache = extrapolationCache; auto ret = m_mcTruthClassifier->particleTruthClassifier(electron, &mcinfo); -#else - auto ret = m_mcTruthClassifier->particleTruthClassifier(electron); -#endif if (ret.first == MCTruthPartClassifier::Unknown && !xAOD::EgammaHelpers::isFwdElectron(electron) && electron->caloCluster()){ ATH_MSG_DEBUG("Trying cluster-based truth classification for electron"); -#ifdef MCTRUTHCLASSIFIER_CONST ret = m_mcTruthClassifier->particleTruthClassifier( electron->caloCluster(), &mcinfo); -#else - ret = m_mcTruthClassifier->particleTruthClassifier( electron->caloCluster() ); -#endif } -#ifdef MCTRUTHCLASSIFIER_CONST info.genPart = mcinfo.genPart; -#else - info.genPart = m_mcTruthClassifier->getGenPart(); -#endif info.first = ret.first; info.second = ret.second; return info; diff --git a/Reconstruction/egamma/egammaAlgs/src/egammaTruthAssociationAlg.h b/Reconstruction/egamma/egammaAlgs/src/egammaTruthAssociationAlg.h index 944b5eefcb4..c56d9005e47 100644 --- a/Reconstruction/egamma/egammaAlgs/src/egammaTruthAssociationAlg.h +++ b/Reconstruction/egamma/egammaAlgs/src/egammaTruthAssociationAlg.h @@ -35,7 +35,10 @@ class egammaTruthAssociationAlg : public AthAlgorithm { public: - + + typedef std::unordered_map<size_t,std::unique_ptr<Trk::CaloExtension>> Cache; + + /** @brief constructor */ egammaTruthAssociationAlg(const std::string& name, ISvcLocator* pSvcLocator); @@ -55,6 +58,7 @@ private: MCTruthPartClassifier::ParticleType first; MCTruthPartClassifier::ParticleOrigin second; const xAOD::TruthParticle* genPart; + Cache *extrapolationCache; }; /** @brief helper class to contain write docoration handle keys */ @@ -87,7 +91,7 @@ private: /** @brief return the result of MCTruthClassifier::particleTruthClassifier * or do a second pass for electrons based on the cluster to find true photons **/ - template<class T> MCTruthInfo_t particleTruthClassifier(const T*) ; + template<class T> MCTruthInfo_t particleTruthClassifier(const T*, Cache *) ; /** @brief Create a copy a truth particle, add it to the new container and decorate it * with a link to the original particle **/ -- GitLab