47 const int nStations =
fParameters.GetNstationsActive();
56 const auto& sta =
fSetup.GetActiveLayers();
99 for (
int ista = 0; ista < nStations; ista++) {
100 ZSta[ista] = sta[ista].GetZref();
101 mxy[ista].
SetCov(1., 0., 1.);
104 unsigned short N_vTracks = wData.
RecoTracks().size();
106 for (
unsigned short itrack = 0; itrack < N_vTracks; itrack +=
fvec::size()) {
108 if (N_vTracks - itrack <
static_cast<unsigned short>(
fvec::size())) nTracks_SIMD = N_vTracks - itrack;
110 for (
int i = 0; i < nTracks_SIMD; i++) {
115 for (uint i = nTracks_SIMD; i <
fvec::size(); i++) {
120 for (
int ista = 0; ista < nStations; ista++) {
123 z[ista] = ZSta[ista];
128 for (
int iVec = 0; iVec < nTracks_SIMD; iVec++) {
130 int nHitsTrack = t[iVec]->fNofHits;
133 for (
int ih = 0; ih < nHitsTrack; ih++) {
136 const int ista = hit.
Station();
137 auto [detSystemId, iStLocal] =
fSetup.GetIndexMap().GlobalToLocal<
EDetectorID>(ista);
142 w[ista][iVec] =
true;
143 if (sta[ista].IsTimeMeasured()) {
144 w_time[ista][iVec] =
true;
147 auto misalignment =
fParameters.GetConfig().GetMisalignmentTolerance(detSystemId);
148 float dX2Orig = hit.
dX2() - misalignment.GetXsq();
149 float dY2Orig = hit.
dY2() - misalignment.GetYsq();
150 float dXYOrig = hit.
dXY();
151 if (dX2Orig < 0. || dY2Orig < 0. || fabs(dXYOrig /
sqrt(dX2Orig * dY2Orig)) > 1.) {
155 float dT2Orig = hit.
dT2() - misalignment.GetTimeSq();
160 x[ista][iVec] = hit.
X();
161 y[ista][iVec] = hit.
Y();
162 time[ista][iVec] = hit.
T();
163 dt2[ista][iVec] = dT2Orig;
164 if (!sta[ista].IsTimeMeasured()) {
165 dt2[ista][iVec] = 1.e4;
167 z[ista][iVec] = hit.
Z();
168 fB_temp =
fField.GetFieldValue(ista,
x[ista],
y[ista]);
169 mxy[ista].
X()[iVec] = hit.
X();
170 mxy[ista].
Y()[iVec] = hit.
Y();
171 mxy[ista].
Dx2()[iVec] = dX2Orig;
172 mxy[ista].
Dy2()[iVec] = dY2Orig;
173 mxy[ista].
Dxy()[iVec] = dXYOrig;
174 mxy[ista].
NdfX()[iVec] = 1.;
175 mxy[ista].
NdfY()[iVec] = 1.;
177 fB[ista].
SetSimdEntry(fB_temp.GetBx()[iVec], fB_temp.GetBy()[iVec], fB_temp.GetBz()[iVec],
178 fB_temp.GetZ()[iVec], iVec);
181 z_start[iVec] = z[ista][iVec];
182 x_first[iVec] =
x[ista][iVec];
183 y_first[iVec] =
y[ista][iVec];
184 time_first[iVec] = time[ista][iVec];
185 wtime_first[iVec] = sta[ista].IsTimeMeasured() ? 1. : 0.;
186 dt2_first[iVec] = dt2[ista][iVec];
187 mxy_first.
X()[iVec] = mxy[ista].
X()[iVec];
188 mxy_first.
Y()[iVec] = mxy[ista].
Y()[iVec];
189 mxy_first.
Dx2()[iVec] = mxy[ista].
Dx2()[iVec];
190 mxy_first.
Dy2()[iVec] = mxy[ista].
Dy2()[iVec];
191 mxy_first.
Dxy()[iVec] = mxy[ista].
Dxy()[iVec];
192 mxy_first.
NdfX()[iVec] = mxy[ista].
NdfX()[iVec];
193 mxy_first.
NdfY()[iVec] = mxy[ista].
NdfY()[iVec];
195 else if (ih == nHitsTrack - 1) {
196 z_end[iVec] = z[ista][iVec];
197 x_last[iVec] =
x[ista][iVec];
198 y_last[iVec] =
y[ista][iVec];
199 mxy_last.
X()[iVec] = mxy[ista].
X()[iVec];
200 mxy_last.
Y()[iVec] = mxy[ista].
Y()[iVec];
201 mxy_last.
Dx2()[iVec] = mxy[ista].
Dx2()[iVec];
202 mxy_last.
Dy2()[iVec] = mxy[ista].
Dy2()[iVec];
203 mxy_last.
Dxy()[iVec] = mxy[ista].
Dxy()[iVec];
204 mxy_last.
NdfX()[iVec] = mxy[ista].
NdfX()[iVec];
205 mxy_last.
NdfY()[iVec] = mxy[ista].
NdfY()[iVec];
206 time_last[iVec] = time[ista][iVec];
207 dt2_last[iVec] = dt2[ista][iVec];
208 wtime_last[iVec] = sta[ista].IsTimeMeasured() ? 1. : 0.;
213 for (
int ih = nHitsTrack - 1; ih >= 0; ih--) {
214 const int ista = iSta[ih];
215 By[ista][iVec] =
fField.GetFieldValue(ista, 0., 0.).GetBy()[0];
219 fit.
GuessTrack(z_end,
x,
y, z, time, By, w, w_time, nStations);
223 tr.Qp() =
fvec(1. / 1.1);
228 for (
int iter = 0; iter < 2; iter++) {
234 int ista = nStations - 1;
237 dt2_last =
iif(w_time[ista], dt2_last,
fvec(1.e6));
239 tr.ResetErrors(mxy_last.
Dx2(), mxy_last.
Dy2(), 0.1, 0.1, 1.0, dt2_last, 1.e-2);
240 tr.C10() = mxy_last.
Dxy();
241 tr.X() = mxy_last.
X();
242 tr.Y() = mxy_last.
Y();
243 tr.Time() = time_last;
245 tr.InitVelocityRange(0.5);
247 tr.NdfTime() =
fvec(-2.) + wtime_last;
250 fldB1 =
fField.GetFieldValue(ista, tr.X(), tr.Y());
254 fvec dz = fldZ2 - fldZ1;
255 fldB2 =
fField.GetFieldValue(ista - 2, tr.X() + tr.Tx() * dz, tr.Y() + tr.Ty() * dz);
256 fldB2.SetSimdEntries(fB[ista - 2], w[ista - 2]);
258 for (--ista; ista >= 0; ista--) {
261 dz = (fldZ1 - fldZ0);
262 fldB0 =
fField.GetFieldValue(ista, tr.X() - tr.Tx() * dz, tr.Y() - tr.Ty() * dz);
264 fld.Set(fldB0, fldB1, fldB2);
266 fmask initialised = (z[ista] < z_end) & (z_start <= z[ista]);
272 auto radThick =
fSetup.GetMaterial(ista).GetThicknessX0(tr.X(), tr.Y());
276 fit.
SetMask(initialised && w[ista]);
278 fit.
FilterTime(time[ista], dt2[ista],
fmask(sta[ista].IsTimeMeasured()));
301 for (
int vtxIter = 0; vtxIter < 2; vtxIter++) {
303 fitpv.
Tr() = fit.
Tr();
322 Tf.Qp() = fitpv.
Tr().
Qp();
325 for (
int iVec = 0; iVec < nTracks_SIMD; iVec++) {
326 t[iVec]->fParFirst.Set(Tf, iVec);
329 for (
int iVec = 0; iVec < nTracks_SIMD; iVec++) {
330 t[iVec]->fParPV.Set(fitpv.
Tr(), iVec);
341 tr.ResetErrors(mxy_first.
Dx2(), mxy_first.
Dy2(), 0.1, 0.1, 1., dt2_first, 1.e-2);
342 tr.C10() = mxy_first.
Dxy();
344 tr.X() = mxy_first.
X();
345 tr.Y() = mxy_first.
Y();
346 tr.Time() = time_first;
348 tr.InitVelocityRange(0.5);
350 tr.Ndf() =
fvec(-5. + 2.);
351 tr.NdfTime() =
fvec(-2.) + wtime_first;
356 fldB1 =
fField.GetFieldValue(ista, tr.X(), tr.Y());
361 fldB2 =
fField.GetFieldValue(ista + 2, tr.X() + tr.Tx() * dz, tr.Y() + tr.Ty() * dz);
362 fldB2.SetSimdEntries(fB[ista + 2], w[ista + 2]);
365 for (++ista; ista < nStations; ista++) {
367 dz = (fldZ1 - fldZ0);
368 fldB0 =
fField.GetFieldValue(ista, tr.X() - tr.Tx() * dz, tr.Y() - tr.Ty() * dz);
370 fld.Set(fldB0, fldB1, fldB2);
372 fmask initialised = (z[ista] <= z_end) & (z_start < z[ista]);
376 auto radThick =
fSetup.GetMaterial(ista).GetThicknessX0(tr.X(), tr.Y());
379 fit.
SetMask(initialised && w[ista]);
381 fit.
FilterTime(time[ista], dt2[ista],
fmask(sta[ista].IsTimeMeasured()));
396 Tl.Qp() = fitpv.
Tr().
Qp();
399 for (
int iVec = 0; iVec < nTracks_SIMD; iVec++) {
400 t[iVec]->fParLast.Set(Tl, iVec);