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 continue;
63 }
64
67 unsigned int classification = 0;
69 // look-up associated truth particle
70
71 Trk::TrackTruthKey key(particle->trackLink());
72 auto result = truthTrackColl.find(key);
73
74 // if we found a match use it
75 if( result != truthTrackColl.end() ){
76 ATH_MSG_VERBOSE("Found track Truth: uniqueID " << HepMC::uniqueID(&(result->second.particleLink())) << " evt " << result->second.particleLink().eventIndex());
77 link = truthParticleLinks.find(result->second.particleLink());
78
79 // if configured also get truth classification
80
81 if( link.isValid() && !m_truthClassifier.empty() ){
82 auto truthClass = m_truthClassifier->particleTruthClassifier(*link);
83 type = truthClass.first;
84 origin = truthClass.second;
85 classification = std::get<0>(MCTruthPartClassifier::defOrigOfParticle(*link)); // See AGENE-2351
86 ATH_MSG_VERBOSE("Got truth type " << static_cast<int>(type) << " origin " << static_cast<int>(origin) << " classification " << classification);
87 }
88 }
89
90 if( link.isValid() ){
91 ATH_MSG_DEBUG("Found matching xAOD Truth: uniqueID " << HepMC::uniqueID(*link) << " pt " << (*link)->pt() << " eta " << (*link)->eta() << " phi " << (*link)->phi());
92 // set element link
93 link.toPersistent();
94 particlesLink(*particle)=link;
95
96 }
97 else{ //no truth link, add a dummy
98 particlesLink(*particle)=ElementLink<xAOD::TruthParticleContainer>();
99 }
100
101 if( !m_truthClassifier.empty() ){
102 //use index for these since it's the same particle
103 particlesType(partInd)=static_cast<int>(type);
104 particlesOrigin(partInd)=static_cast<int>(origin);
105 particlesClassification(partInd)=classification;
106 }
107 partInd++;
108 }
109 return StatusCode::SUCCESS;
110}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(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.