175 const std::vector<CbmStsHit>& vStsHits,
const std::vector<int>& pidHypo)
198 const auto& sta = rActSetup.GetActiveLayers();
209 fvec x_first, y_first, t_first, x_last, y_last, t_last;
211 fvec dt2_first, dt2_last;
213 fvec z0, z1, z2, dz, z_start, z_end;
217 unsigned short N_vTracks = Tracks.size();
220 for (
unsigned short itrack = 0; itrack < N_vTracks; itrack++) {
221 Tracks[itrack].SetPidHypo(pidHypo[itrack]);
224 fvec mass = 0.000511f;
226 for (
unsigned short itrack = 0; itrack < N_vTracks; itrack +=
fvec::size()) {
230 T.ResetErrors(1.e2, 1.e2, 1., 1., 1., 1.e6, 1.e2);
232 if (N_vTracks - itrack <
static_cast<unsigned short>(
fvec::size())) {
233 nTracks_SIMD = N_vTracks - itrack;
235 for (
int iVec = 0; iVec < nTracks_SIMD; iVec++) {
236 tr[iVec] = &Tracks[itrack + iVec];
237 T.X()[iVec] = tr[iVec]->GetParamFirst()->GetX();
238 T.Y()[iVec] = tr[iVec]->GetParamFirst()->GetY();
239 T.Tx()[iVec] = tr[iVec]->GetParamFirst()->GetTx();
240 T.Ty()[iVec] = tr[iVec]->GetParamFirst()->GetTy();
241 T.Qp()[iVec] = tr[iVec]->GetParamFirst()->GetQp();
244 T.Z()[iVec] = tr[iVec]->GetParamFirst()->GetZ();
246 for (
int i = 0; i < 5; i++) {
247 for (
int j = 0; j <= i; j++) {
248 T.C(i, j)[iVec] = tr[iVec]->GetParamFirst()->GetCovariance(i, j);
252 int pid = pidHypo[itrack + iVec];
257 mass[iVec] = KFParticleDatabase::Instance()->GetMass(pid);
263 for (
int i = 0; i < nHits; i++) {
265 z[i] = sta[i].GetZref();
278 fB[i].
Set(zeroB, zeroB, zeroB, z[i]);
281 for (
int iVec = 0; iVec < nTracks_SIMD; iVec++) {
282 int nHitsTrackMvd = tr[iVec]->GetNofMvdHits();
283 int nHitsTrackSts = tr[iVec]->GetNofStsHits();
284 int nHitsTrack = nHitsTrackMvd + nHitsTrackSts;
285 for (
int i = 0; i < nHitsTrack; i++) {
288 if (i < nHitsTrackMvd) {
289 int hitIndex = tr[iVec]->GetMvdHitIndex(i);
290 const CbmMvdHit* mvdHit = &(vMvdHits[hitIndex]);
298 int hitIndex = tr[iVec]->GetStsHitIndex(i - nHitsTrackMvd);
299 const CbmStsHit* stsHit = &(vStsHits[hitIndex]);
307 x[ista][iVec] = hit->
GetX();
308 y[ista][iVec] = hit->
GetY();
309 z[ista][iVec] = hit->
GetZ();
310 t[ista][iVec] = hit->
GetTime();
312 mxy[ista].
X()[iVec] = hit->
GetX();
313 mxy[ista].
Y()[iVec] = hit->
GetY();
317 mxy[ista].
NdfX()[iVec] = 1.;
318 mxy[ista].
NdfY()[iVec] = 1.;
321 w[ista][iVec] =
true;
324 fB_temp = rActSetup.GetField().GetFieldValue(ista,
x[ista],
y[ista]);
325 fB[ista].
SetSimdEntry(fB_temp.GetBx()[iVec], fB_temp.GetBy()[iVec], fB_temp.GetBz()[iVec], fB_temp.GetZ()[iVec],
328 z_start[iVec] = z[ista][iVec];
329 x_first[iVec] =
x[ista][iVec];
330 y_first[iVec] =
y[ista][iVec];
331 t_first[iVec] = t[ista][iVec];
332 mxy_first.
X()[iVec] = mxy[ista].
X()[iVec];
333 mxy_first.
Y()[iVec] = mxy[ista].
Y()[iVec];
334 mxy_first.
Dx2()[iVec] = mxy[ista].
Dx2()[iVec];
335 mxy_first.
Dy2()[iVec] = mxy[ista].
Dy2()[iVec];
336 mxy_first.
Dxy()[iVec] = mxy[ista].
Dxy()[iVec];
337 mxy_first.
NdfX()[iVec] = mxy[ista].
NdfX()[iVec];
338 mxy_first.
NdfY()[iVec] = mxy[ista].
NdfY()[iVec];
339 dt2_first[iVec] = dt2[ista][iVec];
341 if (i == nHitsTrack - 1) {
342 z_end[iVec] = z[ista][iVec];
343 x_last[iVec] =
x[ista][iVec];
344 y_last[iVec] =
y[ista][iVec];
345 t_last[iVec] = t[ista][iVec];
346 mxy_last.
X()[iVec] = mxy[ista].
X()[iVec];
347 mxy_last.
Y()[iVec] = mxy[ista].
Y()[iVec];
348 mxy_last.
Dx2()[iVec] = mxy[ista].
Dx2()[iVec];
349 mxy_last.
Dy2()[iVec] = mxy[ista].
Dy2()[iVec];
350 mxy_last.
Dxy()[iVec] = mxy[ista].
Dxy()[iVec];
351 mxy_last.
NdfX()[iVec] = mxy[ista].
NdfX()[iVec];
352 mxy_last.
NdfY()[iVec] = mxy[ista].
NdfY()[iVec];
353 dt2_last[iVec] = dt2[ista][iVec];
366 b1 = rActSetup.GetField().GetFieldValue(i, T.X(), T.Y());
370 b2 = rActSetup.GetField().GetFieldValue(i + 2, T.X() + T.Tx() * dz, T.Y() + T.Ty() * dz);
371 b2.SetSimdEntries(fB[i + 2], w[i + 2]);
373 for (++i; i < nHits; i++) {
376 b0 = rActSetup.GetField().GetFieldValue(i, T.X() - T.Tx() * dz, T.Y() - T.Ty() * dz);
380 fmask initialised = (z[i] <= z_end) & (z_start < z[i]);
384 auto radThick = rActSetup.GetMaterial(i).GetThicknessX0(fit.
Tr().
X(), fit.
Tr().
Y());
388 fit.
SetMask(initialised && w[i]);
399 for (
int iVec = 0; iVec < nTracks_SIMD; iVec++) {
401 par.SetX(T.X()[iVec]);
402 par.SetY(T.Y()[iVec]);
403 par.SetTx(T.Tx()[iVec]);
404 par.SetTy(T.Ty()[iVec]);
405 par.SetQp(T.Qp()[iVec]);
406 par.SetZ(T.Z()[iVec]);
408 for (
int k = 0; k < 5; k++) {
409 for (
int j = 0; j <= k; j++) {
410 par.SetCovariance(k, j, Tout.C(k, j)[iVec]);
414 tr[iVec]->SetParamLast(&par);
426 b1 = rActSetup.GetField().GetFieldValue(i, T.X(), T.Y());
431 b2 = rActSetup.GetField().GetFieldValue(i - 2, T.X() + T.Tx() * dz, T.Y() + T.Ty() * dz);
432 b2.SetSimdEntries(fB[i - 2], w[i - 2]);
434 for (--i; i >= 0; i--) {
437 b0 = rActSetup.GetField().GetFieldValue(i, T.X() - T.Tx() * dz, T.Y() - T.Ty() * dz);
441 fmask initialised = (z[i] < z_end) & (z_start <= z[i]);
445 auto radThick = rActSetup.GetMaterial(i).GetThicknessX0(fit.
Tr().
X(), fit.
Tr().
Y());
449 fit.
SetMask(initialised && w[i]);
459 for (
int iVec = 0; iVec < nTracks_SIMD; iVec++) {
461 par.SetX(T.X()[iVec]);
462 par.SetY(T.Y()[iVec]);
463 par.SetTx(T.Tx()[iVec]);
464 par.SetTy(T.Ty()[iVec]);
465 par.SetQp(T.Qp()[iVec]);
466 par.SetZ(T.Z()[iVec]);
468 for (
int k = 0; k < 5; k++) {
469 for (
int j = 0; j <= k; j++) {
470 par.SetCovariance(k, j, T.C(k, j)[iVec]);
474 tr[iVec]->SetParamFirst(&par);
476 tr[iVec]->SetChiSq(T.ChiSq()[iVec]);
477 tr[iVec]->SetNDF(
static_cast<int>(T.Ndf()[iVec]));
514 chiToVtx.reserve(Tracks.size());
525 const auto& sta = rActSetup.GetActiveLayers();
527 for (
int iSta = 0; iSta < nStations; iSta++) {
528 zSta[iSta] = sta[iSta].GetZref();
531 field.reserve(Tracks.size());
536 unsigned short N_vTracks = Tracks.size();
538 for (
unsigned short itrack = 0; itrack < N_vTracks; itrack +=
fvec::size()) {
539 if (N_vTracks - itrack <
static_cast<unsigned short>(
fvec::size())) {
540 nTracks_SIMD = N_vTracks - itrack;
544 for (
int iVec = 0; iVec < nTracks_SIMD; iVec++) {
545 tr[iVec] = &Tracks[itrack + iVec];
546 T.X()[iVec] = tr[iVec]->GetParamFirst()->GetX();
547 T.Y()[iVec] = tr[iVec]->GetParamFirst()->GetY();
548 T.Tx()[iVec] = tr[iVec]->GetParamFirst()->GetTx();
549 T.Ty()[iVec] = tr[iVec]->GetParamFirst()->GetTy();
550 T.Qp()[iVec] = tr[iVec]->GetParamFirst()->GetQp();
551 T.Z()[iVec] = tr[iVec]->GetParamFirst()->GetZ();
553 for (
int i = 0; i < 5; i++) {
554 for (
int j = 0; j <= i; j++) {
555 T.C(i, j)[iVec] = tr[iVec]->GetParamFirst()->GetCovariance(i, j);
560 const float mass = KFParticleDatabase::Instance()->GetMass(tr[iVec]->GetPidHypo());
561 mass2[iVec] = mass * mass;
563 int nHitsTrackMvd = tr[iVec]->GetNofMvdHits();
564 for (
int iH = 0; iH < 2; iH++) {
565 float posx = 0.f, posy = 0.f;
567 if (iH < nHitsTrackMvd) {
571 int hitIndex = tr[iVec]->GetMvdHitIndex(iH);
585 int hitIndex = tr[iVec]->GetStsHitIndex(iH - nHitsTrackMvd);
596 fB_temp = rActSetup.GetField().GetFieldValue(ista, posx, posy);
597 fB[iH + 1].
SetSimdEntry(fB_temp.GetBx()[iVec], fB_temp.GetBy()[iVec], fB_temp.GetBz()[iVec],
598 fB_temp.GetZ()[iVec], iVec);
602 const auto& trg = rActSetup.GetTarget();
603 fB[0] = rActSetup.GetField().GetPrimVertexField().
Get(trg.GetX(), trg.GetY(), trg.GetZ());
604 fld.Set(fB[2], fB[1], fB[0]);
605 for (
int i = 0; i < nTracks_SIMD; i++) {
606 field.emplace_back(fld, i);
611 for (
int iSt = nStations - 4; iSt >= 0; iSt--) {
614 auto radThick = rActSetup.GetMaterial(iSt).GetThicknessX0(fit.
Tr().
X(), fit.
Tr().
Y());
622 constexpr float targetRadThick = 3.73e-2f * 2;
631 fvec c[3] = {T.C00(), T.C10(), T.C11()};
635 fvec d = c[0] * c[2] - c[1] * c[1];
639 for (
int iVec = 0; iVec < nTracks_SIMD; iVec++) {
640 chiToVtx.push_back(chi[iVec]);
644 for (
int iVec = 0; iVec < nTracks_SIMD; iVec++) {
645 if (chi[iVec] < chiPrim) {
647 par.SetX(T.X()[iVec]);
648 par.SetY(T.Y()[iVec]);
649 par.SetTx(T.Tx()[iVec]);
650 par.SetTy(T.Ty()[iVec]);
651 par.SetQp(T.Qp()[iVec]);
652 par.SetZ(T.Z()[iVec]);
654 for (
int i = 0; i < 5; i++) {
655 for (
int j = 0; j <= i; j++) {
656 par.SetCovariance(i, j, T.C(i, j)[iVec]);
660 tr[iVec]->SetParamFirst(&par);
672 field.reserve(Tracks.size());
685 unsigned short N_vTracks = Tracks.size();
687 for (
unsigned short itrack = 0; itrack < N_vTracks; itrack +=
fvec::size()) {
688 if (N_vTracks - itrack <
static_cast<unsigned short>(
fvec::size())) {
689 nTracks_SIMD = N_vTracks - itrack;
692 for (
int i = 0; i < nTracks_SIMD; i++) {
693 tr[i] = &Tracks[itrack + i];
696 for (
int iVec = 0; iVec < nTracks_SIMD; iVec++) {
698 for (
int iH = 0; iH < 2; iH++) {
699 float posx = 0.f, posy = 0.f;
701 if (iH < nHitsTrackMvd) {
730 fB_temp = rActSetup.GetField().GetFieldValue(ista, posx, posy);
731 fB[iH + 1].
SetSimdEntry(fB_temp.GetBx()[iVec], fB_temp.GetBy()[iVec], fB_temp.GetBz()[iVec],
732 fB_temp.GetZ()[iVec], iVec);
736 const auto& trg = rActSetup.GetTarget();
737 fB[0] = rActSetup.GetField().GetPrimVertexField().
Get(trg.GetX(), trg.GetY(), trg.GetZ());
738 fld.Set(fB[2], fB[1], fB[0]);
739 for (
int i = 0; i < nTracks_SIMD; i++) {
740 field.emplace_back(fld, i);
749 field.reserve(Tracks.size());
763 unsigned short N_vTracks = Tracks.size();
765 for (
unsigned short itrack = 0; itrack < N_vTracks; itrack +=
fvec::size()) {
766 if (N_vTracks - itrack <
static_cast<unsigned short>(
fvec::size())) {
767 nTracks_SIMD = N_vTracks - itrack;
770 for (
int i = 0; i < nTracks_SIMD; i++) {
771 tr[i] = &Tracks[itrack + i];
774 for (
int iVec = 0; iVec < nTracks_SIMD; iVec++) {
777 for (
int iH = 0; iH < 3; iH++) {
778 float posx = 0.f, posy = 0.f, posz = 0.f;
780 int hitNumber = nHits - iH - 1;
781 if (hitNumber < nHitsTrackMvd) {
800 int hitIndex = tr[iVec]->
GetStsHitIndex(hitNumber - nHitsTrackMvd);
812 fB_temp = rActSetup.GetField().GetFieldValue(ista, posx, posy);
814 fB[iH].
SetSimdEntry(fB_temp.GetBx()[iVec], fB_temp.GetBy()[iVec], fB_temp.GetBz()[iVec], fB_temp.GetZ()[iVec],
816 zField[iH][iVec] = posz;
820 fld.Set(fB[0], fB[1], fB[2]);
821 for (
int i = 0; i < nTracks_SIMD; i++) {
822 field.emplace_back(fld, i);