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 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.
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 261 of file TrackStatHelper.h.

◆ HitsCounterAtomic

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

Definition at line 262 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 336 of file TrackStatHelper.h.

◆ TracksCounter

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

Definition at line 251 of file TrackStatHelper.h.

◆ TracksCounterAtomic

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

Definition at line 252 of file TrackStatHelper.h.

◆ TrackSummaryCounter

◆ TrackSummaryCounterAtomic

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

Definition at line 300 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 255 of file TrackStatHelper.h.

255 {
256 kHits_rec,
257 kHits_pri,
258 kHits_sec,
260 };
@ 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 246 of file TrackStatHelper.h.

246 {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 264 of file TrackStatHelper.h.

264 {
269 };
@ 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 275 of file TrackStatHelper.h.

275 {
289 };

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 EventContext & ctx,
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.

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

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

◆ 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 178 of file TrackStatHelper.h.

178{ return m_TrackCollectionKey; }

◆ PassTrackCuts()

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

defines 'good' reco tracks

Definition at line 838 of file TrackStatHelper.cxx.

838 {
839 bool passed = false;
840 if(para->pT() > m_cuts.minPt && std::abs(para->eta()) < m_cuts.maxEtaFORWARD)passed = true;
841
842
843 return passed;
844
845}
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 581 of file TrackStatHelper.cxx.

581 {
582
583 out << " Printing Statistics for " << key();
584
585 out << "TrackCollection \"" << key() << "\" " << "\n" ;
586
587 if (m_events > 0) {
588 out << "(TrackAuthors:";
589 std::vector<std::string> author_string;
590 author_string.reserve(Trk::TrackInfo::NumberOfTrackFitters);
591 for (int i=0; i<Trk::TrackInfo::NumberOfTrackFitters; ++i) {
592 author_string.push_back( Trk::TrackInfo(static_cast<Trk::TrackInfo::TrackFitter>(i),
594 m_patternProperties,
595 m_recoInfo).dumpInfo() );
596 }
597 for (int i=0; i<Trk::TrackInfo::NumberOfTrackFitters; i++){
598 if (m_author_found[i]){
599 out << " " << author_string[i];
600 }
601 }
602 out << " )" << std::endl
603 << "TrackTruthCollection \"" << Truthkey() << "\"" << std::endl;
604
605 if (m_truthMissing)
606 {
608 out << " WARNING: TrackTruth missing for part of this TrackCollection, no efficiencies or fakerates included.!" << std::endl;
609 else
610 out << " INFO: Intentionally no TrackTruth for this TrackCollection, no efficiencies or fakerates included." << std::endl;
611 }
612 if (!m_truthMissing)
613 {
614 out << " \t\t\t ................................tracks................................" << std::endl;
615 out << " \t\t\tn/event\tSEff.pr\tSEff.sd\tSLowP1\tSLowP2\tLowP1\tLowP2\tnoLink\tmultM\t" << std::endl;
616 out << " total "; printRegion1(out,ETA_ALL);
617 out << " in barrel "; printRegion1(out,ETA_BARREL);
618 out << " in trans. "; printRegion1(out,ETA_TRANSITION);
619 out << " in endcap "; printRegion1(out,ETA_ENDCAP);
620 out << " in forwa."; printRegion1(out,ETA_FORWARD);
621
622 }
623 else // no truth
624 {
625 out << "\t" << "tracks, n/event:" << std::endl;
626 out << "\t\t" << "total" << std::setiosflags(std::ios::fixed | std::ios::showpoint) <<
627 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);
628 out << "\t\t" << "in barrel" << std::setiosflags(std::ios::fixed | std::ios::showpoint) <<
629 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);
630 out << "\t\t" << "in trans." << std::setiosflags(std::ios::fixed | std::ios::showpoint) <<
631 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);
632 out << "\t\t" << "in endcap" << std::setiosflags(std::ios::fixed | std::ios::showpoint) <<
633 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);
634 out << "\t\t" << "in forwa." << std::setiosflags(std::ios::fixed | std::ios::showpoint) <<
635 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);
636 }
637 out << " \t\t\t ....................................hits/track............................" << std::endl;
638 out << " \t\t\t\ttotal\tPIX1\tPIX2\tPIX3\tSCT1\tSCT2\tSCT3\tSCT4\tSCT5to9\tStraws" << std::endl;
639 out << " total "; printRegion2(out,ETA_ALL, (float) m_tracks.m_counter[kTracks_rec][TRACK_ALL][ETA_ALL]);
640 out << " in barrel "; printRegion2(out,ETA_BARREL, (float) m_tracks.m_counter[kTracks_rec][TRACK_ALL][ETA_BARREL]);
641 out << " in trans. "; printRegion2(out,ETA_TRANSITION, (float) m_tracks.m_counter[kTracks_rec][TRACK_ALL][ETA_TRANSITION] );
642 out << " in endcap "; printRegion2(out,ETA_ENDCAP, (float) m_tracks.m_counter[kTracks_rec][TRACK_ALL][ETA_ENDCAP] );
643 out << " in forwa. "; printRegion2(out,ETA_FORWARD, (float) m_tracks.m_counter[kTracks_rec][TRACK_ALL][ETA_FORWARD] );
644
645 }
646 else
647 out << ": NO EVENTS PROCESSED! " << std::endl;
648}
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 650 of file TrackStatHelper.cxx.

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

◆ printRegion2()

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

Definition at line 692 of file TrackStatHelper.cxx.

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

◆ 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 805 of file TrackStatHelper.cxx.

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

◆ printSecondary()

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

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

Definition at line 757 of file TrackStatHelper.cxx.

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

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

◆ 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 713 of file TrackStatHelper.cxx.

716{
717 long ex_denom = m_trackSummarySum.m_counter[kNTrackSummaryOK][track_type][eta_region][kNumberOfPixelHits]
718 + m_trackSummarySum.m_counter[kNTrackSummaryBAD][track_type][eta_region][kNumberOfPixelHits];
719 if (ex_denom > 0)
720 {
721 out << std::setiosflags(std::ios::fixed | std::ios::showpoint)
722 << std::setw(8) << track_types_string[track_type]
723 << std::setw(25) << key();
724
725 if (m_events)
726 out << std::setw(6) << std::setprecision(2) << m_tracks.m_counter[kTracks_rec][track_type][eta_region]/(float) m_events;
727 else
728 out << std::setw(6) << "n/a";
729 for (unsigned int stype_i=0; stype_i< kNSummaryTypes; ++stype_i) {
730 out << std::setw(std::max(6,static_cast<int>(strlen(s_summaryTypeName[stype_i])+1)))
731 << std::setprecision(2); printTrackSummaryAverage(out, track_type , eta_region, stype_i );
732 }
733 out << std::endl << std::setprecision(-1);
734 return true; // yes, printed output
735 }
736 else
737 return false; // no, didn't print output
738}
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 568 of file TrackStatHelper.cxx.

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

◆ 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 308 of file TrackStatHelper.h.

312 {
313 if (summary) {
314 for (int stype=0; stype < kNSummaryTypes; stype++) {
315 int value = summary->get(s_summaryTypes[stype]);
316 //value is -1 if undefined
317 if (value>0) {
318 trackSummarySum.m_counter[kTrackSummarySum][track_i][region_i][stype] += value;
319 trackSummarySum.m_counter[kNTrackSummaryOK][track_i][region_i][stype] ++;
320 }
321 else {
322 trackSummarySum.m_counter[kNTrackSummaryBAD][track_i][region_i][stype] ++;
323 }
324 }
325 }
326 }
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 180 of file TrackStatHelper.h.

Member Data Documentation

◆ ATLAS_THREAD_SAFE [1/5]

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

Definition at line 334 of file TrackStatHelper.h.

◆ ATLAS_THREAD_SAFE [2/5]

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

Definition at line 333 of file TrackStatHelper.h.

◆ ATLAS_THREAD_SAFE [3/5]

TrackSummaryCounterAtomic m_trackSummarySum InDet::TrackStatHelper::ATLAS_THREAD_SAFE
mutableprivate

Definition at line 305 of file TrackStatHelper.h.

◆ ATLAS_THREAD_SAFE [4/5]

HitsCounterAtomic m_hits InDet::TrackStatHelper::ATLAS_THREAD_SAFE
mutableprivate

Definition at line 263 of file TrackStatHelper.h.

◆ ATLAS_THREAD_SAFE [5/5]

TracksCounterAtomic m_tracks InDet::TrackStatHelper::ATLAS_THREAD_SAFE
mutableprivate

Definition at line 253 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 187 of file TrackStatHelper.h.

187{};

◆ m_authorMutex

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

Definition at line 332 of file TrackStatHelper.h.

◆ m_careAboutTruth

bool InDet::TrackStatHelper::m_careAboutTruth
private

Definition at line 329 of file TrackStatHelper.h.

◆ m_cuts

struct cuts InDet::TrackStatHelper::m_cuts
private

Definition at line 330 of file TrackStatHelper.h.

◆ m_events

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

Number of events.

Definition at line 188 of file TrackStatHelper.h.

188{} ;

◆ m_TrackCollectionKey

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

StoreGate Track Collection Key.

Definition at line 184 of file TrackStatHelper.h.

◆ m_TrackTruthCollectionKey

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

StoreGate Track Truth Collection Key.

Definition at line 185 of file TrackStatHelper.h.

◆ m_truthMissing

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

Flag for if track truth is missing.

Definition at line 328 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: