17#ifndef INCLUDE_RECONSTRUCTIONDATAFORMATS_TRACKPARAMETRIZATIONWITHERROR_H_
18#define INCLUDE_RECONSTRUCTIONDATAFORMATS_TRACKPARAMETRIZATIONWITHERROR_H_
30template <
typename value_T =
float>
39#ifndef GPUCA_GPUCODE_DEVICE
40 static_assert(std::is_floating_point_v<value_t>);
43 using covMat_t = std::array<value_t, kCovMatSize>;
85 GPUd()
void printHexadecimal();
86#ifndef GPUCA_GPUCODE_DEVICE
109 template <typename T>
111 template <typename T>
124 GPUd() value_T update(
const o2::dataformats::VertexBase& vtx, value_T maxChi2 = 1e15);
126 template <typename T>
133 GPUd()
void checkCorrelations();
158template <
typename value_T>
164template <
typename value_T>
165GPUdi() TrackParametrizationWithError<value_T>::TrackParametrizationWithError(value_t
x, value_t
alpha, const params_t& par,
166 const covMat_t& cov,
int charge, const
PID pid)
167 : TrackParametrization<value_T>{
177template <
typename value_T>
178GPUdi()
void TrackParametrizationWithError<value_T>::set(value_t
x, value_t
alpha, const params_t& par, const covMat_t& cov,
int charge, const
PID pid)
184template <
typename value_T>
185GPUdi()
void TrackParametrizationWithError<value_T>::set(value_t
x, value_t
alpha, const value_t* par, const value_t* cov,
int charge, const
PID pid)
187 TrackParametrization<value_T>::set(
x,
alpha, par,
charge, pid);
194template <
typename value_T>
195GPUdi() auto TrackParametrizationWithError<value_T>::getCov() const -> const covMat_t&
201template <
typename value_T>
202GPUdi() auto TrackParametrizationWithError<value_T>::getSigmaY2() const -> value_t
208template <
typename value_T>
209GPUdi() auto TrackParametrizationWithError<value_T>::getSigmaZY() const -> value_t
215template <
typename value_T>
216GPUdi() auto TrackParametrizationWithError<value_T>::getSigmaZ2() const -> value_t
222template <
typename value_T>
223GPUdi() auto TrackParametrizationWithError<value_T>::getSigmaSnpY() const -> value_t
229template <
typename value_T>
230GPUdi() auto TrackParametrizationWithError<value_T>::getSigmaSnpZ() const -> value_t
236template <
typename value_T>
237GPUdi() auto TrackParametrizationWithError<value_T>::getSigmaSnp2() const -> value_t
243template <
typename value_T>
244GPUdi() auto TrackParametrizationWithError<value_T>::getSigmaTglY() const -> value_t
250template <
typename value_T>
251GPUdi() auto TrackParametrizationWithError<value_T>::getSigmaTglZ() const -> value_t
257template <
typename value_T>
258GPUdi() auto TrackParametrizationWithError<value_T>::getSigmaTglSnp() const -> value_t
264template <
typename value_T>
265GPUdi() auto TrackParametrizationWithError<value_T>::getSigmaTgl2() const -> value_t
271template <
typename value_T>
272GPUdi() auto TrackParametrizationWithError<value_T>::getSigma1PtY() const -> value_t
278template <
typename value_T>
279GPUdi() auto TrackParametrizationWithError<value_T>::getSigma1PtZ() const -> value_t
285template <
typename value_T>
286GPUdi() auto TrackParametrizationWithError<value_T>::getSigma1PtSnp() const -> value_t
292template <
typename value_T>
293GPUdi() auto TrackParametrizationWithError<value_T>::getSigma1PtTgl() const -> value_t
299template <
typename value_T>
300GPUdi() auto TrackParametrizationWithError<value_T>::getSigma1Pt2() const -> value_t
306template <
typename value_T>
307GPUdi() auto TrackParametrizationWithError<value_T>::getCovarElem(
int i,
int j) const -> value_t
309 return mC[CovarMap[
i][
j]];
313template <
typename value_T>
314GPUdi() auto TrackParametrizationWithError<value_T>::getDiagError2(
int i) const -> value_t
316 return mC[DiagMap[
i]];
320template <
typename value_T>
322GPUdi() auto TrackParametrizationWithError<value_T>::getPredictedChi2(const BaseCluster<T>& p) const -> value_t
324 const dim2_t pyz = {value_T(
p.getY()), value_T(
p.getZ())};
325 const dim3_t cov = {value_T(
p.getSigmaY2()), value_T(
p.getSigmaYZ()), value_T(
p.getSigmaZ2())};
326 return getPredictedChi2(pyz, cov);
330template <
typename value_T>
332GPUdi() auto TrackParametrizationWithError<value_T>::getPredictedChi2Quiet(const BaseCluster<T>& p) const -> value_t
334 const dim2_t pyz = {value_T(
p.getY()), value_T(
p.getZ())};
335 const dim3_t cov = {value_T(
p.getSigmaY2()), value_T(
p.getSigmaYZ()), value_T(
p.getSigmaZ2())};
336 return getPredictedChi2Quiet(pyz, cov);
340template <
typename value_T>
341GPUdi() auto TrackParametrizationWithError<value_T>::getPredictedChi2(const dim2_t& p, const dim3_t& cov) const -> value_t
343 return getPredictedChi2(
p.data(), cov.data());
347template <
typename value_T>
348GPUdi() auto TrackParametrizationWithError<value_T>::getPredictedChi2Quiet(const dim2_t& p, const dim3_t& cov) const -> value_t
350 return getPredictedChi2Quiet(
p.data(), cov.data());
354template <
typename value_T>
355GPUdi() bool TrackParametrizationWithError<value_T>::update(const dim2_t& p, const dim3_t& cov)
357 return update(
p.data(), cov.data());
361template <
typename value_T>
363GPUdi() bool TrackParametrizationWithError<value_T>::update(const BaseCluster<T>& p)
365 const dim2_t pyz = {value_T(
p.getY()), value_T(
p.getZ())};
366 const dim3_t cov = {value_T(
p.getSigmaY2()), value_T(
p.getSigmaYZ()), value_T(
p.getSigmaZ2())};
367 return update(pyz, cov);
371template <
typename value_T>
372GPUdi()
void TrackParametrizationWithError<value_T>::setCov(value_t
v,
int i)
378template <
typename value_T>
379GPUdi()
void TrackParametrizationWithError<value_T>::setCov(value_t
v,
size_t i,
size_t j)
381 mC[CovarMap[
i][
j]] =
v;
384template <
typename value_T>
385GPUdi()
void TrackParametrizationWithError<value_T>::setCov(const covMat_t& cov)
391template <
typename value_T>
392GPUdi()
void TrackParametrizationWithError<value_T>::updateCov(value_t delta,
size_t i,
size_t j)
394 mC[CovarMap[
i][
j]] += delta;
398template <
typename value_T>
399GPUdi()
void TrackParametrizationWithError<value_T>::updateCov(value_t delta,
size_t i)
405template <
typename value_T>
406GPUdi()
void TrackParametrizationWithError<value_T>::updateCov(const covMat_t& delta)
414template <
typename value_T>
415GPUdi()
void TrackParametrizationWithError<value_T>::updateCov(const params_t delta2)
418 updateCov(delta2.data());
422template <
typename value_T>
423GPUdi()
void TrackParametrizationWithError<value_T>::updateCov(const value_t* delta2)
427 mC[DiagMap[
i]] += delta2[
i];
432template <
typename value_T>
433GPUdi()
void TrackParametrizationWithError<value_T>::updateCovCorr(const params_t delta2)
436 updateCovCorr(delta2.data());
440template <
typename value_T>
441GPUdi()
void TrackParametrizationWithError<value_T>::updateCovCorr(const value_t* delta2)
444#pragma GCC diagnostic push
445#pragma GCC diagnostic ignored "-Wuninitialized"
448 auto diagI = DiagMap[
i];
449 oldDiag[
i] = mC[diagI];
450 mC[diagI] += delta2[
i];
451 for (
int j = 0;
j <
i;
j++) {
452 mC[CovarMap[
i][
j]] *= gpu::CAMath::Sqrt(mC[diagI] * mC[DiagMap[
j]] / (oldDiag[
i] * oldDiag[
j]));
455#pragma GCC diagnostic pop
459template <
typename value_T>
460GPUdi()
void TrackParametrizationWithError<value_T>::updateCov(const params_t delta2,
bool preserveCorrelations)
463 updateCov(delta2.data(), preserveCorrelations);
467template <
typename value_T>
468GPUdi()
void TrackParametrizationWithError<value_T>::updateCov(const value_t* delta2,
bool preserveCorrelations)
471 if (preserveCorrelations) {
472 updateCovCorr(delta2);
bool toFwdTrackParCov(TrackParCovFwd &t) const
const dim3_t const std::array< value_t, kLabCovMatSize > int bool sectorAlpha
value_t const params_t & par
const dim3_t const std::array< value_t, kLabCovMatSize > & cv
GPUd() TrackParametrizationWithError(value_t x
const dim3_t const std::array< value_t, kLabCovMatSize > int sign
bool preserveCorrelations
value_t const params_t const covMat_t & cov
ClassDefNV(TrackParametrizationWithError, 2)
std::array< value_t, kCovMatSize > covMat_t
value_t const params_t const covMat_t int charge
GPUhd() TrackParametrizationWithError()
const MatrixDSym5 & covInv
GPUdDefault() ~TrackParametrizationWithError()=default
TrackParametrization< value_T > & linRef
std::string asString() const
std::string asStringHexadecimal()
value_t const params_t const covMat_t int const PID pid
TrackParametrization< value_T > value_t bz
GPUd() bool testRotate(value_t alpha) const
std::array< value_t, 2 > dim2_t
std::array< value_t, kNParams > params_t
std::array< value_t, 3 > dim3_t
GLfloat GLfloat GLfloat alpha
GLboolean GLboolean GLboolean b
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
typename trackParam_t::dim3_t dim3_t
typename trackParam_t::dim2_t dim2_t
typename trackParam_t::value_t value_t
Node par(int index)
Parameters.
const bool const int TrackITSInternal< NLayers > & track
GPUhdi() uint16_t TrackParametrization< value_T >
GPUdi() TrackParametrization< value_T >
constexpr int kCovMatSize
constexpr int kLabCovMatSize
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...