ATLAS Offline Software
Loading...
Searching...
No Matches
InDet::TrackStatHelper Class Reference

#include <TrackStatHelper.h>

Classes

struct  Counter
struct  Counter4D

Public Member Functions

 TrackStatHelper (const std::string &, const std::string &, bool careAboutTruth=true)
 Constructor.
void SetCuts (const struct cuts &)
 Sets the cuts such as the eta regions (barrel, transition,endcap) and the hit fraction fake cuts and the track matching cut.
void addEvent (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.
void reset ()
 Resets the track collection information, called in the constructor.
void print (MsgStream &out) const
 Prints all of the statistics information, calls printRegion, printTrackSummaryRegion, etc for detailed statistics.
void printRegion1 (MsgStream &out, enum eta_region) const
 Prints ntracks per event,efficiencies,fake rates, and general hit information for given eta region.
void printRegion2 (MsgStream &out, enum eta_region, float denominator) const
void printSecondary (MsgStream &out) const
 Prints all of the statistics information, calls printRegion, printTrackSummaryRegion, etc for detailed statistics.
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.
bool printTrackSummaryRegion (MsgStream &out, enum track_types, enum eta_region) const
 Sets up detailed statistics part of table, calls printTrackSummaryRegion.
void printTrackSummaryAverage (MsgStream &out, enum track_types, enum eta_region, int summary_type) const
 Prints information from TrackSummaryTool.
bool PassTrackCuts (const Trk::TrackParameters *para) const
 defines 'good' reco tracks
int ClassifyParticle (const HepMC::ConstGenParticlePtr &particle, const double prob) const
 classifies gen particle as primary, secondary or truncated
const std::string & key () const
 Returns TrackCollection Key.
const std::string & Truthkey () const
 Returns Truth TrackCollection Key.

Static Public Member Functions

static std::string getSummaryTypeHeader ()

Private Types

enum  ETrackCounter { kTracks_rec , kTracks_gen , kTracks_gen_signal , kNTracksCounter }
enum  EHitsCounter { kHits_rec , kHits_pri , kHits_sec , kNHitsCounter }
enum  ETrackSummaryCounter { kTrackSummarySum , kNTrackSummaryOK , kNTrackSummaryBAD , kNTrackSummaryCounter }
enum  ETrackSummaryTypes {
  kNumberOfInnermostPixelLayerHits , kNumberOfPixelHits , kNumberOfPixelHoles , kNumberOfGangedPixels ,
  kNumberOfSCTHits , kNumberOfSCTHoles , kNumberOfSCTDoubleHoles , kNumberOfTRTHits ,
  kNumberOfTRTOutliers , kNumberOfTRTHighThresholdHits , kNumberOfTRTHighThresholdOutliers , kNumberOfOutliersOnTrack ,
  kNSummaryTypes
}
using TracksCounter = Counter<kNTracksCounter,N_TRACKTYPES,N_ETAREGIONS, int>
using TracksCounterAtomic = Counter<kNTracksCounter,N_TRACKTYPES,N_ETAREGIONS, std::atomic<long> >
using HitsCounter = Counter<kNHitsCounter,N_HITTYPES, N_ETAREGIONS, int>
using HitsCounterAtomic = Counter<kNHitsCounter,N_HITTYPES, N_ETAREGIONS, std::atomic<long> >
using TrackSummaryCounter
 type statistics.
using TrackSummaryCounterAtomic
typedef std::multimap< HepMcParticleLink, float > recoToTruthMap
 map containing reco track and matched truth track barcode

Private Member Functions

void setSummaryStat (track_types track_i, eta_region region_i, const Trk::TrackSummary *summary, TrackSummaryCounter &trackSummarySum) const

Private Attributes

std::string m_TrackCollectionKey
 StoreGate Track Collection Key.
std::string m_TrackTruthCollectionKey
 StoreGate Track Truth Collection Key.
std::atomic< bool > m_author_found [Trk::TrackInfo::NumberOfTrackFitters] {}
 Number of tracking authors found.
std::atomic< long > m_events {}
 Number of events.
TracksCounterAtomic m_tracks ATLAS_THREAD_SAFE
HitsCounterAtomic m_hits ATLAS_THREAD_SAFE
TrackSummaryCounterAtomic m_trackSummarySum ATLAS_THREAD_SAFE
std::atomic< bool > m_truthMissing
 Flag for if track truth is missing.
bool m_careAboutTruth
struct cuts m_cuts
std::mutex m_authorMutex
std::bitset< Trk::TrackInfo::NumberOfTrackRecoInfo > m_recoInfo ATLAS_THREAD_SAFE
std::bitset< Trk::TrackInfo::NumberOfTrackProperties > m_patternProperties ATLAS_THREAD_SAFE

Static Private Attributes

static const Trk::SummaryType s_summaryTypes [kNSummaryTypes]
 summary types for which statistics are gathered
static const char *const s_summaryTypeName [kNSummaryTypes]
 table column labels for summary

Detailed Description

Definition at line 126 of file TrackStatHelper.h.

Member Typedef Documentation

◆ HitsCounter

using InDet::TrackStatHelper::HitsCounter = Counter<kNHitsCounter,N_HITTYPES, N_ETAREGIONS, int>
private

Definition at line 260 of file TrackStatHelper.h.

◆ HitsCounterAtomic

using InDet::TrackStatHelper::HitsCounterAtomic = Counter<kNHitsCounter,N_HITTYPES, N_ETAREGIONS, std::atomic<long> >
private

Definition at line 261 of file TrackStatHelper.h.

◆ recoToTruthMap

typedef std::multimap<HepMcParticleLink,float> InDet::TrackStatHelper::recoToTruthMap
private

map containing reco track and matched truth track barcode

Definition at line 335 of file TrackStatHelper.h.

◆ TracksCounter

using InDet::TrackStatHelper::TracksCounter = Counter<kNTracksCounter,N_TRACKTYPES,N_ETAREGIONS, int>
private

Definition at line 250 of file TrackStatHelper.h.

◆ TracksCounterAtomic

using InDet::TrackStatHelper::TracksCounterAtomic = Counter<kNTracksCounter,N_TRACKTYPES,N_ETAREGIONS, std::atomic<long> >
private

Definition at line 251 of file TrackStatHelper.h.

◆ TrackSummaryCounter

Initial value:

type statistics.

Definition at line 294 of file TrackStatHelper.h.

◆ TrackSummaryCounterAtomic

Initial value:
N_TRACKTYPES,
N_ETAREGIONS,
std::atomic<long> >

Definition at line 299 of file TrackStatHelper.h.

Member Enumeration Documentation

◆ EHitsCounter

Enumerator
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

kHits_sec 

number of hits from secondary tracks for a given type and eta region

kNHitsCounter 

Definition at line 254 of file TrackStatHelper.h.

254 {
255 kHits_rec,
256 kHits_pri,
257 kHits_sec,
259 };
@ 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

◆ ETrackCounter

Enumerator
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 possible pileup

kTracks_gen_signal 

number of generated tracks for a given type and eta region, just from first genevent

kNTracksCounter 

Definition at line 245 of file TrackStatHelper.h.

245 {kTracks_rec,
@ 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

◆ ETrackSummaryCounter

Enumerator
kTrackSummarySum 

Track Summary Values for each track type, region and summary type.

kNTrackSummaryOK 

Number of tracks with track summary OK for given type,eta,summary type.

kNTrackSummaryBAD 

Number of tracks with track summary bad for given type,eta,summary type.

kNTrackSummaryCounter 

Definition at line 263 of file TrackStatHelper.h.

263 {
268 };
@ 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.

◆ ETrackSummaryTypes

Enumerator
kNumberOfInnermostPixelLayerHits 
kNumberOfPixelHits 
kNumberOfPixelHoles 
kNumberOfGangedPixels 
kNumberOfSCTHits 
kNumberOfSCTHoles 
kNumberOfSCTDoubleHoles 
kNumberOfTRTHits 
kNumberOfTRTOutliers 
kNumberOfTRTHighThresholdHits 
kNumberOfTRTHighThresholdOutliers 
kNumberOfOutliersOnTrack 
kNSummaryTypes 

Definition at line 274 of file TrackStatHelper.h.

274 {
288 };

Constructor & Destructor Documentation

◆ TrackStatHelper()

InDet::TrackStatHelper::TrackStatHelper ( const std::string & TrackCollectionKey,
const std::string & TrackTruthCollectionKey,
bool careAboutTruth = true )

Constructor.

Takes strings of TrackCollectionKey and Track TruthCollectionKey. Assume that truth collections will be used, but let user specify if they intentionally will not be.

Definition at line 103 of file TrackStatHelper.cxx.

103 :
104 m_TrackCollectionKey (std::move(TrackCollectionKey)),
105 m_TrackTruthCollectionKey (std::move(TrackTruthCollectionKey)),
106 m_truthMissing (false),
107 m_careAboutTruth (careAboutTruth)
108{
109 this->reset();
110}
std::string m_TrackTruthCollectionKey
StoreGate Track Truth Collection Key.
std::string m_TrackCollectionKey
StoreGate Track Collection Key.
void reset()
Resets the track collection information, called in the constructor.
std::atomic< bool > m_truthMissing
Flag for if track truth is missing.

Member Function Documentation

◆ addEvent()

void InDet::TrackStatHelper::addEvent ( const TrackCollection * recTracks,
std::vector< const Trk::Track * > & rec,
const std::vector< std::pair< HepMC::ConstGenParticlePtr, int > > & gen,
const TrackTruthCollection * truthMap,
const AtlasDetectorID * const idHelper,
const PixelID * pixelID,
const SCT_ID * sctID,
const Trk::IExtendedTrackSummaryTool * trkSummaryTool,
bool useTrackSummary,
const unsigned int * inTimeStart,
const unsigned int * inTimeEnd ) const

Adds hit, track and matching information for each event.

Called at each event

Definition at line 119 of file TrackStatHelper.cxx.

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;
146 TrackSummaryCounter trackSummarySum;
147 bool author_found [Trk::TrackInfo::NumberOfTrackFitters];
148 std::bitset<Trk::TrackInfo::NumberOfTrackRecoInfo> reco_info;
149 std::bitset<Trk::TrackInfo::NumberOfTrackProperties> pattern_properties;
150 for (unsigned int i=0; i < Trk::TrackInfo::NumberOfTrackFitters; ++i) { author_found[i]=false; }
151
152 // ------------ reconstructed tracks -----------------
153 for (const Trk::Track* track : rec) {
154
155 const Trk::TrackParameters* para = track->trackParameters()->front();
156 recoClassification = -999;
157 int thisEventIndex = -999;
158
159 Author = track->info().trackFitter();
160 if (Author > 0 && Author < Trk::TrackInfo::NumberOfTrackFitters){
161 author_found[Author] = true;
162 reco_info |= track->info().patternRecognition();
163 pattern_properties |= track->info().properties();
164 }
165 else {
166 //FIX author_problem++;
167 }
168 if (!para) {
169 Region = ETA_UNKNOWN;
170 }
171 else {
172 Eta = std::abs(para->eta());
173 if (Eta < m_cuts.maxEtaBarrel) Region = ETA_BARREL;
174 else if (Eta < m_cuts.maxEtaTransition) Region = ETA_TRANSITION;
175 else if (Eta < m_cuts.maxEtaEndcap) Region = ETA_ENDCAP;
176 else if ((Eta > m_cuts.minEtaFORWARD) && (Eta < m_cuts.maxEtaFORWARD)) Region = ETA_FORWARD;
177 else Region = ETA_OUTSIDE;
178 }
179
180 if ( !(Region==ETA_BARREL || Region==ETA_TRANSITION || Region==ETA_ENDCAP || Region==ETA_FORWARD) )
181 {
182 continue; // Only want to tally tracks that are within the detector volume.
183 }
184
185 TrackTruthCollection::const_iterator found;
186 TrackTruth trtruth;
187 double trprob = 0;
188
189 if (!truthMap) {
190 // no truthmap
191 truth_missing=true;
192 }
193 else {
194 ElementLink<TrackCollection> tracklink;
195 tracklink.setElement(track);
196 tracklink.setStorableObject(*recTracks);
197 const ElementLink<TrackCollection> tracklink2=tracklink;
198
199 found = truthMap->find(tracklink2);
200 if(!(found == truthMap->end())){
201 trtruth=found->second;
202 HepMcParticleLink hmpl = trtruth.particleLink();
203 thisEventIndex = hmpl.eventIndex();
204 rttMap.insert(std::pair<HepMcParticleLink,float>(hmpl,trtruth.probability()));
205 // ME: remember prob
206 trprob = trtruth.probability();
207 }
208
209 }
210
211
212 if(!PassTrackCuts(para)) continue;
213
214 tracks.m_counter[kTracks_rec][TRACK_ALL][Region]++;
215 tracks.m_counter[kTracks_rec][TRACK_ALL][ETA_ALL]++;
216 // signal only tracks for the denominator in signal efficiencies
217 if (thisEventIndex==0)
218 {
219 tracks.m_counter[kTracks_rec][TRACK_ALL_SIGNAL][Region]++;
220 tracks.m_counter[kTracks_rec][TRACK_ALL_SIGNAL][ETA_ALL]++;
221 }
222
223 // process track summary
224
225 std::unique_ptr<Trk::TrackSummary> cleanup;
226 const Trk::TrackSummary* summary = track->trackSummary();
227
228 if (useTrackSummary) {
229 if (!track->trackSummary()) {
230 cleanup = trkSummaryTool->summary(*track);
231 summary=cleanup.get();
232 }
233
234 setSummaryStat(TRACK_ALL, Region, summary, trackSummarySum);
235 }
236
237 // check if current reco track has more than a specified fraction of hits
238 // from a generated track. [If not, it will be counted as a fake
239 // track in the statistics report.]
240
241 if (!truthMap) {
242 truth_missing=true;
243 }
244 else {// no truthmap
245
246 if (found == truthMap->end()) {
247 // m_truthMissing=true;
248 // no truth might happen with new truth !
249 tracks.m_counter[kTracks_rec][TRACK_NOHEPMCPARTICLELINK][Region]++;
250 tracks.m_counter[kTracks_rec][TRACK_NOHEPMCPARTICLELINK][ETA_ALL]++;
251 setSummaryStat(TRACK_NOHEPMCPARTICLELINK, Region, summary, trackSummarySum);
252 }
253 else{ // no link
254
255 // ME : change logic, secondaries from G4 processes are truncated
256 const HepMcParticleLink& HMPL=trtruth.particleLink();
257 if (! HMPL.isValid()) {
258 tracks.m_counter[kTracks_rec][TRACK_NOHEPMCPARTICLELINK][Region]++;
259 tracks.m_counter[kTracks_rec][TRACK_NOHEPMCPARTICLELINK][ETA_ALL]++;
260 setSummaryStat(TRACK_NOHEPMCPARTICLELINK, Region, summary, trackSummarySum);
261 }
262 else {
263 //classify track as coming from primary, secondary or truncated gen particle
264#ifdef HEPMC3
266#else
267 const HepMC::GenParticle *particle = HMPL.cptr();
268#endif
269 recoClassification = ClassifyParticle(particle, trprob);
270
271 if (trprob < m_cuts.fakeTrackCut)
272 {
273 tracks.m_counter[kTracks_rec][TRACK_LOWTRUTHPROB][Region]++;
274 tracks.m_counter[kTracks_rec][TRACK_LOWTRUTHPROB][ETA_ALL]++;
275 if (thisEventIndex==0)
276 {
277 tracks.m_counter[kTracks_rec][TRACK_LOWTRUTHPROB_SIGNAL][Region]++;
278 tracks.m_counter[kTracks_rec][TRACK_LOWTRUTHPROB_SIGNAL][ETA_ALL]++;
279 }
280 setSummaryStat(TRACK_LOWTRUTHPROB, Region, summary, trackSummarySum);
281 }
282 if (trprob < m_cuts.fakeTrackCut2) {
283 tracks.m_counter[kTracks_rec][TRACK_LOWTRUTHPROB2][Region]++;
284 tracks.m_counter[kTracks_rec][TRACK_LOWTRUTHPROB2][ETA_ALL]++;
285 if (thisEventIndex==0)
286 {
287 tracks.m_counter[kTracks_rec][TRACK_LOWTRUTHPROB2_SIGNAL][Region]++;
288 tracks.m_counter[kTracks_rec][TRACK_LOWTRUTHPROB2_SIGNAL][ETA_ALL]++;
289 }
290 setSummaryStat(TRACK_LOWTRUTHPROB2, Region, summary, trackSummarySum);
291 }
292 } // end else on !isVadid
293 }
294 }
295
296 // ------------------ hits on reconstructed tracks ---------------
297
298 EHitsCounter part_type = ( recoClassification==TRACK_PRIMARY
299 ? kHits_pri
300 : ( recoClassification==TRACK_SECONDARY
301 ? kHits_sec
302 : kNHitsCounter));
303 for (const Trk::TrackStateOnSurface* hit : *track->trackStateOnSurfaces()) {
304 if(hit){
305 const Trk::MeasurementBase* mesh =hit->measurementOnTrack();
306 if (mesh) {
307 const Trk::RIO_OnTrack* rio{} ;
309 assert(dynamic_cast<const Trk::RIO_OnTrack*>(mesh)!=nullptr);
310 rio = static_cast<const Trk::RIO_OnTrack*>(mesh);
311 } else {
312 // try CompetingROT:
314 assert(dynamic_cast<const Trk::CompetingRIOsOnTrack*>(mesh) !=nullptr);
315 auto comprot = static_cast<const Trk::CompetingRIOsOnTrack*>(mesh);
316 rio = &comprot->rioOnTrack(comprot->indexOfMaxAssignProb());
317 }
318 }
319
320
321 if (rio) {
322 // skip outliers
324 continue;
325
326 hits.m_counter[kHits_rec][HIT_ALL][Region]++;
327 hits.m_counter[kHits_rec][HIT_ALL][ETA_ALL]++;
328 if(part_type<kNHitsCounter){
329 hits.m_counter[part_type][HIT_ALL][Region]++;
330 hits.m_counter[part_type][HIT_ALL][ETA_ALL]++;
331 }
332
333 Identifier id = rio->identify();
334 int HitDet = HIT_UNKNOWN;
335 int HitLayer = N_HITTYPES;
336 bool part_type_for_all=true;
337 if (idHelper->is_trt(id)){
338 HitDet=HIT_TRT_ALL;
339 }
340 else if (idHelper->is_sct(id)){
341 HitDet=HIT_SCT_ALL;
342 if (sctID) {
343 switch (sctID->layer_disk(id)) {
344 case 0: HitLayer = HIT_SCT1; break;
345 case 1: HitLayer = HIT_SCT2; break;
346 case 2: HitLayer = HIT_SCT3; break;
347 case 3: HitLayer = HIT_SCT4; break;
348 case 4: case 5: case 6: case 7: case 8: HitLayer = HIT_SCT5TO9; break;
349 default: HitLayer = HIT_UNKNOWN; break;
350 }
351 }
352 }
353 else if (idHelper->is_pixel(id)){
354 part_type_for_all=false;
355 HitDet = HIT_PIXEL_ALL;
356 if (pixelID) {
357 switch (pixelID->layer_disk(id)) {
358 case 0: HitLayer = HIT_PIX1; break;
359 case 1: HitLayer = HIT_PIX2; break;
360 case 2: HitLayer = HIT_PIX3; break;
361 default: HitLayer = HIT_UNKNOWN;
362 }
363 }
364 }
365
366 hits.m_counter[kHits_rec][HitDet][Region]++;
367 hits.m_counter[kHits_rec][HitDet][ETA_ALL]++;
368 if(part_type_for_all && part_type<kNHitsCounter){
369 hits.m_counter[part_type][HitDet][Region]++;
370 hits.m_counter[part_type][HitDet][ETA_ALL]++;
371 }
372
373 if (HitLayer<N_HITTYPES) {
374 hits.m_counter[kHits_rec][HitLayer][Region]++;
375 hits.m_counter[kHits_rec][HitLayer][ETA_ALL]++;
376 if(part_type<kNHitsCounter){
377 hits.m_counter[part_type][HitLayer][Region]++;
378 hits.m_counter[part_type][HitLayer][ETA_ALL]++;
379 }
380 }
381 }
382 }
383 }
384 }
385 }
386
387 // ------------------------- generated tracks, including pileup -----------------------------
388
389 Eta = 0;
390 Region = ETA_ALL;
391 int classification=-999;
392 for (auto truth = gen.begin(); truth != gen.end(); ++truth) {
393 classification=-999;
394 bool inTimePileup = truth->second == 0 || (truth->second >= (int)*inTimeStart && truth->second <= (int)*inTimeEnd);
395
396 auto particle = truth->first;
397
398 //determine eta region
399 Eta = std::abs(particle->momentum().pseudoRapidity());
400 if (Eta < m_cuts.maxEtaBarrel) Region = ETA_BARREL;
401 else if (Eta < m_cuts.maxEtaTransition) Region = ETA_TRANSITION;
402 else if (Eta < m_cuts.maxEtaEndcap) Region = ETA_ENDCAP;
403 else if ((Eta > m_cuts.minEtaFORWARD) && (Eta < m_cuts.maxEtaFORWARD)) Region = ETA_FORWARD;
404 else Region = ETA_OUTSIDE;
405 if ( !(Region==ETA_BARREL || Region==ETA_TRANSITION || Region==ETA_ENDCAP || Region==ETA_FORWARD) )
406 {
407 continue; // Only want to tally tracks that are within the detector volume.
408 }
409 tracks.m_counter[kTracks_gen][TRACK_ALL][Region]++;
410 tracks.m_counter[kTracks_gen][TRACK_ALL][ETA_ALL] ++;
411 if (inTimePileup) tracks.m_counter[kTracks_gen][TRACK_ALL_SIGNAL][ETA_ALL]++; // "SIGNAL" is misnomer here
412 if (inTimePileup) tracks.m_counter[kTracks_gen][TRACK_ALL_SIGNAL][Region]++;
413
414 //classify gen as primary, secondary or truncated
415 classification = ClassifyParticle(particle,1.);
416
417 if(classification==TRACK_PRIMARY){
418 tracks.m_counter[kTracks_gen][TRACK_PRIMARY][ETA_ALL] ++;
419 tracks.m_counter[kTracks_gen][TRACK_PRIMARY][Region]++;
420 }
421 if(classification==TRACK_SECONDARY){
422 tracks.m_counter[kTracks_gen][TRACK_SECONDARY][ETA_ALL] ++;
423 tracks.m_counter[kTracks_gen][TRACK_SECONDARY][Region]++;
424 }
425
426 //see if gen track has at least 1 matching reco track with high enough probability
427 bool matched = false;
428 int nmatched = 0;
429
430 HepMcParticleLink hmpl2(particle,particle->parent_event()->event_number(),HepMcParticleLink::IS_EVENTNUM);
431 recoToTruthMap::iterator rttIter=rttMap.find(hmpl2);
432 if(rttIter != rttMap.end()){
433 for(imap = rttMap.lower_bound(hmpl2); imap !=rttMap.upper_bound(hmpl2); ++imap){
434 if(imap->second > m_cuts.matchTrackCut){
435 matched = true;
436 nmatched++;
437 }
438 }
439 }
440 if (matched) {
441 tracks.m_counter[kTracks_gen][TRACK_MATCHED][Region]++;
442 tracks.m_counter[kTracks_gen][TRACK_MATCHED][ETA_ALL]++;
443 if (inTimePileup)
444 {
445 tracks.m_counter[kTracks_gen][TRACK_MATCHED_SIGNAL][Region]++;
446 tracks.m_counter[kTracks_gen][TRACK_MATCHED_SIGNAL][ETA_ALL]++;
447 }
448 if(nmatched > 1){
449 tracks.m_counter[kTracks_gen][TRACK_MULTMATCH][Region] += nmatched-1;
450 tracks.m_counter[kTracks_gen][TRACK_MULTMATCH][ETA_ALL]+= nmatched-1;
451 }
452 if(classification==TRACK_PRIMARY){
453 tracks.m_counter[kTracks_gen][TRACK_MATCHED_PRIMARY][Region]++;
454 tracks.m_counter[kTracks_gen][TRACK_MATCHED_PRIMARY][ETA_ALL]++;
455 if(nmatched > 1){
456 tracks.m_counter[kTracks_gen][TRACK_MULTMATCH_PRIMARY][Region] += nmatched-1;
457 tracks.m_counter[kTracks_gen][TRACK_MULTMATCH_PRIMARY][ETA_ALL] += nmatched-1;
458 }
459 }
460 if(classification==TRACK_SECONDARY){
461 tracks.m_counter[kTracks_gen][TRACK_MATCHED_SECONDARY][Region]++;
462 tracks.m_counter[kTracks_gen][TRACK_MATCHED_SECONDARY][ETA_ALL]++;
463 if(nmatched > 1){
464 tracks.m_counter[kTracks_gen][TRACK_MULTMATCH_SECONDARY][Region] += nmatched-1;
465 tracks.m_counter[kTracks_gen][TRACK_MULTMATCH_SECONDARY][ETA_ALL] += nmatched-1;
466 }
467 }
468 }
469 }
470
471 // ------------------------- generated tracks, just signal event -----------------------------
472 // For efficiencies.
473
474 Eta = 0;
475 Region = ETA_ALL;
476 classification=-999;
477
478 for (auto truth = gen.begin(); truth != gen.end(); ++truth)
479 {
480 if (truth->second != 0) // only signal event GenParticles
481 continue;
482
483 classification=-999;
484
485 auto particle = truth->first;
486
487 //determine eta region
488 Eta = std::abs(particle->momentum().pseudoRapidity());
489 if (Eta < m_cuts.maxEtaBarrel) Region = ETA_BARREL;
490 else if (Eta < m_cuts.maxEtaTransition) Region = ETA_TRANSITION;
491 else if (Eta < m_cuts.maxEtaEndcap) Region = ETA_ENDCAP;
492 else if ((Eta > m_cuts.minEtaFORWARD) && (Eta < m_cuts.maxEtaFORWARD)) Region = ETA_FORWARD;
493 else Region = ETA_OUTSIDE;
494 if ( !(Region==ETA_BARREL || Region==ETA_TRANSITION || Region==ETA_ENDCAP || Region==ETA_FORWARD) )
495 {
496 continue; // Only want to tally tracks that are within the detector volume.
497 }
498 tracks.m_counter[kTracks_gen_signal][TRACK_ALL][ETA_ALL] ++;
499 tracks.m_counter[kTracks_gen_signal][TRACK_ALL][Region]++;
500
501 //classify gen partilce as primary, secondary or truncated
502 classification = ClassifyParticle(particle,1.);
503
504 if(classification==TRACK_PRIMARY){
505 tracks.m_counter[kTracks_gen_signal][TRACK_PRIMARY][ETA_ALL] ++;
506 tracks.m_counter[kTracks_gen_signal][TRACK_PRIMARY][Region]++;
507 }
508 if(classification==TRACK_SECONDARY){
509 tracks.m_counter[kTracks_gen_signal][TRACK_SECONDARY][ETA_ALL] ++;
510 tracks.m_counter[kTracks_gen_signal][TRACK_SECONDARY][Region]++;
511 }
512
513 //see if gen track has at least 1 matching reco track with high enough probability
514 bool matched = false;
515 int nmatched = 0;
516
517 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)
518 recoToTruthMap::iterator rttIter=rttMap.find(hmpl2);
519 if(rttIter != rttMap.end()){
520 for(imap = rttMap.lower_bound(hmpl2); imap !=rttMap.upper_bound(hmpl2); ++imap){
521 if(imap->second > m_cuts.matchTrackCut){
522 matched = true;
523 nmatched++;
524 }
525 }
526 }
527 if (matched) {
528 tracks.m_counter[kTracks_gen_signal][TRACK_MATCHED][Region]++;
529 tracks.m_counter[kTracks_gen_signal][TRACK_MATCHED][ETA_ALL]++;
530 if(nmatched > 1){
531 tracks.m_counter[kTracks_gen_signal][TRACK_MULTMATCH][Region] += nmatched-1;
532 tracks.m_counter[kTracks_gen_signal][TRACK_MULTMATCH][ETA_ALL]+= nmatched-1;
533 }
534 if(classification==TRACK_PRIMARY){
535 tracks.m_counter[kTracks_gen_signal][TRACK_MATCHED_PRIMARY][Region]++;
536 tracks.m_counter[kTracks_gen_signal][TRACK_MATCHED_PRIMARY][ETA_ALL]++;
537 if(nmatched > 1){
538 tracks.m_counter[kTracks_gen_signal][TRACK_MULTMATCH_PRIMARY][Region] += nmatched-1;
539 tracks.m_counter[kTracks_gen_signal][TRACK_MULTMATCH_PRIMARY][ETA_ALL] += nmatched-1;
540 }
541 }
542 if(classification==TRACK_SECONDARY){
543 tracks.m_counter[kTracks_gen_signal][TRACK_MATCHED_SECONDARY][Region]++;
544 tracks.m_counter[kTracks_gen_signal][TRACK_MATCHED_SECONDARY][ETA_ALL]++;
545 if(nmatched > 1){
546 tracks.m_counter[kTracks_gen_signal][TRACK_MULTMATCH_SECONDARY][Region] += nmatched-1;
547 tracks.m_counter[kTracks_gen_signal][TRACK_MULTMATCH_SECONDARY][ETA_ALL] += nmatched-1;
548 }
549 }
550 }
551 }
552
553 if (truth_missing) {
554 m_truthMissing = truth_missing;
555 }
556 m_tracks += tracks;
557 m_hits += hits;
558 m_trackSummarySum += trackSummarySum;
559 for (unsigned int i=0; i < Trk::TrackInfo::NumberOfTrackFitters; ++i) {
560 if (author_found[i]) {
561 m_author_found[i] = author_found[i];
562 }
563 }
564 {
565 std::lock_guard<std::mutex> lock(m_authorMutex);
566 m_recoInfo |= reco_info;
567 m_patternProperties |= pattern_properties;
568 }
569}
@ Eta
Definition RPCdef.h:8
bool is_sct(Identifier id) const
bool is_pixel(Identifier id) const
bool is_trt(Identifier id) const
Counter4D< kNTrackSummaryCounter, N_TRACKTYPES, N_ETAREGIONS, kNSummaryTypes, int > TrackSummaryCounter
type statistics.
bool PassTrackCuts(const Trk::TrackParameters *para) const
defines 'good' reco tracks
std::atomic< bool > m_author_found[Trk::TrackInfo::NumberOfTrackFitters]
Number of tracking authors found.
std::multimap< HepMcParticleLink, float > recoToTruthMap
map containing reco track and matched truth track barcode
Counter< kNTracksCounter, N_TRACKTYPES, N_ETAREGIONS, int > TracksCounter
void setSummaryStat(track_types track_i, eta_region region_i, const Trk::TrackSummary *summary, TrackSummaryCounter &trackSummarySum) const
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.
int layer_disk(const Identifier &id) const
Definition PixelID.h:607
int layer_disk(const Identifier &id) const
Definition SCT_ID.h:687
float probability() const
Definition TrackTruth.h:28
const HepMcParticleLink & particleLink() const
Definition TrackTruth.h:26
virtual std::unique_ptr< Trk::TrackSummary > summary(const EventContext &ctx, const Track &track) const =0
virtual bool type(MeasurementBaseType::Type type) const =0
Interface method checking the type.
double eta() const
Access method for pseudorapidity - from momentum.
Identifier identify() const
return the identifier -extends MeasurementBase
@ Measurement
This is a measurement, and will at least contain a Trk::MeasurementBase.
const GenParticle * ConstGenParticlePtr
Definition GenParticle.h:38
constexpr ParticleHypothesis particle[PARTICLEHYPOTHESES]
the array of masses
ParametersBase< TrackParametersDim, Charged > TrackParameters

◆ ClassifyParticle()

int InDet::TrackStatHelper::ClassifyParticle ( const HepMC::ConstGenParticlePtr & particle,
const double prob ) const

classifies gen particle as primary, secondary or truncated

Definition at line 850 of file TrackStatHelper.cxx.

850 {
851
852 int partClass=-999;
853
854 // ME: only classify matched tracks
855 if (prob <= m_cuts.matchTrackCut) return partClass;
856
857 //classify as primary, secondary or truncated
858 bool primary=false;
859 bool secondary=false;
860 bool truncated=false;
861
862 if (particle->production_vertex()){
863
864 // primary vertex inside innermost layer?
865 HepGeom::Point3D<double> startVertex(particle->production_vertex()->position().x(),
866 particle->production_vertex()->position().y(),
867 particle->production_vertex()->position().z());
868 if ( std::abs(startVertex.perp()) < m_cuts.maxRStartPrimary
869 && std::abs(startVertex.z()) < m_cuts.maxZStartPrimary) {
870 if (particle->end_vertex() == nullptr) {
871 primary=true;
872 }
873 else {
874 HepGeom::Point3D<double> endVertex(particle->end_vertex()->position().x(),
875 particle->end_vertex()->position().y(),
876 particle->end_vertex()->position().z());
877 if ( endVertex.perp() > m_cuts.minREndPrimary
878 || std::abs(startVertex.z()) > m_cuts.minZEndPrimary){
879 primary=true;
880 }
881 else {
882 truncated = true;
883 }
884 }
885 }
886
887 else if ( startVertex.perp() < m_cuts.maxRStartSecondary && std::abs(startVertex.z()) < m_cuts.maxZStartSecondary) {
888 if (particle->end_vertex() == nullptr) {
889 secondary=true;
890 }
891 else {
892 HepGeom::Point3D<double> endVertex(particle->end_vertex()->position().x(),
893 particle->end_vertex()->position().y(),
894 particle->end_vertex()->position().z());
895
896 if (endVertex.perp() > m_cuts.minREndSecondary
897 || std::abs(endVertex.z()) > m_cuts.minZEndSecondary) {
898 secondary=true;
899 }
900 }
901 }
902 }//end classification
903
904 if(secondary)partClass=TRACK_SECONDARY;
905 if(primary)partClass=TRACK_PRIMARY;
906 if(truncated)partClass=TRACK_TRUNCATED;
907
908 return partClass;
909}

◆ getSummaryTypeHeader()

std::string InDet::TrackStatHelper::getSummaryTypeHeader ( )
static

Definition at line 81 of file TrackStatHelper.cxx.

81 {
82 std::stringstream out;
83 for (unsigned int stype_i=0; stype_i < kNSummaryTypes; ++stype_i ) {
84 out << std::setw(std::max(6,static_cast<int>(strlen(s_summaryTypeName[stype_i])+1))) << s_summaryTypeName[stype_i];
85 }
86 return out.str();
87}
static const char *const s_summaryTypeName[kNSummaryTypes]
table column labels for summary

◆ key()

const std::string & InDet::TrackStatHelper::key ( ) const
inline

Returns TrackCollection Key.

Definition at line 177 of file TrackStatHelper.h.

177{ return m_TrackCollectionKey; }

◆ PassTrackCuts()

bool InDet::TrackStatHelper::PassTrackCuts ( const Trk::TrackParameters * para) const

defines 'good' reco tracks

Definition at line 841 of file TrackStatHelper.cxx.

841 {
842 bool passed = false;
843 if(para->pT() > m_cuts.minPt && std::abs(para->eta()) < m_cuts.maxEtaFORWARD)passed = true;
844
845
846 return passed;
847
848}
bool passed(DecisionID id, const DecisionIDContainer &)
checks if required decision ID is in the set of IDs in the container
double pT() const
Access method for transverse momentum.

◆ print()

void InDet::TrackStatHelper::print ( MsgStream & out) const

Prints all of the statistics information, calls printRegion, printTrackSummaryRegion, etc for detailed statistics.

Definition at line 584 of file TrackStatHelper.cxx.

584 {
585
586 out << " Printing Statistics for " << key();
587
588 out << "TrackCollection \"" << key() << "\" " << "\n" ;
589
590 if (m_events > 0) {
591 out << "(TrackAuthors:";
592 std::vector<std::string> author_string;
593 author_string.reserve(Trk::TrackInfo::NumberOfTrackFitters);
594 for (int i=0; i<Trk::TrackInfo::NumberOfTrackFitters; ++i) {
595 author_string.push_back( Trk::TrackInfo(static_cast<Trk::TrackInfo::TrackFitter>(i),
597 m_patternProperties,
598 m_recoInfo).dumpInfo() );
599 }
600 for (int i=0; i<Trk::TrackInfo::NumberOfTrackFitters; i++){
601 if (m_author_found[i]){
602 out << " " << author_string[i];
603 }
604 }
605 out << " )" << std::endl
606 << "TrackTruthCollection \"" << Truthkey() << "\"" << std::endl;
607
608 if (m_truthMissing)
609 {
611 out << " WARNING: TrackTruth missing for part of this TrackCollection, no efficiencies or fakerates included.!" << std::endl;
612 else
613 out << " INFO: Intentionally no TrackTruth for this TrackCollection, no efficiencies or fakerates included." << std::endl;
614 }
615 if (!m_truthMissing)
616 {
617 out << " \t\t\t ................................tracks................................" << std::endl;
618 out << " \t\t\tn/event\tSEff.pr\tSEff.sd\tSLowP1\tSLowP2\tLowP1\tLowP2\tnoLink\tmultM\t" << std::endl;
619 out << " total "; printRegion1(out,ETA_ALL);
620 out << " in barrel "; printRegion1(out,ETA_BARREL);
621 out << " in trans. "; printRegion1(out,ETA_TRANSITION);
622 out << " in endcap "; printRegion1(out,ETA_ENDCAP);
623 out << " in forwa."; printRegion1(out,ETA_FORWARD);
624
625 }
626 else // no truth
627 {
628 out << "\t" << "tracks, n/event:" << std::endl;
629 out << "\t\t" << "total" << 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_ALL]/(float) m_events << std::endl << std::setprecision(-1);
631 out << "\t\t" << "in barrel" << 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_BARREL]/(float) m_events << std::endl << std::setprecision(-1);
633 out << "\t\t" << "in trans." << 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_TRANSITION]/(float) m_events << std::endl << std::setprecision(-1);
635 out << "\t\t" << "in endcap" << 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_ENDCAP]/(float) m_events << std::endl << std::setprecision(-1);
637 out << "\t\t" << "in forwa." << std::setiosflags(std::ios::fixed | std::ios::showpoint) <<
638 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);
639 }
640 out << " \t\t\t ....................................hits/track............................" << std::endl;
641 out << " \t\t\t\ttotal\tPIX1\tPIX2\tPIX3\tSCT1\tSCT2\tSCT3\tSCT4\tSCT5to9\tStraws" << std::endl;
642 out << " total "; printRegion2(out,ETA_ALL, (float) m_tracks.m_counter[kTracks_rec][TRACK_ALL][ETA_ALL]);
643 out << " in barrel "; printRegion2(out,ETA_BARREL, (float) m_tracks.m_counter[kTracks_rec][TRACK_ALL][ETA_BARREL]);
644 out << " in trans. "; printRegion2(out,ETA_TRANSITION, (float) m_tracks.m_counter[kTracks_rec][TRACK_ALL][ETA_TRANSITION] );
645 out << " in endcap "; printRegion2(out,ETA_ENDCAP, (float) m_tracks.m_counter[kTracks_rec][TRACK_ALL][ETA_ENDCAP] );
646 out << " in forwa. "; printRegion2(out,ETA_FORWARD, (float) m_tracks.m_counter[kTracks_rec][TRACK_ALL][ETA_FORWARD] );
647
648 }
649 else
650 out << ": NO EVENTS PROCESSED! " << std::endl;
651}
void printRegion1(MsgStream &out, enum eta_region) const
Prints ntracks per event,efficiencies,fake rates, and general hit information for given eta region.
const std::string & Truthkey() const
Returns Truth TrackCollection Key.
const std::string & key() const
Returns TrackCollection Key.
void printRegion2(MsgStream &out, enum eta_region, float denominator) const
TrackFitter
enums to identify who created this track and what propertis does it have.

◆ printRegion1()

void InDet::TrackStatHelper::printRegion1 ( MsgStream & out,
enum eta_region region ) const

Prints ntracks per event,efficiencies,fake rates, and general hit information for given eta region.

Definition at line 653 of file TrackStatHelper.cxx.

653 {
654 out << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setw(7) << std::setprecision(2)
655 << "\t" << m_tracks.m_counter[kTracks_rec][TRACK_ALL][region]/(float) m_events;
656
657 if (m_tracks.m_counter[kTracks_gen_signal][TRACK_PRIMARY][region]) {
658 out << "\t" << std::setprecision(4)
659 << 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
660 << std::setprecision(2);
661 }
662 else {
663 out << "\t" << "n/a" ;
664 }
665 if (m_tracks.m_counter[kTracks_gen_signal][TRACK_SECONDARY][region]) {
666 out << "\t" << std::setprecision(4)
667 << 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
668 << std::setprecision(2);
669 }
670 else {
671 out << "\t" << "n/a" ;
672 }
673
674 if (m_tracks.m_counter[kTracks_rec][TRACK_ALL_SIGNAL][region]) {
675 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
676 << "\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
677 }
678 else {
679 out << "\t" << "n/a\tn/a" ;
680 }
681
682 if (m_tracks.m_counter[kTracks_rec][TRACK_ALL][region]) {
683 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
684 << "\t" << 100*(m_tracks.m_counter[kTracks_rec][TRACK_LOWTRUTHPROB2][region]/ (float) m_tracks.m_counter[kTracks_rec][TRACK_ALL][region]) << "%" // track fake rate
685 << "\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
686 << "\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
687
688 }
689 else{
690 out << "\tn/a\tn/a\tn/a";
691 }
692 out << std::endl << std::setprecision(-1);
693}

◆ printRegion2()

void InDet::TrackStatHelper::printRegion2 ( MsgStream & out,
enum eta_region region,
float denominator ) const

Definition at line 695 of file TrackStatHelper.cxx.

695 {
696 out << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setw(7) << std::setprecision(2);
697 if (denominator > 0) {
698 out << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setw(4) << std::setprecision(1)
699 <<" \t\t" << float(m_hits.m_counter[kHits_rec][HIT_ALL ][region]/denominator) << std::setprecision(2)
700 << "\t" << float(m_hits.m_counter[kHits_rec][HIT_PIX1 ][region]/denominator)
701 << "\t" << float(m_hits.m_counter[kHits_rec][HIT_PIX2 ][region]/denominator)
702 << "\t" << float(m_hits.m_counter[kHits_rec][HIT_PIX3 ][region]/denominator)
703 << "\t" << float(m_hits.m_counter[kHits_rec][HIT_SCT1 ][region]/denominator)
704 << "\t" << float(m_hits.m_counter[kHits_rec][HIT_SCT2 ][region]/denominator)
705 << "\t" << float(m_hits.m_counter[kHits_rec][HIT_SCT3 ][region]/denominator)
706 << "\t" << float(m_hits.m_counter[kHits_rec][HIT_SCT4 ][region]/denominator)
707 << "\t" << float(m_hits.m_counter[kHits_rec][HIT_SCT5TO9][region]/denominator)
708 << "\t" << float(m_hits.m_counter[kHits_rec][HIT_TRT_ALL][region]/denominator)
709 << std::endl << std::setprecision(-1);
710 }
711 else {
712 out << " Unable to calculate: Denominator=0." << std::endl << std::setprecision(-1);
713 }
714}

◆ printRegionSecondary()

void InDet::TrackStatHelper::printRegionSecondary ( MsgStream & out,
enum eta_region region,
float denominator ) const

Prints ntracks per event,efficiencies,fake rates, and general hit information for given eta region.

Definition at line 808 of file TrackStatHelper.cxx.

810 {
811 out << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setw(7) << std::setprecision(2)
812 << "\t" << m_tracks.m_counter[kTracks_gen][TRACK_MATCHED_SECONDARY][region]/(float) m_events; // tracks / event
813 if (m_tracks.m_counter[kTracks_gen][TRACK_SECONDARY][region]) {
814 out << "\t" << m_tracks.m_counter[kTracks_gen][TRACK_MATCHED_SECONDARY][region]/ (float) m_tracks.m_counter[kTracks_gen][TRACK_SECONDARY][region]; // track efficiency
815 }
816 else {
817 out << "\t" << "n/a" ;
818 }
819
820 if (denominator > 0) {
821 out << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setw(4) << std::setprecision(1)
822 <<" " << float(m_hits.m_counter[kHits_sec][HIT_ALL ][region]/denominator) << std::setprecision(2)
823 << "\t" << float(m_hits.m_counter[kHits_sec][HIT_PIX1 ][region]/denominator)
824 << "\t" << float(m_hits.m_counter[kHits_sec][HIT_PIX2 ][region]/denominator)
825 << "\t" << float(m_hits.m_counter[kHits_sec][HIT_PIX3 ][region]/denominator)
826 << "\t" << float(m_hits.m_counter[kHits_sec][HIT_SCT1 ][region]/denominator)
827 << "\t" << float(m_hits.m_counter[kHits_sec][HIT_SCT2 ][region]/denominator)
828 << "\t" << float(m_hits.m_counter[kHits_sec][HIT_SCT3 ][region]/denominator)
829 << "\t" << float(m_hits.m_counter[kHits_sec][HIT_SCT4 ][region]/denominator)
830 << "\t" << float(m_hits.m_counter[kHits_sec][HIT_SCT5TO9][region]/denominator)
831 << "\t" << float(m_hits.m_counter[kHits_sec][HIT_TRT_ALL][region]/denominator)
832 << std::endl << std::setprecision(-1);
833 }
834 else {
835 out << " Unable to calculate: Denominator=0." << std::endl << std::setprecision(-1);
836 }
837}

◆ printSecondary()

void InDet::TrackStatHelper::printSecondary ( MsgStream & out) const

Prints all of the statistics information, calls printRegion, printTrackSummaryRegion, etc for detailed statistics.

Definition at line 760 of file TrackStatHelper.cxx.

760 {
761 out << "TrackCollection \"" << key() << "\" " << std::endl;
762 if (m_events > 0) {
763 out << "(TrackAuthors:";
764 std::vector<std::string> author_string;
765 author_string.reserve(Trk::TrackInfo::NumberOfTrackFitters);
766 for (int i=0; i<Trk::TrackInfo::NumberOfTrackFitters; i++) {
767 author_string.push_back( Trk::TrackInfo(static_cast<Trk::TrackInfo::TrackFitter>(i),
769 m_patternProperties,
770 m_recoInfo).dumpInfo() );
771 }
772 for (int i=0; i<Trk::TrackInfo::NumberOfTrackFitters; i++){
773 if (m_author_found[i]){
774 out << " " << author_string[i];
775 }
776 }
777 out << " )" << std::endl
778 << "TrackTruthCollection \"" << Truthkey() << "\"" << std::endl;
779
780 if (m_truthMissing)
781 {
783 out << " WARNING: TrackTruth missing for part of this TrackCollection --> No secondaries information printed!" << std::endl;
784 else
785 out << " INFO: Intentionally no TrackTruth for this TrackCollection. (No secondaries information printed.)" << std::endl;
786 }
787 if (!m_truthMissing)
788 {
789 out << " \t\t\t\t ......................truth mached tracks statistics....................." << std::endl;
790 out << " \t\t\t\tn/event\teff.\ttotal\tPIX1\tPIX2\tPIX3\tSCT1\tSCT2\tSCT3\tSCT4\tSCT5to9\tStraws" << std::endl;
791
792
793 out << " total secondaries ";
794 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]) );
795 out << " secondaries in barrel ";
796 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]) );
797 out << " secondaries in trans. ";
798 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]) );
799 out << " secondaries in endcap ";
800 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]) );
801 out << " secondaries in forwa. ";
802 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]) );
803 }
804 }
805 else out << ": NO EVENTS PROCESSED! " << std::endl;
806}
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.

◆ printTrackSummaryAverage()

void InDet::TrackStatHelper::printTrackSummaryAverage ( MsgStream & out,
enum track_types track_type,
enum eta_region eta_region,
int summary_type ) const

Prints information from TrackSummaryTool.

Definition at line 743 of file TrackStatHelper.cxx.

747{
748 assert( summary_type < kNSummaryTypes);
749 long denom = m_trackSummarySum.m_counter[kNTrackSummaryOK][track_type][eta_region][summary_type]
750 + m_trackSummarySum.m_counter[kNTrackSummaryBAD][track_type][eta_region][summary_type];
751
752 if (denom > 0) {
753 out << float ( m_trackSummarySum.m_counter[kTrackSummarySum][track_type][eta_region][summary_type]/ (float) denom);
754 }
755 else {
756 out << "n/a";
757 }
758}

◆ printTrackSummaryRegion()

bool InDet::TrackStatHelper::printTrackSummaryRegion ( MsgStream & out,
enum track_types track_type,
enum eta_region eta_region ) const

Sets up detailed statistics part of table, calls printTrackSummaryRegion.

Definition at line 716 of file TrackStatHelper.cxx.

719{
720 long ex_denom = m_trackSummarySum.m_counter[kNTrackSummaryOK][track_type][eta_region][kNumberOfPixelHits]
721 + m_trackSummarySum.m_counter[kNTrackSummaryBAD][track_type][eta_region][kNumberOfPixelHits];
722 if (ex_denom > 0)
723 {
724 out << std::setiosflags(std::ios::fixed | std::ios::showpoint)
725 << std::setw(8) << track_types_string[track_type]
726 << std::setw(25) << key();
727
728 if (m_events)
729 out << std::setw(6) << std::setprecision(2) << m_tracks.m_counter[kTracks_rec][track_type][eta_region]/(float) m_events;
730 else
731 out << std::setw(6) << "n/a";
732 for (unsigned int stype_i=0; stype_i< kNSummaryTypes; ++stype_i) {
733 out << std::setw(std::max(6,static_cast<int>(strlen(s_summaryTypeName[stype_i])+1)))
734 << std::setprecision(2); printTrackSummaryAverage(out, track_type , eta_region, stype_i );
735 }
736 out << std::endl << std::setprecision(-1);
737 return true; // yes, printed output
738 }
739 else
740 return false; // no, didn't print output
741}
static const std::string track_types_string[InDet::N_TRACKTYPES]
void printTrackSummaryAverage(MsgStream &out, enum track_types, enum eta_region, int summary_type) const
Prints information from TrackSummaryTool.

◆ reset()

void InDet::TrackStatHelper::reset ( )

Resets the track collection information, called in the constructor.

Definition at line 571 of file TrackStatHelper.cxx.

571 {
572 m_events = 0;
573 m_hits.reset();
574 m_tracks.reset();
575 m_trackSummarySum.reset();
576
577 for (int i=0; i<Trk::TrackInfo::NumberOfTrackFitters; i++) {
578 m_author_found[i] = false;
579 }
580 m_truthMissing=false;
581}

◆ SetCuts()

void InDet::TrackStatHelper::SetCuts ( const struct cuts & ct)

Sets the cuts such as the eta regions (barrel, transition,endcap) and the hit fraction fake cuts and the track matching cut.

Definition at line 113 of file TrackStatHelper.cxx.

114{
115 m_cuts = ct;
116
117}

◆ setSummaryStat()

void InDet::TrackStatHelper::setSummaryStat ( track_types track_i,
eta_region region_i,
const Trk::TrackSummary * summary,
TrackSummaryCounter & trackSummarySum ) const
inlineprivate

Definition at line 307 of file TrackStatHelper.h.

311 {
312 if (summary) {
313 for (int stype=0; stype < kNSummaryTypes; stype++) {
314 int value = summary->get(s_summaryTypes[stype]);
315 //value is -1 if undefined
316 if (value>0) {
317 trackSummarySum.m_counter[kTrackSummarySum][track_i][region_i][stype] += value;
318 trackSummarySum.m_counter[kNTrackSummaryOK][track_i][region_i][stype] ++;
319 }
320 else {
321 trackSummarySum.m_counter[kNTrackSummaryBAD][track_i][region_i][stype] ++;
322 }
323 }
324 }
325 }
static const Trk::SummaryType s_summaryTypes[kNSummaryTypes]
summary types for which statistics are gathered

◆ Truthkey()

const std::string & InDet::TrackStatHelper::Truthkey ( ) const
inline

Returns Truth TrackCollection Key.

Definition at line 179 of file TrackStatHelper.h.

Member Data Documentation

◆ ATLAS_THREAD_SAFE [1/5]

TracksCounterAtomic m_tracks InDet::TrackStatHelper::ATLAS_THREAD_SAFE
mutableprivate

Definition at line 252 of file TrackStatHelper.h.

◆ ATLAS_THREAD_SAFE [2/5]

HitsCounterAtomic m_hits InDet::TrackStatHelper::ATLAS_THREAD_SAFE
mutableprivate

Definition at line 262 of file TrackStatHelper.h.

◆ ATLAS_THREAD_SAFE [3/5]

TrackSummaryCounterAtomic m_trackSummarySum InDet::TrackStatHelper::ATLAS_THREAD_SAFE
mutableprivate

Definition at line 304 of file TrackStatHelper.h.

◆ ATLAS_THREAD_SAFE [4/5]

std::bitset<Trk::TrackInfo::NumberOfTrackRecoInfo> m_recoInfo InDet::TrackStatHelper::ATLAS_THREAD_SAFE
mutableprivate

Definition at line 332 of file TrackStatHelper.h.

◆ ATLAS_THREAD_SAFE [5/5]

std::bitset<Trk::TrackInfo::NumberOfTrackProperties> m_patternProperties InDet::TrackStatHelper::ATLAS_THREAD_SAFE
mutableprivate

Definition at line 333 of file TrackStatHelper.h.

◆ m_author_found

std::atomic<bool> InDet::TrackStatHelper::m_author_found[Trk::TrackInfo::NumberOfTrackFitters] {}
mutableprivate

Number of tracking authors found.

Definition at line 186 of file TrackStatHelper.h.

186{};

◆ m_authorMutex

std::mutex InDet::TrackStatHelper::m_authorMutex
mutableprivate

Definition at line 331 of file TrackStatHelper.h.

◆ m_careAboutTruth

bool InDet::TrackStatHelper::m_careAboutTruth
private

Definition at line 328 of file TrackStatHelper.h.

◆ m_cuts

struct cuts InDet::TrackStatHelper::m_cuts
private

Definition at line 329 of file TrackStatHelper.h.

◆ m_events

std::atomic<long> InDet::TrackStatHelper::m_events {}
mutableprivate

Number of events.

Definition at line 187 of file TrackStatHelper.h.

187{} ;

◆ m_TrackCollectionKey

std::string InDet::TrackStatHelper::m_TrackCollectionKey
private

StoreGate Track Collection Key.

Definition at line 183 of file TrackStatHelper.h.

◆ m_TrackTruthCollectionKey

std::string InDet::TrackStatHelper::m_TrackTruthCollectionKey
private

StoreGate Track Truth Collection Key.

Definition at line 184 of file TrackStatHelper.h.

◆ m_truthMissing

std::atomic<bool> InDet::TrackStatHelper::m_truthMissing
mutableprivate

Flag for if track truth is missing.

Definition at line 327 of file TrackStatHelper.h.

◆ s_summaryTypeName

const char *const InDet::TrackStatHelper::s_summaryTypeName
staticprivate
Initial value:
= {
"blay",
"pix",
"hole",
"gang",
"SCT",
"hole",
"DHole",
"TRT",
"outl",
"TRHi",
"outl",
"alloutl"}

table column labels for summary

Definition at line 67 of file TrackStatHelper.h.

74 {ETA_ALL,
75 ETA_BARREL,
76 ETA_TRANSITION,
77 ETA_ENDCAP,
78 ETA_OUTSIDE,
79 ETA_FORWARD,

◆ s_summaryTypes

const Trk::SummaryType InDet::TrackStatHelper::s_summaryTypes
staticprivate
Initial value:
= {
}
@ 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

summary types for which statistics are gathered

Definition at line 51 of file TrackStatHelper.h.

59 {HIT_ALL,
60 HIT_PIXEL_ALL,
61 HIT_PIX1,
62 HIT_PIX2,
63 HIT_PIX3,
64 HIT_SCT_ALL,

The documentation for this class was generated from the following files: