ATLAS Offline Software
Loading...
Searching...
No Matches
ConstrainedTrackProvider.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5
12
13
14#include "TFile.h"
15#include "TH2F.h"
16
17
18namespace Trk {
19
20 //________________________________________________________________________
22 const std::string& name,
23 const IInterface* parent)
24 : AthAlgTool(type,name,parent)
25 {
26 declareInterface<ITrackCollectionProvider>(this);
27 }
28
29 //________________________________________________________________________
31 {
32 // configure main track fitter
33 if(m_trackFitter.retrieve().isFailure()) {
34 msg(MSG::FATAL) << "Could not get " << m_trackFitter << endmsg;
35 return StatusCode::FAILURE;
36 }
37 ATH_MSG_INFO("Retrieved " << m_trackFitter);
38
39
40 ATH_MSG_INFO( "init m_useConstraintError " <<m_useConstraintError );
41
42 ATH_MSG_INFO( "Init m_reduceConstraintUncertainty " << m_reduceConstraintUncertainty );
43
44 ATH_MSG_INFO( "Init m_reduceConstraintUncert_z0 " << m_reduceConstraintUncert_z0 );
45
47
48 m_constraintInputFile_P = new TFile(m_constraintFileName_P.value().c_str(), "read");
49 if ( m_constraintInputFile_P->IsZombie() || !(m_constraintInputFile_P->IsOpen()) ) {
50 ATH_MSG_FATAL( " Problem reading TFile " << m_constraintFileName_P );
51 return StatusCode::FAILURE;
52 }
53 ATH_MSG_INFO("Opened file containing the deltaSagitta constraints" << m_constraintFileName_P);
54 m_etaphiMap_P = static_cast<TH2F*>(m_constraintInputFile_P->Get(m_constraintHistName_P.value().c_str()));
55 if(!m_etaphiMap_P){
56 ATH_MSG_FATAL( " Problem getting constraints Hist. Name " << m_constraintHistName_P );
59 return StatusCode::FAILURE;
60 }
61 ATH_MSG_INFO("Opened constraints histogram " << m_constraintHistName_P);
62
63 }
64
65 if(m_CorrectD0){
66
67 m_constraintInputFile_d0 = new TFile(m_constraintFileName_d0.value().c_str(), "read");
68 if ( m_constraintInputFile_d0->IsZombie() || !(m_constraintInputFile_d0->IsOpen()) ) {
69 ATH_MSG_FATAL( " Problem reading TFile " << m_constraintFileName_d0 );
70 return StatusCode::FAILURE;
71 }
72 ATH_MSG_INFO("Opened file containing the d0 constraints" << m_constraintFileName_d0);
73 m_etaphiMap_d0 = static_cast<TH2F*>(m_constraintInputFile_d0->Get(m_constraintHistName_d0.value().c_str()));
74 if(!m_etaphiMap_d0){
75 ATH_MSG_FATAL( " Problem getting constraints Hist. Name " << m_constraintHistName_d0 );
78 return StatusCode::FAILURE;
79 }
80 ATH_MSG_INFO("Opened constraints histogram " << m_constraintHistName_d0);
81
82 }
83
84 if(m_CorrectZ0){
85
86 m_constraintInputFile_z0 = new TFile(m_constraintFileName_z0.value().c_str(),"read");
87 if ( m_constraintInputFile_z0->IsZombie() || !(m_constraintInputFile_z0->IsOpen()) ) {
88 ATH_MSG_FATAL( " Problem reading TFile " << m_constraintFileName_z0 );
89 return StatusCode::FAILURE;
90 }
91 ATH_MSG_INFO("Opened file containing the z0 constraints" << m_constraintFileName_z0);
92 m_etaphiMap_z0 = static_cast<TH2F*>(m_constraintInputFile_z0->Get(m_constraintHistName_z0.value().c_str()));
93 if(!m_etaphiMap_z0){
94 ATH_MSG_FATAL( " Problem getting constraints Hist. Name " << m_constraintHistName_z0 );
97 return StatusCode::FAILURE;
98 }
99 ATH_MSG_INFO("Opened constraints histogram " << m_constraintHistName_z0);
100
101 }
102
103 ATH_CHECK( m_inputKey.initialize() );
104 ATH_CHECK( m_outputKey.initialize() );
105
106 return StatusCode::SUCCESS;
107 }
108
109
110
111
112
113 //________________________________________________________________________
115 {
119 }
120
124 }
125
129 }
130
131 return StatusCode::SUCCESS;
132 }
133
134
136 {
138 if (!originalTracks.isValid()) {
139 ATH_MSG_WARNING(" Can't retrieve " << m_inputKey);
140 finalTracks = nullptr; // return empty collection
141 return StatusCode::FAILURE;
142 }
143
145 ATH_CHECK(trackCollection.record(std::make_unique<TrackCollection>()));
146 if (!trackCollection.isValid()) {
147 ATH_MSG_ERROR("Could not record output TrackCollection " << trackCollection.name() << " to store " << trackCollection.store());
148 return StatusCode::FAILURE;
149 }
150
151 ATH_MSG_DEBUG("Input track collection size: " << originalTracks->size());
152
153 int trackCount = 0;
154 for (const Trk::Track* track : *originalTracks) {
155 trackCount++;
156 ATH_MSG_DEBUG("Dealing with track: " << trackCount << " / " << originalTracks->size());
157
158 bool acceptedTrack = true;
159 if (m_doTrackSelection) acceptedTrack = passTrackSelection( track );
160
161 if( acceptedTrack ){
162 ATH_MSG_DEBUG("Track selection OK for track: " << trackCount);
163 const Trk::Perigee* measuredPerigee = track->perigeeParameters();
164 if(!measuredPerigee){
165 ATH_MSG_DEBUG(" no measuredPerigee");
166 continue;
167 }
168
169 if(!(measuredPerigee->covariance()) ){
170 ATH_MSG_DEBUG(" no measuredPerigee");
171 continue;
172 }
173
174 const Trk::Surface* surf = dynamic_cast<const Trk::Surface*>( &(measuredPerigee->associatedSurface()) ) ;
175 if( !surf ) {
176 ATH_MSG_DEBUG("NO surface of the measuredPerigee");
177 continue;
178 }
179
180 // Get corrections from histograms if they are requested
181
182 double correctedQoverP(0), correctedQoverPError(0);
184 getCorrectedValues_P( measuredPerigee, correctedQoverP, correctedQoverPError);
185 } else {
186 correctedQoverP = measuredPerigee->parameters()[Trk::qOverP];
187 correctedQoverPError = 1e6;
188 }
189
190 double correctedD0(0), correctedD0Error(0);
191 if(m_CorrectD0){
192 getCorrectedValues_d0( measuredPerigee, correctedD0, correctedD0Error);
193 } else {
194 correctedD0 = measuredPerigee->parameters()[Trk::d0];
195 correctedD0Error = 1e6;
196 }
197
198 double correctedZ0(0), correctedZ0Error(0);
199 if(m_CorrectZ0){
200 getCorrectedValues_z0( measuredPerigee, correctedZ0, correctedZ0Error);
201 } else {
202 correctedZ0 = measuredPerigee->parameters()[Trk::z0];
203 correctedZ0Error = 1e6;
204 }
205
206 // Construct pseudomeasurement
207 Trk::DefinedParameter constrainedD0( correctedD0 , Trk::d0) ;
208 Trk::DefinedParameter constrainedZ0( correctedZ0 , Trk::z0) ;
209 Trk::DefinedParameter constrainedqOverP( correctedQoverP , Trk::qOverP) ;
210
211 std::vector<Trk::DefinedParameter> constrainedPars;
212 constrainedPars.push_back( constrainedD0 ) ;
213 constrainedPars.push_back( constrainedZ0 ) ;
214 constrainedPars.push_back( constrainedqOverP ) ;
215
216 Amg::MatrixX constrainedCov( 3,3 ) ;
217 constrainedCov.setZero();
218 constrainedCov( 0, 0 ) = correctedD0Error;
219 constrainedCov( 1, 1 ) = correctedZ0Error;
220 constrainedCov( 2, 2 ) = correctedQoverPError;
221 // constrainedCov( 1, 0 ) = 0; //initially we will assume the constraints are independant
222 // constrainedCov( 2, 0 ) = 0;
223 // constrainedCov( 2, 1 ) = 0;
224
226 std::move(constrainedCov), *surf) ;
227
228
229 // Add pseusdo measurement to a list of hits to be fit;
230 std::vector<const Trk::MeasurementBase*> vecOfMB;
231 if (pmot) vecOfMB.push_back(pmot);
232
233 // Add the remaining hits;
234 DataVector<const Trk::MeasurementBase>::const_iterator it = track->measurementsOnTrack()->begin();
235 DataVector<const Trk::MeasurementBase>::const_iterator itend = track->measurementsOnTrack()->end();
236 for (;it!=itend;++it)
237 vecOfMB.push_back(*it);
238
240 it = track->outliersOnTrack()->begin();
241 itend = track->outliersOnTrack()->end();
242 // Add the remaining hits;
243 for (;it!=itend;++it)
244 vecOfMB.push_back(*it);
245 }
246
247 Trk::Track* constrainedFittedTrack = m_trackFitter->fit( Gaudi::Hive::currentContext(),
248 vecOfMB, *measuredPerigee,
249 m_runOutlierRemoval, Trk::pion).release();
250 delete pmot;
251
252 if (constrainedFittedTrack){
253 ATH_MSG_DEBUG("Fit was successful");
254 const Trk::Perigee* constrainedPerigee = constrainedFittedTrack->perigeeParameters();
255 if(!constrainedPerigee){
256 ATH_MSG_DEBUG(" no constrainedmeasuredPerigee");
257 } else {
258 ATH_MSG_DEBUG("Initial track parameters --> momentum: " << 1/measuredPerigee->parameters()[Trk::qOverP] * 1e-3
259 << " pt: " << 1/measuredPerigee->parameters()[Trk::qOverP] * 1e-3 * sin(measuredPerigee->parameters()[Trk::theta])
260 << " d0: " << measuredPerigee->parameters()[Trk::d0]
261 << " z0: " << measuredPerigee->parameters()[Trk::z0] );
262 ATH_MSG_DEBUG("constraint values --> momentum: " << 1/correctedQoverP * 1e-3
263 << " pt: " << 1/correctedQoverP * 1e-3 * sin(measuredPerigee->parameters()[Trk::theta])
264 << " d0: " << correctedD0
265 << " z0: " << correctedZ0 );
266 ATH_MSG_DEBUG("Constrained fit result --> momentum: " << 1/constrainedPerigee->parameters()[Trk::qOverP] * 1e-3
267 << " pt: " << 1/constrainedPerigee->parameters()[Trk::qOverP] * 1e-3 * sin(constrainedPerigee->parameters()[Trk::theta])
268 << " d0: " << constrainedPerigee->parameters()[Trk::d0]
269 << " z0: " << constrainedPerigee->parameters()[Trk::z0] );
270 }
271
272 constrainedFittedTrack->setTrackSummary( std::make_unique<Trk::TrackSummary> (*track->trackSummary()) );
273
274 trackCollection->push_back(constrainedFittedTrack);
276 } else{
277 ATH_MSG_DEBUG("Constrained fit was unsuccessful");
278 }
279 } //--> if ( acceptedTrack)
280 else {
281
282 if(m_useConstrainedTrkOnly) continue;
283
284 //Prob could just copy the track?
285 Trk::Track* unconstrainedFittedTrack =
287 ->fit(Gaudi::Hive::currentContext(),
288 *track,
290 Trk::pion)
291 .release();
292
293 if(unconstrainedFittedTrack) {
294 ATH_MSG_DEBUG("Unconstrained fit was successful");
295 trackCollection->push_back(unconstrainedFittedTrack);
297 } else {
298 ATH_MSG_DEBUG("Unconstrained fit was unsuccessful");
299 }
300 }
301 }
302
303 ATH_MSG_INFO ("Size of the trackCollection in this event : " << trackCollection->size() );
304 finalTracks = trackCollection.cptr();
305 return StatusCode::SUCCESS;
306
307 }
308
309
310
311
313 {
314 ATH_MSG_DEBUG("== TrackSelection == STARTED ==");
315
316 const Trk::Perigee* perigee = track->perigeeParameters();
317 if(!perigee){
318 ATH_MSG_DEBUG("== TrackSelection == NO perigee on this track");
319 return false;
320 }
321
322 const Trk::TrackSummary* summary = track->trackSummary();
323
324 if(!summary){
325 ATH_MSG_DEBUG("== TrackSelection == No summary on this track");
326 return false;
327 }
328
329 const int nPixHits = summary->get(Trk::numberOfPixelHits);
330 const int nSCTHits = summary->get(Trk::numberOfSCTHits);
331 const int nTRTHits = summary->get(Trk::numberOfTRTHits);
332
333 const double qoverP = perigee->parameters()[Trk::qOverP] * 1000.;
334 const double z0 = perigee->parameters()[Trk::z0];
335 const double d0 = perigee->parameters()[Trk::d0];
336 double pt = 0.;
337 if ( qoverP != 0 ) pt = std::abs(1.0/qoverP)*sin(perigee->parameters()[Trk::theta]);
338
339 ATH_MSG_DEBUG( "== TrackSelection == track pt : "<< pt );
340 double charge(0);
341 if( qoverP > 0)
342 charge = 1.;
343 else
344 charge = -1.;
345 ATH_MSG_DEBUG( " pt : "<< pt << " ; Charge : "<< charge);
346
347 if(pt < m_minPt || pt > m_maxPt ){
348 ATH_MSG_DEBUG("== TrackSelection == Track fails pt cut [ "<<m_minPt<<", "<< m_maxPt << "] " << pt );
349 return false;
350 }
351
352 if (m_SelectByCharge) {
353 if (m_SelectPositive){
354 if (charge<0){
355 ATH_MSG_DEBUG("Track fails charge cut: negative charge " << charge );
356 return false;
357 }
358 }
359 if (not m_SelectPositive){
360 if (charge>0) {
361 ATH_MSG_DEBUG("Track fails charge cut: positive charge " << charge);
362 return false;
363 }
364 }
365 }
366
367 ATH_MSG_VERBOSE("== TrackSelection == Track N PIX hits: " << nPixHits << " requested: "<< m_minPIXHits );
368 ATH_MSG_VERBOSE("== TrackSelection == Track N SCT hits: " << nSCTHits << " requested: "<< m_minSCTHits );
369 ATH_MSG_VERBOSE("== TrackSelection == Track N TRT hits: " << nTRTHits << " requested: "<< m_minTRTHits );
370 ATH_MSG_VERBOSE("== TrackSelection == Track d0: " << d0 << " requested: "<< m_maxd0 );
371 ATH_MSG_VERBOSE("== TrackSelection == Track z0: " << z0 << " requested: "<< m_maxz0 );
372
373 if( nPixHits < m_minPIXHits ||
374 nSCTHits < m_minSCTHits ||
375 nTRTHits < m_minTRTHits ||
376 std::abs(d0) > m_maxd0 ||
377 std::abs(z0) > m_maxz0 ) {
378 ATH_MSG_DEBUG("This track did not pass cuts --- nPixHits: " << nPixHits << " nSCTHits: " << nSCTHits <<
379 " nTRTHits: " << nTRTHits << " idd0atIP: " << d0 << " idz0atIP: " << z0 );
380 return false;
381 }
382
383 return true;
384 }
385
386 void ConstrainedTrackProvider::getCorrectedValues_P(const Trk::Perigee* measuredPerigee, double& correctedQoverP,double& correctedQoverPError)
387 {
388
389 // scale q/p not p
390
391 double charge(0);
392 if( measuredPerigee->parameters()[Trk::qOverP] > 0)
393 charge = 1.;
394 else
395 charge = -1.;
396
397 double pt = std::abs(1./(measuredPerigee->parameters()[Trk::qOverP]))* sin(measuredPerigee->parameters()[Trk::theta]) *1e-3;
398 double eta = -log(tan(measuredPerigee->parameters()[Trk::theta]/2.));
399 double phi = measuredPerigee->parameters()[Trk::phi];
400 double perr = (*measuredPerigee->covariance())( Trk::qOverP, Trk::qOverP );
401
402
403 int binNumber = m_etaphiMap_P->FindBin(eta, phi);
404 double constraintErr = m_etaphiMap_P->GetBinError(binNumber);
405
406 double delta = m_etaphiMap_P->GetBinContent(binNumber) * m_deltaScaling;
407
409 delta = delta * 0.001;
410
411 correctedQoverP = measuredPerigee->parameters()[Trk::qOverP] * (1.+ charge *pt *delta );
412 correctedQoverPError = perr;
413
415 double qoverpFracError = perr/pow(measuredPerigee->parameters()[Trk::qOverP], 2);
416 qoverpFracError += pow(constraintErr,2);
417 correctedQoverPError = qoverpFracError*correctedQoverP*correctedQoverP;
418 }
419 ATH_MSG_DEBUG("Scaling by 1/m_reduceConstraintUncertainty " << m_reduceConstraintUncertainty << '\t'<< pow( m_reduceConstraintUncertainty,-2)) ;
420 correctedQoverPError = correctedQoverPError * pow( m_reduceConstraintUncertainty,-2);
421 ATH_MSG_DEBUG(" == input pt: " << pt << " deltaSagitta: " << delta << " final pt: " << sin(measuredPerigee->parameters()[Trk::theta]) * 1e-3/correctedQoverP);
422 }
423
424
425 void ConstrainedTrackProvider::getCorrectedValues_d0(const Trk::Perigee* measuredPerigee, double& correctedD0, double& correctedD0Error)
426 {
427 ATH_MSG_DEBUG(" == getCorrectedValues_d0 == STARTED ==");
428 // scale d0
429
430 double charge(0);
431 if( measuredPerigee->parameters()[Trk::qOverP] > 0)
432 charge = 1.;
433 else
434 charge = -1.;
435
436 double d0 = measuredPerigee->parameters()[Trk::d0];
437 double eta = -log(tan(measuredPerigee->parameters()[Trk::theta]/2.));
438 double phi = measuredPerigee->parameters()[Trk::phi];
439 double d0err = (*measuredPerigee->covariance())( Trk::d0, Trk::d0 );
440
441
442 int binNumber = m_etaphiMap_d0->FindBin(eta, phi);
443 double constraintErr = m_etaphiMap_d0->GetBinError(binNumber);
444 double delta = m_etaphiMap_d0->GetBinContent(binNumber) * m_deltaScaling;
445
446 correctedD0 = d0 - charge * delta * 0.5 ; // delta d0 = d0_pos - d0_neg . To make the difference null, substract half to the pos and add half to the neg track.
447 if (m_CorrectMeanD0) {correctedD0 = d0 + delta;}
448 correctedD0Error = d0err;
449 ATH_MSG_DEBUG("Correcting d0 by delta = " << delta << "\t, corrected d0 = "<< correctedD0 << "\t, original d0 = "<< d0 ) ;
450
452 correctedD0Error = d0err + pow( constraintErr, 2 );
453 }
454 ATH_MSG_DEBUG("Scaling by 1/m_reduceConstraintUncertainty " << m_reduceConstraintUncertainty << '\t'<< pow( m_reduceConstraintUncertainty,-2)) ;
455 correctedD0Error = correctedD0Error * pow( m_reduceConstraintUncertainty,-2);
456
457 ATH_MSG_DEBUG(" == input d0: " << d0 << " deltad0: " << delta << " final d0: " << correctedD0 << " +- " << correctedD0Error);
458 ATH_MSG_DEBUG(" == getCorrectedValues_d0 == Completed ==");
459 }
460
461 void ConstrainedTrackProvider::getCorrectedValues_z0(const Trk::Perigee* measuredPerigee, double& correctedZ0,double& correctedZ0Error)
462 {
463
464 // scale z0
465
466 double charge(0);
467 if( measuredPerigee->parameters()[Trk::qOverP] > 0)
468 charge = 1.;
469 else
470 charge = -1.;
471
472 double z0 = measuredPerigee->parameters()[Trk::z0];
473 double eta = -log(tan(measuredPerigee->parameters()[Trk::theta]/2.));
474 double phi = measuredPerigee->parameters()[Trk::phi];
475 double z0err = (*measuredPerigee->covariance())( Trk::z0, Trk::z0 );
476
477 int binNumber = m_etaphiMap_z0->FindBin(eta, phi);
478 double constraintErr = m_etaphiMap_z0->GetBinError(binNumber);
479 double delta = m_etaphiMap_z0->GetBinContent(binNumber) * m_deltaScaling;
480
481 correctedZ0 = z0 - charge * delta * 0.5 ; // delta z0 = z0_pos - z0_neg . To make the difference null, substract half to the pos and add half to the neg track.
482 correctedZ0Error = z0err;
483
485 correctedZ0Error = z0err + pow( constraintErr, 2 );
486 }
487 ATH_MSG_DEBUG("Scaling by 1/m_reduceConstraintUncertainty " << m_reduceConstraintUncertainty << '\t'<< pow( m_reduceConstraintUncertainty,-2)) ;
488 correctedZ0Error = correctedZ0Error * pow( m_reduceConstraintUncertainty,-2);
489 ATH_MSG_DEBUG("Scaling by 1/m_reduceConstraintUncert_z0 " << m_reduceConstraintUncert_z0 << '\t'<< pow( m_reduceConstraintUncert_z0,-2)) ;
490 correctedZ0Error = correctedZ0Error * pow( m_reduceConstraintUncert_z0,-2);
491 ATH_MSG_DEBUG(" == input z0: " << z0 << " deltaz0: " << delta << " final z0: " << correctedZ0 << " +- " << correctedZ0Error);
492 }
493
494
495
496
497
499
500 if(m_logStream) {
501
502 *m_logStream<<"*************************************************************"<<std::endl;
503 *m_logStream<<"****** ConstrainedTrackProvider Summary ******"<<std::endl;
504 *m_logStream<<"*"<<std::endl;
505 *m_logStream<<"* number of combined muons failed in refit: " << m_constrainedTracks << std::endl;
506 *m_logStream<<"* number of combined muons succeeded in refit: " << m_unconstrainedTracks << std::endl;
507
508 *m_logStream<<"*"<<std::endl;
509 }
510 }
511
512
513
514
515
516
517} // end namespace
Scalar eta() const
pseudorapidity method
#define endmsg
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
double charge(const T &p)
Definition AtlasPID.h:997
DataVector< Trk::Track > TrackCollection
This typedef represents a collection of Trk::Track objects.
constexpr int pow(int base, int exp) noexcept
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
MsgStream & msg() const
DataModel_detail::const_iterator< DataVector > const_iterator
Standard const_iterator.
Definition DataVector.h:838
virtual bool isValid() override final
Can the handle be successfully dereferenced?
void getCorrectedValues_d0(const Trk::Perigee *mp, double &corrected_d0, double &corrected_d0Error)
void getCorrectedValues_P(const Trk::Perigee *mp, double &correctedQoverP, double &correctedQoverPError)
void getCorrectedValues_z0(const Trk::Perigee *mp, double &corrected_z0, double &corrected_z0Error)
bool passTrackSelection(const Trk::Track *track)
virtual void printSummary()
Print statistical summary to logfile.
Gaudi::Property< Trk::RunOutlierRemoval > m_runOutlierRemoval
SG::ReadHandleKey< TrackCollection > m_inputKey
SG::WriteHandleKey< TrackCollection > m_outputKey
ToolHandle< IGlobalTrackFitter > m_trackFitter
ConstrainedTrackProvider(const std::string &type, const std::string &name, const IInterface *parent)
virtual StatusCode trackCollection(const TrackCollection *&tracks)
std::ostream * m_logStream
logfile output stream
virtual const S & associatedSurface() const override final
Access to the Surface method.
Class to handle pseudo-measurements in fitters and on track objects.
Abstract Base Class for tracking surfaces.
A summary of the information contained by a track.
void setTrackSummary(std::unique_ptr< Trk::TrackSummary > input)
Set the track summary.
const Perigee * perigeeParameters() const
return Perigee.
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
Ensure that the ATLAS eigen extensions are properly loaded.
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
@ theta
Definition ParamDefs.h:66
@ qOverP
perigee
Definition ParamDefs.h:67
@ phi
Definition ParamDefs.h:75
@ d0
Definition ParamDefs.h:63
@ z0
Definition ParamDefs.h:64
std::pair< double, ParamDefs > DefinedParameter
Typedef to of a std::pair<double, ParamDefs> to identify a passed-through double as a specific type o...
@ numberOfPixelHits
number of pixel layers on track with absence of hits