ATLAS Offline Software
Loading...
Searching...
No Matches
GXFTrackState.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
6// GXFTrackState.cxx
7// see header file for documentation.
9//
16#include "TrkSurfaces/Surface.h"
19#include <utility>
20
21namespace Trk {
23 m_measurement(rhs.m_measurement != nullptr ? std::unique_ptr<const MeasurementBase>(rhs.m_measurement->clone()) : nullptr),
24 m_tsType(rhs.m_tsType),
25 m_trackpar(std::unique_ptr<const TrackParameters>(rhs.m_trackpar != nullptr ? rhs.m_trackpar->clone() : nullptr)),
26 m_materialEffects(rhs.m_materialEffects != nullptr ? std::make_unique<GXFMaterialEffects>(*rhs. m_materialEffects) : nullptr),
27 m_derivs(rhs.m_derivs),
28 m_covariancematrix(rhs.m_covariancematrix),
30 m_fitqual(rhs.m_fitqual),
32 m_mType(rhs.m_mType),
35 {
36 for (int i = 0; i < 5; i++) {
37 m_measerror[i] = rhs.m_measerror[i];
38 for (int j = 0; j < 5; j++) {
39 m_jacobian(i, j) = rhs.m_jacobian(i, j);
40 }
41 }
42 }
43
45 std::unique_ptr<const MeasurementBase> measurement,
46 std::unique_ptr<const TrackParameters> trackpar
47 ):
49 m_trackpar(std::move(trackpar)),
50 m_materialEffects(nullptr),
51 m_jacobian {},
52 m_derivs(),
53 m_covariancematrix(),
54 m_covariance_set(false),
55 m_fitqual(),
56 m_sinstereo(0),
57 m_mType(TrackState::unidentified),
58 m_recalib(false),
59 m_measphi(false) {
61 m_measerror[0] = m_measerror[1] = m_measerror[2] = m_measerror[3] = m_measerror[4] = -1;
62 }
63
65 std::unique_ptr<const TrackParameters> trackpar,
67 ):
68 m_measurement(nullptr),
69 m_trackpar(std::move(trackpar)),
70 m_materialEffects(nullptr),
71 m_jacobian {},
72 m_derivs(),
73 m_covariancematrix(),
74 m_covariance_set(false),
75 m_fitqual(),
76 m_sinstereo(0),
77 m_mType(TrackState::unidentified),
78 m_recalib(false),
79 m_measphi(false)
80 {
81 setStateType(tsType);
82 m_measerror[0] = m_measerror[1] = m_measerror[2] = m_measerror[3] = m_measerror[4] = -1;
83 }
84
86 std::unique_ptr<GXFMaterialEffects> mef,
87 std::unique_ptr<const TrackParameters> trackpar
88 ):
89 m_measurement(nullptr),
90 m_trackpar(std::move(trackpar)),
91 m_materialEffects(std::move(mef)),
92 m_jacobian {},
93 m_derivs(),
94 m_covariancematrix(),
95 m_covariance_set(false),
96 m_fitqual(),
97 m_sinstereo(0),
98 m_mType(TrackState::unidentified),
99 m_recalib(false),
100 m_measphi(false)
101 {
102 m_measerror[0] = m_measerror[1] = m_measerror[2] = m_measerror[3] = m_measerror[4] = -1;
103
104 if (m_materialEffects->sigmaDeltaTheta() == 0) {
105 setStateType(TrackStateOnSurface::BremPoint);
106 } else {
107 setStateType(TrackStateOnSurface::Scatterer);
108 }
109 }
110
111 bool
113 const GXFMaterialEffects* eff = m_materialEffects.get();
114 if (not consistentSurfaces(m_measurement.get(),m_trackpar.get(), eff) ){
115 std::cerr << "GXFTrackState::isSane. With :" << '\n';
116 std::cerr << "Types : " << m_tsType.to_string() << '\n';
117 std::cerr << "Surfaces differ! " << std::endl;
118 if (m_trackpar) {
119 std::cerr << "ParamSurf: [" << &(m_trackpar->associatedSurface())
120 << "] " << m_trackpar->associatedSurface() << std::endl;
121 }
122 if (m_measurement) {
123 std::cerr << "measSurf: [" << &(m_measurement->associatedSurface())
124 << "] " << m_measurement->associatedSurface()
125 << std::endl;
126 }
127 if (m_materialEffects) {
128 std::cerr << "matSurf: ["
129 << &(m_materialEffects->associatedSurface()) << "] "
130 << m_materialEffects->associatedSurface() << std::endl;
131 }
132 return false;
133 }
134 return true;
135 }
136
137 void GXFTrackState::setMeasurement(std::unique_ptr<const MeasurementBase> meas) {
138 m_measurement = std::move(meas);
139 m_recalib = true;
140 }
141
143 return m_measurement.get();
144 }
145
146 void GXFTrackState::setTrackParameters(std::unique_ptr<const TrackParameters> par) {
147 m_trackpar = std::move(par);
148 }
149
153
154 void
158
160 return m_measerror;
161 }
162
163 void
164 GXFTrackState::setMeasurementErrors(const double *measerror) {
165 m_measerror[0] = measerror[0];
166 m_measerror[1] = measerror[1];
167 m_measerror[2] = measerror[2];
168 m_measerror[3] = measerror[3];
169 m_measerror[4] = measerror[4];
170 }
171
172 double
174 return m_sinstereo;
175 }
176
177 void
178 GXFTrackState::setSinStereo(double sinstereo) {
179 m_sinstereo = sinstereo;
180 }
181
182 const Surface &
184 if (m_measurement != nullptr) {
185 return m_measurement->associatedSurface();
186 } if (m_trackpar != nullptr) {
187 return m_trackpar->associatedSurface();
188 } if (m_materialEffects != nullptr) {
189 return m_materialEffects->associatedSurface();
190 } else {
191 throw std::runtime_error("GXFTrackState::associatedSurface: None of measurement, track parameters or material effects are non-null pointers");
192 }
193
194 }
195
196 void
198 if (covmat == nullptr) {
199 m_covariance_set = false;
200 } else {
201 m_covariance_set = true;
202 m_covariancematrix = *covmat;
203 }
204 }
205
207 m_fitqual = fitqual;
208 }
209
213
214 int
216 int nmeas = 0;
217
219 for (double i : m_measerror) {
220 if (i > 0) {
221 nmeas++;
222 }
223 }
224 }
225
226 return nmeas;
227 }
228
230 if (m_trackpar != nullptr) {
231 return m_trackpar->position();
232 } if (m_measurement != nullptr) {
233 return m_measurement->globalPosition();
234 }
235 // return surface()->center(); // Better than nothing...
236 return m_globpos;
237 }
238
239 void
243
244 bool
246 return m_measphi;
247 }
248
249 void
251 m_measphi = measphi;
252 }
253
254 void
256 m_recalib = isrecal;
257 }
258
260 return m_covariance_set;
261 }
262
264 m_covariance_set = true;
265 m_covariancematrix.setZero();
266 }
268 if (m_covariance_set) {
269 setTrackCovariance(nullptr);
270 }
271 }
272
277
281
285
286 std::optional<std::vector<std::unique_ptr<TrackParameters>>> & GXFTrackState::getHoles(void) {
287 return m_holes;
288 }
289
290 void GXFTrackState::setHoles(std::vector<std::unique_ptr<TrackParameters>> && v) {
291 m_holes = std::move(v);
292 }
293
294 std::unique_ptr<const TrackStateOnSurface>
296 std::unique_ptr<TrackParameters> trackpar = unique_clone(m_trackpar.get());
297 std::unique_ptr<MeasurementBase> measurement = unique_clone(m_measurement.get());
298
300
301 std::unique_ptr<MaterialEffectsBase> mateff = nullptr;
302 std::bitset<TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes> typePattern;
305 typePattern.set(TrackStateOnSurface::Scatterer);
306 }
307
308 if (m_materialEffects->sigmaDeltaE() > 0) {
309 if (m_materialEffects->sigmaDeltaTheta() == 0) {
310 typePattern.set(TrackStateOnSurface::CaloDeposit);
311 } else {
312 typePattern.set(TrackStateOnSurface::BremPoint);
313 }
314 }
315
316 if (mateff == nullptr) {
317 mateff = m_materialEffects->makeMEOT();
318 }
319 } else {
321 typePattern.set(TrackStateOnSurface::Measurement);
322 if ((fitQual) && (fitQual.chiSquared() > 1.e5 || fitQual.chiSquared() < 0)) {
323 double newchi2 = 0;
324 int ndf = fitQual.numberDoF();
325
326 if (fitQual.chiSquared() < 0) {
327 newchi2 = 0;
328 } else if (fitQual.chiSquared() > 1.e5) {
329 newchi2 = 1.e5;
330 }
331
332 fitQual = FitQualityOnSurface(newchi2, ndf);
333 }
334 } else if (m_tsType.test(TrackStateOnSurface::Outlier)) {
335 typePattern.set(TrackStateOnSurface::Outlier);
336 } else if (m_tsType.test(TrackStateOnSurface::Perigee)) {
337 typePattern.set(TrackStateOnSurface::Perigee);
338 }
339 }
340 return std::make_unique<const TrackStateOnSurface>(
341 fitQual,
342 std::move(measurement),
343 std::move(trackpar),
344 std::move(mateff),
345 typePattern);
346 }
347}
#define AmgSymMatrix(dim)
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
class that is similar to MaterialEffectsOnTrack, but has 'set' methods for more flexibility during tr...
bool getStateType(TrackStateOnSurface::TrackStateOnSurfaceType type) const
Retrieve the value of a specific type bit.
GXFTrackState()=delete
bool measuresPhi() const
double m_measerror[5]
Measurement errors (corrected for stereo angle)
bool m_recalib
Has this measurement already been recalibrated?
std::optional< std::vector< std::unique_ptr< TrackParameters > > > & getHoles(void)
std::optional< std::vector< std::unique_ptr< TrackParameters > > > m_holes
std::bitset< TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes > m_tsType
type of track state, eg Fittable, Outlier, Scatterer, Brem, Hole
void zeroTrackCovariance(void)
TrackState::MeasurementType m_mType
Measurement type, eg pixel, SCT, ...
void setTrackCovariance(AmgSymMatrix(5) *)
void setSinStereo(double)
void setStateType(TrackStateOnSurface::TrackStateOnSurfaceType type, bool value=true)
Set a specific type bit.
Amg::MatrixX m_derivs
Derivatives of local parameters wrt fit parameters.
void setPosition(Amg::Vector3D &)
const FitQualityOnSurface fitQuality(void)
std::unique_ptr< GXFMaterialEffects > m_materialEffects
Material effects on track (ie scatterer, brem)
const MeasurementBase * measurement(void)
Amg::Vector3D position()
void setHoles(std::vector< std::unique_ptr< TrackParameters > > &&)
std::unique_ptr< const TrackParameters > m_trackpar
track parameters
FitQualityOnSurface m_fitqual
bool hasTrackCovariance(void) const
void resetTrackCovariance()
reset covariance to nullptr
std::unique_ptr< const TrackStateOnSurface > trackStateOnSurface() const
void resetStateType(TrackStateOnSurface::TrackStateOnSurfaceType type, bool value=true)
Set a specific type, wiping all others.
void setFitQuality(FitQualityOnSurface)
void setMeasurement(std::unique_ptr< const MeasurementBase >)
std::unique_ptr< const MeasurementBase > m_measurement
The measurement defining the track state.
void setMeasurementErrors(const double *)
double * measurementErrors()
Amg::Vector3D m_globpos
double m_sinstereo
stereo angle
void setDerivatives(Amg::MatrixX &)
double sinStereo() const
void setTrackParameters(std::unique_ptr< const TrackParameters >)
void setJacobian(TransportJacobian &)
Eigen::Matrix< double, 5, 5 > m_jacobian
Transport jacobian wrt previous state.
const Surface & associatedSurface() const
This class is the pure abstract base class for all fittable tracking measurements.
Abstract Base Class for tracking surfaces.
@ Measurement
This is a measurement, and will at least contain a Trk::MeasurementBase.
@ Perigee
This represents a perigee, and so will contain a Perigee object only.
@ BremPoint
This represents a brem point on the track, and so will contain TrackParameters and MaterialEffectsBas...
@ Outlier
This TSoS contains an outlier, that is, it contains a MeasurementBase/RIO_OnTrack which was not used ...
@ Scatterer
This represents a scattering point on the track, and so will contain TrackParameters and MaterialEffe...
@ CaloDeposit
This TSOS contains a CaloEnergy object.
This class represents the jacobian for transforming initial track parameters to new track parameters ...
STL class.
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
Eigen::Matrix< double, 3, 1 > Vector3D
Ensure that the ATLAS eigen extensions are properly loaded.
bool consistentSurfaces(U)
std::unique_ptr< T > unique_clone(const T *v)
Definition unique_clone.h:8
@ v
Definition ParamDefs.h:78
ParametersBase< TrackParametersDim, Charged > TrackParameters
STL namespace.