23#ifndef GPUCA_GPUCODE_DEVICE
27#ifndef GPUCA_ALIGPUCODE
28#include <fmt/printf.h>
35template <
typename value_T>
37 : mX{0.f}, mAlpha{0.f}, mP{0.f}
47 constexpr value_t kSafe = 1e-5;
48 value_t radPos2 = xyz[0] * xyz[0] + xyz[1] * xyz[1];
50 if (sectorAlpha || radPos2 < 1) {
51 alp = gpu::CAMath::ATan2(pxpypz[1], pxpypz[0]);
53 alp = gpu::CAMath::ATan2(xyz[1], xyz[0]);
56 alp = math_utils::detail::angle2Alpha<value_t>(alp);
60 math_utils::detail::sincos(alp, sn, cs);
62 if (cs * pxpypz[0] + sn * pxpypz[1] < 0) {
63 LOG(
debug) <<
"alpha from phiPos() will invalidate this track parameters, overriding to alpha from phi()";
64 alp = gpu::CAMath::ATan2(pxpypz[1], pxpypz[0]);
66 alp = math_utils::detail::angle2Alpha<value_t>(alp);
68 math_utils::detail::sincos(alp, sn, cs);
72 if (gpu::CAMath::Abs(sn) < 2 * kSafe) {
74 alp += alp < constants::math::PIHalf ? 2 * kSafe : -2 * kSafe;
76 alp += alp > -constants::math::PIHalf ? -2 * kSafe : 2 * kSafe;
78 math_utils::detail::sincos(alp, sn, cs);
79 }
else if (gpu::CAMath::Abs(cs) < 2 * kSafe) {
81 alp += alp > constants::math::PIHalf ? 2 * kSafe : -2 * kSafe;
83 alp += alp > -constants::math::PIHalf ? 2 * kSafe : -2 * kSafe;
85 math_utils::detail::sincos(alp, sn, cs);
88 dim3_t ver{xyz[0], xyz[1], xyz[2]};
89 dim3_t mom{pxpypz[0], pxpypz[1], pxpypz[2]};
92 math_utils::detail::rotateZ<value_t>(ver, -alp);
93 math_utils::detail::rotateZ<value_t>(mom, -alp);
95 value_t ptI = 1.f / gpu::CAMath::Sqrt(mom[0] * mom[0] + mom[1] * mom[1]);
100 mP[
kSnp] = mom[1] * ptI;
101 mP[
kTgl] = mom[2] * ptI;
102 mAbsCharge = gpu::CAMath::Abs(
charge);
106 if (gpu::CAMath::Abs(1 - getSnp()) < kSafe) {
107 mP[
kSnp] = 1.f - kSafe;
108 }
else if (gpu::CAMath::Abs(-1 - getSnp()) < kSafe) {
109 mP[
kSnp] = -1.f + kSafe;
115template <
typename value_T>
119 if (gpu::CAMath::Abs(getQ2Pt()) < constants::math::Almost0 || gpu::CAMath::Abs(getSnp()) > constants::math::Almost1) {
122 value_t cs, sn, pt = getPt();
123 value_t
r = gpu::CAMath::Sqrt((1.f - getSnp()) * (1.f + getSnp()));
124 math_utils::detail::sincos(getAlpha(), sn, cs);
125 pxyz[0] = pt * (
r * cs - getSnp() * sn);
126 pxyz[1] = pt * (getSnp() * cs +
r * sn);
127 pxyz[2] = pt * getTgl();
132template <
typename value_T>
136 value_t ptI = getPtInv();
137 value_t snp = getSnp();
138 if (gpu::CAMath::Abs(snp) > constants::math::Almost1) {
141 value_t &sn = posdirp[7], &cs = posdirp[8];
142 value_t csp = gpu::CAMath::Sqrt((1.f - snp) * (1.f + snp));
143 value_t cstht = gpu::CAMath::Sqrt(1.f + getTgl() * getTgl());
144 value_t csthti = 1.f / cstht;
145 math_utils::detail::sincos(getAlpha(), sn, cs);
146 posdirp[0] =
getX() * cs -
getY() * sn;
147 posdirp[1] =
getX() * sn +
getY() * cs;
149 posdirp[3] = (csp * cs - snp * sn) * csthti;
150 posdirp[4] = (snp * cs + csp * sn) * csthti;
151 posdirp[5] = getTgl() * csthti;
152 posdirp[6] = cstht / ptI;
157template <
typename value_T>
161 if (gpu::CAMath::Abs(getSnp()) > constants::math::Almost1) {
162 LOGP(
debug,
"Precondition is not satisfied: |sin(phi)|>1 ! {:f}", getSnp());
166 math_utils::detail::bringToPMPi<value_t>(
alpha);
168 value_t ca = 0, sa = 0;
169 math_utils::detail::sincos(
alpha - getAlpha(), sa, ca);
170 value_t snp = getSnp(), csp = gpu::CAMath::Sqrt((1.f - snp) * (1.f + snp));
173 if ((csp * ca + snp * sa) < 0) {
178 value_t tmp = snp * ca - csp * sa;
179 if (gpu::CAMath::Abs(tmp) > constants::math::Almost1) {
180 LOGP(
debug,
"Rotation failed: new snp {:.2f}", tmp);
183 value_t xold =
getX(), yold =
getY();
185 mX = xold * ca + yold * sa;
186 mP[
kY] = -xold * sa + yold * ca;
192template <
typename value_T>
201 value_t dx = xk -
getX();
202 if (gpu::CAMath::Abs(dx) < constants::math::Almost0) {
206 if (gpu::CAMath::Abs(dx) > 1e5 || gpu::CAMath::Abs(
getY()) > 1e5 || gpu::CAMath::Abs(getZ()) > 1e5) {
207 LOG(warning) <<
"Anomalous track, traget X:" << xk;
210 value_t crv = getCurvature(
b[2]);
212 return propagateParamTo(xk, 0.);
215 value_t x2r = crv * dx;
216 value_t
f1 = getSnp(),
f2 =
f1 + x2r;
217 if (gpu::CAMath::Abs(
f1) > constants::math::Almost1 || gpu::CAMath::Abs(
f2) > constants::math::Almost1) {
220 value_t r1 = gpu::CAMath::Sqrt((1.f -
f1) * (1.f +
f1));
221 if (gpu::CAMath::Abs(r1) < constants::math::Almost0) {
224 value_t r2 = gpu::CAMath::Sqrt((1.f -
f2) * (1.f +
f2));
225 if (gpu::CAMath::Abs(r2) < constants::math::Almost0) {
228 value_t dy2dx = (
f1 +
f2) / (r1 + r2);
229 value_t
step = (gpu::CAMath::Abs(x2r) < 0.05f) ? dx * gpu::CAMath::Abs(r2 +
f2 * dy2dx)
230 : 2.f * CAMath::ASin(0.5f * dx * gpu::CAMath::Sqrt(1.f + dy2dx * dy2dx) * crv) / crv;
231 step *= gpu::CAMath::Sqrt(1.f + getTgl() * getTgl());
235 if (!getPosDirGlo(vecLab)) {
240 value_t bxy2 =
b[0] *
b[0] +
b[1] *
b[1];
241 value_t bt = gpu::CAMath::Sqrt(bxy2);
242 value_t cosphi = 1.f, sinphi = 0.f;
243 if (bt > constants::math::Almost0) {
247 value_t
bb = gpu::CAMath::Sqrt(bxy2 +
b[2] *
b[2]);
248 value_t costet = 1.f, sintet = 0.f;
249 if (
bb > constants::math::Almost0) {
254 -sinphi * vecLab[0] + cosphi * vecLab[1],
255 sintet * cosphi * vecLab[0] + sintet * sinphi * vecLab[1] + costet * vecLab[2],
256 costet * cosphi * vecLab[3] + costet * sinphi * vecLab[4] - sintet * vecLab[5],
257 -sinphi * vecLab[3] + cosphi * vecLab[4],
258 sintet * cosphi * vecLab[3] + sintet * sinphi * vecLab[4] + costet * vecLab[5],
262 value_t q = getCharge();
266 vecLab[0] = cosphi * costet *
vect[0] - sinphi *
vect[1] + cosphi * sintet *
vect[2];
267 vecLab[1] = sinphi * costet *
vect[0] + cosphi *
vect[1] + sinphi * sintet *
vect[2];
268 vecLab[2] = -sintet *
vect[0] + costet *
vect[2];
270 vecLab[3] = cosphi * costet *
vect[3] - sinphi *
vect[4] + cosphi * sintet *
vect[5];
271 vecLab[4] = sinphi * costet *
vect[3] + cosphi *
vect[4] + sinphi * sintet *
vect[5];
272 vecLab[5] = -sintet *
vect[3] + costet *
vect[5];
275 value_t sinalp = -vecLab[7], cosalp = vecLab[8];
276 value_t t = cosalp * vecLab[0] - sinalp * vecLab[1];
277 vecLab[1] = sinalp * vecLab[0] + cosalp * vecLab[1];
279 t = cosalp * vecLab[3] - sinalp * vecLab[4];
280 vecLab[4] = sinalp * vecLab[3] + cosalp * vecLab[4];
284 value_t
x = vecLab[0],
y = vecLab[1],
z = vecLab[2];
285 if (gpu::CAMath::Abs(dx) > constants::math::Almost0) {
286 if (gpu::CAMath::Abs(vecLab[3]) < constants::math::Almost0) {
291 y += vecLab[4] / vecLab[3] * dx;
292 z += vecLab[5] / vecLab[3] * dx;
296 t = 1.f / gpu::CAMath::Sqrt(vecLab[3] * vecLab[3] + vecLab[4] * vecLab[4]);
300 mP[
kSnp] = vecLab[4] * t;
301 mP[
kTgl] = vecLab[5] * t;
302 mP[
kQ2Pt] = q * t / vecLab[6];
308template <
typename value_T>
316 value_t dx = xk -
getX();
317 if (gpu::CAMath::Abs(dx) < constants::math::Almost0) {
320 value_t crv = (gpu::CAMath::Abs(
b) < constants::math::Almost0) ? 0.f : getCurvature(
b);
321 value_t x2r = crv * dx;
322 value_t
f1 = getSnp(),
f2 =
f1 + x2r;
323 if ((gpu::CAMath::Abs(
f1) > constants::math::Almost1) || (gpu::CAMath::Abs(
f2) > constants::math::Almost1)) {
326 value_t r1 = gpu::CAMath::Sqrt((1.f -
f1) * (1.f +
f1));
327 if (gpu::CAMath::Abs(r1) < constants::math::Almost0) {
330 value_t r2 = gpu::CAMath::Sqrt((1.f -
f2) * (1.f +
f2));
331 if (gpu::CAMath::Abs(r2) < constants::math::Almost0) {
334 double dy2dx = (
f1 +
f2) / (r1 + r2);
335 bool arcz = gpu::CAMath::Abs(x2r) > 0.05f;
345 auto arg = r1 *
f2 - r2 *
f1;
346 if (gpu::CAMath::Abs(arg) > constants::math::Almost1) {
349 value_t rot = CAMath::ASin(arg);
352 rot = constants::math::PI - rot;
354 rot = -constants::math::PI - rot;
357 mP[
kZ] += getTgl() / crv * rot;
359 mP[
kZ] += dx * (r2 +
f2 * dy2dx) * getTgl();
362 mP[
kY] += dx * dy2dx;
368template <
typename value_T>
372 value_t sn, cs, alp = getAlpha();
373 math_utils::detail::sincos(alp, sn, cs);
374 value_t
x =
getX(),
y =
getY(), snp = getSnp(), csp = gpu::CAMath::Sqrt((1.f - snp) * (1.f + snp));
375 value_t xv = vtx.X() * cs + vtx.Y() * sn, yv = -vtx.X() * sn + vtx.Y() * cs, zv = vtx.Z();
379 value_t d = gpu::CAMath::Abs(
x * snp -
y * csp);
383 value_t crv = getCurvature(
b);
384 value_t tgfv = -(crv *
x - snp) / (crv *
y + csp);
385 sn = tgfv / gpu::CAMath::Sqrt(1.f + tgfv * tgfv);
386 cs = gpu::CAMath::Sqrt((1.f - sn) * (1.f + sn));
387 cs = (gpu::CAMath::Abs(tgfv) > constants::math::Almost0) ? sn / tgfv : constants::math::
Almost1;
389 x = xv * cs + yv * sn;
390 yv = -xv * sn + yv * cs;
394 alp += gpu::CAMath::ASin(sn);
395 if (!tmpT.rotateParam(alp) || !tmpT.propagateParamTo(xv,
b)) {
396#ifndef GPUCA_ALIGPUCODE
397 LOG(
debug) <<
"failed to propagate to alpha=" << alp <<
" X=" << xv <<
" for vertex "
398 << vtx.X() <<
' ' << vtx.Y() <<
' ' << vtx.Z() <<
" | Track is: " << tmpT.asString();
400 LOG(
debug) <<
"failed to propagate to alpha=" << alp <<
" X=" << xv <<
" for vertex " << vtx.X() <<
' ' << vtx.Y() <<
' ' << vtx.Z();
406 (*dca)[0] =
getY() - yv;
407 (*dca)[1] = getZ() - zv;
413template <
typename value_T>
419 value_t dx = xk -
getX();
422 if (gpu::CAMath::Abs(dx) < constants::math::Almost0) {
425 value_t crv = getCurvature(
b);
426 value_t x2r = crv * dx;
427 value_t
f1 = getSnp(),
f2 =
f1 + x2r;
428 if ((gpu::CAMath::Abs(
f1) > constants::math::Almost1) || (gpu::CAMath::Abs(
f2) > constants::math::Almost1)) {
431 value_t r1 = gpu::CAMath::Sqrt((1.f -
f1) * (1.f +
f1));
432 if (gpu::CAMath::Abs(r1) < constants::math::Almost0) {
435 value_t r2 = gpu::CAMath::Sqrt((1.f -
f2) * (1.f +
f2));
436 if (gpu::CAMath::Abs(r2) < constants::math::Almost0) {
439 double dy2dx = (
f1 +
f2) / (r1 + r2);
441 if (gpu::CAMath::Abs(x2r) < 0.05f) {
442 z += dx * (r2 +
f2 * dy2dx) * getTgl();
452 value_t rot = CAMath::ASin(r1 *
f2 - r2 *
f1);
455 rot = constants::math::PI - rot;
457 rot = -constants::math::PI - rot;
460 z += getTgl() / crv * rot;
466template <
typename value_T>
471 mAlpha += constants::math::PI;
472 math_utils::detail::bringToPMPi<value_t>(mAlpha);
481template <
typename value_T>
486 return getYZAt(xk,
b,
y,
z) ?
z : -9999.f;
490template <
typename value_T>
495 return getYZAt(xk,
b,
y,
z) ?
y : -9999.f;
499template <
typename value_T>
503 value_t dx = xk -
getX();
504 if (gpu::CAMath::Abs(dx) < constants::math::Almost0) {
507 value_t crv = (gpu::CAMath::Abs(
b) < constants::math::Almost0) ? 0.f : getCurvature(
b);
508 value_t x2r = crv * dx;
509 return mP[
kSnp] + x2r;
513template <
typename value_T>
517 value_t dx = xk -
getX();
518 if (gpu::CAMath::Abs(dx) < constants::math::Almost0) {
521 value_t crv = (gpu::CAMath::Abs(
b) < constants::math::Almost0) ? 0.f : getCurvature(
b);
522 value_t x2r = crv * dx;
523 value_t snp = mP[
kSnp] + x2r;
525 if (gpu::CAMath::Abs(snp) < constants::math::Almost1) {
526 phi = gpu::CAMath::ASin(snp) + getAlpha();
527 math_utils::detail::bringTo02Pi<value_t>(phi);
533template <
typename value_T>
538 auto y = getYAt(xk,
b);
540 phi = gpu::CAMath::ATan2(
y, xk) + getAlpha();
541 math_utils::detail::bringTo02Pi<value_t>(phi);
547template <
typename value_T>
551 math_utils::detail::bringToPMPi<value_t>(
alpha);
552 value_t ca = 0, sa = 0;
553 math_utils::detail::sincos(
alpha - getAlpha(), sa, ca);
554 value_t snp = getSnp(), csp = gpu::CAMath::Sqrt((1.f - snp) * (1.f + snp));
556 if ((csp * ca + snp * sa) < 0.) {
560 value_t tmp = snp * ca - csp * sa;
561 if (gpu::CAMath::Abs(tmp) > constants::math::Almost1) {
562 LOGP(
debug,
"Rotation failed: new snp {:.2f}", tmp);
565 value_t xrot =
getX() * ca +
getY() * sa;
566 value_t dx = xk - xrot;
567 value_t crv = (gpu::CAMath::Abs(
b) < constants::math::Almost0) ? 0.f : getCurvature(
b);
568 value_t x2r = crv * dx;
572#ifndef GPUCA_ALIGPUCODE
574template <
typename value_T>
578 return fmt::format(
"X:{:+.4e} Alp:{:+.3e} Par: {:+.4e} {:+.4e} {:+.4e} {:+.4e} {:+.4e} |Q|:{:d} {:s}\n",
579 getX(), getAlpha(),
getY(), getZ(), getSnp(), getTgl(), getQ2Pt(), getAbsCharge(), getPID().
getName());
583template <
typename value_T>
587 auto _Alpha = getAlpha();
590 auto _Snp = getSnp();
591 auto _Tgl = getTgl();
592 float _Q2Pt = getQ2Pt();
593 float _AbsCharge = getAbsCharge();
595 return fmt::format(
"X:{:x} Alp:{:x} Par: {:x} {:x} {:x} {:x} {:x} |Q|:{:x} {:s}\n",
596 reinterpret_cast<const unsigned int&
>(_X),
597 reinterpret_cast<const unsigned int&
>(_Alpha),
598 reinterpret_cast<const unsigned int&
>(_Y),
599 reinterpret_cast<const unsigned int&
>(_Z),
600 reinterpret_cast<const unsigned int&
>(_Snp),
601 reinterpret_cast<const unsigned int&
>(_Tgl),
602 reinterpret_cast<const unsigned int&
>(_Q2Pt),
603 reinterpret_cast<const unsigned int&
>(_AbsCharge),
609template <
typename value_T>
613#ifndef GPUCA_ALIGPUCODE
615#elif !defined(GPUCA_GPUCODE_DEVICE) || (!defined(__OPENCL__) && defined(GPUCA_GPU_DEBUG_PRINT))
616 printf(
"X:%+.4e Alp:%+.3e Par: %+.4e %+.4e %+.4e %+.4e %+.4e |Q|:%d %s\n",
617 getX(), getAlpha(),
getY(), getZ(), getSnp(), getTgl(), getQ2Pt(), getAbsCharge(), getPID().
getName());
622template <
typename value_T>
626#ifndef GPUCA_ALIGPUCODE
627 printf(
"%s\n", asStringHexadecimal().c_str());
628#elif !defined(GPUCA_GPUCODE_DEVICE) || (!defined(__OPENCL__) && defined(GPUCA_GPU_DEBUG_PRINT))
629 printf(
"X:%x Alp:%x Par: %x %x %x %x %x |Q|:%x %s\n",
630 gpu::CAMath::Float2UIntReint(
getX()),
631 gpu::CAMath::Float2UIntReint(getAlpha()),
632 gpu::CAMath::Float2UIntReint(
getY()),
633 gpu::CAMath::Float2UIntReint(getZ()),
634 gpu::CAMath::Float2UIntReint(getSnp()),
635 gpu::CAMath::Float2UIntReint(getTgl()),
636 gpu::CAMath::Float2UIntReint(getQ2Pt()),
637 gpu::CAMath::Float2UIntReint(getAbsCharge()),
643template <
typename value_T>
654 const auto fy = mP[0], sn = mP[2];
655 const value_t kEps = 1.e-6;
657 if (gpu::CAMath::Abs(getSnp()) > constants::math::Almost1) {
660 auto crv = getCurvature(bz);
661 while (gpu::CAMath::Abs(crv) > constants::math::Almost0) {
664 getCircleParamsLoc(bz, circle);
665 if (circle.rC == 0.) {
669 value_t r0 = gpu::CAMath::Sqrt(circle.getCenterD2());
670 if (r0 <= constants::math::Almost0) {
673 value_t tR2r0 = 1.f,
g = 0.f, tmp = 0.f;
674 if (gpu::CAMath::Abs(circle.rC - r0) > kEps) {
675 tR2r0 = circle.rC / r0;
676 g = 0.5f * (
r *
r / (r0 * circle.rC) - tR2r0 - 1.f / tR2r0);
677 tmp = 1.f +
g * tR2r0;
680 g = 0.5f *
r *
r / (r0 * circle.rC) - 1.f;
681 tmp = 0.5f *
r *
r / (r0 * r0);
683 value_t det = (1.f -
g) * (1.f +
g);
687 det = gpu::CAMath::Sqrt(det);
694 value_t
y = circle.yC * tmp;
695 if (gpu::CAMath::Abs(circle.yC) > constants::math::Almost0) {
696 value_t dfx = tR2r0 * gpu::CAMath::Abs(circle.yC) * det;
697 value_t dfy = tR2r0 * circle.xC * (circle.yC > 0.f ? det : -det);
699 value_t delta = (
x - mX) * dfx - (
y - fy) * dfy;
700 x += delta < 0.f ? dfx : -dfx;
703 value_t dfeps = mX -
x;
707 if (gpu::CAMath::Abs(dfeps) < kEps && gpu::CAMath::Abs(mX * mX + fy * fy -
r *
r) < kEps) {
711 value_t dxm =
x - mX;
714 }
else if (dxm < -kEps) {
720 value_t dfeps =
x - mX;
724 if (gpu::CAMath::Abs(dfeps) < kEps && gpu::CAMath::Abs(mX * mX + fy * fy -
r *
r) < kEps) {
728 value_t dxm =
x - mX;
745 if (gpu::CAMath::Abs(sn) >= constants::math::Almost1) {
746 value_t det = (
r - mX) * (
r + mX);
754 det = gpu::CAMath::Sqrt(det);
770 }
else if (fy > det) {
774 }
else if (gpu::CAMath::Abs(sn) <= constants::math::Almost0) {
775 value_t det = (
r - fy) * (
r + fy);
779 det = gpu::CAMath::Sqrt(det);
781 x = mX > 0.f ? det : -det;
787 x = (mX < -det) ? -det : det;
793 x = mX > det ? det : -det;
797 value_t cs = gpu::CAMath::Sqrt((1.f - sn) * (1.f + sn));
798 value_t xsyc = mX * sn - fy * cs;
799 value_t det = (
r - xsyc) * (
r + xsyc);
803 det = gpu::CAMath::Sqrt(det);
804 value_t xcys = mX * cs + fy * sn;
807 t += t > 0.f ? -det : det;
808 }
else if (dir > 0) {
828template <
typename value_T>
839 constexpr value_t kMinP = 0.01f;
841 auto m = getPID().getMass();
842 if (
m > 0 && xrho != 0.f) {
845 value_t csp2 = (1.f - getSnp()) * (1.f + getSnp());
846 value_t cst2I = (1.f + getTgl() * getTgl());
847 value_t
angle = gpu::CAMath::Sqrt(cst2I / (csp2));
850 int charge2 = getAbsCharge() * getAbsCharge();
851 value_t p = getP(),
p0 = p,
p2 = p * p, e2 =
p2 + getPID().getMass2(), massInv = 1. /
m,
bg = p * massInv;
852 value_t e = gpu::CAMath::Sqrt(e2), ekin = e -
m,
dedx = getdEdxBBOpt(
bg);
853#ifdef _BB_NONCONST_CORR_
854 value_t dedxDer = 0., dedx1 =
dedx;
859 value_t dE =
dedx * xrho;
867#ifdef _BB_NONCONST_CORR_
868 dedxDer = getBetheBlochSolidDerivativeApprox(dedx1,
bg);
875#ifdef _BB_NONCONST_CORR_
880 auto corrC = (gpu::CAMath::Exp(dedxDer) - 1.) / dedxDer;
886 p = gpu::CAMath::Sqrt(e * e - getPID().getMass2());
893#ifdef _BB_NONCONST_CORR_
894 dedxDer = getBetheBlochSolidDerivativeApprox(
dedx,
bg);
898#ifdef _BB_NONCONST_CORR_
909 setQ2Pt(getQ2Pt() * p0 / p);
916template <
typename value_T>
921 math_utils::detail::sincos(-mAlpha, sn, cs);
922 value_t sn2 = sn * sn, cs2 = cs * cs, sncs = sn * cs;
923 value_t dsxysncs = 2. *
v.getSigmaXY() * sncs;
924 return {{
v.getX() * sn +
v.getY() * cs,
v.getZ()},
925 {
v.getSigmaX2() * sn2 + dsxysncs +
v.getSigmaY2() * cs2, (sn + cs) *
v.getSigmaYZ(),
v.getSigmaZ2()}};
929template <
typename value_T>
934 return ttmp.propagateParamToDCA({xmv, ymv, zmv},
b, &dca) ? dca[0] : -9999.;
938template <
typename value_T>
943 return ttmp.propagateParamToDCA({xmv, ymv, zmv},
b, &dca) ? dca[1] : -9999.;
948#if !defined(GPUCA_GPUCODE) || defined(GPUCA_GPUCODE_DEVICE)
std::string getName(const TDataMember *dm, int index, int size)
std::string asString(TDataMember const &dm, char *pointer)
std::string asStringHexadecimal()
std::string asString() const
GLfloat GLfloat GLfloat alpha
GLboolean GLboolean GLboolean b
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
GLdouble GLdouble GLdouble z
typename trackParam_t::dim3_t dim3_t
typename trackParam_t::dim2_t dim2_t
double * getX(double *xyDxy, int N)
double * getY(double *xyDxy, int N)
value_T gpu::gpustd::array< value_T, 7 > & vect
GPUd() value_T BetheBlochSolid(value_T bg
constexpr int MaxELossIter
constexpr float ELoss2EKinThreshInv
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"