From 17ed65c48a45eb17e5d21e8e881c2938ab9608d5 Mon Sep 17 00:00:00 2001
From: "se.gorbunov" <se.gorbunov@gsi.de>
Date: Thu, 9 Feb 2023 16:23:11 +0000
Subject: [PATCH] L1 fit: unify fit routines

---
 reco/L1/CbmL1.cxx                        |   2 +-
 reco/L1/CbmL1Hit.h                       |   2 +-
 reco/L1/CbmL1Performance.cxx             |  71 +++---
 reco/L1/L1Algo/L1Algo.h                  |   2 +-
 reco/L1/L1Algo/L1BranchExtender.cxx      |  95 ++++----
 reco/L1/L1Algo/L1CATrackFinder.cxx       |  88 +++----
 reco/L1/L1Algo/L1CloneMerger.cxx         |  21 +-
 reco/L1/L1Algo/L1TrackFitter.cxx         | 282 -----------------------
 reco/L1/L1Algo/L1TrackPar.h              | 112 ++++-----
 reco/L1/L1Algo/L1TrackParFit.cxx         | 159 ++++++++++++-
 reco/L1/L1Algo/L1TrackParFit.h           |  72 +++++-
 reco/L1/ParticleFinder/CbmL1PFFitter.cxx | 282 +++++++++++------------
 12 files changed, 544 insertions(+), 644 deletions(-)

diff --git a/reco/L1/CbmL1.cxx b/reco/L1/CbmL1.cxx
index eabdfb260f..fa44b00e76 100644
--- a/reco/L1/CbmL1.cxx
+++ b/reco/L1/CbmL1.cxx
@@ -926,7 +926,7 @@ void CbmL1::Reconstruct(CbmEvent* event)
   else {
     fvSortedStsHitsIndexes.clear();
     fvSortedStsHitsIndexes.reserve(nStsHits);
-    for (unsigned int i = 0; i < nStsHits; i++)
+    for (int i = 0; i < nStsHits; i++)
       fvSortedStsHitsIndexes.push_back(i);
   }
   // -----------------------------------------------------------------------
diff --git a/reco/L1/CbmL1Hit.h b/reco/L1/CbmL1Hit.h
index 4f7e645b46..64b274f706 100644
--- a/reco/L1/CbmL1Hit.h
+++ b/reco/L1/CbmL1Hit.h
@@ -18,7 +18,7 @@ public:
 
   int hitId    = 0;    ///< index of L1Hit in fInputData::fvHits array. Should be equal to index of this in L1->vHits
   int extIndex = 0;    ///< index of hit in the TClonesArray array
-  int Det      = 0;    ///< station index
+  int Det      = 0;    ///< detector ID (mvd/sts/etc)
   float x      = 0.f;  ///< measured X coordinate
   float y      = 0.f;  ///< measured Y coordinate
   float t      = 0.f;  ///< measured time
diff --git a/reco/L1/CbmL1Performance.cxx b/reco/L1/CbmL1Performance.cxx
index 5b38e7d06c..08af527039 100644
--- a/reco/L1/CbmL1Performance.cxx
+++ b/reco/L1/CbmL1Performance.cxx
@@ -56,9 +56,7 @@
 
 #include "L1Algo/L1Algo.h"
 #include "L1Algo/L1Def.h"
-#include "L1Algo/L1Extrapolation.h"  // for vertex pulls
-#include "L1Algo/L1Fit.h"            // for vertex pulls
-
+#include "L1Algo/L1TrackParFit.h"
 
 using std::cout;
 using std::endl;
@@ -1103,10 +1101,9 @@ void CbmL1::TrackFitPerformance()
 
   static bool first_call = 1;
 
-  L1Fit fit;
+  L1TrackParFit fit;
   fit.SetParticleMass(fpAlgo->GetDefaultParticleMass());
 
-
   if (first_call) {
     first_call = 0;
 
@@ -1231,16 +1228,19 @@ void CbmL1::TrackFitPerformance()
 
       CbmL1MCTrack mc = *(it->GetMCTracks()[0]);
 
-      L1TrackPar trPar(it->T, it->C);
+      {
+        L1TrackPar trPar(it->T, it->C);
+        fit.fTr = trPar;
+      }
+      fit.fQp0             = fit.fTr.qp;
+      const L1TrackPar& tr = fit.fTr;
 
       L1FieldRegion fld _fvecalignment;
       fld.SetUseOriginalField();
 
       CbmL1MCPoint& mcP = fvMCPoints[mc.Points[0]];
 
-      L1Extrapolate(trPar, mcP.zIn, trPar.qp, fld);
-
-      const L1TrackPar& tr = trPar;
+      fit.Extrapolate(mcP.zIn, fit.fQp0, fld, fvec::One());
 
       double dx = tr.x[0] - mcP.xIn;
       double dy = tr.y[0] - mcP.yIn;
@@ -1334,14 +1334,19 @@ void CbmL1::TrackFitPerformance()
       const int last_station = fvHitStore[it->Hits.back()].iStation;
 
       CbmL1MCTrack mc = *(it->GetMCTracks()[0]);
-      L1TrackPar trPar(it->TLast, it->CLast);
+
       L1FieldRegion fld _fvecalignment;
       fld.SetUseOriginalField();
 
-      CbmL1MCPoint& mcP = fvMCPoints[iMC];
-      L1Extrapolate(trPar, mcP.zOut, trPar.qp, fld);
+      {
+        L1TrackPar trPar(it->TLast, it->CLast);
+        fit.fTr = trPar;
+      }
+      fit.fQp0             = fit.fTr.qp;
+      const L1TrackPar& tr = fit.fTr;
 
-      const L1TrackPar& tr = trPar;
+      CbmL1MCPoint& mcP = fvMCPoints[iMC];
+      fit.Extrapolate(mcP.zOut, fit.fQp0, fld, fvec::One());
 
       h_fitL[0]->Fill((tr.x[0] - mcP.xOut) * 1.e4);
       h_fitL[1]->Fill((tr.y[0] - mcP.yOut) * 1.e4);
@@ -1389,7 +1394,12 @@ void CbmL1::TrackFitPerformance()
 
     {  // vertex
       CbmL1MCTrack mc = *(it->GetMCTracks()[0]);
-      L1TrackPar trPar(it->T, it->C);
+      {
+        L1TrackPar trTmp(it->T, it->C);
+        fit.fTr = trTmp;
+      }
+      fit.fQp0       = fit.fTr.qp;
+      L1TrackPar& tr = fit.fTr;
 
       //      if (mc.mother_ID != -1) {  // secondary
       if (!mc.IsPrimary()) {  // secondary
@@ -1397,7 +1407,7 @@ void CbmL1::TrackFitPerformance()
         {  // extrapolate to vertex
           L1FieldRegion fld _fvecalignment;
           fld.SetUseOriginalField();
-          L1Extrapolate(trPar, mc.z, trPar.qp, fld);
+          fit.Extrapolate(mc.z, fit.fQp0, fld, fvec::One());
           // add material
           const int fSta = fvHitStore[it->Hits[0]].iStation;
           const int dir  = int((mc.z - fpAlgo->GetParameters()->GetStation(fSta).fZ[0])
@@ -1407,15 +1417,11 @@ void CbmL1::TrackFitPerformance()
                                          && (dir * (mc.z - fpAlgo->GetParameters()->GetStation(iSta).fZ[0]) > 0);
                iSta += dir) {
             //           cout << iSta << " " << dir << endl;
-            fit.L1AddMaterial(trPar, fpAlgo->GetParameters()->GetMaterialThickness(iSta, trPar.x, trPar.y), trPar.qp,
-                              fvec::One());
-
-            if (iSta + dir == fNMvdStations - 1) fit.L1AddPipeMaterial(trPar, trPar.qp, 1);
+            fit.AddMsInMaterial(fpAlgo->GetParameters()->GetMaterialThickness(iSta, fit.fTr.x, fit.fTr.y), fit.fQp0,
+                                fvec::One());
           }
         }
-        if (mc.z != trPar.z[0]) continue;
-
-        const L1TrackPar& tr = trPar;
+        if (mc.z != tr.z[0]) continue;
 
         //       static int good = 0;
         //       static int bad = 0;
@@ -1463,21 +1469,16 @@ void CbmL1::TrackFitPerformance()
                                       && (dir * (mc.z - fpAlgo->GetParameters()->GetStation(iSta).fZ[0]) > 0);
                iSta += dir) {
 
-            L1Extrapolate(trPar, fpAlgo->GetParameters()->GetStation(iSta).fZ[0], trPar.qp, fld);
-            fit.L1AddMaterial(trPar, fpAlgo->GetParameters()->GetMaterialThickness(iSta, trPar.x, trPar.y), trPar.qp,
-                              1);
-            fit.EnergyLossCorrection(trPar, fpAlgo->GetParameters()->GetMaterialThickness(iSta, trPar.x, trPar.y),
-                                     trPar.qp, fvec(1.), fvec(1.));
-            if (iSta + dir == fNMvdStations - 1) {
-              fit.L1AddPipeMaterial(trPar, trPar.qp, 1);
-              fit.EnergyLossCorrection(trPar, fit.PipeRadThick, trPar.qp, fvec(1.f), fvec(1.f));
-            }
+            fit.Extrapolate(fpAlgo->GetParameters()->GetStation(iSta).fZ, fit.fQp0, fld, fvec::One());
+
+            fit.AddMsInMaterial(fpAlgo->GetParameters()->GetMaterialThickness(iSta, fit.fTr.x, fit.fTr.y), fit.fQp0,
+                                fvec::One());
+            fit.EnergyLossCorrection(fpAlgo->GetParameters()->GetMaterialThickness(iSta, fit.fTr.x, fit.fTr.y),
+                                     fit.fQp0, fvec::One(), fvec::One());
           }
-          L1Extrapolate(trPar, mc.z, trPar.qp, fld);
+          fit.Extrapolate(mc.z, fit.fQp0, fld, fvec::One());
         }
-        if (mc.z != trPar.z[0]) continue;
-
-        const L1TrackPar& tr = trPar;
+        if (mc.z != tr.z[0]) continue;
 
         double dx = tr.x[0] - mc.x;
         double dy = tr.y[0] - mc.y;
diff --git a/reco/L1/L1Algo/L1Algo.h b/reco/L1/L1Algo/L1Algo.h
index 798ecf952c..3aa9afa64d 100644
--- a/reco/L1/L1Algo/L1Algo.h
+++ b/reco/L1/L1Algo/L1Algo.h
@@ -370,7 +370,7 @@ public:
   void CATrackFinder();
 
   /// Track fitting procedures
-  void KFTrackFitter_simple();  // version, which use procedured used during the reconstruction
+
   void L1KFTrackFitter();       // version from SIMD-KF benchmark
 
 
diff --git a/reco/L1/L1Algo/L1BranchExtender.cxx b/reco/L1/L1Algo/L1BranchExtender.cxx
index 07e8185119..770db8283a 100644
--- a/reco/L1/L1Algo/L1BranchExtender.cxx
+++ b/reco/L1/L1Algo/L1BranchExtender.cxx
@@ -6,9 +6,6 @@
 
 #include "L1Algo.h"
 #include "L1Branch.h"
-#include "L1Extrapolation.h"
-#include "L1Filtration.h"
-#include "L1Fit.h"
 #include "L1HitArea.h"
 #include "L1HitPoint.h"
 #include "L1Track.h"
@@ -25,12 +22,15 @@ using std::endl;
 /// dir - 0 - forward, 1 - backward
 /// qp0 - momentum for extrapolation
 /// initialize - should be params ititialized. 1 - yes.
-void L1Algo::BranchFitterFast(const L1Branch& t, L1TrackPar& T, const bool dir, const fvec qp0, const bool initParams)
+void L1Algo::BranchFitterFast(const L1Branch& t, L1TrackPar& Tout, const bool dir, const fvec qp0,
+                              const bool initParams)
 {
   L1_assert(t.NHits >= 3);
 
-  L1Fit fit;
+  L1TrackParFit fit;
   fit.SetParticleMass(GetDefaultParticleMass());
+  fit.fTr       = Tout;
+  L1TrackPar& T = fit.fTr;
 
   // get hits of current track
   const L1Vector<L1HitIndex_t>& hits = t.fHits;  // array of indeses of hits of current track
@@ -77,6 +77,7 @@ void L1Algo::BranchFitterFast(const L1Branch& t, L1TrackPar& T, const bool dir,
     T.ty = (y1 - y0) * dzi;
     T.qp = qp0;
   }
+  fit.fQp0 = qp0;
 
   T.z = z0;
   T.t = hit0.t;
@@ -93,7 +94,7 @@ void L1Algo::BranchFitterFast(const L1Branch& t, L1TrackPar& T, const bool dir,
   T.C50 = T.C51 = T.C52 = T.C53 = T.C54 = 0;
   T.C22 = T.C33 = vINF;
   T.C44         = 1.;
-  T.C55         = hit0.dt2;
+  T.C55         = sta0.timeInfo ? hit0.dt2 : vINF;
 
   L1FieldValue fldB0, fldB1, fldB2 _fvecalignment;
   L1FieldRegion fld _fvecalignment;
@@ -118,38 +119,24 @@ void L1Algo::BranchFitterFast(const L1Branch& t, L1TrackPar& T, const bool dir,
 
     const L1Station& sta = fParameters.GetStation(ista);
 
-    float z_sta = hit.z;
-
-    fvec dz = z_sta - T.z;
-
-    if (kMcbm == fTrackingMode) { L1ExtrapolateLine(T, hit.z); }
-    else {
-      L1Extrapolate(T, hit.z, qp0, fld);
-    }
-    L1ExtrapolateTime(T, dz);
-    fit.L1AddMaterial(T, fParameters.GetMaterialThickness(ista, T.x, T.y), qp0, fvec::One());
-    //if ((step * ista <= step * (fNstationsBeforePipe + (step + 1) / 2 - 1))
-    //  && (step * ista_prev >= step * (fNstationsBeforePipe + (step + 1) / 2 - 1 - step)))
-    //fit.L1AddPipeMaterial(T, qp0, 1);
-
-    fvec u = hit.u;
-    fvec v = hit.v;
-
-    L1Filter(T, sta.frontInfo, u, hit.du2, fvec::One());
-    L1Filter(T, sta.backInfo, v, hit.dv2, fvec::One());
-    FilterTime(T, hit.t, hit.dt2);
+    fit.Extrapolate(hit.z, fit.fQp0, fld, fvec::One());
+    fit.Filter(sta.frontInfo, hit.u, hit.du2, fvec::One());
+    fit.Filter(sta.backInfo, hit.v, hit.dv2, fvec::One());
+    fit.FilterTime(hit.t, hit.dt2, fvec::One(), sta.timeInfo);
+    fit.AddMsInMaterial(fParameters.GetMaterialThickness(ista, T.x, T.y), fit.fQp0, fvec::One());
 
     fldB0       = fldB1;
     fldB1       = fldB2;
     fldZ0       = fldZ1;
     fldZ1       = fldZ2;
-    auto [x, y] = sta.ConvUVtoXY<fvec>(u, v);
+    auto [x, y] = sta.ConvUVtoXY<fvec>(hit.u, hit.v);
     sta.fieldSlice.GetFieldValue(x, y, fldB2);
 
     fldZ2 = sta.fZ;
     fld.Set(fldB2, fldZ2, fldB1, fldZ1, fldB0, fldZ0);
   }  // i
 
+  Tout = T;
 }  // void L1Algo::BranchFitterFast
 
 /// like BranchFitterFast but more precise
@@ -168,13 +155,16 @@ void L1Algo::BranchFitter(const L1Branch& t, L1TrackPar& T, const bool dir, cons
 /// dir - 0 - forward, 1 - backward
 /// qp0 - momentum for extrapolation
 /// initialize - should be params ititialized. 1 - yes.
-void L1Algo::FindMoreHits(L1Branch& t, L1TrackPar& T, const bool dir,
+void L1Algo::FindMoreHits(L1Branch& t, L1TrackPar& Tout, const bool dir,
                           const fvec qp0)  // TODO take into account pipe
 {
   L1Vector<L1HitIndex_t> newHits {"L1TrackExtender::newHits"};
   newHits.reserve(fParameters.GetNstationsActive());
-  L1Fit fit;
+
+  L1TrackParFit fit;
   fit.SetParticleMass(GetDefaultParticleMass());
+  fit.fQp0 = qp0;
+  fit.fTr  = Tout;
 
   const signed short int step = -2 * static_cast<int>(dir) + 1;  // increment for station index
   const int iFirstHit         = (dir) ? 2 : t.NHits - 3;
@@ -226,22 +216,17 @@ void L1Algo::FindMoreHits(L1Branch& t, L1TrackPar& T, const bool dir,
 
     const L1Station& sta = fParameters.GetStation(ista);
 
-    fvec dz = sta.fZ - T.z;
-
-    if (kMcbm == fTrackingMode) { L1ExtrapolateLine(T, sta.fZ); }
-    else {
-      L1Extrapolate(T, sta.fZ, qp0, fld);
-    }
-    L1ExtrapolateTime(T, dz);
+    fit.Extrapolate(sta.fZ, fit.fQp0, fld, fvec::One());
 
     fscal r2_best = 1e8;  // best distance to hit
     int iHit_best = -1;   // index of the best hit
 
-    const fscal iz = 1.f / (T.z[0] - fParameters.GetTargetPositionZ()[0]);
+    const fscal iz = 1.f / (fit.fTr.z[0] - fParameters.GetTargetPositionZ()[0]);
 
-    L1HitAreaTime area(vGridTime[ista], T.x[0] * iz, T.y[0] * iz,
-                       (sqrt(fPickGather * T.C00) + fMaxDx[ista] + fMaxDZ * abs(T.tx))[0] * iz,
-                       (sqrt(fPickGather * T.C11) + fMaxDy[ista] + fMaxDZ * abs(T.ty))[0] * iz, T.t[0], sqrt(T.C55[0]));
+    L1HitAreaTime area(vGridTime[ista], fit.fTr.x[0] * iz, fit.fTr.y[0] * iz,
+                       (sqrt(fPickGather * fit.fTr.C00) + fMaxDx[ista] + fMaxDZ * abs(fit.fTr.tx))[0] * iz,
+                       (sqrt(fPickGather * fit.fTr.C11) + fMaxDy[ista] + fMaxDZ * abs(fit.fTr.ty))[0] * iz,
+                       fit.fTr.t[0], sqrt(fit.fTr.C55[0]));
 
     for (L1HitIndex_t ih = -1; true;) {  // loop over the hits in the area
 
@@ -260,7 +245,10 @@ void L1Algo::FindMoreHits(L1Branch& t, L1TrackPar& T, const bool dir,
 
       const L1Hit& hit = (*vHitsUnused)[globalInd];
 
-      if (fabs(hit.t - T.t[0]) > sqrt(T.C55[0] + hit.dt2) * 5) continue;
+      if (sta.timeInfo) {
+        fscal dt = hit.t - fit.fTr.t[0];
+        if (dt * dt > (fit.fTr.C55[0] + hit.dt2) * 25) continue;
+      }
 
       //if (GetFUsed((*fStripFlag)[hit.f] | (*fStripFlag)[hit.b])) continue;  // if used
       //L1_SHOW(fvHitKeyFlags.size());
@@ -272,14 +260,14 @@ void L1Algo::FindMoreHits(L1Branch& t, L1TrackPar& T, const bool dir,
       GetHitCoor(hit, xh, yh, zh, sta);  // faster
 
       fvec y, C11;
-      L1ExtrapolateYC11Line(T, zh, y, C11);
+      fit.ExtrapolateYC11Line(zh, y, C11);
 
       //   fscal dym_est = ( fPickGather * sqrt(fabs(C11[0]+sta.XYInfo.C11[0])) );
       //   fscal y_minus_new = y[0] - dym_est;
       // if (yh < y_minus_new) continue;  // CHECKME take into account overlaping?
 
       fvec x, C00;
-      L1ExtrapolateXC00Line(T, zh, x, C00);
+      fit.ExtrapolateXC00Line(zh, x, C00);
 
       fscal d_x = xh - x[0];
       fscal d_y = yh - y[0];
@@ -297,21 +285,14 @@ void L1Algo::FindMoreHits(L1Branch& t, L1TrackPar& T, const bool dir,
     newHits.push_back((*RealIHitP)[iHit_best]);
 
     const L1Hit& hit = (*vHitsUnused)[iHit_best];
-    fvec u           = hit.u;
-    fvec v           = hit.v;
-    fvec z           = hit.z;
-    auto [x, y]      = sta.ConvUVtoXY<fvec>(u, v);
 
-    fvec dz1 = z - T.z;
+    auto [x, y] = sta.ConvUVtoXY<fvec>(hit.u, hit.v);
 
-    L1ExtrapolateTime(T, dz1);
-
-    L1ExtrapolateLine(T, z);
-    fit.L1AddMaterial(T, fParameters.GetMaterialThickness(ista, T.x, T.y), qp0, fvec::One());
-
-    L1Filter(T, sta.frontInfo, u, hit.du2, fvec::One());
-    L1Filter(T, sta.backInfo, v, hit.dv2, fvec::One());
-    FilterTime(T, hit.t, hit.dt2);
+    fit.Extrapolate(hit.z, fit.fQp0, fld, fvec::One());
+    fit.Filter(sta.frontInfo, hit.u, hit.du2, fvec::One());
+    fit.Filter(sta.backInfo, hit.v, hit.dv2, fvec::One());
+    fit.FilterTime(hit.t, hit.dt2, fvec::One(), sta.timeInfo);
+    fit.AddMsInMaterial(fParameters.GetMaterialThickness(ista, fit.fTr.x, fit.fTr.y), fit.fQp0, fvec::One());
 
     fldB0 = fldB1;
     fldB1 = fldB2;
@@ -342,6 +323,8 @@ void L1Algo::FindMoreHits(L1Branch& t, L1TrackPar& T, const bool dir,
     }
   }
 
+  Tout = fit.fTr;
+
 }  // void L1Algo::FindMoreHits
 
 /// Try to extrapolate and find additional hits on other stations
diff --git a/reco/L1/L1Algo/L1CATrackFinder.cxx b/reco/L1/L1Algo/L1CATrackFinder.cxx
index eada2696ef..868a7354de 100644
--- a/reco/L1/L1Algo/L1CATrackFinder.cxx
+++ b/reco/L1/L1Algo/L1CATrackFinder.cxx
@@ -25,15 +25,13 @@
 #include "L1Algo.h"
 #include "L1Assert.h"
 #include "L1Branch.h"
-#include "L1Extrapolation.h"
-#include "L1Filtration.h"
-#include "L1Fit.h"
 #include "L1Grid.h"
 #include "L1HitArea.h"
 #include "L1HitPoint.h"
 #include "L1Portion.h"
 #include "L1Track.h"
 #include "L1TrackPar.h"
+#include "L1TrackParFit.h"
 
 #ifdef _OPENMP
 #include "omp.h"
@@ -214,6 +212,8 @@ inline void L1Algo::findSingletsStep1(  /// input 1st stage of singlet search
   const L1Station& fld1Sta2 = fParameters.GetStation(fld1Ista2);
 
   L1TrackParFit fit;
+  fit.SetParticleMass(GetDefaultParticleMass());
+
   fit.fQp0 = fvec(0.);
 
   if (fpCurrentIteration->GetElectronFlag()) { fit.SetParticleMass(L1Constants::phys::kElectronMass); }
@@ -264,29 +264,31 @@ inline void L1Algo::findSingletsStep1(  /// input 1st stage of singlet search
 
     // TODO: iteration parameter: "Starting NDF of track parameters"
     // NDF = number of track parameters (6: x, y, tx, ty, qp, time) - number of measured parameters (3: x, y, time) on station or (2: x, y) on target
-    // Alternative: Iteration can find tracks starting from target or from station: -> use a FLAG
 
-    T.tx = tx;
-    T.ty = ty;
-    T.t  = time;
+    T.x      = xl;
+    T.y      = yl;
+    T.z      = zl;
+    T.tx     = tx;
+    T.ty     = ty;
+    T.qp     = fvec(0.);
+    T.t      = time;
+    fit.fQp0 = fvec(0.);
 
-    T.qp  = fvec(0.);
     T.C20 = T.C21 = fvec(0.);
     T.C30 = T.C31 = T.C32 = fvec(0.);
     T.C40 = T.C41 = T.C42 = T.C43 = fvec(0.);
     T.C50 = T.C51 = T.C52 = T.C53 = T.C54 = fvec(0.);
+
     T.C22 = T.C33 = fMaxSlopePV * fMaxSlopePV / fvec(9.);
+
     if (kGlobal == fTrackingMode || kMcbm == fTrackingMode) T.C22 = T.C33 = fvec(10.);
-    // TODO: Why 9. and 10.?
 
+    // TODO: Why 9. and 10.?
 
     T.C44 = fMaxInvMom / fvec(3.) * fMaxInvMom / fvec(3.);
     T.C55 = timeEr2;
 
     {  // add the target constraint
-      T.x = xl;
-      T.y = yl;
-      T.z = zl;
 
       std::tie(T.C00, T.C10, T.C11) = stal.FormXYCovarianceMatrix(du2_l[i1_V], dv2_l[i1_V]);
 
@@ -295,15 +297,10 @@ inline void L1Algo::findSingletsStep1(  /// input 1st stage of singlet search
 
     fit.AddMsInMaterial(fParameters.GetMaterialThickness(istal, T.x, T.y), fMaxInvMom, fvec::One());
 
-    //if ((istam >= fNstationsBeforePipe) && (istal <= fNstationsBeforePipe - 1)) {
-    //fit.L1AddPipeMaterial(T, fMaxInvMom, fvec::One());
-    //}
+    // extrapolate to the middle hit
 
-    fvec dz = stam.fZ - zl;
-    L1ExtrapolateTime(T, dz, fvec::One());
+    fit.ExtrapolateLine(stam.fZ, fld1, fvec::One());
 
-    // extrapolate to the middle hit
-    L1Extrapolate0(T, stam.fZ, fld0);
     T_1[i1_V] = T;
   }  // i1_V
 }
@@ -329,12 +326,16 @@ inline void L1Algo::findDoubletsStep0(
 
   n2 = 0;  // number of doublets
 
+  L1TrackParFit fit;
+  fit.SetParticleMass(GetDefaultParticleMass());
+
   for (Tindex i1 = 0; i1 < n1; ++i1)  // for each singlet
   {
     unsigned int Ndoublets = 0;
     const Tindex i1_V      = i1 / fvec::size();
     const Tindex i1_4      = i1 % fvec::size();
-    L1TrackPar& T1         = T_1[i1_V];
+    fit.fTr                = T_1[i1_V];
+    L1TrackPar& T1         = fit.fTr;
 
     // assert(T1.IsEntryConsistent(true, i1_4));
     // if (!T1.IsEntryConsistent(false, i1_4)) continue;
@@ -397,7 +398,8 @@ inline void L1Algo::findDoubletsStep0(
       //       if ( dt*dt > dt_est2 && dt < 0  ) continue;
 
       fvec y, C11;
-      L1ExtrapolateYC11Line(T1, zm, y, C11);
+      fit.ExtrapolateYC11Line(zm, y, C11);
+      //L1ExtrapolateYC11Line(T1, zm, y, C11);
 
       /// Covariation matrix of the hit
       auto [dxxScalMhit, dxyScalMhit, dyyScalMhit] = stam.FormXYCovarianceMatrix(hitm.dU2(), hitm.dV2());
@@ -412,7 +414,8 @@ inline void L1Algo::findDoubletsStep0(
 
       // check x-boundaries
       fvec x, C00;
-      L1ExtrapolateXC00Line(T1, zm, x, C00);
+      fit.ExtrapolateXC00Line(zm, x, C00);
+      //L1ExtrapolateXC00Line(T1, zm, x, C00);
 
       fscal dx_est2 = Pick_m22[i1_4] * fabs(C00[i1_4] + dxxScalMhit);
 
@@ -422,16 +425,18 @@ inline void L1Algo::findDoubletsStep0(
 
       // check chi2
       fvec C10;
-      L1ExtrapolateC10Line(T1, zm, C10);
+      fit.ExtrapolateC10Line(zm, C10);
+      //L1ExtrapolateC10Line(T1, zm, C10);
+
       fvec chi2 = T1.chi2;
 
-      L1FilterChi2XYC00C10C11(stam.frontInfo, x, y, C00, C10, C11, chi2, hitm.U(), hitm.dU2());
+      L1TrackParFit::FilterChi2XYC00C10C11(stam.frontInfo, x, y, C00, C10, C11, chi2, hitm.U(), hitm.dU2());
 
       if (!fpCurrentIteration->GetTrackFromTripletsFlag()) {
         if (chi2[i1_4] > fDoubletChi2Cut) continue;
       }
 
-      L1FilterChi2(stam.backInfo, x, y, C00, C10, C11, chi2, hitm.V(), hitm.dV2());
+      L1TrackParFit::FilterChi2(stam.backInfo, x, y, C00, C10, C11, chi2, hitm.V(), hitm.dV2());
 
       // FilterTime(T1, hitm.T(), hitm.dT2());
 
@@ -501,6 +506,8 @@ inline void L1Algo::findDoubletsStep0(
       }
     }  // loop over the hits in the area
 
+    T_1[i1_V] = fit.fTr;
+
   }  // for i1
 }
 
@@ -561,6 +568,8 @@ inline void L1Algo::findTripletsStep0(  // input
   for (Tindex i2 = 0; i2 < n2;) {
     L1TrackPar& T2 = fit.fTr;
     T2             = L1TrackPar_0;
+    fit.fQp0       = fvec(0.);
+
     L1FieldRegion f2;
     // pack the data
     fvec u_front_2 = 0.f;
@@ -608,20 +617,19 @@ inline void L1Algo::findTripletsStep0(  // input
 
     fit.Filter(stam.frontInfo, u_front_2, du2_2, fvec::One());
     fit.Filter(stam.backInfo, u_back_2, dv2_2, fvec::One());
-    //fit.FilterTime(t_2, dt2_2, fvec::One(), stam.timeInfo);
-    FilterTime(T2, t_2, dt2_2, stam.timeInfo);
+    fit.FilterTime(t_2, dt2_2, fvec::One(), stam.timeInfo);
+
+    fit.fQp0 = fit.fTr.qp;
 
-    fit.AddMsInMaterial(fParameters.GetMaterialThickness(iStaM, T2.x, T2.y), isMomentumFitted ? T2.qp : fMaxInvMom,
+    fit.AddMsInMaterial(fParameters.GetMaterialThickness(iStaM, T2.x, T2.y), isMomentumFitted ? fit.fQp0 : fMaxInvMom,
                         fvec::One());
 
+
     //if ((iStaR >= fNstationsBeforePipe) && (iStaM <= fNstationsBeforePipe - 1)) { fit.L1AddPipeMaterial(T2, T2.qp, 1); }
 
     // extrapolate to the right hit station
-    //fit.Extrapolate(star.fZ, T2.qp, f2,fvec::One());
 
-    fvec dz2 = star.fZ - T2.z;
-    L1ExtrapolateTime(T2, dz2, fvec::One());
-    L1Extrapolate(T2, star.fZ, T2.qp, f2);
+    fit.Extrapolate(star.fZ, fit.fQp0, f2, fvec::One());
 
     // assert(T2.IsConsistent(true, n2_4));
 
@@ -697,7 +705,8 @@ inline void L1Algo::findTripletsStep0(  // input
         // - check whether hit belong to the window ( track position +\- errors ) -
         // check lower boundary
         fvec y, C11;
-        L1ExtrapolateYC11Line(T2, zr, y, C11);
+        fit3.ExtrapolateYC11Line(zr, y, C11);
+        //L1ExtrapolateYC11Line(T2, zr, y, C11);
 
         /// Covariation matrix of the hit
         auto [dxxScalRhit, dxyScalRhit, dyyScalRhit] = star.FormXYCovarianceMatrix(hitr.dU2(), hitr.dV2());
@@ -710,8 +719,7 @@ inline void L1Algo::findTripletsStep0(  // input
         if (dY2 > dy_est2) continue;  // if (yr > y_plus_new [i2_4] ) continue;
         // check x-boundaries
         fvec x, C00;
-
-        L1ExtrapolateXC00Line(T2, zr, x, C00);
+        fit3.ExtrapolateXC00Line(zr, x, C00);
 
         fscal dx_est2 = (Pick_r22[i2_4] * (fabs(C00[i2_4] + dxxScalRhit)));
 
@@ -719,15 +727,15 @@ inline void L1Algo::findTripletsStep0(  // input
         if (dX * dX > dx_est2) continue;
         // check chi2  // not effective
         fvec C10;
-        L1ExtrapolateC10Line(T2, zr, C10);
-        fvec chi2 = T2.chi2;
+        fit3.ExtrapolateC10Line(zr, C10);
 
-        L1FilterChi2XYC00C10C11(star.frontInfo, x, y, C00, C10, C11, chi2, hitr.U(), hitr.dU2());
+        fvec chi2 = T2.chi2;
 
-        L1FilterChi2(star.backInfo, x, y, C00, C10, C11, chi2, hitr.V(), hitr.dV2());
+        L1TrackParFit::FilterChi2XYC00C10C11(star.frontInfo, x, y, C00, C10, C11, chi2, hitr.U(), hitr.dU2());
 
-        FilterTime(T_cur, hitr.T(), hitr.dT2(), star.timeInfo);
+        L1TrackParFit::FilterChi2(star.backInfo, x, y, C00, C10, C11, chi2, hitr.V(), hitr.dV2());
 
+        fit3.FilterTime(hitr.T(), hitr.dT2(), fvec::One(), star.timeInfo);
 
         if (!fpCurrentIteration->GetTrackFromTripletsFlag()) {
           if (chi2[i2_4] > fTripletChi2Cut || C00[i2_4] < 0 || C11[i2_4] < 0 || T_cur.C55[i2_4] < 0) {
diff --git a/reco/L1/L1Algo/L1CloneMerger.cxx b/reco/L1/L1Algo/L1CloneMerger.cxx
index 9d2d28b4ad..219410cae2 100644
--- a/reco/L1/L1Algo/L1CloneMerger.cxx
+++ b/reco/L1/L1Algo/L1CloneMerger.cxx
@@ -12,9 +12,9 @@
 #include <iostream>
 
 #include "L1Algo.h"
-#include "L1Extrapolation.h"
 #include "L1Parameters.h"
 #include "L1Track.h"
+#include "L1TrackParFit.h"
 
 // ---------------------------------------------------------------------------------------------------------------------
 //
@@ -76,8 +76,16 @@ void L1CloneMerger::Exec(L1Vector<L1Track>& extTracks, L1Vector<L1HitIndex_t>& e
     isDownstreamNeighbour[iTr] = false;
   }
 
-  L1TrackPar Tb;
-  L1TrackPar Tf;
+  L1TrackParFit fitB;
+  fitB.SetParticleMass(frAlgo.GetDefaultParticleMass());
+  fitB.fQp0 = fvec(0.);
+
+  L1TrackParFit fitF;
+  fitF.SetParticleMass(frAlgo.GetDefaultParticleMass());
+  fitF.fQp0 = fvec(0.);
+
+  L1TrackPar& Tb = fitB.fTr;
+  L1TrackPar& Tf = fitF.fTr;
   L1FieldValue fBm, fBb, fBf _fvecalignment;
   L1FieldRegion fld _fvecalignment;
 
@@ -125,6 +133,8 @@ void L1CloneMerger::Exec(L1Vector<L1Track>& extTracks, L1Vector<L1HitIndex_t>& e
       Tb.C54 = extTracks[iTr].CFirst[19];
       Tb.C55 = extTracks[iTr].CFirst[20];
 
+      fitB.fQp0 = fitB.fTr.qp;
+
       unsigned short staf = lastStation[jTr];
 
       Tf.x   = extTracks[jTr].TLast[0];
@@ -156,6 +166,7 @@ void L1CloneMerger::Exec(L1Vector<L1Track>& extTracks, L1Vector<L1HitIndex_t>& e
       Tf.C54 = extTracks[jTr].CLast[19];
       Tf.C55 = extTracks[jTr].CLast[20];
 
+      fitF.fQp0 = fitF.fTr.qp;
 
       if (fabs(Tf.t[0] - Tb.t[0]) > 3 * sqrt(Tf.C55[0] + Tb.C55[0])) continue;
       unsigned short stam;
@@ -177,8 +188,8 @@ void L1CloneMerger::Exec(L1Vector<L1Track>& extTracks, L1Vector<L1HitIndex_t>& e
 
       fvec zMiddle = fvec(0.5) * (Tb.z + Tf.z);
 
-      L1Extrapolate(Tf, zMiddle, Tf.qp, fld);
-      L1Extrapolate(Tb, zMiddle, Tb.qp, fld);
+      fitF.Extrapolate(zMiddle, fitF.fQp0, fld, fvec::One());
+      fitB.Extrapolate(zMiddle, fitB.fQp0, fld, fvec::One());
 
       fvec Chi2Tracks(0.);
       FilterTracks(&(Tf.x), &(Tf.C00), &(Tb.x), &(Tb.C00), 0, 0, &Chi2Tracks);
diff --git a/reco/L1/L1Algo/L1TrackFitter.cxx b/reco/L1/L1Algo/L1TrackFitter.cxx
index e1b4f6bbed..3926955a1f 100644
--- a/reco/L1/L1Algo/L1TrackFitter.cxx
+++ b/reco/L1/L1Algo/L1TrackFitter.cxx
@@ -6,9 +6,6 @@
 #include <vector>
 
 #include "L1Algo.h"
-#include "L1Extrapolation.h"
-#include "L1Filtration.h"  // for KFTrackFitter_simple
-#include "L1Fit.h"
 #include "L1TrackPar.h"
 #include "L1TrackParFit.h"
 
@@ -26,285 +23,6 @@ namespace NS_L1TrackFitter
 }  // namespace NS_L1TrackFitter
 using namespace NS_L1TrackFitter;
 
-/// Fit reconstracted track like it fitted d_uring the reconstruction.
-void L1Algo::KFTrackFitter_simple()  // TODO: Add pipe.
-{
-  //  cout << " Start KF Track Fitter " << endl;
-  int start_hit = 0;  // for interation in fRecoHits[]
-  for (unsigned int itrack = 0; itrack < fTracks.size(); itrack++) {
-    L1Track& t = fTracks[itrack];  // current track
-
-    // get hits of current track
-    std::vector<unsigned short int> hits;  // array of indeses of hits of current track
-    hits.clear();
-    int nHits = t.NHits;
-    for (int i = 0; i < nHits; i++) {
-      hits.push_back(fRecoHits[start_hit++]);
-    }
-
-    L1TrackPar T;  // fitting parametr coresponding to current track
-
-    L1Fit fit;
-    fit.SetParticleMass(GetDefaultParticleMass());
-
-    fvec qp0(0.25);
-    //fvec qp0 = 2./t.Momentum;
-    for (int iter = 0; iter < 3; iter++) {
-      //cout<<" Back 1"<<endl;
-      {  // fit backward
-        const L1Hit& hit0 = fInputData.GetHit(hits[nHits - 1]);
-        const L1Hit& hit1 = fInputData.GetHit(hits[nHits - 2]);
-        const L1Hit& hit2 = fInputData.GetHit(hits[nHits - 3]);
-
-        int ista0 = hit0.iSt;
-        int ista1 = hit1.iSt;
-        int ista2 = hit2.iSt;
-
-
-        //cout<<"back: ista012="<<ista0<<" "<<ista1<<" "<<ista2<<endl;
-        const L1Station& sta0 = fParameters.GetStation(ista0);
-        const L1Station& sta1 = fParameters.GetStation(ista1);
-        const L1Station& sta2 = fParameters.GetStation(ista2);
-
-        fvec u0       = hit0.u;
-        fvec v0       = hit0.v;
-        auto [x0, y0] = sta0.ConvUVtoXY<fvec>(u0, v0);
-        fvec z0       = hit0.z;
-
-        fvec u1       = hit1.u;
-        fvec v1       = hit1.v;
-        auto [x1, y1] = sta1.ConvUVtoXY<fvec>(u1, v1);
-        fvec z1       = hit1.z;
-
-        fvec u2       = hit2.u;
-        fvec v2       = hit2.v;
-        auto [x2, y2] = sta1.ConvUVtoXY<fvec>(u2, v2);
-        // fvec z2 = hit2.z;
-
-        fvec dzi = fvec(1.) / (z1 - z0);
-
-        //        const fvec vINF = .1;
-        T.x = x0;
-        T.y = y0;
-        if (iter == 0) {
-          T.tx = (x1 - x0) * dzi;
-          T.ty = (y1 - y0) * dzi;
-        }
-
-        T.qp   = qp0;
-        T.z    = z0;
-        T.chi2 = fvec(0.);
-        T.NDF  = fvec(2.);
-
-        std::tie(T.C00, T.C10, T.C11) = sta0.FormXYCovarianceMatrix(hit0.du2, hit0.dv2);
-
-        T.C20 = T.C21 = fvec(0.);
-        T.C30 = T.C31 = T.C32 = fvec(0.);
-        T.C40 = T.C41 = T.C42 = T.C43 = fvec(0.);
-        T.C22 = T.C33 = vINF;
-        T.C44         = fvec(1.);
-
-        //        static L1FieldValue fldB0, fldB1, fldB2 _fvecalignment;
-        //        static L1FieldRegion fld _fvecalignment;
-        L1FieldValue fldB0, fldB1, fldB2 _fvecalignment;
-        L1FieldRegion fld _fvecalignment;
-        fvec fldZ0 = sta1.fZ;  // suppose field is smoth
-        fvec fldZ1 = sta2.fZ;
-        fvec fldZ2 = sta0.fZ;
-
-        sta1.fieldSlice.GetFieldValue(x1, y1, fldB0);
-        sta2.fieldSlice.GetFieldValue(x2, y2, fldB1);
-        sta0.fieldSlice.GetFieldValue(x0, y0, fldB2);
-
-        fld.Set(fldB2, fldZ2, fldB1, fldZ1, fldB0, fldZ0);
-
-        int ista = ista2;
-        //cout<<"\nfit, iter=:"<<iter<<endl;
-        for (int i = nHits - 2; i >= 0; i--) {
-          //  if( fabs(T.qp[0])>2. ) break;  // iklm. Don't know it need for
-          const L1Hit& hit = fInputData.GetHit(hits[i]);
-          ista             = hit.iSt;
-
-          const L1Station& sta = fParameters.GetStation(ista);
-
-          //    L1Extrapolate( T, hit.z, qp0, fld );
-          L1ExtrapolateLine(T, hit.z);
-          //           T.L1Extrapolate( sta.z, qp0, fld );
-          //         L1Extrapolate( T, hit.z, qp0, fld );
-          fit.L1AddMaterial(T, fParameters.GetMaterialThickness(i, T.x, T.y), qp0, ONE);
-
-          //         if (ista == fNstationsBeforePipe - 1) fit.L1AddPipeMaterial( T, qp0, 1);
-
-          fvec u      = hit.u;
-          fvec v      = hit.v;
-          auto [x, y] = sta.ConvUVtoXY<fvec>(u, v);
-          L1Filter(T, sta.frontInfo, u, hit.du2, fvec::One());
-          L1Filter(T, sta.backInfo, v, hit.dv2, fvec::One());
-          fldB0 = fldB1;
-          fldB1 = fldB2;
-          fldZ0 = fldZ1;
-          fldZ1 = fldZ2;
-          sta.fieldSlice.GetFieldValue(x, y, fldB2);
-
-          fldZ2 = sta.fZ;
-          fld.Set(fldB2, fldZ2, fldB1, fldZ1, fldB0, fldZ0);
-        }  // i
-
-        // write received parametres in track
-        t.TFirst[0] = T.x[0];
-        t.TFirst[1] = T.y[0];
-        t.TFirst[2] = T.tx[0];
-        t.TFirst[3] = T.ty[0];
-        t.TFirst[4] = T.qp[0];
-        t.TFirst[5] = T.z[0];
-
-        t.CFirst[0]  = T.C00[0];
-        t.CFirst[1]  = T.C10[0];
-        t.CFirst[2]  = T.C11[0];
-        t.CFirst[3]  = T.C20[0];
-        t.CFirst[4]  = T.C21[0];
-        t.CFirst[5]  = T.C22[0];
-        t.CFirst[6]  = T.C30[0];
-        t.CFirst[7]  = T.C31[0];
-        t.CFirst[8]  = T.C32[0];
-        t.CFirst[9]  = T.C33[0];
-        t.CFirst[10] = T.C40[0];
-        t.CFirst[11] = T.C41[0];
-        t.CFirst[12] = T.C42[0];
-        t.CFirst[13] = T.C43[0];
-        t.CFirst[14] = T.C44[0];
-
-        t.chi2 = T.chi2[0];
-        t.NDF  = static_cast<int>(T.NDF[0]);
-        qp0    = T.qp;
-      }  // fit backward
-
-      // fit forward
-      {
-        //T.qp = first_trip->GetQpOrig(MaxInvMom);
-        const L1Hit& hit0 = fInputData.GetHit(hits[0]);
-        const L1Hit& hit1 = fInputData.GetHit(hits[1]);
-        const L1Hit& hit2 = fInputData.GetHit(hits[2]);
-
-        int ista0 = hit0.iSt;
-        int ista1 = hit1.iSt;
-        int ista2 = hit2.iSt;
-
-        const L1Station& sta0 = fParameters.GetStation(ista0);
-        const L1Station& sta1 = fParameters.GetStation(ista1);
-        const L1Station& sta2 = fParameters.GetStation(ista2);
-
-        fvec u0       = hit0.u;
-        fvec v0       = hit0.v;
-        auto [x0, y0] = sta0.ConvUVtoXY<fvec>(u0, v0);
-        fvec z0       = hit0.z;
-
-        fvec u1       = hit1.u;
-        fvec v1       = hit1.v;
-        auto [x1, y1] = sta1.ConvUVtoXY<fvec>(u1, v1);
-        // fvec z1 = hit1.z;
-
-        fvec u2       = hit2.u;
-        fvec v2       = hit2.v;
-        auto [x2, y2] = sta2.ConvUVtoXY<fvec>(u2, v2);
-        //  fvec z2 = hit2.z;
-
-        //   fvec dzi = 1./(z1-z0);
-
-        //fvec qp0 = first_trip->GetQpOrig(MaxInvMom);
-
-        //        const fvec vINF = .1;
-        T.chi2 = fvec(0.);
-        T.NDF  = fvec(2.);
-        T.x    = x0;
-        T.y    = y0;
-        //         T.tx = (x1-x0)*dzi;
-        //         T.ty = (y1-y0)*dzi;
-        //         qp0 = 0;
-        T.qp = qp0;
-        T.z  = z0;
-
-        std::tie(T.C00, T.C10, T.C11) = sta0.FormXYCovarianceMatrix(hit0.du2, hit0.dv2);
-
-        T.C20 = T.C21 = 0;
-        T.C30 = T.C31 = T.C32 = 0;
-        T.C40 = T.C41 = T.C42 = T.C43 = 0;
-        T.C22 = T.C33 = vINF;
-        T.C44         = 1.;
-
-        //        static L1FieldValue fldB0, fldB1, fldB2 _fvecalignment;
-        //        static L1FieldRegion fld _fvecalignment;
-        L1FieldValue fldB0, fldB1, fldB2 _fvecalignment;
-        L1FieldRegion fld _fvecalignment;
-        fvec fldZ0 = sta1.fZ;
-        fvec fldZ1 = sta2.fZ;
-        fvec fldZ2 = sta0.fZ;
-
-        sta1.fieldSlice.GetFieldValue(x1, y1, fldB0);
-        sta2.fieldSlice.GetFieldValue(x2, y2, fldB1);
-        sta0.fieldSlice.GetFieldValue(x0, y0, fldB2);
-
-        fld.Set(fldB2, fldZ2, fldB1, fldZ1, fldB0, fldZ0);
-        int ista = ista2;
-
-        for (int i = 1; i < nHits; i++) {
-          const L1Hit& hit     = fInputData.GetHit(hits[i]);
-          ista                 = hit.iSt;
-          const L1Station& sta = fParameters.GetStation(ista);
-          fvec u               = hit.u;
-          fvec v               = hit.v;
-          auto [x, y]          = sta.ConvUVtoXY<fvec>(u, v);
-
-          //   L1Extrapolate( T, hit.z, qp0, fld );
-          L1ExtrapolateLine(T, hit.z);
-          //           T.L1Extrapolate( sta.z, qp0, fld );
-          //           L1Extrapolate( T, hit.z, qp0, fld );
-          fit.L1AddMaterial(T, fParameters.GetMaterialThickness(i, T.x, T.y), qp0, ONE);
-
-          //           if (ista == fNstationsBeforePipe) fit.L1AddPipeMaterial( T, qp0, 1);
-          L1Filter(T, sta.frontInfo, u, hit.du2, fvec::One());
-          L1Filter(T, sta.backInfo, v, hit.dv2, fvec::One());
-
-          fldB0 = fldB1;
-          fldB1 = fldB2;
-          fldZ0 = fldZ1;
-          fldZ1 = fldZ2;
-          sta.fieldSlice.GetFieldValue(x, y, fldB2);
-          fldZ2 = sta.fZ;
-          fld.Set(fldB2, fldZ2, fldB1, fldZ1, fldB0, fldZ0);
-        }
-
-        // write received parametres in track
-        t.TLast[0] = T.x[0];
-        t.TLast[1] = T.y[0];
-        t.TLast[2] = T.tx[0];
-        t.TLast[3] = T.ty[0];
-        t.TLast[4] = T.qp[0];
-        t.TLast[5] = T.z[0];
-
-        t.CLast[0]  = T.C00[0];
-        t.CLast[1]  = T.C10[0];
-        t.CLast[2]  = T.C11[0];
-        t.CLast[3]  = T.C20[0];
-        t.CLast[4]  = T.C21[0];
-        t.CLast[5]  = T.C22[0];
-        t.CLast[6]  = T.C30[0];
-        t.CLast[7]  = T.C31[0];
-        t.CLast[8]  = T.C32[0];
-        t.CLast[9]  = T.C33[0];
-        t.CLast[10] = T.C40[0];
-        t.CLast[11] = T.C41[0];
-        t.CLast[12] = T.C42[0];
-        t.CLast[13] = T.C43[0];
-        t.CLast[14] = T.C44[0];
-
-        t.chi2 += T.chi2[0];
-        t.NDF += static_cast<int>(T.NDF[0]);
-      }
-      qp0 = T.qp;
-    }
-  }  // for(int itrack
-}
 
 void L1Algo::L1KFTrackFitter()
 {
diff --git a/reco/L1/L1Algo/L1TrackPar.h b/reco/L1/L1Algo/L1TrackPar.h
index 4f129149e1..261944c4bc 100644
--- a/reco/L1/L1Algo/L1TrackPar.h
+++ b/reco/L1/L1Algo/L1TrackPar.h
@@ -13,72 +13,52 @@
 class L1TrackPar {
 
 public:
-  fvec x, y, tx, ty, qp, z, t, C00, C10, C11, C20, C21, C22, C30, C31, C32, C33, C40, C41, C42, C43, C44, C50, C51, C52,
-    C53, C54, C55, chi2, NDF;
-
-  L1TrackPar()
-    : x(0)
-    , y(0)
-    , tx(0)
-    , ty(0)
-    , qp(0)
-    , z(0)
-    , t(0)
-    , C00(0)
-    , C10(0)
-    , C11(0)
-    , C20(0)
-    , C21(0)
-    , C22(0)
-    , C30(0)
-    , C31(0)
-    , C32(0)
-    , C33(0)
-    , C40(0)
-    , C41(0)
-    , C42(0)
-    , C43(0)
-    , C44(0)
-    , C50(0)
-    , C51(0)
-    , C52(0)
-    , C53(0)
-    , C54(0)
-    , C55(0)
-    , chi2(0)
-    , NDF(0) {};
-
-  L1TrackPar(double* T, double* C)
-    : x(T[0])
-    , y(T[1])
-    , tx(T[2])
-    , ty(T[3])
-    , qp(T[4])
-    , z(T[5])
-    , t(T[6])
-    , C00(C[0])
-    , C10(C[1])
-    , C11(C[2])
-    , C20(C[3])
-    , C21(C[4])
-    , C22(C[5])
-    , C30(C[6])
-    , C31(C[7])
-    , C32(C[8])
-    , C33(C[9])
-    , C40(C[10])
-    , C41(C[11])
-    , C42(C[12])
-    , C43(C[13])
-    , C44(C[14])
-    , C50(C[15])
-    , C51(C[16])
-    , C52(C[17])
-    , C53(C[18])
-    , C54(C[19])
-    , C55(C[20])
-    , chi2(0)
-    , NDF(0) {};
+  fvec x {0.}, y {0.}, tx {0.}, ty {0.}, qp {0.}, z {0.}, t {0.};
+
+  fvec C00 {0.}, C10 {0.}, C11 {0.}, C20 {0.}, C21 {0.}, C22 {0.}, C30 {0.}, C31 {0.}, C32 {0.}, C33 {0.}, C40 {0.},
+    C41 {0.}, C42 {0.}, C43 {0.}, C44 {0.}, C50 {0.}, C51 {0.}, C52 {0.}, C53 {0.}, C54 {0.}, C55 {0.}, chi2 {0.},
+    NDF {0.};
+
+  L1TrackPar() = default;
+
+  L1TrackPar(const double* T, const double* C) { Set(T, C); }
+
+  void Set(const double* T, const double* C)
+  {
+    x  = T[0];
+    y  = T[1];
+    tx = T[2];
+    ty = T[3];
+    qp = T[4];
+    z  = T[5];
+    t  = T[6];
+
+    chi2 = 0.;
+    NDF  = 0.;
+
+    C00 = C[0];
+    C10 = C[1];
+    C11 = C[2];
+    C20 = C[3];
+    C21 = C[4];
+    C22 = C[5];
+    C30 = C[6];
+    C31 = C[7];
+    C32 = C[8];
+    C33 = C[9];
+    C40 = C[10];
+    C41 = C[11];
+    C42 = C[12];
+    C43 = C[13];
+    C44 = C[14];
+    C50 = C[15];
+    C51 = C[16];
+    C52 = C[17];
+    C53 = C[18];
+    C54 = C[19];
+    C55 = C[20];
+  }
+
 
   void SetOneEntry(const int i0, const L1TrackPar& T1, const int i1);
 
diff --git a/reco/L1/L1Algo/L1TrackParFit.cxx b/reco/L1/L1Algo/L1TrackParFit.cxx
index ef3ba7252e..817b036a2a 100644
--- a/reco/L1/L1Algo/L1TrackParFit.cxx
+++ b/reco/L1/L1Algo/L1TrackParFit.cxx
@@ -4,11 +4,6 @@
 
 #include "L1TrackParFit.h"
 
-#include "L1Extrapolation.h"
-#include "L1Filtration.h"
-#include "L1Fit.h"
-
-
 #define cnst const fvec
 
 void L1TrackParFit::Filter(const L1UMeasurementInfo& info, const fvec& u, const fvec& sigma2, const fvec& w)
@@ -927,6 +922,15 @@ void L1TrackParFit::
   //cout<<"Extrapolation ok"<<endl;
 }
 
+void L1TrackParFit::ExtrapolateLine(fvec z_out, const L1FieldRegion& F, const fvec& w)
+{
+  // extrapolate the track assuming fQp0 == 0
+  //
+  auto qp0 = fQp0;
+  fQp0     = fvec(0.);
+  Extrapolate(z_out, fQp0, F, w);
+  fQp0 = qp0;
+}
 
 void L1TrackParFit::ExtrapolateLine(fvec z_out, const fvec& w)
 {
@@ -1058,7 +1062,7 @@ void L1TrackParFit::EnergyLossCorrection(const fvec& radThick, fvec& qp0, fvec d
   const fvec p2   = fvec(1.) / qp02;
   const fvec E2   = fMass2 + p2;
 
-  const fvec bethe = L1Fit::ApproximateBetheBloch(p2 / fMass2);
+  const fvec bethe = ApproximateBetheBloch(p2 / fMass2);
 
   fvec tr = sqrt(fvec(1.f) + fTr.tx * fTr.tx + fTr.ty * fTr.ty);
 
@@ -1093,7 +1097,7 @@ void L1TrackParFit::EnergyLossCorrection(float atomicA, float rho, float radLen,
   else
     i = (9.76 * atomicZ + 58.8 * std::pow(atomicZ, -0.19)) * 1.e-9;
 
-  const fvec bethe = L1Fit::ApproximateBetheBloch(p2 / fMass2, rho, 0.20, 3.00, i, atomicZ / atomicA);
+  const fvec bethe = ApproximateBetheBloch(p2 / fMass2, rho, 0.20, 3.00, i, atomicZ / atomicA);
 
   fvec tr = sqrt(fvec(1.f) + fTr.tx * fTr.tx + fTr.ty * fTr.ty);
 
@@ -1230,4 +1234,145 @@ void L1TrackParFit::AddTargetToLine(const fvec& targX, const fvec& targY, const
   FilterExtrapolatedXY(targX, targY, targXYInfo, eX, eY, Jx, Jy);
 }
 
+fvec L1TrackParFit::ApproximateBetheBloch(const fvec& bg2)
+{
+  //
+  // This is the parameterization of the Bethe-Bloch formula inspired by Geant.
+  //
+  // bg2  - (beta*gamma)^2
+  // kp0 - density [g/cm^3]
+  // kp1 - density effect first junction point
+  // kp2 - density effect second junction point
+  // kp3 - mean excitation energy [GeV]
+  // kp4 - mean Z/A
+  //
+  // The default values for the kp* parameters are for silicon.
+  // The returned value is in [GeV/(g/cm^2)].
+  //
+
+  const fvec kp0 = 2.33f;
+  const fvec kp1 = 0.20f;
+  const fvec kp2 = 3.00f;
+  const fvec kp3 = 173e-9f;
+  const fvec kp4 = 0.49848f;
+
+  constexpr float mK   = 0.307075e-3f;  // [GeV*cm^2/g]
+  constexpr float _2me = 1.022e-3f;     // [GeV/c^2]
+  const fvec rho       = kp0;
+  const fvec x0        = kp1 * 2.303f;
+  const fvec x1        = kp2 * 2.303f;
+  const fvec mI        = kp3;
+  const fvec mZA       = kp4;
+  const fvec maxT      = _2me * bg2;  // neglecting the electron mass
+
+  //*** Density effect
+  fvec d2(0.f);
+  const fvec x    = 0.5f * log(bg2);
+  const fvec lhwI = log(28.816f * 1e-9f * sqrt(rho * mZA) / mI);
+
+  fmask init   = x > x1;
+  d2           = iif(init, lhwI + x - 0.5f, fvec::Zero());
+  const fvec r = (x1 - x) / (x1 - x0);
+  init         = (x > x0) & (x1 > x);
+  d2           = iif(init, lhwI + x - 0.5f + (0.5f - lhwI - x0) * r * r * r, d2);
+
+  return mK * mZA * (fvec(1.f) + bg2) / bg2
+         * (0.5f * log(_2me * bg2 * maxT / (mI * mI)) - bg2 / (fvec(1.f) + bg2) - d2);
+}
+
+fvec L1TrackParFit::ApproximateBetheBloch(const fvec& bg2, const fvec& kp0, const fvec& kp1, const fvec& kp2,
+                                          const fvec& kp3, const fvec& kp4)
+{
+  //
+  // This is the parameterization of the Bethe-Bloch formula inspired by Geant.
+  //
+  // bg2  - (beta*gamma)^2
+  // kp0 - density [g/cm^3]
+  // kp1 - density effect first junction point
+  // kp2 - density effect second junction point
+  // kp3 - mean excitation energy [GeV]
+  // kp4 - mean Z/A
+  //
+  // The default values for the kp* parameters are for silicon.
+  // The returned value is in [GeV/(g/cm^2)].
+  //
+
+  //   const fvec &kp0 = 2.33f;
+  //   const fvec &kp1 = 0.20f;
+  //   const fvec &kp2 = 3.00f;
+  //   const fvec &kp3 = 173e-9f;
+  //   const fvec &kp4 = 0.49848f;
+
+  constexpr float mK   = 0.307075e-3f;  // [GeV*cm^2/g]
+  constexpr float _2me = 1.022e-3f;     // [GeV/c^2]
+  const fvec& rho      = kp0;
+  const fvec x0        = kp1 * 2.303f;
+  const fvec x1        = kp2 * 2.303f;
+  const fvec& mI       = kp3;
+  const fvec& mZA      = kp4;
+  const fvec maxT      = _2me * bg2;  // neglecting the electron mass
+
+  //*** Density effect
+  fvec d2(0.f);
+  const fvec x    = 0.5f * log(bg2);
+  const fvec lhwI = log(28.816f * 1e-9f * sqrt(rho * mZA) / mI);
+
+  fmask init   = x > x1;
+  d2           = iif(init, lhwI + x - 0.5f, fvec::Zero());
+  const fvec r = (x1 - x) / (x1 - x0);
+  init         = (x > x0) & (x1 > x);
+  d2           = iif(init, lhwI + x - 0.5f + (0.5f - lhwI - x0) * r * r * r, d2);
+
+  return mK * mZA * (fvec(1.f) + bg2) / bg2
+         * (0.5f * log(_2me * bg2 * maxT / (mI * mI)) - bg2 / (fvec(1.f) + bg2) - d2);
+}
+
+
+void L1TrackParFit::FilterChi2XYC00C10C11(const L1UMeasurementInfo& info, fvec& x, fvec& y, fvec& C00, fvec& C10,
+                                          fvec& C11, fvec& chi2, const fvec& u, const fvec& du2)
+{
+  fvec wi, zeta, zetawi, HCH;
+  fvec F0, F1;
+  fvec K1;
+
+  zeta = info.cos_phi * x + info.sin_phi * y - u;
+
+  // F = CH'
+  F0 = info.cos_phi * C00 + info.sin_phi * C10;
+  F1 = info.cos_phi * C10 + info.sin_phi * C11;
+
+  HCH = (F0 * info.cos_phi + F1 * info.sin_phi);
+
+  wi     = fvec(1.) / (du2 + HCH);
+  zetawi = zeta * wi;
+  chi2 += zeta * zetawi;
+
+  K1 = F1 * wi;
+
+  x -= F0 * zetawi;
+  y -= F1 * zetawi;
+
+  C00 -= F0 * F0 * wi;
+  C10 -= K1 * F0;
+  C11 -= K1 * F1;
+}
+
+
+void L1TrackParFit::FilterChi2(const L1UMeasurementInfo& info, const fvec& x, const fvec& y, const fvec& C00,
+                               const fvec& C10, const fvec& C11, fvec& chi2, const fvec& u, const fvec& du2)
+{
+  fvec zeta, HCH;
+  fvec F0, F1;
+
+  zeta = info.cos_phi * x + info.sin_phi * y - u;
+
+  // F = CH'
+  F0 = info.cos_phi * C00 + info.sin_phi * C10;
+  F1 = info.cos_phi * C10 + info.sin_phi * C11;
+
+  HCH = (F0 * info.cos_phi + F1 * info.sin_phi);
+
+  chi2 += zeta * zeta / (du2 + HCH);
+}
+
 #undef cnst
diff --git a/reco/L1/L1Algo/L1TrackParFit.h b/reco/L1/L1Algo/L1TrackParFit.h
index 217351c5f2..267f6dad92 100644
--- a/reco/L1/L1Algo/L1TrackParFit.h
+++ b/reco/L1/L1Algo/L1TrackParFit.h
@@ -14,18 +14,23 @@
 class L1TrackParFit {
 
 public:
-  L1TrackPar fTr {};
-  fvec fQp0;
+  L1TrackParFit() = default;
 
-  fvec fMass  = 0.10565800;     // muon mass
-  fvec fMass2 = fMass * fMass;  // mass squared
+  L1TrackParFit(const L1TrackPar& t) { SetTrack(t); }
 
-  fvec fPipeRadThick {7.87e-3f};        // 0.7 mm Aluminium  // TODO:
-  fvec fTargetRadThick {3.73e-2f * 2};  // 250 mum Gold      // TODO:
+  L1TrackParFit(const double* T, const double* C) { SetTrack(T, C); }
 
-  L1TrackParFit() = default;
+  void SetTrack(const double* T, const double* C)
+  {
+    fTr.Set(T, C);
+    fQp0 = fTr.qp;
+  }
 
-  L1TrackParFit(double* T, double* C) : fTr(T, C) {}
+  void SetTrack(const L1TrackPar& t)
+  {
+    fTr  = t;
+    fQp0 = fTr.qp;
+  }
 
   void SetOneEntry(const int i0, const L1TrackParFit& T1, const int i1);
 
@@ -33,8 +38,11 @@ public:
 
   //Fit functionality
 
+  /// get target radiation thickness
+  fvec GetTargetRadThick() const { return fTargetRadThick; }
+
   /// set particle mass for the fit
-  void SetParticleMass(float mass)
+  void SetParticleMass(fvec mass)
   {
     fMass  = mass;
     fMass2 = mass * mass;
@@ -56,6 +64,7 @@ public:
   void ExtrapolateStep(fvec z_out, fvec qp0, const L1FieldRegion& F, const fvec& w);
   void ExtrapolateStepAnalytic(fvec z_out, fvec qp0, const L1FieldRegion& F, const fvec& w);
   void ExtrapolateLine(fvec z_out, const fvec& w);
+  void ExtrapolateLine(fvec z_out, const L1FieldRegion& F, const fvec& w);
 
 
   void EnergyLossCorrection(const fvec& radThick, fvec& qp0, fvec direction, fvec w);
@@ -74,9 +83,35 @@ public:
   void GetExtrapolatedXYline(const fvec& z, const L1FieldRegion& F, fvec& extrX, fvec& extrY, fvec Jx[6],
                              fvec Jy[6]) const;
 
+  void ExtrapolateXC00Line(fvec z_out, fvec& x, fvec& C00) const;
+  void ExtrapolateYC11Line(fvec z_out, fvec& y, fvec& C11) const;
+  void ExtrapolateC10Line(fvec z_out, fvec& C10) const;
+
+
   void AddTargetToLine(const fvec& targX, const fvec& targY, const fvec& targZ, const L1XYMeasurementInfo& targXYInfo,
                        const L1FieldRegion& F);
 
+  static fvec ApproximateBetheBloch(const fvec& bg2);
+
+  static fvec ApproximateBetheBloch(const fvec& bg2, const fvec& kp0, const fvec& kp1, const fvec& kp2, const fvec& kp3,
+                                    const fvec& kp4);
+
+  static void FilterChi2XYC00C10C11(const L1UMeasurementInfo& info, fvec& x, fvec& y, fvec& C00, fvec& C10, fvec& C11,
+                                    fvec& chi2, const fvec& u, const fvec& du2);
+
+  static void FilterChi2(const L1UMeasurementInfo& info, const fvec& x, const fvec& y, const fvec& C00, const fvec& C10,
+                         const fvec& C11, fvec& chi2, const fvec& u, const fvec& du2);
+
+public:
+  L1TrackPar fTr {};
+  fvec fQp0;
+
+  fvec fMass  = 0.10565800;     // muon mass
+  fvec fMass2 = fMass * fMass;  // mass squared
+
+  fvec fPipeRadThick {7.87e-3f};        // 0.7 mm Aluminium  // TODO:
+  fvec fTargetRadThick {3.73e-2f * 2};  // 250 mum Gold      // TODO:
+
 } _fvecalignment;
 
 // =============================================================================================
@@ -90,4 +125,23 @@ inline void L1TrackParFit::SetOneEntry(const int i0, const L1TrackParFit& T1, co
   fQp0[i0] = T1.fQp0[i1];
 }
 
+inline void L1TrackParFit::ExtrapolateXC00Line(fvec z_out, fvec& x, fvec& C00) const
+{
+  const fvec dz = (z_out - fTr.z);
+  x             = fTr.x + fTr.tx * dz;
+  C00           = fTr.C00 + dz * (2 * fTr.C20 + dz * fTr.C22);
+}
+
+inline void L1TrackParFit::ExtrapolateYC11Line(fvec z_out, fvec& y, fvec& C11) const
+{
+  const fvec dz = (z_out - fTr.z);
+  y             = fTr.y + fTr.ty * dz;
+  C11           = fTr.C11 + dz * (2 * fTr.C31 + dz * fTr.C33);
+}
+
+inline void L1TrackParFit::ExtrapolateC10Line(fvec z_out, fvec& C10) const
+{
+  const fvec dz = (z_out - fTr.z);
+  C10           = fTr.C10 + dz * (fTr.C21 + fTr.C30 + dz * fTr.C32);
+}
 #endif
diff --git a/reco/L1/ParticleFinder/CbmL1PFFitter.cxx b/reco/L1/ParticleFinder/CbmL1PFFitter.cxx
index c6aefbad11..b5f16dc2d2 100644
--- a/reco/L1/ParticleFinder/CbmL1PFFitter.cxx
+++ b/reco/L1/ParticleFinder/CbmL1PFFitter.cxx
@@ -38,13 +38,12 @@
 #include "KFParticleDatabase.h"
 #include "L1Algo.h"  // Also defines L1Parameters
 #include "L1Def.h"
-#include "L1Extrapolation.h"
 #include "L1Field.h"
-#include "L1Filtration.h"
-#include "L1Fit.h"
-#include "L1Material.h"
 #include "L1Station.h"
 #include "L1TrackPar.h"
+#include "L1TrackParFit.h"
+
+//typedef L1Fit1 L1Fit;
 
 using std::vector;
 
@@ -98,28 +97,29 @@ inline void CbmL1PFFitter::PFFieldRegion::getL1FieldRegion(L1FieldRegion& fld, i
 inline CbmL1PFFitter::PFFieldRegion::PFFieldRegion(const L1FieldRegion& fld, int i) { setFromL1FieldRegion(fld, i); }
 
 
-void FilterFirst(L1TrackPar& track, fvec& x, fvec& y, fvec& dxx, fvec& dxy, fvec& dyy)
+void FilterFirst(L1TrackParFit& fit, fvec& x, fvec& y, fvec& dxx, fvec& dxy, fvec& dyy)
 {
-  track.C00 = dxx;
-  track.C10 = dxy;
-  track.C11 = dyy;
-  track.C20 = ZERO;
-  track.C21 = ZERO;
-  track.C22 = vINF;
-  track.C30 = ZERO;
-  track.C31 = ZERO;
-  track.C32 = ZERO;
-  track.C33 = vINF;
-  track.C40 = ZERO;
-  track.C41 = ZERO;
-  track.C42 = ZERO;
-  track.C43 = ZERO;
-  track.C44 = ONE;
-
-  track.x    = x;
-  track.y    = y;
-  track.NDF  = -3.0;
-  track.chi2 = ZERO;
+  L1TrackPar& tr = fit.fTr;
+  tr.C00         = dxx;
+  tr.C10         = dxy;
+  tr.C11         = dyy;
+  tr.C20         = ZERO;
+  tr.C21         = ZERO;
+  tr.C22         = vINF;
+  tr.C30         = ZERO;
+  tr.C31         = ZERO;
+  tr.C32         = ZERO;
+  tr.C33         = vINF;
+  tr.C40         = ZERO;
+  tr.C41         = ZERO;
+  tr.C42         = ZERO;
+  tr.C43         = ZERO;
+  tr.C44         = ONE;
+
+  tr.x    = x;
+  tr.y    = y;
+  tr.NDF  = -3.0;
+  tr.chi2 = ZERO;
 }
 
 void CbmL1PFFitter::Fit(vector<CbmStsTrack>& Tracks, vector<int>& pidHypo)
@@ -138,12 +138,13 @@ void CbmL1PFFitter::Fit(vector<CbmStsTrack>& Tracks, vector<int>& pidHypo)
   static int nHits = CbmL1::Instance()->fpAlgo->GetParameters()->GetNstationsActive();
   int iVec = 0, i = 0;
   int nTracks_SIMD = fvec::size();
-  L1TrackPar T;  // fitting parametr coresponding to current track
 
-  L1Fit fit;
-  fit.SetParticleMass(0.000511f);  // muon
+  L1TrackParFit fit;
+  fit.SetParticleMass(CbmL1::Instance()->fpAlgo->GetDefaultParticleMass());
 
-  CbmStsTrack* t[fvec::size()] {nullptr};
+  L1TrackPar& T = fit.fTr;  // fitting parametr coresponding to current track
+
+  CbmStsTrack* tr[fvec::size()] {nullptr};
 
   int ista;
   const L1Station* sta = CbmL1::Instance()->fpAlgo->GetParameters()->GetStations().begin();
@@ -151,8 +152,10 @@ void CbmL1PFFitter::Fit(vector<CbmStsTrack>& Tracks, vector<int>& pidHypo)
   fvec* x   = new fvec[nHits];
   fvec* u   = new fvec[nHits];
   fvec* v   = new fvec[nHits];
+  fvec* t   = new fvec[nHits];
   fvec* du2 = new fvec[nHits];
   fvec* dv2 = new fvec[nHits];
+  fvec* dt2 = new fvec[nHits];
   fvec* y   = new fvec[nHits];
   fvec* z   = new fvec[nHits];
   fvec* w   = new fvec[nHits];
@@ -178,28 +181,28 @@ void CbmL1PFFitter::Fit(vector<CbmStsTrack>& Tracks, vector<int>& pidHypo)
 
     if (N_vTracks - itrack < static_cast<unsigned short>(fvec::size())) nTracks_SIMD = N_vTracks - itrack;
     for (i = 0; i < nTracks_SIMD; i++) {
-      t[i]     = &Tracks[itrack + i];  // current track
-      T.x[i]   = t[i]->GetParamFirst()->GetX();
-      T.y[i]   = t[i]->GetParamFirst()->GetY();
-      T.tx[i]  = t[i]->GetParamFirst()->GetTx();
-      T.ty[i]  = t[i]->GetParamFirst()->GetTy();
-      T.qp[i]  = t[i]->GetParamFirst()->GetQp();
-      T.z[i]   = t[i]->GetParamFirst()->GetZ();
-      T.C00[i] = t[i]->GetParamFirst()->GetCovariance(0, 0);
-      T.C10[i] = t[i]->GetParamFirst()->GetCovariance(1, 0);
-      T.C11[i] = t[i]->GetParamFirst()->GetCovariance(1, 1);
-      T.C20[i] = t[i]->GetParamFirst()->GetCovariance(2, 0);
-      T.C21[i] = t[i]->GetParamFirst()->GetCovariance(2, 1);
-      T.C22[i] = t[i]->GetParamFirst()->GetCovariance(2, 2);
-      T.C30[i] = t[i]->GetParamFirst()->GetCovariance(3, 0);
-      T.C31[i] = t[i]->GetParamFirst()->GetCovariance(3, 1);
-      T.C32[i] = t[i]->GetParamFirst()->GetCovariance(3, 2);
-      T.C33[i] = t[i]->GetParamFirst()->GetCovariance(3, 3);
-      T.C40[i] = t[i]->GetParamFirst()->GetCovariance(4, 0);
-      T.C41[i] = t[i]->GetParamFirst()->GetCovariance(4, 1);
-      T.C42[i] = t[i]->GetParamFirst()->GetCovariance(4, 1);
-      T.C43[i] = t[i]->GetParamFirst()->GetCovariance(4, 3);
-      T.C44[i] = t[i]->GetParamFirst()->GetCovariance(4, 4);
+      tr[i]    = &Tracks[itrack + i];  // current track
+      T.x[i]   = tr[i]->GetParamFirst()->GetX();
+      T.y[i]   = tr[i]->GetParamFirst()->GetY();
+      T.tx[i]  = tr[i]->GetParamFirst()->GetTx();
+      T.ty[i]  = tr[i]->GetParamFirst()->GetTy();
+      T.qp[i]  = tr[i]->GetParamFirst()->GetQp();
+      T.z[i]   = tr[i]->GetParamFirst()->GetZ();
+      T.C00[i] = tr[i]->GetParamFirst()->GetCovariance(0, 0);
+      T.C10[i] = tr[i]->GetParamFirst()->GetCovariance(1, 0);
+      T.C11[i] = tr[i]->GetParamFirst()->GetCovariance(1, 1);
+      T.C20[i] = tr[i]->GetParamFirst()->GetCovariance(2, 0);
+      T.C21[i] = tr[i]->GetParamFirst()->GetCovariance(2, 1);
+      T.C22[i] = tr[i]->GetParamFirst()->GetCovariance(2, 2);
+      T.C30[i] = tr[i]->GetParamFirst()->GetCovariance(3, 0);
+      T.C31[i] = tr[i]->GetParamFirst()->GetCovariance(3, 1);
+      T.C32[i] = tr[i]->GetParamFirst()->GetCovariance(3, 2);
+      T.C33[i] = tr[i]->GetParamFirst()->GetCovariance(3, 3);
+      T.C40[i] = tr[i]->GetParamFirst()->GetCovariance(4, 0);
+      T.C41[i] = tr[i]->GetParamFirst()->GetCovariance(4, 1);
+      T.C42[i] = tr[i]->GetParamFirst()->GetCovariance(4, 1);
+      T.C43[i] = tr[i]->GetParamFirst()->GetCovariance(4, 3);
+      T.C44[i] = tr[i]->GetParamFirst()->GetCovariance(4, 4);
 
       int pid = pidHypo[itrack + i];
       if (pid == -1) pid = 211;
@@ -215,35 +218,40 @@ void CbmL1PFFitter::Fit(vector<CbmStsTrack>& Tracks, vector<int>& pidHypo)
     }
 
     for (iVec = 0; iVec < nTracks_SIMD; iVec++) {
-      int nHitsTrackMvd = t[iVec]->GetNofMvdHits();
-      int nHitsTrackSts = t[iVec]->GetNofStsHits();
+      int nHitsTrackMvd = tr[iVec]->GetNofMvdHits();
+      int nHitsTrackSts = tr[iVec]->GetNofStsHits();
       int nHitsTrack    = nHitsTrackMvd + nHitsTrackSts;
       for (i = 0; i < nHitsTrack; i++) {
-        float posx = 0.f, posy = 0.f, posz = 0.f;
+        float posx = 0.f, posy = 0.f, posz = 0.f, time = 0.;
 
         if (i < nHitsTrackMvd) {
           if (!listMvdHits) continue;
-          int hitIndex   = t[iVec]->GetMvdHitIndex(i);
+          int hitIndex   = tr[iVec]->GetMvdHitIndex(i);
           CbmMvdHit* hit = L1_DYNAMIC_CAST<CbmMvdHit*>(listMvdHits->At(hitIndex));
 
           posx = hit->GetX();
           posy = hit->GetY();
           posz = hit->GetZ();
+          time = hit->GetTime();
+
           // ista = hit->GetStationNr();
           ista =
             CbmL1::Instance()->fpAlgo->GetParameters()->GetStationIndexActive(hit->GetStationNr(), L1DetectorID::kMvd);
           if (ista == -1) continue;
           du2[ista][iVec] = hit->GetDx() * hit->GetDx();
           dv2[ista][iVec] = hit->GetDy() * hit->GetDy();
+          dt2[ista][iVec] = hit->GetTimeError() * hit->GetTimeError();
         }
         else {
           if (!listStsHits) continue;
-          int hitIndex   = t[iVec]->GetHitIndex(i - nHitsTrackMvd);
+          int hitIndex   = tr[iVec]->GetHitIndex(i - nHitsTrackMvd);
           CbmStsHit* hit = L1_DYNAMIC_CAST<CbmStsHit*>(listStsHits->At(hitIndex));
 
           posx = hit->GetX();
           posy = hit->GetY();
           posz = hit->GetZ();
+          time = hit->GetTime();
+
           //  ista = CbmStsSetup::Instance()->GetStationNumber(hit->GetAddress())
           //       + NMvdStations;  //hit->GetStationNr() - 1 + NMvdStations;
           ista = CbmL1::Instance()->fpAlgo->GetParameters()->GetStationIndexActive(
@@ -251,6 +259,7 @@ void CbmL1PFFitter::Fit(vector<CbmStsTrack>& Tracks, vector<int>& pidHypo)
           if (ista == -1) continue;
           du2[ista][iVec] = hit->GetDu() * hit->GetDu();
           dv2[ista][iVec] = hit->GetDv() * hit->GetDv();
+          dt2[ista][iVec] = hit->GetTimeError() * hit->GetTimeError();
         }
         w[ista][iVec] = 1.f;
 
@@ -259,6 +268,7 @@ void CbmL1PFFitter::Fit(vector<CbmStsTrack>& Tracks, vector<int>& pidHypo)
         u[ista][iVec] = posx * sta[ista].frontInfo.cos_phi[0] + posy * sta[ista].frontInfo.sin_phi[0];
         v[ista][iVec] = posx * sta[ista].backInfo.cos_phi[0] + posy * sta[ista].backInfo.sin_phi[0];
         z[ista][iVec] = posz;
+        t[ista][iVec] = time;
 
         sta[ista].fieldSlice.GetFieldValue(x[ista], y[ista], fB_temp);
         fB[ista].x[iVec] = fB_temp.x[iVec];
@@ -291,10 +301,10 @@ void CbmL1PFFitter::Fit(vector<CbmStsTrack>& Tracks, vector<int>& pidHypo)
     // fit forward
     i = 0;
 
-    FilterFirst(T, x_first, y_first, fstC00, fstC10, fstC11);
+    FilterFirst(fit, x_first, y_first, fstC00, fstC10, fstC11);
+    fit.fQp0 = fit.fTr.qp;
 
-    fvec qp0 = T.qp;
-    z1       = z[i];
+    z1 = z[i];
     sta[i].fieldSlice.GetFieldValue(T.x, T.y, b1);
     b1.Combine(fB[i], w[i]);
     z2 = z[i + 2];
@@ -313,16 +323,13 @@ void CbmL1PFFitter::Fit(vector<CbmStsTrack>& Tracks, vector<int>& pidHypo)
       fvec w1           = iif(initialised, w[i], fvec::Zero());
       fvec wIn          = iif(initialised, fvec::One(), fvec::Zero());
 
-      L1Extrapolate(T, z[i], qp0, fld, &w1);
-      if (i == NMvdStations) {  // TODO: How a hit can be also a station? (S.Zharko)
-        fit.L1AddPipeMaterial(T, qp0, wIn);
-        fit.EnergyLossCorrection(T, fit.PipeRadThick, qp0, fvec(-1.f), wIn);
-      }
-      fit.L1AddMaterial(T, CbmL1::Instance()->fpAlgo->GetParameters()->GetMaterialThickness(i, T.x, T.y), qp0, wIn);
-      fit.EnergyLossCorrection(T, CbmL1::Instance()->fpAlgo->GetParameters()->GetMaterialThickness(i, T.x, T.y), qp0,
-                               -1, wIn);
-      L1Filter(T, sta[i].frontInfo, u[i], du2[i], w1);
-      L1Filter(T, sta[i].backInfo, v[i], dv2[i], w1);
+      fit.Extrapolate(z[i], fit.fQp0, fld, w1);
+      auto radThick = CbmL1::Instance()->fpAlgo->GetParameters()->GetMaterialThickness(i, fit.fTr.x, fit.fTr.y);
+      fit.Filter(sta[i].frontInfo, u[i], du2[i], w1);
+      fit.Filter(sta[i].backInfo, v[i], dv2[i], w1);
+      fit.FilterTime(t[i], dt2[i], w1, sta[i].timeInfo);
+      fit.AddMsInMaterial(radThick, fit.fQp0, wIn);
+      fit.EnergyLossCorrection(radThick, fit.fQp0, -fvec::One(), wIn);
 
       b2 = b1;
       z2 = z1;
@@ -355,15 +362,15 @@ void CbmL1PFFitter::Fit(vector<CbmStsTrack>& Tracks, vector<int>& pidHypo)
       par.SetCovariance(4, 2, Tout.C42[iVec]);
       par.SetCovariance(4, 3, Tout.C43[iVec]);
       par.SetCovariance(4, 4, Tout.C44[iVec]);
-      t[iVec]->SetParamLast(&par);
+      tr[iVec]->SetParamLast(&par);
     }
 
     //fit backward
-    qp0 = T.qp;
+    fit.fQp0 = T.qp;
 
     i = nHits - 1;
 
-    FilterFirst(T, x_last, y_last, lstC00, lstC10, lstC11);
+    FilterFirst(fit, x_last, y_last, lstC00, lstC10, lstC11);
 
     z1 = z[i];
     sta[i].fieldSlice.GetFieldValue(T.x, T.y, b1);
@@ -385,16 +392,13 @@ void CbmL1PFFitter::Fit(vector<CbmStsTrack>& Tracks, vector<int>& pidHypo)
       fvec w1           = iif(initialised, w[i], fvec::Zero());
       fvec wIn          = iif(initialised, fvec::One(), fvec::Zero());
 
-      L1Extrapolate(T, z[i], qp0, fld, &w1);
-      if (i == NMvdStations - 1) {
-        fit.L1AddPipeMaterial(T, qp0, wIn);
-        fit.EnergyLossCorrection(T, fit.PipeRadThick, qp0, fvec(1.f), wIn);
-      }
-      fit.L1AddMaterial(T, CbmL1::Instance()->fpAlgo->GetParameters()->GetMaterialThickness(i, T.x, T.y), qp0, wIn);
-      fit.EnergyLossCorrection(T, CbmL1::Instance()->fpAlgo->GetParameters()->GetMaterialThickness(i, T.x, T.y), qp0, 1,
-                               wIn);
-      L1Filter(T, sta[i].frontInfo, u[i], du2[i], w1);
-      L1Filter(T, sta[i].backInfo, v[i], dv2[i], w1);
+      fit.Extrapolate(z[i], fit.fQp0, fld, w1);
+      auto radThick = CbmL1::Instance()->fpAlgo->GetParameters()->GetMaterialThickness(i, fit.fTr.x, fit.fTr.y);
+      fit.Filter(sta[i].frontInfo, u[i], du2[i], w1);
+      fit.Filter(sta[i].backInfo, v[i], dv2[i], w1);
+      fit.FilterTime(t[i], dt2[i], w1, sta[i].timeInfo);
+      fit.AddMsInMaterial(radThick, fit.fQp0, wIn);
+      fit.EnergyLossCorrection(radThick, fit.fQp0, fvec::One(), wIn);
 
       b2 = b1;
       z2 = z1;
@@ -426,10 +430,10 @@ void CbmL1PFFitter::Fit(vector<CbmStsTrack>& Tracks, vector<int>& pidHypo)
       par.SetCovariance(4, 2, T.C42[iVec]);
       par.SetCovariance(4, 3, T.C43[iVec]);
       par.SetCovariance(4, 4, T.C44[iVec]);
-      t[iVec]->SetParamFirst(&par);
+      tr[iVec]->SetParamFirst(&par);
 
-      t[iVec]->SetChiSq(T.chi2[iVec]);
-      t[iVec]->SetNDF(static_cast<int>(T.NDF[iVec]));
+      tr[iVec]->SetChiSq(T.chi2[iVec]);
+      tr[iVec]->SetNDF(static_cast<int>(T.NDF[iVec]));
     }
   }
 
@@ -448,10 +452,11 @@ void CbmL1PFFitter::GetChiToVertex(vector<CbmStsTrack>& Tracks, vector<PFFieldRe
   chiToVtx.reserve(Tracks.size());
 
   int nTracks_SIMD = fvec::size();
-  L1TrackPar T;  // fitting parametr coresponding to current track
-  L1Fit fit;
 
-  CbmStsTrack* t[fvec::size()] {nullptr};
+  L1TrackParFit fit;
+  L1TrackPar& T = fit.fTr;  // fitting parametr coresponding to current track
+
+  CbmStsTrack* tr[fvec::size()] {nullptr};
 
   int nStations        = CbmL1::Instance()->fpAlgo->GetParameters()->GetNstationsActive();
   int NMvdStations     = CbmL1::Instance()->fpAlgo->GetNstationsBeforePipe();
@@ -478,39 +483,39 @@ void CbmL1PFFitter::GetChiToVertex(vector<CbmStsTrack>& Tracks, vector<PFFieldRe
 
     fvec mass2;
     for (int iVec = 0; iVec < nTracks_SIMD; iVec++) {
-      t[iVec]     = &Tracks[itrack + iVec];  // current track
-      T.x[iVec]   = t[iVec]->GetParamFirst()->GetX();
-      T.y[iVec]   = t[iVec]->GetParamFirst()->GetY();
-      T.tx[iVec]  = t[iVec]->GetParamFirst()->GetTx();
-      T.ty[iVec]  = t[iVec]->GetParamFirst()->GetTy();
-      T.qp[iVec]  = t[iVec]->GetParamFirst()->GetQp();
-      T.z[iVec]   = t[iVec]->GetParamFirst()->GetZ();
-      T.C00[iVec] = t[iVec]->GetParamFirst()->GetCovariance(0, 0);
-      T.C10[iVec] = t[iVec]->GetParamFirst()->GetCovariance(1, 0);
-      T.C11[iVec] = t[iVec]->GetParamFirst()->GetCovariance(1, 1);
-      T.C20[iVec] = t[iVec]->GetParamFirst()->GetCovariance(2, 0);
-      T.C21[iVec] = t[iVec]->GetParamFirst()->GetCovariance(2, 1);
-      T.C22[iVec] = t[iVec]->GetParamFirst()->GetCovariance(2, 2);
-      T.C30[iVec] = t[iVec]->GetParamFirst()->GetCovariance(3, 0);
-      T.C31[iVec] = t[iVec]->GetParamFirst()->GetCovariance(3, 1);
-      T.C32[iVec] = t[iVec]->GetParamFirst()->GetCovariance(3, 2);
-      T.C33[iVec] = t[iVec]->GetParamFirst()->GetCovariance(3, 3);
-      T.C40[iVec] = t[iVec]->GetParamFirst()->GetCovariance(4, 0);
-      T.C41[iVec] = t[iVec]->GetParamFirst()->GetCovariance(4, 1);
-      T.C42[iVec] = t[iVec]->GetParamFirst()->GetCovariance(4, 1);
-      T.C43[iVec] = t[iVec]->GetParamFirst()->GetCovariance(4, 3);
-      T.C44[iVec] = t[iVec]->GetParamFirst()->GetCovariance(4, 4);
-      //      float mass = TDatabasePDG::Instance()->GetParticle(t[iVec]->GetPidHypo())->Mass();
-      const float mass = KFParticleDatabase::Instance()->GetMass(t[iVec]->GetPidHypo());
+      tr[iVec]    = &Tracks[itrack + iVec];  // current track
+      T.x[iVec]   = tr[iVec]->GetParamFirst()->GetX();
+      T.y[iVec]   = tr[iVec]->GetParamFirst()->GetY();
+      T.tx[iVec]  = tr[iVec]->GetParamFirst()->GetTx();
+      T.ty[iVec]  = tr[iVec]->GetParamFirst()->GetTy();
+      T.qp[iVec]  = tr[iVec]->GetParamFirst()->GetQp();
+      T.z[iVec]   = tr[iVec]->GetParamFirst()->GetZ();
+      T.C00[iVec] = tr[iVec]->GetParamFirst()->GetCovariance(0, 0);
+      T.C10[iVec] = tr[iVec]->GetParamFirst()->GetCovariance(1, 0);
+      T.C11[iVec] = tr[iVec]->GetParamFirst()->GetCovariance(1, 1);
+      T.C20[iVec] = tr[iVec]->GetParamFirst()->GetCovariance(2, 0);
+      T.C21[iVec] = tr[iVec]->GetParamFirst()->GetCovariance(2, 1);
+      T.C22[iVec] = tr[iVec]->GetParamFirst()->GetCovariance(2, 2);
+      T.C30[iVec] = tr[iVec]->GetParamFirst()->GetCovariance(3, 0);
+      T.C31[iVec] = tr[iVec]->GetParamFirst()->GetCovariance(3, 1);
+      T.C32[iVec] = tr[iVec]->GetParamFirst()->GetCovariance(3, 2);
+      T.C33[iVec] = tr[iVec]->GetParamFirst()->GetCovariance(3, 3);
+      T.C40[iVec] = tr[iVec]->GetParamFirst()->GetCovariance(4, 0);
+      T.C41[iVec] = tr[iVec]->GetParamFirst()->GetCovariance(4, 1);
+      T.C42[iVec] = tr[iVec]->GetParamFirst()->GetCovariance(4, 1);
+      T.C43[iVec] = tr[iVec]->GetParamFirst()->GetCovariance(4, 3);
+      T.C44[iVec] = tr[iVec]->GetParamFirst()->GetCovariance(4, 4);
+      //      float mass = TDatabasePDG::Instance()->GetParticle(tr[iVec]->GetPidHypo())->Mass();
+      const float mass = KFParticleDatabase::Instance()->GetMass(tr[iVec]->GetPidHypo());
       mass2[iVec]      = mass * mass;
 
-      int nHitsTrackMvd = t[iVec]->GetNofMvdHits();
+      int nHitsTrackMvd = tr[iVec]->GetNofMvdHits();
       for (int iH = 0; iH < 2; iH++) {
         float posx = 0.f, posy = 0.f, posz = 0.f;
 
         if (iH < nHitsTrackMvd) {
           if (!listMvdHits) continue;
-          int hitIndex   = t[iVec]->GetMvdHitIndex(iH);
+          int hitIndex   = tr[iVec]->GetMvdHitIndex(iH);
           CbmMvdHit* hit = L1_DYNAMIC_CAST<CbmMvdHit*>(listMvdHits->At(hitIndex));
 
           posx = hit->GetX();
@@ -520,7 +525,7 @@ void CbmL1PFFitter::GetChiToVertex(vector<CbmStsTrack>& Tracks, vector<PFFieldRe
         }
         else {
           if (!listStsHits) continue;
-          int hitIndex   = t[iVec]->GetHitIndex(iH - nHitsTrackMvd);
+          int hitIndex   = tr[iVec]->GetHitIndex(iH - nHitsTrackMvd);
           CbmStsHit* hit = L1_DYNAMIC_CAST<CbmStsHit*>(listStsHits->At(hitIndex));
 
           posx = hit->GetX();
@@ -545,25 +550,20 @@ void CbmL1PFFitter::GetChiToVertex(vector<CbmStsTrack>& Tracks, vector<PFFieldRe
       field.emplace_back(fld, i);
     }
 
+    fit.fQp0 = fit.fTr.qp;
+
     for (int iSt = nStations - 4; iSt >= 0; iSt--) {
 
       fvec w = iif(T.z > (zSta[iSt] + fvec(2.5)), fvec::One(), fvec::Zero());
 
-      L1Extrapolate(T, zSta[iSt], T.qp, fld, &w);
-      if (iSt == NMvdStations - 1) {
-        fit.L1AddPipeMaterial(T, T.qp, w);
-        fit.EnergyLossCorrection(T, fit.PipeRadThick, T.qp, fvec(1.f), w);
-      }
-      fit.L1AddMaterial(T, CbmL1::Instance()->fpAlgo->GetParameters()->GetMaterialThickness(iSt, T.x, T.y), T.qp, w);
-      fit.EnergyLossCorrection(T, CbmL1::Instance()->fpAlgo->GetParameters()->GetMaterialThickness(iSt, T.x, T.y), T.qp,
-                               fvec(1.f), w);
-    }
-    if (NMvdStations <= 0) {
-      fit.L1AddPipeMaterial(T, T.qp, ONE);
-      fit.EnergyLossCorrection(T, fit.PipeRadThick, T.qp, fvec(1.f), ONE);
+      fit.Extrapolate(zSta[iSt], fit.fQp0, fld, w);
+      auto radThick = CbmL1::Instance()->fpAlgo->GetParameters()->GetMaterialThickness(iSt, fit.fTr.x, fit.fTr.y);
+      fit.AddMsInMaterial(radThick, fit.fQp0, w);
+      fit.EnergyLossCorrection(radThick, fit.fQp0, fvec::One(), w);
     }
-    L1Extrapolate(T, primVtx.GetRefZ(), T.qp, fld);
-    fit.L1AddTargetMaterial(T, T.qp, 1);
+    fit.Extrapolate(primVtx.GetRefZ(), fit.fQp0, fld, fvec::One());
+    fit.AddMsInMaterial(fit.GetTargetRadThick(), fit.fQp0, fvec::One());
+    fit.EnergyLossCorrection(fit.GetTargetRadThick(), fit.fQp0, fvec::One(), fvec::One());
 
     Double_t Cv[3] = {primVtx.GetCovMatrix()[0], primVtx.GetCovMatrix()[1], primVtx.GetCovMatrix()[2]};
 
@@ -607,7 +607,7 @@ void CbmL1PFFitter::GetChiToVertex(vector<CbmStsTrack>& Tracks, vector<PFFieldRe
           par.SetCovariance(4, 2, T.C42[iVec]);
           par.SetCovariance(4, 3, T.C43[iVec]);
           par.SetCovariance(4, 4, T.C44[iVec]);
-          t[iVec]->SetParamFirst(&par);
+          tr[iVec]->SetParamFirst(&par);
         }
       }
     }
@@ -630,7 +630,7 @@ void CbmL1PFFitter::CalculateFieldRegion(vector<CbmStsTrack>& Tracks, vector<PFF
   int nTracks_SIMD = fvec::size();
   L1TrackPar T;  // fitting parametr coresponding to current track
 
-  CbmStsTrack* t[fvec::size()];
+  CbmStsTrack* tr[fvec::size()];
 
   int ista;
   const L1Station* sta = CbmL1::Instance()->fpAlgo->GetParameters()->GetStations().begin();
@@ -643,16 +643,16 @@ void CbmL1PFFitter::CalculateFieldRegion(vector<CbmStsTrack>& Tracks, vector<PFF
     if (N_vTracks - itrack < static_cast<unsigned short>(fvec::size())) nTracks_SIMD = N_vTracks - itrack;
 
     for (int i = 0; i < nTracks_SIMD; i++)
-      t[i] = &Tracks[itrack + i];  // current track
+      tr[i] = &Tracks[itrack + i];  // current track
 
     for (int iVec = 0; iVec < nTracks_SIMD; iVec++) {
-      int nHitsTrackMvd = t[iVec]->GetNofMvdHits();
+      int nHitsTrackMvd = tr[iVec]->GetNofMvdHits();
       for (int iH = 0; iH < 2; iH++) {
         float posx = 0.f, posy = 0.f, posz = 0.f;
 
         if (iH < nHitsTrackMvd) {
           if (!listMvdHits) continue;
-          int hitIndex   = t[iVec]->GetMvdHitIndex(iH);
+          int hitIndex   = tr[iVec]->GetMvdHitIndex(iH);
           CbmMvdHit* hit = L1_DYNAMIC_CAST<CbmMvdHit*>(listMvdHits->At(hitIndex));
 
           posx = hit->GetX();
@@ -662,7 +662,7 @@ void CbmL1PFFitter::CalculateFieldRegion(vector<CbmStsTrack>& Tracks, vector<PFF
         }
         else {
           if (!listStsHits) continue;
-          int hitIndex   = t[iVec]->GetHitIndex(iH - nHitsTrackMvd);
+          int hitIndex   = tr[iVec]->GetHitIndex(iH - nHitsTrackMvd);
           CbmStsHit* hit = L1_DYNAMIC_CAST<CbmStsHit*>(listStsHits->At(hitIndex));
 
           posx = hit->GetX();
@@ -704,7 +704,7 @@ void CbmL1PFFitter::CalculateFieldRegionAtLastPoint(vector<CbmStsTrack>& Tracks,
   int nTracks_SIMD = fvec::size();
   L1TrackPar T;  // fitting parametr coresponding to current track
 
-  CbmStsTrack* t[fvec::size()];
+  CbmStsTrack* tr[fvec::size()];
 
   int ista;
   const L1Station* sta = CbmL1::Instance()->fpAlgo->GetParameters()->GetStations().begin();
@@ -717,19 +717,19 @@ void CbmL1PFFitter::CalculateFieldRegionAtLastPoint(vector<CbmStsTrack>& Tracks,
     if (N_vTracks - itrack < static_cast<unsigned short>(fvec::size())) nTracks_SIMD = N_vTracks - itrack;
 
     for (int i = 0; i < nTracks_SIMD; i++) {
-      t[i] = &Tracks[itrack + i];  // current track
+      tr[i] = &Tracks[itrack + i];  // current track
     }
 
     for (int iVec = 0; iVec < nTracks_SIMD; iVec++) {
-      int nHitsTrackMvd = t[iVec]->GetNofMvdHits();
-      int nHits         = t[iVec]->GetNofHits();
+      int nHitsTrackMvd = tr[iVec]->GetNofMvdHits();
+      int nHits         = tr[iVec]->GetNofHits();
       for (int iH = 0; iH < 3; iH++) {
         float posx = 0.f, posy = 0.f, posz = 0.f;
 
         int hitNumber = nHits - iH - 1;
         if (hitNumber < nHitsTrackMvd) {
           if (!listMvdHits) continue;
-          int hitIndex   = t[iVec]->GetMvdHitIndex(hitNumber);
+          int hitIndex   = tr[iVec]->GetMvdHitIndex(hitNumber);
           CbmMvdHit* hit = L1_DYNAMIC_CAST<CbmMvdHit*>(listMvdHits->At(hitIndex));
 
           posx = hit->GetX();
@@ -739,7 +739,7 @@ void CbmL1PFFitter::CalculateFieldRegionAtLastPoint(vector<CbmStsTrack>& Tracks,
         }
         else {
           if (!listStsHits) continue;
-          int hitIndex   = t[iVec]->GetHitIndex(hitNumber - nHitsTrackMvd);
+          int hitIndex   = tr[iVec]->GetHitIndex(hitNumber - nHitsTrackMvd);
           CbmStsHit* hit = L1_DYNAMIC_CAST<CbmStsHit*>(listStsHits->At(hitIndex));
 
           posx = hit->GetX();
-- 
GitLab