From 7230f2d34d66fa579930afe7d0569e2bd8eb0d32 Mon Sep 17 00:00:00 2001
From: "se.gorbunov" <se.gorbunov@gsi.de>
Date: Tue, 13 Dec 2022 12:40:21 +0000
Subject: [PATCH] L1: fit: moving to L1TrackParFit utility..

---
 reco/L1/L1Algo/L1Algo.h            |   2 +
 reco/L1/L1Algo/L1CATrackFinder.cxx | 140 ++++++++++-------------------
 reco/L1/L1Algo/L1TrackFitter.cxx   |   4 +-
 reco/L1/L1Algo/L1TrackParFit.cxx   |  43 +++++----
 reco/L1/L1Algo/L1TrackParFit.h     |   4 +-
 5 files changed, 76 insertions(+), 117 deletions(-)

diff --git a/reco/L1/L1Algo/L1Algo.h b/reco/L1/L1Algo/L1Algo.h
index abb91bb991..8aa411d922 100644
--- a/reco/L1/L1Algo/L1Algo.h
+++ b/reco/L1/L1Algo/L1Algo.h
@@ -548,6 +548,8 @@ private:
   fvec fTargY {L1Utils::kNaN};  ///< target position y coordinate for the current iteration (modifiable)
   fvec fTargZ {L1Utils::kNaN};  ///< target position z coordinate for the current iteration (modifiable)
 
+  bool fIsTargetField {false};  ///< is the magnetic field present at the target
+
   L1FieldValue fTargB _fvecalignment {};               // field in the target point (modifiable, do not touch!!)
   L1XYMeasurementInfo TargetXYInfo _fvecalignment {};  // target constraint  [cm]
 
diff --git a/reco/L1/L1Algo/L1CATrackFinder.cxx b/reco/L1/L1Algo/L1CATrackFinder.cxx
index 8e909cf558..dfe5662112 100644
--- a/reco/L1/L1Algo/L1CATrackFinder.cxx
+++ b/reco/L1/L1Algo/L1CATrackFinder.cxx
@@ -213,21 +213,16 @@ inline void L1Algo::findSingletsStep1(  /// input 1st stage of singlet search
   const L1Station& fld1Sta1 = fParameters.GetStation(fld1Ista1);
   const L1Station& fld1Sta2 = fParameters.GetStation(fld1Ista2);
 
-  L1Fit fitOld;
   L1TrackParFit fit;
   fit.fQp0 = fvec(0.);
 
-  if (fpCurrentIteration->GetElectronFlag()) {
-    fitOld.SetParticleMass(L1Constants::phys::kElectronMass);
-    fit.SetParticleMass(L1Constants::phys::kElectronMass);
-  }
+  if (fpCurrentIteration->GetElectronFlag()) { fit.SetParticleMass(L1Constants::phys::kElectronMass); }
   else {
-    fitOld.SetParticleMass(fDefaultMass);
     fit.SetParticleMass(fDefaultMass);
   }
 
   for (int i1_V = 0; i1_V < n1_V; i1_V++) {
-    L1TrackPar& T = fit1.fTr;
+    L1TrackPar& T = fit.fTr;
 
     // field made by  the left hit, the target and the station istac in-between.
     // is used for extrapolation to the target and to the middle hit
@@ -295,41 +290,17 @@ inline void L1Algo::findSingletsStep1(  /// input 1st stage of singlet search
 
       std::tie(T.C00, T.C10, T.C11) = stal.FormXYCovarianceMatrix(du2_l[i1_V], dv2_l[i1_V]);
 
-      //assert(T.IsConsistent(true, -1));
-
-      //  add the target
-      {
-        fvec eX, eY, J04, J14;
-        fvec dz;
-        dz = fTargZ - zl;
-        L1ExtrapolateJXY0(T.tx, T.ty, dz, fld0, eX, eY, J04, J14);
-        fvec J[6];
-        J[0] = dz;
-        J[1] = 0;
-        J[2] = J04;
-        J[3] = 0;
-        J[4] = dz;
-        J[5] = J14;
-        L1FilterVtx(T, fTargX, fTargY, TargetXYInfo, eX, eY, J);
-      }
+      fit.AddTargetToLine(fTargX, fTargY, fTargZ, TargetXYInfo, fld0);
     }
 
-    //assert(T.IsConsistent(true, -1));
-
-    if (kMcbm == fTrackingMode) {
-      fitOld.L1AddThickMaterial(T, fParameters.GetMaterialThickness(istal, T.x, T.y), fMaxInvMom, fvec::One(),
-                                stal.fZthick, 1);
-    }
-    else {
-      fitOld.L1AddMaterial(T, fParameters.GetMaterialThickness(istal, T.x, T.y), fMaxInvMom, fvec::One());
-    }
+    fit.AddMsInMaterial(fParameters.GetMaterialThickness(istal, T.x, T.y), fMaxInvMom, fvec::One());
 
     //if ((istam >= fNstationsBeforePipe) && (istal <= fNstationsBeforePipe - 1)) {
-    //fitOld.L1AddPipeMaterial(T, fMaxInvMom, fvec::One());
+    //fit.L1AddPipeMaterial(T, fMaxInvMom, fvec::One());
     //}
 
     fvec dz = stam.fZ - zl;
-    L1ExtrapolateTime(T, dz, stam.timeInfo);
+    L1ExtrapolateTime(T, dz, fvec::One());
 
     // extrapolate to the middle hit
     L1Extrapolate0(T, stam.fZ, fld0);
@@ -487,13 +458,14 @@ inline void L1Algo::findDoubletsStep0(
 /// Add the middle hits to parameters estimation. Propagate to right station.
 /// Find the triplets(right hit). Reformat data in the portion of triplets.
 inline void L1Algo::findTripletsStep0(  // input
-  L1HitPoint* vHits_r, int /*iStaL*/, int iStaM, int iStaR, L1HitPoint* vHits_m, L1TrackPar* T_1, L1FieldRegion* fld_1,
+  L1HitPoint* vHits_r, int iStaL, int iStaM, int iStaR, L1HitPoint* vHits_m, L1TrackPar* T_1, L1FieldRegion* fld_1,
   L1HitIndex_t* hitsl_1, Tindex n2, L1Vector<L1HitIndex_t>& hitsm_2, L1Vector<L1HitIndex_t>& i1_2,
   // output
   Tindex& n3, L1Vector<L1TrackPar>& T_3, L1Vector<L1HitIndex_t>& hitsl_3, L1Vector<L1HitIndex_t>& hitsm_3,
   L1Vector<L1HitIndex_t>& hitsr_3, L1Vector<fvec>& u_front_3, L1Vector<fvec>& u_back_3, L1Vector<fvec>& z_Pos_3,
   L1Vector<fvec>& du2_3, L1Vector<fvec>& dv2_3, L1Vector<fvec>& t_3, L1Vector<fvec>& dt2_3)
 {
+  const L1Station& stal = fParameters.GetStation(iStaL);
   const L1Station& stam = fParameters.GetStation(iStaM);
   const L1Station& star = fParameters.GetStation(iStaR);
 
@@ -511,10 +483,12 @@ inline void L1Algo::findTripletsStep0(  // input
   L1TrackPar_0.C55 = 1.f;
   */
 
-  L1Fit fitOld;
+  bool isMomentumFitted = (fIsTargetField || (stal.fieldStatus != 0) || (stam.fieldStatus != 0));
+  //bool isTimeFitted     = ((stal.timeInfo != 0) || (stam.timeInfo != 0));
+
   L1TrackParFit fit;
-  fitOld.SetParticleMass(fDefaultMass);
   fit.SetParticleMass(fDefaultMass);
+  fit.fQp0 = fvec(0.);
 
   n3          = 0;
   Tindex n3_V = 0, n3_4 = 0;
@@ -578,42 +552,25 @@ inline void L1Algo::findTripletsStep0(  // input
       hitsm_2_tmp[n2_4] = hitsm_2[i2];
     }  // n2_4
 
-    fvec dz = zPos_2 - T2.z;
-
-    L1ExtrapolateTime(T2, dz, stam.timeInfo);
+    // add the middle hit
 
-    // assert(T2.IsConsistent(true, n2_4));
-
-    // add middle hit
-    L1ExtrapolateLine(T2, zPos_2);
-
-    // assert(T2.IsConsistent(true, n2_4));
-
-    // L1TrackPar tStore1 = T2;
-
-    L1Filter(T2, stam.frontInfo, u_front_2, du2_2, fvec::One());
-    L1Filter(T2, stam.backInfo, u_back_2, dv2_2, fvec::One());
+    fit.ExtrapolateLine(zPos_2, fvec::One());
 
+    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);
 
-    if (kMcbm == fTrackingMode) {
-      fitOld.L1AddThickMaterial(T2, fParameters.GetMaterialThickness(iStaM, T2.x, T2.y), fMaxInvMom, fvec::One(),
-                                stam.fZthick, 1);
-    }
-    else if (kGlobal == fTrackingMode) {
-      fitOld.L1AddMaterial(T2, fParameters.GetMaterialThickness(iStaM, T2.x, T2.y), fMaxInvMom, fvec::One());
-    }
-    else {
-      fitOld.L1AddMaterial(T2, fParameters.GetMaterialThickness(iStaM, T2.x, T2.y), T2.qp, fvec::One());
-    }
-
-    //if ((iStaR >= fNstationsBeforePipe) && (iStaM <= fNstationsBeforePipe - 1)) { fitOld.L1AddPipeMaterial(T2, T2.qp, 1); }
+    fit.AddMsInMaterial(fParameters.GetMaterialThickness(iStaM, T2.x, T2.y), isMomentumFitted ? T2.qp : fMaxInvMom,
+                        fvec::One());
 
-    fvec dz2 = star.fZ - T2.z;
-    L1ExtrapolateTime(T2, dz2, stam.timeInfo);
+    //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);
 
     // assert(T2.IsConsistent(true, n2_4));
@@ -668,12 +625,14 @@ inline void L1Algo::findTripletsStep0(  // input
 
         auto [xr, yr] = star.ConvUVtoXY<fscal>(hitr.U(), hitr.V());
 
-        L1TrackPar T_cur = T2;
+        L1TrackParFit fit3;
+        fit3.SetParticleMass(fDefaultMass);
+        fit3.fQp0 = T2.qp;
 
-        fvec dz3 = zr - T_cur.z;
-        L1ExtrapolateTime(T_cur, dz3, star.timeInfo);
+        L1TrackPar& T_cur = fit3.fTr;
+        T_cur             = T2;
 
-        L1ExtrapolateLine(T_cur, zr);
+        fit3.ExtrapolateLine(zr, fvec::One());
 
         if ((star.timeInfo) && (stam.timeInfo))
           if (fabs(T_cur.t[i2_4] - hitr.T()) > sqrt(T_cur.C55[i2_4] + hitr.dT2()) * 5) continue;
@@ -787,21 +746,22 @@ inline void L1Algo::findTripletsStep1(  // input
   //                L1TrackPar *T_3
   L1Vector<L1TrackPar>& T_3)
 {
+  L1TrackParFit fit;
+  fit.SetParticleMass(fDefaultMass);
 
   for (Tindex i3_V = 0; i3_V < n3_V; ++i3_V) {
 
-    fvec dz = z_Pos[i3_V] - T_3[i3_V].z;
-
-    L1TrackPar& T3 = T_3[i3_V];
+    L1TrackPar& T3 = fit.fTr;
+    T3             = T_3[i3_V];
+    fit.fQp0       = fit.fTr.qp;
 
-    L1ExtrapolateTime(T3, dz, star.timeInfo);
+    fit.ExtrapolateLine(z_Pos[i3_V], fvec::One());
 
-    L1ExtrapolateLine(T3, z_Pos[i3_V]);
+    fit.Filter(star.frontInfo, u_front_[i3_V], du2_3[i3_V], fvec::One());
+    fit.Filter(star.backInfo, u_back_[i3_V], dv2_3[i3_V], fvec::One());
 
-    L1Filter(T3, star.frontInfo, u_front_[i3_V], du2_3[i3_V], fvec::One());
-    L1Filter(T3, star.backInfo, u_back_[i3_V], dv2_3[i3_V], fvec::One());
-
-    if (kMcbm != fTrackingMode) { FilterTime(T3, t_3[i3_V], dt2_3[i3_V], star.timeInfo); }
+    if (kMcbm != fTrackingMode) { fit.FilterTime(t_3[i3_V], dt2_3[i3_V], fvec::One(), star.timeInfo); }
+    T_3[i3_V] = T3;
   }
 }
 
@@ -929,24 +889,12 @@ inline void L1Algo::findTripletsStep2(Tindex n3, int istal, int istam, int istar
         fit.Filter(sta[ih0].backInfo, v[ih0], dv2[ih0], fvec::One());
         fit.FilterTime(t[ih0], dt2[ih0], fvec::One(), sta[ih0].timeInfo);
 
-        {  // add the target constraint
-          fvec eX, eY, J04, J14;
-          fvec dz;
-          dz = fTargZ - T.z;
-          L1ExtrapolateJXY0(T.tx, T.ty, dz, fldTarget, eX, eY, J04, J14);
-          fvec J[6];
-          J[0] = dz;
-          J[1] = 0;
-          J[2] = J04;
-          J[3] = 0;
-          J[4] = dz;
-          J[5] = J14;
-          L1FilterVtx(T, fTargX, fTargY, TargetXYInfo, eX, eY, J);
-        }
+        //  add the target constraint
+        fit.AddTargetToLine(fTargX, fTargY, fTargZ, TargetXYInfo, fldTarget);
 
         for (int ih = 1; ih < NHits; ++ih) {
           fit.Extrapolate(z[ih], qp0, fld, fvec::One());
-          fit.AddMaterial(fParameters.GetMaterialThickness(ista[ih], T.x, T.y), qp0, fvec::One());
+          fit.AddMsInMaterial(fParameters.GetMaterialThickness(ista[ih], T.x, T.y), qp0, fvec::One());
           //if (ista[ih] == fNstationsBeforePipe) { fit.AddPipeMaterial(qp0, fvec::One()); }
           fit.Filter(sta[ih].frontInfo, u[ih], du2[ih], fvec::One());
           fit.Filter(sta[ih].backInfo, v[ih], dv2[ih], fvec::One());
@@ -979,7 +927,7 @@ inline void L1Algo::findTripletsStep2(Tindex n3, int istal, int istam, int istar
 
         for (int ih = NHits - 2; ih >= 0; --ih) {
           fit.Extrapolate(z[ih], qp0, fld, fvec::One());
-          fit.AddMaterial(fParameters.GetMaterialThickness(ista[ih], T.x, T.y), qp0, fvec::One());
+          fit.AddMsInMaterial(fParameters.GetMaterialThickness(ista[ih], T.x, T.y), qp0, fvec::One());
           //if (ista[ih] == fNstationsBeforePipe - 1) { fit.AddPipeMaterial(qp0, fvec::One()); }
           fit.Filter(sta[ih].frontInfo, u[ih], du2[ih], fvec::One());
           fit.Filter(sta[ih].backInfo, v[ih], dv2[ih], fvec::One());
@@ -1759,6 +1707,8 @@ void L1Algo::CATrackFinder()
           fParameters.GetStation(0).fieldSlice.GetFieldValue(0, 0, fTargB);
         }  // NOTE: calculates field fTargB in the center of 0th station
 
+        fIsTargetField = (fabs(fTargB.y[0]) > 0.001);
+
         TargetXYInfo.C00 = SigmaTargetX * SigmaTargetX;
         TargetXYInfo.C10 = 0;
         TargetXYInfo.C11 = SigmaTargetY * SigmaTargetY;
diff --git a/reco/L1/L1Algo/L1TrackFitter.cxx b/reco/L1/L1Algo/L1TrackFitter.cxx
index 77329ba97a..0c17271136 100644
--- a/reco/L1/L1Algo/L1TrackFitter.cxx
+++ b/reco/L1/L1Algo/L1TrackFitter.cxx
@@ -533,7 +533,7 @@ void L1Algo::L1KFTrackFitter()
         //fit.AddPipeMaterial(qp01, wExtr);
         //fit.EnergyLossCorrection(fit.fPipeRadThick, qp01, fvec(1.f), wExtr);
         //}
-        fit.AddMaterial(fParameters.GetMaterialThickness(ista, tr.x, tr.y), qp01, wExtr);
+        fit.AddMsInMaterial(fParameters.GetMaterialThickness(ista, tr.x, tr.y), qp01, wExtr);
         fit.EnergyLossCorrection(fParameters.GetMaterialThickness(ista, tr.x, tr.y), qp01, fvec(1.f), wExtr);
 
         fit.Filter(sta[ista].frontInfo, u[ista], du2[ista], w1);
@@ -683,7 +683,7 @@ void L1Algo::L1KFTrackFitter()
         //fit.AddPipeMaterial(qp01, wExtr);
         //fit.EnergyLossCorrection(fit.fPipeRadThick, qp01, fvec(-1.f), wExtr);
         //}
-        fit.AddMaterial(fParameters.GetMaterialThickness(ista, tr.x, tr.y), qp01, wExtr);
+        fit.AddMsInMaterial(fParameters.GetMaterialThickness(ista, tr.x, tr.y), qp01, wExtr);
         fit.EnergyLossCorrection(fParameters.GetMaterialThickness(ista, tr.x, tr.y), qp01, fvec(-1.f), wExtr);
 
         fit.Filter(sta[ista].frontInfo, u[ista], du2[ista], w1);
diff --git a/reco/L1/L1Algo/L1TrackParFit.cxx b/reco/L1/L1Algo/L1TrackParFit.cxx
index 719980e2d3..ef3ba7252e 100644
--- a/reco/L1/L1Algo/L1TrackParFit.cxx
+++ b/reco/L1/L1Algo/L1TrackParFit.cxx
@@ -932,12 +932,35 @@ void L1TrackParFit::ExtrapolateLine(fvec z_out, const fvec& w)
 {
   // extrapolate the track assuming fQp0 == 0
   //
+  // it is a copy of a sequence two routines
+  //  L1ExtrapolateTime() and L1ExtrapolateLine()
+  // TODO: make it right
 
   cnst c_light(29.9792458);
   fvec dz = (z_out - fTr.z);
   dz.setZero(w <= fvec::Zero());
 
   L1TrackPar& T = fTr;
+
+  // extrapolate time
+  fvec L = sqrt(T.tx * T.tx + T.ty * T.ty + fvec(1.));
+  T.t += dz * L / c_light;
+
+  const fvec k1 = dz * T.tx / (c_light * L);
+  const fvec k2 = dz * T.ty / (c_light * L);
+
+  fvec c52 = T.C52;
+  fvec c53 = T.C53;
+
+  T.C50 += k1 * T.C20 + k2 * T.C30;
+  T.C51 += k1 * T.C21 + k2 * T.C31;
+  T.C52 += k1 * T.C22 + k2 * T.C32;
+  T.C53 += k1 * T.C32 + k2 * T.C33;
+  T.C54 += k1 * T.C42 + k2 * T.C43;
+  T.C55 += k1 * (T.C52 + c52) + k2 * (T.C53 + c53);
+
+  // extrapolate trajectory
+
   T.x += T.tx * dz;
   T.y += T.ty * dz;
   T.z += dz;
@@ -960,26 +983,10 @@ void L1TrackParFit::ExtrapolateLine(fvec z_out, const fvec& w)
 
   T.C40 += dz * T.C42;
   T.C41 += dz * T.C43;
-
-  fvec L = sqrt(T.tx * T.tx + T.ty * T.ty + fvec(1.));
-  T.t += dz * L / c_light;
-
-  const fvec k1 = dz * T.tx / (c_light * L);
-  const fvec k2 = dz * T.ty / (c_light * L);
-
-  fvec c52 = T.C52;
-  fvec c53 = T.C53;
-
-  T.C50 += k1 * T.C20 + k2 * T.C30;
-  T.C51 += k1 * T.C21 + k2 * T.C31;
-  T.C52 += k1 * T.C22 + k2 * T.C32;
-  T.C53 += k1 * T.C32 + k2 * T.C33;
-  T.C54 += k1 * T.C42 + k2 * T.C43;
-  T.C55 += k1 * (T.C52 + c52) + k2 * (T.C53 + c53);
 }
 
 
-void L1TrackParFit::AddMaterial(const fvec& radThick, fvec qp0, fvec w)
+void L1TrackParFit::AddMsInMaterial(const fvec& radThick, fvec qp0, fvec w)
 {
   cnst ONE = 1.;
 
@@ -1004,7 +1011,7 @@ void L1TrackParFit::AddMaterial(const fvec& radThick, fvec qp0, fvec w)
   fTr.C33 += w * (ONE + tyty) * a;
 }
 
-void L1TrackParFit::AddThickMaterial(fvec radThick, fvec qp0, fvec w, fvec thickness, bool fDownstream)
+void L1TrackParFit::AddMsInThickMaterial(fvec radThick, fvec qp0, fvec w, fvec thickness, bool fDownstream)
 {
   cnst ONE = 1.;
 
diff --git a/reco/L1/L1Algo/L1TrackParFit.h b/reco/L1/L1Algo/L1TrackParFit.h
index 2bbce0de61..217351c5f2 100644
--- a/reco/L1/L1Algo/L1TrackParFit.h
+++ b/reco/L1/L1Algo/L1TrackParFit.h
@@ -68,8 +68,8 @@ public:
   void EnergyLossCorrectionCarbon(const fvec& radThick, fvec& qp0, fvec direction, fvec w);
   void EnergyLossCorrectionAl(const fvec& radThick, fvec& qp0, fvec direction, fvec w);
 
-  void AddMaterial(const fvec& radThick, fvec qp0, fvec w);
-  void AddThickMaterial(fvec radThick, fvec qp0, fvec w, fvec thickness, bool fDownstream);
+  void AddMsInMaterial(const fvec& radThick, fvec qp0, fvec w);
+  void AddMsInThickMaterial(fvec radThick, fvec qp0, fvec w, fvec thickness, bool fDownstream);
 
   void GetExtrapolatedXYline(const fvec& z, const L1FieldRegion& F, fvec& extrX, fvec& extrY, fvec Jx[6],
                              fvec Jy[6]) const;
-- 
GitLab