15#include "GaudiKernel/MsgStream.h"
16#include "GaudiKernel/SystemOfUnits.h"
53 const double ptInv0 = 1. / momentum.perp();
204 cutDifferences *= (cutStep - 1.);
206 oldDifferences *= cutStep;
210 cutDifferences(2) = 0.;
234 std::move(covMatrix));
237 std::move(covMatrix));
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)
251 << std::setw(11) << std::setprecision(6) << std::acos(
m_cosTheta)
252 <<
" theta" << std::setw(13) << std::setprecision(3)
260 error00 = std::sqrt(cov(0, 0));
263 error11 = std::sqrt(cov(1, 1));
266 error22 = std::sqrt(cov(2, 2));
269 error33 = std::sqrt(cov(3, 3));
272 error44 = std::sqrt(cov(4, 4));
273 double correl02 = 0.;
274 const double denom02 = cov(0, 0) * cov(2, 2);
276 correl02 = cov(0, 2) / std::sqrt(denom02);
277 double correl13 = 0.;
278 const double denom13 = cov(1, 1) * cov(3, 3);
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)
288 <<
" (covariance)" << std::setw(9) << std::setprecision(3) << correl02
289 <<
" Cd0phi" << std::setw(8) << std::setprecision(3) << correl13
290 <<
" Cz0theta" << std::endl;
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) ";
312 log <<
" dAlign ==== ";
316 if (scat % 5 == 0 && scat > 0)
317 log << std::endl <<
" ";
318 log << std::setiosflags(std::ios::fixed) << std::setw(10)
321 log << std::setiosflags(std::ios::fixed) << std::setw(10)
322 << std::setprecision(6) <<
differences(param) <<
" ("
323 << std::setw(2) << scat <<
"A) ";
329 log <<
" dScat ==== ";
333 if (scat % 5 == 0 && scat > 0)
334 log << std::endl <<
" ";
335 log << std::setiosflags(std::ios::fixed) << std::setw(10)
338 log << std::setiosflags(std::ios::fixed) << std::setw(10)
339 << std::setprecision(6) <<
differences(param) <<
" ("
340 << std::setw(2) << scat <<
"S) ";
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)
351 <<
m_cotTheta <<
" phi,cotTheta " << std::setw(13)
353 << std::setw(12) << std::setprecision(6)
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);
364 log << std::endl <<
" alignment number, angle, offset: ";
366 log << std::setiosflags(std::ios::fixed) << std::setw(6) << align
369 if ((align + 1) % 5 == 0)
370 log << std::endl <<
" ";
374 log << std::endl <<
" scatterer number, delta(phi), delta(theta): ";
376 log << std::setiosflags(std::ios::fixed) << std::setw(6) << scat
379 if ((scat + 1) % 5 == 0)
380 log << std::endl <<
" ";
403 m_d0 = parameters.m_d0;
427 m_z0 = parameters.m_z0;
440 if (parameters.m_differences.size() != 0) {
454 const double scattererSigmaTheta = 1. / fitMeasurement.
weight();
455 const double scattererSigmaPhi =
456 scattererSigmaTheta /
459 return {0., 0., scattererSigmaPhi, scattererSigmaTheta};
462 scattererSigmaPhi, scattererSigmaTheta};
482 MsgStream& log,
const FitMeasurement& measurement,
bool withCovariance) {
487 <<
"FitParameters::trackParameters - measurement lacks Surface"
495 <<
"FitParameters::trackParameters - invalid measurement" <<
endmsg;
506 <<
"FitParameters::trackParameters - globalToLocal failure" <<
endmsg;
520 std::optional<
AmgSymMatrix(5)> covMatrix = std::nullopt;
524 const double sigma = 1. / measurement.
weight();
525 const double sigma2 = 1. / measurement.
weight2();
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);
537 while (++i < lastParameter) {
549 const double deltaTheta =
551 jacobian(0, 5) *= Gaudi::Units::TeV;
552 jacobian(1, 5) *= Gaudi::Units::TeV;
554 jacobian(3, 5) = deltaTheta / measurement.
qOverP();
559 const double deltaTheta =
561 jacobian(0, 4) *= Gaudi::Units::TeV;
562 jacobian(1, 4) *= Gaudi::Units::TeV;
564 jacobian(3, 4) = deltaTheta / measurement.
qOverP();
574 jacobian.transpose());
590 <<
"FitParameters::trackParameters - unrecognized surface" <<
endmsg;
596 measurement.
qOverP(), std::move(covMatrix))
648 if (std::abs(sinDPhi) < 1.0) {
649 cosDPhi = std::sqrt(1. - sinDPhi * sinDPhi);
688 for (
int i = 0; i != 5; ++i) {
689 for (
int j = 0; j != 5; ++j) {
690 (*m_finalCovariance)(i, j) += leadingCovariance(i, j);
Scalar deltaPhi(const MatrixBase< Derived > &vec) const
double charge(const T &p)
#define AmgSymMatrix(dim)
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
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
TrackParameters * trackParameters(MsgStream &log, const FitMeasurement &measurement, bool withCovariance=false)
double qOverP(void) const
double difference(int param) const
const Amg::Vector3D & position(void) const
int numberParameters(void) const
void reset(const FitParameters ¶meters)
std::vector< double > m_alignmentOffsetConstraint
Perigee * perigee(void) const
std::vector< double > m_alignmentOffset
bool extremeMomentum(void) const
double m_minEnergyDeposit
Amg::MatrixX * m_finalCovariance
void performCutStep(double cutStep)
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 ¶meters) 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)
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
int m_firstScatteringParameter
FitParameters(const Perigee &perigee)
double cosPhi(void) const
ScatteringAngles scatteringAngles(const FitMeasurement &fitMeasurement, int scatterer=-1) const
int m_firstAlignmentParameter
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.
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)
ParametersBase< TrackParametersDim, Charged > TrackParameters
TrackSurfaceIntersection()=default