64 prop.SetPolynomialField(&processors.param.polynomialField);
66 prop.SetFitInProjections(1);
70 int32_t roadCounters[4]{0, 0, 0, 0};
71 int32_t fitCounters[4]{0, 0, 0, 0};
72 int32_t backpropagatedCounters[4]{0, 0, 0, 0};
73 int32_t refitCounters[4]{0, 0, 0, 0};
76 Road<5>& road = Fitter.roads()[iRoad];
81 for (int32_t iCell{0}; iCell < Fitter.NumberOfLayers() - 2; ++iCell) {
82 const int32_t cellIndex = road[iCell];
86 clusters[iCell] = Fitter.cells()[iCell][cellIndex].getFirstClusterIndex();
87 clusters[iCell + 1] = Fitter.cells()[iCell][cellIndex].getSecondClusterIndex();
88 clusters[iCell + 2] = Fitter.cells()[iCell][cellIndex].getThirdClusterIndex();
89 lastCellLevel = iCell;
101 for (int32_t iC{0}; iC < 7; iC++) {
107 const auto& cluster1 = Fitter.trackingFrame()[lastCellLevel + 2][
clusters[lastCellLevel + 2]];
108 const auto& cluster2 = Fitter.trackingFrame()[lastCellLevel + 1][
clusters[lastCellLevel + 1]];
109 const auto& cluster3 = Fitter.trackingFrame()[lastCellLevel][
clusters[lastCellLevel]];
113 const float ca = CAMath::Cos(cluster3.alphaTrackingFrame), sa = CAMath::Sin(cluster3.alphaTrackingFrame);
114 const float x1 = cluster1.xCoordinate * ca + cluster1.yCoordinate * sa;
115 const float y1 = -cluster1.xCoordinate * sa + cluster1.yCoordinate * ca;
116 const float z1 = cluster1.zCoordinate;
117 const float x2 = cluster2.xCoordinate * ca + cluster2.yCoordinate * sa;
118 const float y2 = -cluster2.xCoordinate * sa + cluster2.yCoordinate * ca;
119 const float z2 = cluster2.zCoordinate;
120 const float x3 = cluster3.xTrackingFrame;
121 const float y3 = cluster3.positionTrackingFrame[0];
122 const float z3 = cluster3.positionTrackingFrame[1];
124 const float crv = o2::its::math_utils::computeCurvature(
x1,
y1, x2, y2, x3, y3);
125 const float x0 = o2::its::math_utils::computeCurvatureCentreX(
x1,
y1, x2, y2, x3, y3);
126 const float tgl12 = o2::its::math_utils::computeTanDipAngle(
x1,
y1, x2, y2, z1, z2);
127 const float tgl23 = o2::its::math_utils::computeTanDipAngle(x2, y2, x3, y3, z2, z3);
129 const float r2 = CAMath::Sqrt(cluster2.xCoordinate * cluster2.xCoordinate + cluster2.yCoordinate * cluster2.yCoordinate);
130 const float r3 = CAMath::Sqrt(cluster3.xCoordinate * cluster3.xCoordinate + cluster3.yCoordinate * cluster3.yCoordinate);
131 const float fy = 1.f / (r2 - r3);
132 const float& tz = fy;
136 temporaryTrack.X() = cluster3.xTrackingFrame;
137 temporaryTrack.
Y() = y3;
138 temporaryTrack.
Z() = z3;
139 temporaryTrack.SinPhi() = crv * (x3 -
x0);
140 temporaryTrack.DzDs() = 0.5f * (tgl12 + tgl23);
142 temporaryTrack.TZOffset() = 0;
143 temporaryTrack.Cov()[0] = s2;
144 temporaryTrack.Cov()[1] = 0.f;
145 temporaryTrack.Cov()[2] = s2;
146 temporaryTrack.Cov()[3] = s2 * fy;
147 temporaryTrack.Cov()[4] = 0.f;
148 temporaryTrack.Cov()[5] = s2 * fy * fy;
149 temporaryTrack.Cov()[6] = 0.f;
150 temporaryTrack.Cov()[7] = s2 * tz;
151 temporaryTrack.Cov()[8] = 0.f;
152 temporaryTrack.Cov()[9] = s2 * tz * tz;
153 temporaryTrack.Cov()[10] = s2 * cy;
154 temporaryTrack.Cov()[11] = 0.f;
155 temporaryTrack.Cov()[12] = s2 * fy * cy;
156 temporaryTrack.Cov()[13] = 0.f;
157 temporaryTrack.Cov()[14] = s2 * cy * cy;
158 temporaryTrack.SetChi2(0);
159 temporaryTrack.SetNDF(-5);
161 prop.SetTrack(&temporaryTrack, cluster3.alphaTrackingFrame);
164 for (
size_t iC = 0; iC < 7; ++iC) {
167 bool fitSuccess = fitTrack(Fitter, prop, temporaryTrack, Fitter.NumberOfLayers() - 4, -1, -1);
172 temporaryTrack.ResetCovariance();
173 fitSuccess = fitTrack(Fitter, prop, temporaryTrack, 0, Fitter.NumberOfLayers(), 1);
178 for (int32_t k = 0; k < 5; k++) {
179 temporaryTrack.
mOuterParam.
P[k] = temporaryTrack.Par()[k];
181 for (int32_t k = 0; k < 15; k++) {
182 temporaryTrack.
mOuterParam.
C[k] = temporaryTrack.Cov()[k];
186 temporaryTrack.ResetCovariance();
187 fitSuccess = fitTrack(Fitter, prop, temporaryTrack, Fitter.NumberOfLayers() - 1, -1, -1);
192 int32_t trackId = CAMath::AtomicAdd(&Fitter.NumberOfTracks(), 1u);
193 Fitter.tracks()[trackId] = temporaryTrack;
196 GPUInfo(
"Roads: %i %i %i %i", roadCounters[0], roadCounters[1], roadCounters[2], roadCounters[3]);
197 GPUInfo(
"Fitted tracks: %i %i %i %i", fitCounters[0], fitCounters[1], fitCounters[2], fitCounters[3]);
198 GPUInfo(
"Backpropagated tracks: %i %i %i %i", backpropagatedCounters[0], backpropagatedCounters[1], backpropagatedCounters[2], backpropagatedCounters[3]);
199 GPUInfo(
"Refitted tracks: %i %i %i %i", refitCounters[0], refitCounters[1], refitCounters[2], refitCounters[3]);