187 auto x = track.getX() + step;
188 auto xyz0 = track.getXYZGlo();
189 getFieldXYZ(xyz0, &
b[0]);
191 auto correct = [&track, &xyz0, tofInfo, matCorr, signCorr,
this]() {
193 if (matCorr != MatCorrType::USEMatCorrNONE) {
194 auto xyz1 = track.getXYZGlo();
195 auto mb = this->getMatBudget(matCorr, xyz0, xyz1);
196 if (!track.correctForMaterial(mb.meanX2X0, mb.getXRho(signCorr))) {
200 tofInfo->addStep(mb.length, track.getQ2P2());
201 tofInfo->addX2X0(mb.meanX2X0);
202 tofInfo->addXRho(mb.getXRho(signCorr));
204 }
else if (tofInfo) {
205 auto xyz1 =
track.getXYZGlo();
207 tofInfo->addStep(stepV.R(),
track.getQ2P2());
212 if (!
track.propagateTo(
x,
b)) {
215 if (maxSnp > 0 && math_utils::detail::abs<value_type>(
track.getSnp()) >= maxSnp) {
222 dx = xToGo -
track.getX();
229template <
typename value_T>
230GPUd() bool
PropagatorImpl<value_T>::PropagateToXBxByBz(TrackParCov_t& track, TrackPar_t& linRef, value_type xToGo, value_type maxSnp, value_type maxStep,
244 auto dx = xToGo -
track.getX();
245 int dir = dx > 0.f ? 1 : -1;
250 std::array<value_type, 3>
b{};
251 while (math_utils::detail::abs<value_type>(dx) > Epsilon) {
252 auto step = math_utils::detail::min<value_type>(math_utils::detail::abs<value_type>(dx), maxStep);
257 auto xyz0 = linRef.getXYZGlo();
258 getFieldXYZ(xyz0, &
b[0]);
260 auto correct = [&
track, &linRef, &xyz0, tofInfo, matCorr, signCorr,
this]() {
262 if (matCorr != MatCorrType::USEMatCorrNONE) {
263 auto xyz1 = linRef.getXYZGlo();
264 auto mb = this->getMatBudget(matCorr, xyz0, xyz1);
265 if (!
track.correctForMaterial(linRef, mb.meanX2X0, mb.getXRho(signCorr))) {
269 tofInfo->addStep(mb.length, linRef.getQ2P2());
270 tofInfo->addX2X0(mb.meanX2X0);
271 tofInfo->addXRho(mb.getXRho(signCorr));
273 }
else if (tofInfo) {
274 auto xyz1 = linRef.getXYZGlo();
276 tofInfo->addStep(stepV.R(), linRef.getQ2P2());
281 if (!
track.propagateTo(
x, linRef,
b)) {
284 if (maxSnp > 0 && math_utils::detail::abs<value_type>(
track.getSnp()) >= maxSnp) {
291 dx = xToGo -
track.getX();
298template <
typename value_T>
299GPUd() bool
PropagatorImpl<value_T>::PropagateToXBxByBz(TrackPar_t& track, value_type xToGo, value_type maxSnp, value_type maxStep,
313 auto dx = xToGo -
track.getX();
314 int dir = dx > 0.f ? 1 : -1;
319 std::array<value_type, 3>
b{};
320 while (math_utils::detail::abs<value_type>(dx) > Epsilon) {
321 auto step = math_utils::detail::min<value_type>(math_utils::detail::abs<value_type>(dx), maxStep);
326 auto xyz0 =
track.getXYZGlo();
327 getFieldXYZ(xyz0, &
b[0]);
329 auto correct = [&
track, &xyz0, tofInfo, matCorr, signCorr,
this]() {
331 if (matCorr != MatCorrType::USEMatCorrNONE) {
332 auto xyz1 =
track.getXYZGlo();
333 auto mb = this->getMatBudget(matCorr, xyz0, xyz1);
334 if (!
track.correctForELoss(((signCorr < 0) ? -mb.length : mb.
length) * mb.meanRho)) {
338 tofInfo->addStep(mb.length,
track.getQ2P2());
339 tofInfo->addX2X0(mb.meanX2X0);
340 tofInfo->addXRho(mb.getXRho(signCorr));
342 }
else if (tofInfo) {
343 auto xyz1 =
track.getXYZGlo();
345 tofInfo->addStep(stepV.R(),
track.getQ2P2());
350 if (!
track.propagateParamTo(
x,
b)) {
353 if (maxSnp > 0 && math_utils::detail::abs<value_type>(
track.getSnp()) >= maxSnp) {
360 dx = xToGo -
track.getX();
367template <
typename value_T>
368GPUd() bool
PropagatorImpl<value_T>::propagateToX(TrackParCov_t& track, value_type xToGo, value_type bZ, value_type maxSnp, value_type maxStep,
381 auto dx = xToGo -
track.getX();
382 int dir = dx > 0.f ? 1 : -1;
387 while (math_utils::detail::abs<value_type>(dx) > Epsilon) {
388 auto step = math_utils::detail::min<value_type>(math_utils::detail::abs<value_type>(dx), maxStep);
393 auto xyz0 =
track.getXYZGlo();
394 auto correct = [&
track, &xyz0, tofInfo, matCorr, signCorr,
this]() {
396 if (matCorr != MatCorrType::USEMatCorrNONE) {
397 auto xyz1 =
track.getXYZGlo();
398 auto mb = this->getMatBudget(matCorr, xyz0, xyz1);
399 if (!
track.correctForMaterial(mb.meanX2X0, mb.getXRho(signCorr))) {
403 tofInfo->addStep(mb.length,
track.getQ2P2());
404 tofInfo->addX2X0(mb.meanX2X0);
405 tofInfo->addXRho(mb.getXRho(signCorr));
407 }
else if (tofInfo) {
408 auto xyz1 =
track.getXYZGlo();
410 tofInfo->addStep(stepV.R(),
track.getQ2P2());
414 if (!
track.propagateTo(
x, bZ)) {
417 if (maxSnp > 0 && math_utils::detail::abs<value_type>(
track.getSnp()) >= maxSnp) {
424 dx = xToGo -
track.getX();
431template <
typename value_T>
432GPUd() bool
PropagatorImpl<value_T>::propagateToX(TrackParCov_t& track, TrackPar_t& linRef, value_type xToGo, value_type bZ, value_type maxSnp, value_type maxStep,
445 auto dx = xToGo -
track.getX();
446 int dir = dx > 0.f ? 1 : -1;
451 while (math_utils::detail::abs<value_type>(dx) > Epsilon) {
452 auto step = math_utils::detail::min<value_type>(math_utils::detail::abs<value_type>(dx), maxStep);
457 auto xyz0 = linRef.getXYZGlo();
459 auto correct = [&
track, &linRef, &xyz0, tofInfo, matCorr, signCorr,
this]() {
461 if (matCorr != MatCorrType::USEMatCorrNONE) {
462 auto xyz1 = linRef.getXYZGlo();
463 auto mb = this->getMatBudget(matCorr, xyz0, xyz1);
464 if (!
track.correctForMaterial(linRef, mb.meanX2X0, mb.getXRho(signCorr))) {
468 tofInfo->addStep(mb.length, linRef.getQ2P2());
469 tofInfo->addX2X0(mb.meanX2X0);
470 tofInfo->addXRho(mb.getXRho(signCorr));
472 }
else if (tofInfo) {
473 auto xyz1 = linRef.getXYZGlo();
475 tofInfo->addStep(stepV.R(), linRef.getQ2P2());
480 if (!
track.propagateTo(
x, linRef, bZ)) {
483 if (maxSnp > 0 && math_utils::detail::abs<value_type>(
track.getSnp()) >= maxSnp) {
490 dx = xToGo -
track.getX();
497template <
typename value_T>
498GPUd() bool
PropagatorImpl<value_T>::propagateToX(TrackPar_t& track, value_type xToGo, value_type bZ, value_type maxSnp, value_type maxStep,
512 auto dx = xToGo -
track.getX();
513 int dir = dx > 0.f ? 1 : -1;
518 while (math_utils::detail::abs<value_type>(dx) > Epsilon) {
519 auto step = math_utils::detail::min<value_type>(math_utils::detail::abs<value_type>(dx), maxStep);
524 auto xyz0 =
track.getXYZGlo();
526 auto correct = [&
track, &xyz0, tofInfo, matCorr, signCorr,
this]() {
528 if (matCorr != MatCorrType::USEMatCorrNONE) {
529 auto xyz1 =
track.getXYZGlo();
530 auto mb = this->getMatBudget(matCorr, xyz0, xyz1);
531 if (!
track.correctForELoss(mb.getXRho(signCorr))) {
535 tofInfo->addStep(mb.length,
track.getQ2P2());
536 tofInfo->addX2X0(mb.meanX2X0);
537 tofInfo->addXRho(mb.getXRho(signCorr));
539 }
else if (tofInfo) {
540 auto xyz1 =
track.getXYZGlo();
542 tofInfo->addStep(stepV.R(),
track.getQ2P2());
547 if (!
track.propagateParamTo(
x, bZ)) {
550 if (maxSnp > 0 && math_utils::detail::abs<value_type>(
track.getSnp()) >= maxSnp) {
557 dx = xToGo -
track.getX();
564template <
typename value_T>
565template <
typename track_T>
566GPUd() bool
PropagatorImpl<value_T>::propagateToR(track_T& track, value_type
r,
bool bzOnly, value_type maxSnp, value_type maxStep,
567 MatCorrType matCorr, track::TrackLTIntegral* tofInfo,
int signCorr)
const
569 const value_T MaxPhiLoc = math_utils::detail::asin<value_T>(maxSnp), MaxPhiLocSafe = 0.95 * MaxPhiLoc;
570 auto bz = getNominalBz();
571 if (math_utils::detail::abs(bz) > constants::math::Almost0) {
574 value_type r0 = math_utils::detail::sqrt<value_T>(
track.getX() *
track.getX() +
track.getY() *
track.getY());
575 value_type dr = (
r - r0);
576 value_type rTmp =
r - (math_utils::detail::abs<value_T>(dr) > 1. ? (dr > 0 ? 0.5 : -0.5) : 0.5 * dr);
578 crad.
c = crad.
cc = 1.f;
579 crad.
s = crad.
ss = crad.
cs = 0.f;
581 cross.circlesCrossInfo(crad, traux, 0.);
582 if (cross.
nDCA < 1) {
585 double phiCross[2] = {}, dphi[2] = {};
586 auto curv =
track.getCurvature(bz);
587 bool clockwise = curv < 0;
588 auto phiLoc = math_utils::detail::asin<double>(
track.getSnp());
589 auto phi0 = phiLoc +
track.getAlpha();
591 for (
int i = 0;
i < cross.
nDCA;
i++) {
596 auto normX = double(cross.
yDCA[
i]) - double(traux.yC), normY = -(double(cross.
xDCA[
i]) - double(traux.xC));
601 phiCross[
i] = math_utils::detail::atan2<double>(normY, normX);
603 dphi[
i] = phiCross[
i] - phi0;
610 int sel = cross.
nDCA == 1 ? 0 : (clockwise ? (dphi[0] < dphi[1] ? 0 : 1) : (dphi[1] < dphi[0] ? 0 : 1));
611 auto deltaPhi = dphi[sel];
614 auto phiLocFin = phiLoc + deltaPhi;
616 if (math_utils::detail::abs<value_type>(phiLocFin) < MaxPhiLocSafe) {
617 auto deltaX = (math_utils::detail::sin<double>(phiLocFin) -
track.getSnp()) /
track.getCurvature(bz);
618 if (!propagateTo(track,
track.getX() + deltaX, bzOnly, maxSnp, maxStep, matCorr, tofInfo, signCorr)) {
623 if (math_utils::detail::abs<value_type>(deltaPhi) < (2 * MaxPhiLocSafe)) {
624 auto rot = phiLoc + 0.5 * deltaPhi;
632 auto rot = phiLoc + (deltaPhi > 0 ? MaxPhiLocSafe : -MaxPhiLocSafe);
639 auto tgtPhiLoc = deltaPhi > 0 ? MaxPhiLocSafe : -MaxPhiLocSafe;
640 auto deltaX = (math_utils::detail::sin<double>(tgtPhiLoc) -
track.getSnp()) /
track.getCurvature(bz);
641 if (!propagateTo(track,
track.getX() + deltaX, bzOnly, maxSnp, maxStep, matCorr, tofInfo, signCorr)) {
644 deltaPhi -= tgtPhiLoc - phiLoc;
645 phiLoc = deltaPhi > 0 ? MaxPhiLocSafe : -MaxPhiLocSafe;
652 if (!
track.getXatLabR(
r, xfin, bz)) {
655 return propagateToX(track, xfin, bzOnly, maxSnp, maxStep, matCorr, tofInfo, signCorr);
658template <
typename value_T>
659GPUd() 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,
660 MatCorrType matCorr, track::TrackLTIntegral* tofInfo,
int signCorr)
const
663 auto snp =
track.getSnpAt(
alpha,
x, getNominalBz());
665 if (math_utils::detail::abs<value_type>(snp) < maxSnp * 0.9 && (linRef ?
track.rotate(
alpha, *linRef, getNominalBz()) :
track.rotate(
alpha))) {
666 auto dx = math_utils::detail::abs<value_type>(
x -
track.getX());
670 return propagateTo(track, linRef,
x, bzOnly, maxSnp, math_utils::detail::min<value_type>(dx / minSteps, maxStep), matCorr, tofInfo, signCorr);
676template <
typename value_T>
677template <
typename track_T>
678GPUd() bool
PropagatorImpl<value_T>::propagateToAlphaX(track_T& track, value_type
alpha, value_type
x,
bool bzOnly, value_type maxSnp, value_type maxStep,
int minSteps,
679 MatCorrType matCorr, track::TrackLTIntegral* tofInfo,
int signCorr)
const
682 auto snp =
track.getSnpAt(
alpha,
x, getNominalBz());
684 if (math_utils::detail::abs<value_type>(snp) < maxSnp * 0.9 &&
track.rotate(
alpha)) {
685 auto dx = math_utils::detail::abs<value_type>(
x -
track.getX());
689 return propagateTo(track,
x, bzOnly, maxSnp, math_utils::detail::min<value_type>(dx / minSteps, maxStep), matCorr, tofInfo, signCorr);
709template <
typename value_T>
710GPUd() bool
PropagatorImpl<value_T>::propagateToDCA(const
o2::dataformats::VertexBase& vtx, TrackParCov_t& track, value_type bZ,
712 o2::dataformats::DCA* dca, track::TrackLTIntegral* tofInfo,
713 int signCorr, value_type maxD)
const
716 value_type sn, cs, alp =
track.getAlpha();
717 math_utils::detail::sincos<value_type>(alp, sn, cs);
718 value_type
x =
track.getX(),
y =
track.getY(), snp =
track.getSnp(), csp = math_utils::detail::sqrt<value_type>((1.f - snp) * (1.f + snp));
719 value_type xv = vtx.getX() * cs + vtx.getY() * sn, yv = -vtx.getX() * sn + vtx.getY() * cs, zv = vtx.getZ();
723 value_type d = math_utils::detail::abs<value_type>(
x * snp -
y * csp);
731 value_type crv =
track.getCurvature(bZ);
732 value_type tgfv = -(crv *
x - snp) / (crv *
y + csp);
733 sn = tgfv / math_utils::detail::sqrt<value_type>(1.f + tgfv * tgfv);
734 cs = math_utils::detail::sqrt<value_type>((1. - sn) * (1. + sn));
737 x = xv * cs + yv * sn;
738 yv = -xv * sn + yv * cs;
742 alp += math_utils::detail::asin<value_type>(sn);
743 if (!tmpT.rotate(alp) || !propagateToX(tmpT, xv, bZ, 0.85, maxStep, matCorr, tofInfo, signCorr)) {
744#ifndef GPUCA_ALIGPUCODE
745 LOG(
debug) <<
"failed to propagate to alpha=" << alp <<
" X=" << xv << vtx <<
" | Track is: " << tmpT.asString();
746#elif !defined(GPUCA_NO_FMT)
747 LOG(
debug) <<
"failed to propagate to alpha=" << alp <<
" X=" << xv << vtx;
757 math_utils::detail::sincos<value_type>(alp, sn, cs);
758 auto s2ylocvtx = vtx.getSigmaX2() * sn * sn + vtx.getSigmaY2() * cs * cs - 2. * vtx.getSigmaXY() * cs * sn;
759 dca->set(
track.getY() - yv,
track.getZ() - zv,
760 track.getSigmaY2() + s2ylocvtx,
track.getSigmaZY(),
track.getSigmaZ2() + vtx.getSigmaZ2());
766template <
typename value_T>
767GPUd() bool
PropagatorImpl<value_T>::propagateToDCABxByBz(const
o2::dataformats::VertexBase& vtx, TrackParCov_t& track,
769 o2::dataformats::DCA* dca, track::TrackLTIntegral* tofInfo,
770 int signCorr, value_type maxD)
const
773 value_type sn, cs, alp =
track.getAlpha();
774 math_utils::detail::sincos<value_type>(alp, sn, cs);
775 value_type
x =
track.getX(),
y =
track.getY(), snp =
track.getSnp(), csp = math_utils::detail::sqrt<value_type>((1.f - snp) * (1.f + snp));
776 value_type xv = vtx.getX() * cs + vtx.getY() * sn, yv = -vtx.getX() * sn + vtx.getY() * cs, zv = vtx.getZ();
780 value_type d = math_utils::detail::abs<value_type>(
x * snp -
y * csp);
788 value_type crv =
track.getCurvature(mNominalBz);
789 value_type tgfv = -(crv *
x - snp) / (crv *
y + csp);
790 sn = tgfv / math_utils::detail::sqrt<value_type>(1.f + tgfv * tgfv);
791 cs = math_utils::detail::sqrt<value_type>((1. - sn) * (1. + sn));
794 x = xv * cs + yv * sn;
795 yv = -xv * sn + yv * cs;
799 alp += math_utils::detail::asin<value_type>(sn);
800 if (!tmpT.rotate(alp) || !PropagateToXBxByBz(tmpT, xv, 0.85, maxStep, matCorr, tofInfo, signCorr)) {
801#ifndef GPUCA_ALIGPUCODE
802 LOG(
debug) <<
"failed to propagate to alpha=" << alp <<
" X=" << xv << vtx <<
" | Track is: " << tmpT.asString();
803#elif !defined(GPUCA_NO_FMT)
804 LOG(
debug) <<
"failed to propagate to alpha=" << alp <<
" X=" << xv << vtx;
814 math_utils::detail::sincos<value_type>(alp, sn, cs);
815 auto s2ylocvtx = vtx.getSigmaX2() * sn * sn + vtx.getSigmaY2() * cs * cs - 2. * vtx.getSigmaXY() * cs * sn;
816 dca->set(
track.getY() - yv,
track.getZ() - zv,
817 track.getSigmaY2() + s2ylocvtx,
track.getSigmaZY(),
track.getSigmaZ2() + vtx.getSigmaZ2());
823template <
typename value_T>
824GPUd() bool
PropagatorImpl<value_T>::propagateToDCA(const math_utils::
Point3D<value_type>& vtx, TrackPar_t& track, value_type bZ,
826 std::
array<value_type, 2>* dca, track::TrackLTIntegral* tofInfo,
827 int signCorr, value_type maxD)
const
830 value_type sn, cs, alp =
track.getAlpha();
831 math_utils::detail::sincos<value_type>(alp, sn, cs);
832 value_type
x =
track.getX(),
y =
track.getY(), snp =
track.getSnp(), csp = math_utils::detail::sqrt<value_type>((1.f - snp) * (1.f + snp));
833 value_type xv = vtx.X() * cs + vtx.Y() * sn, yv = -vtx.X() * sn + vtx.Y() * cs, zv = vtx.Z();
837 value_type d = math_utils::detail::abs<value_type>(
x * snp -
y * csp);
845 value_type crv =
track.getCurvature(bZ);
846 value_type tgfv = -(crv *
x - snp) / (crv *
y + csp);
847 sn = tgfv / math_utils::detail::sqrt<value_type>(1.f + tgfv * tgfv);
848 cs = math_utils::detail::sqrt<value_type>((1. - sn) * (1. + sn));
851 x = xv * cs + yv * sn;
852 yv = -xv * sn + yv * cs;
856 alp += math_utils::detail::asin<value_type>(sn);
857 if (!tmpT.rotateParam(alp) || !propagateToX(tmpT, xv, bZ, 0.85, maxStep, matCorr, tofInfo, signCorr)) {
858#ifndef GPUCA_ALIGPUCODE
859 LOG(
debug) <<
"failed to propagate to alpha=" << alp <<
" X=" << xv <<
" for vertex "
860 << vtx.X() <<
' ' << vtx.Y() <<
' ' << vtx.Z() <<
" | Track is: " << tmpT.asString();
862 LOG(
debug) <<
"failed to propagate to alpha=" << alp <<
" X=" << xv <<
" for vertex " << vtx.X() <<
' ' << vtx.Y() <<
' ' << vtx.Z();
872 (*dca)[0] =
track.getY() - yv;
873 (*dca)[1] =
track.getZ() - zv;
879template <
typename value_T>
882 std::
array<value_type, 2>* dca, track::TrackLTIntegral* tofInfo,
883 int signCorr, value_type maxD)
const
886 value_type sn, cs, alp =
track.getAlpha();
887 math_utils::detail::sincos<value_type>(alp, sn, cs);
888 value_type
x =
track.getX(),
y =
track.getY(), snp =
track.getSnp(), csp = math_utils::detail::sqrt<value_type>((1.f - snp) * (1.f + snp));
889 value_type xv = vtx.X() * cs + vtx.Y() * sn, yv = -vtx.X() * sn + vtx.Y() * cs, zv = vtx.Z();
893 value_type d = math_utils::detail::abs<value_type>(
x * snp -
y * csp);
901 value_type crv =
track.getCurvature(mNominalBz);
902 value_type tgfv = -(crv *
x - snp) / (crv *
y + csp);
903 sn = tgfv / math_utils::detail::sqrt<value_type>(1.f + tgfv * tgfv);
904 cs = math_utils::detail::sqrt<value_type>((1. - sn) * (1. + sn));
907 x = xv * cs + yv * sn;
908 yv = -xv * sn + yv * cs;
912 alp += math_utils::detail::asin<value_type>(sn);
913 if (!tmpT.rotateParam(alp) || !PropagateToXBxByBz(tmpT, xv, 0.85, maxStep, matCorr, tofInfo, signCorr)) {
914#ifndef GPUCA_ALIGPUCODE
915 LOG(
debug) <<
"failed to propagate to alpha=" << alp <<
" X=" << xv <<
" for vertex "
916 << vtx.X() <<
' ' << vtx.Y() <<
' ' << vtx.Z() <<
" | Track is: " << tmpT.asString();
918 LOG(
debug) <<
"failed to propagate to alpha=" << alp <<
" X=" << xv <<
" for vertex " << vtx.X() <<
' ' << vtx.Y() <<
' ' << vtx.Z();
928 (*dca)[0] =
track.getY() - yv;
929 (*dca)[1] =
track.getZ() - zv;
935template <
typename value_T>
936GPUd() float
PropagatorImpl<value_T>::estimateLTIncrement(const
o2::track::TrackParametrization<value_type>& trc,
937 const
o2::math_utils::
Point3D<value_type>& posStart,
938 const
o2::math_utils::
Point3D<value_type>& posEnd)
const
941 float dX = posEnd.X() - posStart.X(), dY = posEnd.Y() - posStart.Y(), dZ = posEnd.Z() - posStart.Z(), d2XY = dX * dX + dY * dY;
942 if (getNominalBz() != 0) {
945 getFieldXYZ(posAv,
b);
946 float curvH = math_utils::detail::abs<value_type>(0.5f * trc.getCurvature(
b[2])), asArg = curvH * math_utils::detail::sqrt<value_type>(d2XY);
952 return math_utils::detail::sqrt<value_type>(d2XY + dZ * dZ);
956template <
typename value_T>
957GPUd() value_T
PropagatorImpl<value_T>::estimateLTFast(
o2::track::TrackLTIntegral& lt, const
o2::track::TrackParametrization<value_type>& trc)
const
959 value_T xdca = 0., ydca = 0.,
length = 0.;
961 constexpr float TinyF = 1e-9;
962 auto straigh_line_approx = [&]() {
963 auto csp2 = (1.f - trc.getSnp()) * (1.f + trc.getSnp());
965 auto csp = math_utils::detail::sqrt<value_type>(csp2);
966 auto tgp = trc.getSnp() / csp,
f = trc.getX() * tgp - trc.getY();
967 xdca = tgp *
f * csp2;
969 auto dx = xdca - trc.getX(), dy = ydca - trc.getY(), dz = dx * trc.getTgl() / csp;
970 return math_utils::detail::sqrt<value_type>(dx * dx + dy * dy + dz * dz);
973 return math_utils::detail::abs<value_type>(trc.getY() * math_utils::detail::sqrt<value_type>(1. + trc.getTgl() * trc.getTgl()));
976 trc.getCircleParamsLoc(mNominalBz,
c);
978 auto distC = math_utils::detail::sqrt<value_type>(
c.getCenterD2());
980 auto nrm = (distC -
c.rC) / distC;
983 auto v0x = trc.getX() -
c.xC, v0y = trc.getY() -
c.yC, v1x = xdca -
c.xC, v1y = ydca -
c.yC;
984 auto angcos = (v0x * v1x + v0y * v1y) / (
c.rC *
c.rC);
985 if (math_utils::detail::abs<value_type>(angcos) < 1.f) {
986 auto ang = math_utils::detail::acos<value_type>(angcos);
987 if ((trc.getSign() > 0.f) == (mNominalBz > 0.f)) {
992 length = math_utils::detail::abs<value_type>(
c.rC * ang * math_utils::detail::sqrt<value_type>(1. + trc.getTgl() * trc.getTgl()));
994 length = straigh_line_approx();
1001 length = straigh_line_approx();
1004 value_T dcaT = math_utils::detail::sqrt<value_type>(xdca * xdca + ydca * ydca);
1006 lt.addStep(
length, trc.getQ2P2());
1011template <
typename value_T>
1014#if !defined(GPUCA_STANDALONE) && !defined(GPUCA_GPUCODE)
1015 if (corrType == MatCorrType::USEMatCorrTGeo) {
1019 if (mTGeoFallBackAllowed) {
1022 throw std::runtime_error(
"requested MatLUT is absent and fall-back to TGeo is disabled");
1026 return mMatLUT->getMatBudget(
p0.X(),
p0.Y(),
p0.Z(),
p1.X(),
p1.Y(),
p1.Z());
1029template <
typename value_T>
1030template <
typename T>
1034#if defined(GPUCA_GPUCODE_DEVICE) && defined(GPUCA_HAS_GLOBAL_SYMBOL_CONSTANT_MEM)
1037 const auto*
f = mGPUField;
1039 float bxyzF[3] = {};
1040 f->GetField(xyz.X(), xyz.Y(), xyz.Z(), bxyzF);
1042 constexpr value_type kCLight1 = 1. / o2::gpu::gpu_common_constants::kCLight;
1043 for (uint
i = 0;
i < 3; ++
i) {
1044 bxyz[
i] =
static_cast<value_type
>(bxyzF[
i]) * kCLight1;
1047#ifndef GPUCA_GPUCODE
1049 mFieldFast->Field(xyz, bxyz);
1051#ifdef GPUCA_STANDALONE
1052 LOG(fatal) <<
"Normal field cannot be used in standalone benchmark";
1054 mField->field(xyz, bxyz);
1061template <
typename value_T>
1062template <
typename T>
1067#if defined(GPUCA_GPUCODE_DEVICE) && defined(GPUCA_HAS_GLOBAL_SYMBOL_CONSTANT_MEM)
1070 const auto*
f = mGPUField;
1072 constexpr value_type kCLight1 = 1. / o2::gpu::gpu_common_constants::kCLight;
1073 bz =
f->GetFieldBz(xyz.X(), xyz.Y(), xyz.Z()) * kCLight1;
1075#ifndef GPUCA_GPUCODE
1077 mFieldFast->GetBz(xyz, bz);
1079#ifdef GPUCA_STANDALONE
1080 LOG(fatal) <<
"Normal field cannot be used in standalone benchmark";
1082 bz = mField->GetBz(xyz.X(), xyz.Y(), xyz.Z());
1090template <
typename value_T>
1093 getFieldXYZImpl<float>(xyz, bxyz);
1096template <
typename value_T>
1099 getFieldXYZImpl<double>(xyz, bxyz);
1102template <
typename value_T>
1105 return getBzImpl<float>(xyz);
1108template <
typename value_T>
1111 return getBzImpl<double>(xyz);
1116#if !defined(GPUCA_GPUCODE) || defined(GPUCA_GPUCODE_DEVICE)
1123#ifndef GPUCA_GPUCODE