26#ifndef INCLUDE_RECONSTRUCTIONDATAFORMATS_TRACKPARAMETRIZATION_H_
27#define INCLUDE_RECONSTRUCTIONDATAFORMATS_TRACKPARAMETRIZATION_H_
35#ifndef GPUCA_GPUCODE_DEVICE
44#ifndef GPUCA_ALIGPUCODE
112 {10, 11, 12, 13, 14}};
125template <
typename value_T =
float>
140#ifndef GPUCA_GPUCODE_DEVICE
141 static_assert(std::is_floating_point_v<value_t>);
181 GPUd()
void setAbsCharge(
int q);
205 GPUdi() static
value_t getBetheBlochSolidDerivativeApprox(value_T
dedx, value_T
bg) {
return BetheBlochSolidDerivative(
dedx,
bg); }
247 GPUd()
void printParamHexadecimal();
248#ifndef GPUCA_ALIGPUCODE
261 static constexpr
value_t InvalidX = -99999.
f;
267 uint16_t mUserField = 0;
269 ClassDefNV(TrackParametrization, 3);
273template <
typename value_T>
284template <
typename value_T>
285GPUdi()
void TrackParametrization<value_T>::set(value_t
x, value_t
alpha, const params_t& par,
int charge, const
PID pid)
291template <
typename value_T>
292GPUdi()
void TrackParametrization<value_T>::set(value_t
x, value_t
alpha, const value_t* par,
int charge, const
PID pid)
304template <
typename value_T>
305GPUdi() auto TrackParametrization<value_T>::getParams() const -> const value_t*
311template <
typename value_T>
312GPUdi() auto TrackParametrization<value_T>::getParam(
int i) const -> value_t
318template <
typename value_T>
319GPUdi() auto TrackParametrization<value_T>::getX() const -> value_t
325template <
typename value_T>
326GPUdi() auto TrackParametrization<value_T>::getAlpha() const -> value_t
332template <
typename value_T>
333GPUdi() auto TrackParametrization<value_T>::getY() const -> value_t
339template <
typename value_T>
340GPUdi() auto TrackParametrization<value_T>::getZ() const -> value_t
346template <
typename value_T>
347GPUdi() auto TrackParametrization<value_T>::getSnp() const -> value_t
353template <
typename value_T>
354GPUdi() auto TrackParametrization<value_T>::getTgl() const -> value_t
360template <
typename value_T>
361GPUhdi() auto TrackParametrization<value_T>::getQ2Pt() const -> value_t
367template <
typename value_T>
368GPUdi() auto TrackParametrization<value_T>::getCharge2Pt() const -> value_t
370 return mAbsCharge ? mP[
kQ2Pt] : 0.f;
374template <
typename value_T>
375GPUdi()
int TrackParametrization<value_T>::getAbsCharge()
const
381template <
typename value_T>
382GPUdi()
PID TrackParametrization<value_T>::getPID()
const
388template <
typename value_T>
389GPUdi()
void TrackParametrization<value_T>::setPID(const
PID pid,
bool passCharge)
393 setAbsCharge(
pid.getCharge());
398template <
typename value_T>
399GPUdi() auto TrackParametrization<value_T>::getCsp2() const -> value_t
401 const value_t csp2 = (1.f - mP[
kSnp]) * (1.f + mP[
kSnp]);
406template <
typename value_T>
407GPUdi() auto TrackParametrization<value_T>::getCsp() const -> value_t
409 return gpu::CAMath::Sqrt(getCsp2());
413template <
typename value_T>
414GPUdi()
void TrackParametrization<value_T>::setX(value_t
v)
420template <
typename value_T>
421GPUdi()
void TrackParametrization<value_T>::setParam(value_t
v,
int i)
427template <
typename value_T>
428GPUdi()
void TrackParametrization<value_T>::setAlpha(value_t
v)
434template <
typename value_T>
435GPUdi()
void TrackParametrization<value_T>::setY(value_t
v)
441template <
typename value_T>
442GPUdi()
void TrackParametrization<value_T>::setZ(value_t
v)
448template <
typename value_T>
449GPUdi()
void TrackParametrization<value_T>::setSnp(value_t
v)
455template <
typename value_T>
456GPUdi()
void TrackParametrization<value_T>::setTgl(value_t
v)
462template <
typename value_T>
463GPUdi()
void TrackParametrization<value_T>::setQ2Pt(value_t
v)
469template <
typename value_T>
470GPUdi()
void TrackParametrization<value_T>::setAbsCharge(
int q)
472 mAbsCharge = gpu::CAMath::Abs(q);
476template <
typename value_T>
477GPUdi()
void TrackParametrization<value_T>::getCircleParamsLoc(value_t bz,
o2::math_utils::CircleXY<value_t>&
c)
const
480 c.rC = getCurvature(bz);
482 constexpr value_t MinSagitta = 0.01f, TPCMidR = 160.f, MinCurv = 8 * MinSagitta / (TPCMidR * TPCMidR);
483 if (gpu::CAMath::Abs(
c.rC) > MinCurv) {
484 c.rC = 1.f / getCurvature(bz);
485 value_t sn = getSnp(), cs = gpu::CAMath::Sqrt((1.f - sn) * (1.f + sn));
486 c.xC =
getX() - sn *
c.rC;
487 c.yC =
getY() + cs *
c.rC;
488 c.rC = gpu::CAMath::Abs(
c.rC);
497template <
typename value_T>
498GPUdi()
void TrackParametrization<value_T>::getCircleParams(value_t bz,
o2::math_utils::CircleXY<value_t>&
c, value_t& sna, value_t& csa)
const
501 getCircleParamsLoc(bz,
c);
502 o2::math_utils::detail::sincos(getAlpha(), sna, csa);
503 o2::math_utils::detail::rotateZ<value_t>(
c.xC,
c.yC,
c.xC,
c.yC, sna, csa);
507template <
typename value_T>
508GPUdi()
void TrackParametrization<value_T>::getLineParams(
o2::math_utils::IntervalXY<value_t>& ln, value_t& sna, value_t& csa)
const
511 o2::math_utils::detail::sincos(getAlpha(), sna, csa);
512 o2::math_utils::detail::rotateZ<value_t>(
getX(),
getY(), ln.getX0(), ln.getY0(), sna, csa);
513 value_t snp = getSnp(), csp = gpu::CAMath::Sqrt((1.f - snp) * (1.f + snp));
514 ln.setDX(csp * csa - snp * sna);
515 ln.setDY(snp * csa + csp * sna);
519template <
typename value_T>
520GPUdi() auto TrackParametrization<value_T>::getCurvature(value_t
b) const -> value_t
526template <
typename value_T>
527GPUdi()
int TrackParametrization<value_T>::getCharge()
const
529 return getSign() > 0 ? mAbsCharge : -mAbsCharge;
533template <
typename value_T>
534GPUdi()
int TrackParametrization<value_T>::getSign()
const
536 return mAbsCharge ? (mP[
kQ2Pt] > 0.f ? 1 : -1) : 0;
540template <
typename value_T>
541GPUdi() auto TrackParametrization<value_T>::getPhi() const -> value_t
544 value_t
phi = gpu::CAMath::ASin(getSnp()) + getAlpha();
545 math_utils::detail::bringTo02Pi<value_t>(phi);
550template <
typename value_T>
551GPUdi() auto TrackParametrization<value_T>::getPhiPos() const -> value_t
554 value_t
phi = gpu::CAMath::ATan2(
getY(),
getX()) + getAlpha();
555 math_utils::detail::bringTo02Pi<value_t>(phi);
560template <
typename value_T>
561GPUdi() auto TrackParametrization<value_T>::getQ2P2() const -> value_t
568 return q2pt2 / (1.f + getTgl() * getTgl());
572template <
typename value_T>
573GPUdi() auto TrackParametrization<value_T>::getPtInv() const -> value_t
576 value_t ptInv = gpu::CAMath::Abs(mP[
kQ2Pt]);
580 return (mAbsCharge > 1) ? ptInv / mAbsCharge : ptInv;
584template <
typename value_T>
585GPUdi() auto TrackParametrization<value_T>::getP2Inv() const -> value_t
588 value_t
p2 = getPtInv();
589 return p2 *
p2 / (1.f + getTgl() * getTgl());
593template <
typename value_T>
594GPUdi() auto TrackParametrization<value_T>::getP2() const -> value_t
597 return 1.f / getP2Inv();
601template <
typename value_T>
602GPUdi() auto TrackParametrization<value_T>::getPInv() const -> value_t
605 return getPtInv() / gpu::CAMath::Sqrt(1.f + getTgl() * getTgl());
609template <
typename value_T>
610GPUdi() auto TrackParametrization<value_T>::getP() const -> value_t
613 return 1.f / getPInv();
617template <
typename value_T>
618GPUdi() auto TrackParametrization<value_T>::getE2() const -> value_t
621 return getP2() + getPID().getMass2();
625template <
typename value_T>
626GPUdi() auto TrackParametrization<value_T>::getE() const -> value_t
629 return gpu::CAMath::Sqrt(getE2());
633template <
typename value_T>
634GPUdi() auto TrackParametrization<value_T>::getPt() const -> value_t
637 return 1.f / getPtInv();
641template <
typename value_T>
642GPUdi() auto TrackParametrization<value_T>::getTheta() const -> value_t
648template <
typename value_T>
649GPUdi() auto TrackParametrization<value_T>::getEta() const -> value_t
651 return -gpu::CAMath::Log(gpu::CAMath::Tan(0.5f * getTheta()));
655template <
typename value_T>
656GPUdi() auto TrackParametrization<value_T>::getXYZGlo() const -> math_utils::
Point3D<value_t>
658#ifndef GPUCA_ALIGPUCODE
659 return math_utils::Rotation2D<value_t>(getAlpha())(math_utils::Point3D<value_t>(
getX(),
getY(), getZ()));
662 gpu::CAMath::SinCos(getAlpha(), sina, cosa);
663 return math_utils::Point3D<value_t>(cosa *
getX() - sina *
getY(), cosa *
getY() + sina *
getX(), getZ());
668template <
typename value_T>
669GPUdi()
void TrackParametrization<value_T>::getXYZGlo(dim3_t& xyz)
const
675 math_utils::detail::rotateZ<value_t>(xyz, getAlpha());
679template <
typename value_T>
680GPUdi() auto TrackParametrization<value_T>::getXYZGloAt(value_t xk, value_t
b,
bool& ok) const -> math_utils::
Point3D<value_t>
685 value_t
y = 0.f,
z = 0.f;
686 ok = getYZAt(xk,
b,
y,
z);
688#ifndef GPUCA_ALIGPUCODE
689 return math_utils::Rotation2D<value_t>(getAlpha())(math_utils::Point3D<value_t>(xk,
y,
z));
692 gpu::CAMath::SinCos(getAlpha(), sina, cosa);
693 return math_utils::Point3D<value_t>(cosa * xk - sina *
y, cosa *
y + sina * xk,
z);
696 return math_utils::Point3D<value_t>();
701template <
typename value_T>
702GPUdi() bool TrackParametrization<value_T>::
isValid()
const
704 return mX != InvalidX;
708template <
typename value_T>
709GPUdi()
void TrackParametrization<value_T>::invalidate()
714template <
typename value_T>
720template <
typename value_T>
721GPUhdi()
void TrackParametrization<value_T>::setUserField(uint16_t
v)
727template <
typename value_T>
728GPUdi()
void TrackParametrization<value_T>::updateParam(value_t delta,
int i)
734template <
typename value_T>
735GPUdi()
void TrackParametrization<value_T>::updateParams(const params_t& delta)
737 updateParams(delta.data());
741template <
typename value_T>
742GPUdi()
void TrackParametrization<value_T>::updateParams(const value_t* delta)
General auxilliary methods.
Declarations of 2D primitives.
gpu::gpustd::array< value_t, kNParams > params_t
o2::math_utils::CircleXY< value_t > &circle const
o2::math_utils::CircleXY< value_t > & circle
GPUd() TrackParametrization(value_t x
value_t const params_t int charge
std::string asStringHexadecimal()
value_t value_t value_t zmv
value_t value_t DirType dir
GPUd() math_utils bool anglecorr
GPUdi() static value_t getdEdxBB(value_t betagamma)
GPUd() value_t getTheta() const
GPUd() bool propagateTo(value_t xk
value_t const params_t int const PID pid
std::string asString() const
GPUdDefault() TrackParametrization()=default
gpu::gpustd::array< value_t, 2 > dim2_t
GPUd() bool propagateToDCA(const math_utils
GPUdi() static value_t getdEdxBBOpt(value_t betagamma)
o2::math_utils::CircleXY< value_t > value_t & sna
GPUhd() value_t getQ2Pt() const
gpu::gpustd::array< value_t, 3 > dim3_t
GPUd() void updateParam(value_t delta
const dim3_t int bool sectorAlpha
GPUd() bool isValid() const
value_t const params_t & par
GLfloat GLfloat GLfloat alpha
GLboolean GLboolean GLboolean b
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
GLdouble GLdouble GLdouble z
Node par(int index)
Parameters.
double * getX(double *xyDxy, int N)
double * getY(double *xyDxy, int N)
constexpr float kCTgl2max
GPUhdi() uint16_t TrackParametrization< value_T >
GPUdi() TrackParametrization< value_T >
constexpr int kCovMatSize
constexpr float kCSnp2max
GPUconstexpr() int CovarMap[kNParams][kNParams]
constexpr int kLabCovMatSize
constexpr float kCalcdEdxAuto
constexpr float kMostProbablePt
constexpr float kC1Pt2max
constexpr int MaxELossIter
constexpr float ELoss2EKinThreshInv
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
bool isValid(std::string alias)