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.;
235 std::move(covMatrix));
238 std::move(covMatrix));
247 log << std::setiosflags(std::ios::fixed | std::ios::right) << std::setw(16)
248 << std::setprecision(1) <<
m_position.perp() <<
" perigee radius"
249 << std::setw(10) << std::setprecision(3) <<
m_d0 <<
" d0" << std::setw(11)
250 << std::setprecision(3) <<
m_position.z() <<
" z0" << std::setw(11)
252 << std::setw(11) << std::setprecision(6) << std::acos(
m_cosTheta)
253 <<
" theta" << std::setw(13) << std::setprecision(3)
261 error00 = std::sqrt(cov(0, 0));
264 error11 = std::sqrt(cov(1, 1));
267 error22 = std::sqrt(cov(2, 2));
270 error33 = std::sqrt(cov(3, 3));
273 error44 = std::sqrt(cov(4, 4));
274 double correl02 = 0.;
275 const double denom02 = cov(0, 0) * cov(2, 2);
277 correl02 = cov(0, 2) / std::sqrt(denom02);
278 double correl13 = 0.;
279 const double denom13 = cov(1, 1) * cov(3, 3);
281 correl13 = cov(1, 3) / std::sqrt(denom13);
282 log << std::setiosflags(std::ios::fixed | std::ios::right) << std::setw(10)
283 << std::setprecision(3) << error00 << std::setw(14)
284 << std::setprecision(3) << error11 << std::setw(14)
285 << std::setprecision(6) << error22 << std::setw(15)
286 << std::setprecision(6) << error33 << std::setw(19)
287 << std::setprecision(3)
289 <<
" (covariance)" << std::setw(9) << std::setprecision(3) << correl02
290 <<
" Cd0phi" << std::setw(8) << std::setprecision(3) << correl13
291 <<
" Cz0theta" << std::endl;
299 log <<
" dParams ====" << std::setiosflags(std::ios::fixed)
300 << std::setw(10) << std::setprecision(4) <<
differences(0) <<
" (0) "
301 << std::setw(10) << std::setprecision(4) <<
differences(1) <<
" (1) "
302 << std::setw(10) << std::setprecision(5) <<
differences(2) <<
" (2) "
303 << std::setw(10) << std::setprecision(5) <<
differences(3) <<
" (3) "
304 << std::setw(13) << std::setprecision(9)
305 <<
differences(4) * Gaudi::Units::GeV / Gaudi::Units::TeV <<
" (4) ";
307 log << std::setiosflags(std::ios::fixed) << std::setw(13)
308 << std::setprecision(9)
309 <<
differences(5) * Gaudi::Units::GeV / Gaudi::Units::TeV <<
" (5) ";
313 log <<
" dAlign ==== ";
317 if (scat % 5 == 0 && scat > 0)
318 log << std::endl <<
" ";
319 log << std::setiosflags(std::ios::fixed) << std::setw(10)
322 log << std::setiosflags(std::ios::fixed) << std::setw(10)
323 << std::setprecision(6) <<
differences(param) <<
" ("
324 << std::setw(2) << scat <<
"A) ";
330 log <<
" dScat ==== ";
334 if (scat % 5 == 0 && scat > 0)
335 log << std::endl <<
" ";
336 log << std::setiosflags(std::ios::fixed) << std::setw(10)
339 log << std::setiosflags(std::ios::fixed) << std::setw(10)
340 << std::setprecision(6) <<
differences(param) <<
" ("
341 << std::setw(2) << scat <<
"S) ";
347 log << std::setiosflags(std::ios::fixed | std::ios::right)
348 <<
" parameters: " << std::setw(12) << std::setprecision(4) <<
m_d0
349 <<
" transverse impact " << std::setw(10) << std::setprecision(4)
350 <<
m_position.z() <<
" z0 " << std::setw(10) << std::setprecision(6)
352 <<
m_cotTheta <<
" phi,cotTheta " << std::setw(13)
354 << std::setw(12) << std::setprecision(6)
359 <<
" E before/after energy deposit" << std::setw(12)
360 << std::setprecision(3) << 1. / std::abs(
m_qOverP * Gaudi::Units::GeV)
361 << std::setw(12) << std::setprecision(3)
362 << 1. / std::abs(
m_qOverP1 * Gaudi::Units::GeV);
365 log << std::endl <<
" alignment number, angle, offset: ";
367 log << std::setiosflags(std::ios::fixed) << std::setw(6) << align
370 if ((align + 1) % 5 == 0)
371 log << std::endl <<
" ";
375 log << std::endl <<
" scatterer number, delta(phi), delta(theta): ";
377 log << std::setiosflags(std::ios::fixed) << std::setw(6) << scat
380 if ((scat + 1) % 5 == 0)
381 log << std::endl <<
" ";
404 m_d0 = parameters.m_d0;
428 m_z0 = parameters.m_z0;
441 if (parameters.m_differences.size() != 0) {
455 const double scattererSigmaTheta = 1. / fitMeasurement.
weight();
456 const double scattererSigmaPhi =
457 scattererSigmaTheta /
460 return {0., 0., scattererSigmaPhi, scattererSigmaTheta};
463 scattererSigmaPhi, scattererSigmaTheta};
483 MsgStream& log,
const FitMeasurement& measurement,
bool withCovariance) {
488 <<
"FitParameters::trackParameters - measurement lacks Surface"
496 <<
"FitParameters::trackParameters - invalid measurement" <<
endmsg;
507 <<
"FitParameters::trackParameters - globalToLocal failure" <<
endmsg;
521 std::optional<
AmgSymMatrix(5)> covMatrix = std::nullopt;
525 const double sigma = 1. / measurement.
weight();
526 const double sigma2 = 1. / measurement.
weight2();
528 Amg::MatrixX jacobian = Amg::MatrixX::Zero(5, lastParameter);
529 for (
int i = 0; i != lastParameter; ++i) {
530 jacobian(0, i) = sigma * measurement.
derivative(i);
531 jacobian(1, i) = sigma2 * measurement.
derivative2(i);
538 while (++i < lastParameter) {
550 const double deltaTheta =
552 jacobian(0, 5) *= Gaudi::Units::TeV;
553 jacobian(1, 5) *= Gaudi::Units::TeV;
555 jacobian(3, 5) = deltaTheta / measurement.
qOverP();
560 const double deltaTheta =
562 jacobian(0, 4) *= Gaudi::Units::TeV;
563 jacobian(1, 4) *= Gaudi::Units::TeV;
565 jacobian(3, 4) = deltaTheta / measurement.
qOverP();
575 jacobian.transpose());
591 <<
"FitParameters::trackParameters - unrecognized surface" <<
endmsg;
597 measurement.
qOverP(), std::move(covMatrix))
649 if (std::abs(sinDPhi) < 1.0) {
650 cosDPhi = std::sqrt(1. - sinDPhi * sinDPhi);
689 for (
int i = 0; i != 5; ++i) {
690 for (
int j = 0; j != 5; ++j) {
691 (*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, std::optional< AmgSymMatrix(5)> cov=std::nullopt) const =0
Use the Surface as a ParametersBase constructor, from local parameters - charged.
An intersection with a Surface is given by.
const Amg::Vector3D & direction() const
Method to retrieve the direction at the Intersection.
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
@ z
global position (cartesian)
ParametersBase< TrackParametersDim, Charged > TrackParameters