From 2f05608aef1c666e86bd5e1db3c0013554fb1f29 Mon Sep 17 00:00:00 2001
From: "se.gorbunov" <se.gorbunov@gsi.de>
Date: Tue, 13 Sep 2022 23:07:47 +0000
Subject: [PATCH] L1: bugfix in creation of the time grid

---
 algo/ca/simd/CaSimdVc.h            |  1 +
 reco/L1/L1Algo/L1CATrackFinder.cxx | 52 ++++++++++++++----------------
 2 files changed, 26 insertions(+), 27 deletions(-)

diff --git a/algo/ca/simd/CaSimdVc.h b/algo/ca/simd/CaSimdVc.h
index 694ffd04e9..f807e12d02 100644
--- a/algo/ca/simd/CaSimdVc.h
+++ b/algo/ca/simd/CaSimdVc.h
@@ -13,6 +13,7 @@ namespace cbm::algo::ca
   typedef Vc::float_v fvec;
   //typedef Vc::double_v fvec;
   //typedef Vc::Vector<float, Vc::VectorAbi::Scalar>  fvec;
+  //typedef Vc::SimdArray<float, 4> fvec;
 
   typedef fvec::EntryType fscal;
   typedef fvec::MaskType fmask;
diff --git a/reco/L1/L1Algo/L1CATrackFinder.cxx b/reco/L1/L1Algo/L1CATrackFinder.cxx
index 837dfa812b..df30f45a90 100644
--- a/reco/L1/L1Algo/L1CATrackFinder.cxx
+++ b/reco/L1/L1Algo/L1CATrackFinder.cxx
@@ -400,9 +400,9 @@ inline void L1Algo::findDoubletsStep0(
     // Pick_m22 is not used, search for mean squared, 2nd version
 
     // -- collect possible doublets --
-    const fscal iz         = 1.f / (T1.z[i1_4] - fParameters.GetTargetPositionZ()[0]);
-    const fscal timeError  = T1.C55[i1_4];
-    const fscal time       = T1.t[i1_4];
+    const fscal iz        = 1.f / (T1.z[i1_4] - fParameters.GetTargetPositionZ()[0]);
+    const fscal timeError = T1.C55[i1_4];
+    const fscal time      = T1.t[i1_4];
 
     L1HitAreaTime areaTime(vGridTime[iStaM], T1.x[i1_4] * iz, T1.y[i1_4] * iz,
                            (sqrt(Pick_m22 * (T1.C00 + stam.XYInfo.C00)) + fMaxDZ * abs(T1.tx))[i1_4] * iz,
@@ -746,9 +746,9 @@ inline void L1Algo::findTripletsStep0(  // input
       if (fabs(T2.tx[i2_4]) > fMaxSlope) continue;
       if (fabs(T2.ty[i2_4]) > fMaxSlope) continue;
 
-      const fvec Pick_r22    = (fTripletChi2Cut - T2.chi2);
-      const fscal timeError  = T2.C55[i2_4];
-      const fscal time       = T2.t[i2_4];
+      const fvec Pick_r22   = (fTripletChi2Cut - T2.chi2);
+      const fscal timeError = T2.C55[i2_4];
+      const fscal time      = T2.t[i2_4];
       // find first possible hit
 
 #ifdef DO_NOT_SELECT_TRIPLETS
@@ -1756,18 +1756,6 @@ void L1Algo::CATrackFinder()
     HitsUnusedStopIndex[ista]  = fInputData.GetStopHitIndex(ista);
   }
 
-  fscal lasttime  = 0;
-  fscal starttime = std::numeric_limits<fscal>::max();
-
-  for (int ist = 0; ist < fParameters.GetNstationsActive(); ++ist)
-    for (L1HitIndex_t ih = fInputData.GetStartHitIndex(ist); ih < fInputData.GetStopHitIndex(ist); ++ih) {
-
-      const fscal time = fInputData.GetHit(ih).t;
-      if ((lasttime < time) && (!std::isinf(time))) lasttime = time;
-      if ((starttime > time) && (time > 0)) starttime = time;
-    }
-
-
 #ifdef XXX
   c_time.Start();
   c_timerG.Start();
@@ -1791,12 +1779,22 @@ void L1Algo::CATrackFinder()
 
   vHitsUnused = &vNotUsedHits_Buf;
 
-
   for (int iS = 0; iS < fParameters.GetNstationsActive(); ++iS) {
+    bool timeUninitialised = 1;
+    fscal lasttime         = 0;
+    fscal starttime        = 0;
+    for (L1HitIndex_t ih = fInputData.GetStartHitIndex(iS); ih < fInputData.GetStopHitIndex(iS); ++ih) {
+      const fscal time = fInputData.GetHit(ih).t;
+      assert(std::isfinite(time));
+      if (timeUninitialised || lasttime < time) { lasttime = time; }
+      if (timeUninitialised || starttime > time) { starttime = time; }
+      timeUninitialised = false;
+    }
 
     vGridTime[iS].BuildBins(-1, 1, -0.6, 0.6, starttime, lasttime, xStep, yStep, (lasttime - starttime + 1));
     int start = HitsUnusedStartIndex[iS];
     int nhits = HitsUnusedStopIndex[iS] - start;
+
     if (nhits > 0) {
       vGridTime[iS].StoreHits(nhits, &(fInputData.GetHit(start)), iS, *this, start, &(vNotUsedHits_Buf[start]),
                               &(fInputData.GetHit(start)), &(RealIHit_v[start]));
@@ -2080,7 +2078,7 @@ void L1Algo::CATrackFinder()
           Tindex nG_2;
           hitsmG_2.clear();
           i1G_2.clear();
-          if ((fMissingHits && ((istal == 0) || (istal == 1))) || !fMissingHits)
+          if ((fMissingHits && ((istal == 0) || (istal == 1))) || !fMissingHits) {
             DupletsStaPort(  // input
               istal, istal + 2, ip, fDupletPortionSize, fDupletPortionStopIndex,
               // output
@@ -2089,20 +2087,20 @@ void L1Algo::CATrackFinder()
               lmDupletsG[istal],
 
               nG_2, i1G_2, hitsmG_2);
+          }
 
-          if ((fMissingHits && (istal == 0)) || !fMissingHits)
+          if ((fMissingHits && (istal == 0)) || !fMissingHits) {
             TripletsStaPort(  // input
               istal, istal + 1, istal + 3, nstaltriplets, T_1, fld_1, hitsl_1,
 
               n_2, i1_2, hitsm_2, lmDupletsG[istal + 1]);
+          }
 
-          if ((fMissingHits && (istal == 1)) || !fMissingHits)
+          if ((fMissingHits && (istal == 1)) || !fMissingHits) {
             TripletsStaPort(  // input
-              istal, istal + 2, istal + 3, nstaltriplets, TG_1, fldG_1, hitslG_1,
-
-              nG_2, i1G_2, hitsmG_2, lmDuplets[istal + 2]
-
-            );
+              istal, istal + 2, istal + 3, nstaltriplets, TG_1, fldG_1, hitslG_1, nG_2, i1G_2, hitsmG_2,
+              lmDuplets[istal + 2]);
+          }
         }
       }  //
     }
-- 
GitLab