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_ALIGPUCODE
109 template <typename T>
111 template <typename T>
123 GPUd() value_T update(
const o2::dataformats::VertexBase& vtx, value_T maxChi2 = 1e15);
125 template <typename T>
132 GPUd()
void checkCorrelations();
157template <
typename value_T>
163template <
typename value_T>
164GPUdi() TrackParametrizationWithError<value_T>::TrackParametrizationWithError(value_t
x, value_t
alpha, const params_t& par,
165 const covMat_t& cov,
int charge, const
PID pid)
166 : TrackParametrization<value_T>{
176template <
typename value_T>
177GPUdi()
void TrackParametrizationWithError<value_T>::set(value_t
x, value_t
alpha, const params_t& par, const covMat_t& cov,
int charge, const
PID pid)
183template <
typename value_T>
184GPUdi()
void TrackParametrizationWithError<value_T>::set(value_t
x, value_t
alpha, const value_t* par, const value_t* cov,
int charge, const
PID pid)
186 TrackParametrization<value_T>::set(
x,
alpha, par,
charge, pid);
193template <
typename value_T>
194GPUdi() auto TrackParametrizationWithError<value_T>::getCov() const -> const covMat_t&
200template <
typename value_T>
201GPUdi() auto TrackParametrizationWithError<value_T>::getSigmaY2() const -> value_t
207template <
typename value_T>
208GPUdi() auto TrackParametrizationWithError<value_T>::getSigmaZY() const -> value_t
214template <
typename value_T>
215GPUdi() auto TrackParametrizationWithError<value_T>::getSigmaZ2() const -> value_t
221template <
typename value_T>
222GPUdi() auto TrackParametrizationWithError<value_T>::getSigmaSnpY() const -> value_t
228template <
typename value_T>
229GPUdi() auto TrackParametrizationWithError<value_T>::getSigmaSnpZ() const -> value_t
235template <
typename value_T>
236GPUdi() auto TrackParametrizationWithError<value_T>::getSigmaSnp2() const -> value_t
242template <
typename value_T>
243GPUdi() auto TrackParametrizationWithError<value_T>::getSigmaTglY() const -> value_t
249template <
typename value_T>
250GPUdi() auto TrackParametrizationWithError<value_T>::getSigmaTglZ() const -> value_t
256template <
typename value_T>
257GPUdi() auto TrackParametrizationWithError<value_T>::getSigmaTglSnp() const -> value_t
263template <
typename value_T>
264GPUdi() auto TrackParametrizationWithError<value_T>::getSigmaTgl2() const -> value_t
270template <
typename value_T>
271GPUdi() auto TrackParametrizationWithError<value_T>::getSigma1PtY() const -> value_t
277template <
typename value_T>
278GPUdi() auto TrackParametrizationWithError<value_T>::getSigma1PtZ() const -> value_t
284template <
typename value_T>
285GPUdi() auto TrackParametrizationWithError<value_T>::getSigma1PtSnp() const -> value_t
291template <
typename value_T>
292GPUdi() auto TrackParametrizationWithError<value_T>::getSigma1PtTgl() const -> value_t
298template <
typename value_T>
299GPUdi() auto TrackParametrizationWithError<value_T>::getSigma1Pt2() const -> value_t
305template <
typename value_T>
306GPUdi() auto TrackParametrizationWithError<value_T>::getCovarElem(
int i,
int j) const -> value_t
308 return mC[CovarMap[
i][
j]];
312template <
typename value_T>
313GPUdi() auto TrackParametrizationWithError<value_T>::getDiagError2(
int i) const -> value_t
315 return mC[DiagMap[
i]];
319template <
typename value_T>
321GPUdi() auto TrackParametrizationWithError<value_T>::getPredictedChi2(const BaseCluster<T>& p) const -> value_t
323 const dim2_t pyz = {value_T(
p.getY()), value_T(
p.getZ())};
324 const dim3_t cov = {value_T(
p.getSigmaY2()), value_T(
p.getSigmaYZ()), value_T(
p.getSigmaZ2())};
325 return getPredictedChi2(pyz, cov);
329template <
typename value_T>
331GPUdi() auto TrackParametrizationWithError<value_T>::getPredictedChi2Quiet(const BaseCluster<T>& p) const -> value_t
333 const dim2_t pyz = {value_T(
p.getY()), value_T(
p.getZ())};
334 const dim3_t cov = {value_T(
p.getSigmaY2()), value_T(
p.getSigmaYZ()), value_T(
p.getSigmaZ2())};
335 return getPredictedChi2Quiet(pyz, cov);
339template <
typename value_T>
340GPUdi() auto TrackParametrizationWithError<value_T>::getPredictedChi2(const dim2_t& p, const dim3_t& cov) const -> value_t
342 return getPredictedChi2(
p.data(), cov.data());
346template <
typename value_T>
347GPUdi() auto TrackParametrizationWithError<value_T>::getPredictedChi2Quiet(const dim2_t& p, const dim3_t& cov) const -> value_t
349 return getPredictedChi2Quiet(
p.data(), cov.data());
353template <
typename value_T>
354GPUdi() bool TrackParametrizationWithError<value_T>::update(const dim2_t& p, const dim3_t& cov)
356 return update(
p.data(), cov.data());
360template <
typename value_T>
362GPUdi() bool TrackParametrizationWithError<value_T>::update(const BaseCluster<T>& p)
364 const dim2_t pyz = {value_T(
p.getY()), value_T(
p.getZ())};
365 const dim3_t cov = {value_T(
p.getSigmaY2()), value_T(
p.getSigmaYZ()), value_T(
p.getSigmaZ2())};
366 return update(pyz, cov);
370template <
typename value_T>
371GPUdi()
void TrackParametrizationWithError<value_T>::setCov(value_t
v,
int i)
377template <
typename value_T>
378GPUdi()
void TrackParametrizationWithError<value_T>::setCov(value_t
v,
size_t i,
size_t j)
380 mC[CovarMap[
i][
j]] =
v;
383template <
typename value_T>
384GPUdi()
void TrackParametrizationWithError<value_T>::setCov(const covMat_t& cov)
390template <
typename value_T>
391GPUdi()
void TrackParametrizationWithError<value_T>::updateCov(value_t delta,
size_t i,
size_t j)
393 mC[CovarMap[
i][
j]] += delta;
397template <
typename value_T>
398GPUdi()
void TrackParametrizationWithError<value_T>::updateCov(value_t delta,
size_t i)
404template <
typename value_T>
405GPUdi()
void TrackParametrizationWithError<value_T>::updateCov(const covMat_t& delta)
413template <
typename value_T>
414GPUdi()
void TrackParametrizationWithError<value_T>::updateCov(const params_t delta2)
417 updateCov(delta2.data());
421template <
typename value_T>
422GPUdi()
void TrackParametrizationWithError<value_T>::updateCov(const value_t* delta2)
426 mC[DiagMap[
i]] += delta2[
i];
431template <
typename value_T>
432GPUdi()
void TrackParametrizationWithError<value_T>::updateCovCorr(const params_t delta2)
435 updateCovCorr(delta2.data());
439template <
typename value_T>
440GPUdi()
void TrackParametrizationWithError<value_T>::updateCovCorr(const value_t* delta2)
443#pragma GCC diagnostic push
444#pragma GCC diagnostic ignored "-Wuninitialized"
447 auto diagI = DiagMap[
i];
448 oldDiag[
i] = mC[diagI];
449 mC[diagI] += delta2[
i];
450 for (
int j = 0;
j <
i;
j++) {
451 mC[CovarMap[
i][
j]] *= gpu::CAMath::Sqrt(mC[diagI] * mC[DiagMap[
j]] / (oldDiag[
i] * oldDiag[
j]));
454#pragma GCC diagnostic pop
458template <
typename value_T>
459GPUdi()
void TrackParametrizationWithError<value_T>::updateCov(const params_t delta2,
bool preserveCorrelations)
462 updateCov(delta2.data(), preserveCorrelations);
466template <
typename value_T>
467GPUdi()
void TrackParametrizationWithError<value_T>::updateCov(const value_t* delta2,
bool preserveCorrelations)
470 if (preserveCorrelations) {
471 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.
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 ...
Defining DataPointCompositeObject explicitly as copiable.