ATLAS Offline Software
Loading...
Searching...
No Matches
Trk::FitParameters Class Reference

#include <FitParameters.h>

Collaboration diagram for Trk::FitParameters:

Public Member Functions

 FitParameters (const Perigee &perigee)
 FitParameters (double d0, double z0, double cosPhi, double sinPhi, double cotTheta, double ptInv0, const PerigeeSurface &surface)
 FitParameters (const FitParameters &parameters)=default
 FitParameters (FitParameters &&)=default
FitParametersoperator= (const FitParameters &)=default
FitParametersoperator= (FitParameters &&)=default
 ~FitParameters (void)=default
void addAlignment (bool constrained, double localAngle, double localOffset)
void addScatterer (double phi, double theta)
double alignmentAngle (int alignment) const
double alignmentAngleConstraint (int alignment) const
double alignmentOffset (int alignment) const
double alignmentOffsetConstraint (int alignment) const
const SurfaceassociatedSurface (void) const
double cosPhi (void) const
double cosTheta (void) const
double cotTheta (void) const
void covariance (Amg::MatrixX *finalCovariance, const Amg::MatrixX *fullCovariance)
double d0 (void) const
void d0 (double value)
double difference (int param) const
const Amg::VectorXdifferences (void) const
Amg::Vector3D direction (void) const
bool extremeMomentum (void) const
void extremeMomentum (bool value)
const Amg::MatrixXfinalCovariance (void) const
int firstAlignmentParameter (void) const
void firstAlignmentParameter (int value)
int firstScatteringParameter (void) const
void firstScatteringParameter (int value)
bool fitEnergyDeposit (void) const
void fitEnergyDeposit (double minEnergyDeposit)
bool fitMomentum (void) const
void fitMomentum (bool value)
const Amg::MatrixXfullCovariance (void) const
TrackSurfaceIntersection intersection (void) const
int numberAlignments (void) const
void numberAlignments (int numberAlignments)
int numberOscillations (void) const
int numberParameters (void) const
void numberParameters (int numberParameters)
int numberScatterers (void) const
void numberScatterers (int numberScatterers)
void performCutStep (double cutStep)
bool phiInstability (void) const
double ptInv0 (void) const
const Amg::MatrixX parameterDifference (const Amg::VectorX &parameters) const
Perigeeperigee (void) const
const Amg::Vector3Dposition (void) const
void print (MsgStream &log) const
void printCovariance (MsgStream &log) const
void printVerbose (MsgStream &log) const
double qOverP (void) const
void qOverP (double value)
double qOverP1 (void) const
void qOverP1 (double value)
void reset (const FitParameters &parameters)
void resetOscillations (void)
double scattererPhi (int scatterer) const
double scattererTheta (int scatterer) const
ScatteringAngles scatteringAngles (const FitMeasurement &fitMeasurement, int scatterer=-1) const
void setPhiInstability (void)
double sinPhi (void) const
double sinTheta (void) const
PerigeestartingPerigee (void) const
TrackParameterstrackParameters (MsgStream &log, const FitMeasurement &measurement, bool withCovariance=false)
void update (const Amg::VectorX &differences)
void update (Amg::Vector3D position, Amg::Vector3D direction, double qOverP, const Amg::MatrixX &leadingCovariance)
const Amg::Vector3Dvertex (void) const
double z0 (void) const

Private Attributes

std::vector< double > m_alignmentAngle
std::vector< double > m_alignmentAngleConstraint
std::vector< double > m_alignmentOffset
std::vector< double > m_alignmentOffsetConstraint
double m_cosPhi
double m_cosPhi1
double m_cosTheta
double m_cosTheta1
double m_cotTheta
double m_d0
Amg::VectorX m_differences {}
bool m_eigen {}
bool m_extremeMomentum
Amg::MatrixXm_finalCovariance
int m_firstAlignmentParameter
int m_firstScatteringParameter
bool m_fitEnergyDeposit
bool m_fitMomentum
const Amg::MatrixXm_fullCovariance
double m_minEnergyDeposit
int m_numberAlignments
int m_numberOscillations
int m_numberParameters
int m_numberScatterers
double m_oldDifference
const Perigeem_perigee
bool m_phiInstability
Amg::Vector3D m_position
double m_qOverP
double m_qOverP1
std::vector< double > m_scattererPhi
std::vector< double > m_scattererTheta
double m_sinPhi
double m_sinPhi1
double m_sinTheta
double m_sinTheta1
const Surfacem_surface
Amg::Vector3D m_vertex
double m_z0

Detailed Description

Definition at line 29 of file FitParameters.h.

Constructor & Destructor Documentation

◆ FitParameters() [1/4]

Trk::FitParameters::FitParameters ( const Perigee & perigee)

Definition at line 26 of file FitParameters.cxx.

27 : m_cosPhi1(0.),
28 m_cosTheta1(0.),
29 m_d0(perigee.parameters()[Trk::d0]),
31 m_extremeMomentum(false),
32 m_finalCovariance(nullptr),
35 m_fitEnergyDeposit(false),
36 m_fitMomentum(true),
37 m_fullCovariance(nullptr),
45 m_phiInstability(false),
46 m_qOverP1(0.),
47 m_sinPhi1(0.),
48 m_sinTheta1(0.),
49 m_surface(&perigee.associatedSurface()),
50 m_vertex(perigee.associatedSurface().center()),
51 m_z0(perigee.position().z()) {
52 Amg::Vector3D momentum = perigee.momentum();
53 const double ptInv0 = 1. / momentum.perp();
54 m_cosPhi = ptInv0 * momentum.x();
55 m_sinPhi = ptInv0 * momentum.y();
57 m_sinTheta = 1. / std::sqrt(1. + m_cotTheta * m_cotTheta);
59 m_qOverP = perigee.charge() * ptInv0 * m_sinTheta;
61 m_vertex.y() + m_d0 * m_cosPhi, m_z0);
62}
const Surface * m_surface
Amg::Vector3D m_position
Amg::Vector3D m_vertex
Perigee * perigee(void) const
Amg::MatrixX * m_finalCovariance
const Perigee * m_perigee
double ptInv0(void) const
const Amg::MatrixX * m_fullCovariance
Amg::VectorX m_differences
Eigen::Matrix< double, 3, 1 > Vector3D
@ d0
Definition ParamDefs.h:63

◆ FitParameters() [2/4]

Trk::FitParameters::FitParameters ( double d0,
double z0,
double cosPhi,
double sinPhi,
double cotTheta,
double ptInv0,
const PerigeeSurface & surface )

Definition at line 64 of file FitParameters.cxx.

68 m_cosPhi1(0.),
69 m_cosTheta1(0.),
71 m_d0(d0),
72 m_extremeMomentum(false),
73 m_finalCovariance(nullptr),
76 m_fitEnergyDeposit(false),
77 m_fitMomentum(true),
78 m_fullCovariance(nullptr),
85 m_perigee(nullptr),
86 m_phiInstability(false),
87 m_qOverP1(0.),
89 m_sinPhi1(0.),
90 m_sinTheta1(0.),
91 m_surface(&surface),
92 m_vertex(surface.center()),
93 m_z0(z0) {
94 m_sinTheta = 1. / std::sqrt(1. + m_cotTheta * m_cotTheta);
97 m_z0 = z0;
99 m_vertex.y() + m_d0 * m_cosPhi, m_z0);
100}
double z0(void) const
double sinPhi(void) const
double d0(void) const
double cotTheta(void) const
double cosPhi(void) const

◆ FitParameters() [3/4]

Trk::FitParameters::FitParameters ( const FitParameters & parameters)
default

◆ FitParameters() [4/4]

Trk::FitParameters::FitParameters ( FitParameters && )
default

◆ ~FitParameters()

Trk::FitParameters::~FitParameters ( void )
default

Member Function Documentation

◆ addAlignment()

void Trk::FitParameters::addAlignment ( bool constrained,
double localAngle,
double localOffset )

Definition at line 103 of file FitParameters.cxx.

104 {
107 if (constrained) {
110 }
112}
double angle(const GeoTrf::Vector2D &a, const GeoTrf::Vector2D &b)
std::vector< double > m_alignmentOffsetConstraint
std::vector< double > m_alignmentOffset
std::vector< double > m_alignmentAngleConstraint
std::vector< double > m_alignmentAngle

◆ addScatterer()

void Trk::FitParameters::addScatterer ( double phi,
double theta )

Definition at line 114 of file FitParameters.cxx.

114 {
118}
std::vector< double > m_scattererTheta
std::vector< double > m_scattererPhi
@ theta
Definition ParamDefs.h:66
@ phi
Definition ParamDefs.h:75

◆ alignmentAngle()

double Trk::FitParameters::alignmentAngle ( int alignment) const
inline

Definition at line 156 of file FitParameters.h.

156 {
158}

◆ alignmentAngleConstraint()

double Trk::FitParameters::alignmentAngleConstraint ( int alignment) const
inline

Definition at line 160 of file FitParameters.h.

160 {
162}

◆ alignmentOffset()

double Trk::FitParameters::alignmentOffset ( int alignment) const
inline

Definition at line 164 of file FitParameters.h.

164 {
166}

◆ alignmentOffsetConstraint()

double Trk::FitParameters::alignmentOffsetConstraint ( int alignment) const
inline

Definition at line 168 of file FitParameters.h.

168 {
170}

◆ associatedSurface()

const Surface * Trk::FitParameters::associatedSurface ( void ) const

Definition at line 120 of file FitParameters.cxx.

120 {
121 if (!m_perigee)
122 return nullptr;
123 return &m_perigee->associatedSurface();
124}

◆ cosPhi()

double Trk::FitParameters::cosPhi ( void ) const
inline

Definition at line 172 of file FitParameters.h.

172 {
173 return m_cosPhi;
174}

◆ cosTheta()

double Trk::FitParameters::cosTheta ( void ) const
inline

Definition at line 176 of file FitParameters.h.

176 {
177 return m_cosTheta;
178}

◆ cotTheta()

double Trk::FitParameters::cotTheta ( void ) const
inline

Definition at line 180 of file FitParameters.h.

180 {
181 return m_cotTheta;
182}

◆ covariance()

void Trk::FitParameters::covariance ( Amg::MatrixX * finalCovariance,
const Amg::MatrixX * fullCovariance )

Definition at line 126 of file FitParameters.cxx.

127 {
130}
const Amg::MatrixX * finalCovariance(void) const
const Amg::MatrixX * fullCovariance(void) const

◆ d0() [1/2]

void Trk::FitParameters::d0 ( double value)

Definition at line 132 of file FitParameters.cxx.

132 {
133 m_d0 = value;
135 m_vertex.y() + m_d0 * m_cosPhi, m_z0);
136}

◆ d0() [2/2]

double Trk::FitParameters::d0 ( void ) const
inline

Definition at line 184 of file FitParameters.h.

184 {
185 return m_d0;
186}

◆ difference()

double Trk::FitParameters::difference ( int param) const
inline

Use as_const to avoid compiler warning

Definition at line 188 of file FitParameters.h.

188 {
189 if (m_differences.size() == 0) {
190 return 0.;
191 }
193 return std::as_const(m_differences)(param);
194}

◆ differences()

const Amg::VectorX & Trk::FitParameters::differences ( void ) const
inline

Definition at line 196 of file FitParameters.h.

196 {
197 return m_differences;
198}

◆ direction()

Amg::Vector3D Trk::FitParameters::direction ( void ) const
inline

Definition at line 200 of file FitParameters.h.

200 {
202 m_cosTheta);
203}

◆ extremeMomentum() [1/2]

void Trk::FitParameters::extremeMomentum ( bool value)

Definition at line 138 of file FitParameters.cxx.

138 {
141}

◆ extremeMomentum() [2/2]

bool Trk::FitParameters::extremeMomentum ( void ) const
inline

Definition at line 205 of file FitParameters.h.

205 {
206 return m_extremeMomentum;
207}

◆ finalCovariance()

const Amg::MatrixX * Trk::FitParameters::finalCovariance ( void ) const
inline

Definition at line 209 of file FitParameters.h.

209 {
210 return m_finalCovariance;
211}

◆ firstAlignmentParameter() [1/2]

void Trk::FitParameters::firstAlignmentParameter ( int value)

◆ firstAlignmentParameter() [2/2]

int Trk::FitParameters::firstAlignmentParameter ( void ) const
inline

Definition at line 213 of file FitParameters.h.

213 {
215}

◆ firstScatteringParameter() [1/2]

void Trk::FitParameters::firstScatteringParameter ( int value)

◆ firstScatteringParameter() [2/2]

int Trk::FitParameters::firstScatteringParameter ( void ) const
inline

Definition at line 217 of file FitParameters.h.

217 {
219}

◆ fitEnergyDeposit() [1/2]

void Trk::FitParameters::fitEnergyDeposit ( double minEnergyDeposit)

Definition at line 143 of file FitParameters.cxx.

143 {
144 m_fitEnergyDeposit = true;
145 m_minEnergyDeposit = minEnergyDeposit;
146}

◆ fitEnergyDeposit() [2/2]

bool Trk::FitParameters::fitEnergyDeposit ( void ) const
inline

Definition at line 221 of file FitParameters.h.

221 {
222 return m_fitEnergyDeposit;
223}

◆ fitMomentum() [1/2]

void Trk::FitParameters::fitMomentum ( bool value)

Definition at line 148 of file FitParameters.cxx.

148 {
150}

◆ fitMomentum() [2/2]

bool Trk::FitParameters::fitMomentum ( void ) const
inline

Definition at line 225 of file FitParameters.h.

225 {
226 return m_fitMomentum;
227}

◆ fullCovariance()

const Amg::MatrixX * Trk::FitParameters::fullCovariance ( void ) const
inline

Definition at line 229 of file FitParameters.h.

229 {
230 return m_fullCovariance;
231}

◆ intersection()

TrackSurfaceIntersection Trk::FitParameters::intersection ( void ) const

Definition at line 152 of file FitParameters.cxx.

152 {
156 0.);
157}
TrackSurfaceIntersection()=default

◆ numberAlignments() [1/2]

void Trk::FitParameters::numberAlignments ( int numberAlignments)

Definition at line 159 of file FitParameters.cxx.

159 {
161 if (!numberAlignments)
162 return;
163 m_alignmentAngle = std::vector<double>(numberAlignments, 0.);
164 m_alignmentAngleConstraint = std::vector<double>(numberAlignments, 0.);
165 m_alignmentOffset = std::vector<double>(numberAlignments, 0.);
166 m_alignmentOffsetConstraint = std::vector<double>(numberAlignments, 0.);
167}
int numberAlignments(void) const

◆ numberAlignments() [2/2]

int Trk::FitParameters::numberAlignments ( void ) const
inline

Definition at line 233 of file FitParameters.h.

233 {
234 return m_numberAlignments;
235}

◆ numberOscillations()

int Trk::FitParameters::numberOscillations ( void ) const
inline

Definition at line 237 of file FitParameters.h.

237 {
239}

◆ numberParameters() [1/2]

void Trk::FitParameters::numberParameters ( int numberParameters)

◆ numberParameters() [2/2]

int Trk::FitParameters::numberParameters ( void ) const
inline

Definition at line 241 of file FitParameters.h.

241 {
242 return m_numberParameters;
243}

◆ numberScatterers() [1/2]

void Trk::FitParameters::numberScatterers ( int numberScatterers)

Definition at line 176 of file FitParameters.cxx.

176 {
178 if (!numberScatterers)
179 return;
180 m_scattererPhi = std::vector<double>(numberScatterers, 0.);
181 m_scattererTheta = std::vector<double>(numberScatterers, 0.);
182}
int numberScatterers(void) const

◆ numberScatterers() [2/2]

int Trk::FitParameters::numberScatterers ( void ) const
inline

Definition at line 245 of file FitParameters.h.

245 {
246 return m_numberScatterers;
247}

◆ operator=() [1/2]

FitParameters & Trk::FitParameters::operator= ( const FitParameters & )
default

◆ operator=() [2/2]

FitParameters & Trk::FitParameters::operator= ( FitParameters && )
default

◆ parameterDifference()

const Amg::MatrixX Trk::FitParameters::parameterDifference ( const Amg::VectorX & parameters) const

Definition at line 184 of file FitParameters.cxx.

185 {
187 difference(0, 0) = parameters(0) - m_d0;
188 difference(0, 1) = parameters(1) - m_z0;
190
191 // FIXME: diff is now delta(theta) : check sign
192 // difference[0][3] = parameters[4] - m_cotTheta;
193 difference(0, 3) = std::sin(parameters(4)) * m_cosTheta -
194 std::cos(parameters(4)) * m_sinTheta;
195 difference(0, 4) = (parameters(5) - m_qOverP) * Gaudi::Units::TeV;
196 return difference;
197}
double difference(int param) const
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.

◆ performCutStep()

void Trk::FitParameters::performCutStep ( double cutStep)

Definition at line 199 of file FitParameters.cxx.

199 {
200 // revert parameters to previous parameter change with cutStep*value
201 // i.e. 0 < cutstep < 1 such that cutStep = 0 gives complete reversion
202
203 Amg::VectorX cutDifferences(m_differences);
204 cutDifferences *= (cutStep - 1.);
205 Amg::VectorX oldDifferences(m_differences);
206 oldDifferences *= cutStep;
207
208 // leave phi alone when unstable
209 if (m_phiInstability) {
210 cutDifferences(2) = 0.;
211 oldDifferences(2) = (m_differences)(2);
212 }
213
214 // apply cut
215 update(cutDifferences);
216 m_differences = Amg::VectorX(std::move(oldDifferences));
217
219 m_oldDifference = 0.;
220}
void update(const Amg::VectorX &differences)
Eigen::Matrix< double, Eigen::Dynamic, 1 > VectorX
Dynamic Vector - dynamic allocation.

◆ perigee()

Perigee * Trk::FitParameters::perigee ( void ) const

Definition at line 222 of file FitParameters.cxx.

222 {
223 // copy 'final' covariance
224 AmgSymMatrix(5) covMatrix = AmgSymMatrix(5)(*m_finalCovariance);
225 const double pT = std::abs(m_sinTheta / m_qOverP);
226 double charge = 1.;
227 if (m_qOverP < 0.)
228 charge = -1.;
229 const Amg::Vector3D momentum(pT * m_cosPhi, pT * m_sinPhi, pT * m_cotTheta);
230
231 if (m_surface) {
232 return new Perigee(m_position, momentum, charge,
233 dynamic_cast<const Trk::PerigeeSurface&>(*m_surface),
234 std::move(covMatrix));
235 } else {
236 return new Perigee(m_position, momentum, charge, m_vertex,
237 std::move(covMatrix));
238 }
239}
double charge(const T &p)
Definition AtlasPID.h:1003
#define AmgSymMatrix(dim)
if(pathvar)
Eigen::Matrix< double, 3, 1 > Vector3D
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee

◆ phiInstability()

bool Trk::FitParameters::phiInstability ( void ) const

Definition at line 241 of file FitParameters.cxx.

241 {
242 return m_phiInstability;
243}

◆ position()

const Amg::Vector3D & Trk::FitParameters::position ( void ) const
inline

Definition at line 253 of file FitParameters.h.

253 {
254 return m_position;
255}

◆ print()

void Trk::FitParameters::print ( MsgStream & log) const

Definition at line 245 of file FitParameters.cxx.

245 {
246 log << std::setiosflags(std::ios::fixed | std::ios::right) << std::setw(16)
247 << std::setprecision(1) << m_position.perp() << " perigee radius"
248 << std::setw(10) << std::setprecision(3) << m_d0 << " d0" << std::setw(11)
249 << std::setprecision(3) << m_position.z() << " z0" << std::setw(11)
250 << std::setprecision(6) << std::atan2(m_sinPhi, m_cosPhi) << " phi"
251 << std::setw(11) << std::setprecision(6) << std::acos(m_cosTheta)
252 << " theta" << std::setw(13) << std::setprecision(3)
253 << m_sinTheta / (m_qOverP * Gaudi::Units::GeV) << " pT (GeV)";
254}

◆ printCovariance()

void Trk::FitParameters::printCovariance ( MsgStream & log) const

Definition at line 256 of file FitParameters.cxx.

256 {
257 double error00 = 0.;
259 if (cov(0, 0) > 0.)
260 error00 = std::sqrt(cov(0, 0));
261 double error11 = 0.;
262 if (cov(1, 1) > 0.)
263 error11 = std::sqrt(cov(1, 1));
264 double error22 = 0.;
265 if (cov(2, 2) > 0.)
266 error22 = std::sqrt(cov(2, 2));
267 double error33 = 0.;
268 if (cov(3, 3) > 0.)
269 error33 = std::sqrt(cov(3, 3));
270 double error44 = 0.;
271 if (cov(4, 4) > 0.)
272 error44 = std::sqrt(cov(4, 4));
273 double correl02 = 0.;
274 const double denom02 = cov(0, 0) * cov(2, 2);
275 if (denom02 > 0.)
276 correl02 = cov(0, 2) / std::sqrt(denom02);
277 double correl13 = 0.;
278 const double denom13 = cov(1, 1) * cov(3, 3);
279 if (denom13 > 0.)
280 correl13 = cov(1, 3) / std::sqrt(denom13);
281 log << std::setiosflags(std::ios::fixed | std::ios::right) << std::setw(10)
282 << std::setprecision(3) << error00 << std::setw(14)
283 << std::setprecision(3) << error11 << std::setw(14)
284 << std::setprecision(6) << error22 << std::setw(15)
285 << std::setprecision(6) << error33 << std::setw(19)
286 << std::setprecision(3)
287 << (error44 * m_sinTheta) / (m_qOverP * m_qOverP * Gaudi::Units::GeV)
288 << " (covariance)" << std::setw(9) << std::setprecision(3) << correl02
289 << " Cd0phi" << std::setw(8) << std::setprecision(3) << correl13
290 << " Cz0theta" << std::endl;
291}

◆ printVerbose()

void Trk::FitParameters::printVerbose ( MsgStream & log) const

Definition at line 293 of file FitParameters.cxx.

293 {
294 log << std::endl;
295
296 if (m_differences.size() != 0) {
298 log << " dParams ====" << std::setiosflags(std::ios::fixed)
299 << std::setw(10) << std::setprecision(4) << differences(0) << " (0) "
300 << std::setw(10) << std::setprecision(4) << differences(1) << " (1) "
301 << std::setw(10) << std::setprecision(5) << differences(2) << " (2) "
302 << std::setw(10) << std::setprecision(5) << differences(3) << " (3) "
303 << std::setw(13) << std::setprecision(9)
304 << differences(4) * Gaudi::Units::GeV / Gaudi::Units::TeV << " (4) ";
306 log << std::setiosflags(std::ios::fixed) << std::setw(13)
307 << std::setprecision(9)
308 << differences(5) * Gaudi::Units::GeV / Gaudi::Units::TeV << " (5) ";
309 log << std::endl;
310
311 if (m_numberAlignments) {
312 log << " dAlign ==== ";
313 unsigned param = m_firstAlignmentParameter;
314 for (int scat = 0; scat < m_numberAlignments; ++scat) {
315 ++param;
316 if (scat % 5 == 0 && scat > 0)
317 log << std::endl << " ";
318 log << std::setiosflags(std::ios::fixed) << std::setw(10)
319 << std::setprecision(6) << differences(param);
320 ++param;
321 log << std::setiosflags(std::ios::fixed) << std::setw(10)
322 << std::setprecision(6) << differences(param) << " ("
323 << std::setw(2) << scat << "A) ";
324 }
325 log << std::endl;
326 }
327
328 if (m_numberScatterers) {
329 log << " dScat ==== ";
330 unsigned param = m_firstScatteringParameter;
331 for (int scat = 0; scat < m_numberScatterers; ++scat) {
332 ++param;
333 if (scat % 5 == 0 && scat > 0)
334 log << std::endl << " ";
335 log << std::setiosflags(std::ios::fixed) << std::setw(10)
336 << std::setprecision(6) << differences(param);
337 ++param;
338 log << std::setiosflags(std::ios::fixed) << std::setw(10)
339 << std::setprecision(6) << differences(param) << " ("
340 << std::setw(2) << scat << "S) ";
341 }
342 log << std::endl;
343 }
344 }
345
346 log << std::setiosflags(std::ios::fixed | std::ios::right)
347 << " parameters: " << std::setw(12) << std::setprecision(4) << m_d0
348 << " transverse impact " << std::setw(10) << std::setprecision(4)
349 << m_position.z() << " z0 " << std::setw(10) << std::setprecision(6)
350 << std::atan2(m_sinPhi, m_cosPhi) << std::setw(10) << std::setprecision(6)
351 << m_cotTheta << " phi,cotTheta " << std::setw(13)
352 << std::setprecision(9) << m_qOverP / m_sinTheta << " inverse pT "
353 << std::setw(12) << std::setprecision(6)
354 << m_sinTheta / (m_qOverP * Gaudi::Units::GeV) << " signed pT ";
355 if (m_fitEnergyDeposit) {
356 // TODO: should give fitted energy loss
357 log << std::endl
358 << " E before/after energy deposit" << std::setw(12)
359 << std::setprecision(3) << 1. / std::abs(m_qOverP * Gaudi::Units::GeV)
360 << std::setw(12) << std::setprecision(3)
361 << 1. / std::abs(m_qOverP1 * Gaudi::Units::GeV);
362 }
363 if (m_numberAlignments) {
364 log << std::endl << " alignment number, angle, offset: ";
365 for (int align = 0; align < m_numberAlignments; ++align) {
366 log << std::setiosflags(std::ios::fixed) << std::setw(6) << align
367 << std::setw(10) << std::setprecision(6) << m_alignmentAngle[align]
368 << std::setw(10) << std::setprecision(6) << m_alignmentOffset[align];
369 if ((align + 1) % 5 == 0)
370 log << std::endl << " ";
371 }
372 }
373 if (m_numberScatterers) {
374 log << std::endl << " scatterer number, delta(phi), delta(theta): ";
375 for (int scat = 0; scat < m_numberScatterers; ++scat) {
376 log << std::setiosflags(std::ios::fixed) << std::setw(6) << scat
377 << std::setw(10) << std::setprecision(6) << m_scattererPhi[scat]
378 << std::setw(10) << std::setprecision(6) << m_scattererTheta[scat];
379 if ((scat + 1) % 5 == 0)
380 log << std::endl << " ";
381 }
382 }
383 log << std::endl;
384}
const Amg::VectorX & differences(void) const

◆ ptInv0()

double Trk::FitParameters::ptInv0 ( void ) const
inline

Definition at line 249 of file FitParameters.h.

249 {
250 return m_qOverP / m_sinTheta;
251}

◆ qOverP() [1/2]

void Trk::FitParameters::qOverP ( double value)

Definition at line 386 of file FitParameters.cxx.

386 {
387 m_qOverP = value;
388}

◆ qOverP() [2/2]

double Trk::FitParameters::qOverP ( void ) const
inline

Definition at line 257 of file FitParameters.h.

257 {
258 return m_qOverP;
259}

◆ qOverP1() [1/2]

void Trk::FitParameters::qOverP1 ( double value)

Definition at line 390 of file FitParameters.cxx.

390 {
392}

◆ qOverP1() [2/2]

double Trk::FitParameters::qOverP1 ( void ) const
inline

Definition at line 261 of file FitParameters.h.

261 {
262 return m_qOverP1;
263}

◆ reset()

void Trk::FitParameters::reset ( const FitParameters & parameters)

Definition at line 394 of file FitParameters.cxx.

394 {
395 // method is needed to complement copy in places where design uses
396 // a reference to a FitParameter pointer
397 // essentially a copy, with history of previous iteration removed
398 m_cosPhi = parameters.m_cosPhi;
399 m_cosPhi1 = parameters.m_cosPhi1;
400 m_cosTheta = parameters.m_cosTheta;
401 m_cosTheta1 = parameters.m_cosTheta1;
402 m_cotTheta = parameters.m_cotTheta;
403 m_d0 = parameters.m_d0;
404 m_extremeMomentum = parameters.m_extremeMomentum;
405 m_finalCovariance = parameters.m_finalCovariance;
406 m_firstScatteringParameter = parameters.m_firstScatteringParameter;
407 m_firstScatteringParameter = parameters.m_firstScatteringParameter;
408 m_fitEnergyDeposit = parameters.m_fitEnergyDeposit;
409 m_fitMomentum = parameters.m_fitMomentum;
410 m_fullCovariance = parameters.m_fullCovariance;
411 m_minEnergyDeposit = parameters.m_minEnergyDeposit;
412 m_numberAlignments = parameters.m_numberAlignments;
413 m_numberOscillations = parameters.m_numberOscillations;
414 m_numberParameters = parameters.m_numberParameters;
415 m_numberScatterers = parameters.m_numberScatterers;
416 m_oldDifference = parameters.m_oldDifference;
417 m_perigee = parameters.m_perigee;
418 m_phiInstability = parameters.m_phiInstability;
419 m_position = parameters.m_position;
420 m_qOverP = parameters.m_qOverP;
421 m_qOverP1 = parameters.m_qOverP1;
422 m_sinPhi = parameters.m_sinPhi;
423 m_sinPhi1 = parameters.m_sinPhi1;
424 m_sinTheta = parameters.m_sinTheta;
425 m_sinTheta1 = parameters.m_sinTheta1;
426 m_vertex = parameters.vertex();
427 m_z0 = parameters.m_z0;
428 for (int s = 0; s != m_numberAlignments; ++s) {
429 m_alignmentAngle[s] = parameters.m_alignmentAngle[s];
430 m_alignmentAngleConstraint[s] = parameters.m_alignmentAngleConstraint[s];
431 m_alignmentOffset[s] = parameters.m_alignmentOffset[s];
432 m_alignmentOffsetConstraint[s] = parameters.m_alignmentOffsetConstraint[s];
433 }
434 for (int s = 0; s != m_numberScatterers; ++s) {
435 m_scattererPhi[s] = parameters.m_scattererPhi[s];
436 m_scattererTheta[s] = parameters.m_scattererTheta[s];
437 }
438
439 // restore difference history
440 if (parameters.m_differences.size() != 0) {
441 m_differences = Amg::VectorX(parameters.m_differences);
442 } else {
444 m_differences.setZero();
445 }
446
448 m_oldDifference = 0.;
449}

◆ resetOscillations()

void Trk::FitParameters::resetOscillations ( void )
inline

Definition at line 281 of file FitParameters.h.

281 {
283}

◆ scattererPhi()

double Trk::FitParameters::scattererPhi ( int scatterer) const
inline

Definition at line 265 of file FitParameters.h.

265 {
266 return m_scattererPhi[scatterer];
267}

◆ scattererTheta()

double Trk::FitParameters::scattererTheta ( int scatterer) const
inline

Definition at line 269 of file FitParameters.h.

269 {
270 return m_scattererTheta[scatterer];
271}

◆ scatteringAngles()

ScatteringAngles Trk::FitParameters::scatteringAngles ( const FitMeasurement & fitMeasurement,
int scatterer = -1 ) const

Definition at line 451 of file FitParameters.cxx.

452 {
453 // scattering sigma used in chi2 computation
454 const double scattererSigmaTheta = 1. / fitMeasurement.weight();
455 const double scattererSigmaPhi =
456 scattererSigmaTheta /
457 fitMeasurement.intersection(FittedTrajectory).direction().perp();
458 if (scatterer < 0) {
459 return {0., 0., scattererSigmaPhi, scattererSigmaTheta};
460 } else {
461 return {m_scattererPhi[scatterer], m_scattererTheta[scatterer],
462 scattererSigmaPhi, scattererSigmaTheta};
463 }
464}
@ FittedTrajectory

◆ setPhiInstability()

void Trk::FitParameters::setPhiInstability ( void )

Definition at line 466 of file FitParameters.cxx.

466 {
467 m_phiInstability = true;
468}

◆ sinPhi()

double Trk::FitParameters::sinPhi ( void ) const
inline

Definition at line 273 of file FitParameters.h.

273 {
274 return m_sinPhi;
275}

◆ sinTheta()

double Trk::FitParameters::sinTheta ( void ) const
inline

Definition at line 277 of file FitParameters.h.

277 {
278 return m_sinTheta;
279}

◆ startingPerigee()

Perigee * Trk::FitParameters::startingPerigee ( void ) const

Definition at line 470 of file FitParameters.cxx.

470 {
471 // create momentum
472 const double pT = std::abs(m_sinTheta / m_qOverP);
473 double charge = 1.;
474 if (m_qOverP < 0.)
475 charge = -1.;
476 const Amg::Vector3D momentum(pT * m_cosPhi, pT * m_sinPhi, pT * m_cotTheta);
477
478 return new Perigee(m_position, momentum, charge, m_vertex);
479}

◆ trackParameters()

TrackParameters * Trk::FitParameters::trackParameters ( MsgStream & log,
const FitMeasurement & measurement,
bool withCovariance = false )

Definition at line 481 of file FitParameters.cxx.

482 {
483 // make checks necessary for the TrackParameters to be computed
484 // 1) a Surface is required
485 if (!measurement.surface()) {
486 log << MSG::WARNING
487 << "FitParameters::trackParameters - measurement lacks Surface"
488 << endmsg;
489 return nullptr;
490 }
491
492 // 2) a SurfaceIntersection is required
493 if (!measurement.hasIntersection(FittedTrajectory)) {
494 log << MSG::WARNING
495 << "FitParameters::trackParameters - invalid measurement" << endmsg;
496 return nullptr;
497 }
498
499 // 3) the intersection position has to lie sufficiently close to the Surface
501 measurement.intersection(FittedTrajectory);
502 Amg::Vector2D localPos;
503 if (!measurement.surface()->globalToLocal(
504 intersection.position(), intersection.direction(), localPos)) {
505 log << MSG::WARNING
506 << "FitParameters::trackParameters - globalToLocal failure" << endmsg;
507 return nullptr;
508 }
509
510 // cache parameters at EnergyDeposit
511 if (measurement.isEnergyDeposit()) {
512 m_sinTheta1 = intersection.direction().perp();
513 m_cosPhi1 = intersection.direction().x() / m_sinTheta1;
514 m_sinPhi1 = intersection.direction().y() / m_sinTheta1;
515 m_cosTheta1 = intersection.direction().z();
516 m_qOverP1 = measurement.qOverP();
517 }
518
519 // propagate full covariance to form localCovariance
520 std::optional<AmgSymMatrix(5)> covMatrix = std::nullopt;
521 if (withCovariance && (measurement.isDrift() || measurement.isCluster() ||
522 measurement.isPerigee())) {
524 const double sigma = 1. / measurement.weight();
525 const double sigma2 = 1. / measurement.weight2();
526 int const lastParameter = measurement.lastParameter();
527 Amg::MatrixX jacobian = Amg::MatrixX::Zero(5, lastParameter);
528 for (int i = 0; i != lastParameter; ++i) {
529 jacobian(0, i) = sigma * measurement.derivative(i);
530 jacobian(1, i) = sigma2 * measurement.derivative2(i);
531 }
532
533 // phi,theta derivs into jac
534 jacobian(2, 2) = 1.;
535 jacobian(3, 3) = 1.;
537 while (++i < lastParameter) {
538 jacobian(2, i) = 1.;
539 ++i;
540 jacobian(3, i) = 1.;
541 }
542
543 // only if fit to curvature
544 if (m_fitMomentum && m_qOverP) {
545 const double sinTheta = direction.perp();
546 if (m_fitEnergyDeposit && measurement.afterCalo()) {
547 const double deltaPhi =
549 const double deltaTheta =
551 jacobian(0, 5) *= Gaudi::Units::TeV;
552 jacobian(1, 5) *= Gaudi::Units::TeV;
553 jacobian(2, 5) = deltaPhi / measurement.qOverP();
554 jacobian(3, 5) = deltaTheta / measurement.qOverP();
555 jacobian(4, 5) = measurement.qOverP() / m_qOverP1;
556 } else {
557 const double deltaPhi =
558 (direction.y() * m_cosPhi - direction.x() * m_sinPhi) / sinTheta;
559 const double deltaTheta =
561 jacobian(0, 4) *= Gaudi::Units::TeV;
562 jacobian(1, 4) *= Gaudi::Units::TeV;
563 jacobian(2, 4) = deltaPhi / measurement.qOverP();
564 jacobian(3, 4) = deltaTheta / measurement.qOverP();
565 jacobian(4, 4) = measurement.qOverP() / m_qOverP;
566 }
567 } else {
568 jacobian(4, 4) = 1.;
569 }
570
571 // similarity transform
573 jacobian * m_fullCovariance->block(0, 0, lastParameter, lastParameter) *
574 jacobian.transpose());
575 }
576
577 double phi = intersection.direction().phi();
578 double theta = intersection.direction().theta();
579 if (measurement.isFlipped()) {
580 if (phi > 0.) {
581 phi -= M_PI;
582 } else {
583 phi += M_PI;
584 }
585 theta = M_PI - theta;
586 }
587
588 if (!measurement.surface()) {
589 log << MSG::WARNING
590 << "FitParameters::trackParameters - unrecognized surface" << endmsg;
591 return nullptr;
592 }
593 // finally can create the appropriate TrackParameters based on the surface
594 return measurement.surface()
595 ->createUniqueTrackParameters(localPos[locR], localPos[locZ], phi, theta,
596 measurement.qOverP(), std::move(covMatrix))
597 .release();
598}
#define M_PI
Scalar deltaPhi(const MatrixBase< Derived > &vec) const
#define endmsg
Amg::Vector3D direction(void) const
TrackSurfaceIntersection intersection(void) const
double sinTheta(void) const
Eigen::Matrix< double, 2, 1 > Vector2D
@ locR
Definition ParamDefs.h:44
@ locZ
local cylindrical
Definition ParamDefs.h:42

◆ update() [1/2]

void Trk::FitParameters::update ( Amg::Vector3D position,
Amg::Vector3D direction,
double qOverP,
const Amg::MatrixX & leadingCovariance )

Definition at line 669 of file FitParameters.cxx.

671 {
672 // update parameters after leading material corrections
674 m_sinTheta = direction.perp();
675 const double sinThetaInv = 1. / m_sinTheta;
676 m_cotTheta = sinThetaInv * m_cosTheta;
677 m_cosPhi = sinThetaInv * direction.x();
678 m_sinPhi = sinThetaInv * direction.y();
679 m_cotTheta = sinThetaInv * direction.z();
680 m_cosTheta = direction.z();
682 m_z0 = position.z();
683 m_d0 = (m_vertex.x() - position.x()) * m_sinPhi -
684 (m_vertex.y() - position.y()) * m_cosPhi;
685
686 // update covariance
687 // (*m_finalCovariance) += leadingCovariance; // ??
688 for (int i = 0; i != 5; ++i) {
689 for (int j = 0; j != 5; ++j) {
690 (*m_finalCovariance)(i, j) += leadingCovariance(i, j);
691 }
692 }
693}
double qOverP(void) const
const Amg::Vector3D & position(void) const
float j(const xAOD::IParticle &, const xAOD::TrackMeasurementValidation &hit, const Eigen::Matrix3d &jab_inv)

◆ update() [2/2]

void Trk::FitParameters::update ( const Amg::VectorX & differences)

Definition at line 600 of file FitParameters.cxx.

600 {
601 // keep update values in case of cutStep procedure
604 } else {
606 }
609
610 // misalignment parameters
611 std::vector<double>::iterator a = m_alignmentAngle.begin();
612 std::vector<double>::iterator o = m_alignmentOffset.begin();
613 int align = m_firstAlignmentParameter;
614 for (int i = 0; i != m_numberAlignments; ++i) {
615 (*a++) += differences(++align);
616 (*o++) += differences(++align);
617 }
618
619 // scattering angles
620 std::vector<double>::iterator p = m_scattererPhi.begin();
621 std::vector<double>::iterator t = m_scattererTheta.begin();
623 for (int i = 0; i != m_numberScatterers; ++i) {
624 (*p++) += differences(++scat);
625 (*t++) += differences(++scat);
626 }
627
628 // qOverP, cotTheta
629 if (m_fitMomentum)
630 m_qOverP += differences(4) / Gaudi::Units::TeV;
632
633 // impose charge conservation and decreasing energy
634 if (m_fitEnergyDeposit) {
635 m_qOverP1 += differences(5) / Gaudi::Units::TeV;
636 const double deposit = 1. / std::abs(m_qOverP) - 1. / std::abs(m_qOverP1);
637 if (std::abs(deposit) < std::abs(m_minEnergyDeposit) ||
638 deposit * m_minEnergyDeposit < 0. || m_qOverP * m_qOverP1 < 0.) {
639 m_qOverP = 1. / (1. / std::abs(m_qOverP1) + m_minEnergyDeposit);
640 if (m_qOverP1 < 0.)
642 }
643 }
644
645 // protect phi against some rounding instabilities
646 double sinDPhi = differences(2);
647 double cosDPhi = 0.;
648 if (std::abs(sinDPhi) < 1.0) {
649 cosDPhi = std::sqrt(1. - sinDPhi * sinDPhi);
650 } else {
651 if (sinDPhi > 0.) {
652 sinDPhi = 1.0;
653 } else {
654 sinDPhi = -1.0;
655 }
656 }
657
658 const double cosPhi = m_cosPhi * cosDPhi - m_sinPhi * sinDPhi;
659 m_sinPhi = m_sinPhi * cosDPhi + m_cosPhi * sinDPhi;
661 m_z0 += differences(1);
662 m_d0 += differences(0);
663 m_sinTheta = 1. / std::sqrt(1. + m_cotTheta * m_cotTheta);
666 m_vertex.y() + m_d0 * m_cosPhi, m_z0);
667}
static Double_t a

◆ vertex()

const Amg::Vector3D & Trk::FitParameters::vertex ( void ) const
inline

Definition at line 285 of file FitParameters.h.

285 {
286 return m_vertex;
287}

◆ z0()

double Trk::FitParameters::z0 ( void ) const
inline

Definition at line 289 of file FitParameters.h.

289 {
290 return m_position.z();
291}

Member Data Documentation

◆ m_alignmentAngle

std::vector<double> Trk::FitParameters::m_alignmentAngle
private

Definition at line 113 of file FitParameters.h.

◆ m_alignmentAngleConstraint

std::vector<double> Trk::FitParameters::m_alignmentAngleConstraint
private

Definition at line 114 of file FitParameters.h.

◆ m_alignmentOffset

std::vector<double> Trk::FitParameters::m_alignmentOffset
private

Definition at line 115 of file FitParameters.h.

◆ m_alignmentOffsetConstraint

std::vector<double> Trk::FitParameters::m_alignmentOffsetConstraint
private

Definition at line 116 of file FitParameters.h.

◆ m_cosPhi

double Trk::FitParameters::m_cosPhi
private

Definition at line 117 of file FitParameters.h.

◆ m_cosPhi1

double Trk::FitParameters::m_cosPhi1
private

Definition at line 118 of file FitParameters.h.

◆ m_cosTheta

double Trk::FitParameters::m_cosTheta
private

Definition at line 119 of file FitParameters.h.

◆ m_cosTheta1

double Trk::FitParameters::m_cosTheta1
private

Definition at line 120 of file FitParameters.h.

◆ m_cotTheta

double Trk::FitParameters::m_cotTheta
private

Definition at line 121 of file FitParameters.h.

◆ m_d0

double Trk::FitParameters::m_d0
private

Definition at line 122 of file FitParameters.h.

◆ m_differences

Amg::VectorX Trk::FitParameters::m_differences {}
private

Definition at line 123 of file FitParameters.h.

123{};

◆ m_eigen

bool Trk::FitParameters::m_eigen {}
private

Definition at line 124 of file FitParameters.h.

124{};

◆ m_extremeMomentum

bool Trk::FitParameters::m_extremeMomentum
private

Definition at line 125 of file FitParameters.h.

◆ m_finalCovariance

Amg::MatrixX* Trk::FitParameters::m_finalCovariance
private

Definition at line 126 of file FitParameters.h.

◆ m_firstAlignmentParameter

int Trk::FitParameters::m_firstAlignmentParameter
private

Definition at line 127 of file FitParameters.h.

◆ m_firstScatteringParameter

int Trk::FitParameters::m_firstScatteringParameter
private

Definition at line 128 of file FitParameters.h.

◆ m_fitEnergyDeposit

bool Trk::FitParameters::m_fitEnergyDeposit
private

Definition at line 129 of file FitParameters.h.

◆ m_fitMomentum

bool Trk::FitParameters::m_fitMomentum
private

Definition at line 130 of file FitParameters.h.

◆ m_fullCovariance

const Amg::MatrixX* Trk::FitParameters::m_fullCovariance
private

Definition at line 131 of file FitParameters.h.

◆ m_minEnergyDeposit

double Trk::FitParameters::m_minEnergyDeposit
private

Definition at line 132 of file FitParameters.h.

◆ m_numberAlignments

int Trk::FitParameters::m_numberAlignments
private

Definition at line 133 of file FitParameters.h.

◆ m_numberOscillations

int Trk::FitParameters::m_numberOscillations
private

Definition at line 134 of file FitParameters.h.

◆ m_numberParameters

int Trk::FitParameters::m_numberParameters
private

Definition at line 135 of file FitParameters.h.

◆ m_numberScatterers

int Trk::FitParameters::m_numberScatterers
private

Definition at line 136 of file FitParameters.h.

◆ m_oldDifference

double Trk::FitParameters::m_oldDifference
private

Definition at line 137 of file FitParameters.h.

◆ m_perigee

const Perigee* Trk::FitParameters::m_perigee
private

Definition at line 138 of file FitParameters.h.

◆ m_phiInstability

bool Trk::FitParameters::m_phiInstability
private

Definition at line 139 of file FitParameters.h.

◆ m_position

Amg::Vector3D Trk::FitParameters::m_position
private

Definition at line 140 of file FitParameters.h.

◆ m_qOverP

double Trk::FitParameters::m_qOverP
private

Definition at line 141 of file FitParameters.h.

◆ m_qOverP1

double Trk::FitParameters::m_qOverP1
private

Definition at line 142 of file FitParameters.h.

◆ m_scattererPhi

std::vector<double> Trk::FitParameters::m_scattererPhi
private

Definition at line 143 of file FitParameters.h.

◆ m_scattererTheta

std::vector<double> Trk::FitParameters::m_scattererTheta
private

Definition at line 144 of file FitParameters.h.

◆ m_sinPhi

double Trk::FitParameters::m_sinPhi
private

Definition at line 145 of file FitParameters.h.

◆ m_sinPhi1

double Trk::FitParameters::m_sinPhi1
private

Definition at line 146 of file FitParameters.h.

◆ m_sinTheta

double Trk::FitParameters::m_sinTheta
private

Definition at line 147 of file FitParameters.h.

◆ m_sinTheta1

double Trk::FitParameters::m_sinTheta1
private

Definition at line 148 of file FitParameters.h.

◆ m_surface

const Surface* Trk::FitParameters::m_surface
private

Definition at line 149 of file FitParameters.h.

◆ m_vertex

Amg::Vector3D Trk::FitParameters::m_vertex
private

Definition at line 150 of file FitParameters.h.

◆ m_z0

double Trk::FitParameters::m_z0
private

Definition at line 151 of file FitParameters.h.


The documentation for this class was generated from the following files: