18#ifndef GPUCA_GPUCODE_DEVICE
22#ifndef GPUCA_ALIGPUCODE
23#include <fmt/printf.h>
30template <
typename value_T>
45template <
typename value_T>
52 if (gpu::CAMath::Abs(dx) < constants::math::Almost0) {
55 value_t crv = this->getCurvature(bz);
58 if ((gpu::CAMath::Abs(
f1) > constants::math::Almost1) || (gpu::CAMath::Abs(
f2) > constants::math::Almost1)) {
61 value_t r1 = gpu::CAMath::Sqrt((1.f -
f1) * (1.f +
f1));
62 if (gpu::CAMath::Abs(r1) < constants::math::Almost0) {
65 value_t r2 = gpu::CAMath::Sqrt((1.f -
f2) * (1.f +
f2));
66 if (gpu::CAMath::Abs(r2) < constants::math::Almost0) {
69 double r1pr2Inv = 1. / (r1 + r2);
70 double dy2dx = (
f1 +
f2) * r1pr2Inv;
71 bool arcz = gpu::CAMath::Abs(x2r) > 0.05f;
82 auto arg = r1 *
f2 - r2 *
f1;
83 if (gpu::CAMath::Abs(arg) > constants::math::Almost1) {
86 value_t rot = gpu::CAMath::ASin(arg);
89 rot = constants::math::PI - rot;
91 rot = -constants::math::PI - rot;
94 dP[
kZ] = this->getTgl() / crv * rot;
96 dP[
kZ] = dx * (r2 +
f2 * dy2dx) * this->getTgl();
102 this->updateParams(dP);
110 value_t kb = bz * constants::math::B2C;
111 double r2inv = 1. / r2, r1inv = 1. / r1;
112 double dx2r1pr2 = dx * r1pr2Inv;
114 double hh = dx2r1pr2 * r2inv * (1. + r1 * r2 +
f1 *
f2), jj = dx * (dy2dx -
f2 * r2inv);
115 double f02 = hh * r1inv;
116 double f04 = hh * dx2r1pr2 * kb;
117 double f24 = dx * kb;
118 double f12 = this->getTgl() * (f02 *
f2 + jj);
119 double f13 = dx * (r2 +
f2 * dy2dx);
120 double f14 = this->getTgl() * (f04 *
f2 + jj * f24);
123 double b00 = f02 * c20 + f04 * c40, b01 = f12 * c20 + f14 * c40 + f13 * c30;
124 double b02 = f24 * c40;
125 double b10 = f02 * c21 + f04 * c41, b11 = f12 * c21 + f14 * c41 + f13 * c31;
126 double b12 = f24 * c41;
127 double b20 = f02 * c22 + f04 * c42, b21 = f12 * c22 + f14 * c42 + f13 * c32;
128 double b22 = f24 * c42;
129 double b40 = f02 * c42 + f04 * c44, b41 = f12 * c42 + f14 * c44 + f13 * c43;
130 double b42 = f24 * c44;
131 double b30 = f02 * c32 + f04 * c43, b31 = f12 * c32 + f14 * c43 + f13 * c33;
132 double b32 = f24 * c43;
135 double a00 = f02 * b20 + f04 * b40, a01 = f02 * b21 + f04 * b41, a02 = f02 * b22 + f04 * b42;
136 double a11 = f12 * b21 + f14 * b41 + f13 * b31, a12 = f12 * b22 + f14 * b42 + f13 * b32;
137 double a22 = f24 * b42;
140 c00 += b00 + b00 + a00;
141 c10 += b10 + b01 + a01;
142 c20 += b20 + b02 + a02;
145 c11 += b11 + b11 + a11;
146 c21 += b21 + b12 + a12;
149 c22 += b22 + b22 + a22;
159template <
typename value_T>
165 if (this->getAbsCharge() == 0) {
169 if (gpu::CAMath::Abs(dx) < constants::math::Almost0) {
176 if (!linRef1.propagateTo(xk, bz)) {
179 value_t kb = bz * constants::math::B2C;
181 double snpRef0 = linRef0.getSnp(), cspRef0 = gpu::CAMath::Sqrt((1 - snpRef0) * (1 + snpRef0));
182 double snpRef1 = linRef1.getSnp(), cspRef1 = gpu::CAMath::Sqrt((1 - snpRef1) * (1 + snpRef1));
183 double cspRef0Inv = 1 / cspRef0, cspRef1Inv = 1 / cspRef1,
cc = cspRef0 + cspRef1, ccInv = 1 /
cc, dy2dx = (snpRef0 + snpRef1) * ccInv;
184 double dxccInv = dx * ccInv, hh = dxccInv * cspRef1Inv * (1 + cspRef0 * cspRef1 + snpRef0 * snpRef1), jj = dx * (dy2dx - snpRef1 * cspRef1Inv);
186 double f02 = hh * cspRef0Inv;
187 double f04 = hh * dxccInv * kb;
188 double f24 = dx * kb;
189 double f12 = linRef0.getTgl() * (f02 * snpRef1 + jj);
190 double f13 = dx * (cspRef1 + snpRef1 * dy2dx);
191 double f14 = linRef0.getTgl() * (f04 * snpRef1 + jj * f24);
195 for (
int i = 0;
i < 5;
i++) {
196 diff[
i] = this->getParam(
i) - linRef0.getParam(
i);
199 if (gpu::CAMath::Abs(snpUpd) > constants::math::Almost1) {
204 this->setY(linRef1.getY() + diff[
kY] + f02 * diff[
kSnp] + f04 * diff[
kQ2Pt]);
205 this->setZ(linRef1.getZ() + diff[
kZ] + f13 * diff[
kTgl] + f14 * diff[
kQ2Pt]);
206 this->setSnp(snpUpd);
207 this->setTgl(linRef1.getTgl() + diff[
kTgl]);
208 this->setQ2Pt(linRef1.getQ2Pt() + diff[
kQ2Pt]);
216 double b00 = f02 * c20 + f04 * c40, b01 = f12 * c20 + f14 * c40 + f13 * c30;
217 double b02 = f24 * c40;
218 double b10 = f02 * c21 + f04 * c41, b11 = f12 * c21 + f14 * c41 + f13 * c31;
219 double b12 = f24 * c41;
220 double b20 = f02 * c22 + f04 * c42, b21 = f12 * c22 + f14 * c42 + f13 * c32;
221 double b22 = f24 * c42;
222 double b40 = f02 * c42 + f04 * c44, b41 = f12 * c42 + f14 * c44 + f13 * c43;
223 double b42 = f24 * c44;
224 double b30 = f02 * c32 + f04 * c43, b31 = f12 * c32 + f14 * c43 + f13 * c33;
225 double b32 = f24 * c43;
228 double a00 = f02 * b20 + f04 * b40, a01 = f02 * b21 + f04 * b41, a02 = f02 * b22 + f04 * b42;
229 double a11 = f12 * b21 + f14 * b41 + f13 * b31, a12 = f12 * b22 + f14 * b42 + f13 * b32;
230 double a22 = f24 * b42;
233 c00 += b00 + b00 + a00;
234 c10 += b10 + b01 + a01;
235 c20 += b20 + b02 + a02;
238 c11 += b11 + b11 + a11;
239 c21 += b21 + b12 + a12;
242 c22 += b22 + b22 + a22;
252template <
typename value_T>
260template <
typename value_T>
264 if (gpu::CAMath::Abs(this->getSnp()) > constants::math::Almost1) {
265 LOGP(
debug,
"Precondition is not satisfied: |sin(phi)|>1 ! {:f}", this->getSnp());
269 math_utils::detail::bringToPMPi<value_t>(
alpha);
272 math_utils::detail::sincos(
alpha - this->getAlpha(), sa, ca);
273 value_t snp = this->getSnp(), csp = gpu::CAMath::Sqrt((1.f - snp) * (1.f + snp));
276 if ((csp * ca + snp * sa) < 0) {
282 value_t updSnp = snp * ca - csp * sa;
283 if (gpu::CAMath::Abs(updSnp) > constants::math::Almost1) {
284 LOGP(
debug,
"Rotation failed: new snp {:.2f}", updSnp);
288 this->setAlpha(
alpha);
289 this->setX(xold * ca + yold * sa);
290 this->setY(-xold * sa + yold * ca);
291 this->setSnp(updSnp);
293 if (gpu::CAMath::Abs(csp) < constants::math::Almost0) {
294 LOGP(
debug,
"Too small cosine value {:f}", csp);
295 csp = constants::math::Almost0;
315template <
typename value_T>
320 if (gpu::CAMath::Abs(this->getSnp()) > constants::math::Almost1) {
321 LOGP(
debug,
"Precondition is not satisfied: |sin(phi)|>1 ! {:f}", this->getSnp());
325 math_utils::detail::bringToPMPi<value_t>(
alpha);
330 if (!linRef1.rotateParam(
alpha, ca, sa)) {
335 if (!linRef1.propagateParamTo(trackX, bz)) {
340 value_t snp = this->getSnp(), csp = gpu::CAMath::Sqrt((1.f - snp) * (1.f + snp)), updSnp = snp * ca - csp * sa;
341 if ((csp * ca + snp * sa) < 0 || gpu::CAMath::Abs(updSnp) > constants::math::Almost1) {
345 this->setY(-sa * this->
getX() + ca * this->
getY());
347 this->setSnp(updSnp);
348 this->setAlpha(
alpha);
351 value_t snpRef0 = linRef0.getSnp(), cspRef0 = gpu::CAMath::Sqrt((
value_t(1) - snpRef0) * (
value_t(1) + snpRef0));
352 value_t snpRef1 = linRef1.getSnp(), cspRef1 = ca * cspRef0 + sa * snpRef0;
375 auto cspRef1Inv =
value_t(1) / cspRef1;
376 auto j3 = -snpRef1 * cspRef1Inv;
377 auto j4 = -linRef1.getTgl() * cspRef1Inv;
378 auto j5 = linRef1.getCurvature(bz);
385 auto hXSigY = cXSigY + cSigX2 * j3;
386 auto hXSigZ = cXSigZ + cSigX2 * j4;
387 auto hXSigSnp = cXSigSnp + cSigX2 * j5;
389 mC[
kSigY2] += j3 * (cXSigY + hXSigY);
390 mC[
kSigZ2] += j4 * (cXSigZ + hXSigZ);
391 mC[
kSigSnpY] += cXSigSnp * j3 + hXSigY * j5;
392 mC[
kSigSnp2] += j5 * (cXSigSnp + hXSigSnp);
397 mC[
kSigZY] += cXSigZ * j3 + hXSigY * j4;
398 mC[
kSigSnpZ] += cXSigSnp * j4 + hXSigZ * j5;
410template <
typename value_T>
414 value_t sn, cs, alp = this->getAlpha();
415 o2::math_utils::detail::sincos(alp, sn, cs);
416 value_t x = this->
getX(),
y = this->
getY(), snp = this->getSnp(), csp = gpu::CAMath::Sqrt((1.f - snp) * (1.f + snp));
417 value_t xv = vtx.getX() * cs + vtx.getY() * sn, yv = -vtx.getX() * sn + vtx.getY() * cs, zv = vtx.getZ();
421 value_t d = gpu::CAMath::Abs(
x * snp -
y * csp);
429 value_t crv = this->getCurvature(
b);
430 value_t tgfv = -(crv *
x - snp) / (crv *
y + csp);
431 sn = tgfv / gpu::CAMath::Sqrt(1.f + tgfv * tgfv);
432 cs = gpu::CAMath::Sqrt((1.f - sn) * (1.f + sn));
433 cs = (gpu::CAMath::Abs(tgfv) > constants::math::Almost0) ? sn / tgfv : constants::math::
Almost1;
435 x = xv * cs + yv * sn;
436 yv = -xv * sn + yv * cs;
440 alp += gpu::CAMath::ASin(sn);
441 if (!tmpT.rotate(alp) || !tmpT.propagateTo(xv,
b)) {
442#if !defined(GPUCA_ALIGPUCODE)
443 LOG(
debug) <<
"failed to propagate to alpha=" << alp <<
" X=" << xv << vtx <<
" | Track is: " << tmpT.asString();
453 o2::math_utils::detail::sincos(alp, sn, cs);
454 auto s2ylocvtx = vtx.getSigmaX2() * sn * sn + vtx.getSigmaY2() * cs * cs - 2. * vtx.getSigmaXY() * cs * sn;
455 dca->set(this->
getY() - yv, this->getZ() - zv, getSigmaY2() + s2ylocvtx, getSigmaZY(), getSigmaZ2() + vtx.getSigmaZ2());
461template <
typename value_T>
470template <
typename value_T>
482 constexpr value_t kSafe = 1e-5f;
483 value_t radPos2 = xyz[0] * xyz[0] + xyz[1] * xyz[1];
485 if (sectorAlpha || radPos2 < 1) {
486 alp = gpu::CAMath::ATan2(pxpypz[1], pxpypz[0]);
488 alp = gpu::CAMath::ATan2(xyz[1], xyz[0]);
491 alp = math_utils::detail::angle2Alpha<value_t>(alp);
495 math_utils::detail::sincos(alp, sn, cs);
497 if (cs * pxpypz[0] + sn * pxpypz[1] < 0) {
498 LOG(
debug) <<
"alpha from phiPos() will invalidate this track parameters, overriding to alpha from phi()";
499 alp = gpu::CAMath::ATan2(pxpypz[1], pxpypz[0]);
501 alp = math_utils::detail::angle2Alpha<value_t>(alp);
503 math_utils::detail::sincos(alp, sn, cs);
506 if (gpu::CAMath::Abs(sn) < 2.f * kSafe) {
508 alp += alp < constants::math::PIHalf ? 2.f * kSafe : -2.f * kSafe;
510 alp += alp > -constants::math::PIHalf ? -2.f * kSafe : 2.f * kSafe;
512 math_utils::detail::sincos(alp, sn, cs);
513 }
else if (gpu::CAMath::Abs(cs) < 2.f * kSafe) {
515 alp += alp > constants::math::PIHalf ? 2.f * kSafe : -2.f * kSafe;
517 alp += alp > -constants::math::PIHalf ? 2.f * kSafe : -2.f * kSafe;
519 math_utils::detail::sincos(alp, sn, cs);
522 dim3_t ver{xyz[0], xyz[1], xyz[2]};
523 dim3_t mom{pxpypz[0], pxpypz[1], pxpypz[2]};
526 math_utils::detail::rotateZ<value_t>(ver, -alp);
527 math_utils::detail::rotateZ<value_t>(mom, -alp);
529 value_t pt = gpu::CAMath::Sqrt(mom[0] * mom[0] + mom[1] * mom[1]);
535 this->setSnp(mom[1] * ptI);
536 this->setTgl(mom[2] * ptI);
537 this->setAbsCharge(gpu::CAMath::Abs(
charge));
541 if (gpu::CAMath::Abs(1.f - this->getSnp()) < kSafe) {
542 this->setSnp(1.f - kSafe);
543 }
else if (gpu::CAMath::Abs(-1.f - this->getSnp()) < kSafe) {
544 this->setSnp(-1.f + kSafe);
549 value_t cv34 = gpu::CAMath::Sqrt(cv[3] * cv[3] + cv[4] * cv[4]);
552 value_t sgcheck =
r * sn + this->getSnp() * cs;
553 if (gpu::CAMath::Abs(sgcheck) > 1 - kSafe) {
555 sgcheck = sgcheck < 0 ? -1.f : 1.f;
556 }
else if (gpu::CAMath::Abs(sgcheck) < kSafe) {
557 sgcheck = cs < 0 ? -1.0f : 1.0f;
561 mC[
kSigY2] = cv[0] + cv[2];
562 mC[
kSigZY] = (-cv[3] * sn) < 0 ? -cv34 : cv34;
566 value_t tgl2 = this->getTgl() * this->getTgl();
569 mC[
kSigSnpZ] = -sgcheck * cv[8] *
r * ptI;
570 mC[
kSigSnp2] = gpu::CAMath::Abs(cv[9] *
r *
r * ptI2);
571 mC[
kSigTglY] = (cv[10] * this->getTgl() - sgcheck * cv[15]) * ptI /
r;
572 mC[
kSigTglZ] = (cv[17] - sgcheck * cv[12] * this->getTgl()) * ptI;
573 mC[
kSigTglSnp] = (-sgcheck * cv[18] + cv[13] * this->getTgl()) *
r * ptI2;
574 mC[
kSigTgl2] = gpu::CAMath::Abs(cv[20] - 2 * sgcheck * cv[19] * mC[4] + cv[14] * tgl2) * ptI2;
578 mC[
kSigQ2PtTgl] = (-sgcheck * cv[19] + cv[14] * this->getTgl()) *
r * ptI2 * ptI;
579 mC[
kSigQ2Pt2] = gpu::CAMath::Abs(cv[14] * ptI2 * ptI2);
580 }
else if (special == 2) {
581 mC[
kSigSnpY] = -cv[10] * ptI * cs / sn;
583 mC[
kSigSnp2] = gpu::CAMath::Abs(cv[14] * cs * cs * ptI2);
584 mC[
kSigTglY] = (sgcheck * cv[6] * this->getTgl() - cv[15]) * ptI / sn;
585 mC[
kSigTglZ] = (cv[17] - sgcheck * cv[8] * this->getTgl()) * ptI;
586 mC[
kSigTglSnp] = (cv[19] - sgcheck * cv[13] * this->getTgl()) * cs * ptI2;
587 mC[
kSigTgl2] = gpu::CAMath::Abs(cv[20] - 2 * sgcheck * cv[18] * this->getTgl() + cv[9] * tgl2) * ptI2;
591 mC[
kSigQ2PtTgl] = (-sgcheck * cv[18] + cv[9] * this->getTgl()) * ptI2 * ptI *
charge;
592 mC[
kSigQ2Pt2] = gpu::CAMath::Abs(cv[9] * ptI2 * ptI2);
595 double m23 = -pt * (sn + this->getSnp() * cs /
r), m43 = -pt * pt * (
r * cs - this->getSnp() * sn);
596 double m24 = pt * (cs - this->getSnp() * sn /
r), m44 = -pt * pt * (
r * sn + this->getSnp() * cs);
597 double m35 = pt, m45 = -pt * pt * this->getTgl();
605 double a1 = cv[13] - cv[9] * (m23 * m44 + m43 * m24) / m23 / m43;
606 double a2 = m23 * m24 - m23 * (m23 * m44 + m43 * m24) / m43;
607 double a3 = m43 * m44 - m43 * (m23 * m44 + m43 * m24) / m23;
608 double a4 = cv[14] + 2. * cv[9];
609 double a5 = m24 * m24 - 2. * m24 * m44 * m23 / m43;
610 double a6 = m44 * m44 - 2. * m24 * m44 * m43 / m23;
612 mC[
kSigSnpY] = (cv[10] * m43 - cv[6] * m44) / (m24 * m43 - m23 * m44) / m00;
615 mC[
kSigSnpZ] = (cv[12] * m43 - cv[8] * m44) / (m24 * m43 - m23 * m44);
618 mC[
kSigSnp2] = gpu::CAMath::Abs((a4 * a3 - a6 * a1) / (a5 * a3 - a6 * a2));
622 double b2 = m23 * m35;
623 double b3 = m43 * m35;
625 double b5 = m24 * m35;
626 double b6 = m44 * m35;
627 mC[
kSigTglSnp] = (b4 - b6 * b1 / b3) / (b5 - b6 * b2 / b3);
635template <
typename value_T>
646 if (gpu::CAMath::Abs(dx) < constants::math::Almost0) {
650 if (gpu::CAMath::Abs(dx) > 1e5 || gpu::CAMath::Abs(this->
getY()) > 1e5 || gpu::CAMath::Abs(this->getZ()) > 1e5) {
651 LOG(warning) <<
"Anomalous track, target X:" << xk;
655 value_t crv = (gpu::CAMath::Abs(
b[2]) < constants::math::Almost0) ? 0.f :
this->getCurvature(
b[2]);
656 if (gpu::CAMath::Abs(crv) < constants::math::Almost0) {
657 return propagateTo(xk, 0.);
661 if ((gpu::CAMath::Abs(
f1) > constants::math::Almost1) || (gpu::CAMath::Abs(
f2) > constants::math::Almost1)) {
664 value_t r1 = gpu::CAMath::Sqrt((1.f -
f1) * (1.f +
f1));
665 if (gpu::CAMath::Abs(r1) < constants::math::Almost0) {
668 value_t r2 = gpu::CAMath::Sqrt((1.f -
f2) * (1.f +
f2));
669 if (gpu::CAMath::Abs(r2) < constants::math::Almost0) {
672 double r1pr2Inv = 1. / (r1 + r2), r2inv = 1. / r2, r1inv = 1. / r1;
673 double dy2dx = (
f1 +
f2) * r1pr2Inv, dx2r1pr2 = dx * r1pr2Inv;
674 value_t step = (gpu::CAMath::Abs(x2r) < 0.05f) ? dx * gpu::CAMath::Abs(r2 +
f2 * dy2dx)
675 : 2.f * gpu::CAMath::ASin(0.5f * dx * gpu::CAMath::Sqrt(1.f + dy2dx * dy2dx) * crv) / crv;
676 step *= gpu::CAMath::Sqrt(1.f + this->getTgl() * this->getTgl());
679 std::array<value_t, 9> vecLab{0.f};
680 if (!this->getPosDirGlo(vecLab)) {
691 value_t kb =
b[2] * constants::math::B2C;
692 double hh = dx2r1pr2 * r2inv * (1. + r1 * r2 +
f1 *
f2), jj = dx * (dy2dx -
f2 * r2inv);
693 double f02 = hh * r1inv;
694 double f04 = hh * dx2r1pr2 * kb;
695 double f24 = dx * kb;
696 double f12 = this->getTgl() * (f02 *
f2 + jj);
697 double f13 = dx * (r2 +
f2 * dy2dx);
698 double f14 = this->getTgl() * (f04 *
f2 + jj * f24);
701 double b00 = f02 * c20 + f04 * c40, b01 = f12 * c20 + f14 * c40 + f13 * c30;
702 double b02 = f24 * c40;
703 double b10 = f02 * c21 + f04 * c41, b11 = f12 * c21 + f14 * c41 + f13 * c31;
704 double b12 = f24 * c41;
705 double b20 = f02 * c22 + f04 * c42, b21 = f12 * c22 + f14 * c42 + f13 * c32;
706 double b22 = f24 * c42;
707 double b40 = f02 * c42 + f04 * c44, b41 = f12 * c42 + f14 * c44 + f13 * c43;
708 double b42 = f24 * c44;
709 double b30 = f02 * c32 + f04 * c43, b31 = f12 * c32 + f14 * c43 + f13 * c33;
710 double b32 = f24 * c43;
713 double a00 = f02 * b20 + f04 * b40, a01 = f02 * b21 + f04 * b41, a02 = f02 * b22 + f04 * b42;
714 double a11 = f12 * b21 + f14 * b41 + f13 * b31, a12 = f12 * b22 + f14 * b42 + f13 * b32;
715 double a22 = f24 * b42;
718 c00 += b00 + b00 + a00;
719 c10 += b10 + b01 + a01;
720 c20 += b20 + b02 + a02;
723 c11 += b11 + b11 + a11;
724 c21 += b21 + b12 + a12;
727 c22 += b22 + b22 + a22;
735 value_t bt = gpu::CAMath::Sqrt(bxy2);
736 value_t cosphi = 1.f, sinphi = 0.f;
737 if (bt > constants::math::Almost0) {
741 value_t bb = gpu::CAMath::Sqrt(bxy2 +
b[2] *
b[2]);
742 value_t costet = 1., sintet = 0.;
743 if (
bb > constants::math::Almost0) {
747 std::array<value_t, 7>
vect{costet * cosphi * vecLab[0] + costet * sinphi * vecLab[1] - sintet * vecLab[2],
748 -sinphi * vecLab[0] + cosphi * vecLab[1],
749 sintet * cosphi * vecLab[0] + sintet * sinphi * vecLab[1] + costet * vecLab[2],
750 costet * cosphi * vecLab[3] + costet * sinphi * vecLab[4] - sintet * vecLab[5],
751 -sinphi * vecLab[3] + cosphi * vecLab[4],
752 sintet * cosphi * vecLab[3] + sintet * sinphi * vecLab[4] + costet * vecLab[5],
760 vecLab[0] = cosphi * costet *
vect[0] - sinphi *
vect[1] + cosphi * sintet *
vect[2];
761 vecLab[1] = sinphi * costet *
vect[0] + cosphi *
vect[1] + sinphi * sintet *
vect[2];
762 vecLab[2] = -sintet *
vect[0] + costet *
vect[2];
764 vecLab[3] = cosphi * costet *
vect[3] - sinphi *
vect[4] + cosphi * sintet *
vect[5];
765 vecLab[4] = sinphi * costet *
vect[3] + cosphi *
vect[4] + sinphi * sintet *
vect[5];
766 vecLab[5] = -sintet *
vect[3] + costet *
vect[5];
769 value_t sinalp = -vecLab[7], cosalp = vecLab[8];
770 value_t t = cosalp * vecLab[0] - sinalp * vecLab[1];
771 vecLab[1] = sinalp * vecLab[0] + cosalp * vecLab[1];
773 t = cosalp * vecLab[3] - sinalp * vecLab[4];
774 vecLab[4] = sinalp * vecLab[3] + cosalp * vecLab[4];
778 value_t x = vecLab[0],
y = vecLab[1],
z = vecLab[2];
779 if (gpu::CAMath::Abs(dx) > constants::math::Almost0) {
780 if (gpu::CAMath::Abs(vecLab[3]) < constants::math::Almost0) {
785 y += vecLab[4] / vecLab[3] * dx;
786 z += vecLab[5] / vecLab[3] * dx;
790 t = 1.f / gpu::CAMath::Sqrt(vecLab[3] * vecLab[3] + vecLab[4] * vecLab[4]);
794 this->setSnp(vecLab[4] * t);
795 this->setTgl(vecLab[5] * t);
796 this->setQ2Pt(q * t / vecLab[6]);
802template <
typename value_T>
813 if (gpu::CAMath::Abs(dx) < constants::math::Almost0) {
817 if (gpu::CAMath::Abs(dx) > 1e5 || gpu::CAMath::Abs(this->
getY()) > 1e5 || gpu::CAMath::Abs(this->getZ()) > 1e5) {
818 LOG(warning) <<
"Anomalous track, target X:" << xk;
822 if (gpu::CAMath::Abs(dx) < constants::math::Almost0) {
828 value_t crv = (gpu::CAMath::Abs(
b[2]) < constants::math::Almost0) ? 0.f : linRef0.getCurvature(
b[2]);
829 if (gpu::CAMath::Abs(crv) < constants::math::Almost0) {
830 return propagateTo(xk, linRef0, 0.);
832 value_t kb =
b[2] * constants::math::B2C, x2r = crv * dx;
834 value_t snpRef0 = linRef0.getSnp(), snpRef1 = snpRef0 + x2r;
835 if ((gpu::CAMath::Abs(snpRef0) > constants::math::Almost1) || (gpu::CAMath::Abs(snpRef1) > constants::math::Almost1)) {
838 value_t cspRef0 = gpu::CAMath::Sqrt((1 - snpRef0) * (1 + snpRef0)), cspRef1 = gpu::CAMath::Sqrt((1 - snpRef1) * (1 + snpRef1));
839 if (gpu::CAMath::Abs(cspRef0) < constants::math::Almost0 || gpu::CAMath::Abs(cspRef1) < constants::math::Almost0) {
842 value_t cspRef0Inv =
value_t(1) / cspRef0, cspRef1Inv =
value_t(1) / cspRef1,
cc = cspRef0 + cspRef1, ccInv =
value_t(1) /
cc, dy2dx = (snpRef0 + snpRef1) * ccInv;
843 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;
844 step *= gpu::CAMath::Sqrt(1.f + linRef0.getTgl() * linRef0.getTgl());
848 std::array<value_t, 9> vecLab{0.f};
849 if (!linRef0.getPosDirGlo(vecLab)) {
855 value_t bt = gpu::CAMath::Sqrt(bxy2);
856 value_t cosphi = 1.f, sinphi = 0.f;
857 if (bt > constants::math::Almost0) {
861 value_t bb = gpu::CAMath::Sqrt(bxy2 +
b[2] *
b[2]);
862 value_t costet = 1., sintet = 0.;
863 if (
bb > constants::math::Almost0) {
867 std::array<value_t, 7>
vect{costet * cosphi * vecLab[0] + costet * sinphi * vecLab[1] - sintet * vecLab[2],
868 -sinphi * vecLab[0] + cosphi * vecLab[1],
869 sintet * cosphi * vecLab[0] + sintet * sinphi * vecLab[1] + costet * vecLab[2],
870 costet * cosphi * vecLab[3] + costet * sinphi * vecLab[4] - sintet * vecLab[5],
871 -sinphi * vecLab[3] + cosphi * vecLab[4],
872 sintet * cosphi * vecLab[3] + sintet * sinphi * vecLab[4] + costet * vecLab[5],
880 vecLab[0] = cosphi * costet *
vect[0] - sinphi *
vect[1] + cosphi * sintet *
vect[2];
881 vecLab[1] = sinphi * costet *
vect[0] + cosphi *
vect[1] + sinphi * sintet *
vect[2];
882 vecLab[2] = -sintet *
vect[0] + costet *
vect[2];
884 vecLab[3] = cosphi * costet *
vect[3] - sinphi *
vect[4] + cosphi * sintet *
vect[5];
885 vecLab[4] = sinphi * costet *
vect[3] + cosphi *
vect[4] + sinphi * sintet *
vect[5];
886 vecLab[5] = -sintet *
vect[3] + costet *
vect[5];
889 value_t sinalp = -vecLab[7], cosalp = vecLab[8];
890 value_t t = cosalp * vecLab[0] - sinalp * vecLab[1];
891 vecLab[1] = sinalp * vecLab[0] + cosalp * vecLab[1];
893 t = cosalp * vecLab[3] - sinalp * vecLab[4];
894 vecLab[4] = sinalp * vecLab[3] + cosalp * vecLab[4];
898 value_t x = vecLab[0],
y = vecLab[1],
z = vecLab[2];
899 if (gpu::CAMath::Abs(dx) > constants::math::Almost0) {
900 if (gpu::CAMath::Abs(vecLab[3]) < constants::math::Almost0) {
903 auto dxFin = xk - vecLab[0];
905 y += vecLab[4] / vecLab[3] * dxFin;
906 z += vecLab[5] / vecLab[3] * dxFin;
910 auto linRef1 = linRef0;
911 t = 1.f / gpu::CAMath::Sqrt(vecLab[3] * vecLab[3] + vecLab[4] * vecLab[4]);
915 linRef1.setSnp(snpRef1 = vecLab[4] * t);
916 linRef1.setTgl(vecLab[5] * t);
917 linRef1.setQ2Pt(q * t / vecLab[6]);
920 cspRef1 = gpu::CAMath::Sqrt((1 - snpRef1) * (1 + snpRef1));
921 cspRef1Inv =
value_t(1) / cspRef1;
922 cc = cspRef0 + cspRef1;
924 dy2dx = (snpRef0 + snpRef1) * ccInv;
925 double dxccInv = dx * ccInv, hh = dxccInv * cspRef1Inv * (1 + cspRef0 * cspRef1 + snpRef0 * snpRef1), jj = dx * (dy2dx - snpRef1 * cspRef1Inv);
926 double f02 = hh * cspRef0Inv;
927 double f04 = hh * dxccInv * kb;
928 double f24 = dx * kb;
929 double f12 = linRef0.getTgl() * (f02 * snpRef1 + jj);
930 double f13 = dx * (cspRef1 + snpRef1 * dy2dx);
931 double f14 = linRef0.getTgl() * (f04 * snpRef1 + jj * f24);
935 for (
int i = 0;
i < 5;
i++) {
936 diff[
i] = this->getParam(
i) - linRef0.getParam(
i);
939 if (gpu::CAMath::Abs(snpUpd) > constants::math::Almost1) {
943 this->setY(linRef1.getY() + diff[
kY] + f02 * diff[
kSnp] + f04 * diff[
kQ2Pt]);
944 this->setZ(linRef1.getZ() + diff[
kZ] + f13 * diff[
kTgl] + f14 * diff[
kQ2Pt]);
945 this->setSnp(snpUpd);
946 this->setTgl(linRef1.getTgl() + diff[
kTgl]);
947 this->setQ2Pt(linRef1.getQ2Pt() + diff[
kQ2Pt]);
958 double b00 = f02 * c20 + f04 * c40, b01 = f12 * c20 + f14 * c40 + f13 * c30;
959 double b02 = f24 * c40;
960 double b10 = f02 * c21 + f04 * c41, b11 = f12 * c21 + f14 * c41 + f13 * c31;
961 double b12 = f24 * c41;
962 double b20 = f02 * c22 + f04 * c42, b21 = f12 * c22 + f14 * c42 + f13 * c32;
963 double b22 = f24 * c42;
964 double b40 = f02 * c42 + f04 * c44, b41 = f12 * c42 + f14 * c44 + f13 * c43;
965 double b42 = f24 * c44;
966 double b30 = f02 * c32 + f04 * c43, b31 = f12 * c32 + f14 * c43 + f13 * c33;
967 double b32 = f24 * c43;
970 double a00 = f02 * b20 + f04 * b40, a01 = f02 * b21 + f04 * b41, a02 = f02 * b22 + f04 * b42;
971 double a11 = f12 * b21 + f14 * b41 + f13 * b31, a12 = f12 * b22 + f14 * b42 + f13 * b32;
972 double a22 = f24 * b42;
975 c00 += b00 + b00 + a00;
976 c10 += b10 + b01 + a01;
977 c20 += b20 + b02 + a02;
980 c11 += b11 + b11 + a11;
981 c21 += b21 + b12 + a12;
984 c22 += b22 + b22 + a22;
994template <
typename value_T>
998 constexpr float MaxCorr = 0.99;
1000 for (
int j =
i;
j--;) {
1001 auto sig2 = mC[DiagMap[
i]] * mC[DiagMap[
j]];
1002 auto& cov = mC[CovarMap[
i][
j]];
1003 if (cov * cov >= MaxCorr * sig2) {
1004 cov = gpu::CAMath::Sqrt(sig2) * (cov > 0. ? MaxCorr : -MaxCorr);
1011template <
typename value_T>
1066template <
typename value_T>
1071 if (s2 > constants::math::Almost0) {
1072 d0 = getSigmaY2() * s2;
1073 d1 = getSigmaZ2() * s2;
1074 d2 = getSigmaSnp2() * s2;
1075 d3 = getSigmaTgl2() * s2;
1076 d4 = getSigma1Pt2() * s2;
1104template <
typename value_T>
1108 auto sdd =
static_cast<double>(getSigmaY2()) +
static_cast<double>(cov[0]);
1109 auto sdz =
static_cast<double>(getSigmaZY()) +
static_cast<double>(cov[1]);
1110 auto szz =
static_cast<double>(getSigmaZ2()) +
static_cast<double>(cov[2]);
1111 auto det = sdd * szz - sdz * sdz;
1113 if (gpu::CAMath::Abs(det) < constants::math::Almost0) {
1114 return constants::math::VeryBig;
1119 auto chi2 = (d * (szz * d - sdz *
z) +
z * (sdd *
z - d * sdz)) / det;
1121#ifndef GPUCA_ALIGPUCODE
1122 LOGP(warning,
"Negative chi2={}, Cluster: {} {} {} Dy:{} Dz:{} | sdd:{} sdz:{} szz:{} det:{}", chi2, cov[0], cov[1], cov[2], d,
z, sdd, sdz, szz, det);
1123 LOGP(warning,
"Track: {}",
asString());
1130template <
typename value_T>
1134 auto sdd =
static_cast<double>(getSigmaY2()) +
static_cast<double>(cov[0]);
1135 auto sdz =
static_cast<double>(getSigmaZY()) +
static_cast<double>(cov[1]);
1136 auto szz =
static_cast<double>(getSigmaZ2()) +
static_cast<double>(cov[2]);
1137 auto det = sdd * szz - sdz * sdz;
1139 if (gpu::CAMath::Abs(det) < constants::math::Almost0) {
1140 return constants::math::VeryBig;
1146 return (d * (szz * d - sdz *
z) +
z * (sdd *
z - d * sdz)) / det;
1150template <
typename value_T>
1154 return getPredictedChi2(rhs, cov);
1158template <
typename value_T>
1162 cov(
kY,
kY) =
static_cast<double>(getSigmaY2()) +
static_cast<double>(
rhs.getSigmaY2());
1163 cov(
kZ,
kY) =
static_cast<double>(getSigmaZY()) +
static_cast<double>(
rhs.getSigmaZY());
1164 cov(
kZ,
kZ) =
static_cast<double>(getSigmaZ2()) +
static_cast<double>(
rhs.getSigmaZ2());
1165 cov(
kSnp,
kY) =
static_cast<double>(getSigmaSnpY()) +
static_cast<double>(
rhs.getSigmaSnpY());
1166 cov(
kSnp,
kZ) =
static_cast<double>(getSigmaSnpZ()) +
static_cast<double>(
rhs.getSigmaSnpZ());
1167 cov(
kSnp,
kSnp) =
static_cast<double>(getSigmaSnp2()) +
static_cast<double>(
rhs.getSigmaSnp2());
1168 cov(
kTgl,
kY) =
static_cast<double>(getSigmaTglY()) +
static_cast<double>(
rhs.getSigmaTglY());
1169 cov(
kTgl,
kZ) =
static_cast<double>(getSigmaTglZ()) +
static_cast<double>(
rhs.getSigmaTglZ());
1170 cov(
kTgl,
kSnp) =
static_cast<double>(getSigmaTglSnp()) +
static_cast<double>(
rhs.getSigmaTglSnp());
1171 cov(
kTgl,
kTgl) =
static_cast<double>(getSigmaTgl2()) +
static_cast<double>(
rhs.getSigmaTgl2());
1172 cov(
kQ2Pt,
kY) =
static_cast<double>(getSigma1PtY()) +
static_cast<double>(
rhs.getSigma1PtY());
1173 cov(
kQ2Pt,
kZ) =
static_cast<double>(getSigma1PtZ()) +
static_cast<double>(
rhs.getSigma1PtZ());
1174 cov(
kQ2Pt,
kSnp) =
static_cast<double>(getSigma1PtSnp()) +
static_cast<double>(
rhs.getSigma1PtSnp());
1175 cov(
kQ2Pt,
kTgl) =
static_cast<double>(getSigma1PtTgl()) +
static_cast<double>(
rhs.getSigma1PtTgl());
1176 cov(
kQ2Pt,
kQ2Pt) =
static_cast<double>(getSigma1Pt2()) +
static_cast<double>(
rhs.getSigma1Pt2());
1180template <
typename value_T>
1187 LOG(error) <<
"The reference Alpha of the tracks differ: " << this->getAlpha() <<
" : " <<
rhs.getAlpha();
1191 LOG(error) <<
"The reference X of the tracks differ: " << this->
getX() <<
" : " <<
rhs.getX();
1194 buildCombinedCovMatrix(rhs, covToSet);
1195 if (!covToSet.Invert()) {
1196 LOG(warning) <<
"Cov.matrix inversion failed: " << covToSet;
1199 double chi2diag = 0., chi2ndiag = 0., diff[
kNParams];
1201 diff[
i] = this->getParam(
i) -
rhs.getParam(
i);
1202 chi2diag += diff[
i] * diff[
i] * covToSet(
i,
i);
1205 for (
int j =
i;
j--;) {
1206 chi2ndiag += diff[
i] * diff[
j] * covToSet(
i,
j);
1209 return chi2diag + 2. * chi2ndiag;
1213template <
typename value_T>
1220 LOG(error) <<
"The reference Alpha of the tracks differ: " << this->getAlpha() <<
" : " <<
rhs.getAlpha();
1224 LOG(error) <<
"The reference X of the tracks differ: " << this->
getX() <<
" : " <<
rhs.getX();
1230 matC0(
kY,
kY) = getSigmaY2();
1231 matC0(
kZ,
kY) = getSigmaZY();
1232 matC0(
kZ,
kZ) = getSigmaZ2();
1233 matC0(
kSnp,
kY) = getSigmaSnpY();
1234 matC0(
kSnp,
kZ) = getSigmaSnpZ();
1235 matC0(
kSnp,
kSnp) = getSigmaSnp2();
1236 matC0(
kTgl,
kY) = getSigmaTglY();
1237 matC0(
kTgl,
kZ) = getSigmaTglZ();
1238 matC0(
kTgl,
kSnp) = getSigmaTglSnp();
1239 matC0(
kTgl,
kTgl) = getSigmaTgl2();
1240 matC0(
kQ2Pt,
kY) = getSigma1PtY();
1241 matC0(
kQ2Pt,
kZ) = getSigma1PtZ();
1245 MatrixD5 matK = matC0 * covInv;
1251 diff[
i] =
rhs.getParam(
i) - this->getParam(
i);
1255 this->updateParam(matK(
i,
j) * diff[
j],
i);
1281template <
typename value_T>
1286 buildCombinedCovMatrix(rhs, covI);
1287 if (!covI.Invert()) {
1288 LOG(warning) <<
"Cov.matrix inversion failed: " << covI;
1291 return update(rhs, covI);
1295template <
typename value_T>
1307 double r00 =
static_cast<double>(cov[0]) +
static_cast<double>(cm00);
1308 double r01 =
static_cast<double>(cov[1]) +
static_cast<double>(cm10);
1309 double r11 =
static_cast<double>(cov[2]) +
static_cast<double>(cm11);
1310 double det = r00 * r11 - r01 * r01;
1312 if (gpu::CAMath::Abs(det) < constants::math::Almost0) {
1315 double detI = 1. / det;
1321 double k00 = cm00 * r00 + cm10 * r01, k01 = cm00 * r01 + cm10 * r11;
1322 double k10 = cm10 * r00 + cm11 * r01, k11 = cm10 * r01 + cm11 * r11;
1323 double k20 = cm20 * r00 + cm21 * r01, k21 = cm20 * r01 + cm21 * r11;
1324 double k30 = cm30 * r00 + cm31 * r01, k31 = cm30 * r01 + cm31 * r11;
1325 double k40 = cm40 * r00 + cm41 * r01, k41 = cm40 * r01 + cm41 * r11;
1328 value_t dsnp = k20 * dy + k21 * dz;
1329 if (gpu::CAMath::Abs(this->getSnp() + dsnp) > constants::math::Almost1) {
1334 value_t(k40 * dy + k41 * dz)};
1335 this->updateParams(dP);
1337 double c01 = cm10, c02 = cm20, c03 = cm30, c04 = cm40;
1338 double c12 = cm21, c13 = cm31, c14 = cm41;
1340 cm00 -= k00 * cm00 + k01 * cm10;
1341 cm10 -= k00 * c01 + k01 * cm11;
1342 cm20 -= k00 * c02 + k01 * c12;
1343 cm30 -= k00 * c03 + k01 * c13;
1344 cm40 -= k00 * c04 + k01 * c14;
1346 cm11 -= k10 * c01 + k11 * cm11;
1347 cm21 -= k10 * c02 + k11 * c12;
1348 cm31 -= k10 * c03 + k11 * c13;
1349 cm41 -= k10 * c04 + k11 * c14;
1351 cm22 -= k20 * c02 + k21 * c12;
1352 cm32 -= k20 * c03 + k21 * c13;
1353 cm42 -= k20 * c04 + k21 * c14;
1355 cm33 -= k30 * c03 + k31 * c13;
1356 cm43 -= k30 * c04 + k31 * c14;
1358 cm44 -= k40 * c04 + k41 * c14;
1366template <
typename value_T>
1371 auto vtLoc = this->getVertexInTrackFrame(vtx);
1372 value_T chi2 = getPredictedChi2(vtLoc.yz, vtLoc.yzerr);
1373 return chi2 < maxChi2 && update(vtLoc.yz, vtLoc.yzerr) ? chi2 : -chi2;
1377template <
typename value_T>
1389 constexpr value_t kMSConst2 = 0.0136f * 0.0136f;
1390 constexpr value_t kMinP = 0.01f;
1392 value_t csp2 = (1.f - this->getSnp()) * (1.f + this->getSnp());
1393 value_t cst2I = (1.f + this->getTgl() * this->getTgl());
1399 auto m = this->getPID().getMass();
1400 int charge2 = this->getAbsCharge() * this->getAbsCharge();
1401 value_t p = this->getP(),
p0 =
p, p02 =
p *
p, e2 = p02 + this->getPID().getMass2(), massInv = 1. /
m,
bg =
p * massInv, dETot = 0.;
1402 value_t e = gpu::CAMath::Sqrt(e2), e0 = e;
1403 if (
m > 0 && xrho != 0.f) {
1405#ifdef _BB_NONCONST_CORR_
1419#ifdef _BB_NONCONST_CORR_
1420 dedxDer = this->getBetheBlochSolidDerivativeApprox(dedx1,
bg);
1427#ifdef _BB_NONCONST_CORR_
1428 if (dedxDer != 0.) {
1432 auto corrC = (gpu::CAMath::Exp(dedxDer) - 1.) / dedxDer;
1438 p = gpu::CAMath::Sqrt(e * e - this->getPID().getMass2());
1444 dedx = this->getdEdxBBOpt(
bg);
1445#ifdef _BB_NONCONST_CORR_
1446 dedxDer = this->getBetheBlochSolidDerivativeApprox(
dedx,
bg);
1450#ifdef _BB_NONCONST_CORR_
1470 value_t cC22(0.f), cC33(0.f), cC43(0.f), cC44(0.f);
1472 value_t beta2 = p02 / e2, theta2 = kMSConst2 / (
beta2 * p02) * gpu::CAMath::Abs(x2x0);
1473 value_t fp34 = this->getTgl();
1476 fp34 *= this->getCharge2Pt();
1478 if (theta2 > constants::math::PI * constants::math::PI) {
1481 value_t t2c2I = theta2 * cst2I;
1482 cC22 = t2c2I * csp2;
1483 cC33 = t2c2I * cst2I;
1484 cC43 = t2c2I * fp34;
1485 cC44 = theta2 * fp34 * fp34;
1494 constexpr value_t knst = 0.0007f;
1495 value_t sigmadE = knst * gpu::CAMath::Sqrt(gpu::CAMath::Abs(dETot)) * e0 / p02 * this->getCharge2Pt();
1496 cC44 += sigmadE * sigmadE;
1503 this->setQ2Pt(this->getQ2Pt() * p0 / p);
1511template <
typename value_T>
1523 constexpr value_t kMSConst2 = 0.0136f * 0.0136f;
1524 constexpr value_t kMinP = 0.01f;
1526 value_t csp2 = (1.f - linRef.getSnp()) * (1.f + linRef.getSnp());
1527 value_t cst2I = (1.f + linRef.getTgl() * linRef.getTgl());
1533 auto pid = linRef.getPID();
1534 auto m =
pid.getMass();
1535 int charge2 = linRef.getAbsCharge() * linRef.getAbsCharge();
1536 value_t p = linRef.getP(),
p0 =
p, p02 =
p *
p, e2 = p02 +
pid.getMass2(), massInv = 1. /
m,
bg =
p * massInv, dETot = 0.;
1537 value_t e = gpu::CAMath::Sqrt(e2), e0 = e;
1538 if (
m > 0 && xrho != 0.f) {
1540#ifdef _BB_NONCONST_CORR_
1554#ifdef _BB_NONCONST_CORR_
1555 dedxDer = this->getBetheBlochSolidDerivativeApprox(dedx1,
bg);
1562#ifdef _BB_NONCONST_CORR_
1563 if (dedxDer != 0.) {
1567 auto corrC = (gpu::CAMath::Exp(dedxDer) - 1.) / dedxDer;
1573 p = gpu::CAMath::Sqrt(e * e -
pid.getMass2());
1579 dedx = this->getdEdxBBOpt(
bg);
1580#ifdef _BB_NONCONST_CORR_
1581 dedxDer = this->getBetheBlochSolidDerivativeApprox(
dedx,
bg);
1585#ifdef _BB_NONCONST_CORR_
1605 value_t cC22(0.f), cC33(0.f), cC43(0.f), cC44(0.f);
1607 value_t beta2 = p02 / e2, theta2 = kMSConst2 / (
beta2 * p02) * gpu::CAMath::Abs(x2x0);
1608 value_t fp34 = linRef.getTgl();
1611 fp34 *= linRef.getCharge2Pt();
1613 if (theta2 > constants::math::PI * constants::math::PI) {
1616 value_t t2c2I = theta2 * cst2I;
1617 cC22 = t2c2I * csp2;
1618 cC33 = t2c2I * cst2I;
1619 cC43 = t2c2I * fp34;
1620 cC44 = theta2 * fp34 * fp34;
1629 constexpr value_t knst = 0.0007f;
1630 value_t sigmadE = knst * gpu::CAMath::Sqrt(gpu::CAMath::Abs(dETot)) * e0 / p02 * linRef.getCharge2Pt();
1631 cC44 += sigmadE * sigmadE;
1638 auto pscale =
p0 /
p;
1639 linRef.setQ2Pt(linRef.getQ2Pt() * pscale);
1640 this->setQ2Pt(this->getQ2Pt() * pscale);
1648template <
typename value_T>
1663 if (gpu::CAMath::Abs(this->getQ2Pt()) <= constants::math::Almost0 || gpu::CAMath::Abs(this->getSnp()) > constants::math::Almost1) {
1664 for (
int i = 0;
i < 21;
i++) {
1670 auto pt = this->getPt();
1672 o2::math_utils::detail::sincos(this->getAlpha(), sn, cs);
1673 auto r = gpu::CAMath::Sqrt((1. - this->getSnp()) * (1. + this->getSnp()));
1674 auto m00 = -sn, m10 = cs;
1675 auto m23 = -pt * (sn + this->getSnp() * cs /
r), m43 = -pt * pt * (
r * cs - this->getSnp() * sn);
1676 auto m24 = pt * (cs - this->getSnp() * sn /
r), m44 = -pt * pt * (
r * sn + this->getSnp() * cs);
1677 auto m35 = pt, m45 = -pt * pt * this->getTgl();
1679 if (this->getSign() < 0) {
1685 cv[0] = mC[0] * m00 * m00;
1686 cv[1] = mC[0] * m00 * m10;
1687 cv[2] = mC[0] * m10 * m10;
1688 cv[3] = mC[1] * m00;
1689 cv[4] = mC[1] * m10;
1691 cv[6] = m00 * (mC[3] * m23 + mC[10] * m43);
1692 cv[7] = m10 * (mC[3] * m23 + mC[10] * m43);
1693 cv[8] = mC[4] * m23 + mC[11] * m43;
1694 cv[9] = m23 * (mC[5] * m23 + mC[12] * m43) + m43 * (mC[12] * m23 + mC[14] * m43);
1695 cv[10] = m00 * (mC[3] * m24 + mC[10] * m44);
1696 cv[11] = m10 * (mC[3] * m24 + mC[10] * m44);
1697 cv[12] = mC[4] * m24 + mC[11] * m44;
1698 cv[13] = m23 * (mC[5] * m24 + mC[12] * m44) + m43 * (mC[12] * m24 + mC[14] * m44);
1699 cv[14] = m24 * (mC[5] * m24 + mC[12] * m44) + m44 * (mC[12] * m24 + mC[14] * m44);
1700 cv[15] = m00 * (mC[6] * m35 + mC[10] * m45);
1701 cv[16] = m10 * (mC[6] * m35 + mC[10] * m45);
1702 cv[17] = mC[7] * m35 + mC[11] * m45;
1703 cv[18] = m23 * (mC[8] * m35 + mC[12] * m45) + m43 * (mC[13] * m35 + mC[14] * m45);
1704 cv[19] = m24 * (mC[8] * m35 + mC[12] * m45) + m44 * (mC[13] * m35 + mC[14] * m45);
1705 cv[20] = m35 * (mC[9] * m35 + mC[13] * m45) + m45 * (mC[13] * m35 + mC[14] * m45);
1710#ifndef GPUCA_ALIGPUCODE
1712template <
typename value_T>
1716 fmt::format(
" Cov: [{:+.3e}] [{:+.3e} {:+.3e}] [{:+.3e} {:+.3e} {:+.3e}] [{:+.3e} {:+.3e} {:+.3e} {:+.3e}] [{:+.3e} {:+.3e} {:+.3e} {:+.3e} {:+.3e}]",
1722template <
typename value_T>
1726 fmt::format(
" Cov: [{:x}] [{:x} {:x}] [{:x} {:x} {:x}] [{:x} {:x} {:x} {:x}] [{:x} {:x} {:x} {:x} {:x}]",
1727 reinterpret_cast<const unsigned int&
>(mC[
kSigY2]),
reinterpret_cast<const unsigned int&
>(mC[
kSigZY]),
reinterpret_cast<const unsigned int&
>(mC[
kSigZ2]),
1728 reinterpret_cast<const unsigned int&
>(mC[
kSigSnpY]),
reinterpret_cast<const unsigned int&
>(mC[
kSigSnpZ]),
reinterpret_cast<const unsigned int&
>(mC[
kSigSnp2]),
1729 reinterpret_cast<const unsigned int&
>(mC[
kSigTglY]),
reinterpret_cast<const unsigned int&
>(mC[
kSigTglZ]),
reinterpret_cast<const unsigned int&
>(mC[
kSigTglSnp]),
1730 reinterpret_cast<const unsigned int&
>(mC[
kSigTgl2]),
reinterpret_cast<const unsigned int&
>(mC[
kSigQ2PtY]),
reinterpret_cast<const unsigned int&
>(mC[
kSigQ2PtZ]),
1731 reinterpret_cast<const unsigned int&
>(mC[
kSigQ2PtSnp]),
reinterpret_cast<const unsigned int&
>(mC[
kSigQ2PtTgl]),
reinterpret_cast<const unsigned int&
>(mC[
kSigQ2Pt2]));
1736template <
typename value_T>
1740#ifndef GPUCA_ALIGPUCODE
1741 printf(
"%s\n",
asString().c_str());
1742#elif !defined(GPUCA_GPUCODE_DEVICE) || (!defined(__OPENCL__) && defined(GPUCA_GPU_DEBUG_PRINT))
1745 " Cov: [%+.3e] [%+.3e %+.3e] [%+.3e %+.3e %+.3e] [%+.3e %+.3e %+.3e %+.3e] [%+.3e %+.3e %+.3e %+.3e %+.3e]\n",
1753template <
typename value_T>
1757#ifndef GPUCA_ALIGPUCODE
1758 printf(
"%s\n", asStringHexadecimal().c_str());
1759#elif !defined(GPUCA_GPUCODE_DEVICE) || (!defined(__OPENCL__) && defined(GPUCA_GPU_DEBUG_PRINT))
1762 " Cov: [%x] [%x %x] [%x %x %x] [%x %x %x %x] [%x %x %x %x %x]\n",
1763 gpu::CAMath::Float2UIntReint(mC[
kSigY2]),
1764 gpu::CAMath::Float2UIntReint(mC[
kSigZY]), gpu::CAMath::Float2UIntReint(mC[
kSigZ2]),
1765 gpu::CAMath::Float2UIntReint(mC[
kSigSnpY]), gpu::CAMath::Float2UIntReint(mC[
kSigSnpZ]), gpu::CAMath::Float2UIntReint(mC[
kSigSnp2]),
1766 gpu::CAMath::Float2UIntReint(mC[
kSigTglY]), gpu::CAMath::Float2UIntReint(mC[
kSigTglZ]), gpu::CAMath::Float2UIntReint(mC[
kSigTglSnp]), gpu::CAMath::Float2UIntReint(mC[
kSigTgl2]),
1773#if !defined(GPUCA_GPUCODE) || defined(GPUCA_GPUCODE_DEVICE)
1776#ifndef GPUCA_GPUCODE
std::string asString(TDataMember const &dm, char *pointer)
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)
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
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
constexpr int MaxELossIter
constexpr float ELoss2EKinThreshInv
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
Defining DataPointCompositeObject explicitly as copiable.
std::vector< o2::mch::ChannelCode > cc
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"