18#ifndef GPUCA_GPUCODE_DEVICE
22#ifndef GPUCA_ALIGPUCODE
23#include <fmt/printf.h>
31template <
typename value_T>
46template <
typename value_T>
53 if (gpu::CAMath::Abs(dx) < constants::math::Almost0) {
56 value_t crv = this->getCurvature(bz);
59 if ((gpu::CAMath::Abs(
f1) > constants::math::Almost1) || (gpu::CAMath::Abs(
f2) > constants::math::Almost1)) {
62 value_t r1 = gpu::CAMath::Sqrt((1.f -
f1) * (1.f +
f1));
63 if (gpu::CAMath::Abs(r1) < constants::math::Almost0) {
66 value_t r2 = gpu::CAMath::Sqrt((1.f -
f2) * (1.f +
f2));
67 if (gpu::CAMath::Abs(r2) < constants::math::Almost0) {
70 double r1pr2Inv = 1. / (r1 + r2);
71 double dy2dx = (
f1 +
f2) * r1pr2Inv;
72 const auto dy2dxF =
static_cast<value_t>(dy2dx);
73 bool arcz = gpu::CAMath::Abs(x2r) > 0.05f;
84 auto arg = r1 *
f2 - r2 *
f1;
85 if (gpu::CAMath::Abs(arg) > constants::math::Almost1) {
88 value_t rot = gpu::CAMath::ASin(arg);
91 rot = constants::math::PI - rot;
93 rot = -constants::math::PI - rot;
96 dP[
kZ] = this->getTgl() / crv * rot;
98 dP[
kZ] = dx * (r2 +
f2 * dy2dxF) * this->getTgl();
101 dP[
kY] = dx * dy2dxF;
104 this->updateParams(dP);
113 double r2inv = 1. / r2, r1inv = 1. / r1;
114 double dx2r1pr2 = dx * r1pr2Inv;
116 double hh = dx2r1pr2 * r2inv * (1. + r1 * r2 +
f1 *
f2), jj = dx * (dy2dx -
f2 * r2inv);
117 double f02 = hh * r1inv;
118 double f04 = hh * dx2r1pr2 * kb;
119 double f24 = dx * kb;
120 double f12 = this->getTgl() * (f02 *
f2 + jj);
121 double f13 = dx * (r2 +
f2 * dy2dx);
122 double f14 = this->getTgl() * (f04 *
f2 + jj * f24);
125 double b00 = f02 * c20 + f04 * c40, b01 = f12 * c20 + f14 * c40 + f13 * c30;
126 double b02 = f24 * c40;
127 double b10 = f02 * c21 + f04 * c41, b11 = f12 * c21 + f14 * c41 + f13 * c31;
128 double b12 = f24 * c41;
129 double b20 = f02 * c22 + f04 * c42, b21 = f12 * c22 + f14 * c42 + f13 * c32;
130 double b22 = f24 * c42;
131 double b40 = f02 * c42 + f04 * c44, b41 = f12 * c42 + f14 * c44 + f13 * c43;
132 double b42 = f24 * c44;
133 double b30 = f02 * c32 + f04 * c43, b31 = f12 * c32 + f14 * c43 + f13 * c33;
134 double b32 = f24 * c43;
137 double a00 = f02 * b20 + f04 * b40, a01 = f02 * b21 + f04 * b41, a02 = f02 * b22 + f04 * b42;
138 double a11 = f12 * b21 + f14 * b41 + f13 * b31, a12 = f12 * b22 + f14 * b42 + f13 * b32;
139 double a22 = f24 * b42;
142 c00 += b00 + b00 + a00;
143 c10 += b10 + b01 + a01;
144 c20 += b20 + b02 + a02;
147 c11 += b11 + b11 + a11;
148 c21 += b21 + b12 + a12;
151 c22 += b22 + b22 + a22;
161template <
typename value_T>
167 if (this->getAbsCharge() == 0) {
171 if (gpu::CAMath::Abs(dx) < constants::math::Almost0) {
178 if (!linRef1.propagateTo(xk, bz)) {
183 double snpRef0 = linRef0.getSnp(), cspRef0 = gpu::CAMath::Sqrt((1 - snpRef0) * (1 + snpRef0));
184 double snpRef1 = linRef1.getSnp(), cspRef1 = gpu::CAMath::Sqrt((1 - snpRef1) * (1 + snpRef1));
185 double cspRef0Inv = 1 / cspRef0, cspRef1Inv = 1 / cspRef1,
cc = cspRef0 + cspRef1, ccInv = 1 /
cc, dy2dx = (snpRef0 + snpRef1) * ccInv;
186 double dxccInv = dx * ccInv, hh = dxccInv * cspRef1Inv * (1 + cspRef0 * cspRef1 + snpRef0 * snpRef1), jj = dx * (dy2dx - snpRef1 * cspRef1Inv);
188 double f02 = hh * cspRef0Inv;
189 double f04 = hh * dxccInv * kb;
190 double f24 = dx * kb;
191 double f12 = linRef0.getTgl() * (f02 * snpRef1 + jj);
192 double f13 = dx * (cspRef1 + snpRef1 * dy2dx);
193 double f14 = linRef0.getTgl() * (f04 * snpRef1 + jj * f24);
197 for (
int i = 0;
i < 5;
i++) {
198 diff[
i] = this->getParam(
i) - linRef0.getParam(
i);
201 if (gpu::CAMath::Abs(snpUpd) > constants::math::Almost1) {
206 this->setY(linRef1.getY() + diff[
kY] + f02 * diff[
kSnp] + f04 * diff[
kQ2Pt]);
207 this->setZ(linRef1.getZ() + diff[
kZ] + f13 * diff[
kTgl] + f14 * diff[
kQ2Pt]);
208 this->setSnp(snpUpd);
209 this->setTgl(linRef1.getTgl() + diff[
kTgl]);
210 this->setQ2Pt(linRef1.getQ2Pt() + diff[
kQ2Pt]);
218 double b00 = f02 * c20 + f04 * c40, b01 = f12 * c20 + f14 * c40 + f13 * c30;
219 double b02 = f24 * c40;
220 double b10 = f02 * c21 + f04 * c41, b11 = f12 * c21 + f14 * c41 + f13 * c31;
221 double b12 = f24 * c41;
222 double b20 = f02 * c22 + f04 * c42, b21 = f12 * c22 + f14 * c42 + f13 * c32;
223 double b22 = f24 * c42;
224 double b40 = f02 * c42 + f04 * c44, b41 = f12 * c42 + f14 * c44 + f13 * c43;
225 double b42 = f24 * c44;
226 double b30 = f02 * c32 + f04 * c43, b31 = f12 * c32 + f14 * c43 + f13 * c33;
227 double b32 = f24 * c43;
230 double a00 = f02 * b20 + f04 * b40, a01 = f02 * b21 + f04 * b41, a02 = f02 * b22 + f04 * b42;
231 double a11 = f12 * b21 + f14 * b41 + f13 * b31, a12 = f12 * b22 + f14 * b42 + f13 * b32;
232 double a22 = f24 * b42;
235 c00 += b00 + b00 + a00;
236 c10 += b10 + b01 + a01;
237 c20 += b20 + b02 + a02;
240 c11 += b11 + b11 + a11;
241 c21 += b21 + b12 + a12;
244 c22 += b22 + b22 + a22;
254template <
typename value_T>
262template <
typename value_T>
266 if (gpu::CAMath::Abs(this->getSnp()) > constants::math::Almost1) {
267 LOGP(
debug,
"Precondition is not satisfied: |sin(phi)|>1 ! {:f}", this->getSnp());
271 math_utils::detail::bringToPMPi<value_t>(
alpha);
274 math_utils::detail::sincos(
alpha - this->getAlpha(), sa, ca);
275 value_t snp = this->getSnp(), csp = gpu::CAMath::Sqrt((1.f - snp) * (1.f + snp));
278 if ((csp * ca + snp * sa) < 0) {
284 value_t updSnp = snp * ca - csp * sa;
285 if (gpu::CAMath::Abs(updSnp) > constants::math::Almost1) {
286 LOGP(
debug,
"Rotation failed: new snp {:.2f}", updSnp);
290 this->setAlpha(
alpha);
291 this->setX(xold * ca + yold * sa);
292 this->setY(-xold * sa + yold * ca);
293 this->setSnp(updSnp);
295 if (gpu::CAMath::Abs(csp) < constants::math::Almost0) {
296 LOGP(
debug,
"Too small cosine value {:f}", csp);
297 csp = constants::math::Almost0;
300 value_t rr = (ca + snp / csp * sa);
317template <
typename value_T>
322 if (gpu::CAMath::Abs(this->getSnp()) > constants::math::Almost1) {
323 LOGP(
debug,
"Precondition is not satisfied: |sin(phi)|>1 ! {:f}", this->getSnp());
327 math_utils::detail::bringToPMPi<value_t>(
alpha);
332 if (!linRef1.rotateParam(
alpha, ca, sa)) {
337 if (!linRef1.propagateParamTo(trackX, bz)) {
342 value_t snp = this->getSnp(), csp = gpu::CAMath::Sqrt((1.f - snp) * (1.f + snp)), updSnp = snp * ca - csp * sa;
343 if ((csp * ca + snp * sa) < 0 || gpu::CAMath::Abs(updSnp) > constants::math::Almost1) {
347 this->setY(-sa * this->
getX() + ca * this->
getY());
349 this->setSnp(updSnp);
350 this->setAlpha(
alpha);
353 value_t snpRef0 = linRef0.getSnp(), cspRef0 = gpu::CAMath::Sqrt((
value_t(1) - snpRef0) * (
value_t(1) + snpRef0));
354 value_t snpRef1 = linRef1.getSnp(), cspRef1 = ca * cspRef0 + sa * snpRef0;
355 value_t rr = cspRef1 / cspRef0;
377 auto cspRef1Inv =
value_t(1) / cspRef1;
378 auto j3 = -snpRef1 * cspRef1Inv;
379 auto j4 = -linRef1.getTgl() * cspRef1Inv;
380 auto j5 = linRef1.getCurvature(bz);
387 auto hXSigY = cXSigY + cSigX2 * j3;
388 auto hXSigZ = cXSigZ + cSigX2 * j4;
389 auto hXSigSnp = cXSigSnp + cSigX2 * j5;
391 mC[
kSigY2] += j3 * (cXSigY + hXSigY);
392 mC[
kSigZ2] += j4 * (cXSigZ + hXSigZ);
393 mC[
kSigSnpY] += cXSigSnp * j3 + hXSigY * j5;
394 mC[
kSigSnp2] += j5 * (cXSigSnp + hXSigSnp);
399 mC[
kSigZY] += cXSigZ * j3 + hXSigY * j4;
400 mC[
kSigSnpZ] += cXSigSnp * j4 + hXSigZ * j5;
412template <
typename value_T>
416 value_t sn, cs, alp = this->getAlpha();
417 o2::math_utils::detail::sincos(alp, sn, cs);
418 value_t x = this->
getX(),
y = this->
getY(), snp = this->getSnp(), csp = gpu::CAMath::Sqrt((1.f - snp) * (1.f + snp));
419 value_t xv = vtx.getX() * cs + vtx.getY() * sn, yv = -vtx.getX() * sn + vtx.getY() * cs, zv = vtx.getZ();
423 value_t d = gpu::CAMath::Abs(
x * snp -
y * csp);
431 value_t crv = this->getCurvature(
b);
432 value_t tgfv = -(crv *
x - snp) / (crv *
y + csp);
433 sn = tgfv / gpu::CAMath::Sqrt(1.f + tgfv * tgfv);
434 cs = gpu::CAMath::Sqrt((1.f - sn) * (1.f + sn));
435 cs = (gpu::CAMath::Abs(tgfv) > constants::math::Almost0) ? sn / tgfv : constants::math::
Almost1;
437 x = xv * cs + yv * sn;
438 yv = -xv * sn + yv * cs;
442 alp += gpu::CAMath::ASin(sn);
443 if (!tmpT.rotate(alp) || !tmpT.propagateTo(xv,
b)) {
444#if !defined(GPUCA_ALIGPUCODE)
445 LOG(
debug) <<
"failed to propagate to alpha=" << alp <<
" X=" << xv << vtx <<
" | Track is: " << tmpT.asString();
455 o2::math_utils::detail::sincos(alp, sn, cs);
456 auto s2ylocvtx = vtx.getSigmaX2() * sn * sn + vtx.getSigmaY2() * cs * cs - 2. * vtx.getSigmaXY() * cs * sn;
457 dca->set(this->
getY() - yv, this->getZ() - zv, getSigmaY2() + s2ylocvtx, getSigmaZY(), getSigmaZ2() + vtx.getSigmaZ2());
463template <
typename value_T>
468 set(xyz, pxpypz, cv,
charge, sectorAlpha,
pid);
472template <
typename value_T>
485 value_t radPos2 = xyz[0] * xyz[0] + xyz[1] * xyz[1];
487 if (sectorAlpha || radPos2 < 1) {
488 alp = gpu::CAMath::ATan2(pxpypz[1], pxpypz[0]);
490 alp = gpu::CAMath::ATan2(xyz[1], xyz[0]);
493 alp = math_utils::detail::angle2Alpha<value_t>(alp);
497 math_utils::detail::sincos(alp, sn, cs);
499 if (cs * pxpypz[0] + sn * pxpypz[1] < 0) {
500 LOG(
debug) <<
"alpha from phiPos() will invalidate this track parameters, overriding to alpha from phi()";
501 alp = gpu::CAMath::ATan2(pxpypz[1], pxpypz[0]);
503 alp = math_utils::detail::angle2Alpha<value_t>(alp);
505 math_utils::detail::sincos(alp, sn, cs);
508 if (gpu::CAMath::Abs(sn) < 2.f *
kSafe) {
510 alp += alp < constants::math::PIHalf ? 2.f *
kSafe : -2.f *
kSafe;
512 alp += alp > -constants::math::PIHalf ? -2.f *
kSafe : 2.f *
kSafe;
514 math_utils::detail::sincos(alp, sn, cs);
515 }
else if (gpu::CAMath::Abs(cs) < 2.f *
kSafe) {
517 alp += alp > constants::math::PIHalf ? 2.f *
kSafe : -2.f *
kSafe;
519 alp += alp > -constants::math::PIHalf ? 2.f *
kSafe : -2.f *
kSafe;
521 math_utils::detail::sincos(alp, sn, cs);
524 dim3_t ver{xyz[0], xyz[1], xyz[2]};
525 dim3_t mom{pxpypz[0], pxpypz[1], pxpypz[2]};
528 math_utils::detail::rotateZ<value_t>(ver, -alp);
529 math_utils::detail::rotateZ<value_t>(mom, -alp);
531 const value_t pt2 = mom[0] * mom[0] + mom[1] * mom[1];
532 const value_t pt = gpu::CAMath::Sqrt(pt2);
538 this->setSnp(mom[1] * ptI);
539 this->setTgl(mom[2] * ptI);
540 this->setAbsCharge(gpu::CAMath::Abs(
charge));
544 if (gpu::CAMath::Abs(1.f - this->getSnp()) <
kSafe) {
545 this->setSnp(1.f -
kSafe);
546 }
else if (gpu::CAMath::Abs(-1.f - this->getSnp()) <
kSafe) {
547 this->setSnp(-1.f +
kSafe);
552 const value_t pt3I = ptI / pt2;
557 for (
int i = 0;
i < 6; ++
i) {
558 for (
int j = 0;
j <=
i; ++
j) {
559 cLab[
i][
j] = cLab[
j][
i] = cv[
idx++];
571 const value_t dSnpDu = -u *
v * pt3I;
572 const value_t dSnpDv = u * u * pt3I;
573 const value_t dTglDu = -
w * u * pt3I;
576 const value_t dQ2PtDu = -qeff * u * pt3I;
577 const value_t dQ2PtDv = -qeff *
v * pt3I;
579 jac[
kSnp][3] = dSnpDu * cs - dSnpDv * sn;
580 jac[
kSnp][4] = dSnpDu * sn + dSnpDv * cs;
581 jac[
kTgl][3] = dTglDu * cs - dTglDv * sn;
582 jac[
kTgl][4] = dTglDu * sn + dTglDv * cs;
583 jac[
kTgl][5] = dTglDw;
584 jac[
kQ2Pt][3] = dQ2PtDu * cs - dQ2PtDv * sn;
585 jac[
kQ2Pt][4] = dQ2PtDu * sn + dQ2PtDv * cs;
588 for (
int j = 0;
j <=
i; ++
j) {
590 for (
int k = 0; k < 6; ++k) {
591 for (
int l = 0; l < 6; ++l) {
592 cij += jac[
i][k] * cLab[k][l] * jac[
j][l];
595 mC[CovarMap[
i][
j]] = cij;
602template <
typename value_T>
613 if (gpu::CAMath::Abs(dx) < constants::math::Almost0) {
617 if (gpu::CAMath::Abs(dx) > 1e5 || gpu::CAMath::Abs(this->
getY()) > 1e5 || gpu::CAMath::Abs(this->getZ()) > 1e5) {
618 LOG(warning) <<
"Anomalous track, target X:" << xk;
622 value_t crv = (gpu::CAMath::Abs(
b[2]) < constants::math::Almost0) ? 0.f :
this->getCurvature(
b[2]);
623 if (gpu::CAMath::Abs(crv) < constants::math::Almost0) {
624 return propagateTo(xk, 0.);
628 if ((gpu::CAMath::Abs(
f1) > constants::math::Almost1) || (gpu::CAMath::Abs(
f2) > constants::math::Almost1)) {
631 value_t r1 = gpu::CAMath::Sqrt((1.f -
f1) * (1.f +
f1));
632 if (gpu::CAMath::Abs(r1) < constants::math::Almost0) {
635 value_t r2 = gpu::CAMath::Sqrt((1.f -
f2) * (1.f +
f2));
636 if (gpu::CAMath::Abs(r2) < constants::math::Almost0) {
639 double r1pr2Inv = 1. / (r1 + r2), r2inv = 1. / r2, r1inv = 1. / r1;
640 double dy2dx = (
f1 +
f2) * r1pr2Inv, dx2r1pr2 = dx * r1pr2Inv;
641 value_t step = (gpu::CAMath::Abs(x2r) < 0.05f) ? dx * gpu::CAMath::Abs(r2 +
f2 * dy2dx)
642 : 2.f * gpu::CAMath::ASin(0.5f * dx * gpu::CAMath::Sqrt(1.f + dy2dx * dy2dx) * crv) / crv;
643 step *= gpu::CAMath::Sqrt(1.f + this->getTgl() * this->getTgl());
646 std::array<value_t, 9> vecLab{0.f};
647 if (!this->getPosDirGlo(vecLab)) {
658 value_t kb =
b[2] * constants::math::B2C;
659 double hh = dx2r1pr2 * r2inv * (1. + r1 * r2 +
f1 *
f2), jj = dx * (dy2dx -
f2 * r2inv);
660 double f02 = hh * r1inv;
661 double f04 = hh * dx2r1pr2 * kb;
662 double f24 = dx * kb;
663 double f12 = this->getTgl() * (f02 *
f2 + jj);
664 double f13 = dx * (r2 +
f2 * dy2dx);
665 double f14 = this->getTgl() * (f04 *
f2 + jj * f24);
668 double b00 = f02 * c20 + f04 * c40, b01 = f12 * c20 + f14 * c40 + f13 * c30;
669 double b02 = f24 * c40;
670 double b10 = f02 * c21 + f04 * c41, b11 = f12 * c21 + f14 * c41 + f13 * c31;
671 double b12 = f24 * c41;
672 double b20 = f02 * c22 + f04 * c42, b21 = f12 * c22 + f14 * c42 + f13 * c32;
673 double b22 = f24 * c42;
674 double b40 = f02 * c42 + f04 * c44, b41 = f12 * c42 + f14 * c44 + f13 * c43;
675 double b42 = f24 * c44;
676 double b30 = f02 * c32 + f04 * c43, b31 = f12 * c32 + f14 * c43 + f13 * c33;
677 double b32 = f24 * c43;
680 double a00 = f02 * b20 + f04 * b40, a01 = f02 * b21 + f04 * b41, a02 = f02 * b22 + f04 * b42;
681 double a11 = f12 * b21 + f14 * b41 + f13 * b31, a12 = f12 * b22 + f14 * b42 + f13 * b32;
682 double a22 = f24 * b42;
685 c00 += b00 + b00 + a00;
686 c10 += b10 + b01 + a01;
687 c20 += b20 + b02 + a02;
690 c11 += b11 + b11 + a11;
691 c21 += b21 + b12 + a12;
694 c22 += b22 + b22 + a22;
702 value_t bt = gpu::CAMath::Sqrt(bxy2);
703 value_t cosphi = 1.f, sinphi = 0.f;
704 if (bt > constants::math::Almost0) {
708 value_t bb = gpu::CAMath::Sqrt(bxy2 +
b[2] *
b[2]);
709 value_t costet = 1., sintet = 0.;
710 if (
bb > constants::math::Almost0) {
714 std::array<value_t, 7>
vect{costet * cosphi * vecLab[0] + costet * sinphi * vecLab[1] - sintet * vecLab[2],
715 -sinphi * vecLab[0] + cosphi * vecLab[1],
716 sintet * cosphi * vecLab[0] + sintet * sinphi * vecLab[1] + costet * vecLab[2],
717 costet * cosphi * vecLab[3] + costet * sinphi * vecLab[4] - sintet * vecLab[5],
718 -sinphi * vecLab[3] + cosphi * vecLab[4],
719 sintet * cosphi * vecLab[3] + sintet * sinphi * vecLab[4] + costet * vecLab[5],
727 vecLab[0] = cosphi * costet *
vect[0] - sinphi *
vect[1] + cosphi * sintet *
vect[2];
728 vecLab[1] = sinphi * costet *
vect[0] + cosphi *
vect[1] + sinphi * sintet *
vect[2];
729 vecLab[2] = -sintet *
vect[0] + costet *
vect[2];
731 vecLab[3] = cosphi * costet *
vect[3] - sinphi *
vect[4] + cosphi * sintet *
vect[5];
732 vecLab[4] = sinphi * costet *
vect[3] + cosphi *
vect[4] + sinphi * sintet *
vect[5];
733 vecLab[5] = -sintet *
vect[3] + costet *
vect[5];
736 value_t sinalp = -vecLab[7], cosalp = vecLab[8];
737 value_t t = cosalp * vecLab[0] - sinalp * vecLab[1];
738 vecLab[1] = sinalp * vecLab[0] + cosalp * vecLab[1];
740 t = cosalp * vecLab[3] - sinalp * vecLab[4];
741 vecLab[4] = sinalp * vecLab[3] + cosalp * vecLab[4];
745 value_t x = vecLab[0],
y = vecLab[1],
z = vecLab[2];
746 if (gpu::CAMath::Abs(
x - xk) > constants::math::Almost0) {
747 if (gpu::CAMath::Abs(vecLab[3]) < constants::math::Almost0) {
750 auto dxFin = xk - vecLab[0];
752 y += vecLab[4] / vecLab[3] * dxFin;
753 z += vecLab[5] / vecLab[3] * dxFin;
757 t = 1.f / gpu::CAMath::Sqrt(vecLab[3] * vecLab[3] + vecLab[4] * vecLab[4]);
761 this->setSnp(vecLab[4] * t);
762 this->setTgl(vecLab[5] * t);
763 this->setQ2Pt(q * t / vecLab[6]);
769template <
typename value_T>
780 if (gpu::CAMath::Abs(dx) < constants::math::Almost0) {
784 if (gpu::CAMath::Abs(dx) > 1e5 || gpu::CAMath::Abs(this->
getY()) > 1e5 || gpu::CAMath::Abs(this->getZ()) > 1e5) {
785 LOG(warning) <<
"Anomalous track, target X:" << xk;
789 if (gpu::CAMath::Abs(dx) < constants::math::Almost0) {
795 value_t crv = (gpu::CAMath::Abs(
b[2]) < constants::math::Almost0) ? 0.f : linRef0.getCurvature(
b[2]);
796 if (gpu::CAMath::Abs(crv) < constants::math::Almost0) {
797 return propagateTo(xk, linRef0, 0.);
799 value_t kb =
b[2] * constants::math::B2C, x2r = crv * dx;
801 value_t snpRef0 = linRef0.getSnp(), snpRef1 = snpRef0 + x2r;
802 if ((gpu::CAMath::Abs(snpRef0) > constants::math::Almost1) || (gpu::CAMath::Abs(snpRef1) > constants::math::Almost1)) {
805 value_t cspRef0 = gpu::CAMath::Sqrt((1 - snpRef0) * (1 + snpRef0)), cspRef1 = gpu::CAMath::Sqrt((1 - snpRef1) * (1 + snpRef1));
806 if (gpu::CAMath::Abs(cspRef0) < constants::math::Almost0 || gpu::CAMath::Abs(cspRef1) < constants::math::Almost0) {
809 value_t cspRef0Inv =
value_t(1) / cspRef0, cspRef1Inv =
value_t(1) / cspRef1,
cc = cspRef0 + cspRef1, ccInv =
value_t(1) /
cc, dy2dx = (snpRef0 + snpRef1) * ccInv;
810 value_t step = (gpu::CAMath::Abs(crv * dx) < 0.05f) ? dx * (cspRef1 + snpRef1 * dy2dx) : 2. * gpu::CAMath::ASin(0.5 * dx * gpu::CAMath::Sqrt(1.f + dy2dx * dy2dx) * crv) / crv;
811 step *= gpu::CAMath::Sqrt(1.f + linRef0.getTgl() * linRef0.getTgl());
815 std::array<value_t, 9> vecLab{0.f};
816 if (!linRef0.getPosDirGlo(vecLab)) {
822 value_t bt = gpu::CAMath::Sqrt(bxy2);
823 value_t cosphi = 1.f, sinphi = 0.f;
824 if (bt > constants::math::Almost0) {
828 value_t bb = gpu::CAMath::Sqrt(bxy2 +
b[2] *
b[2]);
829 value_t costet = 1., sintet = 0.;
830 if (
bb > constants::math::Almost0) {
834 std::array<value_t, 7>
vect{costet * cosphi * vecLab[0] + costet * sinphi * vecLab[1] - sintet * vecLab[2],
835 -sinphi * vecLab[0] + cosphi * vecLab[1],
836 sintet * cosphi * vecLab[0] + sintet * sinphi * vecLab[1] + costet * vecLab[2],
837 costet * cosphi * vecLab[3] + costet * sinphi * vecLab[4] - sintet * vecLab[5],
838 -sinphi * vecLab[3] + cosphi * vecLab[4],
839 sintet * cosphi * vecLab[3] + sintet * sinphi * vecLab[4] + costet * vecLab[5],
847 vecLab[0] = cosphi * costet *
vect[0] - sinphi *
vect[1] + cosphi * sintet *
vect[2];
848 vecLab[1] = sinphi * costet *
vect[0] + cosphi *
vect[1] + sinphi * sintet *
vect[2];
849 vecLab[2] = -sintet *
vect[0] + costet *
vect[2];
851 vecLab[3] = cosphi * costet *
vect[3] - sinphi *
vect[4] + cosphi * sintet *
vect[5];
852 vecLab[4] = sinphi * costet *
vect[3] + cosphi *
vect[4] + sinphi * sintet *
vect[5];
853 vecLab[5] = -sintet *
vect[3] + costet *
vect[5];
856 value_t sinalp = -vecLab[7], cosalp = vecLab[8];
857 value_t t = cosalp * vecLab[0] - sinalp * vecLab[1];
858 vecLab[1] = sinalp * vecLab[0] + cosalp * vecLab[1];
860 t = cosalp * vecLab[3] - sinalp * vecLab[4];
861 vecLab[4] = sinalp * vecLab[3] + cosalp * vecLab[4];
865 value_t x = vecLab[0],
y = vecLab[1],
z = vecLab[2];
866 if (gpu::CAMath::Abs(
x - xk) > constants::math::Almost0) {
867 if (gpu::CAMath::Abs(vecLab[3]) < constants::math::Almost0) {
870 auto dxFin = xk - vecLab[0];
872 y += vecLab[4] / vecLab[3] * dxFin;
873 z += vecLab[5] / vecLab[3] * dxFin;
877 auto linRef1 = linRef0;
878 t = 1.f / gpu::CAMath::Sqrt(vecLab[3] * vecLab[3] + vecLab[4] * vecLab[4]);
882 linRef1.setSnp(snpRef1 = vecLab[4] * t);
883 linRef1.setTgl(vecLab[5] * t);
884 linRef1.setQ2Pt(q * t / vecLab[6]);
887 cspRef1 = gpu::CAMath::Sqrt((1 - snpRef1) * (1 + snpRef1));
888 cspRef1Inv =
value_t(1) / cspRef1;
889 cc = cspRef0 + cspRef1;
891 dy2dx = (snpRef0 + snpRef1) * ccInv;
892 double dxccInv = dx * ccInv, hh = dxccInv * cspRef1Inv * (1 + cspRef0 * cspRef1 + snpRef0 * snpRef1), jj = dx * (dy2dx - snpRef1 * cspRef1Inv);
893 double f02 = hh * cspRef0Inv;
894 double f04 = hh * dxccInv * kb;
895 double f24 = dx * kb;
896 double f12 = linRef0.getTgl() * (f02 * snpRef1 + jj);
897 double f13 = dx * (cspRef1 + snpRef1 * dy2dx);
898 double f14 = linRef0.getTgl() * (f04 * snpRef1 + jj * f24);
902 for (
int i = 0;
i < 5;
i++) {
903 diff[
i] = this->getParam(
i) - linRef0.getParam(
i);
906 if (gpu::CAMath::Abs(snpUpd) > constants::math::Almost1) {
910 this->setY(linRef1.getY() + diff[
kY] + f02 * diff[
kSnp] + f04 * diff[
kQ2Pt]);
911 this->setZ(linRef1.getZ() + diff[
kZ] + f13 * diff[
kTgl] + f14 * diff[
kQ2Pt]);
912 this->setSnp(snpUpd);
913 this->setTgl(linRef1.getTgl() + diff[
kTgl]);
914 this->setQ2Pt(linRef1.getQ2Pt() + diff[
kQ2Pt]);
925 double b00 = f02 * c20 + f04 * c40, b01 = f12 * c20 + f14 * c40 + f13 * c30;
926 double b02 = f24 * c40;
927 double b10 = f02 * c21 + f04 * c41, b11 = f12 * c21 + f14 * c41 + f13 * c31;
928 double b12 = f24 * c41;
929 double b20 = f02 * c22 + f04 * c42, b21 = f12 * c22 + f14 * c42 + f13 * c32;
930 double b22 = f24 * c42;
931 double b40 = f02 * c42 + f04 * c44, b41 = f12 * c42 + f14 * c44 + f13 * c43;
932 double b42 = f24 * c44;
933 double b30 = f02 * c32 + f04 * c43, b31 = f12 * c32 + f14 * c43 + f13 * c33;
934 double b32 = f24 * c43;
937 double a00 = f02 * b20 + f04 * b40, a01 = f02 * b21 + f04 * b41, a02 = f02 * b22 + f04 * b42;
938 double a11 = f12 * b21 + f14 * b41 + f13 * b31, a12 = f12 * b22 + f14 * b42 + f13 * b32;
939 double a22 = f24 * b42;
942 c00 += b00 + b00 + a00;
943 c10 += b10 + b01 + a01;
944 c20 += b20 + b02 + a02;
947 c11 += b11 + b11 + a11;
948 c21 += b21 + b12 + a12;
951 c22 += b22 + b22 + a22;
961template <
typename value_T>
965 constexpr float MaxCorr = 0.99;
967 for (
int j =
i;
j--;) {
968 auto sig2 = mC[DiagMap[
i]] * mC[DiagMap[
j]];
969 auto& cov = mC[CovarMap[
i][
j]];
970 if (cov * cov >= MaxCorr * sig2) {
971 cov = gpu::CAMath::Sqrt(sig2) * (cov > 0. ? MaxCorr : -MaxCorr);
978template <
typename value_T>
1033template <
typename value_T>
1038 if (s2 > constants::math::Almost0) {
1039 d0 = getSigmaY2() * s2;
1040 d1 = getSigmaZ2() * s2;
1041 d2 = getSigmaSnp2() * s2;
1042 d3 = getSigmaTgl2() * s2;
1043 d4 = getSigma1Pt2() * s2;
1071template <
typename value_T>
1075 auto sdd =
static_cast<double>(getSigmaY2()) +
static_cast<double>(cov[0]);
1076 auto sdz =
static_cast<double>(getSigmaZY()) +
static_cast<double>(cov[1]);
1077 auto szz =
static_cast<double>(getSigmaZ2()) +
static_cast<double>(cov[2]);
1078 auto det = sdd * szz - sdz * sdz;
1080 if (gpu::CAMath::Abs(det) < constants::math::Almost0) {
1081 return constants::math::VeryBig;
1086 auto chi2 = (d * (szz * d - sdz *
z) +
z * (sdd *
z - d * sdz)) / det;
1088#ifndef GPUCA_ALIGPUCODE
1089 LOGP(warning,
"Negative chi2={}, Cluster: {} {} {} Dy:{} Dz:{} | sdd:{} sdz:{} szz:{} det:{}", chi2, cov[0], cov[1], cov[2], d,
z, sdd, sdz, szz, det);
1090 LOGP(warning,
"Track: {}",
asString());
1097template <
typename value_T>
1101 auto sdd =
static_cast<double>(getSigmaY2()) +
static_cast<double>(cov[0]);
1102 auto sdz =
static_cast<double>(getSigmaZY()) +
static_cast<double>(cov[1]);
1103 auto szz =
static_cast<double>(getSigmaZ2()) +
static_cast<double>(cov[2]);
1104 auto det = sdd * szz - sdz * sdz;
1106 if (gpu::CAMath::Abs(det) < constants::math::Almost0) {
1107 return constants::math::VeryBig;
1113 return (d * (szz * d - sdz *
z) +
z * (sdd *
z - d * sdz)) / det;
1117template <
typename value_T>
1121 return getPredictedChi2(rhs, cov);
1125template <
typename value_T>
1140 LOG(error) <<
"The reference Alpha of the tracks differ: " << this->getAlpha() <<
" : " <<
rhs.getAlpha();
1144 LOG(error) <<
"The reference X of the tracks differ: " << this->
getX() <<
" : " <<
rhs.getX();
1148 buildCombinedCovMatrix(rhs, cov);
1155 double djj = cov(
j,
j);
1156 for (
int k = 0; k <
j; k++) {
1157 djj -= lmat[
j][k] * lmat[k][
j];
1164 double s = cov(
i,
j);
1165 for (
int k = 0; k <
j; k++) {
1166 s -= lmat[
i][k] * lmat[k][
j];
1168 lmat[
i][
j] =
s * dInv[
j];
1176 double s = double(this->getParam(
i)) - double(
rhs.getParam(
i));
1177 for (
int k = 0; k <
i; k++) {
1178 s -= lmat[
i][k] *
y[k];
1181 chi2 +=
s *
s * dInv[
i];
1187template <
typename value_T>
1191 cov(
kY,
kY) =
static_cast<double>(getSigmaY2()) +
static_cast<double>(
rhs.getSigmaY2());
1192 cov(
kZ,
kY) =
static_cast<double>(getSigmaZY()) +
static_cast<double>(
rhs.getSigmaZY());
1193 cov(
kZ,
kZ) =
static_cast<double>(getSigmaZ2()) +
static_cast<double>(
rhs.getSigmaZ2());
1194 cov(
kSnp,
kY) =
static_cast<double>(getSigmaSnpY()) +
static_cast<double>(
rhs.getSigmaSnpY());
1195 cov(
kSnp,
kZ) =
static_cast<double>(getSigmaSnpZ()) +
static_cast<double>(
rhs.getSigmaSnpZ());
1196 cov(
kSnp,
kSnp) =
static_cast<double>(getSigmaSnp2()) +
static_cast<double>(
rhs.getSigmaSnp2());
1197 cov(
kTgl,
kY) =
static_cast<double>(getSigmaTglY()) +
static_cast<double>(
rhs.getSigmaTglY());
1198 cov(
kTgl,
kZ) =
static_cast<double>(getSigmaTglZ()) +
static_cast<double>(
rhs.getSigmaTglZ());
1199 cov(
kTgl,
kSnp) =
static_cast<double>(getSigmaTglSnp()) +
static_cast<double>(
rhs.getSigmaTglSnp());
1200 cov(
kTgl,
kTgl) =
static_cast<double>(getSigmaTgl2()) +
static_cast<double>(
rhs.getSigmaTgl2());
1201 cov(
kQ2Pt,
kY) =
static_cast<double>(getSigma1PtY()) +
static_cast<double>(
rhs.getSigma1PtY());
1202 cov(
kQ2Pt,
kZ) =
static_cast<double>(getSigma1PtZ()) +
static_cast<double>(
rhs.getSigma1PtZ());
1203 cov(
kQ2Pt,
kSnp) =
static_cast<double>(getSigma1PtSnp()) +
static_cast<double>(
rhs.getSigma1PtSnp());
1204 cov(
kQ2Pt,
kTgl) =
static_cast<double>(getSigma1PtTgl()) +
static_cast<double>(
rhs.getSigma1PtTgl());
1205 cov(
kQ2Pt,
kQ2Pt) =
static_cast<double>(getSigma1Pt2()) +
static_cast<double>(
rhs.getSigma1Pt2());
1209template <
typename value_T>
1216 LOG(error) <<
"The reference Alpha of the tracks differ: " << this->getAlpha() <<
" : " <<
rhs.getAlpha();
1220 LOG(error) <<
"The reference X of the tracks differ: " << this->
getX() <<
" : " <<
rhs.getX();
1223 buildCombinedCovMatrix(rhs, covToSet);
1224 if (!covToSet.Invert()) {
1225 LOG(warning) <<
"Cov.matrix inversion failed: " << covToSet;
1228 double chi2diag = 0., chi2ndiag = 0., diff[
kNParams];
1230 diff[
i] = this->getParam(
i) -
rhs.getParam(
i);
1231 chi2diag += diff[
i] * diff[
i] * covToSet(
i,
i);
1234 for (
int j =
i;
j--;) {
1235 chi2ndiag += diff[
i] * diff[
j] * covToSet(
i,
j);
1238 return chi2diag + 2. * chi2ndiag;
1242template <
typename value_T>
1249 LOG(error) <<
"The reference Alpha of the tracks differ: " << this->getAlpha() <<
" : " <<
rhs.getAlpha();
1253 LOG(error) <<
"The reference X of the tracks differ: " << this->
getX() <<
" : " <<
rhs.getX();
1259 matC0(
kY,
kY) = getSigmaY2();
1260 matC0(
kZ,
kY) = getSigmaZY();
1261 matC0(
kZ,
kZ) = getSigmaZ2();
1262 matC0(
kSnp,
kY) = getSigmaSnpY();
1263 matC0(
kSnp,
kZ) = getSigmaSnpZ();
1264 matC0(
kSnp,
kSnp) = getSigmaSnp2();
1265 matC0(
kTgl,
kY) = getSigmaTglY();
1266 matC0(
kTgl,
kZ) = getSigmaTglZ();
1267 matC0(
kTgl,
kSnp) = getSigmaTglSnp();
1268 matC0(
kTgl,
kTgl) = getSigmaTgl2();
1269 matC0(
kQ2Pt,
kY) = getSigma1PtY();
1270 matC0(
kQ2Pt,
kZ) = getSigma1PtZ();
1274 MatrixD5 matK = matC0 * covInv;
1280 diff[
i] =
rhs.getParam(
i) - this->getParam(
i);
1284 this->updateParam(matK(
i,
j) * diff[
j],
i);
1310template <
typename value_T>
1315 buildCombinedCovMatrix(rhs, covI);
1316 if (!covI.Invert()) {
1317 LOG(warning) <<
"Cov.matrix inversion failed: " << covI;
1320 return update(rhs, covI);
1324template <
typename value_T>
1336 double r00 =
static_cast<double>(cov[0]) +
static_cast<double>(cm00);
1337 double r01 =
static_cast<double>(cov[1]) +
static_cast<double>(cm10);
1338 double r11 =
static_cast<double>(cov[2]) +
static_cast<double>(cm11);
1339 double det = r00 * r11 - r01 * r01;
1341 if (gpu::CAMath::Abs(det) < constants::math::Almost0) {
1344 double detI = 1. / det;
1350 double k00 = cm00 * r00 + cm10 * r01, k01 = cm00 * r01 + cm10 * r11;
1351 double k10 = cm10 * r00 + cm11 * r01, k11 = cm10 * r01 + cm11 * r11;
1352 double k20 = cm20 * r00 + cm21 * r01, k21 = cm20 * r01 + cm21 * r11;
1353 double k30 = cm30 * r00 + cm31 * r01, k31 = cm30 * r01 + cm31 * r11;
1354 double k40 = cm40 * r00 + cm41 * r01, k41 = cm40 * r01 + cm41 * r11;
1357 value_t dsnp = k20 * dy + k21 * dz;
1358 if (gpu::CAMath::Abs(this->getSnp() + dsnp) > constants::math::Almost1) {
1363 value_t(k40 * dy + k41 * dz)};
1364 this->updateParams(dP);
1366 double c01 = cm10, c02 = cm20, c03 = cm30, c04 = cm40;
1367 double c12 = cm21, c13 = cm31, c14 = cm41;
1369 cm00 -= k00 * cm00 + k01 * cm10;
1370 cm10 -= k00 * c01 + k01 * cm11;
1371 cm20 -= k00 * c02 + k01 * c12;
1372 cm30 -= k00 * c03 + k01 * c13;
1373 cm40 -= k00 * c04 + k01 * c14;
1375 cm11 -= k10 * c01 + k11 * cm11;
1376 cm21 -= k10 * c02 + k11 * c12;
1377 cm31 -= k10 * c03 + k11 * c13;
1378 cm41 -= k10 * c04 + k11 * c14;
1380 cm22 -= k20 * c02 + k21 * c12;
1381 cm32 -= k20 * c03 + k21 * c13;
1382 cm42 -= k20 * c04 + k21 * c14;
1384 cm33 -= k30 * c03 + k31 * c13;
1385 cm43 -= k30 * c04 + k31 * c14;
1387 cm44 -= k40 * c04 + k41 * c14;
1395template <
typename value_T>
1400 auto vtLoc = this->getVertexInTrackFrame(vtx);
1401 value_T chi2 = getPredictedChi2(vtLoc.yz, vtLoc.yzerr);
1402 return chi2 < maxChi2 && update(vtLoc.yz, vtLoc.yzerr) ? chi2 : -chi2;
1406template <
typename value_T>
1418 constexpr value_t kMSConst2 = 0.0136f * 0.0136f;
1419 constexpr value_t kMinP = 0.01f;
1421 value_t csp2 = (1.f - this->getSnp()) * (1.f + this->getSnp());
1422 value_t cst2I = (1.f + this->getTgl() * this->getTgl());
1428 auto m = this->getPID().getMass();
1429 int charge2 = this->getAbsCharge() * this->getAbsCharge();
1430 value_t p = this->getP(),
p0 =
p, p02 =
p *
p, e2 = p02 + this->getPID().getMass2(), massInv = 1.f /
m,
bg =
p * massInv, dETot = 0.f;
1431 value_t e = gpu::CAMath::Sqrt(e2), e0 = e;
1432 if (
m > 0 && xrho != 0.f) {
1434#ifdef _BB_NONCONST_CORR_
1441 int na = this->nELossSteps(dE, ekin);
1445#ifdef _BB_NONCONST_CORR_
1446 dedxDer = this->getBetheBlochSolidDerivativeApprox(dedx1,
bg);
1453#ifdef _BB_NONCONST_CORR_
1454 if (dedxDer != 0.f) {
1458 auto corrC = (gpu::CAMath::Exp(dedxDer) - 1.f) / dedxDer;
1464 p = gpu::CAMath::Sqrt(e * e - this->getPID().getMass2());
1470 dedx = this->getdEdxBBOpt(
bg);
1471#ifdef _BB_NONCONST_CORR_
1472 dedxDer = this->getBetheBlochSolidDerivativeApprox(
dedx,
bg);
1476#ifdef _BB_NONCONST_CORR_
1496 value_t cC22(0.f), cC33(0.f), cC43(0.f), cC44(0.f);
1498 value_t beta2 = p02 / e2, theta2 = kMSConst2 / (
beta2 * p02) * gpu::CAMath::Abs(x2x0);
1499 value_t fp34 = this->getTgl();
1502 fp34 *= this->getCharge2Pt();
1504 if (theta2 > constants::math::PI * constants::math::PI) {
1507 value_t t2c2I = theta2 * cst2I;
1508 cC22 = t2c2I * csp2;
1509 cC33 = t2c2I * cst2I;
1510 cC43 = t2c2I * fp34;
1511 cC44 = theta2 * fp34 * fp34;
1520 constexpr value_t knst = 0.0007f;
1521 value_t sigmadE = knst * gpu::CAMath::Sqrt(gpu::CAMath::Abs(dETot)) * e0 / p02 * this->getCharge2Pt();
1522 cC44 += sigmadE * sigmadE;
1529 this->setQ2Pt(this->getQ2Pt() * p0 / p);
1537template <
typename value_T>
1549 constexpr value_t kMSConst2 = 0.0136f * 0.0136f;
1550 constexpr value_t kMinP = 0.01f;
1552 value_t csp2 = (1.f - linRef.getSnp()) * (1.f + linRef.getSnp());
1553 value_t cst2I = (1.f + linRef.getTgl() * linRef.getTgl());
1559 auto pid = linRef.getPID();
1560 auto m =
pid.getMass();
1561 int charge2 = linRef.getAbsCharge() * linRef.getAbsCharge();
1562 value_t p = linRef.getP(),
p0 =
p, p02 =
p *
p, e2 = p02 +
pid.getMass2(), massInv = 1.f /
m,
bg =
p * massInv, dETot = 0.f;
1563 value_t e = gpu::CAMath::Sqrt(e2), e0 = e;
1564 if (
m > 0 && xrho != 0.f) {
1566#ifdef _BB_NONCONST_CORR_
1573 int na = this->nELossSteps(dE, ekin);
1577#ifdef _BB_NONCONST_CORR_
1578 dedxDer = this->getBetheBlochSolidDerivativeApprox(dedx1,
bg);
1585#ifdef _BB_NONCONST_CORR_
1586 if (dedxDer != 0.f) {
1590 auto corrC = (gpu::CAMath::Exp(dedxDer) - 1.f) / dedxDer;
1596 p = gpu::CAMath::Sqrt(e * e -
pid.getMass2());
1602 dedx = this->getdEdxBBOpt(
bg);
1603#ifdef _BB_NONCONST_CORR_
1604 dedxDer = this->getBetheBlochSolidDerivativeApprox(
dedx,
bg);
1608#ifdef _BB_NONCONST_CORR_
1628 value_t cC22(0.f), cC33(0.f), cC43(0.f), cC44(0.f);
1630 value_t beta2 = p02 / e2, theta2 = kMSConst2 / (
beta2 * p02) * gpu::CAMath::Abs(x2x0);
1631 value_t fp34 = linRef.getTgl();
1634 fp34 *= linRef.getCharge2Pt();
1636 if (theta2 > constants::math::PI * constants::math::PI) {
1639 value_t t2c2I = theta2 * cst2I;
1640 cC22 = t2c2I * csp2;
1641 cC33 = t2c2I * cst2I;
1642 cC43 = t2c2I * fp34;
1643 cC44 = theta2 * fp34 * fp34;
1652 constexpr value_t knst = 0.0007f;
1653 value_t sigmadE = knst * gpu::CAMath::Sqrt(gpu::CAMath::Abs(dETot)) * e0 / p02 * linRef.getCharge2Pt();
1654 cC44 += sigmadE * sigmadE;
1661 auto pscale =
p0 /
p;
1662 linRef.setQ2Pt(linRef.getQ2Pt() * pscale);
1663 this->setQ2Pt(this->getQ2Pt() * pscale);
1671template <
typename value_T>
1686 if (gpu::CAMath::Abs(this->getQ2Pt()) <= constants::math::Almost0 || gpu::CAMath::Abs(this->getSnp()) > constants::math::Almost1) {
1687 for (
int i = 0;
i < 21;
i++) {
1693 const value_t pt = this->getPt();
1694 const value_t q2pt = this->getQ2Pt();
1696 o2::math_utils::detail::sincos(this->getAlpha(), sn, cs);
1697 const value_t snp = this->getSnp();
1698 const value_t csp = gpu::CAMath::Sqrt((1.f - snp) * (1.f + snp));
1699 const value_t pXLoc = pt * csp;
1700 const value_t pYLoc = pt * snp;
1701 const value_t pZ = pt * this->getTgl();
1702 const value_t pX = cs * pXLoc - sn * pYLoc;
1703 const value_t pY = sn * pXLoc + cs * pYLoc;
1707 for (
int j = 0;
j <=
i; ++
j) {
1708 cTr[
i][
j] = cTr[
j][
i] = mC[CovarMap[
i][
j]];
1712 double jac[6][5] = {};
1717 const value_t dPxDSnp = -pt * (cs * snp / csp + sn);
1718 const value_t dPyDSnp = pt * (cs - sn * snp / csp);
1719 jac[3][
kSnp] = dPxDSnp;
1720 jac[4][
kSnp] = dPyDSnp;
1723 jac[3][
kQ2Pt] = -pX / q2pt;
1724 jac[4][
kQ2Pt] = -pY / q2pt;
1725 jac[5][
kQ2Pt] = -pZ / q2pt;
1728 for (
int i = 0;
i < 6; ++
i) {
1729 for (
int j = 0;
j <=
i; ++
j) {
1731 for (
int k = 0; k <
kNParams; ++k) {
1732 for (
int l = 0; l <
kNParams; ++l) {
1733 cij += jac[
i][k] * cTr[k][l] * jac[
j][l];
1743#ifndef GPUCA_ALIGPUCODE
1745template <
typename value_T>
1749 fmt::format(
" Cov: [{:+.3e}] [{:+.3e} {:+.3e}] [{:+.3e} {:+.3e} {:+.3e}] [{:+.3e} {:+.3e} {:+.3e} {:+.3e}] [{:+.3e} {:+.3e} {:+.3e} {:+.3e} {:+.3e}]",
1755template <
typename value_T>
1759 fmt::format(
" Cov: [{:x}] [{:x} {:x}] [{:x} {:x} {:x}] [{:x} {:x} {:x} {:x}] [{:x} {:x} {:x} {:x} {:x}]",
1760 reinterpret_cast<const unsigned int&
>(mC[
kSigY2]),
reinterpret_cast<const unsigned int&
>(mC[
kSigZY]),
reinterpret_cast<const unsigned int&
>(mC[
kSigZ2]),
1761 reinterpret_cast<const unsigned int&
>(mC[
kSigSnpY]),
reinterpret_cast<const unsigned int&
>(mC[
kSigSnpZ]),
reinterpret_cast<const unsigned int&
>(mC[
kSigSnp2]),
1762 reinterpret_cast<const unsigned int&
>(mC[
kSigTglY]),
reinterpret_cast<const unsigned int&
>(mC[
kSigTglZ]),
reinterpret_cast<const unsigned int&
>(mC[
kSigTglSnp]),
1763 reinterpret_cast<const unsigned int&
>(mC[
kSigTgl2]),
reinterpret_cast<const unsigned int&
>(mC[
kSigQ2PtY]),
reinterpret_cast<const unsigned int&
>(mC[
kSigQ2PtZ]),
1764 reinterpret_cast<const unsigned int&
>(mC[
kSigQ2PtSnp]),
reinterpret_cast<const unsigned int&
>(mC[
kSigQ2PtTgl]),
reinterpret_cast<const unsigned int&
>(mC[
kSigQ2Pt2]));
1769template <
typename value_T>
1773#ifndef GPUCA_ALIGPUCODE
1774 printf(
"%s\n",
asString().c_str());
1775#elif !defined(GPUCA_GPUCODE_DEVICE) || (!defined(__OPENCL__) && defined(GPUCA_GPU_DEBUG_PRINT))
1778 " Cov: [%+.3e] [%+.3e %+.3e] [%+.3e %+.3e %+.3e] [%+.3e %+.3e %+.3e %+.3e] [%+.3e %+.3e %+.3e %+.3e %+.3e]\n",
1786template <
typename value_T>
1790#ifndef GPUCA_ALIGPUCODE
1791 printf(
"%s\n", asStringHexadecimal().c_str());
1792#elif !defined(GPUCA_GPUCODE_DEVICE) || (!defined(__OPENCL__) && defined(GPUCA_GPU_DEBUG_PRINT))
1795 " Cov: [%x] [%x %x] [%x %x %x] [%x %x %x %x] [%x %x %x %x %x]\n",
1796 gpu::CAMath::Float2UIntReint(mC[
kSigY2]),
1797 gpu::CAMath::Float2UIntReint(mC[
kSigZY]), gpu::CAMath::Float2UIntReint(mC[
kSigZ2]),
1798 gpu::CAMath::Float2UIntReint(mC[
kSigSnpY]), gpu::CAMath::Float2UIntReint(mC[
kSigSnpZ]), gpu::CAMath::Float2UIntReint(mC[
kSigSnp2]),
1799 gpu::CAMath::Float2UIntReint(mC[
kSigTglY]), gpu::CAMath::Float2UIntReint(mC[
kSigTglZ]), gpu::CAMath::Float2UIntReint(mC[
kSigTglSnp]), gpu::CAMath::Float2UIntReint(mC[
kSigTgl2]),
1804#ifndef GPUCA_ALIGPUCODE
1806template <
typename value_T>
1809 auto p = this->getXYZGlo();
1813 t.
setPhi(this->getPhi());
1821 value_T csa, sna, csP, snP, csp = gpu::CAMath::Sqrt((1. - this->getSnp()) * (1. + this->getSnp()));
1822 math_utils::detail::sincos(value_T(this->getAlpha()), sna, csa);
1823 math_utils::detail::sincos(value_T(t.
getPhi()), snP, csP);
1832 auto tgLI = 1 / this->getTgl();
1833 const value_T d1 = -sna;
1834 const value_T
d2 = -csP * tgLI;
1835 const value_T e1 = csa;
1836 const value_T e2 = -snP * tgLI;
1837 const value_T
f1 = 1 / csp;
1839 C(0, 0) = d1 * d1 * getSigmaY2() + 2 * d1 *
d2 * getSigmaZY() +
d2 *
d2 * getSigmaZ2();
1840 C(0, 1) = d1 * e1 * getSigmaY2() + (d1 * e2 +
d2 * e1) * getSigmaZY() +
d2 * e2 * getSigmaZ2();
1841 C(1, 1) = e1 * e1 * getSigmaY2() + 2 * e1 * e2 * getSigmaZY() + e2 * e2 * getSigmaZ2();
1843 C(0, 2) =
f1 * (d1 * getSigmaSnpY() +
d2 * getSigmaSnpZ());
1844 C(1, 2) =
f1 * (e1 * getSigmaSnpY() + e2 * getSigmaSnpZ());
1845 C(2, 2) =
f1 *
f1 * getSigmaSnp2();
1847 C(0, 3) = d1 * getSigmaTglY() +
d2 * getSigmaTglZ();
1848 C(1, 3) = e1 * getSigmaTglY() + e2 * getSigmaTglZ();
1849 C(2, 3) =
f1 * getSigmaTglSnp();
1850 C(3, 3) = getSigmaTgl2();
1852 C(0, 4) = d1 * getSigma1PtY() +
d2 * getSigma1PtZ();
1853 C(1, 4) = e1 * getSigma1PtY() + e2 * getSigma1PtZ();
1854 C(2, 4) =
f1 * getSigma1PtSnp();
1855 C(3, 4) = getSigma1PtTgl();
1856 C(4, 4) = getSigma1Pt2();
1864#if !defined(GPUCA_GPUCODE) || defined(GPUCA_GPUCODE_DEVICE)
1867#ifndef GPUCA_GPUCODE
std::string asString(TDataMember const &dm, char *pointer)
Base forward track model, params only, w/o covariance.
void setCovariances(const SMatrix55Sym &covariances)
void setTanl(Double_t tanl)
void setInvQPt(Double_t invqpt)
void setPhi(Double_t phi)
void setZ(Double_t z)
set Z coordinate (cm)
bool toFwdTrackParCov(TrackParCovFwd &t) const
std::string asString() const
std::string asStringHexadecimal()
std::string asStringHexadecimal()
std::string asString() const
GLfloat GLfloat GLfloat alpha
GLboolean GLboolean GLboolean b
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
GLubyte GLubyte GLubyte GLubyte w
GLdouble GLdouble GLdouble z
typename trackParam_t::params_t params_t
typename trackParam_t::dim3_t dim3_t
typename trackParam_t::value_t value_t
const TrackingFrameInfo *const const Cluster *const const float const float bz
D const SVectorGPU< T, D > & rhs
double * getX(double *xyDxy, int N)
double * getY(double *xyDxy, int N)
constexpr float kCTgl2max
constexpr int kCovMatSize
constexpr float kCSnp2max
constexpr int kLabCovMatSize
constexpr float DefaultDCACov
value_T std::array< value_T, 7 > & vect
GPUd() value_T BetheBlochSolid(value_T bg
constexpr float kC1Pt2max
constexpr float DefaultDCA
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
std::vector< o2::mch::ChannelCode > cc
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"