ATLAS Offline Software
Loading...
Searching...
No Matches
TrackParticle_v1.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5// Misc includes
6#include <bitset>
7#include <cassert>
8#include <vector>
9#include <stdexcept>
10#include <atomic>
11#include <iostream>
12
13// EDM include(s):
15
16// Local include(s):
22
23
25
30 static std::atomic< bool > uninitCovarianceAccessPrinted = false;
31 if( ! uninitCovarianceAccessPrinted ) {
32 std::cout << "xAOD::TrackParticle WARNING Uninitialised covariance matrix was "
33 "accessed.\n"
34 " Debug it by breaking on "
35 "xAODTrackParticlePrivate::covarianceUnsetHook function calls!"
36 << std::endl;
37 uninitCovarianceAccessPrinted = true;
38 }
39 return;
40 }
41
42}
43
44
45namespace xAOD {
46
48 : IParticle() {
49 // perigeeParameters cache initialized to be empty (default constructor)
50 }
51
53 : IParticle( tp ) {
54 makePrivateStore( tp );
55 // perigeeParameters cache initialized to be empty (default constructor)
56 // assume that this copy will create new cache as needed
57 }
58
60 if(this == &tp) return *this;
61
62 if( ( ! hasStore() ) && ( ! container() ) ) {
64 }
65 this->IParticle::operator=( tp );
66#ifndef XAOD_ANALYSIS
67 // assume that this copy will create new cache as needed
68 m_perigeeParameters.reset();
69#endif // not XAOD_ANALYSIS
70 return *this;
71 }
72
74
75 double TrackParticle_v1::pt() const {
76 return genvecP4().Pt();
77 }
78
79 double TrackParticle_v1::eta() const {
80 return genvecP4().Eta();
81 }
82
84
86 // Codes using a fitter set a hypothesis, and the
87 // particular fitter that was employed..
88 // A mass is never set/stored.
89 //
90 // In the past we were returning the mass of a charged pion always
91 //
92 // This created a confusion on why TrackParticles created by
93 // specific lepton fitter have a pion mass (the leptons per se have the
94 // correct mass). Lets try to remedy this.
96 if (hypo == xAOD::electron) {
97 // Since GX2 also set sometimes the hypo to electron
98 // lets also check for GSF.
99 uint8_t fitter = trackFitter();
100 if (fitter == xAOD::GaussianSumFilter) {
102 }
103 }
104 if (hypo == xAOD::muon) {
106 }
107 // default charged pion
109 }
110
111 double TrackParticle_v1::e() const {
112 return genvecP4().E();
113 }
115 return genvecP4().Rapidity();
116 }
117
121
124 using namespace std;
125 float p = 10.e6; // 10 TeV (default value for very high pt muons, with qOverP==0)
126 if (fabs(qOverP())>0.) p = 1/fabs(qOverP());
127 float thetaT = theta();
128 float phiT = phi();
129 float sinTheta= sin(thetaT);
130 float px = p*sinTheta*cos(phiT);
131 float py = p*sinTheta*sin(phiT);
132 float pz = p*cos(thetaT);
133 float e = pow (m(),2) +
134 pow( px,2) + pow( py,2) + pow( pz,2);
135 p4.SetPxPyPzE( px, py, pz, sqrt(e) );
136 return p4;
137 }
138
139 Type::ObjectType TrackParticle_v1::type() const {
140 return Type::TrackParticle;
141 }
142
145 }
146
149
151
152 static const Accessor< float > acc( "phi" );
153 return acc( *this );
154 }
155
158
159 AUXSTORE_PRIMITIVE_SETTER_AND_GETTER(TrackParticle_v1, uint8_t, hasValidTime, setHasValidTime )
160
162 static const SG::AuxElement::Accessor< uint8_t > acc("hasValidTime");
163 if( !acc.isAvailable( *this) || !static_cast<bool>(hasValidTime()) ) throw std::runtime_error( "Unavailable TrackParticle time requested" );
164 static const SG::AuxElement::Accessor< float > accTime("time");
165 return accTime( *this );
166 }
167
169 static const SG::AuxElement::Accessor< uint8_t > acc("hasValidTime");
170 if( !acc.isAvailable( *this) || !static_cast<bool>(hasValidTime()) ) throw std::runtime_error( "Unavailable TrackParticle timeResolution requested" );
171 static const SG::AuxElement::Accessor< float > accTimeRes("timeResolution");
172 return accTimeRes( *this );
173 }
174
175 DefiningParameters_t TrackParticle_v1::definingParameters() const{
176 DefiningParameters_t tmp;
177 tmp << d0() , z0() , phi0() , theta() , qOverP();
178 return tmp;
179 }
180
181 void TrackParticle_v1::setDefiningParameters(float d0, float z0, float phi0, float theta, float qOverP) {
182#ifndef XAOD_ANALYSIS
183 // reset perigee cache if existing
184 if(m_perigeeParameters.isValid()) {
185 m_perigeeParameters.reset();
186 }
187#endif // not XAOD_ANALYSIS
188 static const Accessor< float > acc1( "d0" );
189 acc1( *this ) = d0;
190
191 static const Accessor< float > acc2( "z0" );
192 acc2( *this ) = z0;
193
194 static const Accessor< float > acc3( "phi" );
195 acc3( *this ) = phi0;
196
197 static const Accessor< float > acc4( "theta" );
198 acc4( *this ) = theta;
199
200 static const Accessor< float > acc5( "qOverP" );
201 acc5( *this ) = qOverP;
202
203 return;
204 }
205
206 void TrackParticle_v1::setDefiningParameters(float d0, float z0, float phi0, float theta, float qOverP, float time) {
208 setTime(time);
209 return;
210 }
211
213 static const SG::AuxElement::Accessor< float > acc("time");
214 acc( *this ) = time;
215 }
216
218 static const SG::AuxElement::Accessor< float > acc("timeResolution");
219 acc( *this ) = timeRes;
220 }
221
223 accCovMatrixDiag( "definingParametersCovMatrixDiag" );
225 accCovMatrixOffDiag( "definingParametersCovMatrixOffDiag" );
226
227 void TrackParticle_v1::setDefiningParametersCovMatrix(const xAOD::ParametersCovMatrix_t& cov){
228
229#ifndef XAOD_ANALYSIS
230 // reset perigee cache if existing
231 if(m_perigeeParameters.isValid()) {
232 m_perigeeParameters.reset();
233 }
234#endif // not XAOD_ANALYSIS
235
236 // Extract the diagonal elements from the matrix.
237 std::vector< float > diagVec;
238 diagVec.reserve( cov.rows() );
239 for( int i = 0; i < cov.rows(); ++i ) {
240 diagVec.push_back( cov( i, i ) );
241 }
242 // Set the variable.
244
245 // Extract the off-diagonal elements from the matrix.
246 std::vector< float > offDiagVec;
247 offDiagVec.reserve( ( ( cov.rows() - 1 ) * cov.rows() ) / 2 );
248 for( int i = 1; i < cov.rows(); ++i ) {
249 for( int j = 0; j < i; ++j ) {
250 float offDiagCoeff = (cov( i, i )>0 && cov( j, j )>0) ? cov( i, j )/sqrt(cov( i, i )*cov( j, j )) : 0;
251 offDiagVec.push_back( offDiagCoeff );
252 }
253 }
254 // Set the variable.
256
257 return;
258 }
259
260 const xAOD::ParametersCovMatrix_t TrackParticle_v1::definingParametersCovMatrix() const {
261
262 std::span<const float> covMatrixDiag;
263 if( accCovMatrixDiag.isAvailable( *this ))
264 covMatrixDiag = std::span<const float>( accCovMatrixDiag( *this ) );
265 std::span<const float> covMatrixOffDiag;
266 if( accCovMatrixOffDiag.isAvailable( *this ))
267 covMatrixOffDiag = std::span<const float>( accCovMatrixOffDiag( *this ) );
268 bool valid = true;
269 auto result = TrackingDetails::definingParametersCovMatrix( covMatrixDiag, covMatrixOffDiag, valid );
271 return result;
272 }
273
275
276 // Create the result matrix.
278 result.setZero();
279
280 // Check if the diagonal elements are available.
281 if( accCovMatrixDiag.isAvailable( *this ) &&
282 ( static_cast< int >( accCovMatrixDiag( *this ).size() ) == result.rows() ) ) {
283
284 result.setIdentity();
285 }
286
287 bool offDiagCompr = definingParametersCovMatrixOffDiagCompr();
288
289 if(!offDiagCompr){
290
291 // Check if the off-diagonal elements are available.
292 if( accCovMatrixOffDiag.isAvailable( *this ) &&
293 ( static_cast< int >( accCovMatrixOffDiag( *this ).size() ) ==
294 ( ( result.rows() * ( result.rows() - 1 ) ) / 2 ) ) ) {
295
296 for( int i = 1; i < result.rows(); ++i ) {
297 for( int j = 0; j < i; ++j ) {
298 result.fillSymmetric( i, j, true );
299 }
300 }
301 }
302
303 }
304
305 else{
306
307 if( accCovMatrixOffDiag.isAvailable( *this ) &&
308 ( static_cast< int >( accCovMatrixOffDiag( *this ).size() ) == COVMATRIX_OFFDIAG_VEC_COMPR_SIZE ) ){
309
310 const covMatrixIndexPairVec& vecPairIndex = covMatrixComprIndexPairs();
311
312 for(const auto& pairIndex : vecPairIndex){
313 covMatrixIndex i = pairIndex.first;
314 covMatrixIndex j = pairIndex.second;
315 result.fillSymmetric( i, j, true );
316 }
317
318 }
319
320 }
321
322 // Return the object.
323 return result;
324 }
325
326 const std::vector< float >& TrackParticle_v1::definingParametersCovMatrixDiagVec() const {
327
328 return accCovMatrixDiag( *this );
329 }
330
332
333 return accCovMatrixOffDiag( *this );
334 }
335
337
338 std::vector< float > vec;
340 Amg::compress(cov,vec);
341 return vec;
342
343 }
344
346
347 if (vec.size() != ParametersCovMatrix_t::RowsAtCompileTime) {
348 throw std::runtime_error(
349 "Setting track definingParametersCovMatrixDiag with vector of size " +
350 std::to_string(vec.size()) + " instead of expected " +
351 std::to_string(ParametersCovMatrix_t::RowsAtCompileTime) +
352 " is not supported");
353 }
354
355 accCovMatrixDiag( *this ) = vec;
356 return;
357 }
358
360
361 bool offDiagCompr = definingParametersCovMatrixOffDiagCompr();
362
363 unsigned int uncompr_size = ( ( ( ParametersCovMatrix_t::RowsAtCompileTime - 1 ) *
364 ParametersCovMatrix_t::RowsAtCompileTime ) / 2 );
365 unsigned int size = offDiagCompr ? COVMATRIX_OFFDIAG_VEC_COMPR_SIZE : uncompr_size;
366
367 if( !(vec.size() == size || vec.size() == uncompr_size) ){ //If off-diagonal elements are already compressed, can either set with uncompressed or compressed vector
368 throw std::runtime_error(
369 "Setting track definingParametersCovMatrixOffDiag with vector of "
370 "size " +
371 std::to_string(vec.size()) + " instead of expected " +
372 std::to_string(size) + " or " + std::to_string(uncompr_size) +
373 " is not supported");
374 }
375
376 accCovMatrixOffDiag( *this ) = vec;
377 return;
378 }
379
381
382 std::span<const float> covMatrixOffDiag;
383 if( accCovMatrixOffDiag.isAvailable( *this ))
384 covMatrixOffDiag = std::span<const float>( accCovMatrixOffDiag( *this ) );
386 }
387
389
390 ParametersCovMatrix_t cov = definingParametersCovMatrix();
391 std::vector< float > offDiagVecCompr;
392 offDiagVecCompr.resize(COVMATRIX_OFFDIAG_VEC_COMPR_SIZE);
393
394 const covMatrixIndexPairVec& vecPairIndex = covMatrixComprIndexPairs();
395
396 for(unsigned int k=0; k<COVMATRIX_OFFDIAG_VEC_COMPR_SIZE; ++k){
397 std::pair<covMatrixIndex,covMatrixIndex> pairIndex = vecPairIndex[k];
398 covMatrixIndex i = pairIndex.first;
399 covMatrixIndex j = pairIndex.second;
400 float offDiagElement = cov(i,i)>0 && cov(j,j)>0 ? cov(i,j)/sqrt(cov(i,i)*cov(j,j)) : 0;
401 offDiagVecCompr[k] = offDiagElement;
402 }
403
404 accCovMatrixOffDiag( *this ) = offDiagVecCompr;
405 return;
406
407 }
408
409
410 //Old schema compatibility
411
412 void TrackParticle_v1::setDefiningParametersCovMatrixVec(const std::vector<float>& cov){
413
414 xAOD::ParametersCovMatrix_t covMatrix;
415 if( !cov.empty() ) Amg::expand( cov.begin(), cov.end(),covMatrix );
416 else covMatrix.setIdentity();
418
419 }
420
424
425 void TrackParticle_v1::setParametersOrigin(float x, float y, float z){
426 static const Accessor< float > acc1( "vx" );
427 acc1( *this ) = x;
428
429 static const Accessor< float > acc2( "vy" );
430 acc2( *this ) = y;
431
432 static const Accessor< float > acc3( "vz" );
433 acc3( *this ) = z;
434 }
435
436#ifndef XAOD_ANALYSIS
438
439 // Require the cache to be valid and check if the cached pointer has been set
440 if(m_perigeeParameters.isValid()){
441 return *(m_perigeeParameters.ptr());
442 }
443 static const Accessor< float > acc1( "d0" );
444 static const Accessor< float > acc2( "z0" );
445 static const Accessor< float > acc3( "phi" );
446 static const Accessor< float > acc4( "theta" );
447 static const Accessor< float > acc5( "qOverP" );
448 static const Accessor< std::vector<float> > acc6( "definingParametersCovMatrix" );
449 ParametersCovMatrix_t cov = ParametersCovMatrix_t(definingParametersCovMatrix());
450 static const Accessor< float > acc7( "beamlineTiltX" );
451 static const Accessor< float > acc8( "beamlineTiltY" );
452
453 if(!acc7.isAvailable( *this ) || !acc8.isAvailable( *this )){
454 Trk::Perigee tmpPerigeeParameters(
455 acc1(*this),
456 acc2(*this),
457 acc3(*this),
458 acc4(*this),
459 acc5(*this),
461 std::move(cov));
462 m_perigeeParameters.set(tmpPerigeeParameters);
463 return *(m_perigeeParameters.ptr());
464 }
465
466 Amg::Translation3D amgtranslation(vx(),vy(),vz());
467 Amg::Transform3D pAmgTransf = amgtranslation * Amg::RotationMatrix3D::Identity();
468 pAmgTransf *= Amg::AngleAxis3D(acc8(*this), Amg::Vector3D(0.,1.,0.));
469 pAmgTransf *= Amg::AngleAxis3D(acc7(*this), Amg::Vector3D(1.,0.,0.));
470 Trk::Perigee tmpPerigeeParameters(acc1(*this),
471 acc2(*this),
472 acc3(*this),
473 acc4(*this),
474 acc5(*this),
475 pAmgTransf,
476 std::move(cov));
477
478 m_perigeeParameters.set(tmpPerigeeParameters);
479 return *(m_perigeeParameters.ptr());
480 }
481#endif // not XAOD_ANALYSIS
482
485
487 static const Accessor< float > acc1( "chiSquared" );
488 acc1( *this ) = chiSquared;
489 static const Accessor< float > acc2( "numberDoF" );
490 acc2( *this ) = numberDoF;
491 }
492
493 AUXSTORE_PRIMITIVE_SETTER_AND_GETTER(TrackParticle_v1, float, radiusOfFirstHit, setRadiusOfFirstHit)
494 AUXSTORE_PRIMITIVE_SETTER_AND_GETTER(TrackParticle_v1, uint64_t, identifierOfFirstHit, setIdentifierOfFirstHit)
495
496 AUXSTORE_PRIMITIVE_SETTER_AND_GETTER(TrackParticle_v1, float, beamlineTiltX, setBeamlineTiltX)
497 AUXSTORE_PRIMITIVE_SETTER_AND_GETTER(TrackParticle_v1, float, beamlineTiltY, setBeamlineTiltY)
498
500
501 AUXSTORE_PRIMITIVE_SETTER_AND_GETTER(TrackParticle_v1, uint8_t,numberOfUsedHitsdEdx ,setNumberOfUsedHitsdEdx )
502
503 AUXSTORE_PRIMITIVE_SETTER_AND_GETTER(TrackParticle_v1, uint8_t,numberOfIBLOverflowsdEdx , setNumberOfIBLOverflowsdEdx)
504
507 static const Accessor< std::vector<uint8_t> > acc( "parameterPosition" );
508 if(! acc.isAvailable( *this )) return 0;
509 return acc(*this).size();
510 }
511
512 const CurvilinearParameters_t TrackParticle_v1::trackParameters(unsigned int index) const{
513 CurvilinearParameters_t tmp;
516 return tmp;
517 }
518
519 void TrackParticle_v1::setTrackParameters(std::vector<std::vector<float> >& parameters){
520 static const Accessor< std::vector < float > > acc1( "parameterX" );
521 static const Accessor< std::vector < float > > acc2( "parameterY" );
522 static const Accessor< std::vector < float > > acc3( "parameterZ" );
523 static const Accessor< std::vector < float > > acc4( "parameterPX" );
524 static const Accessor< std::vector < float > > acc5( "parameterPY" );
525 static const Accessor< std::vector < float > > acc6( "parameterPZ" );
526 static const Accessor< std::vector<uint8_t> > acc7( "parameterPosition" );
527
528 acc1(*this).resize(parameters.size());
529 acc2(*this).resize(parameters.size());
530 acc3(*this).resize(parameters.size());
531 acc4(*this).resize(parameters.size());
532 acc5(*this).resize(parameters.size());
533 acc6(*this).resize(parameters.size());
534 acc7(*this).resize(parameters.size());
535
536 unsigned int index=0;
537 std::vector<std::vector<float> >::const_iterator it=parameters.begin(), itEnd=parameters.end();
538 for (;it!=itEnd;++it,++index){
539 assert((*it).size()==6);
540 acc1(*this).at(index)=(*it).at(0);
541 acc2(*this).at(index)=(*it).at(1);
542 acc3(*this).at(index)=(*it).at(2);
543 acc4(*this).at(index)=(*it).at(3);
544 acc5(*this).at(index)=(*it).at(4);
545 acc6(*this).at(index)=(*it).at(5);
546 }
547 }
548
549 float TrackParticle_v1::parameterX(unsigned int index) const {
550 static const Accessor< std::vector<float> > acc( "parameterX" );
551 return acc(*this).at(index);
552 }
553
554 float TrackParticle_v1::parameterY(unsigned int index) const {
555 static const Accessor< std::vector<float> > acc( "parameterY" );
556 return acc(*this).at(index);
557 }
558
559 float TrackParticle_v1::parameterZ(unsigned int index) const {
560 static const Accessor< std::vector<float> > acc( "parameterZ" );
561 return acc(*this).at(index);
562 }
563
564 float TrackParticle_v1::parameterPX(unsigned int index) const {
565 static const Accessor< std::vector<float> > acc( "parameterPX" );
566 return acc(*this).at(index);
567 }
568
569 float TrackParticle_v1::parameterPY(unsigned int index) const {
570 static const Accessor< std::vector<float> > acc( "parameterPY" );
571 return acc(*this).at(index);
572 }
573
574 float TrackParticle_v1::parameterPZ(unsigned int index) const {
575 static const Accessor< std::vector<float> > acc( "parameterPZ" );
576 return acc(*this).at(index);
577 }
578
579 xAOD::ParametersCovMatrix_t TrackParticle_v1::trackParameterCovarianceMatrix(unsigned int index) const
580 {
581 static const Accessor< std::vector<float> > acc( "trackParameterCovarianceMatrices" );
582 unsigned int offset = index*15;
583 // copy the correct values into the temp matrix
584 xAOD::ParametersCovMatrix_t tmp;
585 std::vector<float>::const_iterator it = acc(*this).begin()+offset;
586 Amg::expand(it,it+15,tmp);
587 return tmp;
588 }
589
590 void TrackParticle_v1::setTrackParameterCovarianceMatrix(unsigned int index, std::vector<float>& cov){
591 assert(cov.size()==15);
592 unsigned int offset = index*15;
593 static const Accessor< std::vector < float > > acc( "trackParameterCovarianceMatrices" );
594 std::vector<float>& v = acc(*this);
595 v.resize(offset+15);
596 std::copy(cov.begin(),cov.end(),v.begin()+offset );
597 }
598
600 {
601 static const Accessor< std::vector<uint8_t> > acc( "parameterPosition" );
602 return static_cast<xAOD::ParameterPosition>(acc(*this).at(index));
603 }
604
606 {
607 size_t maxParameters = numberOfParameters();
608 bool foundParameters=false;
609 for (size_t i=0; i<maxParameters; ++i){
610 if (parameterPosition(i)==position){
611 foundParameters=true;
612 index=i;
613 break;
614 }
615 }
616 return foundParameters;
617 }
618
620 static const Accessor< std::vector<uint8_t> > acc( "parameterPosition" );
621 acc( *this ).at(index) = static_cast<uint8_t>(pos);
622 }
623
624#ifndef XAOD_ANALYSIS
626
627 static const Accessor< std::vector<float> > acc( "trackParameterCovarianceMatrices" );
628 unsigned int offset = index*15;
629 // copy the correct values into the temp matrix
630 ParametersCovMatrix_t cov;
631 auto it = acc(*this).begin()+offset;
632 Amg::expand(it,it+15,cov);
633 // retrieve the parameters to build the curvilinear frame
636 Trk::CurvilinearParameters param(pos,mom,charge(),std::move(cov));
637
638 return param;
639 }
640#endif // not XAOD_ANALYSIS
641
644
646 static const Accessor<uint8_t> acc("trackFitter");
647 acc(*this) = static_cast<uint8_t>(value);
648 }
649
651 static const Accessor<uint8_t> acc("trackFitter");
652 if (!acc.isAvailable(*this)) {
654 }
655 return static_cast<xAOD::TrackFitter>(acc(*this));
656 }
657
658 std::bitset<xAOD::NumberOfTrackRecoInfo> TrackParticle_v1::patternRecoInfo()
659 const {
660 static const Accessor< uint64_t > acc( "patternRecoInfo" );
661 std::bitset<xAOD::NumberOfTrackRecoInfo> tmp(acc(*this));
662 return tmp;
663 }
664
666 static const Accessor< uint64_t > acc( "patternRecoInfo" );
667 acc( *this ) = patternReco;
668 }
669
670 void TrackParticle_v1::setPatternRecognitionInfo(const std::bitset<xAOD::NumberOfTrackRecoInfo>& patternReco) {
671 static const Accessor< uint64_t > acc( "patternRecoInfo" );
672 acc( *this ) = patternReco.to_ullong();
673 }
674
676 static const Accessor<uint8_t> acc("particleHypothesis");
677 acc(*this) = static_cast<uint8_t>(value);
678 }
679
681 static const Accessor<uint8_t> acc("particleHypothesis");
682 if (!acc.isAvailable(*this)) {
683 return xAOD::pion;
684 }
685 return static_cast<xAOD::ParticleHypothesis>(acc(*this));
686 }
687
688 bool TrackParticle_v1::summaryValue(uint8_t& value, const SummaryType &information) const {
690 if( ( ! acc ) || ( ! acc->isAvailable( *this ) ) ) return false;
691 // Retrieve the value:
692 value = ( *acc )( *this );
693 return true;
694 }
695
696 bool TrackParticle_v1::summaryValue(float& value, const SummaryType &information) const {
698 if( ( ! acc ) || ( ! acc->isAvailable( *this ) ) ) return false;
699 // Retrieve the value:
700 value = ( *acc )( *this );
701 return true;
702 }
703
704 void TrackParticle_v1::setSummaryValue(uint8_t& value, const SummaryType &information){
706 // Set the value:
707 ( *acc )( *this ) = value;
708 }
709
710 void TrackParticle_v1::setSummaryValue(float& value, const SummaryType &information){
712 // Set the value:
713 ( *acc )( *this ) = value;
714 }
715
721
722
723#ifndef XAOD_ANALYSIS
731
732 // The accessor:
733 static const ConstAccessor< ElementLink< TrackCollection > > acc( "trackLink" );
734
735 // Check if one of them is available:
736 if( acc.isAvailable( *this ) ) {
737 return acc( *this );
738 }
739
740 // If no Trk::Track link was not set (yet), return a dummy object:
741 static const ElementLink< TrackCollection > dummy;
742 return dummy;
743 }
744
747
748 // The accessor:
749 static const Accessor< ElementLink< TrackCollection > > acc( "trackLink" );
750
751 // Do the deed:
752 acc( *this ) = el;
753 return;
754 }
755
757
758 // The accessor:
759 static const ConstAccessor< ElementLink< TrackCollection > > acc( "trackLink" );
760
761 if( ! acc.isAvailable( *this ) ) {
762 return nullptr;
763 }
764 if( ! acc( *this ).isValid() ) {
765 return nullptr;
766 }
767
768 return *( acc( *this ) );
769 }
770#endif // not XAOD_ANALYSIS
771
773#ifndef XAOD_ANALYSIS
774 m_perigeeParameters.reset();
775#endif // not XAOD_ANALYSIS
776 }
777
778} // namespace xAOD
Scalar theta() const
theta method
#define AUXSTORE_PRIMITIVE_GETTER_WITH_CAST(CL, PERSTYPE, TRANSTYPE, NAME)
Macro creating a getter function with a type conversion.
#define AUXSTORE_PRIMITIVE_SETTER_WITH_CAST(CL, PERSTYPE, TRANSTYPE, NAME, SETTER)
Macro creating a setter function with a type conversion.
#define AUXSTORE_PRIMITIVE_GETTER(CL, TYPE, NAME)
Macro creating the reader function for a primitive auxiliary property.
#define AUXSTORE_PRIMITIVE_SETTER_AND_GETTER(CL, TYPE, NAME, SETTER)
Macro creating the accessors of primitive auxiliary properties.
std::vector< size_t > vec
#define AmgSymMatrix(dim)
A number of constexpr particle constants to avoid hardcoding them directly in various places.
Helper functions for TrackingDetails accessors.
#define y
#define x
#define z
void makePrivateStore()
Create a new (empty) private store for this object.
SG::ConstAccessor< T, ALLOC > ConstAccessor
Definition AuxElement.h:570
bool hasStore() const
Return true if this object has an associated store.
SG::Accessor< T, ALLOC > Accessor
Definition AuxElement.h:573
const SG::AuxVectorData * container() const
Return the container holding this element.
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
Class describing the Line to which the Perigee refers to.
IParticle & operator=(const IParticle &)=default
IParticle()=default
SG::Accessor< T, ALLOC > Accessor
Definition AuxElement.h:573
Class describing a TrackParticle.
void setTrackParameterCovarianceMatrix(unsigned int index, std::vector< float > &cov)
Set the cov matrix of the parameter at 'index', using a vector of floats.
void setDefiningParametersCovMatrix(const ParametersCovMatrix_t &cov)
Set the defining parameters covariance matrix.
float z0() const
Returns the parameter.
void setTrackParameters(std::vector< std::vector< float > > &parameters)
Set the parameters via the passed vector of vectors.
float timeResolution() const
Returns the time resolution.
const std::vector< float > & definingParametersCovMatrixDiagVec() const
Returns the diagonal elements of the defining parameters covariance matrix.
TrackingDetails::covMatrixIndex covMatrixIndex
float vx() const
The x origin for the parameters.
void setTrackLink(const ElementLink< TrackCollection > &track)
Set the link to the original track.
const ElementLink< TrackCollection > & trackLink() const
Returns a link (which can be invalid) to the Trk::Track which was used to make this TrackParticle.
float theta() const
Returns the parameter, which has range 0 to .
float numberDoF() const
Returns the number of degrees of freedom of the overall track or vertex fit as float.
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzM4D< double > > GenVecFourMom_t
Base 4 Momentum type for TrackParticle.
DefiningParameters_t definingParameters() const
Returns a SVector of the Perigee track parameters.
void setDefiningParametersCovMatrixOffDiagVec(const std::vector< float > &vec)
Set the off-diagonal elements of the defining parameters covariance matrix.
bool definingParametersCovMatrixOffDiagCompr() const
float time() const
Returns the time.
void resetCache()
Reset the internal cache of the object.
virtual double m() const override final
The invariant mass of the particle..
TrackParticle_v1 & operator=(const TrackParticle_v1 &tp)
Assignment operator. This can involve creating and copying an Auxilary store, and so should be used s...
void setTimeResolution(float timeResolution)
bool indexOfParameterAtPosition(unsigned int &index, ParameterPosition position) const
Function to determine if this TrackParticle contains track parameters at a certain position,...
virtual FourMom_t p4() const override final
The full 4-momentum of the particle.
void compressDefiningParametersCovMatrixOffDiag()
Delete some off-diagonal elements for compression.
const Trk::Perigee & perigeeParameters() const
Returns the Trk::MeasuredPerigee track parameters.
static const covMatrixIndexPairVec & covMatrixComprIndexPairs()
const Trk::Track * track() const
Returns a pointer (which can be NULL) to the Trk::Track which was used to make this TrackParticle.
void setParameterPosition(unsigned int index, ParameterPosition pos)
Set the 'position' (i.e. where it is in ATLAS) of the parameter at 'index', using the ParameterPositi...
float parameterPX(unsigned int index) const
Returns the parameter x momentum component, for 'index'.
IParticle::FourMom_t FourMom_t
Definition of the 4-momentum type.
float parameterX(unsigned int index) const
Returns the parameter x position, for 'index'.
const Trk::CurvilinearParameters curvilinearParameters(unsigned int index) const
Returns a curvilinear representation of the parameters at 'index'.
virtual double phi() const override final
The azimuthal angle ( ) of the particle (has range to .)
const ParametersCovMatrix_t definingParametersCovMatrix() const
Returns the 5x5 symmetric matrix containing the defining parameters covariance matrix.
float parameterPY(unsigned int index) const
Returns the parameter y momentum component, for 'index'.
const CurvilinearParameters_t trackParameters(unsigned int index) const
Returns the track parameter vector at 'index'.
float vz() const
The z origin for the parameters.
void setFitQuality(float chiSquared, float numberDoF)
Set the 'Fit Quality' information.
uint8_t hasValidTime() const
Returns whether or not the track has a valid time.
std::bitset< NumberOfTrackRecoInfo > patternRecoInfo() const
Access method for pattern recognition algorithm.
virtual double rapidity() const override final
The true rapidity (y) of the particle.
ParametersCovMatrix_t trackParameterCovarianceMatrix(unsigned int index) const
Returns the TrackParticleCovMatrix_t (covariance matrix) at 'index', which corresponds to the paramet...
void setParametersOrigin(float x, float y, float z)
Set the origin for the parameters.
float parameterZ(unsigned int index) const
Returns the parameter z position, for 'index'.
CxxUtils::CachedValue< Trk::Perigee > m_perigeeParameters
Cached MeasuredPerigee, built from this object.
float vy() const
The y origin for the parameters.
xAOD::ParameterPosition parameterPosition(unsigned int index) const
Return the ParameterPosition of the parameters at 'index'.
float d0() const
Returns the parameter.
void setDefiningParameters(float d0, float z0, float phi0, float theta, float qOverP)
Set the defining parameters.
bool summaryValue(uint8_t &value, const SummaryType &information) const
Accessor for TrackSummary values.
void setDefiningParametersCovMatrixDiagVec(const std::vector< float > &vec)
Set the defining parameters covariance matrix using a length 15 vector.
void setParticleHypothesis(const ParticleHypothesis hypo)
Method for setting the particle type, using the ParticleHypothesis enum.
size_t numberOfParameters() const
Returns the number of additional parameters stored in the TrackParticle.
float qOverP() const
Returns the parameter.
std::vector< float > definingParametersCovMatrixVec() const
Returns the length 6 vector containing the elements of defining parameters covariance matrix.
virtual Type::ObjectType type() const override final
The type of the object as a simple enumeration.
virtual double pt() const override final
The transverse momentum ( ) of the particle.
float parameterY(unsigned int index) const
Returns the parameter y position, for 'index'.
GenVecFourMom_t genvecP4() const
The full 4-momentum of the particle : GenVector form.
float chiSquared() const
Returns the of the overall track fit.
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
void setSummaryValue(uint8_t &value, const SummaryType &information)
Set method for TrackSummary values.
static const std::size_t COVMATRIX_OFFDIAG_VEC_COMPR_SIZE
ParametersCovMatrixFilled_t definingParametersCovMatrixFilled() const
Returns a 5x5 matrix describing which elements of the covariance matrix are known.
void setTrackFitter(const TrackFitter fitter)
Method for setting the fitter, using the TrackFitter enum.
void setPatternRecognitionInfo(const std::bitset< xAOD::NumberOfTrackRecoInfo > &patternReco)
Method setting the pattern recognition algorithm, using a bitset.
float charge() const
Returns the charge.
TrackParticle_v1()
Default constructor.
TrackFitter trackFitter() const
Returns the fitter.
const std::vector< float > & definingParametersCovMatrixOffDiagVec() const
Returns the correlation coefficient associated with the off-diagonal elements of the covariance matri...
std::vector< std::pair< covMatrixIndex, covMatrixIndex > > covMatrixIndexPairVec
ParticleHypothesis particleHypothesis() const
Returns the particle hypothesis used for Track fitting.
float phi0() const
Returns the parameter, which has range to .
void setDefiningParametersCovMatrixVec(const std::vector< float > &cov)
float parameterPZ(unsigned int index) const
Returns the parameter z momentum component, for 'index'.
virtual double e() const override final
The total energy of the particle.
Eigen::AngleAxisd AngleAxis3D
void compress(const AmgSymMatrix(N) &covMatrix, std::vector< float > &vec)
void expand(std::vector< float >::const_iterator it, std::vector< float >::const_iterator, AmgSymMatrix(N) &covMatrix)
Eigen::Affine3d Transform3D
Eigen::Matrix< double, 3, 1 > Vector3D
Eigen::Translation< double, 3 > Translation3D
constexpr double muonMassInMeV
the mass of the muon (in MeV)
constexpr double chargedPionMassInMeV
the mass of the charged pion (in MeV)
constexpr double electronMassInMeV
the mass of the electron (in MeV)
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
CurvilinearParametersT< TrackParametersDim, Charged, PlaneSurface > CurvilinearParameters
Definition index.py:1
STL namespace.
void covarianceUnsetHook()
Function that would be possible to use to debug what client is trying to access covariance matrix fro...
GenVecFourMom_t genvecP4(float qOverP, float thetaT, float phiT, double m)
bool definingParametersCovMatrixOffDiagCompr(std::span< const float > covMatrixOffDiag)
xAOD::ParametersCovMatrix_t definingParametersCovMatrix(std::span< const float > covMatrixDiag, std::span< const float > covMatrixOffDiag, bool &valid)
float charge(float qOverP)
constexpr std::array< std::pair< covMatrixIndex, covMatrixIndex >, COVMATRIX_OFFDIAG_VEC_COMPR_SIZE > covMatrixComprIndexPairs
ICaloAffectedTool is abstract interface for tools checking if 4 mom is in calo affected region.
static const SG::AuxElement::Accessor< std::vector< float > > accCovMatrixOffDiag("definingParametersCovMatrixOffDiag")
Eigen::Matrix< bool, 5, 5, 0, 5, 5 > ParametersCovMatrixFilled_t
const SG::AuxElement::Accessor< float > * trackSummaryAccessorV1< float >(xAOD::SummaryType type)
const SG::AuxElement::Accessor< uint8_t > * trackSummaryAccessorV1< uint8_t >(xAOD::SummaryType type)
TrackFitter
Enums to identify who created this track and which properties does it have.
@ NumberOfTrackFitters
maximum number of enums
@ GaussianSumFilter
Tracks from Gaussian Sum Filter.
static const SG::AuxElement::Accessor< ElementLink< IParticleContainer > > acc("originalObjectLink")
Object used for setting/getting the dynamic decoration in question.
SummaryType
Enumerates the different types of information stored in Summary.
setEventNumber uint32_t
ParameterPosition
Enum allowing us to know where in ATLAS the parameters are defined.
static const SG::AuxElement::Accessor< std::vector< float > > accCovMatrixDiag("definingParametersCovMatrixDiag")