ATLAS Offline Software
Loading...
Searching...
No Matches
TrkObserverTool.cxx
Go to the documentation of this file.
1
2
3/*
4 Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
5*/
6
7// TrkObserverTool.cxx
8// Implementation file for class TrkObserverTool
9// Authors: C.Rauchegger<christoph.rauchegger@cern.ch> and
10// S.Rettie<sebastien.rettie@cern.ch>
11
12// Description:
13// This tool monitors a track candidate through the whole
14// ambiguity solving process
15// (AmbiguityProcessorBase.cxx,
16// DenseEnvironmentsAmbiguityProcessorTool.cxx,
17// DenseEnvironmentsAmbiguityScoreProcessorTool.cxx,
18// InDetDenseEnvAmbiTrackSelectionTool.cxx).
19// Every change (score, subtrack created, track rejected) is
20// recorded and in the end an xAOD output file is created.
21
22// The output file contains all the tracks which occur during
23// the ambiguity solving (input tracks, final tracks, and only
24// temporary tracks as well). The tracks in the file contain
25// all information the ambiguity solver has (pixel hits, SCT
26// hits, split hits, etc.) and additional information by the
27// TrkObserverTool (uniqueId, parentId, score, rejection location).
28
29// Every track has ONLY one "direct subtrack". But this subtrack
30// can have another subtrack, ...
31
32// Each track is uniquely identified using a thread-safe
33// std::atomic<std::uint32_t> (defined in AmbiguityProcessorUtility.cxx),
34// which serves as Id for the tool. If a track has a parent, the unique
35// Id of the parent is also saved by the tool. As the ambiguity processor
36// tools delete tracks, all tracks (including temporary tracks) are
37// saved to the tool's cache entry, i.e. an ObservedTrackMap object.
38
39// Two instances of the TrkObserverTool must be instantiated in order
40// to avoid data handle conflicts:
41// - Instance that does not initialize the data handles and
42// is used throughout the ambiguity solving
43// - Instance that initializes the data handles and is only used
44// to write out the observed tracks after the ambiguity solving
45// is done
46
47// Package includes
49#include <sstream>
50
51// FrameWork includes
52#include "GaudiKernel/IToolSvc.h"
54
56// Public methods:
58
59// Constructor
61Trk::TrkObserverTool::TrkObserverTool(const std::string& type, const std::string& name, const IInterface* parent)
62 : AthAlgTool(type, name, parent){
63 declareInterface< ITrkObserverTool >(this);
64 declareProperty("ObsTrackCollection", m_savedTracksWriteKey);
65 declareProperty("ObsTrackCollectionMap", m_savedTracksMapWriteKey);
66}
67
68// Destructor
71
72// Athena algtool's Hooks
75 ATH_MSG_INFO("Initializing TrkObserverTool with name: " << name());
76 ATH_MSG_INFO("\tm_savedTracksWriteKey: " << m_savedTracksWriteKey.key());
77 ATH_MSG_INFO("\tm_savedTracksMapWriteKey: " << m_savedTracksMapWriteKey.key());
78 ATH_CHECK(AthAlgTool::initialize());
79 ATH_CHECK(m_savedTracksWriteKey.initialize(!m_savedTracksWriteKey.key().empty()));
81 ATH_MSG_INFO("Initialized TrkObserverTool");
82 return StatusCode::SUCCESS;
83}
84
86 ATH_MSG_INFO("Finalizing " << name() << "...");
87 return StatusCode::SUCCESS;
88}
89
91// Const methods:
94 ATH_MSG_DEBUG("Starting new event");
95 if (ent->m_observedTrkMap) {
96 ent->m_observedTrkMap->clear();
97 delete ent->m_observedTrkMap;
98 }
100}
101
102void Trk::TrkObserverTool::updateTrackMap(int uid, double score, xAOD::RejectionStep rejectStep, xAOD::RejectionReason rejectReason) const {
103
104 ATH_MSG_DEBUG("updateTrackMap: track "<<uid);
105 // get event context and map from cache
106 const EventContext& ctx{Gaudi::Hive::currentContext()};
107 std::lock_guard<std::mutex> lock{m_mutex};
108 ObservedTrackMap* trk_map = getTrackMap(ctx);
109 // find track and update score
110 if ( trk_map->find(uid) == trk_map->end() ) {
111 // not found
112 ATH_MSG_WARNING("updateTrackMap: track << " << uid << " not found in observedTrkMap");
113 }
114 else {
115 // found
116 std::get<xAOD::ObserverToolIndex::score>(trk_map->at(uid)) = score;
117 std::get<xAOD::ObserverToolIndex::rejectStep>(trk_map->at(uid)) = rejectStep;
118 std::get<xAOD::ObserverToolIndex::rejectReason>(trk_map->at(uid)) = rejectReason;
119 // Keep track of cumulative rejection steps/reasons
120 std::get<xAOD::ObserverToolIndex::rejectStep_full>(trk_map->at(uid)).push_back(rejectStep);
121 std::get<xAOD::ObserverToolIndex::rejectReason_full>(trk_map->at(uid)).push_back(rejectReason);
122 ATH_MSG_DEBUG("updateTrackMap: track "<<uid<<" with score, rejectStep, rejectReason: "<<score<<", "<<rejectStep<<", "<<rejectReason);
123 }
124}
125
126void Trk::TrkObserverTool::updateScore(int uid, double score) const {
127
128 ATH_MSG_DEBUG("updateScore: track "<<uid);
129 // get event context and map from cache
130 const EventContext& ctx{Gaudi::Hive::currentContext()};
131 std::lock_guard<std::mutex> lock{m_mutex};
132 ObservedTrackMap* trk_map = getTrackMap(ctx);
133 // find track and update score
134 if ( trk_map->find(uid) == trk_map->end() ) {
135 // not found
136 ATH_MSG_WARNING("updateScore: track " << uid << " not found in observedTrkMap");
137 }
138 else {
139 // found
140 std::get<xAOD::ObserverToolIndex::score>(trk_map->at(uid)) = score;
141 ATH_MSG_DEBUG("updateScore: track "<<uid<<" with score "<<score);
142 }
143}
144
146
147 ATH_MSG_DEBUG("rejectTrack: track "<<uid);
148 // get event context and map from cache
149 const EventContext& ctx{Gaudi::Hive::currentContext()};
150 std::lock_guard<std::mutex> lock{m_mutex};
151 ObservedTrackMap* trk_map = getTrackMap(ctx);
152 // find track and update rejection location
153 if ( trk_map->find(uid) == trk_map->end() ) {
154 // not found
155 ATH_MSG_WARNING("rejectTrack: track "<<uid<<" not found in observedTrkMap");
156 }
157 else {
158 // found
159 std::get<xAOD::ObserverToolIndex::rejectStep>(trk_map->at(uid)) = rejectStep;
160 std::get<xAOD::ObserverToolIndex::rejectReason>(trk_map->at(uid)) = rejectReason;
161 // Keep track of cumulative rejection steps/reasons
162 std::get<xAOD::ObserverToolIndex::rejectStep_full>(trk_map->at(uid)).push_back(rejectStep);
163 std::get<xAOD::ObserverToolIndex::rejectReason_full>(trk_map->at(uid)).push_back(rejectReason);
164 ATH_MSG_DEBUG("rejectTrack: track "<<uid<<" with rejection in "<<dumpRejection(rejectStep, rejectReason));
165 }
166}
167
168void Trk::TrkObserverTool::addInputTrack(int uid, const Trk::Track& track) const {
169
170 ATH_MSG_DEBUG("addInputTrack: track "<<uid);
171 // test to see if we have a new event
172 const EventContext& ctx{Gaudi::Hive::currentContext()};
173 std::lock_guard<std::mutex> lock{m_mutex};
174 CacheEntry* ent{m_cache.get(ctx)};
175 if (ent->m_evt!=ctx.evt()) {
176 // New event in this slot
177 newEvent(ent);
178 ent->m_evt = ctx.evt();
179 }
180 // add input track to cache map
181 std::unique_ptr<Trk::Track> copiedTrack = std::make_unique<Trk::Track>(track);
182 std::vector<xAOD::RejectionStep> v_rejectStep = {xAOD::RejectionStep::solveTracks};
183 std::vector<xAOD::RejectionReason> v_rejectReason = {xAOD::RejectionReason::acceptedTrack};
184 ent->m_observedTrkMap->insert( std::make_pair(uid, std::make_tuple(copiedTrack.release(), // Id, track
185 -1, // score
186 xAOD::RejectionStep::solveTracks, // rejection step
187 xAOD::RejectionReason::acceptedTrack, // rejection reason
188 0, // unique parentId
189 // holes/shared/split hits information (-2 means not filled yet)
190 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2.0f, -2.0f, -2,
191 v_rejectStep, v_rejectReason)));
192}
193
194void Trk::TrkObserverTool::addSubTrack(int track_uid, int parent_uid, const Trk::Track& track) const {
195
196 ATH_MSG_DEBUG("addSubTrack: subtrack "<<track_uid);
197 // get event context and map from cache
198 const EventContext& ctx{Gaudi::Hive::currentContext()};
199 std::lock_guard<std::mutex> lock{m_mutex};
200 ObservedTrackMap* trk_map = getTrackMap(ctx);
201
202 // deep copy of the track (because some subtracks get deleted), information has to be available later
203 std::unique_ptr<Trk::Track> copiedTrack = std::make_unique<Trk::Track>(track);
204 // get score and rejection step from parent element
205 double score = -1;
207 if ( trk_map->find(parent_uid) == trk_map->end() ) {
208 // not found
209 ATH_MSG_WARNING("addSubTrack: parent " << parent_uid << " not found in observedTrkMap");
210 }
211 else {
212 // found
213 score = std::get<xAOD::ObserverToolIndex::score>(trk_map->at(parent_uid));
214 rejectStep = std::get<xAOD::ObserverToolIndex::rejectStep>(trk_map->at(parent_uid));
215 ATH_MSG_DEBUG("addSubTrack: track "<<track_uid<<" with parent "<<parent_uid<<", score "<<score);
216 }
217 // add subtrack to cache map
218 std::vector<xAOD::RejectionStep> v_rejectStep = {rejectStep};
219 std::vector<xAOD::RejectionReason> v_rejectReason = {xAOD::RejectionReason::acceptedTrack};
220 trk_map->insert( std::make_pair(track_uid, std::make_tuple(copiedTrack.release(), // Id, track
221 score, // score
222 rejectStep, // rejection step
223 xAOD::RejectionReason::acceptedTrack, // rejection reason
224 parent_uid, // unique parentId
225 // holes/shared/split hits information (-2 means not filled yet)
226 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2.0f, -2.0f, -2,
227 v_rejectStep, v_rejectReason)));
228}
229
231
232 ATH_MSG_DEBUG("Get track map from cache");
233 // get cache
234 CacheEntry* ent{m_cache.get(ctx)};
235 // sanity check
236 if (ent->m_evt!=ctx.evt()) {
237 ATH_MSG_ERROR("Different event context in getTrackMap!!");
238 }
239 return ent->m_observedTrkMap;
240}
241
242int Trk::TrkObserverTool::saveTracksToStore(const EventContext& ctx, const ObservedTrackMap* trk_map) const {
243
244 std::lock_guard<std::mutex> lock{m_mutex};
245 // Save tracks and map to store
246 ATH_MSG_INFO ("saveTracksToStore: Recording empty observed track containers to event store");
247 ATH_MSG_DEBUG("\tm_savedTracksWriteKey: "<<m_savedTracksWriteKey.key());
248 ATH_MSG_DEBUG("\tm_savedTracksMapWriteKey: "<<m_savedTracksMapWriteKey.key());
249
252
253 // Tracks write handle
254 StatusCode sc = wh_tracks.record(std::make_unique<TrackCollection>());
255 if (sc.isFailure()) {
256 ATH_MSG_ERROR("saveTracksToStore: Could not record input tracks: "<<m_savedTracksWriteKey.key());
257 }
258 else {
259 ATH_MSG_INFO("saveTracksToStore: Recorded empty container for input tracks to: "<<m_savedTracksWriteKey.key());
260 }
261 if (!wh_tracks.isValid()) {
262 ATH_MSG_DEBUG ("saveTracksToStore: Invalid key: "<<m_savedTracksWriteKey.key());
263 }
264 else {
265 ATH_MSG_DEBUG ("saveTracksToStore: Valid key: "<<m_savedTracksWriteKey.key());
266 }
267
268 // Tracks map write handle
269 sc = wh_tracksMap.record(std::make_unique<ObservedTrackMap>());
270 if (sc.isFailure()) {
271 ATH_MSG_ERROR("saveTracksToStore: Could not record tracks map: "<<m_savedTracksMapWriteKey.key());
272 }
273 else {
274 ATH_MSG_INFO("saveTracksToStore: Recorded empty container for tracks map to: "<<m_savedTracksMapWriteKey.key());
275 }
276 if (!wh_tracksMap.isValid()) {
277 ATH_MSG_DEBUG ("saveTracksToStore: Invalid key: "<<m_savedTracksMapWriteKey.key());
278 }
279 else {
280 ATH_MSG_DEBUG ("saveTracksToStore: Valid key: "<<m_savedTracksMapWriteKey.key());
281 }
282 if (!trk_map){
283 return 0;
284 }
285 else {
286 ATH_MSG_INFO ("saveTracksToStore: Recording "<<trk_map->size() << " observed track candidates to event store");
287 }
288 for (const auto& itrMap : *trk_map) {
289 ATH_MSG_DEBUG("saveTracksToStore: Writing track with id "<<itrMap.first<<", rejection step "<<std::get<xAOD::ObserverToolIndex::rejectStep>(itrMap.second)<<", rejection reason "<<std::get<xAOD::ObserverToolIndex::rejectReason>(itrMap.second));
290 wh_tracks->push_back(std::get<xAOD::ObserverToolIndex::track>(itrMap.second));
291 wh_tracksMap->insert(std::make_pair(itrMap.first, itrMap.second));
292 }
293
294 ATH_MSG_DEBUG("saveTracksToStore: Pushed "<<wh_tracks->size()<<" observed tracks to store");
295 ATH_MSG_DEBUG("saveTracksToStore: Pushed "<<wh_tracksMap->size()<<" pairs to track map in store");
296 // Keep track of "good" tracks as a sanity check
297 int nFinalTracks = getNFinalTracks(trk_map);
298 ATH_MSG_DEBUG ("saveTracksToStore: Number of RejectionReason = acceptedTrack (should equal final tracks): " << nFinalTracks);
299 return nFinalTracks;
300}
301
302void Trk::TrkObserverTool::updateHolesSharedHits(int uid, int numPixelHoles, int numSCTHoles, int numSplitSharedPixel, int numSplitSharedSCT,
303 int numSharedOrSplit, int numSharedOrSplitPixels, int numShared, int isPatternTrack, int totalSiHits, int inROI, int hasIBLHit,
304 int hasSharedIBLHit, int hasSharedPixel, int firstPixIsShared, int numPixelDeadSensor, int numSCTDeadSensor, int numPixelHits,
305 int numSCTHits, int numUnused, int numTRT_Unused, int numSCT_Unused, int numPseudo, float averageSplit1, float averageSplit2, int numWeightedShared) const {
306
307 ATH_MSG_DEBUG("updateHolesSharedHits: track "<<uid);
308 // get event context and map from cache
309 const EventContext& ctx{Gaudi::Hive::currentContext()};
310 std::lock_guard<std::mutex> lock{m_mutex};
311 ObservedTrackMap* trk_map = getTrackMap(ctx);
312
313 // find track and update rejection location
314 if ( trk_map->find(uid) == trk_map->end() ) {
315 // not found
316 ATH_MSG_WARNING("updateHolesSharedHits: track "<<uid<<" not found in observedTrkMap");
317 }
318 else {
319 // found
320 std::get<xAOD::ObserverToolIndex::numPixelHoles>(trk_map->at(uid)) = numPixelHoles;
321 std::get<xAOD::ObserverToolIndex::numSCTHoles>(trk_map->at(uid)) = numSCTHoles;
322 std::get<xAOD::ObserverToolIndex::numSplitSharedPixel>(trk_map->at(uid)) = numSplitSharedPixel; // Number of Pixel clusters comptaible with being split that are also shared
323 std::get<xAOD::ObserverToolIndex::numSplitSharedSCT>(trk_map->at(uid)) = numSplitSharedSCT; // Number of SCT clusters comptaible with being split that are also shared
324 std::get<xAOD::ObserverToolIndex::numSharedOrSplit>(trk_map->at(uid)) = numSharedOrSplit; // Number of split + shared clusters
325 std::get<xAOD::ObserverToolIndex::numSharedOrSplitPixels>(trk_map->at(uid)) = numSharedOrSplitPixels; // Number of pixel clusters that are either split or shared
326 std::get<xAOD::ObserverToolIndex::numShared>(trk_map->at(uid)) = numShared; // Number of shared hits on track
327 std::get<xAOD::ObserverToolIndex::isPatternTrack>(trk_map->at(uid)) = isPatternTrack; // Pattern Track or Fitted track
328 std::get<xAOD::ObserverToolIndex::totalSiHits>(trk_map->at(uid)) = totalSiHits; // totalSiHits
329 std::get<xAOD::ObserverToolIndex::inROI>(trk_map->at(uid)) = inROI;
330 std::get<xAOD::ObserverToolIndex::hasIBLHit>(trk_map->at(uid)) = hasIBLHit;
331 std::get<xAOD::ObserverToolIndex::hasSharedIBLHit>(trk_map->at(uid)) = hasSharedIBLHit;
332 std::get<xAOD::ObserverToolIndex::hasSharedPixel>(trk_map->at(uid)) = hasSharedPixel;
333 std::get<xAOD::ObserverToolIndex::firstPixIsShared>(trk_map->at(uid)) = firstPixIsShared;
334 std::get<xAOD::ObserverToolIndex::numPixelDeadSensor>(trk_map->at(uid)) = numPixelDeadSensor;
335 std::get<xAOD::ObserverToolIndex::numSCTDeadSensor>(trk_map->at(uid)) = numSCTDeadSensor;
336 std::get<xAOD::ObserverToolIndex::numPixelHits>(trk_map->at(uid)) = numPixelHits;
337 std::get<xAOD::ObserverToolIndex::numSCTHits>(trk_map->at(uid)) = numSCTHits;
338 std::get<xAOD::ObserverToolIndex::numUnused>(trk_map->at(uid)) = numUnused;
339 std::get<xAOD::ObserverToolIndex::numTRT_Unused>(trk_map->at(uid)) = numTRT_Unused;
340 std::get<xAOD::ObserverToolIndex::numSCT_Unused>(trk_map->at(uid)) = numSCT_Unused;
341 std::get<xAOD::ObserverToolIndex::numPseudo>(trk_map->at(uid)) = numPseudo;
342 std::get<xAOD::ObserverToolIndex::averageSplit1>(trk_map->at(uid)) = averageSplit1;
343 std::get<xAOD::ObserverToolIndex::averageSplit2>(trk_map->at(uid)) = averageSplit2;
344 std::get<xAOD::ObserverToolIndex::numWeightedShared>(trk_map->at(uid)) = numWeightedShared;
345 ATH_MSG_DEBUG("updateHolesSharedHits: track "<<uid<<" with totalSiHits "<<totalSiHits);
346 }
347}
348
350
351 // prints out/dumps all entries in m_observedTrkMap
352
353 std::lock_guard<std::mutex> lock{m_mutex};
354
355 ATH_MSG_INFO ("Dump observedTrkMap (size = " << getNObservedTracks(trk_map) << ")");
356 for (const auto& itrMap : *trk_map) {
357 ATH_MSG_DEBUG("Id: " << itrMap.first);
358 ATH_MSG_DEBUG("\tscore: " << std::get<xAOD::ObserverToolIndex::score>(itrMap.second));
359 ATH_MSG_DEBUG("\trejectStep: " << std::get<xAOD::ObserverToolIndex::rejectStep>(itrMap.second));
360 ATH_MSG_DEBUG("\trejectReason: " << std::get<xAOD::ObserverToolIndex::rejectReason>(itrMap.second));
361 ATH_MSG_DEBUG("\tparentId: " << std::get<xAOD::ObserverToolIndex::parentId>(itrMap.second));
362 ATH_MSG_DEBUG("\tnumPixelHoles: " << std::get<xAOD::ObserverToolIndex::numPixelHoles>(itrMap.second));
363 ATH_MSG_DEBUG("\tnumSCTHoles: " << std::get<xAOD::ObserverToolIndex::numSCTHoles>(itrMap.second));
364 ATH_MSG_DEBUG("\tnumSplitSharedPixel: " << std::get<xAOD::ObserverToolIndex::numSplitSharedPixel>(itrMap.second));
365 ATH_MSG_DEBUG("\tnumSplitSharedSCT: " << std::get<xAOD::ObserverToolIndex::numSplitSharedSCT>(itrMap.second));
366 ATH_MSG_DEBUG("\tnumSharedOrSplit: " << std::get<xAOD::ObserverToolIndex::numSharedOrSplit>(itrMap.second));
367 ATH_MSG_DEBUG("\tnumSharedOrSplitPixels: " << std::get<xAOD::ObserverToolIndex::numSharedOrSplitPixels>(itrMap.second));
368 ATH_MSG_DEBUG("\tnumShared: " << std::get<xAOD::ObserverToolIndex::numShared>(itrMap.second));
369 ATH_MSG_DEBUG("\tisPatternTrack: " << std::get<xAOD::ObserverToolIndex::isPatternTrack>(itrMap.second));
370 ATH_MSG_DEBUG("\ttotalSiHits: " << std::get<xAOD::ObserverToolIndex::totalSiHits>(itrMap.second));
371 ATH_MSG_DEBUG("\tinROI: " << std::get<xAOD::ObserverToolIndex::inROI>(itrMap.second));
372 ATH_MSG_DEBUG("\thasIBLHit: " << std::get<xAOD::ObserverToolIndex::hasIBLHit>(itrMap.second));
373 ATH_MSG_DEBUG("\thasSharedIBLHit: " << std::get<xAOD::ObserverToolIndex::hasSharedIBLHit>(itrMap.second));
374 ATH_MSG_DEBUG("\thasSharedPixel: " << std::get<xAOD::ObserverToolIndex::hasSharedPixel>(itrMap.second));
375 ATH_MSG_DEBUG("\tfirstPixIsShared: " << std::get<xAOD::ObserverToolIndex::firstPixIsShared>(itrMap.second));
376 ATH_MSG_DEBUG("\tnumPixelDeadSensor: " << std::get<xAOD::ObserverToolIndex::numPixelDeadSensor>(itrMap.second));
377 ATH_MSG_DEBUG("\tnumSCTDeadSensor: " << std::get<xAOD::ObserverToolIndex::numSCTDeadSensor>(itrMap.second));
378 ATH_MSG_DEBUG("\tnumPixelHits: " << std::get<xAOD::ObserverToolIndex::numPixelHits>(itrMap.second));
379 ATH_MSG_DEBUG("\tnumSCTHits: " << std::get<xAOD::ObserverToolIndex::numSCTHits>(itrMap.second));
380 ATH_MSG_DEBUG("\tnumUnused: " << std::get<xAOD::ObserverToolIndex::numUnused>(itrMap.second));
381 ATH_MSG_DEBUG("\tnumTRT_Unused: " << std::get<xAOD::ObserverToolIndex::numTRT_Unused>(itrMap.second));
382 ATH_MSG_DEBUG("\tnumSCT_Unused: " << std::get<xAOD::ObserverToolIndex::numSCT_Unused>(itrMap.second));
383 ATH_MSG_DEBUG("\tnumPseudo: " << std::get<xAOD::ObserverToolIndex::numPseudo>(itrMap.second));
384 ATH_MSG_DEBUG("\taverageSplit1: " << std::get<xAOD::ObserverToolIndex::averageSplit1>(itrMap.second));
385 ATH_MSG_DEBUG("\taverageSplit2: " << std::get<xAOD::ObserverToolIndex::averageSplit2>(itrMap.second));
386 ATH_MSG_DEBUG("\tnumWeightedShared: " << std::get<xAOD::ObserverToolIndex::numWeightedShared>(itrMap.second));
387 }
388 ATH_MSG_DEBUG("Number of RejectionReason = acceptedTrack (should equal final tracks): " << getNFinalTracks(trk_map));
389}
390
392 // Generate rejection description
393 std::string rejection_step = "";
394 std::string rejection_reason = "";
395 std::string rejection_description = "";
396 const auto istep = m_rejectStep_descriptions.find(rejectStep);
397 if ( istep == m_rejectStep_descriptions.end() ) {
398 // not found
399 rejection_step = "REJECTION STEP DESCRIPTION NOT FOUND: " + std::to_string(rejectStep);
400 }
401 else {
402 // found
403 rejection_step = istep->second;
404 }
405 const auto ireason = m_rejectReason_descriptions.find(rejectReason);
406 if ( ireason == m_rejectReason_descriptions.end() ) {
407 // not found
408 rejection_reason = "REJECTION REASON DESCRIPTION NOT FOUND: " + std::to_string(rejectReason);
409 }
410 else {
411 // found
412 rejection_reason = ireason->second;
413 }
414 rejection_description = rejection_step + " (" + rejection_reason + ")";
415 return rejection_description;
416}
417
419 // counts the tracks which did not get rejected (this number should equal finalTracks)
420 int nFinalTracks = 0;
421 for (const auto& itrMap : *trk_map) {
422 if (std::get<xAOD::ObserverToolIndex::rejectReason>(itrMap.second) == xAOD::RejectionReason::acceptedTrack) nFinalTracks++;
423 }
424 return nFinalTracks;
425}
426
428 // check the number of tracks in the observer tool map
429 return trk_map->size();
430}
431
432const std::map<xAOD::RejectionStep, std::string> Trk::TrkObserverTool::m_rejectStep_descriptions = {
433 {xAOD::RejectionStep::addNewTracks, "DenseEnvironmentsAmbiguityScoreProcessorTool::addNewTracks"},
434 {xAOD::RejectionStep::refitTrack, "AmbiguityProcessorBase::refitTrack"},
435 {xAOD::RejectionStep::addTrack, "AmbiguityProcessorBase::addTrack"},
436 {xAOD::RejectionStep::decideWhichHitsToKeep, "InDetDenseEnvAmbiTrackSelectionTool::decideWhichHitsToKeep"},
437 {xAOD::RejectionStep::getCleanedOutTrack, "InDetDenseEnvAmbiTrackSelectionTool::getCleanedOutTrack"}
438};
439
440const std::map<xAOD::RejectionReason, std::string> Trk::TrkObserverTool::m_rejectReason_descriptions = {
441 {xAOD::RejectionReason::acceptedTrack, "not actually a rejection; accepted track"},
442 // Reason for rejection within DenseEnvironmentsAmbiguityProcessorTool::solveTracks
443 {xAOD::RejectionReason::stillBeingProcessed, "not actually a rejection; track still being processed"},
444 // Reason for rejection within DenseEnvironmentsAmbiguityScoreProcessorTool::addNewTracks
445 {xAOD::RejectionReason::trackScoreZero, "track score is zero"},
446 {xAOD::RejectionReason::duplicateTrack, "duplicate track"},
447 // Reason for rejection within AmbiguityProcessorBase::refitTrack
448 {xAOD::RejectionReason::subtrackCreated, "not actually a rejection; refit successful, new subtrack created"},
449 {xAOD::RejectionReason::refitFailed, "refit failed"},
450 // Reason for rejection within AmbiguityProcessorBase::addTrack
451 {xAOD::RejectionReason::bremRefitFailed, "brem refit failed"},
452 {xAOD::RejectionReason::bremRefitSubtrackCreated, "not actually a rejection; brem refit successful, new subtrack created"},
453 {xAOD::RejectionReason::bremRefitTrackScoreZero, "brem refit still gave track score zero"},
454 {xAOD::RejectionReason::refitTrackScoreZero, "refit track score 0"},
455 // Reason for rejection within decideWhichHitsToKeep
456 {xAOD::RejectionReason::TSOSRejectedHit, "TSOS of type RejectedHit"},
457 {xAOD::RejectionReason::TSOSOutlierShared, "TSOS of type Outlier and shared"},
458 {xAOD::RejectionReason::pixelSplitButTooManyShared2Ptc, "pixel split but shared between too many tracks (2 particle cluster)"},
459 {xAOD::RejectionReason::pixelSplitButTooManyShared3Ptc, "pixel split but shared between too many tracks (3+ particle cluster)"},
460 {xAOD::RejectionReason::tooManySharedRecoverable, "too many shared hits (recoverable shared hits)"},
461 {xAOD::RejectionReason::tooManySharedNonRecoverable, "too many shared hits (all other non-recoverable shared hits)"},
462 {xAOD::RejectionReason::sharedSCT, "shared SCT hits when we don't really have enough to share"},
463 {xAOD::RejectionReason::sharedHitsBadChi2, "shared hits cause a bad chi2 track"},
464 {xAOD::RejectionReason::sharedHitsNotEnoughUniqueHits, "shared hits does not leave enough unique hits on accepted track"},
465 {xAOD::RejectionReason::firstHitSharedAndPixIBL, "first hit is shared and either IBL or pixel"},
466 {xAOD::RejectionReason::firstHitSharedAndExtraShared, "track with first hit shared had additional shared hit"},
467 {xAOD::RejectionReason::sharedHitsNotEnoughUniqueSiHits, "shared hits does not leave enough Si hits on accepted track"},
468 {xAOD::RejectionReason::sharedIBLSharedWithNoIBLTrack, "shared IBL hit is shared with accepted track that does not have an IBL hit"},
469 {xAOD::RejectionReason::sharedPixelSharedWithDifferentIBLTrack, "shared pixel hit is shared with accepted track that has different IBL hit content"},
470 {xAOD::RejectionReason::tooManySharedAfterIncreasingShared, "too many shared hits after increasing shared hits"},
471 // Reason for rejection within getCleanedOutTrack
472 {xAOD::RejectionReason::notEnoughSiHits, "not enough Si hits"},
473 {xAOD::RejectionReason::notEnoughTRTHits, "not enough TRT hits"},
474 {xAOD::RejectionReason::notEnoughUniqueSiHits, "not enough unique Si hits"},
475 {xAOD::RejectionReason::tooFewHits, "too few hits, reject track with shared hits"},
476 {xAOD::RejectionReason::failedSubtrackCreation, "failed to create subtrack"},
477 {xAOD::RejectionReason::subtrackCreatedWithRecoveredShared, "created subtrack with recovered shared hits"},
479};
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
static Double_t sc
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
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
int saveTracksToStore(const EventContext &ctx, const ObservedTrackMap *trk_map) const
virtual ~TrkObserverTool()
static const std::map< xAOD::RejectionReason, std::string > m_rejectReason_descriptions
static const std::map< xAOD::RejectionStep, std::string > m_rejectStep_descriptions
SG::WriteHandleKey< TrackCollection > m_savedTracksWriteKey
void addInputTrack(int uid, const Trk::Track &track) const
static int getNFinalTracks(const ObservedTrackMap *trk_map)
void rejectTrack(int uid, xAOD::RejectionStep rejectStep, xAOD::RejectionReason rejectReason) const
SG::WriteHandleKey< ObservedTrackMap > m_savedTracksMapWriteKey
static std::string dumpRejection(xAOD::RejectionStep rejectStep, xAOD::RejectionReason rejectReason)
void updateScore(int uid, double score) const
virtual StatusCode initialize()
static int getNObservedTracks(const ObservedTrackMap *trk_map)
ObservedTrackMap * getTrackMap(const EventContext &ctx) const
void updateHolesSharedHits(int uid, int numPixelHoles, int numSCTHoles, int numSplitSharedPixel, int numSplitSharedSCT, int numSharedOrSplit, int numSharedOrSplitPixels, int numShared, int isPatternTrack, int totalSiHits, int inROI, int hasIBLHit, int hasSharedIBLHit, int hasSharedPixel, int firstPixIsShared, int numPixelDeadSensor, int numSCTDeadSensor, int numPixelHits, int numSCTHits, int numUnused, int numTRT_Unused, int numSCT_Unused, int numPseudo, float averageSplit1, float averageSplit2, int numWeightedShared) const
void newEvent(CacheEntry *ent) const
void addSubTrack(int track_uid, int parent_uid, const Trk::Track &track) const
void updateTrackMap(int uid, double score, xAOD::RejectionStep rejectStep, xAOD::RejectionReason rejectReason) const
virtual StatusCode finalize()
void dumpTrackMap(const ObservedTrackMap *trk_map) const
TrkObserverTool(const std::string &type, const std::string &name, const IInterface *parent)
@ decideWhichHitsToKeep
@ pixelSplitButTooManyShared3Ptc
@ bremRefitTrackScoreZero
@ pixelSplitButTooManyShared2Ptc
@ tooManySharedNonRecoverable
@ failedSubtrackCreation
@ firstHitSharedAndPixIBL
@ sharedHitsNotEnoughUniqueHits
@ bremRefitSubtrackCreated
@ firstHitSharedAndExtraShared
@ subtrackCreatedWithRecoveredShared
@ sharedIBLSharedWithNoIBLTrack
@ notEnoughUniqueSiHits
@ sharedPixelSharedWithDifferentIBLTrack
@ tooManySharedAfterIncreasingShared
@ tooManySharedRecoverable
@ sharedHitsNotEnoughUniqueSiHits
EventContext::ContextEvt_t m_evt