ATLAS Offline Software
Loading...
Searching...
No Matches
TrackStatHelper.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
6// TrackStatHelper.cxx
7// Authors: Sven Vahsen
9
10// Private utility class used by IDTrackStat to do track and hit counting
11// Since I'm likely to changes the interface as needed,
12// I would not recommend anyone to use this class outside of IDTrackStat
13//
14// to-do-list
15// o remove TrackCollection argument to addEvent. Is this really needed for the truthmatching?
16// o add DR cut to the fake track cut
17//
18
22#include "AtlasHepMC/GenEvent.h"
23#include "CLHEP/Geometry/Point3D.h"
30#include "TrkTrack/Track.h"
33#include <cstring>
34#include <iomanip>
35#include <sstream>
36#include <utility>
37
38namespace Trk {
39
41 public:
42 static void extract(std::vector<const RIO_OnTrack*>& rots, const std::vector<const MeasurementBase*>& measurements);
43 };
44
45}
46
47
48// summary types for which statistics are gathered.
49// should be synchronised with ETrackSummaryTypes
63};
64
65// Table column labels. should be synchronised with ETrackSummaryTypes
66const char * const InDet::TrackStatHelper::s_summaryTypeName[kNSummaryTypes] = {
67 "blay",
68 "pix",
69 "hole",
70 "gang",
71 "SCT",
72 "hole",
73 "DHole",
74 "TRT",
75 "outl",
76 "TRHi",
77 "outl",
78 "alloutl"};
79
81 std::stringstream out;
82 for (unsigned int stype_i=0; stype_i < kNSummaryTypes; ++stype_i ) {
83 out << std::setw(std::max(6,static_cast<int>(strlen(s_summaryTypeName[stype_i])+1))) << s_summaryTypeName[stype_i];
84 }
85 return out.str();
86}
87
88
89static const std::string track_types_string[InDet::N_TRACKTYPES]= {"all",
90 "primary",
91 "secondary",
92 "truncated",
93 "lowPb1",
94 "lowPb2",
95 "noLink",
96 "matched",
97 "matchedPrimary",
98 "matchedSecondary",
99 "multipleMatches"
100 };//LT added 06.21
101
102InDet::TrackStatHelper::TrackStatHelper(const std::string& TrackCollectionKey, const std::string& TrackTruthCollectionKey, bool careAboutTruth):
103 m_TrackCollectionKey (TrackCollectionKey),
104 m_TrackTruthCollectionKey (TrackTruthCollectionKey),
105 m_truthMissing (false),
106 m_careAboutTruth (careAboutTruth)
107{
108 this->reset();
109}
110
111
113{
114 m_cuts = ct;
115
116}
117
118void InDet::TrackStatHelper::addEvent(const EventContext& ctx,
119 const TrackCollection * recTracks,
120 std::vector <const Trk::Track *> & rec,
121 const std::vector <std::pair<HepMC::ConstGenParticlePtr,int> > & gen,
122 const TrackTruthCollection * truthMap,
123 const AtlasDetectorID * const idHelper,
124 const PixelID * pixelID,
125 const SCT_ID * sctID,
126 const Trk::IExtendedTrackSummaryTool* trkSummaryTool,
127 bool useTrackSummary,
128 const unsigned int * inTimeStart,
129 const unsigned int * inTimeEnd) const
130{
131
132 recoToTruthMap rttMap;
133
134 recoToTruthMap::const_iterator imap;
135
136 m_events ++;
137
138 float Eta = 0;
139 InDet::eta_region Region = ETA_ALL;
140 int Author = 0;
141 int recoClassification = 0;
142 bool truth_missing=false;
143
144 TracksCounter tracks;
145 HitsCounter hits;
146 //Local variable trackSummarySum uses 17136 bytes of stack space
147 //coverity[STACK_USE]
148 TrackSummaryCounter trackSummarySum;
149 bool author_found [Trk::TrackInfo::NumberOfTrackFitters];
150 std::bitset<Trk::TrackInfo::NumberOfTrackRecoInfo> reco_info;
151 std::bitset<Trk::TrackInfo::NumberOfTrackProperties> pattern_properties;
152 for (unsigned int i=0; i < Trk::TrackInfo::NumberOfTrackFitters; ++i) { author_found[i]=false; }
153
154 // ------------ reconstructed tracks -----------------
155 for (const Trk::Track* track : rec) {
156
157 const Trk::TrackParameters* para = track->trackParameters()->front();
158 recoClassification = -999;
159 int thisEventIndex = -999;
160
161 Author = track->info().trackFitter();
162 if (Author > 0 && Author < Trk::TrackInfo::NumberOfTrackFitters){
163 author_found[Author] = true;
164 reco_info |= track->info().patternRecognition();
165 pattern_properties |= track->info().properties();
166 }
167 else {
168 //FIX author_problem++;
169 }
170 if (!para) {
171 Region = ETA_UNKNOWN;
172 }
173 else {
174 Eta = std::abs(para->eta());
175 if (Eta < m_cuts.maxEtaBarrel) Region = ETA_BARREL;
176 else if (Eta < m_cuts.maxEtaTransition) Region = ETA_TRANSITION;
177 else if (Eta < m_cuts.maxEtaEndcap) Region = ETA_ENDCAP;
178 else if ((Eta > m_cuts.minEtaFORWARD) && (Eta < m_cuts.maxEtaFORWARD)) Region = ETA_FORWARD;
179 else Region = ETA_OUTSIDE;
180 }
181
182 if ( !(Region==ETA_BARREL || Region==ETA_TRANSITION || Region==ETA_ENDCAP || Region==ETA_FORWARD) )
183 {
184 continue; // Only want to tally tracks that are within the detector volume.
185 }
186
187 TrackTruthCollection::const_iterator found;
188 TrackTruth trtruth;
189 double trprob = 0;
190
191 if (!truthMap) {
192 // no truthmap
193 truth_missing=true;
194 }
195 else {
197 tracklink.setElement(track);
198 tracklink.setStorableObject(*recTracks);
199 const ElementLink<TrackCollection> tracklink2=tracklink;
200
201 found = truthMap->find(tracklink2);
202 if(!(found == truthMap->end())){
203 trtruth=found->second;
204 HepMcParticleLink hmpl = trtruth.particleLink();
205 thisEventIndex = hmpl.eventIndex();
206 rttMap.insert(std::pair<HepMcParticleLink,float>(hmpl,trtruth.probability()));
207 // ME: remember prob
208 trprob = trtruth.probability();
209 }
210
211 }
212
213
214 if(!PassTrackCuts(para)) continue;
215
216 tracks.m_counter[kTracks_rec][TRACK_ALL][Region]++;
217 tracks.m_counter[kTracks_rec][TRACK_ALL][ETA_ALL]++;
218 // signal only tracks for the denominator in signal efficiencies
219 if (thisEventIndex==0)
220 {
221 tracks.m_counter[kTracks_rec][TRACK_ALL_SIGNAL][Region]++;
222 tracks.m_counter[kTracks_rec][TRACK_ALL_SIGNAL][ETA_ALL]++;
223 }
224
225 // process track summary
226
227 std::unique_ptr<Trk::TrackSummary> cleanup;
228 const Trk::TrackSummary* summary = track->trackSummary();
229
230 if (useTrackSummary) {
231 if (!track->trackSummary()) {
232 cleanup = trkSummaryTool->summary(ctx, *track);
233 summary=cleanup.get();
234 }
235
236 setSummaryStat(TRACK_ALL, Region, summary, trackSummarySum);
237 }
238
239 // check if current reco track has more than a specified fraction of hits
240 // from a generated track. [If not, it will be counted as a fake
241 // track in the statistics report.]
242
243 if (!truthMap) {
244 truth_missing=true;
245 }
246 else {// no truthmap
247
248 if (found == truthMap->end()) {
249 // m_truthMissing=true;
250 // no truth might happen with new truth !
251 tracks.m_counter[kTracks_rec][TRACK_NOHEPMCPARTICLELINK][Region]++;
252 tracks.m_counter[kTracks_rec][TRACK_NOHEPMCPARTICLELINK][ETA_ALL]++;
253 setSummaryStat(TRACK_NOHEPMCPARTICLELINK, Region, summary, trackSummarySum);
254 }
255 else{ // no link
256
257 // ME : change logic, secondaries from G4 processes are truncated
258 const HepMcParticleLink& HMPL=trtruth.particleLink();
259 if (! HMPL.isValid()) {
260 tracks.m_counter[kTracks_rec][TRACK_NOHEPMCPARTICLELINK][Region]++;
261 tracks.m_counter[kTracks_rec][TRACK_NOHEPMCPARTICLELINK][ETA_ALL]++;
262 setSummaryStat(TRACK_NOHEPMCPARTICLELINK, Region, summary, trackSummarySum);
263 }
264 else {
265 //classify track as coming from primary, secondary or truncated gen particle
266 HepMC::ConstGenParticlePtr particle = HMPL.scptr();
267 recoClassification = ClassifyParticle(particle, trprob);
268
269 if (trprob < m_cuts.fakeTrackCut)
270 {
271 tracks.m_counter[kTracks_rec][TRACK_LOWTRUTHPROB][Region]++;
272 tracks.m_counter[kTracks_rec][TRACK_LOWTRUTHPROB][ETA_ALL]++;
273 if (thisEventIndex==0)
274 {
275 tracks.m_counter[kTracks_rec][TRACK_LOWTRUTHPROB_SIGNAL][Region]++;
276 tracks.m_counter[kTracks_rec][TRACK_LOWTRUTHPROB_SIGNAL][ETA_ALL]++;
277 }
278 setSummaryStat(TRACK_LOWTRUTHPROB, Region, summary, trackSummarySum);
279 }
280 if (trprob < m_cuts.fakeTrackCut2) {
281 tracks.m_counter[kTracks_rec][TRACK_LOWTRUTHPROB2][Region]++;
282 tracks.m_counter[kTracks_rec][TRACK_LOWTRUTHPROB2][ETA_ALL]++;
283 if (thisEventIndex==0)
284 {
285 tracks.m_counter[kTracks_rec][TRACK_LOWTRUTHPROB2_SIGNAL][Region]++;
286 tracks.m_counter[kTracks_rec][TRACK_LOWTRUTHPROB2_SIGNAL][ETA_ALL]++;
287 }
288 setSummaryStat(TRACK_LOWTRUTHPROB2, Region, summary, trackSummarySum);
289 }
290 } // end else on !isVadid
291 }
292 }
293
294 // ------------------ hits on reconstructed tracks ---------------
295
296 EHitsCounter part_type = ( recoClassification==TRACK_PRIMARY
297 ? kHits_pri
298 : ( recoClassification==TRACK_SECONDARY
299 ? kHits_sec
300 : kNHitsCounter));
301 for (const Trk::TrackStateOnSurface* hit : *track->trackStateOnSurfaces()) {
302 if(hit){
303 const Trk::MeasurementBase* mesh =hit->measurementOnTrack();
304 if (mesh) {
305 const Trk::RIO_OnTrack* rio{} ;
307 assert(dynamic_cast<const Trk::RIO_OnTrack*>(mesh)!=nullptr);
308 rio = static_cast<const Trk::RIO_OnTrack*>(mesh);
309 } else {
310 // try CompetingROT:
312 assert(dynamic_cast<const Trk::CompetingRIOsOnTrack*>(mesh) !=nullptr);
313 auto comprot = static_cast<const Trk::CompetingRIOsOnTrack*>(mesh);
314 rio = &comprot->rioOnTrack(comprot->indexOfMaxAssignProb());
315 }
316 }
317
318
319 if (rio) {
320 // skip outliers
322 continue;
323
324 hits.m_counter[kHits_rec][HIT_ALL][Region]++;
325 hits.m_counter[kHits_rec][HIT_ALL][ETA_ALL]++;
326 if(part_type<kNHitsCounter){
327 hits.m_counter[part_type][HIT_ALL][Region]++;
328 hits.m_counter[part_type][HIT_ALL][ETA_ALL]++;
329 }
330
331 Identifier id = rio->identify();
332 int HitDet = HIT_UNKNOWN;
333 int HitLayer = N_HITTYPES;
334 bool part_type_for_all=true;
335 if (idHelper->is_trt(id)){
336 HitDet=HIT_TRT_ALL;
337 }
338 else if (idHelper->is_sct(id)){
339 HitDet=HIT_SCT_ALL;
340 if (sctID) {
341 switch (sctID->layer_disk(id)) {
342 case 0: HitLayer = HIT_SCT1; break;
343 case 1: HitLayer = HIT_SCT2; break;
344 case 2: HitLayer = HIT_SCT3; break;
345 case 3: HitLayer = HIT_SCT4; break;
346 case 4: case 5: case 6: case 7: case 8: HitLayer = HIT_SCT5TO9; break;
347 default: HitLayer = HIT_UNKNOWN; break;
348 }
349 }
350 }
351 else if (idHelper->is_pixel(id)){
352 part_type_for_all=false;
353 HitDet = HIT_PIXEL_ALL;
354 if (pixelID) {
355 switch (pixelID->layer_disk(id)) {
356 case 0: HitLayer = HIT_PIX1; break;
357 case 1: HitLayer = HIT_PIX2; break;
358 case 2: HitLayer = HIT_PIX3; break;
359 default: HitLayer = HIT_UNKNOWN;
360 }
361 }
362 }
363
364 hits.m_counter[kHits_rec][HitDet][Region]++;
365 hits.m_counter[kHits_rec][HitDet][ETA_ALL]++;
366 if(part_type_for_all && part_type<kNHitsCounter){
367 hits.m_counter[part_type][HitDet][Region]++;
368 hits.m_counter[part_type][HitDet][ETA_ALL]++;
369 }
370
371 if (HitLayer<N_HITTYPES) {
372 hits.m_counter[kHits_rec][HitLayer][Region]++;
373 hits.m_counter[kHits_rec][HitLayer][ETA_ALL]++;
374 if(part_type<kNHitsCounter){
375 hits.m_counter[part_type][HitLayer][Region]++;
376 hits.m_counter[part_type][HitLayer][ETA_ALL]++;
377 }
378 }
379 }
380 }
381 }
382 }
383 }
384
385 // ------------------------- generated tracks, including pileup -----------------------------
386
387 Eta = 0;
388 Region = ETA_ALL;
389 int classification=-999;
390 for (auto truth = gen.begin(); truth != gen.end(); ++truth) {
391 classification=-999;
392 bool inTimePileup = truth->second == 0 || (truth->second >= (int)*inTimeStart && truth->second <= (int)*inTimeEnd);
393
394 auto particle = truth->first;
395
396 //determine eta region
397 Eta = std::abs(particle->momentum().pseudoRapidity());
398 if (Eta < m_cuts.maxEtaBarrel) Region = ETA_BARREL;
399 else if (Eta < m_cuts.maxEtaTransition) Region = ETA_TRANSITION;
400 else if (Eta < m_cuts.maxEtaEndcap) Region = ETA_ENDCAP;
401 else if ((Eta > m_cuts.minEtaFORWARD) && (Eta < m_cuts.maxEtaFORWARD)) Region = ETA_FORWARD;
402 else Region = ETA_OUTSIDE;
403 if ( !(Region==ETA_BARREL || Region==ETA_TRANSITION || Region==ETA_ENDCAP || Region==ETA_FORWARD) )
404 {
405 continue; // Only want to tally tracks that are within the detector volume.
406 }
407 tracks.m_counter[kTracks_gen][TRACK_ALL][Region]++;
408 tracks.m_counter[kTracks_gen][TRACK_ALL][ETA_ALL] ++;
409 if (inTimePileup) tracks.m_counter[kTracks_gen][TRACK_ALL_SIGNAL][ETA_ALL]++; // "SIGNAL" is misnomer here
410 if (inTimePileup) tracks.m_counter[kTracks_gen][TRACK_ALL_SIGNAL][Region]++;
411
412 //classify gen as primary, secondary or truncated
413 classification = ClassifyParticle(particle,1.);
414
415 if(classification==TRACK_PRIMARY){
416 tracks.m_counter[kTracks_gen][TRACK_PRIMARY][ETA_ALL] ++;
417 tracks.m_counter[kTracks_gen][TRACK_PRIMARY][Region]++;
418 }
419 if(classification==TRACK_SECONDARY){
420 tracks.m_counter[kTracks_gen][TRACK_SECONDARY][ETA_ALL] ++;
421 tracks.m_counter[kTracks_gen][TRACK_SECONDARY][Region]++;
422 }
423
424 //see if gen track has at least 1 matching reco track with high enough probability
425 bool matched = false;
426 int nmatched = 0;
427
428 HepMcParticleLink hmpl2(particle,particle->parent_event()->event_number(),HepMcParticleLink::IS_EVENTNUM);
429 recoToTruthMap::iterator rttIter=rttMap.find(hmpl2);
430 if(rttIter != rttMap.end()){
431 for(imap = rttMap.lower_bound(hmpl2); imap !=rttMap.upper_bound(hmpl2); ++imap){
432 if(imap->second > m_cuts.matchTrackCut){
433 matched = true;
434 nmatched++;
435 }
436 }
437 }
438 if (matched) {
439 tracks.m_counter[kTracks_gen][TRACK_MATCHED][Region]++;
440 tracks.m_counter[kTracks_gen][TRACK_MATCHED][ETA_ALL]++;
441 if (inTimePileup)
442 {
443 tracks.m_counter[kTracks_gen][TRACK_MATCHED_SIGNAL][Region]++;
444 tracks.m_counter[kTracks_gen][TRACK_MATCHED_SIGNAL][ETA_ALL]++;
445 }
446 if(nmatched > 1){
447 tracks.m_counter[kTracks_gen][TRACK_MULTMATCH][Region] += nmatched-1;
448 tracks.m_counter[kTracks_gen][TRACK_MULTMATCH][ETA_ALL]+= nmatched-1;
449 }
450 if(classification==TRACK_PRIMARY){
451 tracks.m_counter[kTracks_gen][TRACK_MATCHED_PRIMARY][Region]++;
452 tracks.m_counter[kTracks_gen][TRACK_MATCHED_PRIMARY][ETA_ALL]++;
453 if(nmatched > 1){
454 tracks.m_counter[kTracks_gen][TRACK_MULTMATCH_PRIMARY][Region] += nmatched-1;
455 tracks.m_counter[kTracks_gen][TRACK_MULTMATCH_PRIMARY][ETA_ALL] += nmatched-1;
456 }
457 }
458 if(classification==TRACK_SECONDARY){
459 tracks.m_counter[kTracks_gen][TRACK_MATCHED_SECONDARY][Region]++;
460 tracks.m_counter[kTracks_gen][TRACK_MATCHED_SECONDARY][ETA_ALL]++;
461 if(nmatched > 1){
462 tracks.m_counter[kTracks_gen][TRACK_MULTMATCH_SECONDARY][Region] += nmatched-1;
463 tracks.m_counter[kTracks_gen][TRACK_MULTMATCH_SECONDARY][ETA_ALL] += nmatched-1;
464 }
465 }
466 }
467 }
468
469 // ------------------------- generated tracks, just signal event -----------------------------
470 // For efficiencies.
471
472 Eta = 0;
473 Region = ETA_ALL;
474 classification=-999;
475
476 for (auto truth = gen.begin(); truth != gen.end(); ++truth)
477 {
478 if (truth->second != 0) // only signal event GenParticles
479 continue;
480
481 classification=-999;
482
483 auto particle = truth->first;
484
485 //determine eta region
486 Eta = std::abs(particle->momentum().pseudoRapidity());
487 if (Eta < m_cuts.maxEtaBarrel) Region = ETA_BARREL;
488 else if (Eta < m_cuts.maxEtaTransition) Region = ETA_TRANSITION;
489 else if (Eta < m_cuts.maxEtaEndcap) Region = ETA_ENDCAP;
490 else if ((Eta > m_cuts.minEtaFORWARD) && (Eta < m_cuts.maxEtaFORWARD)) Region = ETA_FORWARD;
491 else Region = ETA_OUTSIDE;
492 if ( !(Region==ETA_BARREL || Region==ETA_TRANSITION || Region==ETA_ENDCAP || Region==ETA_FORWARD) )
493 {
494 continue; // Only want to tally tracks that are within the detector volume.
495 }
496 tracks.m_counter[kTracks_gen_signal][TRACK_ALL][ETA_ALL] ++;
497 tracks.m_counter[kTracks_gen_signal][TRACK_ALL][Region]++;
498
499 //classify gen partilce as primary, secondary or truncated
500 classification = ClassifyParticle(particle,1.);
501
502 if(classification==TRACK_PRIMARY){
503 tracks.m_counter[kTracks_gen_signal][TRACK_PRIMARY][ETA_ALL] ++;
504 tracks.m_counter[kTracks_gen_signal][TRACK_PRIMARY][Region]++;
505 }
506 if(classification==TRACK_SECONDARY){
507 tracks.m_counter[kTracks_gen_signal][TRACK_SECONDARY][ETA_ALL] ++;
508 tracks.m_counter[kTracks_gen_signal][TRACK_SECONDARY][Region]++;
509 }
510
511 //see if gen track has at least 1 matching reco track with high enough probability
512 bool matched = false;
513 int nmatched = 0;
514
515 HepMcParticleLink hmpl2(particle,truth->second,HepMcParticleLink::IS_EVENTNUM); // FIXME truth->second is actually the position of the GenEvent in the McEventCollection!! See InDetRecStatisticsAlg::selectGenSignal(...) method (only client of TrackStatsHelper)
516 recoToTruthMap::iterator rttIter=rttMap.find(hmpl2);
517 if(rttIter != rttMap.end()){
518 for(imap = rttMap.lower_bound(hmpl2); imap !=rttMap.upper_bound(hmpl2); ++imap){
519 if(imap->second > m_cuts.matchTrackCut){
520 matched = true;
521 nmatched++;
522 }
523 }
524 }
525 if (matched) {
526 tracks.m_counter[kTracks_gen_signal][TRACK_MATCHED][Region]++;
527 tracks.m_counter[kTracks_gen_signal][TRACK_MATCHED][ETA_ALL]++;
528 if(nmatched > 1){
529 tracks.m_counter[kTracks_gen_signal][TRACK_MULTMATCH][Region] += nmatched-1;
530 tracks.m_counter[kTracks_gen_signal][TRACK_MULTMATCH][ETA_ALL]+= nmatched-1;
531 }
532 if(classification==TRACK_PRIMARY){
533 tracks.m_counter[kTracks_gen_signal][TRACK_MATCHED_PRIMARY][Region]++;
534 tracks.m_counter[kTracks_gen_signal][TRACK_MATCHED_PRIMARY][ETA_ALL]++;
535 if(nmatched > 1){
536 tracks.m_counter[kTracks_gen_signal][TRACK_MULTMATCH_PRIMARY][Region] += nmatched-1;
537 tracks.m_counter[kTracks_gen_signal][TRACK_MULTMATCH_PRIMARY][ETA_ALL] += nmatched-1;
538 }
539 }
540 if(classification==TRACK_SECONDARY){
541 tracks.m_counter[kTracks_gen_signal][TRACK_MATCHED_SECONDARY][Region]++;
542 tracks.m_counter[kTracks_gen_signal][TRACK_MATCHED_SECONDARY][ETA_ALL]++;
543 if(nmatched > 1){
544 tracks.m_counter[kTracks_gen_signal][TRACK_MULTMATCH_SECONDARY][Region] += nmatched-1;
545 tracks.m_counter[kTracks_gen_signal][TRACK_MULTMATCH_SECONDARY][ETA_ALL] += nmatched-1;
546 }
547 }
548 }
549 }
550
551 if (truth_missing) {
552 m_truthMissing = truth_missing;
553 }
554 m_tracks += tracks;
555 m_hits += hits;
556 m_trackSummarySum += trackSummarySum;
557 for (unsigned int i=0; i < Trk::TrackInfo::NumberOfTrackFitters; ++i) {
558 if (author_found[i]) {
559 m_author_found[i] = author_found[i];
560 }
561 }
562 {
563 std::lock_guard<std::mutex> lock(m_authorMutex);
564 m_recoInfo |= reco_info;
565 m_patternProperties |= pattern_properties;
566 }
567}
568
570 m_events = 0;
571 m_hits.reset();
572 m_tracks.reset();
573 m_trackSummarySum.reset();
574
575 for (int i=0; i<Trk::TrackInfo::NumberOfTrackFitters; i++) {
576 m_author_found[i] = false;
577 }
578 m_truthMissing=false;
579}
580
581
582void InDet::TrackStatHelper::print(MsgStream &out) const {
583
584 out << " Printing Statistics for " << key();
585
586 out << "TrackCollection \"" << key() << "\" " << "\n" ;
587
588 if (m_events > 0) {
589 out << "(TrackAuthors:";
590 std::vector<std::string> author_string;
591 author_string.reserve(Trk::TrackInfo::NumberOfTrackFitters);
592 for (int i=0; i<Trk::TrackInfo::NumberOfTrackFitters; ++i) {
593 author_string.push_back( Trk::TrackInfo(static_cast<Trk::TrackInfo::TrackFitter>(i),
595 m_patternProperties,
596 m_recoInfo).dumpInfo() );
597 }
598 for (int i=0; i<Trk::TrackInfo::NumberOfTrackFitters; i++){
599 if (m_author_found[i]){
600 out << " " << author_string[i];
601 }
602 }
603 out << " )" << std::endl
604 << "TrackTruthCollection \"" << Truthkey() << "\"" << std::endl;
605
606 if (m_truthMissing)
607 {
609 out << " WARNING: TrackTruth missing for part of this TrackCollection, no efficiencies or fakerates included.!" << std::endl;
610 else
611 out << " INFO: Intentionally no TrackTruth for this TrackCollection, no efficiencies or fakerates included." << std::endl;
612 }
613 if (!m_truthMissing)
614 {
615 out << " \t\t\t ................................tracks................................" << std::endl;
616 out << " \t\t\tn/event\tSEff.pr\tSEff.sd\tSLowP1\tSLowP2\tLowP1\tLowP2\tnoLink\tmultM\t" << std::endl;
617 out << " total "; printRegion1(out,ETA_ALL);
618 out << " in barrel "; printRegion1(out,ETA_BARREL);
619 out << " in trans. "; printRegion1(out,ETA_TRANSITION);
620 out << " in endcap "; printRegion1(out,ETA_ENDCAP);
621 out << " in forwa."; printRegion1(out,ETA_FORWARD);
622
623 }
624 else // no truth
625 {
626 out << "\t" << "tracks, n/event:" << std::endl;
627 out << "\t\t" << "total" << std::setiosflags(std::ios::fixed | std::ios::showpoint) <<
628 std::setw(7) << std::setprecision(2) << "\t" << m_tracks.m_counter[kTracks_rec][TRACK_ALL][ETA_ALL]/(float) m_events << std::endl << std::setprecision(-1);
629 out << "\t\t" << "in barrel" << std::setiosflags(std::ios::fixed | std::ios::showpoint) <<
630 std::setw(7) << std::setprecision(2) << "\t" << m_tracks.m_counter[kTracks_rec][TRACK_ALL][ETA_BARREL]/(float) m_events << std::endl << std::setprecision(-1);
631 out << "\t\t" << "in trans." << std::setiosflags(std::ios::fixed | std::ios::showpoint) <<
632 std::setw(7) << std::setprecision(2) << "\t" << m_tracks.m_counter[kTracks_rec][TRACK_ALL][ETA_TRANSITION]/(float) m_events << std::endl << std::setprecision(-1);
633 out << "\t\t" << "in endcap" << std::setiosflags(std::ios::fixed | std::ios::showpoint) <<
634 std::setw(7) << std::setprecision(2) << "\t" << m_tracks.m_counter[kTracks_rec][TRACK_ALL][ETA_ENDCAP]/(float) m_events << std::endl << std::setprecision(-1);
635 out << "\t\t" << "in forwa." << std::setiosflags(std::ios::fixed | std::ios::showpoint) <<
636 std::setw(7) << std::setprecision(2) << "\t" << m_tracks.m_counter[kTracks_rec][TRACK_ALL][ETA_FORWARD]/(float) m_events << std::endl << std::setprecision(-1);
637 }
638 out << " \t\t\t ....................................hits/track............................" << std::endl;
639 out << " \t\t\t\ttotal\tPIX1\tPIX2\tPIX3\tSCT1\tSCT2\tSCT3\tSCT4\tSCT5to9\tStraws" << std::endl;
640 out << " total "; printRegion2(out,ETA_ALL, (float) m_tracks.m_counter[kTracks_rec][TRACK_ALL][ETA_ALL]);
641 out << " in barrel "; printRegion2(out,ETA_BARREL, (float) m_tracks.m_counter[kTracks_rec][TRACK_ALL][ETA_BARREL]);
642 out << " in trans. "; printRegion2(out,ETA_TRANSITION, (float) m_tracks.m_counter[kTracks_rec][TRACK_ALL][ETA_TRANSITION] );
643 out << " in endcap "; printRegion2(out,ETA_ENDCAP, (float) m_tracks.m_counter[kTracks_rec][TRACK_ALL][ETA_ENDCAP] );
644 out << " in forwa. "; printRegion2(out,ETA_FORWARD, (float) m_tracks.m_counter[kTracks_rec][TRACK_ALL][ETA_FORWARD] );
645
646 }
647 else
648 out << ": NO EVENTS PROCESSED! " << std::endl;
649}
650
651void InDet::TrackStatHelper::printRegion1(MsgStream &out, enum eta_region region) const {
652 out << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setw(7) << std::setprecision(2)
653 << "\t" << m_tracks.m_counter[kTracks_rec][TRACK_ALL][region]/(float) m_events;
654
655 if (m_tracks.m_counter[kTracks_gen_signal][TRACK_PRIMARY][region]) {
656 out << "\t" << std::setprecision(4)
657 << m_tracks.m_counter[kTracks_gen_signal][TRACK_MATCHED_PRIMARY][region]/ (float) m_tracks.m_counter[kTracks_gen_signal][TRACK_PRIMARY][region] // track efficiency wrt. gen primary in signal
658 << std::setprecision(2);
659 }
660 else {
661 out << "\t" << "n/a" ;
662 }
663 if (m_tracks.m_counter[kTracks_gen_signal][TRACK_SECONDARY][region]) {
664 out << "\t" << std::setprecision(4)
665 << m_tracks.m_counter[kTracks_gen_signal][TRACK_MATCHED_SECONDARY][region]/ (float) m_tracks.m_counter[kTracks_gen_signal][TRACK_SECONDARY][region] // track efficiency wrt. gen secondary in signal
666 << std::setprecision(2);
667 }
668 else {
669 out << "\t" << "n/a" ;
670 }
671
672 if (m_tracks.m_counter[kTracks_rec][TRACK_ALL_SIGNAL][region]) {
673 out << "\t" << 100*(m_tracks.m_counter[kTracks_rec][TRACK_LOWTRUTHPROB_SIGNAL][region]/ (float) m_tracks.m_counter[kTracks_rec][TRACK_ALL_SIGNAL][region]) << "%" // track fake rate for signal only
674 << "\t" << 100*(m_tracks.m_counter[kTracks_rec][TRACK_LOWTRUTHPROB2_SIGNAL][region]/ (float) m_tracks.m_counter[kTracks_rec][TRACK_ALL_SIGNAL][region]) << "%"; // track fake rate for signal only
675 }
676 else {
677 out << "\t" << "n/a\tn/a" ;
678 }
679
680 if (m_tracks.m_counter[kTracks_rec][TRACK_ALL][region]) {
681 out << "\t" << 100*(m_tracks.m_counter[kTracks_rec][TRACK_LOWTRUTHPROB][region]/ (float) m_tracks.m_counter[kTracks_rec][TRACK_ALL][region]) << "%" // track fake rate
682 << "\t" << 100*(m_tracks.m_counter[kTracks_rec][TRACK_LOWTRUTHPROB2][region]/ (float) m_tracks.m_counter[kTracks_rec][TRACK_ALL][region]) << "%" // track fake rate
683 << "\t" << 100*(m_tracks.m_counter[kTracks_rec][TRACK_NOHEPMCPARTICLELINK][region]/ (float) m_tracks.m_counter[kTracks_rec][TRACK_ALL][region]) << "%" // rate of tracks without HepMcParticleLink
684 << "\t" << 100*(m_tracks.m_counter[kTracks_gen][TRACK_MULTMATCH][region]/ (float) m_tracks.m_counter[kTracks_rec][TRACK_ALL][region]) << "%"; // rate of tracks matched to the same truth track
685
686 }
687 else{
688 out << "\tn/a\tn/a\tn/a";
689 }
690 out << std::endl << std::setprecision(-1);
691}
692
693void InDet::TrackStatHelper::printRegion2(MsgStream &out, enum eta_region region, float denominator) const {
694 out << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setw(7) << std::setprecision(2);
695 if (denominator > 0) {
696 out << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setw(4) << std::setprecision(1)
697 <<" \t\t" << float(m_hits.m_counter[kHits_rec][HIT_ALL ][region]/denominator) << std::setprecision(2)
698 << "\t" << float(m_hits.m_counter[kHits_rec][HIT_PIX1 ][region]/denominator)
699 << "\t" << float(m_hits.m_counter[kHits_rec][HIT_PIX2 ][region]/denominator)
700 << "\t" << float(m_hits.m_counter[kHits_rec][HIT_PIX3 ][region]/denominator)
701 << "\t" << float(m_hits.m_counter[kHits_rec][HIT_SCT1 ][region]/denominator)
702 << "\t" << float(m_hits.m_counter[kHits_rec][HIT_SCT2 ][region]/denominator)
703 << "\t" << float(m_hits.m_counter[kHits_rec][HIT_SCT3 ][region]/denominator)
704 << "\t" << float(m_hits.m_counter[kHits_rec][HIT_SCT4 ][region]/denominator)
705 << "\t" << float(m_hits.m_counter[kHits_rec][HIT_SCT5TO9][region]/denominator)
706 << "\t" << float(m_hits.m_counter[kHits_rec][HIT_TRT_ALL][region]/denominator)
707 << std::endl << std::setprecision(-1);
708 }
709 else {
710 out << " Unable to calculate: Denominator=0." << std::endl << std::setprecision(-1);
711 }
712}
713
715 enum track_types track_type ,
716 enum eta_region eta_region ) const
717{
718 long ex_denom = m_trackSummarySum.m_counter[kNTrackSummaryOK][track_type][eta_region][kNumberOfPixelHits]
719 + m_trackSummarySum.m_counter[kNTrackSummaryBAD][track_type][eta_region][kNumberOfPixelHits];
720 if (ex_denom > 0)
721 {
722 out << std::setiosflags(std::ios::fixed | std::ios::showpoint)
723 << std::setw(8) << track_types_string[track_type]
724 << std::setw(25) << key();
725
726 if (m_events)
727 out << std::setw(6) << std::setprecision(2) << m_tracks.m_counter[kTracks_rec][track_type][eta_region]/(float) m_events;
728 else
729 out << std::setw(6) << "n/a";
730 for (unsigned int stype_i=0; stype_i< kNSummaryTypes; ++stype_i) {
731 out << std::setw(std::max(6,static_cast<int>(strlen(s_summaryTypeName[stype_i])+1)))
732 << std::setprecision(2); printTrackSummaryAverage(out, track_type , eta_region, stype_i );
733 }
734 out << std::endl << std::setprecision(-1);
735 return true; // yes, printed output
736 }
737 else
738 return false; // no, didn't print output
739}
740
742 enum track_types track_type ,
743 enum eta_region eta_region,
744 int summary_type ) const
745{
746 assert( summary_type < kNSummaryTypes);
747 long denom = m_trackSummarySum.m_counter[kNTrackSummaryOK][track_type][eta_region][summary_type]
748 + m_trackSummarySum.m_counter[kNTrackSummaryBAD][track_type][eta_region][summary_type];
749
750 if (denom > 0) {
751 out << float ( m_trackSummarySum.m_counter[kTrackSummarySum][track_type][eta_region][summary_type]/ (float) denom);
752 }
753 else {
754 out << "n/a";
755 }
756}
757
758void InDet::TrackStatHelper::printSecondary(MsgStream &out) const {
759 out << "TrackCollection \"" << key() << "\" " << std::endl;
760 if (m_events > 0) {
761 out << "(TrackAuthors:";
762 std::vector<std::string> author_string;
763 author_string.reserve(Trk::TrackInfo::NumberOfTrackFitters);
764 for (int i=0; i<Trk::TrackInfo::NumberOfTrackFitters; i++) {
765 author_string.push_back( Trk::TrackInfo(static_cast<Trk::TrackInfo::TrackFitter>(i),
767 m_patternProperties,
768 m_recoInfo).dumpInfo() );
769 }
770 for (int i=0; i<Trk::TrackInfo::NumberOfTrackFitters; i++){
771 if (m_author_found[i]){
772 out << " " << author_string[i];
773 }
774 }
775 out << " )" << std::endl
776 << "TrackTruthCollection \"" << Truthkey() << "\"" << std::endl;
777
778 if (m_truthMissing)
779 {
781 out << " WARNING: TrackTruth missing for part of this TrackCollection --> No secondaries information printed!" << std::endl;
782 else
783 out << " INFO: Intentionally no TrackTruth for this TrackCollection. (No secondaries information printed.)" << std::endl;
784 }
785 if (!m_truthMissing)
786 {
787 out << " \t\t\t\t ......................truth mached tracks statistics....................." << std::endl;
788 out << " \t\t\t\tn/event\teff.\ttotal\tPIX1\tPIX2\tPIX3\tSCT1\tSCT2\tSCT3\tSCT4\tSCT5to9\tStraws" << std::endl;
789
790
791 out << " total secondaries ";
792 printRegionSecondary(out, ETA_ALL, (float) (m_tracks.m_counter[kTracks_gen][TRACK_MATCHED_SECONDARY][ETA_ALL] +m_tracks.m_counter[kTracks_gen][TRACK_MULTMATCH_SECONDARY][ETA_ALL]) );
793 out << " secondaries in barrel ";
794 printRegionSecondary(out, ETA_BARREL, (float) (m_tracks.m_counter[kTracks_gen][TRACK_MATCHED_SECONDARY][ETA_BARREL] +m_tracks.m_counter[kTracks_gen][TRACK_MULTMATCH_SECONDARY][ETA_BARREL]) );
795 out << " secondaries in trans. ";
796 printRegionSecondary(out, ETA_TRANSITION, (float) (m_tracks.m_counter[kTracks_gen][TRACK_MATCHED_SECONDARY][ETA_TRANSITION]+m_tracks.m_counter[kTracks_gen][TRACK_MULTMATCH_SECONDARY][ETA_TRANSITION]) );
797 out << " secondaries in endcap ";
798 printRegionSecondary(out, ETA_ENDCAP, (float) (m_tracks.m_counter[kTracks_gen][TRACK_MATCHED_SECONDARY][ETA_ENDCAP] +m_tracks.m_counter[kTracks_gen][TRACK_MULTMATCH_SECONDARY][ETA_ENDCAP]) );
799 out << " secondaries in forwa. ";
800 printRegionSecondary(out, ETA_FORWARD, (float) (m_tracks.m_counter[kTracks_gen][TRACK_MATCHED_SECONDARY][ETA_FORWARD] +m_tracks.m_counter[kTracks_gen][TRACK_MULTMATCH_SECONDARY][ETA_FORWARD]) );
801 }
802 }
803 else out << ": NO EVENTS PROCESSED! " << std::endl;
804}
805
807 enum eta_region region,
808 float denominator) const {
809 out << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setw(7) << std::setprecision(2)
810 << "\t" << m_tracks.m_counter[kTracks_gen][TRACK_MATCHED_SECONDARY][region]/(float) m_events; // tracks / event
811 if (m_tracks.m_counter[kTracks_gen][TRACK_SECONDARY][region]) {
812 out << "\t" << m_tracks.m_counter[kTracks_gen][TRACK_MATCHED_SECONDARY][region]/ (float) m_tracks.m_counter[kTracks_gen][TRACK_SECONDARY][region]; // track efficiency
813 }
814 else {
815 out << "\t" << "n/a" ;
816 }
817
818 if (denominator > 0) {
819 out << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setw(4) << std::setprecision(1)
820 <<" " << float(m_hits.m_counter[kHits_sec][HIT_ALL ][region]/denominator) << std::setprecision(2)
821 << "\t" << float(m_hits.m_counter[kHits_sec][HIT_PIX1 ][region]/denominator)
822 << "\t" << float(m_hits.m_counter[kHits_sec][HIT_PIX2 ][region]/denominator)
823 << "\t" << float(m_hits.m_counter[kHits_sec][HIT_PIX3 ][region]/denominator)
824 << "\t" << float(m_hits.m_counter[kHits_sec][HIT_SCT1 ][region]/denominator)
825 << "\t" << float(m_hits.m_counter[kHits_sec][HIT_SCT2 ][region]/denominator)
826 << "\t" << float(m_hits.m_counter[kHits_sec][HIT_SCT3 ][region]/denominator)
827 << "\t" << float(m_hits.m_counter[kHits_sec][HIT_SCT4 ][region]/denominator)
828 << "\t" << float(m_hits.m_counter[kHits_sec][HIT_SCT5TO9][region]/denominator)
829 << "\t" << float(m_hits.m_counter[kHits_sec][HIT_TRT_ALL][region]/denominator)
830 << std::endl << std::setprecision(-1);
831 }
832 else {
833 out << " Unable to calculate: Denominator=0." << std::endl << std::setprecision(-1);
834 }
835}
836
837
838
840 bool passed = false;
841 if(para->pT() > m_cuts.minPt && std::abs(para->eta()) < m_cuts.maxEtaFORWARD)passed = true;
842
843
844 return passed;
845
846}
847
848int InDet::TrackStatHelper::ClassifyParticle( const HepMC::ConstGenParticlePtr& particle, const double prob) const {
849
850 int partClass=-999;
851
852 // ME: only classify matched tracks
853 if (prob <= m_cuts.matchTrackCut) return partClass;
854
855 //classify as primary, secondary or truncated
856 bool primary=false;
857 bool secondary=false;
858 bool truncated=false;
859
860 if (particle->production_vertex()){
861
862 // primary vertex inside innermost layer?
863 HepGeom::Point3D<double> startVertex(particle->production_vertex()->position().x(),
864 particle->production_vertex()->position().y(),
865 particle->production_vertex()->position().z());
866 if ( std::abs(startVertex.perp()) < m_cuts.maxRStartPrimary
867 && std::abs(startVertex.z()) < m_cuts.maxZStartPrimary) {
868 if (particle->end_vertex() == nullptr) {
869 primary=true;
870 }
871 else {
872 HepGeom::Point3D<double> endVertex(particle->end_vertex()->position().x(),
873 particle->end_vertex()->position().y(),
874 particle->end_vertex()->position().z());
875 if ( endVertex.perp() > m_cuts.minREndPrimary
876 || std::abs(startVertex.z()) > m_cuts.minZEndPrimary){
877 primary=true;
878 }
879 else {
880 truncated = true;
881 }
882 }
883 }
884
885 else if ( startVertex.perp() < m_cuts.maxRStartSecondary && std::abs(startVertex.z()) < m_cuts.maxZStartSecondary) {
886 if (particle->end_vertex() == nullptr) {
887 secondary=true;
888 }
889 else {
890 HepGeom::Point3D<double> endVertex(particle->end_vertex()->position().x(),
891 particle->end_vertex()->position().y(),
892 particle->end_vertex()->position().z());
893
894 if (endVertex.perp() > m_cuts.minREndSecondary
895 || std::abs(endVertex.z()) > m_cuts.minZEndSecondary) {
896 secondary=true;
897 }
898 }
899 }
900 }//end classification
901
902 if(secondary)partClass=TRACK_SECONDARY;
903 if(primary)partClass=TRACK_PRIMARY;
904 if(truncated)partClass=TRACK_TRUNCATED;
905
906 return partClass;
907}
This class provides an interface to generate or decode an identifier for the upper levels of the dete...
virtual void lock()=0
Interface to allow an object to lock itself when made const in SG.
bool passed(DecisionID id, const DecisionIDContainer &)
checks if required decision ID is in the set of IDs in the container
This is an Identifier helper class for the Pixel subdetector.
This is an Identifier helper class for the SCT subdetector.
DataVector< Trk::Track > TrackCollection
This typedef represents a collection of Trk::Track objects.
static const std::string track_types_string[InDet::N_TRACKTYPES]
This class provides an interface to generate or decode an identifier for the upper levels of the dete...
bool is_sct(Identifier id) const
bool is_pixel(Identifier id) const
bool is_trt(Identifier id) const
bool printTrackSummaryRegion(MsgStream &out, enum track_types, enum eta_region) const
Sets up detailed statistics part of table, calls printTrackSummaryRegion.
bool PassTrackCuts(const Trk::TrackParameters *para) const
defines 'good' reco tracks
void printRegionSecondary(MsgStream &out, enum eta_region, float denominator) const
Prints ntracks per event,efficiencies,fake rates, and general hit information for given eta region.
void printRegion1(MsgStream &out, enum eta_region) const
Prints ntracks per event,efficiencies,fake rates, and general hit information for given eta region.
std::atomic< bool > m_author_found[Trk::TrackInfo::NumberOfTrackFitters]
Number of tracking authors found.
Counter4D< kNTrackSummaryCounter, N_TRACKTYPES, N_ETAREGIONS, kNSummaryTypes, int > TrackSummaryCounter
type statistics.
TrackStatHelper(const std::string &, const std::string &, bool careAboutTruth=true)
Constructor.
void printSecondary(MsgStream &out) const
Prints all of the statistics information, calls printRegion, printTrackSummaryRegion,...
std::string m_TrackTruthCollectionKey
StoreGate Track Truth Collection Key.
std::string m_TrackCollectionKey
StoreGate Track Collection Key.
void printTrackSummaryAverage(MsgStream &out, enum track_types, enum eta_region, int summary_type) const
Prints information from TrackSummaryTool.
static std::string getSummaryTypeHeader()
static const char *const s_summaryTypeName[kNSummaryTypes]
table column labels for summary
std::multimap< HepMcParticleLink, float > recoToTruthMap
map containing reco track and matched truth track barcode
const std::string & Truthkey() const
Returns Truth TrackCollection Key.
Counter< kNTracksCounter, N_TRACKTYPES, N_ETAREGIONS, int > TracksCounter
void print(MsgStream &out) const
Prints all of the statistics information, calls printRegion, printTrackSummaryRegion,...
@ kTracks_rec
number of reconstructed tracks for a given type and eta region
@ kTracks_gen
number of generated tracks for a given type and eta region, looping over genevents to include possibl...
@ kTracks_gen_signal
number of generated tracks for a given type and eta region, just from first genevent
static const Trk::SummaryType s_summaryTypes[kNSummaryTypes]
summary types for which statistics are gathered
void reset()
Resets the track collection information, called in the constructor.
void setSummaryStat(track_types track_i, eta_region region_i, const Trk::TrackSummary *summary, TrackSummaryCounter &trackSummarySum) const
void addEvent(const EventContext &ctx, const TrackCollection *, std::vector< const Trk::Track * > &, const std::vector< std::pair< HepMC::ConstGenParticlePtr, int > > &, const TrackTruthCollection *, const AtlasDetectorID *const, const PixelID *, const SCT_ID *, const Trk::IExtendedTrackSummaryTool *, bool, const unsigned int *, const unsigned int *) const
Adds hit, track and matching information for each event.
@ kNTrackSummaryBAD
Number of tracks with track summary bad for given type,eta,summary type.
@ kNTrackSummaryOK
Number of tracks with track summary OK for given type,eta,summary type.
@ kTrackSummarySum
Track Summary Values for each track type, region and summary type.
const std::string & key() const
Returns TrackCollection Key.
@ kHits_sec
number of hits from secondary tracks for a given type and eta region
@ kHits_rec
number of reconstructed hits for a given type and eta region
@ kHits_pri
number of hits from primary tracks for a given type and eta region
int ClassifyParticle(const HepMC::ConstGenParticlePtr &particle, const double prob) const
classifies gen particle as primary, secondary or truncated
Counter< kNHitsCounter, N_HITTYPES, N_ETAREGIONS, int > HitsCounter
std::atomic< long > m_events
Number of events.
void printRegion2(MsgStream &out, enum eta_region, float denominator) const
std::atomic< bool > m_truthMissing
Flag for if track truth is missing.
void SetCuts(const struct cuts &)
Sets the cuts such as the eta regions (barrel, transition,endcap) and the hit fraction fake cuts and ...
This is an Identifier helper class for the Pixel subdetector.
Definition PixelID.h:69
int layer_disk(const Identifier &id) const
Definition PixelID.h:602
This is an Identifier helper class for the SCT subdetector.
Definition SCT_ID.h:68
int layer_disk(const Identifier &id) const
Definition SCT_ID.h:687
MC particle associated with a reco track + the quality of match.
Definition TrackTruth.h:14
float probability() const
Definition TrackTruth.h:28
const HepMcParticleLink & particleLink() const
Definition TrackTruth.h:26
Base class for all CompetingRIOsOnTack implementations, extends the common MeasurementBase.
Interface for condensing Trk::Track properties and associated hits to a (non-fittable) foot print,...
virtual std::unique_ptr< Trk::TrackSummary > summary(const EventContext &ctx, const Track &track) const =0
Start from a copy of the existing input track summary if there, otherwise start from a new one.
This class is the pure abstract base class for all fittable tracking measurements.
virtual bool type(MeasurementBaseType::Type type) const =0
Interface method checking the type.
double eta() const
Access method for pseudorapidity - from momentum.
double pT() const
Access method for transverse momentum.
Class to handle RIO On Tracks ROT) for InDet and Muons, it inherits from the common MeasurementBase.
Definition RIO_OnTrack.h:70
Identifier identify() const
return the identifier -extends MeasurementBase
Small utility to cast MeasurementBase (either in a vector or single) into RIO_OnTrack.
static void extract(std::vector< const RIO_OnTrack * > &rots, const std::vector< const MeasurementBase * > &measurements)
Contains information about the 'fitter' of this track.
TrackFitter
enums to identify who created this track and what propertis does it have.
represents the track state (measurement, material, fit parameters and quality) at a surface.
@ Measurement
This is a measurement, and will at least contain a Trk::MeasurementBase.
A summary of the information contained by a track.
HepMC3::ConstGenParticlePtr ConstGenParticlePtr
Definition GenParticle.h:20
Ensure that the ATLAS eigen extensions are properly loaded.
ParametersBase< TrackParametersDim, Charged > TrackParameters
SummaryType
enumerates the different types of information stored in Summary.
@ numberOfGangedPixels
number of Ganged Pixels flagged as fakes
@ numberOfPixelHits
number of pixel layers on track with absence of hits
@ numberOfTRTHighThresholdOutliers
number of dead TRT straws crossed
@ numberOfInnermostPixelLayerHits
these are the hits in the 1st pixel layer
@ numberOfTRTHighThresholdHits
total number of TRT hits which pass the high threshold
@ numberOfSCTHoles
number of Holes in both sides of a SCT module
@ numberOfPixelHoles
number of pixels which have a ganged ambiguity.
@ numberOfOutliersOnTrack
100 times the standard deviation of the chi2 from the surfaces
T_Int m_counter[N_Categories][N_Types][N_Regions]