21#include "GPUParam.inc"
29 mOrigTrack = sectorTr;
33 mParam.mDzDs = t.GetDzDs();
34 mParam.mSinPhi = t.GetSinPhi();
35 mParam.mQPt = t.GetQPt();
36 mParam.mCosPhi = CAMath::Sqrt(1.f - mParam.mSinPhi * mParam.mSinPhi);
37 mParam.mSecPhi = 1.f / mParam.mCosPhi;
40 mTOffset = merger->GetConstantMem()->calibObjects.fastTransformHelper->getCorrMap()->convZOffsetToVertexTime(sector, t.GetZOffset(), merger->Param().continuousMaxTimeBin);
41 mNClusters = sectorTr->NHits();
46 mOrigTrack = sectorTr;
47 mParam.mX = trk.GetX();
48 mParam.mY = trk.GetY();
49 mParam.mZ = trk.GetZ();
50 mParam.mDzDs = trk.GetDzDs();
51 mParam.mSinPhi = trk.GetSinPhi();
52 mParam.mQPt = trk.GetQPt();
53 mParam.mCosPhi = CAMath::Sqrt(1.f - mParam.mSinPhi * mParam.mSinPhi);
54 mParam.mSecPhi = 1.f / mParam.mCosPhi;
57 mTOffset = trk.GetTOffset();
58 mNClusters = sectorTr->NHits();
59 mParam.mC0 = trk.GetCov(0);
60 mParam.mC2 = trk.GetCov(2);
61 mParam.mC3 = trk.GetCov(3);
62 mParam.mC5 = trk.GetCov(5);
63 mParam.mC7 = trk.GetCov(7);
64 mParam.mC9 = trk.GetCov(9);
65 mParam.mC10 = trk.GetCov(10);
66 mParam.mC12 = trk.GetCov(12);
67 mParam.mC14 = trk.GetCov(14);
72 mParam2.mX = trk.GetX();
73 mParam2.mY = trk.GetY();
74 mParam2.mZ = trk.GetZ();
75 mParam2.mDzDs = trk.GetDzDs();
76 mParam2.mSinPhi = trk.GetSinPhi();
77 mParam2.mQPt = trk.GetQPt();
78 mParam2.mCosPhi = CAMath::Sqrt(1.f - mParam2.mSinPhi * mParam2.mSinPhi);
79 mParam2.mSecPhi = 1.f / mParam2.mCosPhi;
80 mParam2.mC0 = trk.GetCov(0);
81 mParam2.mC2 = trk.GetCov(2);
82 mParam2.mC3 = trk.GetCov(3);
83 mParam2.mC5 = trk.GetCov(5);
84 mParam2.mC7 = trk.GetCov(7);
85 mParam2.mC9 = trk.GetCov(9);
86 mParam2.mC10 = trk.GetCov(10);
87 mParam2.mC12 = trk.GetCov(12);
88 mParam2.mC14 = trk.GetCov(14);
97 const GPUTPCTracker& trk = merger->GetConstantMem()->tpcTrackers[iSector];
98 const GPUTPCHitId& ic = trk.TrackHits()[mOrigTrack->FirstHitID() + mOrigTrack->NHits() - 1];
99 index = trk.Data().ClusterDataIndex(trk.Data().Row(ic.RowIndex()), ic.HitIndex()) + merger->GetConstantMem()->ioPtrs.clustersNative->clusterOffset[iSector][0];
101 const ClusterNative& cl = merger->GetConstantMem()->ioPtrs.clustersNative->clustersLinear[
index];
102 GPUTPCConvertImpl::convert(*merger->GetConstantMem(), iSector,
row, cl.getPad(), cl.getTime(), lastX,
y,
z);
106 float bz = -merger->Param().bzCLight;
108 float k = mParam.mQPt * bz;
109 float dx = (1.f / N) * (lastX - mParam.mX);
111 float dxBz = dx * bz;
112 float kdx205 = 2.f + kdx * kdx * 0.5f;
115 merger->Param().GetClusterErrors2(iSector, 0, mParam.mZ, mParam.mSinPhi, mParam.mDzDs, -1.f, 0.f, 0.f, mParam.mC0, mParam.mC2);
116#ifndef GPUCA_TPC_GEOMETRY_O2
118 merger->Param().GetClusterErrorsSeeding2(iSector, 0, mParam.mZ, mParam.mSinPhi, mParam.mDzDs, -1.f, C0a, C2a);
119 if (C0a > mParam.mC0) {
122 if (C2a > mParam.mC2) {
136 for (int32_t iStep = 0; iStep < N; iStep++) {
140 float ex = mParam.mCosPhi;
141 float ey = mParam.mSinPhi;
142 float ey1 = kdx + ey;
143 if (CAMath::Abs(ey1) > maxSinPhi) {
144 if (ey1 > maxSinPhi && ey1 < maxSinPhi + sinPhiMargin) {
145 ey1 = maxSinPhi - 0.01f;
146 }
else if (ey1 > -maxSinPhi - sinPhiMargin) {
147 ey1 = -maxSinPhi + 0.01f;
154 float ex1 = CAMath::Sqrt(1.f - ey1 * ey1);
157 float dxcci = dx /
cc;
159 float dy = dxcci * ss;
160 float norm2 = 1.f + ey * ey1 + ex * ex1;
161 float dl = dxcci * CAMath::Sqrt(norm2 + norm2);
165 float dSin = 0.5f * k * dl;
166 float a = dSin * dSin;
167 const float k2 = 1.f / 6.f;
168 const float k4 = 3.f / 40.f;
169 dS = dl + dl *
a * (
k2 +
a * (k4));
172 float dz = dS * mParam.mDzDs;
173 float ex1i = 1.f / ex1;
175 merger->Param().GetClusterErrors2(iSector, 0, mParam.mZ, mParam.mSinPhi, mParam.mDzDs, -1.f, 0.f, 0.f, err2Y, err2Z);
176#ifndef GPUCA_TPC_GEOMETRY_O2
178 merger->Param().GetClusterErrorsSeeding2(iSector, 0, mParam.mZ, mParam.mSinPhi, mParam.mDzDs, -1.f, C0a, C2a);
188 float hh = kdx205 * dxcci * ex1i;
189 float h2 = hh * mParam.mSecPhi;
194 mParam.mSinPhi = ey1;
195 mParam.mCosPhi = ex1;
196 mParam.mSecPhi = ex1i;
198 float h4 = bz * dxcci * hh;
200 float c20 = mParam.mC3;
201 float c22 = mParam.mC5;
202 float c31 = mParam.mC7;
203 float c33 = mParam.mC9;
204 float c40 = mParam.mC10;
205 float c42 = mParam.mC12;
206 float c44 = mParam.mC14;
208 float c20ph4c42 = c20 + h4 * c42;
209 float h2c22 = h2 * c22;
210 float h4c44 = h4 * c44;
211 float n7 = c31 + dS * c33;
212 float n10 = c40 + h2 * c42 + h4c44;
213 float n12 = c42 + dxBz * c44;
215 mParam.mC0 += h2 * h2c22 + h4 * h4c44 + 2.f * (h2 * c20ph4c42 + h4 * c40);
217 mParam.mC3 = c20ph4c42 + h2c22 + dxBz * n10;
220 mParam.mC5 = c22 + dxBz * (c42 + n12);
223 mParam.mC2 += dS * (c31 + n7);
229 float c00 = mParam.mC0, c11 = mParam.mC2, c20 = mParam.mC3, c31 = mParam.mC7, c40 = mParam.mC10;
231 float mS0 = 1.f / (err2Y + c00);
232 float mS2 = 1.f / (err2Z + c11);
236 float k00, k11, k20, k31, k40;
242 mParam.mC0 -= k00 * c00;
243 mParam.mC5 -= k20 * c20;
244 mParam.mC10 -= k00 * c40;
245 mParam.mC12 -= k40 * c20;
246 mParam.mC3 -= k20 * c00;
247 mParam.mC14 -= k40 * c40;
252 mParam.mC7 -= k31 * c11;
253 mParam.mC2 -= k11 * c11;
254 mParam.mC9 -= k31 * c31;
259 bool ok = CAMath::Finite(mParam.mX) && CAMath::Finite(mParam.mY) && CAMath::Finite(mParam.mZ) && CAMath::Finite(mParam.mSinPhi) && CAMath::Finite(mParam.mDzDs) && CAMath::Finite(mParam.mQPt) && CAMath::Finite(mParam.mCosPhi) && CAMath::Finite(mParam.mSecPhi) && CAMath::Finite(mTOffset) && CAMath::Finite(mParam.mC0) && CAMath::Finite(mParam.mC2) &&
260 CAMath::Finite(mParam.mC3) && CAMath::Finite(mParam.mC5) && CAMath::Finite(mParam.mC7) && CAMath::Finite(mParam.mC9) && CAMath::Finite(mParam.mC10) && CAMath::Finite(mParam.mC12) && CAMath::Finite(mParam.mC14);
262 if (mParam.mC0 <= 0.f || mParam.mC2 <= 0.f || mParam.mC5 <= 0.f || mParam.mC9 <= 0.f || mParam.mC14 <= 0.f || mParam.mC0 > 5.f || mParam.mC2 > 5.f || mParam.mC5 > 2.f || mParam.mC9 > 2.f) {
267 ok = ok && (mParam.mC3 * mParam.mC3 <= mParam.mC5 * mParam.mC0) && (mParam.mC7 * mParam.mC7 <= mParam.mC9 * mParam.mC2) && (mParam.mC10 * mParam.mC10 <= mParam.mC14 * mParam.mC0) && (mParam.mC12 * mParam.mC12 <= mParam.mC14 * mParam.mC5);
276 if (CAMath::Abs(
x - mParam2.mX) < CAMath::Abs(
x - mParam.mX) && mParam2.mX > 0) {
277 return TransportToX<1>(merger,
x, Bz,
b, maxSinPhi, doCov);
279 return TransportToX<0>(merger,
x, Bz,
b, maxSinPhi, doCov);
286 const auto&
param = I ? mParam2 : mParam;
288 float ex =
param.mCosPhi;
289 float ey =
param.mSinPhi;
290 float k =
param.mQPt * Bz;
292 float ey1 = k * dx + ey;
294 if (CAMath::Abs(ey1) > maxSinPhi) {
298 float ex1 = CAMath::Sqrt(1.f - ey1 * ey1);
299 float dxBz = dx * Bz;
303 float dxcci = dx /
cc;
304 float norm2 = 1.f + ey * ey1 + ex * ex1;
306 float dy = dxcci * ss;
310 float dl = dxcci * CAMath::Sqrt(norm2 + norm2);
311 float dSin = 0.5f * k * dl;
312 float a = dSin * dSin;
313 const float k2 = 1.f / 6.f;
314 const float k4 = 3.f / 40.f;
316 dS = dl + dl *
a * (
k2 +
a * (k4));
319 float dz = dS *
param.mDzDs;
321 b.SetPar(0,
param.mY + dy);
322 b.SetPar(1,
param.mZ + dz);
326 b.SetZOffsetLinear(merger->GetConstantMem()->calibObjects.fastTransformHelper->getCorrMap()->convVertexTimeToZOffset(mSector, mTOffset, merger->Param().continuousMaxTimeBin));
332 float ex1i = 1.f / ex1;
333 float hh = dxcci * ex1i * norm2;
334 float h2 = hh *
param.mSecPhi;
335 float h4 = Bz * dxcci * hh;
337 float c20 =
param.mC3;
338 float c22 =
param.mC5;
339 float c31 =
param.mC7;
340 float c33 =
param.mC9;
341 float c40 =
param.mC10;
342 float c42 =
param.mC12;
343 float c44 =
param.mC14;
345 float c20ph4c42 = c20 + h4 * c42;
346 float h2c22 = h2 * c22;
347 float h4c44 = h4 * c44;
348 float n7 = c31 + dS * c33;
350 if (CAMath::Abs(
param.mQPt) > 6.66f)
352 b.SetCov(0, CAMath::Max(
param.mC0,
param.mC0 + h2 * h2c22 + h4 * h4c44 + 2.f * (h2 * c20ph4c42 + h4 * c40)));
353 float C2tmp = dS * 2.f * c31;
357 b.SetCov(1,
param.mC2 + C2tmp + dS * dS * c33);
359 b.SetCov(0,
param.mC0 + h2 * h2c22 + h4 * h4c44 + 2.f * (h2 * c20ph4c42 + h4 * c40));
360 b.SetCov(1,
param.mC2 + dS * (c31 + n7));
362 b.SetCov(2, c22 + dxBz * (c42 + c42 + dxBz * c44));
365 b.SetCovD(0, c20ph4c42 + h2c22 + dxBz * (c40 + h2 * c42 + h4c44));
380 float c00 = mParam.mC0;
381 float c11 = mParam.mC2;
382 float c20 = mParam.mC3;
383 float c22 = mParam.mC5;
384 float c31 = mParam.mC7;
385 float c33 = mParam.mC9;
386 float c40 = mParam.mC10;
387 float c42 = mParam.mC12;
388 float c44 = mParam.mC14;
392 float sinPhi = mParam.mSinPhi;
393 float cosPhi = mParam.mCosPhi;
394 float secPhi = mParam.mSecPhi;
395 float dzds = mParam.mDzDs;
396 float qpt = mParam.mQPt;
400 float sP = sinPhi, cP = cosPhi;
401 cosPhi = cP * cosAlpha + sP * sinAlpha;
402 sinPhi = -cP * sinAlpha + sP * cosAlpha;
408 secPhi = 1.f / cosPhi;
409 float j0 = cP * secPhi;
410 float j2 = cosPhi / cP;
411 x = mParam.mX * cosAlpha + mParam.mY * sinAlpha;
412 y = -mParam.mX * sinAlpha + mParam.mY * cosAlpha;
436 float ey1 = k * dx + ey;
438 if (CAMath::Abs(ey1) > maxSinPhi) {
442 float ex1 = CAMath::Sqrt(1.f - ey1 * ey1);
444 float dxBz = dx * Bz;
448 float dxcci = dx /
cc;
449 float norm2 = 1.f + ey * ey1 + ex * ex1;
451 float dy = dxcci * ss;
455 float dl = dxcci * CAMath::Sqrt(norm2 + norm2);
456 float dSin = 0.5f * k * dl;
457 float a = dSin * dSin;
458 const float k2 = 1.f / 6.f;
459 const float k4 = 3.f / 40.f;
461 dS = dl + dl *
a * (k2 +
a * (k4));
464 float ex1i = 1.f / ex1;
465 float dz = dS * dzds;
467 float hh = dxcci * ex1i * norm2;
468 float h2 = hh * secPhi;
469 float h4 = Bz * dxcci * hh;
471 float c20ph4c42 = c20 + h4 * c42;
472 float h2c22 = h2 * c22;
473 float h4c44 = h4 * c44;
474 float n7 = c31 + dS * c33;
481 b.SetZOffsetLinear(merger->GetConstantMem()->calibObjects.fastTransformHelper->getCorrMap()->convVertexTimeToZOffset(mSector, mTOffset, merger->Param().continuousMaxTimeBin));
483 b.SetCov(0, c00 + h2 * h2c22 + h4 * h4c44 + 2.f * (h2 * c20ph4c42 + h4 * c40));
484 b.SetCov(1, c11 + dS * (c31 + n7));
485 b.SetCov(2, c22 + dxBz * (c42 + c42 + dxBz * c44));
488 b.SetCovD(0, c20ph4c42 + h2c22 + dxBz * (c40 + h2 * c42 + h4c44));
498 const float*
GPUrestrict() cov = mOrigTrack -> Param().mC;
505 mParam.mC10 = cov[10];
506 mParam.mC12 = cov[12];
507 mParam.mC14 = cov[14];
#define GPUCA_MAX_SIN_PHI
GLfloat GLfloat GLfloat alpha
GLboolean GLboolean GLboolean b
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
GLboolean GLboolean GLboolean GLboolean a
GLdouble GLdouble GLdouble z
Global TPC definitions and constants.
std::vector< o2::mch::ChannelCode > cc