173 const std::vector<CbmStsHit>& vStsHits,
const std::vector<int>& pidHypo)
206 fvec x_first, y_first, t_first, x_last, y_last, t_last;
208 fvec dt2_first, dt2_last;
210 fvec z0, z1, z2, dz, z_start, z_end;
214 unsigned short N_vTracks = Tracks.size();
217 for (
unsigned short itrack = 0; itrack < N_vTracks; itrack++) {
218 Tracks[itrack].SetPidHypo(pidHypo[itrack]);
221 fvec mass = 0.000511f;
223 for (
unsigned short itrack = 0; itrack < N_vTracks; itrack +=
fvec::size()) {
227 T.ResetErrors(1.e2, 1.e2, 1., 1., 1., 1.e6, 1.e2);
229 if (N_vTracks - itrack <
static_cast<unsigned short>(
fvec::size())) {
230 nTracks_SIMD = N_vTracks - itrack;
232 for (
int iVec = 0; iVec < nTracks_SIMD; iVec++) {
233 tr[iVec] = &Tracks[itrack + iVec];
234 T.X()[iVec] = tr[iVec]->GetParamFirst()->GetX();
235 T.Y()[iVec] = tr[iVec]->GetParamFirst()->GetY();
236 T.Tx()[iVec] = tr[iVec]->GetParamFirst()->GetTx();
237 T.Ty()[iVec] = tr[iVec]->GetParamFirst()->GetTy();
238 T.Qp()[iVec] = tr[iVec]->GetParamFirst()->GetQp();
241 T.Z()[iVec] = tr[iVec]->GetParamFirst()->GetZ();
243 for (
int i = 0; i < 5; i++) {
244 for (
int j = 0; j <= i; j++) {
245 T.C(i, j)[iVec] = tr[iVec]->GetParamFirst()->GetCovariance(i, j);
249 int pid = pidHypo[itrack + iVec];
254 mass[iVec] = KFParticleDatabase::Instance()->GetMass(pid);
260 for (
int i = 0; i < nHits; i++) {
274 fB[i].
Set(0., 0., 0.);
277 for (
int iVec = 0; iVec < nTracks_SIMD; iVec++) {
278 int nHitsTrackMvd = tr[iVec]->GetNofMvdHits();
279 int nHitsTrackSts = tr[iVec]->GetNofStsHits();
280 int nHitsTrack = nHitsTrackMvd + nHitsTrackSts;
281 for (
int i = 0; i < nHitsTrack; i++) {
284 if (i < nHitsTrackMvd) {
285 int hitIndex = tr[iVec]->GetMvdHitIndex(i);
286 const CbmMvdHit* mvdHit = &(vMvdHits[hitIndex]);
294 int hitIndex = tr[iVec]->GetStsHitIndex(i - nHitsTrackMvd);
295 const CbmStsHit* stsHit = &(vStsHits[hitIndex]);
303 x[ista][iVec] = hit->
GetX();
304 y[ista][iVec] = hit->
GetY();
305 z[ista][iVec] = hit->
GetZ();
306 t[ista][iVec] = hit->
GetTime();
308 mxy[ista].
X()[iVec] = hit->
GetX();
309 mxy[ista].
Y()[iVec] = hit->
GetY();
313 mxy[ista].
NdfX()[iVec] = 1.;
314 mxy[ista].
NdfY()[iVec] = 1.;
317 w[ista][iVec] =
true;
321 fB[ista].
SetSimdEntry(fB_temp.GetBx()[iVec], fB_temp.GetBy()[iVec], fB_temp.GetBz()[iVec], iVec);
323 z_start[iVec] = z[ista][iVec];
324 x_first[iVec] =
x[ista][iVec];
325 y_first[iVec] =
y[ista][iVec];
326 t_first[iVec] = t[ista][iVec];
327 mxy_first.
X()[iVec] = mxy[ista].
X()[iVec];
328 mxy_first.
Y()[iVec] = mxy[ista].
Y()[iVec];
329 mxy_first.
Dx2()[iVec] = mxy[ista].
Dx2()[iVec];
330 mxy_first.
Dy2()[iVec] = mxy[ista].
Dy2()[iVec];
331 mxy_first.
Dxy()[iVec] = mxy[ista].
Dxy()[iVec];
332 mxy_first.
NdfX()[iVec] = mxy[ista].
NdfX()[iVec];
333 mxy_first.
NdfY()[iVec] = mxy[ista].
NdfY()[iVec];
334 dt2_first[iVec] = dt2[ista][iVec];
336 if (i == nHitsTrack - 1) {
337 z_end[iVec] = z[ista][iVec];
338 x_last[iVec] =
x[ista][iVec];
339 y_last[iVec] =
y[ista][iVec];
340 t_last[iVec] = t[ista][iVec];
341 mxy_last.
X()[iVec] = mxy[ista].
X()[iVec];
342 mxy_last.
Y()[iVec] = mxy[ista].
Y()[iVec];
343 mxy_last.
Dx2()[iVec] = mxy[ista].
Dx2()[iVec];
344 mxy_last.
Dy2()[iVec] = mxy[ista].
Dy2()[iVec];
345 mxy_last.
Dxy()[iVec] = mxy[ista].
Dxy()[iVec];
346 mxy_last.
NdfX()[iVec] = mxy[ista].
NdfX()[iVec];
347 mxy_last.
NdfY()[iVec] = mxy[ista].
NdfY()[iVec];
348 dt2_last[iVec] = dt2[ista][iVec];
367 fld.
Set(b2, z2, b1, z1, b0, z0);
368 for (++i; i < nHits; i++) {
373 fld.
Set(b0, z0, b1, z1, b2, z2);
375 fmask initialised = (z[i] <= z_end) & (z_start < z[i]);
379 auto radThick = activeTrackingSetup.GetMaterial(i).GetThicknessX0(fit.
Tr().
X(), fit.
Tr().
Y());
383 fit.
SetMask(initialised && w[i]);
394 for (
int iVec = 0; iVec < nTracks_SIMD; iVec++) {
396 par.SetX(T.X()[iVec]);
397 par.SetY(T.Y()[iVec]);
398 par.SetTx(T.Tx()[iVec]);
399 par.SetTy(T.Ty()[iVec]);
400 par.SetQp(T.Qp()[iVec]);
401 par.SetZ(T.Z()[iVec]);
403 for (
int k = 0; k < 5; k++) {
404 for (
int j = 0; j <= k; j++) {
405 par.SetCovariance(k, j, Tout.
C(k, j)[iVec]);
409 tr[iVec]->SetParamLast(&par);
428 fld.
Set(b2, z2, b1, z1, b0, z0);
429 for (--i; i >= 0; i--) {
434 fld.
Set(b0, z0, b1, z1, b2, z2);
436 fmask initialised = (z[i] < z_end) & (z_start <= z[i]);
440 auto radThick = activeTrackingSetup.GetMaterial(i).GetThicknessX0(fit.
Tr().
X(), fit.
Tr().
Y());
444 fit.
SetMask(initialised && w[i]);
454 for (
int iVec = 0; iVec < nTracks_SIMD; iVec++) {
456 par.SetX(T.X()[iVec]);
457 par.SetY(T.Y()[iVec]);
458 par.SetTx(T.Tx()[iVec]);
459 par.SetTy(T.Ty()[iVec]);
460 par.SetQp(T.Qp()[iVec]);
461 par.SetZ(T.Z()[iVec]);
463 for (
int k = 0; k < 5; k++) {
464 for (
int j = 0; j <= k; j++) {
465 par.SetCovariance(k, j, T.C(k, j)[iVec]);
469 tr[iVec]->SetParamFirst(&par);
471 tr[iVec]->SetChiSq(T.ChiSq()[iVec]);
472 tr[iVec]->SetNDF(
static_cast<int>(T.Ndf()[iVec]));
509 chiToVtx.reserve(Tracks.size());
522 for (
int iSta = 0; iSta < nStations; iSta++) {
523 zSta[iSta] = sta[iSta].
fZ;
526 field.reserve(Tracks.size());
532 unsigned short N_vTracks = Tracks.size();
534 for (
unsigned short itrack = 0; itrack < N_vTracks; itrack +=
fvec::size()) {
535 if (N_vTracks - itrack <
static_cast<unsigned short>(
fvec::size())) {
536 nTracks_SIMD = N_vTracks - itrack;
540 for (
int iVec = 0; iVec < nTracks_SIMD; iVec++) {
541 tr[iVec] = &Tracks[itrack + iVec];
542 T.X()[iVec] = tr[iVec]->GetParamFirst()->GetX();
543 T.Y()[iVec] = tr[iVec]->GetParamFirst()->GetY();
544 T.Tx()[iVec] = tr[iVec]->GetParamFirst()->GetTx();
545 T.Ty()[iVec] = tr[iVec]->GetParamFirst()->GetTy();
546 T.Qp()[iVec] = tr[iVec]->GetParamFirst()->GetQp();
547 T.Z()[iVec] = tr[iVec]->GetParamFirst()->GetZ();
549 for (
int i = 0; i < 5; i++) {
550 for (
int j = 0; j <= i; j++) {
551 T.C(i, j)[iVec] = tr[iVec]->GetParamFirst()->GetCovariance(i, j);
556 const float mass = KFParticleDatabase::Instance()->GetMass(tr[iVec]->GetPidHypo());
557 mass2[iVec] = mass * mass;
559 int nHitsTrackMvd = tr[iVec]->GetNofMvdHits();
560 for (
int iH = 0; iH < 2; iH++) {
561 float posx = 0.f, posy = 0.f, posz = 0.f;
563 if (iH < nHitsTrackMvd) {
567 int hitIndex = tr[iVec]->GetMvdHitIndex(iH);
582 int hitIndex = tr[iVec]->GetStsHitIndex(iH - nHitsTrackMvd);
595 fB[iH + 1].
SetSimdEntry(fB_temp.GetBx()[iVec], fB_temp.GetBy()[iVec], fB_temp.GetBz()[iVec], iVec);
596 zField[iH + 1][iVec] = posz;
602 fld.Set(fB[2], zField[2], fB[1], zField[1], fB[0], zField[0]);
603 for (
int i = 0; i < nTracks_SIMD; i++) {
604 field.emplace_back(fld, i);
609 for (
int iSt = nStations - 4; iSt >= 0; iSt--) {
612 auto radThick = activeTrackingSetup.GetMaterial(iSt).GetThicknessX0(fit.
Tr().
X(), fit.
Tr().
Y());
620 constexpr float targetRadThick = 3.73e-2f * 2;
629 fvec c[3] = {T.C00(), T.C10(), T.C11()};
633 fvec d = c[0] * c[2] - c[1] * c[1];
634 fvec chi =
sqrt(kf::utils::fabs(
fvec(0.5) * (dx * dx * c[0] -
fvec(2.) * dx * dy * c[1] + dy * dy * c[2]) / d));
637 for (
int iVec = 0; iVec < nTracks_SIMD; iVec++) {
638 chiToVtx.push_back(chi[iVec]);
642 for (
int iVec = 0; iVec < nTracks_SIMD; iVec++) {
643 if (chi[iVec] < chiPrim) {
645 par.SetX(T.X()[iVec]);
646 par.SetY(T.Y()[iVec]);
647 par.SetTx(T.Tx()[iVec]);
648 par.SetTy(T.Ty()[iVec]);
649 par.SetQp(T.Qp()[iVec]);
650 par.SetZ(T.Z()[iVec]);
652 for (
int i = 0; i < 5; i++) {
653 for (
int j = 0; j <= i; j++) {
654 par.SetCovariance(i, j, T.C(i, j)[iVec]);
658 tr[iVec]->SetParamFirst(&par);
670 field.reserve(Tracks.size());
684 unsigned short N_vTracks = Tracks.size();
686 for (
unsigned short itrack = 0; itrack < N_vTracks; itrack +=
fvec::size()) {
687 if (N_vTracks - itrack <
static_cast<unsigned short>(
fvec::size())) {
688 nTracks_SIMD = N_vTracks - itrack;
691 for (
int i = 0; i < nTracks_SIMD; i++) {
692 tr[i] = &Tracks[itrack + i];
695 for (
int iVec = 0; iVec < nTracks_SIMD; iVec++) {
697 for (
int iH = 0; iH < 2; iH++) {
698 float posx = 0.f, posy = 0.f, posz = 0.f;
700 if (iH < nHitsTrackMvd) {
732 fB[iH + 1].
SetSimdEntry(fB_temp.GetBx()[iVec], fB_temp.GetBy()[iVec], fB_temp.GetBz()[iVec], iVec);
733 zField[iH + 1][iVec] = posz;
739 fld.Set(fB[2], zField[2], fB[1], zField[1], fB[0], zField[0]);
740 for (
int i = 0; i < nTracks_SIMD; i++) {
741 field.emplace_back(fld, i);
750 field.reserve(Tracks.size());
764 unsigned short N_vTracks = Tracks.size();
766 for (
unsigned short itrack = 0; itrack < N_vTracks; itrack +=
fvec::size()) {
767 if (N_vTracks - itrack <
static_cast<unsigned short>(
fvec::size())) {
768 nTracks_SIMD = N_vTracks - itrack;
771 for (
int i = 0; i < nTracks_SIMD; i++) {
772 tr[i] = &Tracks[itrack + i];
775 for (
int iVec = 0; iVec < nTracks_SIMD; iVec++) {
778 for (
int iH = 0; iH < 3; iH++) {
779 float posx = 0.f, posy = 0.f, posz = 0.f;
781 int hitNumber = nHits - iH - 1;
782 if (hitNumber < nHitsTrackMvd) {
801 int hitIndex = tr[iVec]->
GetStsHitIndex(hitNumber - nHitsTrackMvd);
815 fB[iH].
SetSimdEntry(fB_temp.GetBx()[iVec], fB_temp.GetBy()[iVec], fB_temp.GetBz()[iVec], iVec);
816 zField[iH][iVec] = posz;
820 fld.Set(fB[0], zField[0], fB[1], zField[1], fB[2], zField[2]);
821 for (
int i = 0; i < nTracks_SIMD; i++) {
822 field.emplace_back(fld, i);