ATLAS Offline Software
Loading...
Searching...
No Matches
TrackParticleCnvAlg.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5// Local include(s):
7
8// EDM include(s):
9
13
14
18
19
20
21namespace xAODMaker {
22
25{
26
27 ATH_MSG_DEBUG("Initializing TrackParticleCnvAlg");
28 ATH_CHECK(m_particleCreator.retrieve());
29 ATH_CHECK(m_truthClassifier.retrieve(EnableTool{m_addTruthLink}));
31 // to preserve the inisialised parameters of the ParticleCreatorTool:
32 ATH_MSG_DEBUG("Overriding particle creator tool settings.");
33 ATH_CHECK(m_TrackCollectionCnvTool->setParticleCreatorTool(&m_particleCreator));
39
44 ATH_CHECK(m_trackLinkKey.initialize());
45
46 // Retrieve monitoring tools if provided
47 ATH_CHECK(m_trackMonitoringTool.retrieve(DisableTool{ !m_doMonitoring }));
48 ATH_CHECK(m_monTool.retrieve(DisableTool{ !m_doMonitoring }));
49
51
52 // Return gracefully:
53 return StatusCode::SUCCESS;
54}
55
56StatusCode TrackParticleCnvAlg::execute(const EventContext& ctx) const {
57
58 const TrackCollection* tracks{};
59 const xAODTruthParticleLinkVector* truthLinks{};
60 const TrackTruthCollection* trackTruth{};
61 const ObservedTrackMap* tracksMap{};
62 const xAOD::Vertex* primaryVertex{};
63
64 //timer object for total execution time
65 auto mnt_timer_Total = Monitored::Timer<std::chrono::milliseconds>("TIME_Total");
66
67 // Retrieve the AOD particles:
68
69 ATH_CHECK(SG::get(tracks, m_tracks, ctx));
70 ATH_CHECK(SG::get(trackTruth, m_trackTruth, ctx));
71 ATH_CHECK(SG::get(truthLinks, m_truthParticleLinkVec, ctx));
72 ATH_CHECK(SG::get(tracksMap, m_tracksMap, ctx));
73 // Retrieve the Tracks:
74
75 if(!m_primaryVertexContainer.key().empty()) {
76 const xAOD::VertexContainer* vtx_container{nullptr};
77 ATH_CHECK(SG::get(vtx_container, m_primaryVertexContainer, ctx));
78 const xAOD::Vertex* dummyVertex{};
79 for(auto vtx : *vtx_container) {
80 if(vtx->vertexType()==xAOD::VxType::PriVtx) {
81 primaryVertex = vtx;
82 break;
83 }
84 if(vtx->vertexType()==xAOD::VxType::NoVtx) {
85 // in case of no primary vertex
86 dummyVertex = vtx;
87 }
88 }
89 if(!primaryVertex) {
90 if(dummyVertex)
91 {
92 ATH_MSG_INFO("No primary vertex found, will use dummy vertex at "
93 << dummyVertex->x() << "," << dummyVertex->y() << ","
94 << dummyVertex->z());
95 primaryVertex = dummyVertex;
96 }
97 else {
98 ATH_MSG_WARNING("Neither primary nor dummy vertex found. Do Nothing.");
99 return StatusCode::SUCCESS;
100 }
101 }
102 }
103
104
105 SG::WriteHandle wh_xaodout(m_xaodout, ctx);
106 ATH_CHECK(wh_xaodout.record(std::make_unique<xAOD::TrackParticleContainer>(),
107 std::make_unique<xAOD::TrackParticleAuxContainer>()));
108 ATH_CHECK(convert(ctx, (*tracks), trackTruth, *wh_xaodout, truthLinks, primaryVertex, tracksMap));
109
110 // Monitor track parameters
111 if (m_doMonitoring)
112 m_trackMonitoringTool->monitor_tracks("Track", "Pass", *wh_xaodout);
113
114
115 //extra scope needed to trigger the monitoring
116 {auto monTime = Monitored::Group(m_monTool, mnt_timer_Total);}
117
118 return StatusCode::SUCCESS;
119}
120
121StatusCode TrackParticleCnvAlg::convert(const EventContext& ctx,
122 const TrackCollection& trackColl,
123 const TrackTruthCollection* assocTruthColl,
124 xAOD::TrackParticleContainer& outTrackCont,
125 const xAODTruthParticleLinkVector* truthLinkVec,
126 const xAOD::Vertex* primaryVertex,
127 const ObservedTrackMap* obs_track_map) const{
128 // Augment track particles using track map if available
129 if (obs_track_map){
130 ATH_CHECK(m_TrackCollectionCnvTool->convertAndAugment(ctx, &trackColl, &outTrackCont, obs_track_map, primaryVertex));
131 } else{
132 ATH_CHECK(m_TrackCollectionCnvTool->convert(ctx, &trackColl, &outTrackCont, primaryVertex));
133 }
134 // Create the xAOD objects:
135
136 unsigned int trackCounter{0};
137 // loop over AOD and converted xAOD for summary info and truth links
138 for (xAOD::TrackParticle* particle: outTrackCont) {
139 // protect if something went wrong and there is no converted xaod equivalent
140
141 if (!particle) {
142 ATH_MSG_ERROR("Failed to get an xAOD::TrackParticle");
143 return StatusCode::FAILURE;
144 }
145
146 trackCounter++;
147 if(msgLvl(MSG::DEBUG)){
148 int npix{-1}, nsct{-1}, ntrt{-1}, npixh{-1}, nscth{-1};
149 const Trk::Track *tr = particle->track();
150 if (tr){
151 const Trk::TrackSummary* ts = tr->trackSummary();
152 if (ts) {
153 npix = ts->get(Trk::numberOfPixelHits);
154 nsct = ts->get(Trk::numberOfSCTHits);
155 ntrt = ts->get(Trk::numberOfTRTHits);
156 nscth = ts->get(Trk::numberOfSCTHoles);
157 npixh = ts->get(Trk::numberOfPixelHoles);
158 }
159 }
160 ATH_MSG_DEBUG("REGTEST: " << std::setw(5) << trackCounter
161 << " pT: " << std::setw(10) << particle->pt()
162 << " eta: " << particle->eta() << " phi: " << particle->phi()
163 << " d0: " << particle->d0() << " z0: " << particle->z0()
164 << "\t" << npix << "/" << nsct << "/" << ntrt << "/holes/" << npixh << "/" << nscth);
165 }
166 //
167 // --------- statistics
168 //
169 if (m_addTruthLink) {
173 unsigned int classification = 0; // Better default value here?
174 float probability = -1.0;
176
177 ElementLink<TrackCollection> tpLink{trackColl, trackCounter -1};
178 if (!tpLink.isValid()) {
179 ATH_MSG_WARNING("Failed to create ElementLink to Track/TrackParticle");
180 } else if(assocTruthColl->empty()){
181 // This can happen if there is no HS track
182 ATH_MSG_DEBUG("No truth available");
183 } else {
184 auto result = assocTruthColl->find(tpLink);
185 if (result == assocTruthColl->end()) {
186 ATH_MSG_WARNING("Failed find truth associated with Track/TrackParticle");
187 } else {
188 // setTruthLink(link,result->second, type, origin);
189 ATH_MSG_VERBOSE("Found track Truth: uniqueID "
190 << HepMC::uniqueID(result->second.particleLink()) << " evt "
191 << result->second.particleLink().eventIndex());
192 probability = result->second.probability();
193 link = truthLinkVec->find(result->second.particleLink());
194 if (link.isValid()) {
195 ATH_MSG_DEBUG("Found matching xAOD Truth: uniqueID "
196 << HepMC::uniqueID(*link) << " pt " << (*link)->pt()
197 << " eta " << (*link)->eta() << " phi "
198 << (*link)->phi());
199 // if configured also get truth classification
200 if (result->second.particleLink().cptr() &&
201 !m_truthClassifier.empty()) {
202 auto truthClass = m_truthClassifier->particleHepMCTruthClassifier(
203 result->second.particleLink());
204 type = truthClass.first;
205 origin = truthClass.second;
206 classification = std::get<0>(MCTruthPartClassifier::defOrigOfParticle(result->second.particleLink().cptr())); // See AGENE-2351
207 ATH_MSG_VERBOSE("Got truth type " << static_cast<int>(type)
208 << " origin "
209 << static_cast<int>(origin)
210 << " classification "
211 << static_cast<unsigned int>(classification));
212 }
213 } else {
214 if (HepMC::uniqueID(result->second.particleLink()) > 0) {
215 ATH_MSG_WARNING("No associated xAOD truth for valid truth link "
216 << result->second.particleLink());
217 }
218 }
219 }
220 }
221 //This is the Algorithm creating TrackParticles
222 //
223 static const SG::AuxElement::Accessor<
225 theLink("truthParticleLink");
226 static const SG::AuxElement::Accessor<float> theProbability(
227 "truthMatchProbability");
228 theLink(*particle) = link;
229 theProbability(*particle) = probability;
230 if (!m_truthClassifier.empty()) {
231 static const SG::AuxElement::Accessor<int> theType("truthType");
232 static const SG::AuxElement::Accessor<int> theOrigin("truthOrigin");
233 static const SG::AuxElement::Accessor<unsigned int> theClassification("truthClassification");
234 theType(*particle) = static_cast<int>(type);
235 theOrigin(*particle) = static_cast<int>(origin);
236 theClassification(*particle) = static_cast<unsigned int>(classification);
237 }
238 }
239 } // loop over aod tracks
240
241 ATH_MSG_DEBUG("Converted [" << trackColl.size() << " -> " << outTrackCont.size()
242 << "] TrackParticles");
243 if (trackColl.size() != outTrackCont.size()) {
244 ATH_MSG_ERROR("number of items in the AOD container: "
245 << trackColl.size()
246 << " is not equal to the number of items in its converted "
247 "xAOD equivalent: "
248 << outTrackCont.size());
249 return StatusCode::FAILURE;
250 }
251
252 return StatusCode::SUCCESS;
253}
254} // namespace xAODMaker
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
Header file to be included by clients of the Monitored infrastructure.
std::map< int, std::tuple< Trk::Track *, double, xAOD::RejectionStep, xAOD::RejectionReason, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, float, float, int, std::vector< xAOD::RejectionStep >, std::vector< xAOD::RejectionReason > > > ObservedTrackMap
DataVector< Trk::Track > TrackCollection
This typedef represents a collection of Trk::Track objects.
bool msgLvl(const MSG::Level lvl) const
size_type size() const noexcept
Returns the number of elements in the collection.
Group of local monitoring quantities and retain correlation when filling histograms
A monitored timer.
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
A summary of the information contained by a track.
const Trk::TrackSummary * trackSummary() const
Returns a pointer to the const Trk::TrackSummary owned by this const track (could be nullptr).
SG::ReadHandleKey< xAODTruthParticleLinkVector > m_truthParticleLinkVec
ToolHandle< GenericMonitoringTool > m_monTool
StatusCode convert(const EventContext &ctx, const TrackCollection &trackColl, const TrackTruthCollection *assocTruthColl, xAOD::TrackParticleContainer &outTrackCont, const xAODTruthParticleLinkVector *, const xAOD::Vertex *primaryVertex, const ObservedTrackMap *obs_track_map) const
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_truthOriginKey
ToolHandle< ITrackParticleMonitoring > m_trackMonitoringTool
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_truthTypeKey
ToolHandle< xAODMaker::ITrackCollectionCnvTool > m_TrackCollectionCnvTool
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_truthProbKey
virtual StatusCode initialize()
Function initialising the algorithm.
Gaudi::Property< bool > m_addTruthLink
toggle on adding truth links
virtual StatusCode execute(const EventContext &ctx) const
Function executing the algorithm.
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_trackLinkKey
SG::ReadHandleKey< TrackTruthCollection > m_trackTruth
SG::ReadHandleKey< ObservedTrackMap > m_tracksMap
SG::WriteHandleKey< xAOD::TrackParticleContainer > m_xaodout
Gaudi::Property< bool > m_augmentObservedTracks
SG::ReadHandleKey< TrackCollection > m_tracks
SG::ReadHandleKey< xAOD::VertexContainer > m_primaryVertexContainer
Gaudi::Property< bool > m_convertTracks
toggle on converting tracks to xAOD
ToolHandle< IMCTruthClassifier > m_truthClassifier
ToolHandle to truth classifier.
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_truthClassKey
Gaudi::Property< bool > m_doMonitoring
ToolHandle< Trk::ITrackParticleCreatorTool > m_particleCreator
The key for the input TrackParticleTruthCollection.
ElementLink< xAOD::TruthParticleContainer > find(const HepMcParticleLink &hepMCLink) const
float z() const
Returns the z position.
float y() const
Returns the y position.
float x() const
Returns the x position.
int ts
Definition globals.cxx:24
::StatusCode StatusCode
StatusCode definition for legacy code.
int uniqueID(const T &p)
std::tuple< unsigned int, T > defOrigOfParticle(T thePart)
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.
@ numberOfPixelHits
number of pixel layers on track with absence of hits
@ numberOfSCTHoles
number of Holes in both sides of a SCT module
@ numberOfPixelHoles
number of pixels which have a ganged ambiguity.
@ PriVtx
Primary vertex.
@ NoVtx
Dummy vertex. TrackParticle was not used in vertex fit.
TrackParticle_v1 TrackParticle
Reference the current persistent version:
VertexContainer_v1 VertexContainer
Definition of the current "Vertex container version".
Vertex_v1 Vertex
Define the latest version of the vertex class.
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".