ATLAS Offline Software
Loading...
Searching...
No Matches
TrigTrackSelector.cxx
Go to the documentation of this file.
1
9
10
13
15
16#include <stdexcept>
17
22
23
24TrigTrackSelector::TrigTrackSelector( TrackFilter* selector, double radius, int selectPdgId, int selectParentPdgId ) :
25 TrackSelector(selector), m_id(0), m_xBeam(0), m_yBeam(0), m_zBeam(0),
26 m_correctTrkTracks(false),
27 m_radius(radius), m_selectPdgId(selectPdgId), m_selectParentPdgId(selectParentPdgId) {
28}
29
30
31
38
40 if ( p==nullptr ) return nullptr;
41 if ( MC::isElectron(p) || MC::isMuon(p) ) return nullptr; //don't want light leptons from eg tau decays - they are found directly
42 if ( p->absPdgId()==pdg_id ) {
43 return p; // recursive stopping conditions
44 }
45 auto vertex = p->prodVtx();
46 if ( vertex == nullptr ) {
47 return nullptr; // has no production vertex !!!
48 }
49 if ( vertex->nIncomingParticles() < 1 ) {
50 return nullptr; // recursive stopping conditions
51 }
52 for( unsigned ip = 0; ip < vertex->nIncomingParticles(); ip++ ) {
53 auto* in = vertex->incomingParticle(ip);
54 auto parent = fromAncestor( pdg_id, in);
55 if ( parent!=nullptr ) {
56 if (parent->absPdgId()==pdg_id) return parent;
57 }
58 }
59
60 return nullptr;
61}
62
63
72
73const xAOD::TruthParticle* TrigTrackSelector::fromAncestor( const std::vector<int>& ids, const xAOD::TruthParticle *p ) const {
74 if ( p==nullptr ) return nullptr;
75 if (MC::isElectron(p) || MC::isMuon(p)) return nullptr; //don't want light leptons from eg tau decays - they are found directly
76 for ( size_t i=ids.size() ; i-- ; ) {
77 if ( p->absPdgId()==ids[i] ) return p; // recursive stopping conditions
78 }
79
80 auto vertex = p->prodVtx();
81 if ( vertex == nullptr ) return nullptr; // has no production vertex !!!
82
83 if ( vertex->nIncomingParticles()<1 ) return nullptr; // recursive stopping conditions
84
85 for( unsigned ip = 0; ip < vertex->nIncomingParticles(); ip++ ) {
86 auto* in = vertex->incomingParticle(ip);
87 auto parent = fromAncestor( ids, in);
88 if ( parent!=nullptr ) {
89 for ( size_t i=ids.size() ; i-- ; ) {
90 if ( parent->absPdgId()==ids[i] ) return parent;
91 }
92 }
93 }
94
95 return nullptr;
96}
97
98
99
106
107// const xAOD::TruthParticle* TrigTrackSelector::fromAncestor(const int pdg_id, const xAOD::TruthParticle *p) const {
108// return fromAncestor( std::vector<int>(1,pdg_id), p );
109// }
110
111
112
113
114
115
117 // do the track extraction stuff here....
118 if ( track ) {
119
120 double eta = track->param()->eta();
121 double phi = track->param()->phi0();
122 double z0 = track->param()->z0();
123 double pT = track->param()->pT();
124 double d0 = track->param()->a0();
125
126 double deta = track->param()->eeta();
127 double dphi = track->param()->ephi0();
128 double dz0 = track->param()->ez0();
129 double dpT = track->param()->epT();
130 double dd0 = track->param()->ea0();
131
132 double theta = 2*std::atan( exp( (-1)*eta ) );
133 correctToBeamline( z0, dz0, d0, dd0, theta, phi );
134
135 int algoid = track->algorithmId();
136
137 int nBlayerHits = (track->HitPattern() & 0x1);
138 int nPixelHits = 2 * track->NPixelSpacePoints(); // NB: for comparison with offline
139 int nSctHits = 2 * track->NSCT_SpacePoints(); // a spacepoint is 2 "hits"
140 int nStrawHits = track->NStrawHits();
141 int nTrHits = track->NTRHits();
142
143 int nSiHits = nPixelHits + nSctHits;
144
145 bool expectBL = false; //not filled in
146
147 unsigned long id = (unsigned long)track;
148
149 unsigned hitPattern = track->HitPattern();
150 unsigned multiPattern = 0;
151
152 double chi2 = track->chi2();
153 double dof = 0;
154
155 bool truth = false;
156 int match_uniqueID = HepMC::INVALID_PARTICLE_ID;
157
158 if ( truthMap ) {
159 const TrigInDetTrackTruth* trackTruth = truthMap->truth(track);
160 if (trackTruth!=0 && trackTruth->nrMatches() > 0) {
161 match_uniqueID = HepMC::uniqueID(trackTruth->bestSiMatch());
162 truth = true;
163 }
164 }
165
166
167 TIDA::Track* t = new TIDA::Track( eta, phi, z0, d0, pT, chi2, dof,
168 deta, dphi, dz0, dd0, dpT,
169 nBlayerHits, nPixelHits, nSctHits, nSiHits,
170 nStrawHits, nTrHits,
171 hitPattern, multiPattern,
172 algoid, truth, -1, match_uniqueID,
173 expectBL, id) ;
174
175 // std::cout << "SUTT ID track " << *t << "\t0x" << std::hex << track->HitPattern() << std::dec << std::endl;
176
177 if ( !addTrack( t ) ){
178 delete t;
179 return false;
180 }
181 return true;
182 }
183 return false;
184}
185
186
187// extract all the tracks from a TrigInDetTrack collection and associated TruthMap and convert them
189 // do the track extraction stuff here....
190 TrigInDetTrackCollection::const_iterator trackitr = trigtracks->begin();
191 TrigInDetTrackCollection::const_iterator trackend = trigtracks->end();
192 while ( trackitr!=trackend ) {
193 selectTrack( *trackitr, truthMap );
194 ++trackitr;
195 }
196}
197
198
199// add a TrackParticle
201
202 // do the track extraction stuff here....
203
204 static const int hpmap[20] = { 0, 1, 2, 7, 8, 9, 3, 4, 5, 6, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 };
205
206 if ( track ) {
207
208#ifdef TRKPARAMETERS_MEASUREDPERIGEE_H
209 const Trk::MeasuredPerigee* measPer = track->measuredPerigee();
210#else
211 const Trk::Perigee* measPer = track->measuredPerigee();
212#endif
213 // CLHEP::HepVector perigeeParams = measPer->parameters();
214
215 double pT = measPer->pT();
216 double eta = measPer->eta();
217 double phi = measPer->parameters()[Trk::phi0];
218 double z0 = measPer->parameters()[Trk::z0] + m_zBeam;
219 double d0 = measPer->parameters()[Trk::d0];
220
221 double theta = measPer->parameters()[Trk::theta];
222 double p = 1/measPer->parameters()[Trk::qOverP];
223
224 // AAARCH!!!!! the TrackParticle pT is NOT SIGNED!!!! ( I ask you! )
225 if ( measPer->parameters()[Trk::qOverP]<0 && pT>0 ) pT *= -1;
226
227#ifdef TRKPARAMETERS_MEASUREDPERIGEE_H
228 const Trk::ErrorMatrix err = measPer->localErrorMatrix();
229 double dtheta = err.error(Trk::theta);
230 double dqovp = err.error(Trk::qOverP);
231 double covthetaOvP = err.covValue(Trk::qOverP,Trk::theta);
232#else
233 double dtheta = std::sqrt((*measPer->covariance())(Trk::theta,Trk::theta));
234 double dqovp = std::sqrt((*measPer->covariance())(Trk::qOverP,Trk::qOverP));
235 double covthetaOvP = (*measPer->covariance())(Trk::qOverP,Trk::theta);
236#endif
237
238
239 double deta = 0.5*dtheta/(std::cos(0.5*theta)*std::cos(0.5*theta)*std::tan(0.5*theta));
240
241#ifdef TRKPARAMETERS_MEASUREDPERIGEE_H
242 double dphi = err.error(Trk::phi0);
243 double dz0 = err.error(Trk::z0);
244 double dd0 = err.error(Trk::d0);
245#else
246 double dphi = std::sqrt((*measPer->covariance())(Trk::phi0,Trk::phi0));
247 double dz0 = std::sqrt((*measPer->covariance())(Trk::z0,Trk::z0));
248 double dd0 = std::sqrt((*measPer->covariance())(Trk::d0,Trk::d0));
249#endif
250
251 double dpT = 0;
252
253
254 double sintheta = std::sin(theta);
255 double costheta = std::cos(theta);
256 double dpt2 = (p*p*sintheta)*(p*p*sintheta)*dqovp*dqovp + (p*costheta)*(p*costheta)*dtheta*dtheta - 2*(p*p*sintheta)*(p*costheta)*covthetaOvP;
257
258 if ( dpt2>0 ) dpT = std::sqrt( dpt2 );
259
260 // Check number of hits
261 // NB: a spacepoint is two offline "hits", so a pixel spacepoint is really
262 // 2 "hits" and an offline SCT "hit" is really a 1D cluster, so two intersecting
263 // stereo clusters making a spacepoint are two "hits"
264 const Trk::TrackSummary *summary = track->trackSummary();
265 int nBlayerHits = 2*summary->get(Trk::numberOfBLayerHits);
266 int nPixelHits = 2*summary->get(Trk::numberOfPixelHits);
267 int nSctHits = summary->get(Trk::numberOfSCTHits);
268 int nStrawHits = summary->get(Trk::numberOfTRTHits);
269 int nTrHits = summary->get(Trk::numberOfTRTHighThresholdHits);
270
271 int nSiHits = nPixelHits + nSctHits;
272 bool expectBL = false; // Not stored for Rec::TrackParticle
273
274 const Trk::FitQuality *quality = track->fitQuality();
275 double chi2 = quality->chiSquared();
276 double dof = quality->numberDoF();
277
278 unsigned bitmap = 0;
279
280
281 unsigned long id = (unsigned long)track;
282
283 for ( int ih=0 ; ih<20 ; ih++ ) {
284 if ( summary->isHit(Trk::DetectorType(ih)) ) bitmap |= ( 1<<hpmap[ih] );
285 }
286
289
290 // std::cout << "fetching author info :" << track->info().trackFitter() << ":"
291 // << track->info().dumpInfo() << ": bm 0x" << std::hex << bitmap << std::dec << std::endl;
292
293 int fitter = track->info().trackFitter();
294 std::string dumpinfo = track->info().dumpInfo();
295
296 int trackAuthor = -1;
297 if ( fitter>0 && fitter<Trk::TrackInfo::NumberOfTrackFitters ) {
298 if ( dumpinfo.find("TRTStandalone")!=std::string::npos) trackAuthor = 2;
299 else if ( dumpinfo.find("TRTSeededTrackFinder")!=std::string::npos) trackAuthor = 1;
300 else trackAuthor = 0;
301 }
302
303#if 0
304 std::cout << "\t\t\tSUTT TP track"
305 << "\teta=" << eta // << " +- " << (*trackitr)->params()->deta()
306 << "\tphi=" << phi // << " +- " << (*trackitr)->params()->dphi()
307 << "\tz0=" << z0
308 << "\tpT=" << pT // << "\t( " << 1/qoverp << ")"
309 << "\td0=" << d0
310 << "\tNsi=" << nSiHits
311 << "\tNtrt=" << nTrHits
312 << "\tNstr=" << nStrawHits
313 << "\tauthor=" << trackAuthor
314 << std::endl;
315#endif
316
317 // Create and save Track
318
319 TIDA::Track* t = new TIDA::Track(eta, phi, z0, d0, pT, chi2, dof,
320 deta, dphi, dz0, dd0, dpT,
321 nBlayerHits, nPixelHits, nSctHits, nSiHits,
322 nStrawHits, nTrHits, bitmap, 0,
323 trackAuthor, false, -1, -1,
324 expectBL, id) ;
325
326 // std::cout << "SUTT TP track " << *t << "\t0x" << std::hex << bitmap << std::dec << std::endl;
327
328 if ( !addTrack( t ) ){
329 delete t;
330 return false;
331 }
332 return true;
333
334 }
335 return false;
336}
337
338
339// extract all the tracks from a TrackParticle collection and add them
341
342 // std::cout << "\t\t\tSUTT \tTrackParticleContainer->size() = " << trigtracks->size() << std::endl;
343
344 Rec::TrackParticleContainer::const_iterator trackitr = trigtracks->begin();
345 Rec::TrackParticleContainer::const_iterator trackend = trigtracks->end();
346
347 while ( trackitr!=trackend ) {
348
349 selectTrack( *trackitr );
350
351 ++trackitr;
352
353 } // loop over tracks
354
355}
356
357
358
359// extract all the tracks from a TruthParticle collection and add them
361 // std::cout << "\t\t\tSUTT \tTrackParticleContainer->size() = " << trigtracks->size() << std::endl;
362
363 TruthParticleContainer::const_iterator trackitr = truthtracks->begin();
364 TruthParticleContainer::const_iterator trackend = truthtracks->end();
365
366 while ( trackitr!=trackend ) {
367
368 selectTrack( *trackitr );
369
370 ++trackitr;
371
372 } // loop over tracks
373
374}
375
376
380
381void TrigTrackSelector::truthBeamline( const xAOD::TruthParticleContainer* truthtracks, double& x0, double& y0 ) {
382
383 x0 = 0;
384 y0 = 0;
385
387
388 int Nx = 300;
389 int Ny = 300;
390
392 std::vector<double> xpos(Nx,0);
393 std::vector<double> ypos(Ny,0);
394
396 std::vector<int> xn(Nx,0);
397 std::vector<int> yn(Ny,0);
398
399 int xoffset = Nx/2;;
400 int yoffset = Ny/2;
401
402 double deltax = 3.0/Nx;
403 double deltay = 3.0/Ny;
404
406
407 xAOD::TruthParticleContainer::const_iterator trackitr = truthtracks->begin();
408 xAOD::TruthParticleContainer::const_iterator trackend = truthtracks->end();
409
410 for ( ; trackitr!=trackend ; ++trackitr ) {
411
412 const xAOD::TruthParticle* track = (*trackitr);
413
414 if ( !MC::isStable(track) || !track->hasProdVtx() ) continue;
415
417
418 double xp[3] = { track->prodVtx()->x(), track->prodVtx()->y(), track->prodVtx()->z() };
419
421
422 int ix = xp[0]/deltax + xoffset;
423 int iy = xp[1]/deltay + yoffset;
424
425 if ( ix<0 || ix>=Nx || iy<0 || iy>=Nx ) continue;
426
427 xpos[ix] += xp[0];
428 ypos[iy] += xp[1];
429
430 xn[ix]++;
431 yn[iy]++;
432
433 } // loop over tracks
434
436
437 int imx = 0;
438 int imy = 0;
439
440 for ( size_t i=0 ; i<xpos.size() ; i++ ) {
441 if ( xn[i]>xn[imx] ) imx = i;
442 if ( yn[i]>yn[imy] ) imy = i;
443 }
444
448 if ( xn[imx]>1 ) x0 = xpos[imx]/xn[imx];
449 if ( yn[imy]>1 ) y0 = ypos[imy]/yn[imy];
450
451}
452
453
454// extract all the tracks from a xAOD::TruthParticle collection and add them
456
457 xAOD::TruthParticleContainer::const_iterator trackitr = truthtracks->begin();
458 xAOD::TruthParticleContainer::const_iterator trackend = truthtracks->end();
459
461 double x0 = 0;
462 double y0 = 0;
463
464 truthBeamline( truthtracks, x0, y0 );
465
466
467 for ( ; trackitr!=trackend; ++trackitr) {
468
469
470 // Only select charged final state particles
471 double q = (*trackitr)->charge();
472
474 static const particleType ptype;
475 if ( q==-999 ) q = ptype.charge( (*trackitr)->pdgId() );
476
477 if (q == 0 || !MC::isStable(*trackitr) ) continue;
478
479 // If looking for tau parents, don't select mu or e children
480
481 // select based on the pdg of final state particle
482 bool gotPdgId = true;
483 if (m_selectPdgId!=0) gotPdgId = (*trackitr)->absPdgId()==m_selectPdgId;
484
485 // select based on the pdg of the parent or ancestor
486 bool gotParentPdgId = true;
487 if ( gotPdgId && m_selectParentPdgId!=0 ) gotParentPdgId = fromAncestor(m_selectParentPdgId, (*trackitr))!=nullptr;
490
491 if ( gotParentPdgId && gotPdgId ) selectTrack( *trackitr, x0, y0);
492
493 } // loop over tracks
494
495}
496
497
498
499// add a TruthParticle from a GenParticle - easy, bet it doesn't work
501
503 if ( !MC::isStable(track) ) return false;
504
506//AV Using memory to get some value is not a good idea. This is not a repruducible/portable way, but I leave it as is.
507#ifdef HEPMC3
508 m_id = (unsigned long)(track.get());
509#else
510 m_id = (unsigned long)track;
511#endif
512 bool sel;
513 sel = selectTrack( TruthParticle(track) );
514 m_id = 0;
515
516 return sel;
517
518}
519
520
521// add a TruthParticle
523
524 return selectTrack( &track );
525
526}
527
528
529// add a TruthParticle
531 TIDA::Track* t = makeTrack( track, m_id );
532 if ( t == 0 ) return false;
533 if ( !addTrack(t) ) {
534 delete t;
535 return false;
536 }
537 return true;
538}
539
540
541
542
543// add an xAOD::TruthParticle
544bool TrigTrackSelector::selectTrack( const xAOD::TruthParticle* track, double x0, double y0) {
545 if ( track ) {
546
547 if (!MC::isStable(track) ) return false;
548
550 const xAOD::TruthParticle* measPer = track;
551
552 double pT = measPer->pt();
553 double eta = measPer->eta();
554 double phi = measPer->phi();
555
556 // AAARCH!!!!! the TrackParticle pT is NOT SIGNED!!!! ( I ask you! )
557 if ( measPer->charge()<0 && pT>0 ) pT *= -1;
558 double q = track->charge();
559
560 static const particleType ptype;
561
563 if ( q==-999 ) q = ptype.charge( track->pdgId() );
564
566 if ( q==0 ) return 0;
567
571 // double xbeam = getBeamX(); // track->vx();
572 // double ybeam = getBeamY(); // track->vy();
573 // double zbeam = getBeamZ(); // track->vz();
574
575 if ( !track->hasProdVtx() ) return false;
576
578
579 double xp[3] = { measPer->prodVtx()->x(), measPer->prodVtx()->y(), measPer->prodVtx()->z() };
580 double xb[3] = { xp[0]-x0, xp[1]-y0, measPer->prodVtx()->z() };
581 double xd[3] = { 0, 0, 0 };
582
583 if ( track->hasDecayVtx() ) {
584 xd[0] = track->decayVtx()->x();
585 xd[1] = track->decayVtx()->y();
586 xd[2] = track->decayVtx()->z();
587 }
588
589 double rp = std::sqrt( xp[0]*xp[0] + xp[1]*xp[1] );
590 double rd = std::sqrt( xd[0]*xd[0] + xd[1]*xd[1] );
591
594 double theta = 2*std::atan( std::exp( -eta ) );
595 double z0 = xb[2] - (xb[0]*std::cos(phi) + xb[1]*std::sin(phi))/std::tan(theta);
596 double d0 = xb[1]*std::cos(phi) - xb[0]*std::sin(phi);
597
598 bool final_state = false;
599
611 const double inner_radius = m_radius;
612 const double outer_radius = m_radius;
613
614 if ( ( track->hasProdVtx() && rp<=inner_radius ) &&
615 ( !track->hasDecayVtx() || rd>outer_radius ) ) final_state = true;
616
617 if ( !final_state ) return false;
618
619 double deta = 0;
620 double dphi = 0;
621 double dz0 = 0;
622 double dd0 = 0;
623
624 double dpT = 0;
625
626 int nBlayerHits = 0;
627 int nPixelHits = 0;
628 int nSctHits = 0;
629 int nStrawHits = 0;
630 int nTrtHits = 0;
631
632 double chi2 = 0;
633 double dof = 0;
634
635 bool expectBL = false;
636
637 nSctHits += 0;
638 nPixelHits += 0;
639
641 int nSiHits = 0;
642
643 unsigned long id = (unsigned long)track;
644
645 unsigned bitmap = 0;
646
647 int trackAuthor = track->pdgId();
648 int uniqueID = HepMC::uniqueID(track);
649
650#if 0
651 std::cout << "\t\t\tSUTT TP track"
652 << "\teta=" << eta
653 << "\tphi=" << phi
654 << "\tz0=" << z0
655 << "\tpT=" << pT
656 << "\td0=" << d0
657 << "\tauthor=" << trackAuthor
658 << "\tVTX x " << xp[0]<< "\ty " << xp[1] << "\tz " << xp[2]
659 << std::endl;
660#endif
661
662 // Create and save Track
663
664 TIDA::Track* t = new TIDA::Track( eta, phi, z0, d0, pT, chi2, dof,
665 deta, dphi, dz0, dd0, dpT,
666 nBlayerHits, nPixelHits, nSctHits, nSiHits,
667 nStrawHits, nTrtHits, bitmap, 0,
668 trackAuthor, false, uniqueID, -1,
669 expectBL, id) ;
670
672 // std::cout << "SUTT TP track " << *t << "\t0x" << std::hex << bitmap << std::dec << std::endl;
673
674 // addTrack applies additional cuts using the Filter
675 if ( !addTrack( t ) ){
676 delete t;
677 return false;
678 }
679 }
680 return false;
681
682}
683
684
685
686
687// make a TIDA::Track from a GenParticle
689//AV Using memory to get some value is not a good idea. This is not a repruducible/portable way, but I leave it as is.
690#ifdef HEPMC3
691 unsigned long id = (unsigned long)(track.get());
692#else
693 unsigned long id = (unsigned long)track;
694#endif
695 TruthParticle t = TruthParticle(track);
696 return makeTrack( &t, id );
697}
698
699// make a TIDA::Track from a TruthParticle
700TIDA::Track* TrigTrackSelector::makeTrack( const TruthParticle* track, unsigned long tid ) {
701
702 if ( track==0 ) return 0;
703 if ( !MC::isStable(track)) return 0;
704
705
706 double phi = track->phi();
707 double eta = track->eta();
708
712 double xp[3] = { 0, 0, 0 };
713
714 if ( track->genParticle()->production_vertex() ) {
715 xp[0] = track->genParticle()->production_vertex()->position().x();
716 xp[1] = track->genParticle()->production_vertex()->position().y();
717 xp[2] = track->genParticle()->production_vertex()->position().z();
718 }
719
720 // CHANGED BY JK - z0 with respect to (0,0)
721 // double z0 = xp[2];
722 double theta = 2*std::atan( exp( (-1)*eta ) );
723 double z0 = xp[2] - (xp[0]*std::cos(phi) + xp[1]*std::sin(phi))/std::tan(theta);
724
725 double xd[3] = { 0, 0, 0 };
726
727 if ( track->genParticle()->end_vertex() ) {
728 xd[0] = track->genParticle()->end_vertex()->position().x();
729 xd[1] = track->genParticle()->end_vertex()->position().y();
730 xd[2] = track->genParticle()->end_vertex()->position().z();
731 }
732
733 double rp = std::sqrt( xp[0]*xp[0] + xp[1]*xp[1] );
734 double rd = std::sqrt( xd[0]*xd[0] + xd[1]*xd[1] );
735
736
737 bool final_state = false;
738
750 const double inner_radius = m_radius;
751 const double outer_radius = m_radius;
752 if ( ( track->genParticle()->production_vertex() && rp<=inner_radius ) &&
753 ( track->genParticle()->end_vertex()==0 || rd>outer_radius ) ) final_state = true;
754
755
756 if ( !final_state ) return 0;
757
768
769 double q = track->charge();
770
771 static const particleType ptype;
772
774 if ( q==-999 ) q = ptype.charge( track->pdgId() );
775
777 if ( q==0 ) return 0;
778
779 double pT = q*track->pt();
780
781
782 double d0 = 0;
783
788
790
791
792 // CHANGED BY JK - d0 with respect to (0,0)
793 // d0 = q*rp*std::sin(phi);
794 d0 = xp[1]*std::cos(phi) - xp[0]*std::sin(phi);
795
796
798
799 double dz0 = 0;
800 double dd0 = 0;
801
802 correctToBeamline( z0, dz0, d0, dd0, theta, phi );
803
804
805
807
809 int author = track->pdgId();
810 int uniqueID = HepMC::uniqueID(track);
811
812
813 unsigned long id = (unsigned long)track;
814 if ( tid!=0 ) id = tid;
815
819
820
822
823 // std::cout << "\t\t\tSUTT Truth track"
824 // << "\teta=" << eta // << " +- " << (*trackitr)->params()->deta()
825 // << "\tphi=" << phi // << " +- " << (*trackitr)->params()->dphi()
826 // << "\tz0=" << z0
827 // << "\tpT=" << pT // << "\t( " << 1/qoverp << ")"
828 // << "\td0=" << d0
829 // << "\tauthor=" << author
830 // << std::endl;
831
832
833
834 TIDA::Track* t = new TIDA::Track(eta, phi, z0, d0, pT, 0, 0,
835 0, 0, 0, 0, 0,
836 0, 0, 0, 0,
837 0, 0, 0, 0,
838 author, false, uniqueID, -1,
839 false,
840 id ) ;
841
842 return t;
843
844}
845
846
847
848// add a Trk::Track
850
851 // do the track extraction stuff here....
852
853 static const int hpmap[20] = { 0, 1, 2, 7, 8, 9, 3, 4, 5, 6, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 };
854 // std::cout << __FILE__<< " " <<__LINE__<<std::endl;
855
856 if ( track ) {
857
858 // const Trk::Perigee* startPerigee = track->perigeeParameters();
859
860#ifdef TRKPARAMETERS_MEASUREDPERIGEE_H
861 const Trk::MeasuredPerigee* startPerigee = dynamic_cast<const Trk::MeasuredPerigee*>(track->perigeeParameters());
862 // const Trk::MeasuredPerigee* measPer = startPerigee; // just out of laziness
863#else
864 const Trk::Perigee* startPerigee = track->perigeeParameters();
865 const Trk::Perigee* measPer = startPerigee; // just out of laziness
866#endif
867
868
869 // CLHEP::HepVector perigeeParams = measPer->parameters();
870 // double pT = measPer->pT();
871 // double eta = measPer->eta();
872 // double phi = perigeeParams[Trk::phi0];
873 // double z0 = perigeeParams[Trk::z0];
874 // double d0 = perigeeParams[Trk::d0];
875 // // AAARCH!!!!! the TrackParticle pT is NOT SIGNED!!!! ( I ask you! )
876 // if ( perigeeParams[Trk::qOverP]<0 ) pT *= -1;
877 // std::cout <<pT1<<" pt1vspT "<<pT<<std::endl;
878
879 if (startPerigee){
880
881 double theta = startPerigee->parameters()[Trk::theta];
882 double p = 1/startPerigee->parameters()[Trk::qOverP];
883 double qOverPt = startPerigee->parameters()[Trk::qOverP]/std::sin(theta);
884 double charge = startPerigee->charge();
885 double eta = startPerigee->eta();
886 double phi = startPerigee->parameters()[Trk::phi0];
887 double z0 = startPerigee->parameters()[Trk::z0];
888 double d0 = startPerigee->parameters()[Trk::d0];
889 // double pT = (1./qOverPt)*(charge);
890 double pT = (1./qOverPt); // always use signed PT
891
892 if ( charge<0 && pT>0 ) pT *= -1;
893 if ( charge<0 && p>0 ) p *= -1;
894
895
896
897#ifdef TRKPARAMETERS_MEASUREDPERIGEE_H
898 const Trk::ErrorMatrix err = startPerigee->localErrorMatrix();
899 double dtheta = err.error(Trk::theta);
900 double dqovp = err.error(Trk::qOverP);
901 double covthetaOvP = err.covValue(Trk::qOverP,Trk::theta);
902
903 double dphi = err.error(Trk::phi0);
904 double dz0 = err.error(Trk::z0);
905 double dd0 = err.error(Trk::d0);
906#else
907 double dtheta = std::sqrt((*measPer->covariance())(Trk::theta,Trk::theta));
908 double dqovp = std::sqrt((*measPer->covariance())(Trk::qOverP,Trk::qOverP));
909 double covthetaOvP = (*measPer->covariance())(Trk::qOverP,Trk::theta);
910
911 double dphi = std::sqrt((*measPer->covariance())(Trk::phi0,Trk::phi0));
912 double dz0 = std::sqrt((*measPer->covariance())(Trk::z0,Trk::z0));
913 double dd0 = std::sqrt((*measPer->covariance())(Trk::d0,Trk::d0));
914#endif
915
916 double deta = 0.5*dtheta/(std::cos(0.5*theta)*std::cos(0.5*theta)*std::tan(0.5*theta));
917
918
919 if ( m_correctTrkTracks ) correctToBeamline( z0, dz0, d0, dd0, theta, phi );
920
921 double dpT = 0;
922
923
924 double sintheta = std::sin(theta);
925 double costheta = std::cos(theta);
926 double dpT2 = (p*p*sintheta)*(p*p*sintheta)*dqovp*dqovp + (p*costheta)*(p*costheta)*dtheta*dtheta - 2*(p*p*sintheta)*(p*costheta)*covthetaOvP;
927
928 if ( dpT2>0 ) dpT = std::sqrt( dpT2 );
929
930 // Check number of hits
931 // NB: a spacepoint is two offline "hits", so a pixel spacepoint is really
932 // 2 "hits" and an offline SCT "hit" is really a 1D cluster, so two intersetcting
933 // stereo clusters making a spacepoint are two "hits"
934 // const Trk::TrackSummary *summary = dynamic_cast<const Trk::TrackSummary*>(track->trackSummary());
935 //ToolHandle< Trk::ITrackSummaryTool > m_trackSumTool;
936 //m_trackSumTool = ToolHandle<Trk::ITrackSummaryTool>("Trk::TrackSummaryTool/InDetTrackSummaryTool");
937 //const Trk::TrackSummary* summary = NULL;
938 //summary = m_trackSumTool->createSummary(*track);
939
940 const Trk::TrackSummary * summary = track->trackSummary();
941 int nBlayerHits = 0;
942 int nPixelHits = 0;
943 int nSctHits = 0;
944 int nStrawHits = 0;
945 int nTrHits = 0;
946 int nSiHits = 0;
947 bool expectBL = false; // Not stored for Trk::Track
948 unsigned bitmap = 0;
949
950 if(summary==0){
951 std::cerr << "Could not create TrackSummary - Track will likely fail hits requirements" << std::endl;
952 }
953 else{
954 nBlayerHits = 2*summary->get(Trk::numberOfBLayerHits);
955 nPixelHits = 2*summary->get(Trk::numberOfPixelHits);
956 nSctHits = summary->get(Trk::numberOfSCTHits);
957 nStrawHits = summary->get(Trk::numberOfTRTHits);
958 nTrHits = summary->get(Trk::numberOfTRTHighThresholdHits);
959 nSiHits = nPixelHits + nSctHits;
960
961 for ( int ih=0 ; ih<20 ; ih++ ) {
962 if ( summary->isHit(Trk::DetectorType(ih)) ) bitmap |= ( 1<<hpmap[ih] );
963 }
964 }
965
966 unsigned long id = (unsigned long)track;
967 double chi2 = 0;
968 double dof = 0;
969 //const Trk::FitQuality *quality = dynamic_cast<const Trk::FitQuality*>(track->fitQuality());
970 const Trk::FitQuality *quality = (track->fitQuality());
971 if(quality==0) std::cerr << "Could not create FitQuality - Track will likely fail hits requirements" << std::endl;
972 else{
973 chi2 = quality->chiSquared();
974 dof = quality->numberDoF();
975 }
976
977 int trackAuthor = -1;
978
981
982 // std::cout << "fetching author info :" << track->info().trackFitter() << ":"
983 // << track->info().dumpInfo() << ": bm 0x" << std::hex << bitmap << std::dec << std::endl;
984
985 int fitter = track->info().trackFitter();
986 // std::string dumpinfo = track->info().dumpInfo();
987
988 if ( fitter>0 && fitter<Trk::TrackInfo::NumberOfTrackFitters ) {
989 if ((track->info().dumpInfo()).find("TRTStandalone") != std::string::npos) trackAuthor = 2;
990 else if ((track->info().dumpInfo()).find("TRTSeededTrackFinder") != std::string::npos) trackAuthor = 1;
991 else trackAuthor = 0;
992 }
993
994 #if 0
995 std::cout << "\t\t\tSUTT TP track"
996 << "\teta=" << eta // << " +- " << (*trackitr)->params()->deta()
997 << "\tphi=" << phi // << " +- " << (*trackitr)->params()->dphi()
998 << "\tz0=" << z0
999 << "\tpT=" << pT // << "\t( " << 1/qoverp << ")"
1000 << "\td0=" << d0
1001 << "\tNsi=" << nSiHits
1002 << "\tNtrt=" << nTrHits
1003 << "\tNstr=" << nStrawHits
1004 << "\tauthor=" << trackAuthor
1005 << std::endl;
1006 #endif
1007 // Create and save Track
1008 TIDA::Track* t = new TIDA::Track(eta, phi, z0, d0, pT, chi2, dof,
1009 deta, dphi, dz0, dd0, dpT,
1010 nBlayerHits, nPixelHits, nSctHits, nSiHits,
1011 nStrawHits, nTrHits, bitmap, 0,
1012 trackAuthor, false, -1, -1,
1013 expectBL, id) ;
1014
1015 if ( !addTrack( t ) ){
1016 delete t;
1017 return false;
1018 }
1019 return true;
1020
1021 //std::cout << "SUTT TP track " << *t << "\t0x" << std::hex << bitmap << std::dec << std::endl;
1022 }
1023 }
1024
1025 return false;
1026}
1027
1028// extract all the tracks from a TrackCollection and add them
1030
1031 // std::cout << "\t\t\tSUTT \tTrackContainer->size() = " << trigtracks->size() << std::endl;
1032
1033 TrackCollection::const_iterator trackitr = trigtracks->begin();
1034 TrackCollection::const_iterator trackend = trigtracks->end();
1035
1036 while ( trackitr!=trackend ) {
1037 selectTrack( *trackitr );
1038 ++trackitr;
1039 } // loop over tracks
1040
1041}
1042
1043
1044
1046 // do the track extraction stuff here....
1047
1048 // static int hpmap[20] = { 0, 1, 2, 7, 8, 9, 3, 4, 5, 6, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 };
1049
1050 if ( track ) {
1051
1053 const xAOD::TrackParticle* measPer = track;
1054
1055 // CLHEP::HepVector perigeeParams = measPer->parameters();
1056
1057 double pT = measPer->pt();
1058 double eta = measPer->eta();
1059 double phi = measPer->phi0();
1060 double z0 = measPer->z0() + measPer->vz();
1061 double d0 = measPer->d0();
1062
1063 double theta = measPer->theta();
1064
1069 // if ( measPer->qOverP()==0 ) return false;
1070 if ( measPer->qOverP()==0 ) throw std::runtime_error( "probable corrupted track - this should never happen" );
1071 double p = 1/measPer->qOverP();
1072
1073 // AAARCH!!!!! the TrackParticle pT is NOT SIGNED!!!! ( I ask you! )
1074 if ( measPer->qOverP()<0 && pT>0 ) pT *= -1;
1075
1076 double dtheta = std::sqrt(measPer->definingParametersCovMatrix()(Trk::theta,Trk::theta));
1077 double dqovp = std::sqrt(measPer->definingParametersCovMatrix()(Trk::qOverP,Trk::qOverP));
1078 double covthetaOvP = measPer->definingParametersCovMatrix()(Trk::qOverP,Trk::theta);
1079
1080 double deta = 0.5*dtheta/(std::cos(0.5*theta)*std::cos(0.5*theta)*std::tan(0.5*theta)); // ???? CHECK THIS <<--
1081
1082 double dphi = std::sqrt(measPer->definingParametersCovMatrix()(Trk::phi0,Trk::phi0));
1083 double dz0 = std::sqrt(measPer->definingParametersCovMatrix()(Trk::z0,Trk::z0));
1084 double dd0 = std::sqrt(measPer->definingParametersCovMatrix()(Trk::d0,Trk::d0));
1085
1086 double dpT = 0;
1087
1088
1090 // if ( m_xBeam!=0 || m_yBeam!=0 ) correctToBeamline( z0, dz0, d0, dd0, theta, phi );
1091
1092
1093 double sintheta = std::sin(theta);
1094 double costheta = std::cos(theta);
1095 double dpt2 = (p*p*sintheta)*(p*p*sintheta)*dqovp*dqovp + (p*costheta)*(p*costheta)*dtheta*dtheta - 2*(p*p*sintheta)*(p*costheta)*covthetaOvP;
1096
1097 if ( dpt2>0 ) dpT = std::sqrt( dpt2 );
1098
1099 // Check number of hits
1100 // NB: a spacepoint is two offline "hits", so a pixel spacepoint is really
1101 // 2 "hits" and an offline SCT "hit" is really a 1D cluster, so two intersetcting
1102 // stereo clusters making a spacepoint are two "hits"
1103
1104 uint8_t sum_nBlayerHits = 0;
1105 track->summaryValue( sum_nBlayerHits, xAOD::numberOfInnermostPixelLayerHits);
1106 int nBlayerHits = 2*sum_nBlayerHits;
1107
1108 uint8_t sum_nPixelHits = 0;
1109 track->summaryValue( sum_nPixelHits, xAOD::numberOfPixelHits);
1110 int nPixelHits = 2*sum_nPixelHits;
1111
1112 uint8_t sum_nSctHits = 0;
1113 track->summaryValue( sum_nSctHits, xAOD::numberOfSCTHits);
1114 int nSctHits = sum_nSctHits;
1115
1116 uint8_t sum_nStrawHits = 0;
1117 track->summaryValue( sum_nStrawHits, xAOD::numberOfTRTHits);
1118 int nStrawHits = sum_nStrawHits;
1119
1120 uint8_t sum_nTrtHits = 0;
1121 track->summaryValue( sum_nTrtHits, xAOD::numberOfTRTHighThresholdHits);
1122 int nTrtHits = sum_nTrtHits;
1123
1124
1125 uint8_t sum_expectBL = 0;
1126 track->summaryValue( sum_expectBL, xAOD::expectInnermostPixelLayerHit);
1127 bool expectBL = ( sum_expectBL ? true : false );
1128
1130
1131 uint8_t sum_sctholes = 0;
1132 track->summaryValue( sum_sctholes, xAOD::numberOfSCTHoles);
1133
1134 uint8_t sum_pixholes = 0;
1135 track->summaryValue( sum_pixholes, xAOD::numberOfPixelHoles);
1136
1140
1141 nSctHits += 1000*sum_sctholes;
1142 nPixelHits += 1000*sum_pixholes;
1143
1145 int nSiHits = nPixelHits + nSctHits;
1146
1148
1149 double chi2 = track->chiSquared();
1150 double dof = track->numberDoF();
1151
1152 unsigned long id = (unsigned long)track;
1153
1154 unsigned bitmap = track->hitPattern();
1155
1156
1157
1158 double xbeam = track->vx();
1159 double ybeam = track->vy();
1160 double zbeam = track->vz();
1161
1162 if ( xbeam!=getBeamX() || ybeam!=getBeamY() || zbeam!=getBeamZ() ) setBeamline( xbeam, ybeam, zbeam );
1163
1164 int trackAuthor = 0;
1165
1166 int fitter = track->trackFitter();
1167 std::bitset<xAOD::NumberOfTrackRecoInfo> patternrec = track->patternRecoInfo();
1168
1169 //int icount = 0;<- never used if section below is commented
1170 for ( unsigned ipr=patternrec.size() ; ipr-- ; ) {
1171 if ( patternrec[ipr] ) {
1172 //icount++; <- never used if section below is commented
1173 trackAuthor |= (ipr >> 16);
1174 // static bool first = true;
1175 // if ( first && icount>1 ) {
1176 // std::cerr << "more than one pattern rec strategy " << ipr << "\t(suppressing further output)" << std::endl;
1177 // first = false;
1178 // }
1179 }
1180 }
1181
1182 trackAuthor |= fitter;
1183
1184 // if ( fitter>0 && fitter<Trk::TrackInfo::NumberOfTrackFitters ) {
1185 // if ( dumpinfo.find("TRTStandalone")!=std::string::npos) trackAuthor = 2;
1186 // else if ( dumpinfo.find("TRTSeededTrackFinder")!=std::string::npos) trackAuthor = 1;
1187 // else trackAuthor = 0;
1188 // }
1189
1190#if 0
1191 std::cout << "\t\t\tSUTT TP track"
1192 << "\teta=" << eta // << " +- " << (*trackitr)->params()->deta()
1193 << "\tphi=" << phi // << " +- " << (*trackitr)->params()->dphi()
1194 << "\tz0=" << z0
1195 << "\tpT=" << pT // << "\t( " << 1/qoverp << ")"
1196 << "\td0=" << d0
1197 << "\tNsi=" << nSiHits
1198 // << "\tNtrt=" << nTrtHits
1199 // << "\tNstr=" << nStrawHits
1200 << "\tfitter=" << fitter
1201 << "\tauthor=" << trackAuthor
1202 << "\tVTX x " << track->vx() << "\ty " << track->vy() << "\tz " << track->vz()
1203 << std::endl;
1204#endif
1205
1206 // Create and save Track
1207
1208 TIDA::Track* t = new TIDA::Track( eta, phi, z0, d0, pT, chi2, dof,
1209 deta, dphi, dz0, dd0, dpT,
1210 nBlayerHits, nPixelHits, nSctHits, nSiHits,
1211 nStrawHits, nTrtHits, bitmap, 0,
1212 trackAuthor, false, -1, -1,
1213 expectBL, id) ;
1214
1215 // std::cout << "SUTT TP track " << *t << "\t0x" << std::hex << bitmap << std::dec << std::endl;
1216
1217 if ( !addTrack( t ) ){
1218 delete t;
1219 return false;
1220 }
1221 return true;
1222
1223 }
1224 return false;
1225
1226
1227}
1228
1229
1231 // std::cout << "\t\t\tSUTT \tTrackContainer->size() = " << trigtracks->size() << std::endl;
1234 while ( trackitr!=trackend ) {
1235 selectTrack( *trackitr );
1236 ++trackitr;
1237 } // loop over tracks
1238}
1239
1240
1241
1246 // std::cout << "\t\t\tSUTT \tTrackContainer->size() = " << trigtracks->size() << std::endl;
1247 while ( trackitr!=trackend ) {
1248 selectTrack( *trackitr );
1249 ++trackitr;
1250 } // loop over tracks
1251}
1252
1253
1255 for( const auto& track : tracks ) selectTrack( *track );
1256}
1257
1258
1259
1260
1261
1262void TrigTrackSelector::correctToBeamline( double& z0, double& dz0,
1263 double& d0, double& dd0,
1264 double theta, double phi ) {
1265
1267
1268 // if ( m_first ) {
1269 // if ( m_xBeam==0 && m_yBeam==0 ) {
1270 // std::cerr << "TrigTrackSelector::correctToBeamline() WARNING -- Beamline set to (0,0) -- WARNING" << std::endl;
1271 // }
1272 // else {
1273 // std::cout << "TrigTrackSelector::correctToBeamline() Beamline set to " << m_xBeam << " " << m_yBeam << std::endl;
1274 // }
1275 // m_first = false;
1276 // }
1277
1278
1279 // double theta = 2*std::atan( exp( (-1)*eta ) );
1280 double z0t = z0 + ((std::cos(phi)*m_xBeam + std::sin(phi)*m_yBeam)/std::tan(theta));
1281 double a0t = d0 + std::sin(phi)*m_xBeam - std::cos(phi)*m_yBeam;
1282
1284 double dz0t = dz0 + ((std::cos(phi)*m_xBeam + std::sin(phi)*m_yBeam)/std::tan(theta));
1285 double da0t = dd0 + std::sin(phi)*m_xBeam - std::cos(phi)*m_yBeam;
1286
1287 z0 = z0t;
1288 d0 = a0t;
1289
1290 dz0 = dz0t;
1291 dd0 = da0t;
1292}
1293
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
Scalar theta() const
theta method
double charge(const T &p)
Definition AtlasPID.h:997
ATLAS-specific HepMC functions.
ReadCards * rp
DataVector< Trk::Track > TrackCollection
This typedef represents a collection of Trk::Track objects.
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
virtual bool addTrack(TIDA::Track *t, bool(*f)(const TIDA::Track *)=0)
const TrigInDetTrackTruth * truth(const TrigInDetTrack *p_trig_trk) const
const HepMcParticleLink * bestSiMatch() const
returns best match according to the number of hits
unsigned int nrMatches() const
returns number of matching particles
represents a LVL2 ID track
void setBeamline(double x, double y, double z=0)
const xAOD::TruthParticle * fromAncestor(const int pdg_id, const xAOD::TruthParticle *p) const
recursive functions to identify whether a particle comes from some particle of a specific PDG ID,...
bool selectTrack(const TrigInDetTrack *track, const TrigInDetTrackTruthMap *truthMap=0)
neater code to make use of vector function also for a single ancestor pdgid, instead of the full code...
double getBeamY() const
void truthBeamline(const xAOD::TruthParticleContainer *truthtracks, double &x0, double &y0)
extract all the tracks from a xAOD::TruthParticle collection and histogram the x and y production coo...
double getBeamX() const
TrigTrackSelector(TrackFilter *selector)
use a radius of 47 mm corresponding to the Run 1 pixel inner radius For the IBL it should be 32 mm,...
void selectTracks(const TrigInDetTrackCollection *trigtracks, const TrigInDetTrackTruthMap *truthMap=0)
TIDA::Track * makeTrack(HepMC::ConstGenParticlePtr track)
double getBeamZ() const
void correctToBeamline(double &z0, double &dz0, double &d0, double &dd0, double theta, double phi)
static const double s_default_radius
NB: This was 47 for Run 2, but with the addition of the IBL it should be 32 It was kept at 47 for all...
std::vector< ElementLink< xAOD::TrackParticleContainer > > TrackParticleLinks_t
Class to represent and store fit qualities from track reconstruction in terms of and number of degre...
Definition FitQuality.h:97
int numberDoF() const
returns the number of degrees of freedom of the overall track or vertex fit as integer
Definition FitQuality.h:60
double chiSquared() const
returns the of the overall track fit
Definition FitQuality.h:56
double eta() const
Access method for pseudorapidity - from momentum.
double charge() const
Returns the charge.
double pT() const
Access method for transverse momentum.
A summary of the information contained by a track.
double charge(int id) const
float z0() const
Returns the parameter.
float theta() const
Returns the parameter, which has range 0 to .
const ParametersCovMatrix_t definingParametersCovMatrix() const
Returns the 5x5 symmetric matrix containing the defining parameters covariance matrix.
float vz() const
The z origin for the parameters.
float d0() const
Returns the parameter.
float qOverP() const
Returns the parameter.
virtual double pt() const override final
The transverse momentum ( ) of the particle.
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
float phi0() const
Returns the parameter, which has range to .
virtual double pt() const override final
The transverse momentum ( ) of the particle.
const TruthVertex_v1 * prodVtx() const
The production vertex of this particle.
double charge() const
Physical charge.
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
virtual double phi() const override final
The azimuthal angle ( ) of the particle.
float z() const
Vertex longitudinal distance along the beam line form the origin.
float y() const
Vertex y displacement.
float x() const
Vertex x displacement.
Definition zbeam.h:24
double chi2(TH1 *h0, TH1 *h1)
constexpr int INVALID_PARTICLE_ID
int uniqueID(const T &p)
const GenParticle * ConstGenParticlePtr
Definition GenParticle.h:38
bool isElectron(const T &p)
bool isStable(const T &p)
Identify if the particle is stable, i.e. has not decayed.
bool isMuon(const T &p)
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
@ phi0
Definition ParamDefs.h:65
@ theta
Definition ParamDefs.h:66
@ qOverP
perigee
Definition ParamDefs.h:67
@ d0
Definition ParamDefs.h:63
@ z0
Definition ParamDefs.h:64
DetectorType
enumerates the various detector types currently accessible from the isHit() method.
@ numberOfPixelHits
number of pixel layers on track with absence of hits
@ numberOfBLayerHits
these are the hits in the 0th pixel layer?
@ numberOfTRTHighThresholdHits
total number of TRT hits which pass the high threshold
Perigee MeasuredPerigee
TrackParticle_v1 TrackParticle
Reference the current persistent version:
TruthParticle_v1 TruthParticle
Typedef to implementation.
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".
@ expectInnermostPixelLayerHit
Do we expect a 0th-layer barrel hit for this track?
@ numberOfPixelHoles
number of pixel layers on track with absence of hits [unit8_t].
@ numberOfTRTHits
number of TRT hits [unit8_t].
@ numberOfSCTHits
number of hits in SCT [unit8_t].
@ numberOfInnermostPixelLayerHits
these are the hits in the 0th pixel barrel layer
@ numberOfPixelHits
these are the pixel hits, including the b-layer [unit8_t].
@ numberOfTRTHighThresholdHits
number of TRT hits which pass the high threshold (only xenon counted) [unit8_t].
@ numberOfSCTHoles
number of SCT holes [unit8_t].
TruthParticleContainer_v1 TruthParticleContainer
Declare the latest version of the truth particle container.