diff --git a/PhysicsAnalysis/MCTruthClassifier/MCTruthClassifier/IMCTruthClassifier.h b/PhysicsAnalysis/MCTruthClassifier/MCTruthClassifier/IMCTruthClassifier.h index da668ad98059727c791f502a804aafdcb6691706..83b0f24ee27f0e08d7349ec2309b3379bf4e28dd 100644 --- a/PhysicsAnalysis/MCTruthClassifier/MCTruthClassifier/IMCTruthClassifier.h +++ b/PhysicsAnalysis/MCTruthClassifier/MCTruthClassifier/IMCTruthClassifier.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration */ /////////////////////////////////////////////////////////////////// @@ -38,6 +38,7 @@ #ifndef XAOD_ANALYSIS // Can not be used in AnalysisBase #include <AtlasHepMC/GenParticle.h> +class HepMcParticleLink; #endif #if !defined(XAOD_ANALYSIS) && \ @@ -133,7 +134,12 @@ public: -#ifndef XAOD_ANALYSIS /*This can not run in Analysis Base*/ +#ifndef XAOD_ANALYSIS /*These can not run in Analysis Base*/ + virtual std::pair<MCTruthPartClassifier::ParticleType, + MCTruthPartClassifier::ParticleOrigin> + particleTruthClassifier(const HepMcParticleLink& theLink, + Info* info = nullptr) const = 0; + virtual std::pair<MCTruthPartClassifier::ParticleType, MCTruthPartClassifier::ParticleOrigin> particleTruthClassifier(HepMC::ConstGenParticlePtr, diff --git a/PhysicsAnalysis/MCTruthClassifier/MCTruthClassifier/MCTruthClassifier.h b/PhysicsAnalysis/MCTruthClassifier/MCTruthClassifier/MCTruthClassifier.h index f9f068a05b2a96bc2bc91dab8f0e09e556f0ae48..4e63261177d0cba28dd097af44981f43439ab562 100644 --- a/PhysicsAnalysis/MCTruthClassifier/MCTruthClassifier/MCTruthClassifier.h +++ b/PhysicsAnalysis/MCTruthClassifier/MCTruthClassifier/MCTruthClassifier.h @@ -112,10 +112,15 @@ public: } -#ifndef XAOD_ANALYSIS /*This can not run in Analysis Base*/ +#ifndef XAOD_ANALYSIS /*These can not run in Analysis Base*/ + virtual std::pair<MCTruthPartClassifier::ParticleType, MCTruthPartClassifier::ParticleOrigin> particleTruthClassifier( + const HepMcParticleLink& theLink, + Info* info = nullptr) const override; + virtual std::pair<MCTruthPartClassifier::ParticleType, MCTruthPartClassifier::ParticleOrigin> particleTruthClassifier( HepMC::ConstGenParticlePtr, Info* info = nullptr) const override; + bool compareTruthParticles(HepMC::ConstGenParticlePtr genPart, const xAOD::TruthParticle* truthPart) const; #endif diff --git a/PhysicsAnalysis/MCTruthClassifier/Root/MCTruthClassifierGen.cxx b/PhysicsAnalysis/MCTruthClassifier/Root/MCTruthClassifierGen.cxx index 25899c583159c8134558c95390ccbd5a88d76b13..eef97f174566e055adaeec83e0909ed42b74d099 100644 --- a/PhysicsAnalysis/MCTruthClassifier/Root/MCTruthClassifierGen.cxx +++ b/PhysicsAnalysis/MCTruthClassifier/Root/MCTruthClassifierGen.cxx @@ -13,6 +13,31 @@ using namespace MCTruthPartClassifier; using std::abs; #ifndef XAOD_ANALYSIS +std::pair<ParticleType, ParticleOrigin> +MCTruthClassifier::particleTruthClassifier(const HepMcParticleLink& theLink, Info* info /*= nullptr*/) const +{ + // Retrieve the links between HepMC and xAOD::TruthParticle + const EventContext& ctx = + info ? info->eventContext : Gaudi::Hive::currentContext(); + + SG::ReadHandle<xAODTruthParticleLinkVector> truthParticleLinkVecReadHandle( + m_truthLinkVecReadHandleKey, ctx); + if (!truthParticleLinkVecReadHandle.isValid()) { + ATH_MSG_WARNING( + " Invalid ReadHandle for xAODTruthParticleLinkVector with key: " + << truthParticleLinkVecReadHandle.key()); + return std::make_pair(Unknown, NonDefined); + } + + ElementLink<xAOD::TruthParticleContainer> tplink = truthParticleLinkVecReadHandle->find (theLink); + if (tplink.isValid()) { + return particleTruthClassifier (*tplink, info); + } + + return std::make_pair(Unknown, NonDefined); +} + + std::pair<ParticleType, ParticleOrigin> MCTruthClassifier::particleTruthClassifier(HepMC::ConstGenParticlePtr thePart, Info* info /*= nullptr*/) const { @@ -36,9 +61,10 @@ MCTruthClassifier::particleTruthClassifier(HepMC::ConstGenParticlePtr thePart, I return std::make_pair(partType, partOrig); } + int theBC = HepMC::barcode(thePart); for (const auto entry : *truthParticleLinkVecReadHandle) { if (entry->first.isValid() && entry->second.isValid() && - HepMC::barcode(entry->first.cptr()) == HepMC::barcode(thePart)) { + entry->first.barcode() == theBC) { const xAOD::TruthParticle* truthParticle = *entry->second; if (!compareTruthParticles(thePart, truthParticle)) { // if the barcode/pdg id / status of the pair does not match