11#ifndef CA_CORE_CaTrackParam_h
12#define CA_CORE_CaTrackParam_h 1
18#include <boost/serialization/access.hpp>
33 class alignas(VcMemAlign) TrackParamBase {
36 friend class boost::serialization::access;
38 static constexpr int kNtrackParam{7};
39 static constexpr int kNcovParam{(kNtrackParam) * (kNtrackParam + 1) / 2};
57 CopyBase<T1, true, true>(0, Tb, 0);
69 CopyBase<T1, false, true>(ia, Tb, 0);
76 CopyBase<fvec, false, false>(ia, Tb, ib);
84 T
Z()
const {
return fZ; }
87 T
X()
const {
return fX; }
90 T
Y()
const {
return fY; }
93 T
Tx()
const {
return fTx; }
96 T
Ty()
const {
return fTy; }
99 T
Qp()
const {
return fQp; }
105 T
Vi()
const {
return fVi; }
111 T
Ndf()
const {
return fNdf; }
123 T
C(
int i,
int j)
const
125 int ind = (j <= i) ? i * (1 + i) / 2 + j : j * (1 + j) / 2 + i;
126 return fCovMatrix[ind];
133 template<
int i,
int j>
136 constexpr int ind = (j <= i) ? i * (1 + i) / 2 + j : j * (1 + j) / 2 + i;
137 return fCovMatrix[ind];
143 T
C00()
const {
return C<0, 0>(); }
144 T
C01()
const {
return C<0, 1>(); }
145 T
C02()
const {
return C<0, 2>(); }
146 T
C03()
const {
return C<0, 3>(); }
147 T
C04()
const {
return C<0, 4>(); }
148 T
C05()
const {
return C<0, 5>(); }
149 T
C06()
const {
return C<0, 6>(); }
151 T
C10()
const {
return C<1, 0>(); }
152 T
C11()
const {
return C<1, 1>(); }
153 T
C12()
const {
return C<1, 2>(); }
154 T
C13()
const {
return C<1, 3>(); }
155 T
C14()
const {
return C<1, 4>(); }
156 T
C15()
const {
return C<1, 5>(); }
157 T
C16()
const {
return C<1, 6>(); }
159 T
C20()
const {
return C<2, 0>(); }
160 T
C21()
const {
return C<2, 1>(); }
161 T
C22()
const {
return C<2, 2>(); }
162 T
C23()
const {
return C<2, 3>(); }
163 T
C24()
const {
return C<2, 4>(); }
164 T
C25()
const {
return C<2, 5>(); }
165 T
C26()
const {
return C<2, 6>(); }
167 T
C30()
const {
return C<3, 0>(); }
168 T
C31()
const {
return C<3, 1>(); }
169 T
C32()
const {
return C<3, 2>(); }
170 T
C33()
const {
return C<3, 3>(); }
171 T
C34()
const {
return C<3, 4>(); }
172 T
C35()
const {
return C<3, 5>(); }
173 T
C36()
const {
return C<3, 6>(); }
175 T
C40()
const {
return C<4, 0>(); }
176 T
C41()
const {
return C<4, 1>(); }
177 T
C42()
const {
return C<4, 2>(); }
178 T
C43()
const {
return C<4, 3>(); }
179 T
C44()
const {
return C<4, 4>(); }
180 T
C45()
const {
return C<4, 5>(); }
181 T
C46()
const {
return C<4, 6>(); }
183 T
C50()
const {
return C<5, 0>(); }
184 T
C51()
const {
return C<5, 1>(); }
185 T
C52()
const {
return C<5, 2>(); }
186 T
C53()
const {
return C<5, 3>(); }
187 T
C54()
const {
return C<5, 4>(); }
188 T
C55()
const {
return C<5, 5>(); }
189 T
C56()
const {
return C<5, 6>(); }
191 T
C60()
const {
return C<6, 0>(); }
192 T
C61()
const {
return C<6, 1>(); }
193 T
C62()
const {
return C<6, 2>(); }
194 T
C63()
const {
return C<6, 3>(); }
195 T
C64()
const {
return C<6, 4>(); }
196 T
C65()
const {
return C<6, 5>(); }
197 T
C66()
const {
return C<6, 6>(); }
270 T
GetCharge()
const {
return utils::iif(GetQp() > T(0.), T(1.), T(-1.)); }
273 T
GetPhi()
const {
return atan2(GetTy(), GetTx()); }
279 T
GetTheta()
const {
return atan(
sqrt(GetTx() * GetTx() + GetTy() * GetTy())); }
285 T
GetP()
const {
return utils::iif(utils::fabs(GetQp()) > T(1.e-4), T(1.) / utils::fabs(GetQp()), T(1.e4)); }
288 T
GetPz()
const {
return GetP() /
sqrt(T(1.) + GetTx() * GetTx() + GetTy() * GetTy()); }
291 T
GetPx()
const {
return GetPz() * GetTx(); }
294 T
GetPy()
const {
return GetPz() * GetTy(); }
299 T t2 = GetTx() * GetTx() + GetTy() * GetTy();
300 return GetP() *
sqrt(t2 / (T(1.) + t2));
352 int ind = (j <= i) ? i * (1 + i) / 2 + j : j * (1 + j) / 2 + i;
353 fCovMatrix[ind] = val;
360 template<
int i,
int j>
363 constexpr int ind = (j <= i) ? i * (1 + i) / 2 + j : j * (1 + j) / 2 + i;
364 fCovMatrix[ind] = val;
369 void SetC00(T val) { SetCovariance<0, 0>(val); }
370 void SetC10(T val) { SetCovariance<1, 0>(val); }
371 void SetC11(T val) { SetCovariance<1, 1>(val); }
372 void SetC20(T val) { SetCovariance<2, 0>(val); }
373 void SetC21(T val) { SetCovariance<2, 1>(val); }
374 void SetC22(T val) { SetCovariance<2, 2>(val); }
375 void SetC30(T val) { SetCovariance<3, 0>(val); }
376 void SetC31(T val) { SetCovariance<3, 1>(val); }
377 void SetC32(T val) { SetCovariance<3, 2>(val); }
378 void SetC33(T val) { SetCovariance<3, 3>(val); }
379 void SetC40(T val) { SetCovariance<4, 0>(val); }
380 void SetC41(T val) { SetCovariance<4, 1>(val); }
381 void SetC42(T val) { SetCovariance<4, 2>(val); }
382 void SetC43(T val) { SetCovariance<4, 3>(val); }
383 void SetC44(T val) { SetCovariance<4, 4>(val); }
384 void SetC50(T val) { SetCovariance<5, 0>(val); }
385 void SetC51(T val) { SetCovariance<5, 1>(val); }
386 void SetC52(T val) { SetCovariance<5, 2>(val); }
387 void SetC53(T val) { SetCovariance<5, 3>(val); }
388 void SetC54(T val) { SetCovariance<5, 4>(val); }
389 void SetC55(T val) { SetCovariance<5, 5>(val); }
390 void SetC60(T val) { SetCovariance<6, 0>(val); }
391 void SetC61(T val) { SetCovariance<6, 1>(val); }
392 void SetC62(T val) { SetCovariance<6, 2>(val); }
393 void SetC63(T val) { SetCovariance<6, 3>(val); }
394 void SetC64(T val) { SetCovariance<6, 4>(val); }
395 void SetC65(T val) { SetCovariance<6, 5>(val); }
396 void SetC66(T val) { SetCovariance<6, 6>(val); }
404 T&
Z() {
return fZ; }
407 T&
X() {
return fX; }
410 T&
Y() {
return fY; }
413 T&
Tx() {
return fTx; }
416 T&
Ty() {
return fTy; }
419 T&
Qp() {
return fQp; }
425 T&
Vi() {
return fVi; }
448 int ind = (j <= i) ? i * (1 + i) / 2 + j : j * (1 + j) / 2 + i;
449 return fCovMatrix[ind];
456 template<
int i,
int j>
459 constexpr int ind = (j <= i) ? i * (1 + i) / 2 + j : j * (1 + j) / 2 + i;
460 return fCovMatrix[ind];
465 T&
C00() {
return C<0, 0>(); }
466 T&
C01() {
return C<0, 1>(); }
467 T&
C02() {
return C<0, 2>(); }
468 T&
C03() {
return C<0, 3>(); }
469 T&
C04() {
return C<0, 4>(); }
470 T&
C05() {
return C<0, 5>(); }
471 T&
C06() {
return C<0, 6>(); }
473 T&
C10() {
return C<1, 0>(); }
474 T&
C11() {
return C<1, 1>(); }
475 T&
C12() {
return C<1, 2>(); }
476 T&
C13() {
return C<1, 3>(); }
477 T&
C14() {
return C<1, 4>(); }
478 T&
C15() {
return C<1, 5>(); }
479 T&
C16() {
return C<1, 6>(); }
481 T&
C20() {
return C<2, 0>(); }
482 T&
C21() {
return C<2, 1>(); }
483 T&
C22() {
return C<2, 2>(); }
484 T&
C23() {
return C<2, 3>(); }
485 T&
C24() {
return C<2, 4>(); }
486 T&
C25() {
return C<2, 5>(); }
487 T&
C26() {
return C<2, 6>(); }
489 T&
C30() {
return C<3, 0>(); }
490 T&
C31() {
return C<3, 1>(); }
491 T&
C32() {
return C<3, 2>(); }
492 T&
C33() {
return C<3, 3>(); }
493 T&
C34() {
return C<3, 4>(); }
494 T&
C35() {
return C<3, 5>(); }
495 T&
C36() {
return C<3, 6>(); }
497 T&
C40() {
return C<4, 0>(); }
498 T&
C41() {
return C<4, 1>(); }
499 T&
C42() {
return C<4, 2>(); }
500 T&
C43() {
return C<4, 3>(); }
501 T&
C44() {
return C<4, 4>(); }
502 T&
C45() {
return C<4, 5>(); }
503 T&
C46() {
return C<4, 6>(); }
505 T&
C50() {
return C<5, 0>(); }
506 T&
C51() {
return C<5, 1>(); }
507 T&
C52() {
return C<5, 2>(); }
508 T&
C53() {
return C<5, 3>(); }
509 T&
C54() {
return C<5, 4>(); }
510 T&
C55() {
return C<5, 5>(); }
511 T&
C56() {
return C<5, 6>(); }
513 T&
C60() {
return C<6, 0>(); }
514 T&
C61() {
return C<6, 1>(); }
515 T&
C62() {
return C<6, 2>(); }
516 T&
C63() {
return C<6, 3>(); }
517 T&
C64() {
return C<6, 4>(); }
518 T&
C65() {
return C<6, 5>(); }
519 T&
C66() {
return C<6, 6>(); }
533 void ResetErrors(T c00, T c11, T c22, T c33, T c44, T c55, T c66);
537 std::string
ToString(
int i = -1)
const;
541 std::string ToStringCorrelations(
int i = -1)
const;
544 bool IsFinite(
bool printWhenWrong)
const;
547 bool IsEntryConsistent(
bool printWhenWrong,
int i)
const;
550 bool IsConsistent(
bool printWhenWrong,
int nFilled)
const;
559 template<
class Archive>
585 template<
typename T1,
bool TDoAllA,
bool TDoAllB>
604 0., 0., 0., 0., 0., 1.,
605 0., 0., 0., 0., 0., 0., 1.};
636 T
GetEta()
const {
return -
log(tan(this->GetTheta() * T(0.5))); }
675 T phiDdenom = GetTx() * GetTx() + GetTy() * GetTy();
676 T phiDTx = -GetTy() / phiDdenom;
677 T phiDTy = +GetTx() / phiDdenom;
683 T varPhi = phiDTx * phiDTx * varTx + phiDTy * phiDTy * varTy + T(2.) * phiDTx * phiDTy * covTxTy;
695 T sumSqSlopes = GetTx() * GetTx() + GetTy() * GetTy();
696 T thetaDdenom =
sqrt(sumSqSlopes) * (T(1.) + sumSqSlopes);
697 T thetaDTx = GetTx() / thetaDdenom;
698 T thetaDTy = GetTy() / thetaDdenom;
704 T varTheta = thetaDTx * thetaDTx * varTx + thetaDTy * thetaDTy * varTy + T(2.) * thetaDTx * thetaDTy * covTxTy;
706 return sqrt(varTheta);
712 template<
typename TdataA>
713 template<
typename TdataB,
bool TDoAllA,
bool TDoAllB>
716 auto copy = [&](TdataA& a,
const TdataB& b) {
722 copy(fTx, Tb.
GetTx());
723 copy(fTy, Tb.
GetTy());
724 copy(fQp, Tb.
GetQp());
727 copy(fVi, Tb.
GetVi());
729 for (
int i = 0; i < kNcovParam; ++i) {
768 using defs::ProtonMass;
769 using defs::SpeedOfLightInv;
770 fscal maxVi =
sqrt(1. + (ProtonMass<double> / minP) * (ProtonMass<double> / minP)) * SpeedOfLightInv<double>;
771 fscal minVi = SpeedOfLightInv<fscal>;
772 fscal vmean = minVi + 0.4 * (maxVi - minVi);
773 fscal dvi = (maxVi - vmean) / 3.;
std::string ToString(ECbmModuleId modId)
Common constant definitions for the Kalman Filter library.
friend fvec sqrt(const fvec &a)
friend fvec log(const fvec &a)
Implementation selection for the SIMD utilities (VS or pseudo)
Scalar version of TrackParamBase.
T GetEta() const
Gets pseudo-rapidity.
It is a technical base class of kf::TrackParam.
T GetPx() const
Gets x-component of the momentum [GeV/ec].
T C00() const
Individual getters for covariance matrix elements.
void SetOneEntry(const int ia, const TrackParamBase< fvec > &Tb, const int ib)
void SetChiSqTime(T v)
Sets Chi-square of time measurements.
T Ndf() const
Gets NDF of track fit model.
T Vi() const
Gets inverse velocity [ns/cm].
T GetPhiError() const
Gets azimuthal angle error [rad].
T GetTxError() const
Gets error of slope along x-axis.
T GetVi() const
Gets inverse velocity [ns/cm] in downstream direction.
void SetCovariance(int i, int j, T val)
Get covariance matrix element.
void SetTx(T v)
Sets slope along x-axis.
T & Ndf()
Reference to NDF of track fit model.
T GetXError() const
Gets x position error [cm].
T GetPy() const
Gets y-component of the momentum [GeV/ec].
void Set(const TrackParamBase< fvec > &Tb, const int ib)
T NdfTime() const
Gets NDF of time measurements.
T GetYError() const
Gets y position error [cm].
const CovMatrix_t & GetCovMatrix() const
Gets covariance matrix.
T GetTy() const
Gets slope along y-axis.
T C() const
Get covariance matrix element when indices are known at compile time.
T GetTimeError() const
Gets time error [ns].
T & Tx()
Reference to slope along x-axis.
T GetCharge() const
Gets charge.
void SetCovMatrix(const CovMatrix_t &val)
Sets covariance matrix.
void SetZ(T v)
Sets z position [cm].
T GetThetaError() const
Gets polar angle error [rad].
T & Time()
Reference to time [ns].
T GetPz() const
Gets z-component of the momentum [GeV/ec].
T GetZ() const
Gets z position [cm].
T & C(int i, int j)
Get a reference to the covariance matrix element.
T GetP() const
Gets momentum [GeV/ec]. For the straight tracks returns 1.e4 [GeV/ec].
void ResetErrors(T c00, T c11, T c22, T c33, T c44, T c55, T c66)
Resets variances of track parameters and chi2, ndf values.
T ChiSq() const
Gets Chi-square of track fit model.
T & Qp()
Reference to charge over momentum [ec/GeV].
T GetPhi() const
Gets azimuthal angle [rad].
T Tx() const
Gets slope along x-axis.
T GetTime() const
Gets time [ns].
void SetC00(T val)
Individual setters for covariance matrix elements.
T GetTyError() const
Gets error of slope along y-axis.
void SetY(T v)
Sets y position [cm].
void CopyBase(const int ia, const TrackParamBase< T1 > &Tb, const int ib)
Copies all/one entries from the other class.
void SetChiSq(T v)
Sets Chi-square of track fit model.
T X() const
Gets x position [cm].
T & Z()
Reference to z position [cm].
T GetTheta() const
Gets polar angle [rad].
void serialize(Archive &ar, const unsigned int)
void SetVi(T v)
Sets inverse velocity [ns/cm].
T ChiSqTime() const
Gets Chi-square of time measurements.
T GetTx() const
Gets slope along x-axis.
T & ChiSq()
Reference to Chi-square of track fit model.
T & Ty()
Reference to slope along y-axis.
T & NdfTime()
Reference to NDF of time measurements.
T & C()
Get a reference to the covariance matrix element when indices are known at compile time.
T GetViError() const
Gets inverse velocity error [ns/cm].
void SetNdf(T v)
Sets NDF of track fit model.
T & Y()
Reference to y position [cm].
T GetNdfTime() const
Gets NDF of time measurements.
T GetQp() const
Gets charge over momentum [ec/GeV].
T Y() const
Gets y position [cm].
void SetOneEntry(const int ia, const TrackParamBase< T1 > &Tb)
T GetChiSqTime() const
Gets Chi-square of time measurements.
T Qp() const
Gets charge over momentum [ec/GeV].
T Z() const
Gets z position [cm].
void InitVelocityRange(fscal minP)
Initializes inverse velocity range.
T GetPt() const
Gets transverse momentum.
T GetNdf() const
Gets NDF of track fit model.
T GetQpError() const
Gets error of charge over momentum [ec/GeV].
T Time() const
Gets time [ns].
T GetY() const
Gets y position [cm].
T & Vi()
Reference to inverse velocity [ns/cm].
T C(int i, int j) const
Get covariance matrix element.
void SetX(T v)
Sets x position [cm].
void SetNdfTime(T v)
Sets NDF of time measurements.
void SetTy(T v)
Sets slope along y-axis.
void SetCovariance(T val)
Get covariance matrix element when indices are known at compile time.
T & ChiSqTime()
Reference to Chi-square of time measurements.
CovMatrix_t & CovMatrix()
Reference to covariance matrix.
std::array< T, kNcovParam > CovMatrix_t
covariance matrix type
T GetCovariance(int i, int j) const
Get covariance matrix element.
void Set(const TrackParamBase< T1 > &Tb)
TrackParamBase(const TrackParamBase< T1 > &tr)
T GetChiSq() const
Gets Chi-square of track fit model.
T & C00()
Individual references to covariance matrix elements.
T Ty() const
Gets slope along y-axis.
void SetQp(T v)
Sets charge over momentum [ec/GeV].
T & X()
Reference to x position [cm].
void SetTime(T v)
Sets time [ns].
T GetX() const
Gets x position [cm].
TrackParam classes of different types.
Copies all/one SIMD entries from one class to the other class.