255 static size_t hash(
float x,
float alp,
float y,
float z,
float snp,
float tgl,
float q2pt);
266 static constexpr
value_t InvalidX = -99999.
f;
272 uint16_t mUserField = 0;
274 ClassDefNV(TrackParametrization, 3);
278template <
typename value_T>
283 math_utils::detail::bringToPMPi<value_t>(mAlpha);
290template <
typename value_T>
291GPUdi()
void TrackParametrization<value_T>::set(value_t
x, value_t
alpha, const params_t& par,
int charge, const
PID pid)
297template <
typename value_T>
298GPUdi()
void TrackParametrization<value_T>::set(value_t
x, value_t
alpha, const value_t* par,
int charge, const
PID pid)
302 math_utils::detail::bringToPMPi<value_t>(mAlpha);
311template <
typename value_T>
312GPUdi() auto TrackParametrization<value_T>::getParams() const -> const value_t*
318template <
typename value_T>
319GPUdi() auto TrackParametrization<value_T>::getParam(
int i) const -> value_t
325template <
typename value_T>
326GPUdi() auto TrackParametrization<value_T>::getX() const -> value_t
332template <
typename value_T>
333GPUdi() auto TrackParametrization<value_T>::getAlpha() const -> value_t
339template <
typename value_T>
340GPUdi() auto TrackParametrization<value_T>::getY() const -> value_t
346template <
typename value_T>
347GPUdi() auto TrackParametrization<value_T>::getZ() const -> value_t
353template <
typename value_T>
354GPUdi() auto TrackParametrization<value_T>::getSnp() const -> value_t
360template <
typename value_T>
361GPUdi() auto TrackParametrization<value_T>::getTgl() const -> value_t
367template <
typename value_T>
368GPUhdi() auto TrackParametrization<value_T>::getQ2Pt() const -> value_t
374template <
typename value_T>
375GPUdi() auto TrackParametrization<value_T>::getCharge2Pt() const -> value_t
377 return mAbsCharge ? mP[
kQ2Pt] : 0.f;
381template <
typename value_T>
382GPUdi()
int TrackParametrization<value_T>::getAbsCharge()
const
388template <
typename value_T>
389GPUdi()
PID TrackParametrization<value_T>::getPID()
const
395template <
typename value_T>
396GPUdi()
void TrackParametrization<value_T>::setPID(const
PID pid,
bool passCharge)
400 setAbsCharge(
pid.getCharge());
405template <
typename value_T>
406GPUdi() auto TrackParametrization<value_T>::getCsp2() const -> value_t
413template <
typename value_T>
414GPUdi() auto TrackParametrization<value_T>::getCsp() const -> value_t
416 return gpu::CAMath::Sqrt(getCsp2());
420template <
typename value_T>
421GPUdi()
void TrackParametrization<value_T>::setX(value_t
v)
427template <
typename value_T>
428GPUdi()
void TrackParametrization<value_T>::setParam(value_t
v,
int i)
434template <
typename value_T>
435GPUdi()
void TrackParametrization<value_T>::setAlpha(value_t
v)
438 math_utils::detail::bringToPMPi<value_t>(mAlpha);
442template <
typename value_T>
443GPUdi()
void TrackParametrization<value_T>::setY(value_t
v)
449template <
typename value_T>
450GPUdi()
void TrackParametrization<value_T>::setZ(value_t
v)
456template <
typename value_T>
457GPUdi()
void TrackParametrization<value_T>::setSnp(value_t
v)
463template <
typename value_T>
464GPUdi()
void TrackParametrization<value_T>::setTgl(value_t
v)
470template <
typename value_T>
471GPUdi()
void TrackParametrization<value_T>::setQ2Pt(value_t
v)
477template <
typename value_T>
478GPUdi()
void TrackParametrization<value_T>::setAbsCharge(
int q)
480 mAbsCharge = gpu::CAMath::Abs(q);
484template <
typename value_T>
485GPUdi()
void TrackParametrization<value_T>::getCircleParamsLoc(value_t bz,
o2::math_utils::CircleXY<value_t>&
c)
const
488 c.rC = getCurvature(bz);
490 constexpr value_t MinSagitta = 0.01f, TPCMidR = 160.f, MinCurv = 8 * MinSagitta / (TPCMidR * TPCMidR);
491 if (gpu::CAMath::Abs(
c.rC) > MinCurv) {
492 c.rC = 1.f / getCurvature(bz);
493 value_t sn = getSnp(), cs = gpu::CAMath::Sqrt((1.f - sn) * (1.f + sn));
494 c.xC =
getX() - sn *
c.rC;
495 c.yC =
getY() + cs *
c.rC;
496 c.rC = gpu::CAMath::Abs(
c.rC);
505template <
typename value_T>
506GPUdi()
void TrackParametrization<value_T>::getCircleParams(value_t bz,
o2::math_utils::CircleXY<value_t>&
c, value_t& sna, value_t& csa)
const
509 getCircleParamsLoc(bz,
c);
510 o2::math_utils::detail::sincos(getAlpha(), sna, csa);
511 o2::math_utils::detail::rotateZ<value_t>(
c.xC,
c.yC,
c.xC,
c.yC, sna, csa);
515template <
typename value_T>
516GPUdi()
void TrackParametrization<value_T>::getLineParams(
o2::math_utils::IntervalXY<value_t>& ln, value_t& sna, value_t& csa)
const
519 o2::math_utils::detail::sincos(getAlpha(), sna, csa);
520 o2::math_utils::detail::rotateZ<value_t>(
getX(),
getY(), ln.getX0(), ln.getY0(), sna, csa);
521 value_t snp = getSnp(), csp = gpu::CAMath::Sqrt((1.f - snp) * (1.f + snp));
522 ln.setDX(csp * csa - snp * sna);
523 ln.setDY(snp * csa + csp * sna);
527template <
typename value_T>
528GPUdi() auto TrackParametrization<value_T>::getCurvature(value_t
b) const -> value_t
534template <
typename value_T>
535GPUdi()
int TrackParametrization<value_T>::getCharge()
const
537 return getSign() > 0 ? mAbsCharge : -mAbsCharge;
541template <
typename value_T>
542GPUdi()
int TrackParametrization<value_T>::getSign()
const
544 return mAbsCharge ? (mP[
kQ2Pt] > 0.f ? 1 : -1) : 0;
548template <
typename value_T>
549GPUdi() auto TrackParametrization<value_T>::getPhi() const -> value_t
552 value_t phi = gpu::CAMath::ASin(getSnp()) + getAlpha();
553 math_utils::detail::bringTo02Pi<value_t>(phi);
558template <
typename value_T>
559GPUdi() auto TrackParametrization<value_T>::getPhiPos() const -> value_t
563 math_utils::detail::bringTo02Pi<value_t>(phi);
568template <
typename value_T>
569GPUdi() auto TrackParametrization<value_T>::getQ2P2() const -> value_t
576 return q2pt2 / (1.f + getTgl() * getTgl());
580template <
typename value_T>
581GPUdi() auto TrackParametrization<value_T>::getPtInv() const -> value_t
588 return (mAbsCharge > 1) ? ptInv / mAbsCharge : ptInv;
592template <
typename value_T>
593GPUdi() auto TrackParametrization<value_T>::getP2Inv() const -> value_t
597 return p2 *
p2 / (1.f + getTgl() * getTgl());
601template <
typename value_T>
602GPUdi() auto TrackParametrization<value_T>::getP2() const -> value_t
605 return 1.f / getP2Inv();
609template <
typename value_T>
610GPUdi() auto TrackParametrization<value_T>::getPInv() const -> value_t
613 return getPtInv() / gpu::CAMath::Sqrt(1.f + getTgl() * getTgl());
617template <
typename value_T>
618GPUdi() auto TrackParametrization<value_T>::getP() const -> value_t
621 return 1.f / getPInv();
625template <
typename value_T>
626GPUdi() auto TrackParametrization<value_T>::getE2() const -> value_t
629 return getP2() + getPID().getMass2();
633template <
typename value_T>
634GPUdi() auto TrackParametrization<value_T>::getE() const -> value_t
637 return gpu::CAMath::Sqrt(getE2());
641template <
typename value_T>
642GPUdi() auto TrackParametrization<value_T>::getPt() const -> value_t
645 return 1.f / getPtInv();
649template <
typename value_T>
650GPUdi() auto TrackParametrization<value_T>::getTheta() const -> value_t
656template <
typename value_T>
657GPUdi() auto TrackParametrization<value_T>::getEta() const -> value_t
659 return -gpu::CAMath::Log(gpu::CAMath::Tan(0.5f * getTheta()));
663template <
typename value_T>
664GPUdi() auto TrackParametrization<value_T>::getXYZGlo() const -> math_utils::
Point3D<value_t>
666#ifndef GPUCA_ALIGPUCODE
667 return math_utils::Rotation2D<value_t>(getAlpha())(math_utils::Point3D<value_t>(
getX(),
getY(), getZ()));
670 gpu::CAMath::SinCos(getAlpha(), sina, cosa);
671 return math_utils::Point3D<value_t>(cosa *
getX() - sina *
getY(), cosa *
getY() + sina *
getX(), getZ());
676template <
typename value_T>
677GPUdi()
void TrackParametrization<value_T>::getXYZGlo(dim3_t& xyz)
const
683 math_utils::detail::rotateZ<value_t>(xyz, getAlpha());
687template <
typename value_T>
688GPUdi() auto TrackParametrization<value_T>::getXYZGloAt(value_t xk, value_t
b,
bool& ok) const -> math_utils::
Point3D<value_t>
694 ok = getYZAt(xk,
b,
y,
z);
696#ifndef GPUCA_ALIGPUCODE
697 return math_utils::Rotation2D<value_t>(getAlpha())(math_utils::Point3D<value_t>(xk,
y,
z));
700 gpu::CAMath::SinCos(getAlpha(), sina, cosa);
701 return math_utils::Point3D<value_t>(cosa * xk - sina *
y, cosa *
y + sina * xk,
z);
704 return math_utils::Point3D<value_t>();
709template <
typename value_T>
710GPUdi() bool TrackParametrization<value_T>::
isValid()
const
712 return mX != InvalidX;
716template <
typename value_T>
717GPUdi()
void TrackParametrization<value_T>::invalidate()
722template <
typename value_T>
728template <
typename value_T>
729GPUhdi()
void TrackParametrization<value_T>::setUserField(uint16_t
v)
735template <
typename value_T>
736GPUdi()
void TrackParametrization<value_T>::updateParam(value_t delta,
int i)
742template <
typename value_T>
743GPUdi()
void TrackParametrization<value_T>::updateParams(const params_t& delta)
745 updateParams(delta.data());
749template <
typename value_T>
750GPUdi()
void TrackParametrization<value_T>::updateParams(const value_t* delta)
763#ifndef GPUCA_ALIGPUCODE
764template <
typename value_T>
767 size_t h = std::hash<float>{}(o2::math_utils::detail::truncateFloatFraction(
x, 0xFFFFFFF0));
768 h ^= std::hash<float>{}(o2::math_utils::detail::truncateFloatFraction(alp, 0xFFFFFFF0)) << 1;
769 h ^= std::hash<float>{}(o2::math_utils::detail::truncateFloatFraction(
y, 0xFFFFFFF0)) << 1;
770 h ^= std::hash<float>{}(o2::math_utils::detail::truncateFloatFraction(
z, 0xFFFFFFF0)) << 1;
771 h ^= std::hash<float>{}(o2::math_utils::detail::truncateFloatFraction(snp, 0xFFFFFF00)) << 1;
772 h ^= std::hash<float>{}(o2::math_utils::detail::truncateFloatFraction(tgl, 0xFFFFFF00)) << 1;
773 h ^= std::hash<float>{}(o2::math_utils::detail::truncateFloatFraction(q2pt, 0xFFFFFC00)) << 1;