ATLAS Offline Software
Loading...
Searching...
No Matches
TrackParticleTruthAlg.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
6
12
13
14// -----------------------------------------------------------------------------------------------------
16
17 ATH_CHECK(m_trkKey.initialize());
18 ATH_CHECK(m_particlesLinkKey.initialize());
19 ATH_CHECK(m_particlesTypeKey.initialize());
20 ATH_CHECK(m_particlesOriginKey.initialize());
23 ATH_CHECK(m_truthTracksKey.initialize());
24 ATH_CHECK(m_truthClassifier.retrieve());
25 return StatusCode::SUCCESS;
26}
27
28
29// -----------------------------------------------------------------------------------------------------
30StatusCode TrackParticleTruthAlg::execute(const EventContext& ctx) const {
31
38
39 ATH_CHECK(particlesLink.isValid());
40 ATH_CHECK(truthParticleLinkVec.isValid());
41 ATH_CHECK(truthTracks.isValid());
42
43
44 const TrackTruthCollection truthTrackColl=*truthTracks;
45 const xAODTruthParticleLinkVector truthParticleLinks=*truthParticleLinkVec;
46
47 int partInd=0;
48 for( const xAOD::TrackParticle* particle : *particlesLink ){
49
50 ATH_MSG_DEBUG("Looking up truth for pt " << particle->pt() << " eta " << particle->eta() << " phi " << particle->phi());
53 if( !particle->trackLink().isValid()){
54 if (!particle->patternRecoInfo()[xAOD::STACO]) {
55 ATH_MSG_WARNING("Found TrackParticle with Invalid element link, skipping");
56 }
57 //add dummy truth link
58 particlesLink(*particle) = ElementLink<xAOD::TruthParticleContainer>();
59 particlesType(*particle) = 0;
60 particlesOrigin(*particle) = 0;
61 particlesClassification(*particle) = 0;
62 partInd++;
63 continue;
64 }
65
68 unsigned int classification = 0;
70 // look-up associated truth particle
71
72 Trk::TrackTruthKey key(particle->trackLink());
73 auto result = truthTrackColl.find(key);
74
75 // if we found a match use it
76 if( result != truthTrackColl.end() ){
77 ATH_MSG_VERBOSE("Found track Truth: uniqueID " << HepMC::uniqueID(&(result->second.particleLink())) << " evt " << result->second.particleLink().eventIndex());
78 link = truthParticleLinks.find(result->second.particleLink());
79
80 // if configured also get truth classification
81
82 if( link.isValid() && !m_truthClassifier.empty() ){
83 auto truthClass = m_truthClassifier->particleTruthClassifier(*link);
84 type = truthClass.first;
85 origin = truthClass.second;
86 classification = std::get<0>(MCTruthPartClassifier::defOrigOfParticle(*link)); // See AGENE-2351
87 ATH_MSG_VERBOSE("Got truth type " << static_cast<int>(type) << " origin " << static_cast<int>(origin) << " classification " << classification);
88 }
89 }
90
91 if( link.isValid() ){
92 ATH_MSG_DEBUG("Found matching xAOD Truth: uniqueID " << HepMC::uniqueID(*link) << " pt " << (*link)->pt() << " eta " << (*link)->eta() << " phi " << (*link)->phi());
93 // set element link
94 link.toPersistent();
95 particlesLink(*particle)=link;
96
97 }
98 else{ //no truth link, add a dummy
99 particlesLink(*particle)=ElementLink<xAOD::TruthParticleContainer>();
100 }
101
102 if( !m_truthClassifier.empty() ){
103 //use index for these since it's the same particle
104 particlesType(partInd)=static_cast<int>(type);
105 particlesOrigin(partInd)=static_cast<int>(origin);
106 particlesClassification(partInd)=classification;
107 }
108 partInd++;
109 }
110 return StatusCode::SUCCESS;
111}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_VERBOSE(x,...)
Handle class for adding a decoration to an object.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
Handle class for adding a decoration to an object.
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_particlesOriginKey
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_particlesTypeKey
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_trkKey
virtual StatusCode initialize() override
ToolHandle< IMCTruthClassifier > m_truthClassifier
virtual StatusCode execute(const EventContext &ctx) const override
SG::ReadHandleKey< TrackTruthCollection > m_truthTracksKey
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_particlesClassificationKey
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_particlesLinkKey
Decorations for input TrackParticleContainer.
SG::ReadHandleKey< xAODTruthParticleLinkVector > m_truthParticleLinkVecKey
ElementLink< xAOD::TruthParticleContainer > find(const HepMcParticleLink &hepMCLink) const
int uniqueID(const T &p)
std::tuple< unsigned int, T > defOrigOfParticle(T thePart)
TrackParticle_v1 TrackParticle
Reference the current persistent version:
@ STACO
Tracks produced by STACO.