17#include "GPUParam.inc"
25#ifdef GPUCA_COMPRESSION_TRACK_MODEL_MERGER
28 mProp.SetMaterialTPC();
30 mProp.SetToyMCEventsFlag(
false);
31 mProp.SetSeedingErrors(
true);
32 mProp.SetFitInProjections(
true);
33 mProp.SetPropagateBzOnly(
true);
34 mProp.SetPolynomialField(&
param.polynomialField);
40 mTrk.QPt() = (qPt - 127.f) * (20.f / 127.f);
41 mTrk.ResetCovariance();
42 mProp.SetTrack(&mTrk,
alpha);
49 int32_t
retVal = mProp.PropagateToXAlpha(
x,
alpha,
true);
56 mTrk.ConstrainSinPhi();
57 int32_t
retVal = mProp.Update(
y,
z, iRow, *mParam, 0, 0,
nullptr,
false,
false, 0.f);
69#elif defined(GPUCA_COMPRESSION_TRACK_MODEL_SECTORTRACKER)
82 mTrk.SetQPt((qPt - 127.f) * (20.f / 127.f));
101 mTrk.ConstrainSinPhi();
103 GPUTPCTracker::GetErrors2Seeding(*mParam, iRow, mTrk, -1.f, err2Y, err2Z);
121 CAMath::SinCos(
alpha, mSinAlpha, mCosAlpha);
126 mP[4] = (qPt - 127.f) * (20.f / 127.f);
129 mBz =
param.bzCLight;
130 float pti = CAMath::Abs(mP[4]);
137 mTrk.q = (mP[4] >= 0) ? 1.f : -1.f;
143 mTrk.qpt = mTrk.q * pti;
144 calculateMaterialCorrection();
156 if (CAMath::Abs(
alpha - mAlpha) > 1.e-4f) {
157 if (rotateToAlpha(
alpha) != 0) {
161 if (CAMath::Abs(
x - mX) < 1.e-7f) {
167 PhysicalTrackModel t0e(mTrk);
169 if (CAMath::Abs(
x - t0e.x) < 1.e-8f) {
172 if (propagateToXBzLightNoUpdate(t0e,
x, mBz, dLp)) {
175 updatePhysicalTrackValues(t0e);
176 if (CAMath::Abs(t0e.sinphi) >=
MaxSinPhi) {
179 return followLinearization(t0e, mBz, dLp);
186 getClusterErrors2(iRow,
z, mTrk.sinphi, mTrk.dzds, err2Y, err2Z);
205 const float d00 = mC[0], d01 = mC[1], d02 = mC[3], d03 = mC[6], d04 = mC[10];
206 const float d10 = mC[1], d11 = mC[2], d12 = mC[4], d13 = mC[7], d14 = mC[11];
208 const float z0 =
y - mP[0];
209 const float z1 =
z - mP[1];
212 w0 = 1.f / (err2Y + d00);
214 w2 = 1.f / (err2Z + d11);
216 w0 = d11 + err2Z, w1 = d10, w2 = d00 + err2Y;
218 float det = w0 * w2 - w1 * w1;
219 if (CAMath::Abs(det) < 1.e-10f) {
231 const float k00 = d00 * w0;
232 const float k20 = d02 * w0;
233 const float k40 = d04 * w0;
234 const float k11 = d11 * w2;
235 const float k31 = d13 * w2;
252 const float k00 = d00 * w0 + d01 * w1;
253 const float k01 = d00 * w1 + d10 * w2;
254 const float k10 = d01 * w0 + d11 * w1;
255 const float k11 = d01 * w1 + d11 * w2;
256 const float k20 = d02 * w0 + d12 * w1;
257 const float k21 = d02 * w1 + d12 * w2;
258 const float k30 = d03 * w0 + d13 * w1;
259 const float k31 = d03 * w1 + d13 * w2;
260 const float k40 = d04 * w0 + d14 * w1;
261 const float k41 = d04 * w1 + d14 * w2;
263 mP[0] += k00 * z0 + k01 *
z1;
264 mP[1] += k10 * z0 + k11 *
z1;
265 mP[2] += k20 * z0 + k21 *
z1;
266 mP[3] += k30 * z0 + k31 *
z1;
267 mP[4] += k40 * z0 + k41 *
z1;
269 mC[0] -= k00 * d00 + k01 * d10;
271 mC[2] -= k10 * d01 + k11 * d11;
273 mC[3] -= k20 * d00 + k21 * d10;
274 mC[5] -= k20 * d02 + k21 * d12;
276 mC[7] -= k30 * d01 + k31 * d11;
277 mC[9] -= k30 * d03 + k31 * d13;
279 mC[10] -= k40 * d00 + k41 * d10;
280 mC[12] -= k40 * d02 + k41 * d12;
281 mC[14] -= k40 * d04 + k41 * d14;
283 mC[1] -= k10 * d00 + k11 * d10;
284 mC[4] -= k20 * d01 + k21 * d11;
285 mC[6] -= k30 * d00 + k31 * d10;
286 mC[8] -= k30 * d02 + k31 * d12;
287 mC[11] -= k40 * d01 + k41 * d11;
288 mC[13] -= k40 * d03 + k41 * d13;
295 float dy = -2.f * mTrk.q * mTrk.px / mBz;
299 float sa = -mTrk.cosphi;
306 const float k2 = 1.f / 6.f;
307 const float k4 = 3.f / 40.f;
309 dS = chord + chord * sa2 * (k2 + k4 * sa2);
313 if (mTrk.sinphi < 0.f) {
317 mTrk.
y = mTrk.y + 2.f * dy;
318 mTrk.z = mTrk.z + 2.f * mTrk.dzds * dS;
323 float dL = CAMath::Copysign(dS * mTrk.dlds, -1.f);
325 float& mC40 = mC[10];
326 float& mC41 = mC[11];
327 float& mC42 = mC[12];
328 float& mC43 = mC[13];
329 float& mC44 = mC[14];
332 bool maskMS = (CAMath::Abs(dL) < mMaterial.DLMax);
336 float dLabs = CAMath::Abs(dLmask);
337 float corr = 1.f - mMaterial.EP2 * dLmask;
339 float corrInv = 1.f / corr;
353 mC44 = mC44 * corr * corr + dLabs * mMaterial.sigmadE2;
361 if (CAMath::Abs(px) < 1.e-4f) {
362 px = CAMath::Copysign(1.e-4f, px);
365 trk.pt = CAMath::Sqrt(px * px + trk.py * trk.py);
366 float pti = 1.f / trk.pt;
367 trk.p = CAMath::Sqrt(px * px + trk.py * trk.py + trk.pz * trk.pz);
368 trk.sinphi = trk.py * pti;
369 trk.cosphi = px * pti;
370 trk.secphi = trk.pt / px;
371 trk.dzds = trk.pz * pti;
372 trk.dlds = trk.p * pti;
373 trk.qpt = trk.q * pti;
381 mTrk.sinphi = -mTrk.sinphi;
382 mTrk.dzds = -mTrk.dzds;
383 mTrk.qpt = -mTrk.qpt;
384 updatePhysicalTrackValues(mTrk);
401 float newCosAlpha = 0, newSinAlpha = 0;
402 CAMath::SinCos(newAlpha, newSinAlpha, newCosAlpha);
404 float cc = newCosAlpha * mCosAlpha + newSinAlpha * mSinAlpha;
405 float ss = newSinAlpha * mCosAlpha - newCosAlpha * mSinAlpha;
407 PhysicalTrackModel
t0 = mTrk;
419 float px1 = px0 *
cc + py0 * ss;
420 float py1 = -px0 * ss + py0 *
cc;
427 updatePhysicalTrackValues(
t0);
435 float trackX =
x0 *
cc + ss * mP[0];
439 if (propagateToXBzLightNoUpdate(
t0, trackX, mBz, dLp)) {
442 updatePhysicalTrackValues(
t0);
461 float j1 = px1 / px0;
467 mP[0] = -
x0 * ss +
cc * mP[0];
469 mP[2] = -CAMath::Sqrt(1.f - mP[2] * mP[2]) * ss + mP[2] *
cc;
474 float c15 =
c[0] * j0 * j2;
475 float c16 =
c[1] * j2;
476 float c17 =
c[3] * j1 * j2;
477 float c18 =
c[6] * j2;
478 float c19 =
c[10] * j2;
479 float c20 =
c[0] * j2 * j2;
489 if (setDirectionAlongX(
t0)) {
506 float j3 = -
t0.py /
t0.px;
507 float j4 = -
t0.pz /
t0.px;
508 float j5 =
t0.qpt * mBz;
517 float h15 = c15 + c20 * j3;
518 float h16 = c16 + c20 * j4;
519 float h17 = c17 + c20 * j5;
521 c[0] += j3 * (c15 + h15);
523 c[2] += j4 * (c16 + h16);
525 c[3] += c17 * j3 + h15 * j5;
526 c[5] += j5 * (c17 + h17);
536 mCosAlpha = newCosAlpha;
537 mSinAlpha = newSinAlpha;
553 float pt2 = t.px * t.px + t.py * t.py;
555 float pye = t.py - dx *
b;
556 float pxe2 = pt2 - pye * pye;
561 float pxe = CAMath::Sqrt(pxe2);
562 float pti = 1.f / CAMath::Sqrt(pt2);
564 float ty = (t.py + pye) / (t.px + pxe);
568 float chord = dx * CAMath::Sqrt(1.f + ty * ty);
569 float sa = 0.5f * chord *
b * pti;
576 const float k2 = 1.f / 6.f;
577 const float k4 = 3.f / 40.f;
579 dS = chord + chord * sa2 * (k2 + k4 * sa2);
585 float dz = t.pz * dLp;
609 updatePhysicalTrackValues(t);
619 float dS = dLp * t0e.pt;
620 float dL = CAMath::Abs(dLp * t0e.p);
624 float ey = mTrk.sinphi;
625 float ex = mTrk.cosphi;
626 float exi = mTrk.secphi;
627 float ey1 = t0e.sinphi;
628 float ex1 = t0e.cosphi;
629 float ex1i = t0e.secphi;
631 float k = -mTrk.qpt * Bz;
632 float dx = t0e.x - mTrk.x;
635 float cci = 1.f /
cc;
637 float dxcci = dx * cci;
638 float hh = dxcci * ex1i * (1.f + ex * ex1 + ey * ey1);
640 float j02 = exi * hh;
641 float j04 = -Bz * dxcci * hh;
643 float j24 = -dx * Bz;
647 float d0 = p[0] - mTrk.y;
648 float d1 = p[1] - mTrk.z;
649 float d2 = p[2] - mTrk.sinphi;
650 float d3 = p[3] - mTrk.dzds;
651 float d4 = p[4] - mTrk.qpt;
653 float newSinPhi = ey1 +
d2 + j24 * d4;
654 if (mNDF >= 15 && CAMath::Abs(newSinPhi) >
MaxSinPhi) {
660 p[0] = t0e.y + d0 + j02 *
d2 + j04 * d4;
661 p[1] = t0e.z + d1 + j13 * d3;
663 p[3] = t0e.dzds + d3;
684 float c20ph04c42 = c20 + j04 * c42;
685 float j02c22 = j02 * c22;
686 float j04c44 = j04 * c44;
688 float n6 = c30 + j02 * c32 + j04 * c43;
689 float n7 = c31 + j13 * c33;
690 float n10 = c40 + j02 * c42 + j04c44;
691 float n11 = c41 + j13 * c43;
692 float n12 = c42 + j24 * c44;
694 c[0] += j02 * j02c22 + j04 * j04c44 + 2.f * (j02 * c20ph04c42 + j04 * c40);
695 c[1] += j02 * c21 + j04 * c41 + j13 * n6;
696 c[2] += j13 * (c31 + n7);
697 c[3] = c20ph04c42 + j02c22 + j24 * n10;
698 c[4] = c21 + j13 * c32 + j24 * n11;
699 c[5] = c22 + j24 * (c42 + n12);
702 c[8] = c32 + c43 * j24;
713 float xx = 1.f - 0.25f * kdx * kdx * (1.f + tg * tg);
717 xx = CAMath::Sqrt(xx);
718 float yy = CAMath::Sqrt(ss * ss +
cc *
cc);
720 float j12 = dx * mTrk.dzds * tg * (2.f + tg * (ey * exi + ey1 * ex1i)) / (xx * yy);
722 if (CAMath::Abs(mTrk.qpt) > 1.e-6f) {
723 j14 = (2.f * xx * ex1i * dx / yy - dS) * mTrk.dzds / mTrk.qpt;
725 j14 = -mTrk.dzds * Bz * dx * dx * exi * exi * exi * (0.5f * ey + (1.f / 3.f) * kdx * (1 + 2.f * ey * ey) * exi * exi);
728 p[1] += j12 *
d2 + j14 * d4;
730 float h00 = c00 + c20 * j02 + c40 * j04;
732 float h02 = c20 + c22 * j02 + c42 * j04;
734 float h04 = c40 + c42 * j02 + c44 * j04;
736 float h10 = c10 + c20 * j12 + c30 * j13 + c40 * j14;
737 float h11 = c11 + c21 * j12 + c31 * j13 + c41 * j14;
738 float h12 = c21 + c22 * j12 + c32 * j13 + c42 * j14;
739 float h13 = c31 + c32 * j12 + c33 * j13 + c43 * j14;
740 float h14 = c41 + c42 * j12 + c43 * j13 + c44 * j14;
742 float h20 = c20 + c40 * j24;
743 float h21 = c21 + c41 * j24;
744 float h22 = c22 + c42 * j24;
745 float h23 = c32 + c43 * j24;
746 float h24 = c42 + c44 * j24;
748 c[0] = h00 + h02 * j02 + h04 * j04;
750 c[1] = h10 + h12 * j02 + h14 * j04;
751 c[2] = h11 + h12 * j12 + h13 * j13 + h14 * j14;
753 c[3] = h20 + h22 * j02 + h24 * j04;
754 c[4] = h21 + h22 * j12 + h23 * j13 + h24 * j14;
755 c[5] = h22 + h24 * j24;
757 c[6] = c30 + c32 * j02 + c43 * j04;
758 c[7] = c31 + c32 * j12 + c33 * j13 + c43 * j14;
759 c[8] = c32 + c43 * j24;
762 c[10] = c40 + c42 * j02 + c44 * j04;
763 c[11] = c41 + c42 * j12 + c43 * j13 + c44 * j14;
764 c[12] = c42 + c44 * j24;
778 bool maskMS = (CAMath::Abs(dL) < mMaterial.DLMax);
782 float dLabs = CAMath::Abs(dLmask);
787 float corr = 1.f - mMaterial.EP2 * dLmask;
788 float corrInv = 1.f / corr;
802 mC44 = mC44 * corr * corr + dLabs * mMaterial.sigmadE2;
807 mC22 += dLabs * mMaterial.k22 * mTrk.cosphi * mTrk.cosphi;
808 mC33 += dLabs * mMaterial.k33;
809 mC43 += dLabs * mMaterial.k43;
810 mC44 += dLabs * mMaterial.k44;
818 const float mass = 0.13957f;
820 float qpt = mTrk.qpt;
821 if (CAMath::Abs(qpt) > 20) {
825 float w2 = (1.f + mTrk.dzds * mTrk.dzds);
826 float pti2 = qpt * qpt;
831 float mass2 = mass * mass;
832 float beta2 = w2 / (w2 + mass2 * pti2);
834 float p2 = w2 / pti2;
835 float betheRho = approximateBetheBloch(
p2 / mass2) * mMaterial.rho;
836 float E = CAMath::Sqrt(
p2 + mass2);
837 float theta2 = (14.1f * 14.1f / 1.e6f) / (beta2 *
p2) * mMaterial.radLenInv;
839 mMaterial.EP2 = E /
p2;
843 const float knst = 0.07f;
844 mMaterial.sigmadE2 = knst * mMaterial.EP2 * qpt;
845 mMaterial.sigmadE2 = mMaterial.sigmadE2 * mMaterial.sigmadE2;
847 mMaterial.k22 = theta2 * w2;
848 mMaterial.k33 = mMaterial.k22 * w2;
850 mMaterial.k44 = theta2 * mTrk.dzds * mTrk.dzds * pti2;
852 float br = (betheRho > 1.e-8f) ? betheRho : 1.e-8f;
853 mMaterial.DLMax = 0.3f * E / br;
854 mMaterial.EP2 *= betheRho;
855 mMaterial.sigmadE2 = mMaterial.sigmadE2 * betheRho;
866 const float log0 = CAMath::Log(5940.f);
867 const float log1 = CAMath::Log(3.5f * 5940.f);
869 bool bad = (
beta2 >= .999f) || (beta2 < 1.e-8f);
876 float b = 0.5f * CAMath::Log(
a);
877 float d = 0.153e-3f /
beta2;
880 float ret = d * (log0 +
b +
c);
881 float case1 = d * (log1 +
c);
883 if (
a > 3.5f * 3.5f) {
892 int32_t rowType = iRow < 97 ? (iRow < 63 ? 0 : 1) : (iRow < 127 ? 2 : 3);
896 constexpr float tpcLength = 250.f - 0.275f;
897 z = CAMath::Abs(tpcLength - CAMath::Abs(
z));
898 float s2 = sinPhi * sinPhi;
899 if (s2 > 0.95f * 0.95f) {
902 float sec2 = 1.f / (1.f - s2);
903 float angleY2 = s2 * sec2;
904 float angleZ2 = DzDs * DzDs * sec2;
906 const float* cY = mParamErrors0[0][rowType];
907 ErrY2 = cY[0] + cY[1] *
z + cY[2] * angleY2;
910 const float* cZ = mParamErrors0[1][rowType];
911 ErrZ2 = cZ[0] + cZ[1] *
z + cZ[2] * angleZ2;
#define GPUCA_MAX_SIN_PHI
GPUd() void GPUTPCCompressionTrackModel
GLfloat GLfloat GLfloat alpha
GLboolean GLboolean GLboolean b
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat t0
GLboolean GLboolean GLboolean GLboolean a
GLuint GLfloat GLfloat y0
GLdouble GLdouble GLdouble z
constexpr float MaxSinPhi
float float float float z1
std::vector< o2::mch::ChannelCode > cc