21#include "CbmStsTrack.h"
25#include "CbmKFParticleDatabase.h"
26#include "CbmKFVertex.h"
27#include "CbmL1Track.h"
28#include "FairRootManager.h"
65 static const fvec c1 = 0.0136f, c2 = c1 * 0.038f, c3 = c2 * 0.5f, c4 = -c3 / 2.0f, c5 = c3 / 3.0f, c6 = -c3 / 4.0f;
67 fvec s0 = (c1 + c2 *
log(radThick) + c3 * h + h2 * (c4 + c5 * h + c6 * h2)) * qp0t;
68 fvec a = ((
ONE + mass2 * qp0 * qp0t) * radThick * s0 * s0);
73 T.C22 += (init & (txtx1 * a));
74 T.C32 += (init & (tx * ty * a));
75 T.C33 += (init & ((
ONE + tyty) * a));
82 static const fscal RadThick = 0.0009f;
83 static const fscal logRadThick =
log(RadThick);
94 static const fvec c1 = 0.0136f, c2 = c1 * 0.038f, c3 = c2 * 0.5f, c4 = -c3 / 2.0f, c5 = c3 / 3.0f, c6 = -c3 / 4.0f;
95 fvec s0 = (c1 + c2 * (logRadThick) + c3 * h + h2 * (c4 + c5 * h + c6 * h2)) * qp0t;
96 fvec a = ((
ONE + mass2 * qp0 * qp0t) * RadThick * s0 * s0);
99 T.C22 += (init & (txtx1 * a));
100 T.C32 += (init & (tx * ty * a));
101 T.C33 += (init & ((
ONE + tyty) * a));
129 track.
x = w * x + w1 * track.
x;
130 track.
y = w * y + w1 * track.
y;
158 track.
x = w * x + w1 * track.
x;
159 track.
y = w * y + w1 * track.
y;
166 register fvec wi, zeta, zetawi, HCH;
167 register fvec F0, F1, F2, F3, F4;
168 register fvec K1, K2, K3, K4;
182 wi = 1. / (info.
sigma2 + HCH);
187 T.chi2 += zeta * zetawi;
201 T.C00 -= F0 * F0 * wi;
223 fvec mass2 = mass * mass;
248 fvec fz0, fz1, fz2, dz, z_start, z_end;
252 unsigned short N_vTracks = Tracks.size();
254 for (
unsigned short itrack = 0; itrack < N_vTracks; itrack++) {
255 Tracks[itrack].mass = mass[0];
258 for (
unsigned short itrack = 0; itrack < N_vTracks; itrack +=
fvecLen) {
259 if (N_vTracks - itrack <
static_cast<unsigned short>(
fvecLen))
260 nTracks_SIMD = N_vTracks - itrack;
262 for (
i = 0;
i < nTracks_SIMD;
i++) {
263 t[
i] = &Tracks[itrack +
i];
288 for (
i = 0;
i < nHits;
i++) {
293 for (iVec = 0; iVec < nTracks_SIMD; iVec++) {
295 for (
i = 0;
i < nHitsTrack;
i++) {
296 float posx = 0.f, posy = 0.f, posz = 0.f;
303 ista = posz < 7.f ? 0 : 1;
314 x[ista][iVec] = posx;
315 y[ista][iVec] = posy;
318 z[ista][iVec] = posz;
320 fB[ista].
x[iVec] = fB_temp.x[iVec];
321 fB[ista].
y[iVec] = fB_temp.y[iVec];
322 fB[ista].
z[iVec] = fB_temp.z[iVec];
324 z_start[iVec] = posz;
325 if (
i == nHitsTrack - 1)
346 fB2.Combine(fB[
i - 2], w[
i - 2]);
347 fld.Set(fB2, fz2, fB1, fz1, fB0, fz0);
348 for (--
i;
i >= 0;
i--) {
353 fld.Set(fB0, fz0, fB1, fz1, fB2, fz2);
358 fvec w1 = (zero & initialised) + (w[
i] & (!initialised));
361 if (
i == NMvdStations - 1)
372 for (iVec = 0; iVec < nTracks_SIMD; iVec++) {
373 t[iVec]->
T[0] =
T.x[iVec];
374 t[iVec]->
T[1] =
T.y[iVec];
375 t[iVec]->
T[2] =
T.tx[iVec];
376 t[iVec]->
T[3] =
T.ty[iVec];
377 t[iVec]->
T[4] =
T.qp[iVec];
379 t[iVec]->
T[5] =
T.z[iVec];
381 t[iVec]->
C[0] =
T.C00[iVec];
382 t[iVec]->
C[1] =
T.C10[iVec];
383 t[iVec]->
C[2] =
T.C11[iVec];
384 t[iVec]->
C[3] =
T.C20[iVec];
385 t[iVec]->
C[4] =
T.C21[iVec];
386 t[iVec]->
C[5] =
T.C22[iVec];
387 t[iVec]->
C[6] =
T.C30[iVec];
388 t[iVec]->
C[7] =
T.C31[iVec];
389 t[iVec]->
C[8] =
T.C32[iVec];
390 t[iVec]->
C[9] =
T.C33[iVec];
391 t[iVec]->
C[10] =
T.C40[iVec];
392 t[iVec]->
C[11] =
T.C41[iVec];
393 t[iVec]->
C[12] =
T.C42[iVec];
394 t[iVec]->
C[13] =
T.C43[iVec];
395 t[iVec]->
C[14] =
T.C44[iVec];
397 t[iVec]->
chi2 =
T.chi2[iVec];
398 t[iVec]->
NDF =
static_cast<int>(
T.NDF[iVec]);
415 fB2.Combine(fB[
i + 2], w[
i + 2]);
416 fld.Set(fB2, fz2, fB1, fz1, fB0, fz0);
418 for (++
i;
i < nHits;
i++) {
423 fld.Set(fB0, fz0, fB1, fz1, fB2, fz2);
428 fvec w1 = (zero & initialised) + (w[
i] & (!initialised));
431 if (
i == NMvdStations)
443 for (iVec = 0; iVec < nTracks_SIMD; iVec++) {
444 t[iVec]->
TLast[0] =
T.x[iVec];
445 t[iVec]->
TLast[1] =
T.y[iVec];
446 t[iVec]->
TLast[2] =
T.tx[iVec];
447 t[iVec]->
TLast[3] =
T.ty[iVec];
448 t[iVec]->
TLast[4] =
T.qp[iVec];
450 t[iVec]->
TLast[5] =
T.z[iVec];
452 t[iVec]->
CLast[0] =
T.C00[iVec];
453 t[iVec]->
CLast[1] =
T.C10[iVec];
454 t[iVec]->
CLast[2] =
T.C11[iVec];
455 t[iVec]->
CLast[3] =
T.C20[iVec];
456 t[iVec]->
CLast[4] =
T.C21[iVec];
457 t[iVec]->
CLast[5] =
T.C22[iVec];
458 t[iVec]->
CLast[6] =
T.C30[iVec];
459 t[iVec]->
CLast[7] =
T.C31[iVec];
460 t[iVec]->
CLast[8] =
T.C32[iVec];
461 t[iVec]->
CLast[9] =
T.C33[iVec];
462 t[iVec]->
CLast[10] =
T.C40[iVec];
463 t[iVec]->
CLast[11] =
T.C41[iVec];
464 t[iVec]->
CLast[12] =
T.C42[iVec];
465 t[iVec]->
CLast[13] =
T.C43[iVec];
466 t[iVec]->
CLast[14] =
T.C44[iVec];
468 t[iVec]->
chi2 =
T.chi2[iVec];
469 t[iVec]->
NDF =
static_cast<int>(
T.NDF[iVec]);
484 vector<L1FieldRegion> B;
496 for (
int iSta = 0; iSta < nStations; iSta++)
497 zSta[iSta] = sta[iSta].z;
499 unsigned short N_vTracks = Tracks.size();
501 for (
unsigned short itrack = 0; itrack < N_vTracks; itrack +=
fvecLen) {
502 if (N_vTracks - itrack <
static_cast<unsigned short>(
fvecLen))
503 nTracks_SIMD = N_vTracks - itrack;
506 for (
int iVec = 0; iVec < nTracks_SIMD; iVec++) {
507 t[iVec] = &Tracks[itrack + iVec];
508 T.x[iVec] = t[iVec]->
T[0];
509 T.y[iVec] = t[iVec]->
T[1];
510 T.tx[iVec] = t[iVec]->
T[2];
511 T.ty[iVec] = t[iVec]->
T[3];
512 T.qp[iVec] = t[iVec]->
T[4];
513 T.z[iVec] = t[iVec]->
T[5];
514 T.C00[iVec] = t[iVec]->
C[0];
515 T.C10[iVec] = t[iVec]->
C[1];
516 T.C11[iVec] = t[iVec]->
C[2];
517 T.C20[iVec] = t[iVec]->
C[3];
518 T.C21[iVec] = t[iVec]->
C[4];
519 T.C22[iVec] = t[iVec]->
C[5];
520 T.C30[iVec] = t[iVec]->
C[6];
521 T.C31[iVec] = t[iVec]->
C[7];
522 T.C32[iVec] = t[iVec]->
C[8];
523 T.C33[iVec] = t[iVec]->
C[9];
524 T.C40[iVec] = t[iVec]->
C[10];
525 T.C41[iVec] = t[iVec]->
C[11];
526 T.C42[iVec] = t[iVec]->
C[12];
527 T.C43[iVec] = t[iVec]->
C[13];
528 T.C44[iVec] = t[iVec]->
C[14];
529 mass2[iVec] = t[iVec]->
mass * t[iVec]->
mass;
532 L1FieldRegion& fld = B[itrack /
fvecLen];
533 for (
int iSt = nStations - 4; iSt >= 0; iSt--) {
536 fvec initialized =
fvec(
T.z > (zSta[iSt] + 2.5));
537 w =
fvec(w & initialized);
540 if (iSt == NMvdStations - 1)
545 if (NMvdStations <= 0)
553 fvec c[3] = {
T.C00,
T.C10,
T.C11};
557 fvec d = c[0] * c[2] - c[1] * c[1];
558 fvec chi =
sqrt(
fabs(0.5 * (dx * dx * c[0] - 2 * dx * dy * c[1] + dy * dy * c[2]) / d));
562 for (
int iVec = 0; iVec < nTracks_SIMD; iVec++)
563 chiToVtx.push_back(chi[iVec]);
586 unsigned short N_vTracks = Tracks.size();
588 for (
unsigned short itrack = 0; itrack < N_vTracks; itrack +=
fvecLen) {
589 if (N_vTracks - itrack <
static_cast<unsigned short>(
fvecLen))
590 nTracks_SIMD = N_vTracks - itrack;
592 for (
int i = 0;
i < nTracks_SIMD;
i++)
593 t[
i] = &Tracks[itrack +
i];
595 for (
int iVec = 0; iVec < nTracks_SIMD; iVec++) {
596 for (
int iH = 0; iH < 2; iH++)
598 float posx = 0.f, posy = 0.f, posz = 0.f;
605 ista = posz < 7.f ? 0 : 1;
614 fB[iH + 1].
x[iVec] = fB_temp.x[iVec];
615 fB[iH + 1].
y[iVec] = fB_temp.y[iVec];
616 fB[iH + 1].
z[iVec] = fB_temp.z[iVec];
617 zField[iH + 1][iVec] = posz;
623 fld.
Set(fB[2], zField[2], fB[1], zField[1], fB[0], zField[0]);
624 field.push_back(fld);
635 fvec mass2 = mass * mass;
640 FairRootManager* fManger = FairRootManager::Instance();
641 TClonesArray* listStsHits = (TClonesArray*)fManger->GetObject(
"StsHit");
643 TClonesArray* listMvdHits = 0;
644 if (NMvdStations > 0.)
645 listMvdHits = (TClonesArray*)fManger->GetObject(
"MvdHit");
663 fvec fz0, fz1, fz2, dz, z_start, z_end;
664 L1FieldValue* fB =
new L1FieldValue[nHits];
667 unsigned short N_vTracks = Tracks.size();
669 for (
unsigned short itrack = 0; itrack < N_vTracks; itrack++) {
670 Tracks[itrack].SetPidHypo(pidHypo);
673 for (
unsigned short itrack = 0; itrack < N_vTracks; itrack +=
fvecLen) {
674 if (N_vTracks - itrack <
static_cast<unsigned short>(
fvecLen))
675 nTracks_SIMD = N_vTracks - itrack;
677 for (
i = 0;
i < nTracks_SIMD;
i++) {
678 t[
i] = &Tracks[itrack +
i];
703 for (
i = 0;
i < nHits;
i++) {
708 for (iVec = 0; iVec < nTracks_SIMD; iVec++) {
711 int nHitsTrack = nHitsTrackMvd + nHitsTrackSts;
712 for (
i = 0;
i < nHitsTrack;
i++) {
713 float posx = 0.f, posy = 0.f, posz = 0.f;
715 if (
i < nHitsTrackMvd) {
724 ista = posz < 7.f ? 0 : 1;
739 x[ista][iVec] = posx;
740 y[ista][iVec] = posy;
743 z[ista][iVec] = posz;
745 fB[ista].
x[iVec] = fB_temp.x[iVec];
746 fB[ista].
y[iVec] = fB_temp.y[iVec];
747 fB[ista].
z[iVec] = fB_temp.z[iVec];
749 z_start[iVec] = posz;
750 if (
i == nHitsTrack - 1)
771 fB2.Combine(fB[
i - 2], w[
i - 2]);
772 fld.
Set(fB2, fz2, fB1, fz1, fB0, fz0);
773 for (--
i;
i >= 0;
i--) {
778 fld.
Set(fB0, fz0, fB1, fz1, fB2, fz2);
783 fvec w1 = (zero & initialised) + (w[
i] & (!initialised));
786 if (
i == NMvdStations - 1)
797 for (iVec = 0; iVec < nTracks_SIMD; iVec++) {
823 t[iVec]->
SetNDF(
static_cast<int>(
T.NDF[iVec]));
840 fB2.Combine(fB[
i + 2], w[
i + 2]);
841 fld.
Set(fB2, fz2, fB1, fz1, fB0, fz0);
843 for (++
i;
i < nHits;
i++) {
848 fld.
Set(fB0, fz0, fB1, fz1, fB2, fz2);
853 fvec w1 = (zero & initialised) + (w[
i] & (!initialised));
856 if (
i == NMvdStations)
868 for (iVec = 0; iVec < nTracks_SIMD; iVec++) {
905 vector<L1FieldRegion>& field,
906 vector<float>& chiToVtx,
910 chiToVtx.reserve(Tracks.size());
921 for (
int iSta = 0; iSta < nStations; iSta++)
922 zSta[iSta] = sta[iSta].z;
924 field.reserve(Tracks.size());
930 FairRootManager* fManger = FairRootManager::Instance();
931 TClonesArray* listStsHits = (TClonesArray*)fManger->GetObject(
"StsHit");
932 TClonesArray* listMvdHits = 0;
933 if (NMvdStations > 0.)
934 listMvdHits = (TClonesArray*)fManger->GetObject(
"MvdHit");
936 unsigned short N_vTracks = Tracks.size();
938 for (
unsigned short itrack = 0; itrack < N_vTracks; itrack +=
fvecLen) {
939 if (N_vTracks - itrack <
static_cast<unsigned short>(
fvecLen))
940 nTracks_SIMD = N_vTracks - itrack;
943 for (
int iVec = 0; iVec < nTracks_SIMD; iVec++) {
944 t[iVec] = &Tracks[itrack + iVec];
968 mass2[iVec] = mass * mass;
971 for (
int iH = 0; iH < 2; iH++) {
972 float posx = 0.f, posy = 0.f, posz = 0.f;
974 if (iH < nHitsTrackMvd) {
983 ista = posz < 7.f ? 0 : 1;
997 fB[iH + 1].
x[iVec] = fB_temp.x[iVec];
998 fB[iH + 1].
y[iVec] = fB_temp.y[iVec];
999 fB[iH + 1].
z[iVec] = fB_temp.z[iVec];
1000 zField[iH + 1][iVec] = posz;
1006 fld.
Set(fB[2], zField[2], fB[1], zField[1], fB[0], zField[0]);
1007 field.push_back(fld);
1009 for (
int iSt = nStations - 4; iSt >= 0; iSt--) {
1012 fvec initialized =
fvec(
T.z > (zSta[iSt] + 2.5));
1013 w =
fvec(w & initialized);
1016 if (iSt == NMvdStations - 1)
1021 if (NMvdStations <= 0)
1029 fvec c[3] = {
T.C00,
T.C10,
T.C11};
1033 fvec d = c[0] * c[2] - c[1] * c[1];
1034 fvec chi =
sqrt(
fabs(0.5 * (dx * dx * c[0] - 2 * dx * dy * c[1] + dy * dy * c[2]) / d));
1038 for (
int iVec = 0; iVec < nTracks_SIMD; iVec++)
1039 chiToVtx.push_back(chi[iVec]);
1042 for (
int iVec = 0; iVec < nTracks_SIMD; iVec++) {
1043 if (chi[iVec] < chiPrim) {
1075 field.reserve(Tracks.size());
1079 FairRootManager* fManger = FairRootManager::Instance();
1080 TClonesArray* listStsHits = (TClonesArray*)fManger->GetObject(
"StsHit");
1081 TClonesArray* listMvdHits = 0;
1083 if (NMvdStations > 0.)
1084 listMvdHits = (TClonesArray*)fManger->GetObject(
"MvdHit");
1096 unsigned short N_vTracks = Tracks.size();
1098 for (
unsigned short itrack = 0; itrack < N_vTracks; itrack +=
fvecLen) {
1099 if (N_vTracks - itrack <
static_cast<unsigned short>(
fvecLen))
1100 nTracks_SIMD = N_vTracks - itrack;
1102 for (
int i = 0;
i < nTracks_SIMD;
i++)
1103 t[
i] = &Tracks[itrack +
i];
1105 for (
int iVec = 0; iVec < nTracks_SIMD; iVec++) {
1107 for (
int iH = 0; iH < 2; iH++) {
1108 float posx = 0.f, posy = 0.f, posz = 0.f;
1110 if (iH < nHitsTrackMvd) {
1119 ista = posz < 7.f ? 0 : 1;
1133 fB[iH + 1].
x[iVec] = fB_temp.x[iVec];
1134 fB[iH + 1].
y[iVec] = fB_temp.y[iVec];
1135 fB[iH + 1].
z[iVec] = fB_temp.z[iVec];
1136 zField[iH + 1][iVec] = posz;
1142 fld.
Set(fB[2], zField[2], fB[1], zField[1], fB[0], zField[0]);
1143 field.push_back(fld);
friend F32vec4 fabs(const F32vec4 &a)
static CbmKFParticleDatabase * Instance()
Double_t & GetRefX()
I/O parameters for vertex fit routines.
Double_t * GetCovMatrix()
void Filter(L1TrackPar &T, L1UMeasurementInfo &info, fvec &u, fvec &w)
void AddPipeMaterial(L1TrackPar &T, fvec qp0, fvec &mass2, fvec &w)
void GetChiToVertex(std::vector< CbmL1Track > &Tracks, std::vector< float > &chiToVtx, CbmKFVertex &primVtx)
void AddMaterial(L1TrackPar &T, fvec radThick, fvec qp0, fvec &mass2, fvec &w)
void FilterLast(L1TrackPar &track, fvec &x, fvec &y, fvec &w, L1Station &st)
void CalculateFieldRegion(std::vector< CbmL1Track > &Tracks, std::vector< L1FieldRegion > &Field)
void Fit(std::vector< CbmL1Track > &Tracks, fvec mass=0.1395679f)
void FilterFirst(L1TrackPar &track, fvec &x, fvec &y, fvec &w, L1Station &st)
int GetNOfHits()
Number of Degrees of Freedom after fit.
static CbmL1 * Instance()
reconstructed tracks
vector< CbmL1HitStore > vHitStore
TClonesArray * listMvdHits
Mvd MC points.
TClonesArray * listStsHits
virtual Int_t GetStationNr() const
FairTrackParam * GetParamLast()
Int_t GetNMvdHits() const
Int_t GetMvdHitIndex(Int_t iHit) const
void SetChi2(Double_t chi2)
Int_t GetNStsHits() const
Accessors.
Int_t GetStsHitIndex(Int_t iHit) const
FairTrackParam * GetParamFirst()
L1FieldValue GetvtxFieldValue()
void Set(const L1FieldValue &B0, const fvec B0z, const L1FieldValue &B1, const fvec B1z, const L1FieldValue &B2, const fvec B2z)
void GetFieldValue(const fvec &x, const fvec &y, L1FieldValue &B) const
void Combine(L1FieldValue &B, fvec w)
L1XYMeasurementInfo XYInfo
L1UMeasurementInfo backInfo
L1UMeasurementInfo frontInfo
static TDatabasePDG * Instance()
TParticlePDG * GetParticle(const char *name) const
TObject * At(Int_t idx) const override
RVec< PromoteType< T > > log(const RVec< T > &v)
RVec< PromoteType< T > > sqrt(const RVec< T > &v)