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 if (merger->Param().par.earlyTpcTransform) {
41 mTZOffset = t.GetZOffset();
43 mTZOffset = merger->GetConstantMem()->calibObjects.fastTransformHelper->getCorrMap()->convZOffsetToVertexTime(sector, t.GetZOffset(), merger->Param().continuousMaxTimeBin);
45 mNClusters = sectorTr->NHits();
50 mOrigTrack = sectorTr;
51 mParam.mX = trk.GetX();
52 mParam.mY = trk.GetY();
53 mParam.mZ = trk.GetZ();
54 mParam.mDzDs = trk.GetDzDs();
55 mParam.mSinPhi = trk.GetSinPhi();
56 mParam.mQPt = trk.GetQPt();
57 mParam.mCosPhi = CAMath::Sqrt(1.f - mParam.mSinPhi * mParam.mSinPhi);
58 mParam.mSecPhi = 1.f / mParam.mCosPhi;
61 mTZOffset = trk.GetTZOffset();
62 mNClusters = sectorTr->NHits();
63 mParam.mC0 = trk.GetCov(0);
64 mParam.mC2 = trk.GetCov(2);
65 mParam.mC3 = trk.GetCov(3);
66 mParam.mC5 = trk.GetCov(5);
67 mParam.mC7 = trk.GetCov(7);
68 mParam.mC9 = trk.GetCov(9);
69 mParam.mC10 = trk.GetCov(10);
70 mParam.mC12 = trk.GetCov(12);
71 mParam.mC14 = trk.GetCov(14);
76 mParam2.mX = trk.GetX();
77 mParam2.mY = trk.GetY();
78 mParam2.mZ = trk.GetZ();
79 mParam2.mDzDs = trk.GetDzDs();
80 mParam2.mSinPhi = trk.GetSinPhi();
81 mParam2.mQPt = trk.GetQPt();
82 mParam2.mCosPhi = CAMath::Sqrt(1.f - mParam2.mSinPhi * mParam2.mSinPhi);
83 mParam2.mSecPhi = 1.f / mParam2.mCosPhi;
84 mParam2.mC0 = trk.GetCov(0);
85 mParam2.mC2 = trk.GetCov(2);
86 mParam2.mC3 = trk.GetCov(3);
87 mParam2.mC5 = trk.GetCov(5);
88 mParam2.mC7 = trk.GetCov(7);
89 mParam2.mC9 = trk.GetCov(9);
90 mParam2.mC10 = trk.GetCov(10);
91 mParam2.mC12 = trk.GetCov(12);
92 mParam2.mC14 = trk.GetCov(14);
101 const GPUTPCTracker& trk = merger->GetConstantMem()->tpcTrackers[iSector];
102 const GPUTPCHitId& ic = trk.TrackHits()[mOrigTrack->FirstHitID() + mOrigTrack->NHits() - 1];
103 index = trk.Data().ClusterDataIndex(trk.Data().Row(ic.RowIndex()), ic.HitIndex()) + merger->GetConstantMem()->ioPtrs.clustersNative->clusterOffset[iSector][0];
105 const ClusterNative& cl = merger->GetConstantMem()->ioPtrs.clustersNative->clustersLinear[
index];
106 GPUTPCConvertImpl::convert(*merger->GetConstantMem(), iSector,
row, cl.getPad(), cl.getTime(), lastX,
y,
z);
110 float bz = -merger->Param().bzCLight;
112 float k = mParam.mQPt * bz;
113 float dx = (1.f / N) * (lastX - mParam.mX);
115 float dxBz = dx * bz;
116 float kdx205 = 2.f + kdx * kdx * 0.5f;
119 merger->Param().GetClusterErrors2(iSector, 0, mParam.mZ, mParam.mSinPhi, mParam.mDzDs, -1.f, 0.f, 0.f, mParam.mC0, mParam.mC2);
120#ifndef GPUCA_TPC_GEOMETRY_O2
122 merger->Param().GetClusterErrorsSeeding2(iSector, 0, mParam.mZ, mParam.mSinPhi, mParam.mDzDs, -1.f, C0a, C2a);
123 if (C0a > mParam.mC0) {
126 if (C2a > mParam.mC2) {
140 for (int32_t iStep = 0; iStep < N; iStep++) {
144 float ex = mParam.mCosPhi;
145 float ey = mParam.mSinPhi;
146 float ey1 = kdx + ey;
147 if (CAMath::Abs(ey1) > maxSinPhi) {
148 if (ey1 > maxSinPhi && ey1 < maxSinPhi + sinPhiMargin) {
149 ey1 = maxSinPhi - 0.01f;
150 }
else if (ey1 > -maxSinPhi - sinPhiMargin) {
151 ey1 = -maxSinPhi + 0.01f;
158 float ex1 = CAMath::Sqrt(1.f - ey1 * ey1);
161 float dxcci = dx /
cc;
163 float dy = dxcci * ss;
164 float norm2 = 1.f + ey * ey1 + ex * ex1;
165 float dl = dxcci * CAMath::Sqrt(norm2 + norm2);
169 float dSin = 0.5f * k * dl;
170 float a = dSin * dSin;
171 const float k2 = 1.f / 6.f;
172 const float k4 = 3.f / 40.f;
173 dS = dl + dl *
a * (k2 +
a * (k4));
176 float dz = dS * mParam.mDzDs;
177 float ex1i = 1.f / ex1;
179 merger->Param().GetClusterErrors2(iSector, 0, mParam.mZ, mParam.mSinPhi, mParam.mDzDs, -1.f, 0.f, 0.f, err2Y, err2Z);
180#ifndef GPUCA_TPC_GEOMETRY_O2
182 merger->Param().GetClusterErrorsSeeding2(iSector, 0, mParam.mZ, mParam.mSinPhi, mParam.mDzDs, -1.f, C0a, C2a);
192 float hh = kdx205 * dxcci * ex1i;
193 float h2 = hh * mParam.mSecPhi;
198 mParam.mSinPhi = ey1;
199 mParam.mCosPhi = ex1;
200 mParam.mSecPhi = ex1i;
202 float h4 = bz * dxcci * hh;
204 float c20 = mParam.mC3;
205 float c22 = mParam.mC5;
206 float c31 = mParam.mC7;
207 float c33 = mParam.mC9;
208 float c40 = mParam.mC10;
209 float c42 = mParam.mC12;
210 float c44 = mParam.mC14;
212 float c20ph4c42 = c20 + h4 * c42;
213 float h2c22 = h2 * c22;
214 float h4c44 = h4 * c44;
215 float n7 = c31 + dS * c33;
216 float n10 = c40 + h2 * c42 + h4c44;
217 float n12 = c42 + dxBz * c44;
219 mParam.mC0 += h2 * h2c22 + h4 * h4c44 + 2.f * (h2 * c20ph4c42 + h4 * c40);
221 mParam.mC3 = c20ph4c42 + h2c22 + dxBz * n10;
224 mParam.mC5 = c22 + dxBz * (c42 + n12);
227 mParam.mC2 += dS * (c31 + n7);
233 float c00 = mParam.mC0, c11 = mParam.mC2, c20 = mParam.mC3, c31 = mParam.mC7, c40 = mParam.mC10;
235 float mS0 = 1.f / (err2Y + c00);
236 float mS2 = 1.f / (err2Z + c11);
240 float k00, k11, k20, k31, k40;
246 mParam.mC0 -= k00 * c00;
247 mParam.mC5 -= k20 * c20;
248 mParam.mC10 -= k00 * c40;
249 mParam.mC12 -= k40 * c20;
250 mParam.mC3 -= k20 * c00;
251 mParam.mC14 -= k40 * c40;
256 mParam.mC7 -= k31 * c11;
257 mParam.mC2 -= k11 * c11;
258 mParam.mC9 -= k31 * c31;
263 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(mTZOffset) && CAMath::Finite(mParam.mC0) && CAMath::Finite(mParam.mC2) &&
264 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);
266 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) {
271 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);
280 float ex = mParam.mCosPhi;
281 float ey = mParam.mSinPhi;
282 float k = mParam.mQPt * Bz;
283 float dx =
x - mParam.mX;
284 float ey1 = k * dx + ey;
286 if (CAMath::Abs(ey1) > maxSinPhi) {
290 float ex1 = CAMath::Sqrt(1.f - ey1 * ey1);
291 float dxBz = dx * Bz;
295 float dxcci = dx /
cc;
296 float norm2 = 1.f + ey * ey1 + ex * ex1;
298 float dy = dxcci * ss;
302 float dl = dxcci * CAMath::Sqrt(norm2 + norm2);
303 float dSin = 0.5f * k * dl;
304 float a = dSin * dSin;
305 const float k2 = 1.f / 6.f;
306 const float k4 = 3.f / 40.f;
308 dS = dl + dl *
a * (k2 +
a * (k4));
311 float dz = dS * mParam.mDzDs;
313 b.SetPar(0, mParam.mY + dy);
314 b.SetPar(1, mParam.mZ + dz);
316 b.SetPar(3, mParam.mDzDs);
317 b.SetPar(4, mParam.mQPt);
318 if (merger->Param().par.earlyTpcTransform) {
319 b.SetZOffsetLinear(mTZOffset);
321 b.SetZOffsetLinear(merger->GetConstantMem()->calibObjects.fastTransformHelper->getCorrMap()->convVertexTimeToZOffset(mSector, mTZOffset, merger->Param().continuousMaxTimeBin));
328 float ex1i = 1.f / ex1;
329 float hh = dxcci * ex1i * norm2;
330 float h2 = hh * mParam.mSecPhi;
331 float h4 = Bz * dxcci * hh;
333 float c20 = mParam.mC3;
334 float c22 = mParam.mC5;
335 float c31 = mParam.mC7;
336 float c33 = mParam.mC9;
337 float c40 = mParam.mC10;
338 float c42 = mParam.mC12;
339 float c44 = mParam.mC14;
341 float c20ph4c42 = c20 + h4 * c42;
342 float h2c22 = h2 * c22;
343 float h4c44 = h4 * c44;
344 float n7 = c31 + dS * c33;
346 if (CAMath::Abs(mParam.mQPt) > 6.66f)
348 b.SetCov(0, CAMath::Max(mParam.mC0, mParam.mC0 + h2 * h2c22 + h4 * h4c44 + 2.f * (h2 * c20ph4c42 + h4 * c40)));
349 float C2tmp = dS * 2.f * c31;
353 b.SetCov(1, mParam.mC2 + C2tmp + dS * dS * c33);
355 b.SetCov(0, mParam.mC0 + h2 * h2c22 + h4 * h4c44 + 2.f * (h2 * c20ph4c42 + h4 * c40));
356 b.SetCov(1, mParam.mC2 + dS * (c31 + n7));
358 b.SetCov(2, c22 + dxBz * (c42 + c42 + dxBz * c44));
361 b.SetCovD(0, c20ph4c42 + h2c22 + dxBz * (c40 + h2 * c42 + h4c44));
373 float c00 = mParam.mC0;
374 float c11 = mParam.mC2;
375 float c20 = mParam.mC3;
376 float c22 = mParam.mC5;
377 float c31 = mParam.mC7;
378 float c33 = mParam.mC9;
379 float c40 = mParam.mC10;
380 float c42 = mParam.mC12;
381 float c44 = mParam.mC14;
385 float sinPhi = mParam.mSinPhi;
386 float cosPhi = mParam.mCosPhi;
387 float secPhi = mParam.mSecPhi;
388 float dzds = mParam.mDzDs;
389 float qpt = mParam.mQPt;
393 float sP = sinPhi, cP = cosPhi;
394 cosPhi = cP * cosAlpha + sP * sinAlpha;
395 sinPhi = -cP * sinAlpha + sP * cosAlpha;
401 secPhi = 1.f / cosPhi;
402 float j0 = cP * secPhi;
403 float j2 = cosPhi / cP;
404 x = mParam.mX * cosAlpha + mParam.mY * sinAlpha;
405 y = -mParam.mX * sinAlpha + mParam.mY * cosAlpha;
429 float ey1 = k * dx + ey;
431 if (CAMath::Abs(ey1) > maxSinPhi) {
435 float ex1 = CAMath::Sqrt(1.f - ey1 * ey1);
437 float dxBz = dx * Bz;
441 float dxcci = dx /
cc;
442 float norm2 = 1.f + ey * ey1 + ex * ex1;
444 float dy = dxcci * ss;
448 float dl = dxcci * CAMath::Sqrt(norm2 + norm2);
449 float dSin = 0.5f * k * dl;
450 float a = dSin * dSin;
451 const float k2 = 1.f / 6.f;
452 const float k4 = 3.f / 40.f;
454 dS = dl + dl *
a * (k2 +
a * (k4));
457 float ex1i = 1.f / ex1;
458 float dz = dS * dzds;
460 float hh = dxcci * ex1i * norm2;
461 float h2 = hh * secPhi;
462 float h4 = Bz * dxcci * hh;
464 float c20ph4c42 = c20 + h4 * c42;
465 float h2c22 = h2 * c22;
466 float h4c44 = h4 * c44;
467 float n7 = c31 + dS * c33;
474 if (merger->Param().par.earlyTpcTransform) {
475 b.SetZOffsetLinear(mTZOffset);
477 b.SetZOffsetLinear(merger->GetConstantMem()->calibObjects.fastTransformHelper->getCorrMap()->convVertexTimeToZOffset(mSector, mTZOffset, merger->Param().continuousMaxTimeBin));
480 b.SetCov(0, c00 + h2 * h2c22 + h4 * h4c44 + 2.f * (h2 * c20ph4c42 + h4 * c40));
481 b.SetCov(1, c11 + dS * (c31 + n7));
482 b.SetCov(2, c22 + dxBz * (c42 + c42 + dxBz * c44));
485 b.SetCovD(0, c20ph4c42 + h2c22 + dxBz * (c40 + h2 * c42 + h4c44));
502 mParam.mC10 = cov[10];
503 mParam.mC12 = cov[12];
504 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