ATLAS Offline Software
Loading...
Searching...
No Matches
FitMeasurement.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
5/***************************************************************************
6 for any measurement type (cluster, drift circle or material)
7 stores the quantities needed during track fitting
8 i.e. position, surface, weights, intersection, derivatives, residual etc
9 ***************************************************************************/
10
11#ifndef TRKIPATFITTERUTILS_FITMEASUREMENT_H
12#define TRKIPATFITTERUTILS_FITMEASUREMENT_H
13
14//<<<<<< INCLUDES >>>>>>
15
16#include <vector>
17
19// #include "GeoPrimitives/GeoPrimitives.h"
20#include <memory>
21
26
27//<<<<<< CLASS DECLARATIONS >>>>>>
28
29class HitOnTrack;
30class MsgStream;
31
32namespace Trk {
35class MeasurementBase;
36class Surface;
39
41 public:
42 FitMeasurement(int hitIndex, HitOnTrack* hitOnTrack,
43 const MeasurementBase* measurementBase); // MeasurementBase
44
46 double particleMass, const Amg::Vector3D& position,
47 double qOverP = 0.,
48 bool calo = false); // MaterialEffectsBase
49
50 FitMeasurement(double radiationThickness, double deltaE, double particleMass,
52 double qOverP,
53 const Surface* surface = 0); // for merged material effects
54
57 const Amg::Vector3D& position); // (mis-)alignment effects
58
60 double shift); // aggregationBreak placeholder
61
62 FitMeasurement(const TrackStateOnSurface& TSOS); // other TSOS
63
64 FitMeasurement(int hitIndex, HitOnTrack* hitOnTrack,
65 const Amg::Vector3D& position, double sigma, double sigma2,
66 double sinStereo, int status, const Surface* surface,
67 MeasurementType type); // stripCluster
68
69 FitMeasurement(int hitIndex, HitOnTrack* hitOnTrack,
70 const Amg::Vector3D& position, double sigma,
71 double signedDriftDistance, double sinStereo,
72 const Surface* surface); // driftCircle
73
74 FitMeasurement(const TrackParameters& perigee); // perigee
75
77 double sigma); // transverseVertex
78
79 ~FitMeasurement(void); // destructor
80 // forbidden copy constructor
81 // forbidden assignment operator
82
83 bool afterCalo(void) const;
84 double alignmentAngle(void) const;
85 void alignmentAngle(double value);
87 double alignmentOffset(void) const;
88 void alignmentOffset(double value);
89 unsigned alignmentParameter(void) const;
90 void alignmentParameter(unsigned value);
91 unsigned alignmentParameter2(void) const;
92 void alignmentParameter2(unsigned value);
93 double derivative(int param) const;
94 void derivative(int param, double value);
95 void derivative(double* pointer);
96 double derivative2(int param) const;
97 void derivative2(int param, double value);
98 void derivative2(double* pointer);
99 int derivativeRow(void) const;
100 void derivativeRow(int row);
101 double d0(void) const;
102 double energyLoss(void) const;
103 double energyLossSigma(void) const;
104 unsigned firstParameter(void) const;
105 void firstParameter(unsigned value);
106 void flipDriftDirection(void);
107 int hitIndex(void) const;
108 const HitOnTrack* hitOnTrack(void) const;
109 HitOnTrack* hitOnTrack(void);
113 const std::optional<TrackSurfaceIntersection>& value);
114 bool isAlignment(void) const;
115 bool isCluster(void) const;
116 bool isDrift(void) const;
117 bool isEnergyDeposit(void) const;
118 bool isFlipped(void) const;
119 bool isMaterialDelimiter(void) const;
120 bool isOutlier(void) const;
121 bool isPassive(void) const;
122 bool isPerigee(void) const;
123 bool isPositionMeasurement(void) const;
124 bool isPseudo(void) const;
125 bool isScatterer(void) const;
126 bool isTrapezoidCluster(void) const;
127 bool isVertex(void) const;
128 bool is2Dimensional(void) const;
129
130 // number of fit parameters influencing (upstream to) this measurement
131 unsigned lastParameter(void) const;
132 void lastParameter(unsigned value, bool afterCalo = false);
133 const MaterialEffectsBase* materialEffects(void) const;
134 const MeasurementBase* measurementBase(void) const;
135 double minEnergyDeposit(void) const;
136 const Amg::Vector3D& minimizationDirection(void) const;
137 void minimizationDirection(const Amg::Vector3D& value);
138 const Amg::Vector3D& normal(void) const;
139 int numberDoF(void) const;
140 void numberDoF(int value);
141 bool numericalDerivative(void) const;
142 const Amg::VectorX& perigee(void) const;
143 const Amg::MatrixX& perigeeWeight(void) const;
144 const Amg::Vector3D& position(void) const;
145 void print(MsgStream& log) const;
146 static void printHeading(MsgStream& log);
147 double qOverP(void) const;
148 void qOverP(double value);
149 double radiationThickness(void) const;
150 double residual(void) const;
151 void residual(double value);
152 void residual(std::vector<double>::iterator pointer);
153 double residual2(void) const;
154 void residual2(double value);
155 double scattererPhi(void) const;
156 void scattererPhi(double value);
157 double scattererTheta(void) const;
158 void scattererTheta(double value);
159 void scatteringAngle(double angle, double totalRadiationThickness);
160 const Amg::Vector3D& sensorDirection(void) const;
161
162 // for upper hemisphere cosmics
163 void setEnergyGain(void);
164
165 void setMaterialEffectsOwner(void);
166 void setNumericalDerivative(void);
167 void setOutlier(void);
168
169 // to handle calo energy deposit with asymmetric errors
170 void setSigma(void);
171 void setSigmaMinus(void);
172 void setSigmaPlus(void);
173 void setSigmaSymmetric(void);
174
175 double sigma(void) const;
176 double sigma2(void) const;
177 double signedDriftDistance(void) const;
178 int status(void) const;
179 const Surface* surface(void) const;
180 MeasurementType type(void) const;
181 void unsetOutlier(void);
182 double weight(void) const;
183 double weight2(void) const;
184
185 private:
186 // copy, assignment: no semantics, no implementation
189
198 double m_d0;
203 HitOnTrack* m_hitOnTrack;
204 std::array<std::optional<TrackSurfaceIntersection>, ExtrapolationTypes>
220 double m_qOverP;
222 std::vector<double>::iterator m_residual;
230 double m_sigma;
237 double m_weight;
238 double m_weight2;
239};
240
241//<<<<<< INLINE PUBLIC MEMBER FUNCTIONS >>>>>>
242
243inline bool FitMeasurement::afterCalo(void) const {
244 return m_afterCalo;
245}
246
247inline double FitMeasurement::alignmentAngle(void) const {
248 return m_scatterPhi;
249}
250
251inline void FitMeasurement::alignmentAngle(double value) {
252 m_scatterPhi = value;
253}
254
256 void) const {
257 return m_alignmentEffects;
258}
259
260inline double FitMeasurement::alignmentOffset(void) const {
261 return m_scatterTheta;
262}
263
264inline void FitMeasurement::alignmentOffset(double value) {
265 m_scatterTheta = value;
266}
267
268inline unsigned FitMeasurement::alignmentParameter(void) const {
270}
271
272inline void FitMeasurement::alignmentParameter(unsigned value) {
273 m_alignmentParameter = value;
274}
275
276inline unsigned FitMeasurement::alignmentParameter2(void) const {
278}
279
280inline void FitMeasurement::alignmentParameter2(unsigned value) {
281 m_alignmentParameter2 = value;
282}
283
284inline double FitMeasurement::derivative(int param) const {
285 return *(m_derivative + param);
286}
287
288inline void FitMeasurement::derivative(int param, double value) {
289 *(m_derivative + param) = value;
290}
291
292inline void FitMeasurement::derivative(double* pointer) {
293 m_derivative = pointer;
294}
295
296inline double FitMeasurement::derivative2(int param) const {
297 return *(m_derivative2 + param);
298}
299
300inline void FitMeasurement::derivative2(int param, double value) {
301 *(m_derivative2 + param) = value;
302}
303
304inline void FitMeasurement::derivative2(double* pointer) {
305 m_derivative2 = pointer;
306}
307
308inline int FitMeasurement::derivativeRow(void) const {
309 return m_derivativeRow;
310}
311
312inline void FitMeasurement::derivativeRow(int row) {
313 m_derivativeRow = row;
314}
315
316inline double FitMeasurement::d0(void) const {
317 return m_d0;
318}
319
320inline double FitMeasurement::energyLoss(void) const {
321 return m_energyLoss;
322}
323
324inline double FitMeasurement::energyLossSigma(void) const {
325 return m_sigma;
326}
327
328inline unsigned FitMeasurement::firstParameter(void) const {
329 return m_firstParameter;
330}
331
332inline void FitMeasurement::firstParameter(unsigned value) {
333 m_firstParameter = value;
334}
335
342
343inline int FitMeasurement::hitIndex(void) const {
344 return m_hitIndex;
345}
346
347inline const HitOnTrack* FitMeasurement::hitOnTrack(void) const {
348 return m_hitOnTrack;
349}
350
351inline HitOnTrack* FitMeasurement::hitOnTrack(void) {
352 return m_hitOnTrack;
353}
354
356 return (bool)m_intersection[type];
357}
358
363
364inline bool FitMeasurement::isAlignment(void) const {
365 return (m_type == alignment);
366}
367
368inline bool FitMeasurement::isCluster(void) const {
369 return (m_type == pixelCluster || m_type == stripCluster ||
371}
372
373inline bool FitMeasurement::isDrift(void) const {
374 return (m_type == driftCircle);
375}
376
377inline bool FitMeasurement::isEnergyDeposit(void) const {
378 return (m_type == energyDeposit);
379}
380
381inline bool FitMeasurement::isFlipped(void) const {
383}
384
385inline bool FitMeasurement::isMaterialDelimiter(void) const {
386 return (m_type == materialDelimiter);
387}
388
389inline bool FitMeasurement::isOutlier(void) const {
390 return m_outlier;
391}
392
393inline bool FitMeasurement::isPassive(void) const {
394 return (m_type > bremPoint);
395}
396
397inline bool FitMeasurement::isPerigee(void) const {
398 return (m_type == perigeeParameters);
399}
400
402 return (m_type < barrelScatterer);
403}
404
405inline bool FitMeasurement::isPseudo(void) const {
406 return (m_type == pseudoMeasurement);
407}
408
409inline bool FitMeasurement::isScatterer(void) const {
410 return (m_type == barrelScatterer || m_type == endcapScatterer ||
413}
414
415inline bool FitMeasurement::isTrapezoidCluster(void) const {
416 return (m_type == trapezoidCluster);
417}
418
419inline bool FitMeasurement::isVertex(void) const {
420 return (m_type == vertex || m_type == transverseVertex);
421}
422
423inline bool FitMeasurement::is2Dimensional(void) const {
424 return (m_numberDoF == 2);
425}
426
427inline unsigned FitMeasurement::lastParameter(void) const {
428 return m_lastParameter;
429}
430
431inline void FitMeasurement::lastParameter(unsigned value, bool afterCalo) {
433 m_lastParameter = value;
434}
435
437 return m_materialEffects;
438}
439
441 return m_measurementBase;
442}
443
444inline double FitMeasurement::minEnergyDeposit(void) const {
445 return m_minEnergyDeposit;
446}
447
451
455
456inline const Amg::Vector3D& FitMeasurement::normal(void) const {
457 return m_normal;
458}
459
460inline int FitMeasurement::numberDoF(void) const {
461 if (m_outlier)
462 return 0;
463 return m_numberDoF;
464}
465
466inline void FitMeasurement::numberDoF(int value) {
467 m_numberDoF = value;
468}
469
470inline bool FitMeasurement::numericalDerivative(void) const {
472}
473
474inline const Amg::VectorX& FitMeasurement::perigee(void) const {
475 return m_perigee;
476}
477
479 return m_perigeeWeight;
480}
481
482inline const Amg::Vector3D& FitMeasurement::position(void) const {
483 return m_position;
484}
485
486inline double FitMeasurement::qOverP(void) const {
487 return m_qOverP;
488}
489
490inline double FitMeasurement::radiationThickness(void) const {
492}
493
494inline double FitMeasurement::residual(void) const {
495 return *m_residual;
496}
497
498inline void FitMeasurement::residual(double value) {
499 *m_residual = value;
500}
501
502inline void FitMeasurement::residual(std::vector<double>::iterator pointer) {
503 m_residual = pointer;
504}
505
506inline double FitMeasurement::residual2(void) const {
507 return *(m_residual + 1);
508}
509
510inline void FitMeasurement::residual2(double value) {
511 *(m_residual + 1) = value;
512}
513
514inline double FitMeasurement::scattererPhi(void) const {
515 return m_scatterPhi;
516}
517
518inline void FitMeasurement::scattererPhi(double value) {
519 m_scatterPhi = value;
520}
521
522inline double FitMeasurement::scattererTheta(void) const {
523 return m_scatterTheta;
524}
525
526inline void FitMeasurement::scattererTheta(double value) {
527 m_scatterPhi = value;
528}
529
531 return m_sensorDirection;
532}
533
535 m_energyLoss = -fabs(m_energyLoss);
536}
537
541
545
546inline void FitMeasurement::setOutlier(void) {
547 m_numberDoF = 0;
548 m_outlier = true;
549 m_weight = 1.0;
550 m_weight2 = 1.0;
551}
552
553inline void FitMeasurement::setSigma(void) {
554 m_weight = 1. / m_sigma;
555}
556
558 m_weight = 1. / m_sigmaMinus;
559}
560
562 m_weight = 1. / m_sigmaPlus;
563}
564
565inline double FitMeasurement::sigma(void) const {
566 if (!m_weight)
567 return 0;
568 return 1. / m_weight;
569}
570
571inline double FitMeasurement::sigma2(void) const {
572 if (!m_weight2)
573 return 0;
574 return 1. / m_weight2;
575}
576
577inline double FitMeasurement::signedDriftDistance(void) const {
579}
580
581inline int FitMeasurement::status(void) const {
582 return m_status;
583}
584
585inline const Surface* FitMeasurement::surface(void) const {
586 return m_surface;
587}
588
590 return m_type;
591}
592
594 m_outlier = false;
595}
596
597inline double FitMeasurement::weight(void) const {
598 return m_weight;
599}
600
601inline double FitMeasurement::weight2(void) const {
602 return m_weight2;
603}
604
605} // namespace Trk
606
607#endif // TRKIPATFITTERUTILS_FITMEASUREMENT_H
double angle(const GeoTrf::Vector2D &a, const GeoTrf::Vector2D &b)
Class to represent misalignments or 'discontinuities' on tracks These have a surface where the z axis...
const AlignmentEffectsOnTrack * m_alignmentEffects
bool isFlipped(void) const
bool hasIntersection(ExtrapolationType type) const
double derivative(int param) const
const Amg::Vector3D & sensorDirection(void) const
bool afterCalo(void) const
bool isOutlier(void) const
int status(void) const
double scattererPhi(void) const
const Surface * m_surface
double alignmentOffset(void) const
const TrackSurfaceIntersection & intersection(ExtrapolationType type) const
void flipDriftDirection(void)
FitMeasurement(int hitIndex, HitOnTrack *hitOnTrack, const MeasurementBase *measurementBase)
double signedDriftDistance(void) const
HitOnTrack * m_hitOnTrack
FitMeasurement & operator=(const FitMeasurement &)
bool isPositionMeasurement(void) const
bool isVertex(void) const
const Amg::VectorX & perigee(void) const
const HitOnTrack * hitOnTrack(void) const
static void printHeading(MsgStream &log)
double radiationThickness(void) const
bool isCluster(void) const
const Amg::MatrixX & perigeeWeight(void) const
double alignmentAngle(void) const
double weight(void) const
unsigned firstParameter(void) const
double energyLoss(void) const
Amg::Vector3D m_normal
double sigma2(void) const
std::array< std::optional< TrackSurfaceIntersection >, ExtrapolationTypes > m_intersection
double residual(void) const
Amg::Vector3D m_position
void setNumericalDerivative(void)
bool isScatterer(void) const
bool isPassive(void) const
void print(MsgStream &log) const
bool isDrift(void) const
MeasurementType m_type
bool isMaterialDelimiter(void) const
MeasurementType type(void) const
const MeasurementBase * m_measurementBase
Amg::MatrixX m_perigeeWeight
double minEnergyDeposit(void) const
const MeasurementBase * measurementBase(void) const
unsigned alignmentParameter(void) const
double sigma(void) const
double weight2(void) const
int derivativeRow(void) const
FitMeasurement(const FitMeasurement &)
const MaterialEffectsBase * materialEffects(void) const
bool numericalDerivative(void) const
bool isAlignment(void) const
unsigned alignmentParameter2(void) const
const MaterialEffectsBase * m_materialEffects
void setMaterialEffectsOwner(void)
bool is2Dimensional(void) const
unsigned lastParameter(void) const
const Amg::Vector3D & minimizationDirection(void) const
bool isTrapezoidCluster(void) const
double residual2(void) const
bool isPerigee(void) const
const Amg::Vector3D & normal(void) const
Amg::Vector3D m_sensorDirection
double derivative2(int param) const
std::vector< double >::iterator m_residual
double qOverP(void) const
bool isEnergyDeposit(void) const
const AlignmentEffectsOnTrack * alignmentEffects(void) const
bool isPseudo(void) const
int numberDoF(void) const
double energyLossSigma(void) const
const Surface * surface(void) const
const Amg::Vector3D & position(void) const
double d0(void) const
int hitIndex(void) const
void scatteringAngle(double angle, double totalRadiationThickness)
double scattererTheta(void) const
Amg::Vector3D m_minimizationDirection
base class to integrate material effects on Trk::Track in a flexible way.
This class is the pure abstract base class for all fittable tracking measurements.
Abstract Base Class for tracking surfaces.
Definition Surface.h:79
represents the track state (measurement, material, fit parameters and quality) at a surface.
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
Eigen::Matrix< double, 3, 1 > Vector3D
Eigen::Matrix< double, Eigen::Dynamic, 1 > VectorX
Dynamic Vector - dynamic allocation.
Ensure that the ATLAS eigen extensions are properly loaded.
@ endcapScatterer
@ pseudoMeasurement
@ materialDelimiter
@ stripCluster
@ transverseVertex
@ energyDeposit
@ endcapInert
@ calorimeterScatterer
@ barrelScatterer
@ pixelCluster
@ trapezoidCluster
@ barrelInert
@ driftCircle
@ perigeeParameters
const Amg::Vector3D & direction() const
Method to retrieve the direction at the Intersection.
TrackSurfaceIntersection(const Amg::Vector3D &pos, const Amg::Vector3D &dir, double path)
Constructor.
ParametersBase< TrackParametersDim, Charged > TrackParameters
@ ExtrapolationTypes