252 static size_t hash(
float x,
float alp,
float y,
float z,
float snp,
float tgl,
float q2pt);
263 static constexpr
value_t InvalidX = -99999.
f;
269 uint16_t mUserField = 0;
271 ClassDefNV(TrackParametrization, 3);
275template <
typename value_T>
286template <
typename value_T>
287GPUdi()
void TrackParametrization<value_T>::set(value_t
x, value_t
alpha, const params_t& par,
int charge, const
PID pid)
293template <
typename value_T>
294GPUdi()
void TrackParametrization<value_T>::set(value_t
x, value_t
alpha, const value_t* par,
int charge, const
PID pid)
306template <
typename value_T>
307GPUdi() auto TrackParametrization<value_T>::getParams() const -> const value_t*
313template <
typename value_T>
314GPUdi() auto TrackParametrization<value_T>::getParam(
int i) const -> value_t
320template <
typename value_T>
321GPUdi() auto TrackParametrization<value_T>::getX() const -> value_t
327template <
typename value_T>
328GPUdi() auto TrackParametrization<value_T>::getAlpha() const -> value_t
334template <
typename value_T>
335GPUdi() auto TrackParametrization<value_T>::getY() const -> value_t
341template <
typename value_T>
342GPUdi() auto TrackParametrization<value_T>::getZ() const -> value_t
348template <
typename value_T>
349GPUdi() auto TrackParametrization<value_T>::getSnp() const -> value_t
355template <
typename value_T>
356GPUdi() auto TrackParametrization<value_T>::getTgl() const -> value_t
362template <
typename value_T>
363GPUhdi() auto TrackParametrization<value_T>::getQ2Pt() const -> value_t
369template <
typename value_T>
370GPUdi() auto TrackParametrization<value_T>::getCharge2Pt() const -> value_t
372 return mAbsCharge ? mP[
kQ2Pt] : 0.f;
376template <
typename value_T>
377GPUdi()
int TrackParametrization<value_T>::getAbsCharge()
const
383template <
typename value_T>
384GPUdi()
PID TrackParametrization<value_T>::getPID()
const
390template <
typename value_T>
391GPUdi()
void TrackParametrization<value_T>::setPID(const
PID pid,
bool passCharge)
395 setAbsCharge(
pid.getCharge());
400template <
typename value_T>
401GPUdi() auto TrackParametrization<value_T>::getCsp2() const -> value_t
408template <
typename value_T>
409GPUdi() auto TrackParametrization<value_T>::getCsp() const -> value_t
411 return gpu::CAMath::Sqrt(getCsp2());
415template <
typename value_T>
416GPUdi()
void TrackParametrization<value_T>::setX(value_t
v)
422template <
typename value_T>
423GPUdi()
void TrackParametrization<value_T>::setParam(value_t
v,
int i)
429template <
typename value_T>
430GPUdi()
void TrackParametrization<value_T>::setAlpha(value_t
v)
436template <
typename value_T>
437GPUdi()
void TrackParametrization<value_T>::setY(value_t
v)
443template <
typename value_T>
444GPUdi()
void TrackParametrization<value_T>::setZ(value_t
v)
450template <
typename value_T>
451GPUdi()
void TrackParametrization<value_T>::setSnp(value_t
v)
457template <
typename value_T>
458GPUdi()
void TrackParametrization<value_T>::setTgl(value_t
v)
464template <
typename value_T>
465GPUdi()
void TrackParametrization<value_T>::setQ2Pt(value_t
v)
471template <
typename value_T>
472GPUdi()
void TrackParametrization<value_T>::setAbsCharge(
int q)
474 mAbsCharge = gpu::CAMath::Abs(q);
478template <
typename value_T>
479GPUdi()
void TrackParametrization<value_T>::getCircleParamsLoc(value_t bz,
o2::math_utils::CircleXY<value_t>&
c)
const
482 c.rC = getCurvature(bz);
484 constexpr value_t MinSagitta = 0.01f, TPCMidR = 160.f, MinCurv = 8 * MinSagitta / (TPCMidR * TPCMidR);
485 if (gpu::CAMath::Abs(
c.rC) > MinCurv) {
486 c.rC = 1.f / getCurvature(bz);
487 value_t sn = getSnp(), cs = gpu::CAMath::Sqrt((1.f - sn) * (1.f + sn));
488 c.xC =
getX() - sn *
c.rC;
489 c.yC =
getY() + cs *
c.rC;
490 c.rC = gpu::CAMath::Abs(
c.rC);
499template <
typename value_T>
500GPUdi()
void TrackParametrization<value_T>::getCircleParams(value_t bz,
o2::math_utils::CircleXY<value_t>&
c, value_t& sna, value_t& csa)
const
503 getCircleParamsLoc(bz,
c);
504 o2::math_utils::detail::sincos(getAlpha(), sna, csa);
505 o2::math_utils::detail::rotateZ<value_t>(
c.xC,
c.yC,
c.xC,
c.yC, sna, csa);
509template <
typename value_T>
510GPUdi()
void TrackParametrization<value_T>::getLineParams(
o2::math_utils::IntervalXY<value_t>& ln, value_t& sna, value_t& csa)
const
513 o2::math_utils::detail::sincos(getAlpha(), sna, csa);
514 o2::math_utils::detail::rotateZ<value_t>(
getX(),
getY(), ln.getX0(), ln.getY0(), sna, csa);
515 value_t snp = getSnp(), csp = gpu::CAMath::Sqrt((1.f - snp) * (1.f + snp));
516 ln.setDX(csp * csa - snp * sna);
517 ln.setDY(snp * csa + csp * sna);
521template <
typename value_T>
522GPUdi() auto TrackParametrization<value_T>::getCurvature(value_t
b) const -> value_t
528template <
typename value_T>
529GPUdi()
int TrackParametrization<value_T>::getCharge()
const
531 return getSign() > 0 ? mAbsCharge : -mAbsCharge;
535template <
typename value_T>
536GPUdi()
int TrackParametrization<value_T>::getSign()
const
538 return mAbsCharge ? (mP[
kQ2Pt] > 0.f ? 1 : -1) : 0;
542template <
typename value_T>
543GPUdi() auto TrackParametrization<value_T>::getPhi() const -> value_t
546 value_t phi = gpu::CAMath::ASin(getSnp()) + getAlpha();
547 math_utils::detail::bringTo02Pi<value_t>(phi);
552template <
typename value_T>
553GPUdi() auto TrackParametrization<value_T>::getPhiPos() const -> value_t
557 math_utils::detail::bringTo02Pi<value_t>(phi);
562template <
typename value_T>
563GPUdi() auto TrackParametrization<value_T>::getQ2P2() const -> value_t
570 return q2pt2 / (1.f + getTgl() * getTgl());
574template <
typename value_T>
575GPUdi() auto TrackParametrization<value_T>::getPtInv() const -> value_t
582 return (mAbsCharge > 1) ? ptInv / mAbsCharge : ptInv;
586template <
typename value_T>
587GPUdi() auto TrackParametrization<value_T>::getP2Inv() const -> value_t
591 return p2 *
p2 / (1.f + getTgl() * getTgl());
595template <
typename value_T>
596GPUdi() auto TrackParametrization<value_T>::getP2() const -> value_t
599 return 1.f / getP2Inv();
603template <
typename value_T>
604GPUdi() auto TrackParametrization<value_T>::getPInv() const -> value_t
607 return getPtInv() / gpu::CAMath::Sqrt(1.f + getTgl() * getTgl());
611template <
typename value_T>
612GPUdi() auto TrackParametrization<value_T>::getP() const -> value_t
615 return 1.f / getPInv();
619template <
typename value_T>
620GPUdi() auto TrackParametrization<value_T>::getE2() const -> value_t
623 return getP2() + getPID().getMass2();
627template <
typename value_T>
628GPUdi() auto TrackParametrization<value_T>::getE() const -> value_t
631 return gpu::CAMath::Sqrt(getE2());
635template <
typename value_T>
636GPUdi() auto TrackParametrization<value_T>::getPt() const -> value_t
639 return 1.f / getPtInv();
643template <
typename value_T>
644GPUdi() auto TrackParametrization<value_T>::getTheta() const -> value_t
650template <
typename value_T>
651GPUdi() auto TrackParametrization<value_T>::getEta() const -> value_t
653 return -gpu::CAMath::Log(gpu::CAMath::Tan(0.5f * getTheta()));
657template <
typename value_T>
658GPUdi() auto TrackParametrization<value_T>::getXYZGlo() const -> math_utils::
Point3D<value_t>
660#ifndef GPUCA_ALIGPUCODE
661 return math_utils::Rotation2D<value_t>(getAlpha())(math_utils::Point3D<value_t>(
getX(),
getY(), getZ()));
664 gpu::CAMath::SinCos(getAlpha(), sina, cosa);
665 return math_utils::Point3D<value_t>(cosa *
getX() - sina *
getY(), cosa *
getY() + sina *
getX(), getZ());
670template <
typename value_T>
671GPUdi()
void TrackParametrization<value_T>::getXYZGlo(dim3_t& xyz)
const
677 math_utils::detail::rotateZ<value_t>(xyz, getAlpha());
681template <
typename value_T>
682GPUdi() auto TrackParametrization<value_T>::getXYZGloAt(value_t xk, value_t
b,
bool& ok) const -> math_utils::
Point3D<value_t>
688 ok = getYZAt(xk,
b,
y,
z);
690#ifndef GPUCA_ALIGPUCODE
691 return math_utils::Rotation2D<value_t>(getAlpha())(math_utils::Point3D<value_t>(xk,
y,
z));
694 gpu::CAMath::SinCos(getAlpha(), sina, cosa);
695 return math_utils::Point3D<value_t>(cosa * xk - sina *
y, cosa *
y + sina * xk,
z);
698 return math_utils::Point3D<value_t>();
703template <
typename value_T>
704GPUdi() bool TrackParametrization<value_T>::
isValid()
const
706 return mX != InvalidX;
710template <
typename value_T>
711GPUdi()
void TrackParametrization<value_T>::invalidate()
716template <
typename value_T>
722template <
typename value_T>
723GPUhdi()
void TrackParametrization<value_T>::setUserField(uint16_t
v)
729template <
typename value_T>
730GPUdi()
void TrackParametrization<value_T>::updateParam(value_t delta,
int i)
736template <
typename value_T>
737GPUdi()
void TrackParametrization<value_T>::updateParams(const params_t& delta)
739 updateParams(delta.data());
743template <
typename value_T>
744GPUdi()
void TrackParametrization<value_T>::updateParams(const value_t* delta)
757#ifndef GPUCA_ALIGPUCODE
758template <
typename value_T>
761 size_t h = std::hash<float>{}(o2::math_utils::detail::truncateFloatFraction(
x, 0xFFFFFFF0));
762 h ^= std::hash<float>{}(o2::math_utils::detail::truncateFloatFraction(alp, 0xFFFFFFF0)) << 1;
763 h ^= std::hash<float>{}(o2::math_utils::detail::truncateFloatFraction(
y, 0xFFFFFFF0)) << 1;
764 h ^= std::hash<float>{}(o2::math_utils::detail::truncateFloatFraction(
z, 0xFFFFFFF0)) << 1;
765 h ^= std::hash<float>{}(o2::math_utils::detail::truncateFloatFraction(snp, 0xFFFFFF00)) << 1;
766 h ^= std::hash<float>{}(o2::math_utils::detail::truncateFloatFraction(tgl, 0xFFFFFF00)) << 1;
767 h ^= std::hash<float>{}(o2::math_utils::detail::truncateFloatFraction(q2pt, 0xFFFFFC00)) << 1;