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,
51 const Amg::Vector3D& position, const Amg::Vector3D& direction,
52 double qOverP,
53 const Surface* surface = 0); // for merged material effects
54
56 const Amg::Vector3D& direction,
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.
represents the track state (measurement, material, fit parameters and quality) at a surface.
An intersection with a Surface is given by.
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
ParametersBase< TrackParametersDim, Charged > TrackParameters
@ ExtrapolationTypes