ATLAS Offline Software
Loading...
Searching...
No Matches
FitParameters.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5/***************************************************************************
6 local parameter values used during fitter
7 ***************************************************************************/
8
10
11#include <cmath>
12#include <iomanip>
13#include <iostream>
14
15#include "GaudiKernel/MsgStream.h"
16#include "GaudiKernel/SystemOfUnits.h"
20#include "TrkSurfaces/Surface.h"
23
24namespace Trk {
25
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.),
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();
56 m_cotTheta = ptInv0 * momentum.z();
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}
63
64FitParameters::FitParameters(double d0, double z0, double cosPhi, double sinPhi,
65 double cotTheta, double ptInv0,
66 const PerigeeSurface& surface)
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}
101
102
103void FitParameters::addAlignment(bool constrained, double angle,
104 double offset) {
107 if (constrained) {
110 }
112}
113
119
121 if (!m_perigee)
122 return nullptr;
123 return &m_perigee->associatedSurface();
124}
125
131
132void FitParameters::d0(double value) {
133 m_d0 = value;
135 m_vertex.y() + m_d0 * m_cosPhi, m_z0);
136}
137
139 m_extremeMomentum = value;
140 m_fitEnergyDeposit = !value;
141}
142
143void FitParameters::fitEnergyDeposit(double minEnergyDeposit) {
144 m_fitEnergyDeposit = true;
145 m_minEnergyDeposit = minEnergyDeposit;
146}
147
149 m_fitMomentum = value;
150}
151
158
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}
168
175
178 if (!numberScatterers)
179 return;
180 m_scattererPhi = std::vector<double>(numberScatterers, 0.);
181 m_scattererTheta = std::vector<double>(numberScatterers, 0.);
182}
183
185 const Amg::VectorX& parameters) const {
187 difference(0, 0) = parameters(0) - m_d0;
188 difference(0, 1) = parameters(1) - m_z0;
189 difference(0, 2) = parameters(3) * m_cosPhi - parameters(2) * m_sinPhi;
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}
198
199void FitParameters::performCutStep(double cutStep) {
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}
221
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}
240
242 return m_phiInstability;
243}
244
245void FitParameters::print(MsgStream& log) const {
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}
255
256void FitParameters::printCovariance(MsgStream& log) const {
257 double error00 = 0.;
258 const Amg::MatrixX& cov = *m_finalCovariance;
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}
292
293void FitParameters::printVerbose(MsgStream& log) const {
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}
385
386void FitParameters::qOverP(double value) {
387 m_qOverP = value;
388}
389
390void FitParameters::qOverP1(double value) {
391 m_qOverP1 = value;
392}
393
394void FitParameters::reset(const FitParameters& parameters) {
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}
450
452 const FitMeasurement& fitMeasurement, int scatterer) const {
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}
465
469
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}
480
482 MsgStream& log, const FitMeasurement& measurement, bool withCovariance) {
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
572 covMatrix = AmgSymMatrix(5)(
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}
599
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}
668
670 double qOverP,
671 const Amg::MatrixX& leadingCovariance) {
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}
694
695} // namespace Trk
#define M_PI
Scalar deltaPhi(const MatrixBase< Derived > &vec) const
#define endmsg
double charge(const T &p)
Definition AtlasPID.h:1003
#define AmgSymMatrix(dim)
static Double_t a
double angle(const GeoTrf::Vector2D &a, const GeoTrf::Vector2D &b)
bool isFlipped(void) const
bool hasIntersection(ExtrapolationType type) const
double derivative(int param) const
bool afterCalo(void) const
const TrackSurfaceIntersection & intersection(ExtrapolationType type) const
bool isCluster(void) const
double weight(void) const
bool isDrift(void) const
double weight2(void) const
unsigned lastParameter(void) const
bool isPerigee(void) const
double derivative2(int param) const
double qOverP(void) const
bool isEnergyDeposit(void) const
const Surface * surface(void) const
void addScatterer(double phi, double theta)
int numberScatterers(void) const
Amg::Vector3D direction(void) const
const Surface * m_surface
Amg::Vector3D m_position
TrackParameters * trackParameters(MsgStream &log, const FitMeasurement &measurement, bool withCovariance=false)
double qOverP(void) const
double difference(int param) const
Amg::Vector3D m_vertex
const Amg::Vector3D & position(void) const
int numberParameters(void) const
void reset(const FitParameters &parameters)
std::vector< double > m_alignmentOffsetConstraint
Perigee * perigee(void) const
std::vector< double > m_alignmentOffset
bool extremeMomentum(void) const
Amg::MatrixX * m_finalCovariance
void performCutStep(double cutStep)
double z0(void) const
void addAlignment(bool constrained, double localAngle, double localOffset)
double sinPhi(void) const
int numberAlignments(void) const
const Perigee * m_perigee
const Amg::MatrixX parameterDifference(const Amg::VectorX &parameters) const
std::vector< double > m_scattererTheta
void print(MsgStream &log) const
double ptInv0(void) const
std::vector< double > m_alignmentAngleConstraint
bool phiInstability(void) const
TrackSurfaceIntersection intersection(void) const
Perigee * startingPerigee(void) const
bool fitMomentum(void) const
void setPhiInstability(void)
double d0(void) const
bool fitEnergyDeposit(void) const
const Amg::MatrixX * m_fullCovariance
double cotTheta(void) const
void printVerbose(MsgStream &log) const
void covariance(Amg::MatrixX *finalCovariance, const Amg::MatrixX *fullCovariance)
double qOverP1(void) const
const Surface * associatedSurface(void) const
const Amg::MatrixX * finalCovariance(void) const
const Amg::VectorX & differences(void) const
void printCovariance(MsgStream &log) const
const Amg::MatrixX * fullCovariance(void) const
std::vector< double > m_alignmentAngle
FitParameters(const Perigee &perigee)
double cosPhi(void) const
ScatteringAngles scatteringAngles(const FitMeasurement &fitMeasurement, int scatterer=-1) const
double sinTheta(void) const
std::vector< double > m_scattererPhi
Amg::VectorX m_differences
void update(const Amg::VectorX &differences)
Class describing the Line to which the Perigee refers to.
represents a deflection of the track caused through multiple scattering in material.
Abstract Base Class for tracking surfaces.
Definition Surface.h:79
virtual bool globalToLocal(const Amg::Vector3D &glob, const Amg::Vector3D &mom, Amg::Vector2D &loc) const =0
Specified by each surface type: GlobalToLocal method without dynamic memory allocation - boolean chec...
virtual ChargedTrackParametersUniquePtr createUniqueTrackParameters(double l1, double l2, double phi, double theat, double qop, const std::optional< AmgSymMatrix(5)> &cov=std::nullopt) const =0
Use the Surface as a ParametersBase constructor, from local parameters - charged.
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
Eigen::Matrix< double, 2, 1 > Vector2D
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.
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
TrackSurfaceIntersection(const Amg::Vector3D &pos, const Amg::Vector3D &dir, double path)
Constructor.
@ z
global position (cartesian)
Definition ParamDefs.h:57
@ locR
Definition ParamDefs.h:44
@ theta
Definition ParamDefs.h:66
@ phi
Definition ParamDefs.h:75
@ locZ
local cylindrical
Definition ParamDefs.h:42
ParametersBase< TrackParametersDim, Charged > TrackParameters
@ FittedTrajectory
TrackSurfaceIntersection()=default