186 if (matCorr != MatCorrType::USEMatCorrNONE) {
187 auto xyz1 = track.getXYZGlo();
188 auto mb = this->getMatBudget(matCorr, xyz0, xyz1);
189 if (!track.correctForMaterial(mb.meanX2X0, mb.getXRho(signCorr))) {
193 tofInfo->addStep(mb.length, track.getQ2P2());
194 tofInfo->addX2X0(mb.meanX2X0);
195 tofInfo->addXRho(mb.getXRho(signCorr));
197 }
else if (tofInfo) {
198 auto xyz1 = track.getXYZGlo();
200 tofInfo->addStep(stepV.R(), track.getQ2P2());
205 if (!track.propagateTo(
x,
b)) {
208 if (maxSnp > 0 && math_utils::detail::abs<value_type>(track.getSnp()) >= maxSnp) {
215 dx = xToGo - track.getX();
222template <
typename value_T>
223GPUd() bool
PropagatorImpl<value_T>::PropagateToXBxByBz(TrackParCov_t& track, TrackPar_t& linRef, value_type xToGo, value_type maxSnp, value_type maxStep,
237 auto dx = xToGo - track.getX();
238 int dir = dx > 0.f ? 1 : -1;
243 std::array<value_type, 3>
b{};
244 while (math_utils::detail::abs<value_type>(dx) > Epsilon) {
245 auto step = math_utils::detail::min<value_type>(math_utils::detail::abs<value_type>(dx), maxStep);
249 auto x = track.getX() +
step;
250 auto xyz0 = linRef.getXYZGlo();
251 getFieldXYZ(xyz0, &
b[0]);
253 auto correct = [&track, &linRef, &xyz0, tofInfo, matCorr, signCorr,
this]() {
255 if (matCorr != MatCorrType::USEMatCorrNONE) {
256 auto xyz1 = linRef.getXYZGlo();
257 auto mb = this->getMatBudget(matCorr, xyz0, xyz1);
258 if (!track.correctForMaterial(linRef, mb.meanX2X0, mb.getXRho(signCorr))) {
262 tofInfo->addStep(mb.length, linRef.getQ2P2());
263 tofInfo->addX2X0(mb.meanX2X0);
264 tofInfo->addXRho(mb.getXRho(signCorr));
266 }
else if (tofInfo) {
267 auto xyz1 = linRef.getXYZGlo();
269 tofInfo->addStep(stepV.R(), linRef.getQ2P2());
274 if (!track.propagateTo(
x, linRef,
b)) {
277 if (maxSnp > 0 && math_utils::detail::abs<value_type>(track.getSnp()) >= maxSnp) {
284 dx = xToGo - track.getX();
291template <
typename value_T>
292GPUd() bool
PropagatorImpl<value_T>::PropagateToXBxByBz(TrackPar_t& track, value_type xToGo, value_type maxSnp, value_type maxStep,
306 auto dx = xToGo - track.getX();
307 int dir = dx > 0.f ? 1 : -1;
312 std::array<value_type, 3>
b{};
313 while (math_utils::detail::abs<value_type>(dx) > Epsilon) {
314 auto step = math_utils::detail::min<value_type>(math_utils::detail::abs<value_type>(dx), maxStep);
318 auto x = track.getX() +
step;
319 auto xyz0 = track.getXYZGlo();
320 getFieldXYZ(xyz0, &
b[0]);
322 auto correct = [&track, &xyz0, tofInfo, matCorr, signCorr,
this]() {
324 if (matCorr != MatCorrType::USEMatCorrNONE) {
325 auto xyz1 = track.getXYZGlo();
326 auto mb = this->getMatBudget(matCorr, xyz0, xyz1);
327 if (!track.correctForELoss(((signCorr < 0) ? -mb.length : mb.
length) * mb.meanRho)) {
331 tofInfo->addStep(mb.length, track.getQ2P2());
332 tofInfo->addX2X0(mb.meanX2X0);
333 tofInfo->addXRho(mb.getXRho(signCorr));
335 }
else if (tofInfo) {
336 auto xyz1 = track.getXYZGlo();
338 tofInfo->addStep(stepV.R(), track.getQ2P2());
343 if (!track.propagateParamTo(
x,
b)) {
346 if (maxSnp > 0 && math_utils::detail::abs<value_type>(track.getSnp()) >= maxSnp) {
353 dx = xToGo - track.getX();
360template <
typename value_T>
361GPUd() bool
PropagatorImpl<value_T>::propagateToX(TrackParCov_t& track, value_type xToGo, value_type bZ, value_type maxSnp, value_type maxStep,
374 auto dx = xToGo - track.getX();
375 int dir = dx > 0.f ? 1 : -1;
380 while (math_utils::detail::abs<value_type>(dx) > Epsilon) {
381 auto step = math_utils::detail::min<value_type>(math_utils::detail::abs<value_type>(dx), maxStep);
385 auto x = track.getX() +
step;
386 auto xyz0 = track.getXYZGlo();
387 auto correct = [&track, &xyz0, tofInfo, matCorr, signCorr,
this]() {
389 if (matCorr != MatCorrType::USEMatCorrNONE) {
390 auto xyz1 = track.getXYZGlo();
391 auto mb = this->getMatBudget(matCorr, xyz0, xyz1);
392 if (!track.correctForMaterial(mb.meanX2X0, mb.getXRho(signCorr))) {
396 tofInfo->addStep(mb.length, track.getQ2P2());
397 tofInfo->addX2X0(mb.meanX2X0);
398 tofInfo->addXRho(mb.getXRho(signCorr));
400 }
else if (tofInfo) {
401 auto xyz1 = track.getXYZGlo();
403 tofInfo->addStep(stepV.R(), track.getQ2P2());
407 if (!track.propagateTo(
x, bZ)) {
410 if (maxSnp > 0 && math_utils::detail::abs<value_type>(track.getSnp()) >= maxSnp) {
417 dx = xToGo - track.getX();
424template <
typename value_T>
425GPUd() bool
PropagatorImpl<value_T>::propagateToX(TrackParCov_t& track, TrackPar_t& linRef, value_type xToGo, value_type bZ, value_type maxSnp, value_type maxStep,
438 auto dx = xToGo - track.getX();
439 int dir = dx > 0.f ? 1 : -1;
444 while (math_utils::detail::abs<value_type>(dx) > Epsilon) {
445 auto step = math_utils::detail::min<value_type>(math_utils::detail::abs<value_type>(dx), maxStep);
449 auto x = track.getX() +
step;
450 auto xyz0 = linRef.getXYZGlo();
452 auto correct = [&track, &linRef, &xyz0, tofInfo, matCorr, signCorr,
this]() {
454 if (matCorr != MatCorrType::USEMatCorrNONE) {
455 auto xyz1 = linRef.getXYZGlo();
456 auto mb = this->getMatBudget(matCorr, xyz0, xyz1);
457 if (!track.correctForMaterial(linRef, mb.meanX2X0, mb.getXRho(signCorr))) {
461 tofInfo->addStep(mb.length, linRef.getQ2P2());
462 tofInfo->addX2X0(mb.meanX2X0);
463 tofInfo->addXRho(mb.getXRho(signCorr));
465 }
else if (tofInfo) {
466 auto xyz1 = linRef.getXYZGlo();
468 tofInfo->addStep(stepV.R(), linRef.getQ2P2());
473 if (!track.propagateTo(
x, linRef, bZ)) {
476 if (maxSnp > 0 && math_utils::detail::abs<value_type>(track.getSnp()) >= maxSnp) {
483 dx = xToGo - track.getX();
490template <
typename value_T>
491GPUd() bool
PropagatorImpl<value_T>::propagateToX(TrackPar_t& track, value_type xToGo, value_type bZ, value_type maxSnp, value_type maxStep,
505 auto dx = xToGo - track.getX();
506 int dir = dx > 0.f ? 1 : -1;
511 while (math_utils::detail::abs<value_type>(dx) > Epsilon) {
512 auto step = math_utils::detail::min<value_type>(math_utils::detail::abs<value_type>(dx), maxStep);
516 auto x = track.getX() +
step;
517 auto xyz0 = track.getXYZGlo();
519 auto correct = [&track, &xyz0, tofInfo, matCorr, signCorr,
this]() {
521 if (matCorr != MatCorrType::USEMatCorrNONE) {
522 auto xyz1 = track.getXYZGlo();
523 auto mb = this->getMatBudget(matCorr, xyz0, xyz1);
524 if (!track.correctForELoss(mb.getXRho(signCorr))) {
528 tofInfo->addStep(mb.length, track.getQ2P2());
529 tofInfo->addX2X0(mb.meanX2X0);
530 tofInfo->addXRho(mb.getXRho(signCorr));
532 }
else if (tofInfo) {
533 auto xyz1 = track.getXYZGlo();
535 tofInfo->addStep(stepV.R(), track.getQ2P2());
540 if (!track.propagateParamTo(
x, bZ)) {
543 if (maxSnp > 0 && math_utils::detail::abs<value_type>(track.getSnp()) >= maxSnp) {
550 dx = xToGo - track.getX();
557template <
typename value_T>
558template <
typename track_T>
559GPUd() bool
PropagatorImpl<value_T>::propagateToR(track_T& track, value_type
r,
bool bzOnly, value_type maxSnp, value_type maxStep,
560 MatCorrType matCorr, track::TrackLTIntegral* tofInfo,
int signCorr)
const
562 const value_T MaxPhiLoc = math_utils::detail::asin<value_T>(maxSnp), MaxPhiLocSafe = 0.95 * MaxPhiLoc;
563 auto bz = getNominalBz();
564 if (math_utils::detail::abs(bz) > constants::math::Almost0) {
567 value_type r0 = math_utils::detail::sqrt<value_T>(track.getX() * track.getX() + track.getY() * track.getY());
568 value_type dr = (
r - r0);
569 value_type rTmp =
r - (math_utils::detail::abs<value_T>(dr) > 1. ? (dr > 0 ? 0.5 : -0.5) : 0.5 * dr);
571 crad.
c = crad.
cc = 1.f;
572 crad.
s = crad.
ss = crad.
cs = 0.f;
574 cross.circlesCrossInfo(crad, traux, 0.);
575 if (cross.
nDCA < 1) {
578 double phiCross[2] = {}, dphi[2] = {};
579 auto curv = track.getCurvature(bz);
580 bool clockwise = curv < 0;
581 auto phiLoc = math_utils::detail::asin<double>(track.getSnp());
582 auto phi0 = phiLoc + track.getAlpha();
584 for (
int i = 0;
i < cross.
nDCA;
i++) {
589 auto normX = double(cross.
yDCA[
i]) - double(traux.yC), normY = -(double(cross.
xDCA[
i]) - double(traux.xC));
594 phiCross[
i] = math_utils::detail::atan2<double>(normY, normX);
596 dphi[
i] = phiCross[
i] - phi0;
603 int sel = cross.
nDCA == 1 ? 0 : (clockwise ? (dphi[0] < dphi[1] ? 0 : 1) : (dphi[1] < dphi[0] ? 0 : 1));
604 auto deltaPhi = dphi[sel];
607 auto phiLocFin = phiLoc + deltaPhi;
609 if (math_utils::detail::abs<value_type>(phiLocFin) < MaxPhiLocSafe) {
610 auto deltaX = (math_utils::detail::sin<double>(phiLocFin) - track.getSnp()) / track.getCurvature(bz);
611 if (!track.propagateTo(track.getX() + deltaX, bz)) {
616 if (math_utils::detail::abs<value_type>(deltaPhi) < (2 * MaxPhiLocSafe)) {
617 auto rot = phiLoc + 0.5 * deltaPhi;
618 if (!track.rotate(track.getAlpha() + rot)) {
625 auto rot = phiLoc + (deltaPhi > 0 ? MaxPhiLocSafe : -MaxPhiLocSafe);
626 if (!track.rotate(track.getAlpha() + rot)) {
632 auto tgtPhiLoc = deltaPhi > 0 ? MaxPhiLocSafe : -MaxPhiLocSafe;
633 auto deltaX = (math_utils::detail::sin<double>(tgtPhiLoc) - track.getSnp()) / track.getCurvature(bz);
634 if (!track.propagateTo(track.getX() + deltaX, bz)) {
637 deltaPhi -= tgtPhiLoc - phiLoc;
638 phiLoc = deltaPhi > 0 ? MaxPhiLocSafe : -MaxPhiLocSafe;
645 if (!track.getXatLabR(
r, xfin, bz)) {
648 return propagateToX(track, xfin, bzOnly, maxSnp, maxStep, matCorr, tofInfo, signCorr);
651template <
typename value_T>
652GPUd() bool
PropagatorImpl<value_T>::propagateToAlphaX(TrackParCov_t& track, TrackPar_t* linRef, value_type
alpha, value_type
x,
bool bzOnly, value_type maxSnp, value_type maxStep,
int minSteps,
653 MatCorrType matCorr, track::TrackLTIntegral* tofInfo,
int signCorr)
const
656 auto snp = track.getSnpAt(
alpha,
x, getNominalBz());
658 if (math_utils::detail::abs<value_type>(snp) < maxSnp * 0.9 && (linRef ? track.rotate(
alpha, *linRef, getNominalBz()) : track.rotate(
alpha))) {
659 auto dx = math_utils::detail::abs<value_type>(
x - track.getX());
663 return propagateTo(track, linRef,
x, bzOnly, maxSnp, math_utils::detail::min<value_type>(dx / minSteps, maxStep), matCorr, tofInfo, signCorr);
669template <
typename value_T>
670template <
typename track_T>
671GPUd() bool
PropagatorImpl<value_T>::propagateToAlphaX(track_T& track, value_type
alpha, value_type
x,
bool bzOnly, value_type maxSnp, value_type maxStep,
int minSteps,
672 MatCorrType matCorr, track::TrackLTIntegral* tofInfo,
int signCorr)
const
675 auto snp = track.getSnpAt(
alpha,
x, getNominalBz());
677 if (math_utils::detail::abs<value_type>(snp) < maxSnp * 0.9 && track.rotate(
alpha)) {
678 auto dx = math_utils::detail::abs<value_type>(
x - track.getX());
682 return propagateTo(track,
x, bzOnly, maxSnp, math_utils::detail::min<value_type>(dx / minSteps, maxStep), matCorr, tofInfo, signCorr);
702template <
typename value_T>
703GPUd() bool
PropagatorImpl<value_T>::propagateToDCA(const
o2::dataformats::VertexBase& vtx, TrackParCov_t& track, value_type bZ,
705 o2::dataformats::DCA* dca, track::TrackLTIntegral* tofInfo,
706 int signCorr, value_type maxD)
const
709 value_type sn, cs, alp = track.getAlpha();
710 math_utils::detail::sincos<value_type>(alp, sn, cs);
711 value_type
x = track.getX(),
y = track.getY(), snp = track.getSnp(), csp = math_utils::detail::sqrt<value_type>((1.f - snp) * (1.f + snp));
712 value_type xv = vtx.getX() * cs + vtx.getY() * sn, yv = -vtx.getX() * sn + vtx.getY() * cs, zv = vtx.getZ();
716 value_type d = math_utils::detail::abs<value_type>(
x * snp -
y * csp);
724 value_type crv = track.getCurvature(bZ);
725 value_type tgfv = -(crv *
x - snp) / (crv *
y + csp);
726 sn = tgfv / math_utils::detail::sqrt<value_type>(1.f + tgfv * tgfv);
727 cs = math_utils::detail::sqrt<value_type>((1. - sn) * (1. + sn));
730 x = xv * cs + yv * sn;
731 yv = -xv * sn + yv * cs;
735 alp += math_utils::detail::asin<value_type>(sn);
736 if (!tmpT.rotate(alp) || !propagateToX(tmpT, xv, bZ, 0.85, maxStep, matCorr, tofInfo, signCorr)) {
737#ifndef GPUCA_ALIGPUCODE
738 LOG(
debug) <<
"failed to propagate to alpha=" << alp <<
" X=" << xv << vtx <<
" | Track is: " << tmpT.asString();
739#elif !defined(GPUCA_NO_FMT)
740 LOG(
debug) <<
"failed to propagate to alpha=" << alp <<
" X=" << xv << vtx;
750 math_utils::detail::sincos<value_type>(alp, sn, cs);
751 auto s2ylocvtx = vtx.getSigmaX2() * sn * sn + vtx.getSigmaY2() * cs * cs - 2. * vtx.getSigmaXY() * cs * sn;
752 dca->set(track.getY() - yv, track.getZ() - zv,
753 track.getSigmaY2() + s2ylocvtx, track.getSigmaZY(), track.getSigmaZ2() + vtx.getSigmaZ2());
759template <
typename value_T>
760GPUd() bool
PropagatorImpl<value_T>::propagateToDCABxByBz(const
o2::dataformats::VertexBase& vtx, TrackParCov_t& track,
762 o2::dataformats::DCA* dca, track::TrackLTIntegral* tofInfo,
763 int signCorr, value_type maxD)
const
766 value_type sn, cs, alp = track.getAlpha();
767 math_utils::detail::sincos<value_type>(alp, sn, cs);
768 value_type
x = track.getX(),
y = track.getY(), snp = track.getSnp(), csp = math_utils::detail::sqrt<value_type>((1.f - snp) * (1.f + snp));
769 value_type xv = vtx.getX() * cs + vtx.getY() * sn, yv = -vtx.getX() * sn + vtx.getY() * cs, zv = vtx.getZ();
773 value_type d = math_utils::detail::abs<value_type>(
x * snp -
y * csp);
781 value_type crv = track.getCurvature(mNominalBz);
782 value_type tgfv = -(crv *
x - snp) / (crv *
y + csp);
783 sn = tgfv / math_utils::detail::sqrt<value_type>(1.f + tgfv * tgfv);
784 cs = math_utils::detail::sqrt<value_type>((1. - sn) * (1. + sn));
787 x = xv * cs + yv * sn;
788 yv = -xv * sn + yv * cs;
792 alp += math_utils::detail::asin<value_type>(sn);
793 if (!tmpT.rotate(alp) || !PropagateToXBxByBz(tmpT, xv, 0.85, maxStep, matCorr, tofInfo, signCorr)) {
794#ifndef GPUCA_ALIGPUCODE
795 LOG(
debug) <<
"failed to propagate to alpha=" << alp <<
" X=" << xv << vtx <<
" | Track is: " << tmpT.asString();
796#elif !defined(GPUCA_NO_FMT)
797 LOG(
debug) <<
"failed to propagate to alpha=" << alp <<
" X=" << xv << vtx;
807 math_utils::detail::sincos<value_type>(alp, sn, cs);
808 auto s2ylocvtx = vtx.getSigmaX2() * sn * sn + vtx.getSigmaY2() * cs * cs - 2. * vtx.getSigmaXY() * cs * sn;
809 dca->set(track.getY() - yv, track.getZ() - zv,
810 track.getSigmaY2() + s2ylocvtx, track.getSigmaZY(), track.getSigmaZ2() + vtx.getSigmaZ2());
816template <
typename value_T>
817GPUd() bool
PropagatorImpl<value_T>::propagateToDCA(const math_utils::
Point3D<value_type>& vtx, TrackPar_t& track, value_type bZ,
819 std::
array<value_type, 2>* dca, track::TrackLTIntegral* tofInfo,
820 int signCorr, value_type maxD)
const
823 value_type sn, cs, alp = track.getAlpha();
824 math_utils::detail::sincos<value_type>(alp, sn, cs);
825 value_type
x = track.getX(),
y = track.getY(), snp = track.getSnp(), csp = math_utils::detail::sqrt<value_type>((1.f - snp) * (1.f + snp));
826 value_type xv = vtx.X() * cs + vtx.Y() * sn, yv = -vtx.X() * sn + vtx.Y() * cs, zv = vtx.Z();
830 value_type d = math_utils::detail::abs<value_type>(
x * snp -
y * csp);
838 value_type crv = track.getCurvature(bZ);
839 value_type tgfv = -(crv *
x - snp) / (crv *
y + csp);
840 sn = tgfv / math_utils::detail::sqrt<value_type>(1.f + tgfv * tgfv);
841 cs = math_utils::detail::sqrt<value_type>((1. - sn) * (1. + sn));
844 x = xv * cs + yv * sn;
845 yv = -xv * sn + yv * cs;
849 alp += math_utils::detail::asin<value_type>(sn);
850 if (!tmpT.rotateParam(alp) || !propagateToX(tmpT, xv, bZ, 0.85, maxStep, matCorr, tofInfo, signCorr)) {
851#ifndef GPUCA_ALIGPUCODE
852 LOG(
debug) <<
"failed to propagate to alpha=" << alp <<
" X=" << xv <<
" for vertex "
853 << vtx.X() <<
' ' << vtx.Y() <<
' ' << vtx.Z() <<
" | Track is: " << tmpT.asString();
855 LOG(
debug) <<
"failed to propagate to alpha=" << alp <<
" X=" << xv <<
" for vertex " << vtx.X() <<
' ' << vtx.Y() <<
' ' << vtx.Z();
865 (*dca)[0] = track.getY() - yv;
866 (*dca)[1] = track.getZ() - zv;
872template <
typename value_T>
875 std::
array<value_type, 2>* dca, track::TrackLTIntegral* tofInfo,
876 int signCorr, value_type maxD)
const
879 value_type sn, cs, alp = track.getAlpha();
880 math_utils::detail::sincos<value_type>(alp, sn, cs);
881 value_type
x = track.getX(),
y = track.getY(), snp = track.getSnp(), csp = math_utils::detail::sqrt<value_type>((1.f - snp) * (1.f + snp));
882 value_type xv = vtx.X() * cs + vtx.Y() * sn, yv = -vtx.X() * sn + vtx.Y() * cs, zv = vtx.Z();
886 value_type d = math_utils::detail::abs<value_type>(
x * snp -
y * csp);
894 value_type crv = track.getCurvature(mNominalBz);
895 value_type tgfv = -(crv *
x - snp) / (crv *
y + csp);
896 sn = tgfv / math_utils::detail::sqrt<value_type>(1.f + tgfv * tgfv);
897 cs = math_utils::detail::sqrt<value_type>((1. - sn) * (1. + sn));
900 x = xv * cs + yv * sn;
901 yv = -xv * sn + yv * cs;
905 alp += math_utils::detail::asin<value_type>(sn);
906 if (!tmpT.rotateParam(alp) || !PropagateToXBxByBz(tmpT, xv, 0.85, maxStep, matCorr, tofInfo, signCorr)) {
907#ifndef GPUCA_ALIGPUCODE
908 LOG(
debug) <<
"failed to propagate to alpha=" << alp <<
" X=" << xv <<
" for vertex "
909 << vtx.X() <<
' ' << vtx.Y() <<
' ' << vtx.Z() <<
" | Track is: " << tmpT.asString();
911 LOG(
debug) <<
"failed to propagate to alpha=" << alp <<
" X=" << xv <<
" for vertex " << vtx.X() <<
' ' << vtx.Y() <<
' ' << vtx.Z();
921 (*dca)[0] = track.getY() - yv;
922 (*dca)[1] = track.getZ() - zv;
928template <
typename value_T>
929GPUd() float
PropagatorImpl<value_T>::estimateLTIncrement(const
o2::track::TrackParametrization<value_type>& trc,
930 const
o2::math_utils::
Point3D<value_type>& posStart,
931 const
o2::math_utils::
Point3D<value_type>& posEnd)
const
934 float dX = posEnd.X() - posStart.X(), dY = posEnd.Y() - posStart.Y(), dZ = posEnd.Z() - posStart.Z(), d2XY = dX * dX + dY * dY;
935 if (getNominalBz() != 0) {
938 getFieldXYZ(posAv,
b);
939 float curvH = math_utils::detail::abs<value_type>(0.5f * trc.getCurvature(
b[2])), asArg = curvH * math_utils::detail::sqrt<value_type>(d2XY);
945 return math_utils::detail::sqrt<value_type>(d2XY + dZ * dZ);
949template <
typename value_T>
950GPUd() value_T
PropagatorImpl<value_T>::estimateLTFast(
o2::track::TrackLTIntegral& lt, const
o2::track::TrackParametrization<value_type>& trc)
const
952 value_T xdca = 0., ydca = 0.,
length = 0.;
954 constexpr float TinyF = 1e-9;
955 auto straigh_line_approx = [&]() {
956 auto csp2 = (1.f - trc.getSnp()) * (1.f + trc.getSnp());
958 auto csp = math_utils::detail::sqrt<value_type>(csp2);
959 auto tgp = trc.getSnp() / csp,
f = trc.getX() * tgp - trc.getY();
960 xdca = tgp *
f * csp2;
962 auto dx = xdca - trc.getX(), dy = ydca - trc.getY(), dz = dx * trc.getTgl() / csp;
963 return math_utils::detail::sqrt<value_type>(dx * dx + dy * dy + dz * dz);
966 return math_utils::detail::abs<value_type>(trc.getY() * math_utils::detail::sqrt<value_type>(1. + trc.getTgl() * trc.getTgl()));
969 trc.getCircleParamsLoc(mNominalBz,
c);
971 auto distC = math_utils::detail::sqrt<value_type>(
c.getCenterD2());
973 auto nrm = (distC -
c.rC) / distC;
976 auto v0x = trc.getX() -
c.xC, v0y = trc.getY() -
c.yC, v1x = xdca -
c.xC, v1y = ydca -
c.yC;
977 auto angcos = (v0x * v1x + v0y * v1y) / (
c.rC *
c.rC);
978 if (math_utils::detail::abs<value_type>(angcos) < 1.f) {
979 auto ang = math_utils::detail::acos<value_type>(angcos);
980 if ((trc.getSign() > 0.f) == (mNominalBz > 0.f)) {
985 length = math_utils::detail::abs<value_type>(
c.rC * ang * math_utils::detail::sqrt<value_type>(1. + trc.getTgl() * trc.getTgl()));
987 length = straigh_line_approx();
994 length = straigh_line_approx();
997 value_T dcaT = math_utils::detail::sqrt<value_type>(xdca * xdca + ydca * ydca);
999 lt.addStep(
length, trc.getQ2P2());
1004template <
typename value_T>
1007#if !defined(GPUCA_STANDALONE) && !defined(GPUCA_GPUCODE)
1008 if (corrType == MatCorrType::USEMatCorrTGeo) {
1012 if (mTGeoFallBackAllowed) {
1015 throw std::runtime_error(
"requested MatLUT is absent and fall-back to TGeo is disabled");
1019 return mMatLUT->getMatBudget(
p0.X(),
p0.Y(),
p0.Z(),
p1.X(),
p1.Y(),
p1.Z());
1022template <
typename value_T>
1023template <
typename T>
1027#if defined(GPUCA_GPUCODE_DEVICE) && defined(GPUCA_HAS_GLOBAL_SYMBOL_CONSTANT_MEM)
1030 const auto*
f = mGPUField;
1032 float bxyzF[3] = {};
1033 f->GetField(xyz.X(), xyz.Y(), xyz.Z(), bxyzF);
1035 constexpr value_type kCLight1 = 1. / o2::gpu::gpu_common_constants::kCLight;
1036 for (uint
i = 0;
i < 3; ++
i) {
1037 bxyz[
i] =
static_cast<value_type
>(bxyzF[
i]) * kCLight1;
1040#ifndef GPUCA_GPUCODE
1042 mFieldFast->Field(xyz, bxyz);
1044#ifdef GPUCA_STANDALONE
1045 LOG(fatal) <<
"Normal field cannot be used in standalone benchmark";
1047 mField->field(xyz, bxyz);
1054template <
typename value_T>
1055template <
typename T>
1060#if defined(GPUCA_GPUCODE_DEVICE) && defined(GPUCA_HAS_GLOBAL_SYMBOL_CONSTANT_MEM)
1063 const auto*
f = mGPUField;
1065 constexpr value_type kCLight1 = 1. / o2::gpu::gpu_common_constants::kCLight;
1066 bz =
f->GetFieldBz(xyz.X(), xyz.Y(), xyz.Z()) * kCLight1;
1068#ifndef GPUCA_GPUCODE
1070 mFieldFast->GetBz(xyz, bz);
1072#ifdef GPUCA_STANDALONE
1073 LOG(fatal) <<
"Normal field cannot be used in standalone benchmark";
1075 bz = mField->GetBz(xyz.X(), xyz.Y(), xyz.Z());
1083template <
typename value_T>
1086 getFieldXYZImpl<float>(xyz, bxyz);
1089template <
typename value_T>
1092 getFieldXYZImpl<double>(xyz, bxyz);
1095template <
typename value_T>
1098 return getBzImpl<float>(xyz);
1101template <
typename value_T>
1104 return getBzImpl<double>(xyz);
1109#if !defined(GPUCA_GPUCODE) || defined(GPUCA_GPUCODE_DEVICE)
1116#ifndef GPUCA_GPUCODE