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

Member Typedef Documentation

◆ HitsCounter

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

Definition at line 262 of file TrackStatHelper.h.

◆ HitsCounterAtomic

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

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

◆ TracksCounter

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

Definition at line 252 of file TrackStatHelper.h.

◆ TracksCounterAtomic

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

Definition at line 253 of file TrackStatHelper.h.

◆ TrackSummaryCounter

◆ TrackSummaryCounterAtomic

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

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

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

247 {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 265 of file TrackStatHelper.h.

265 {
270 };
@ 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 276 of file TrackStatHelper.h.

276 {
290 };

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

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

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

◆ getSummaryTypeHeader()

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

Definition at line 80 of file TrackStatHelper.cxx.

80 {
81 std::stringstream out;
82 for (unsigned int stype_i=0; stype_i < kNSummaryTypes; ++stype_i ) {
83 out << std::setw(std::max(6,static_cast<int>(strlen(s_summaryTypeName[stype_i])+1))) << s_summaryTypeName[stype_i];
84 }
85 return out.str();
86}
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 179 of file TrackStatHelper.h.

179{ return m_TrackCollectionKey; }

◆ PassTrackCuts()

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

defines 'good' reco tracks

Definition at line 839 of file TrackStatHelper.cxx.

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

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

651 {
652 out << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setw(7) << std::setprecision(2)
653 << "\t" << m_tracks.m_counter[kTracks_rec][TRACK_ALL][region]/(float) m_events;
654
655 if (m_tracks.m_counter[kTracks_gen_signal][TRACK_PRIMARY][region]) {
656 out << "\t" << std::setprecision(4)
657 << m_tracks.m_counter[kTracks_gen_signal][TRACK_MATCHED_PRIMARY][region]/ (float) m_tracks.m_counter[kTracks_gen_signal][TRACK_PRIMARY][region] // track efficiency wrt. gen primary in signal
658 << std::setprecision(2);
659 }
660 else {
661 out << "\t" << "n/a" ;
662 }
663 if (m_tracks.m_counter[kTracks_gen_signal][TRACK_SECONDARY][region]) {
664 out << "\t" << std::setprecision(4)
665 << m_tracks.m_counter[kTracks_gen_signal][TRACK_MATCHED_SECONDARY][region]/ (float) m_tracks.m_counter[kTracks_gen_signal][TRACK_SECONDARY][region] // track efficiency wrt. gen secondary in signal
666 << std::setprecision(2);
667 }
668 else {
669 out << "\t" << "n/a" ;
670 }
671
672 if (m_tracks.m_counter[kTracks_rec][TRACK_ALL_SIGNAL][region]) {
673 out << "\t" << 100*(m_tracks.m_counter[kTracks_rec][TRACK_LOWTRUTHPROB_SIGNAL][region]/ (float) m_tracks.m_counter[kTracks_rec][TRACK_ALL_SIGNAL][region]) << "%" // track fake rate for signal only
674 << "\t" << 100*(m_tracks.m_counter[kTracks_rec][TRACK_LOWTRUTHPROB2_SIGNAL][region]/ (float) m_tracks.m_counter[kTracks_rec][TRACK_ALL_SIGNAL][region]) << "%"; // track fake rate for signal only
675 }
676 else {
677 out << "\t" << "n/a\tn/a" ;
678 }
679
680 if (m_tracks.m_counter[kTracks_rec][TRACK_ALL][region]) {
681 out << "\t" << 100*(m_tracks.m_counter[kTracks_rec][TRACK_LOWTRUTHPROB][region]/ (float) m_tracks.m_counter[kTracks_rec][TRACK_ALL][region]) << "%" // track fake rate
682 << "\t" << 100*(m_tracks.m_counter[kTracks_rec][TRACK_LOWTRUTHPROB2][region]/ (float) m_tracks.m_counter[kTracks_rec][TRACK_ALL][region]) << "%" // track fake rate
683 << "\t" << 100*(m_tracks.m_counter[kTracks_rec][TRACK_NOHEPMCPARTICLELINK][region]/ (float) m_tracks.m_counter[kTracks_rec][TRACK_ALL][region]) << "%" // rate of tracks without HepMcParticleLink
684 << "\t" << 100*(m_tracks.m_counter[kTracks_gen][TRACK_MULTMATCH][region]/ (float) m_tracks.m_counter[kTracks_rec][TRACK_ALL][region]) << "%"; // rate of tracks matched to the same truth track
685
686 }
687 else{
688 out << "\tn/a\tn/a\tn/a";
689 }
690 out << std::endl << std::setprecision(-1);
691}

◆ printRegion2()

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

Definition at line 693 of file TrackStatHelper.cxx.

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

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

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

◆ printSecondary()

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

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

Definition at line 758 of file TrackStatHelper.cxx.

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

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

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

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

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

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

113{
114 m_cuts = ct;
115
116}

◆ setSummaryStat()

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

Definition at line 309 of file TrackStatHelper.h.

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

◆ ATLAS_THREAD_SAFE [3/5]

TrackSummaryCounterAtomic m_trackSummarySum InDet::TrackStatHelper::ATLAS_THREAD_SAFE
mutableprivate

Definition at line 306 of file TrackStatHelper.h.

◆ ATLAS_THREAD_SAFE [4/5]

HitsCounterAtomic m_hits InDet::TrackStatHelper::ATLAS_THREAD_SAFE
mutableprivate

Definition at line 264 of file TrackStatHelper.h.

◆ ATLAS_THREAD_SAFE [5/5]

TracksCounterAtomic m_tracks InDet::TrackStatHelper::ATLAS_THREAD_SAFE
mutableprivate

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

188{};

◆ m_authorMutex

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

Definition at line 333 of file TrackStatHelper.h.

◆ m_careAboutTruth

bool InDet::TrackStatHelper::m_careAboutTruth
private

Definition at line 330 of file TrackStatHelper.h.

◆ m_cuts

struct cuts InDet::TrackStatHelper::m_cuts
private

Definition at line 331 of file TrackStatHelper.h.

◆ m_events

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

Number of events.

Definition at line 189 of file TrackStatHelper.h.

189{} ;

◆ m_TrackCollectionKey

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

StoreGate Track Collection Key.

Definition at line 185 of file TrackStatHelper.h.

◆ m_TrackTruthCollectionKey

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

StoreGate Track Truth Collection Key.

Definition at line 186 of file TrackStatHelper.h.

◆ m_truthMissing

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

Flag for if track truth is missing.

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

75 {ETA_ALL,
76 ETA_BARREL,
77 ETA_TRANSITION,
78 ETA_ENDCAP,

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

60 {HIT_ALL,
61 HIT_PIXEL_ALL,
62 HIT_PIX1,
63 HIT_PIX2,

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