256 static size_t hash(
float x,
float alp,
float y,
float z,
float snp,
float tgl,
float q2pt);
267 static constexpr
value_t InvalidX = -99999.
f;
273 uint16_t mUserField = 0;
275 ClassDefNV(TrackParametrization, 3);
279template <
typename value_T>
284 math_utils::detail::bringToPMPi<value_t>(mAlpha);
291template <
typename value_T>
292GPUdi()
void TrackParametrization<value_T>::set(value_t
x, value_t
alpha, const params_t& par,
int charge, const
PID pid)
298template <
typename value_T>
299GPUdi()
void TrackParametrization<value_T>::set(value_t
x, value_t
alpha, const value_t* par,
int charge, const
PID pid)
303 math_utils::detail::bringToPMPi<value_t>(mAlpha);
312template <
typename value_T>
313GPUdi() auto TrackParametrization<value_T>::getParams() const -> const value_t*
319template <
typename value_T>
320GPUdi() auto TrackParametrization<value_T>::getParam(
int i) const -> value_t
326template <
typename value_T>
327GPUdi() auto TrackParametrization<value_T>::getX() const -> value_t
333template <
typename value_T>
334GPUdi() auto TrackParametrization<value_T>::getAlpha() const -> value_t
340template <
typename value_T>
341GPUdi() auto TrackParametrization<value_T>::getY() const -> value_t
347template <
typename value_T>
348GPUdi() auto TrackParametrization<value_T>::getZ() const -> value_t
354template <
typename value_T>
355GPUdi() auto TrackParametrization<value_T>::getSnp() const -> value_t
361template <
typename value_T>
362GPUdi() auto TrackParametrization<value_T>::getTgl() const -> value_t
368template <
typename value_T>
369GPUhdi() auto TrackParametrization<value_T>::getQ2Pt() const -> value_t
375template <
typename value_T>
376GPUdi() auto TrackParametrization<value_T>::getCharge2Pt() const -> value_t
378 return mAbsCharge ? mP[
kQ2Pt] : 0.f;
382template <
typename value_T>
383GPUdi()
int TrackParametrization<value_T>::getAbsCharge()
const
389template <
typename value_T>
390GPUdi()
PID TrackParametrization<value_T>::getPID()
const
396template <
typename value_T>
397GPUdi()
void TrackParametrization<value_T>::setPID(const
PID pid,
bool passCharge)
401 setAbsCharge(
pid.getCharge());
406template <
typename value_T>
407GPUdi() auto TrackParametrization<value_T>::getCsp2() const -> value_t
414template <
typename value_T>
415GPUdi() auto TrackParametrization<value_T>::getCsp() const -> value_t
417 return gpu::CAMath::Sqrt(getCsp2());
421template <
typename value_T>
422GPUdi()
void TrackParametrization<value_T>::setX(value_t
v)
428template <
typename value_T>
429GPUdi()
void TrackParametrization<value_T>::setParam(value_t
v,
int i)
435template <
typename value_T>
436GPUdi()
void TrackParametrization<value_T>::setAlpha(value_t
v)
439 math_utils::detail::bringToPMPi<value_t>(mAlpha);
443template <
typename value_T>
444GPUdi()
void TrackParametrization<value_T>::setY(value_t
v)
450template <
typename value_T>
451GPUdi()
void TrackParametrization<value_T>::setZ(value_t
v)
457template <
typename value_T>
458GPUdi()
void TrackParametrization<value_T>::setSnp(value_t
v)
464template <
typename value_T>
465GPUdi()
void TrackParametrization<value_T>::setTgl(value_t
v)
471template <
typename value_T>
472GPUdi()
void TrackParametrization<value_T>::setQ2Pt(value_t
v)
478template <
typename value_T>
479GPUdi()
void TrackParametrization<value_T>::setAbsCharge(
int q)
481 mAbsCharge = gpu::CAMath::Abs(q);
485template <
typename value_T>
486GPUdi()
void TrackParametrization<value_T>::getCircleParamsLoc(value_t bz,
o2::math_utils::CircleXY<value_t>&
c)
const
489 c.rC = getCurvature(bz);
491 constexpr value_t MinSagitta = 0.01f, TPCMidR = 160.f, MinCurv = 8 * MinSagitta / (TPCMidR * TPCMidR);
492 if (gpu::CAMath::Abs(
c.rC) > MinCurv) {
493 c.rC = 1.f / getCurvature(bz);
494 value_t sn = getSnp(), cs = gpu::CAMath::Sqrt((1.f - sn) * (1.f + sn));
495 c.xC =
getX() - sn *
c.rC;
496 c.yC =
getY() + cs *
c.rC;
497 c.rC = gpu::CAMath::Abs(
c.rC);
506template <
typename value_T>
507GPUdi()
void TrackParametrization<value_T>::getCircleParams(value_t bz,
o2::math_utils::CircleXY<value_t>&
c, value_t& sna, value_t& csa)
const
510 getCircleParamsLoc(bz,
c);
511 o2::math_utils::detail::sincos(getAlpha(), sna, csa);
512 o2::math_utils::detail::rotateZ<value_t>(
c.xC,
c.yC,
c.xC,
c.yC, sna, csa);
516template <
typename value_T>
517GPUdi()
void TrackParametrization<value_T>::getLineParams(
o2::math_utils::IntervalXY<value_t>& ln, value_t& sna, value_t& csa)
const
520 o2::math_utils::detail::sincos(getAlpha(), sna, csa);
521 o2::math_utils::detail::rotateZ<value_t>(
getX(),
getY(), ln.getX0(), ln.getY0(), sna, csa);
522 value_t snp = getSnp(), csp = gpu::CAMath::Sqrt((1.f - snp) * (1.f + snp));
523 ln.setDX(csp * csa - snp * sna);
524 ln.setDY(snp * csa + csp * sna);
528template <
typename value_T>
529GPUdi() auto TrackParametrization<value_T>::getCurvature(value_t
b) const -> value_t
535template <
typename value_T>
536GPUdi()
int TrackParametrization<value_T>::getCharge()
const
538 return getSign() > 0 ? mAbsCharge : -mAbsCharge;
542template <
typename value_T>
543GPUdi()
int TrackParametrization<value_T>::getSign()
const
545 return mAbsCharge ? (mP[
kQ2Pt] > 0.f ? 1 : -1) : 0;
549template <
typename value_T>
550GPUdi() auto TrackParametrization<value_T>::getPhi() const -> value_t
553 value_t phi = gpu::CAMath::ASin(getSnp()) + getAlpha();
554 math_utils::detail::bringTo02Pi<value_t>(phi);
559template <
typename value_T>
560GPUdi() auto TrackParametrization<value_T>::getPhiPos() const -> value_t
564 math_utils::detail::bringTo02Pi<value_t>(phi);
569template <
typename value_T>
570GPUdi() auto TrackParametrization<value_T>::getQ2P2() const -> value_t
577 return q2pt2 / (1.f + getTgl() * getTgl());
581template <
typename value_T>
582GPUdi() auto TrackParametrization<value_T>::getPtInv() const -> value_t
589 return (mAbsCharge > 1) ? ptInv / mAbsCharge : ptInv;
593template <
typename value_T>
594GPUdi() auto TrackParametrization<value_T>::getP2Inv() const -> value_t
598 return p2 *
p2 / (1.f + getTgl() * getTgl());
602template <
typename value_T>
603GPUdi() auto TrackParametrization<value_T>::getP2() const -> value_t
606 return 1.f / getP2Inv();
610template <
typename value_T>
611GPUdi() auto TrackParametrization<value_T>::getPInv() const -> value_t
614 return getPtInv() / gpu::CAMath::Sqrt(1.f + getTgl() * getTgl());
618template <
typename value_T>
619GPUdi() auto TrackParametrization<value_T>::getP() const -> value_t
622 return 1.f / getPInv();
626template <
typename value_T>
627GPUdi() auto TrackParametrization<value_T>::getE2() const -> value_t
630 return getP2() + getPID().getMass2();
634template <
typename value_T>
635GPUdi() auto TrackParametrization<value_T>::getE() const -> value_t
638 return gpu::CAMath::Sqrt(getE2());
642template <
typename value_T>
643GPUdi() auto TrackParametrization<value_T>::getPt() const -> value_t
646 return 1.f / getPtInv();
650template <
typename value_T>
651GPUdi() auto TrackParametrization<value_T>::getTheta() const -> value_t
657template <
typename value_T>
658GPUdi() auto TrackParametrization<value_T>::getEta() const -> value_t
660 return -gpu::CAMath::Log(gpu::CAMath::Tan(0.5f * getTheta()));
664template <
typename value_T>
665GPUdi() auto TrackParametrization<value_T>::getXYZGlo() const -> math_utils::
Point3D<value_t>
667#ifndef GPUCA_ALIGPUCODE
668 return math_utils::Rotation2D<value_t>(getAlpha())(math_utils::Point3D<value_t>(
getX(),
getY(), getZ()));
671 gpu::CAMath::SinCos(getAlpha(), sina, cosa);
672 return math_utils::Point3D<value_t>(cosa *
getX() - sina *
getY(), cosa *
getY() + sina *
getX(), getZ());
677template <
typename value_T>
678GPUdi()
void TrackParametrization<value_T>::getXYZGlo(dim3_t& xyz)
const
684 math_utils::detail::rotateZ<value_t>(xyz, getAlpha());
688template <
typename value_T>
689GPUdi() auto TrackParametrization<value_T>::getXYZGloAt(value_t xk, value_t
b,
bool& ok) const -> math_utils::
Point3D<value_t>
695 ok = getYZAt(xk,
b,
y,
z);
697#ifndef GPUCA_ALIGPUCODE
698 return math_utils::Rotation2D<value_t>(getAlpha())(math_utils::Point3D<value_t>(xk,
y,
z));
701 gpu::CAMath::SinCos(getAlpha(), sina, cosa);
702 return math_utils::Point3D<value_t>(cosa * xk - sina *
y, cosa *
y + sina * xk,
z);
705 return math_utils::Point3D<value_t>();
710template <
typename value_T>
711GPUdi() bool TrackParametrization<value_T>::
isValid()
const
713 return mX != InvalidX;
717template <
typename value_T>
718GPUdi()
void TrackParametrization<value_T>::invalidate()
723template <
typename value_T>
729template <
typename value_T>
730GPUhdi()
void TrackParametrization<value_T>::setUserField(uint16_t
v)
736template <
typename value_T>
737GPUdi()
void TrackParametrization<value_T>::updateParam(value_t delta,
int i)
743template <
typename value_T>
744GPUdi()
void TrackParametrization<value_T>::updateParams(const params_t& delta)
746 updateParams(delta.data());
750template <
typename value_T>
751GPUdi()
void TrackParametrization<value_T>::updateParams(const value_t* delta)
764#ifndef GPUCA_ALIGPUCODE
765template <
typename value_T>
768 size_t h = std::hash<float>{}(o2::math_utils::detail::truncateFloatFraction(
x, 0xFFFFFFF0));
769 h ^= std::hash<float>{}(o2::math_utils::detail::truncateFloatFraction(alp, 0xFFFFFFF0)) << 1;
770 h ^= std::hash<float>{}(o2::math_utils::detail::truncateFloatFraction(
y, 0xFFFFFFF0)) << 1;
771 h ^= std::hash<float>{}(o2::math_utils::detail::truncateFloatFraction(
z, 0xFFFFFFF0)) << 1;
772 h ^= std::hash<float>{}(o2::math_utils::detail::truncateFloatFraction(snp, 0xFFFFFF00)) << 1;
773 h ^= std::hash<float>{}(o2::math_utils::detail::truncateFloatFraction(tgl, 0xFFFFFF00)) << 1;
774 h ^= std::hash<float>{}(o2::math_utils::detail::truncateFloatFraction(q2pt, 0xFFFFFC00)) << 1;