From 57a9e9062a3aca93ed9e080b528cc7fab21c3bde Mon Sep 17 00:00:00 2001
From: "se.gorbunov" <se.gorbunov@gsi.de>
Date: Tue, 6 Sep 2022 00:00:48 +0000
Subject: [PATCH] L1: SIMD vectors: remove fvecLen

---
 reco/KF/CbmKFParticleFinder.cxx               |  8 +--
 reco/KF/CbmKFParticleInterface.cxx            |  4 +-
 reco/L1/L1Algo/L1CATrackFinder.cxx            | 56 +++++++--------
 reco/L1/L1Algo/L1Constants.h                  | 14 ++--
 reco/L1/L1Algo/L1MaterialInfo.cxx             |  2 +-
 reco/L1/L1Algo/L1TrackFitter.cxx              | 18 ++---
 reco/L1/L1Algo/L1TrackPar.h                   |  6 +-
 .../CbmL1RichENNRingFinderParallel.cxx        | 72 +++++++++----------
 reco/L1/ParticleFinder/CbmL1PFFitter.cxx      | 32 ++++-----
 reco/L1/vectors/L1vecPseudo.h                 | 48 ++++++-------
 reco/L1/vectors/L1vecVc.h                     |  5 +-
 reco/littrack/parallel/LitFieldGrid.h         |  2 +-
 reco/littrack/parallel/LitMaterialGrid.h      |  2 +-
 13 files changed, 133 insertions(+), 136 deletions(-)

diff --git a/reco/KF/CbmKFParticleFinder.cxx b/reco/KF/CbmKFParticleFinder.cxx
index bfa255572f..23e8aef0b9 100644
--- a/reco/KF/CbmKFParticleFinder.cxx
+++ b/reco/KF/CbmKFParticleFinder.cxx
@@ -283,8 +283,8 @@ void CbmKFParticleFinder::Exec(Option_t* /*opt*/)
     fitter.CalculateFieldRegionAtLastPoint(vRTracks, vFieldAtLastPoint);
     vector<KFFieldVector> vFieldVector(ntracks), vFieldVectorAtLastPoint(ntracks);
     for (Int_t iTr = 0; iTr < ntracks; iTr++) {
-      int entrSIMD                = iTr % fvecLen;
-      int entrVec                 = iTr / fvecLen;
+      int entrSIMD                = iTr % fvec::size();
+      int entrVec                 = iTr / fvec::size();
       vFieldVector[iTr].fField[0] = vField[entrVec].cx0[entrSIMD];
       vFieldVector[iTr].fField[1] = vField[entrVec].cx1[entrSIMD];
       vFieldVector[iTr].fField[2] = vField[entrVec].cx2[entrSIMD];
@@ -297,8 +297,8 @@ void CbmKFParticleFinder::Exec(Option_t* /*opt*/)
       vFieldVector[iTr].fField[9] = vField[entrVec].z0[entrSIMD];
     }
     for (Int_t iTr = 0; iTr < ntracks; iTr++) {
-      int entrSIMD                           = iTr % fvecLen;
-      int entrVec                            = iTr / fvecLen;
+      int entrSIMD                           = iTr % fvec::size();
+      int entrVec                            = iTr / fvec::size();
       vFieldVectorAtLastPoint[iTr].fField[0] = vFieldAtLastPoint[entrVec].cx0[entrSIMD];
       vFieldVectorAtLastPoint[iTr].fField[1] = vFieldAtLastPoint[entrVec].cx1[entrSIMD];
       vFieldVectorAtLastPoint[iTr].fField[2] = vFieldAtLastPoint[entrVec].cx2[entrSIMD];
diff --git a/reco/KF/CbmKFParticleInterface.cxx b/reco/KF/CbmKFParticleInterface.cxx
index b117af3b16..690f4ca947 100644
--- a/reco/KF/CbmKFParticleInterface.cxx
+++ b/reco/KF/CbmKFParticleInterface.cxx
@@ -117,8 +117,8 @@ void CbmKFParticleInterface::SetKFParticleFromStsTrack(CbmStsTrack* track, KFPar
     cov[20] = cpzpz;
 
     float field[10];
-    int entrSIMD = iTr % fvecLen;
-    int entrVec  = iTr / fvecLen;
+    int entrSIMD = iTr % fvec::size();
+    int entrVec  = iTr / fvec::size();
     field[0]     = vField[entrVec].cx0[entrSIMD];
     field[1]     = vField[entrVec].cx1[entrSIMD];
     field[2]     = vField[entrVec].cx2[entrSIMD];
diff --git a/reco/L1/L1Algo/L1CATrackFinder.cxx b/reco/L1/L1Algo/L1CATrackFinder.cxx
index ef14eb2e54..6fa5e9b0cc 100644
--- a/reco/L1/L1Algo/L1CATrackFinder.cxx
+++ b/reco/L1/L1Algo/L1CATrackFinder.cxx
@@ -86,7 +86,7 @@ inline void L1Algo::findSingletsStep0(  // input
   /// the data is orginesed in order to be used by SIMD
 
   const Tindex end_lh = start_lh + n1_l;
-  const int lastV     = (n1_l - 1) / fvecLen;
+  const int lastV     = (n1_l - 1) / fvec::size();
   if (lastV >= 0) {
     // set some positive errors to unfilled part of vectors in order to avoid nans
     L1HitPoint& hitl = Hits_l[0];
@@ -100,8 +100,8 @@ inline void L1Algo::findSingletsStep0(  // input
   }
 
   for (Tindex ilh = start_lh, i1 = 0; ilh < end_lh; ++ilh, ++i1) {
-    Tindex i1_V      = i1 / fvecLen;
-    Tindex i1_4      = i1 % fvecLen;
+    Tindex i1_V      = i1 / fvec::size();
+    Tindex i1_4      = i1 % fvec::size();
     L1HitPoint& hitl = Hits_l[ilh];
 
 
@@ -388,8 +388,8 @@ inline void L1Algo::findDoubletsStep0(
   for (Tindex i1 = 0; i1 < n1; ++i1)  // for each singlet
   {
     unsigned int Ndoublets = 0;
-    const Tindex i1_V      = i1 / fvecLen;
-    const Tindex i1_4      = i1 % fvecLen;
+    const Tindex i1_V      = i1 / fvec::size();
+    const Tindex i1_4      = i1 % fvec::size();
     L1TrackPar& T1         = T_1[i1_V];
 
     // assert(T1.IsEntryConsistent(true, i1_4));
@@ -562,8 +562,8 @@ inline void L1Algo::findTripletsStep0(  // input
   int iStaM = &stam - fParameters.GetStations().begin();
   int iStaR = &star - fParameters.GetStations().begin();
 
-  L1HitIndex_t hitsl_2[fvecLen];
-  L1HitIndex_t hitsm_2_tmp[fvecLen];
+  L1HitIndex_t hitsl_2[fvec::size()];
+  L1HitIndex_t hitsm_2_tmp[fvec::size()];
   fvec fvec_0 = 0.f;
   fvec fvec_1 = 1.f;
   L1TrackPar L1TrackPar_0;
@@ -610,15 +610,15 @@ inline void L1Algo::findTripletsStep0(  // input
     fvec timeM     = 0.f;
     fvec timeMEr   = 1.f;
 
-    Tindex n2_4 = 0;
-    for (; n2_4 < fvecLen && i2 < n2; i2++) {
+    size_t n2_4 = 0;
+    for (; n2_4 < fvec::size() && i2 < n2; i2++) {
       //         if (!mrDuplets[hitsm_2[i2]]) {
       //           n2_4--;
       //           continue;
       //         }
       const Tindex& i1  = i1_2[i2];
-      const Tindex i1_V = i1 / fvecLen;
-      const Tindex i1_4 = i1 % fvecLen;
+      const Tindex i1_V = i1 / fvec::size();
+      const Tindex i1_4 = i1 % fvec::size();
 
       const L1TrackPar& T1 = T_1[i1_V];
 
@@ -745,7 +745,7 @@ inline void L1Algo::findTripletsStep0(  // input
     // assert(T2.IsConsistent(true, n2_4));
 
     // ---- Find the triplets(right hit). Reformat data in the portion of triplets. ----
-    for (Tindex i2_4 = 0; i2_4 < n2_4; ++i2_4) {
+    for (size_t i2_4 = 0; i2_4 < n2_4; ++i2_4) {
 
       //if (!T2.IsEntryConsistent(false, i2_4)) { continue; }
       if (kSts == fTrackingMode && (T2.C44[i2_4] < 0)) { continue; }
@@ -894,8 +894,8 @@ inline void L1Algo::findTripletsStep0(  // input
         n3++;
         Ntriplets++;
 
-        n3_V = n3 / fvecLen;
-        n3_4 = n3 % fvecLen;
+        n3_V = n3 / fvec::size();
+        n3_4 = n3 % fvec::size();
 
         if (!n3_4) {
           T_3.push_back(L1TrackPar_0);
@@ -918,14 +918,14 @@ inline void L1Algo::findTripletsStep0(  // input
 
           n3 = n3 - Ntriplets;
 
-          T_3.resize(n3 / fvecLen);
-          u_front_3.resize(n3 / fvecLen);
-          u_back_3.resize(n3 / fvecLen);
-          z_Pos_3.resize(n3 / fvecLen);
-          du_.resize(n3 / fvecLen);
-          dv_.resize(n3 / fvecLen);
-          timeR.resize(n3 / fvecLen);
-          timeER.resize(n3 / fvecLen);
+          T_3.resize(n3 / fvec::size());
+          u_front_3.resize(n3 / fvec::size());
+          u_back_3.resize(n3 / fvec::size());
+          z_Pos_3.resize(n3 / fvec::size());
+          du_.resize(n3 / fvec::size());
+          dv_.resize(n3 / fvec::size());
+          timeR.resize(n3 / fvec::size());
+          timeER.resize(n3 / fvec::size());
           cout << "L1: GetMaxTripletPerDoublets==" << fParameters.GetMaxTripletPerDoublets()
                << " reached in findTripletsStep0()" << endl;
           //assert(0);
@@ -1019,8 +1019,8 @@ inline void L1Algo::findTripletsStep2(  // input // TODO not updated after gaps
   };
 
   for (int i3 = 0; i3 < n3; ++i3) {
-    int i3_V = i3 / fvecLen;
-    int i3_4 = i3 % fvecLen;
+    int i3_V = i3 / fvec::size();
+    int i3_4 = i3 % fvec::size();
 
     L1TrackPar& T3 = T_3[i3_V];
 
@@ -1208,8 +1208,8 @@ inline void L1Algo::findTripletsStep3(  // input
   L1HitIndex_t ihitl_prev = 0;
 
   for (Tindex i3 = 0; i3 < n3; ++i3) {
-    const Tindex i3_V = i3 / fvecLen;
-    const Tindex i3_4 = i3 % fvecLen;
+    const Tindex i3_V = i3 / fvec::size();
+    const Tindex i3_4 = i3 % fvec::size();
 
     L1TrackPar& T3 = T_3[i3_V];
 
@@ -1458,7 +1458,7 @@ inline void L1Algo::DupletsStaPort(
       L1_ASSERT(hitsl_1[i] < HitsUnusedStopIndex[istal] - HitsUnusedStartIndex[istal],
                 hitsl_1[i] << " < " << HitsUnusedStopIndex[istal] - HitsUnusedStartIndex[istal]);
 
-    Tindex n1_V = (n1 + fvecLen - 1) / fvecLen;
+    Tindex n1_V = (n1 + fvec::size() - 1) / fvec::size();
 
     /// Get the field approximation. Add the target to parameters estimation. Propagaete to middle station.
 
@@ -1603,7 +1603,7 @@ inline void L1Algo::TripletsStaPort(  /// creates triplets:
       du3, dv3, timeR, timeER);
 
 
-    n3_V = (n3 + fvecLen - 1) / fvecLen;
+    n3_V = (n3 + fvec::size() - 1) / fvec::size();
 
     for (Tindex i = 0; i < static_cast<Tindex>(hitsl_3.size()); ++i)
       L1_assert(hitsl_3[i] < HitsUnusedStopIndex[istal] - HitsUnusedStartIndex[istal]);
diff --git a/reco/L1/L1Algo/L1Constants.h b/reco/L1/L1Algo/L1Constants.h
index c2ae4b477c..da07c75d8a 100644
--- a/reco/L1/L1Algo/L1Constants.h
+++ b/reco/L1/L1Algo/L1Constants.h
@@ -38,13 +38,13 @@ namespace L1Constants
     constexpr int kMaxNtriplets  = 1u << kTripletBits;  ///< Max number of triplets, 2^20 = 1,048,576
 
     // TODO: Clarify the meaning of these coefficients
-    constexpr int kCoeff               = 64 / 4;                         ///< TODO:
-    constexpr int kPortionLeftHits     = 1024 / kCoeff;                  ///< portion of left hits
-    constexpr int kPortionLeftHitsP    = 1024 / kCoeff / fvecLen;        ///< portion of left hits per one vector word
-    constexpr int kMaxPortionDoublets  = 10000 / 5 * 64 / 2 / kCoeff;    ///< Max size of the doublets portion
-    constexpr int kMaxPortionTriplets  = 10000 * 5 * 64 / 2 / kCoeff;    ///< Max size of the triplets portion
-    constexpr int kMaxPortionTripletsP = kMaxPortionTriplets / fvecLen;  ///< Max size of the triplets portion
-  }                                                                      // namespace size
+    constexpr int kCoeff               = 64 / 4;                        ///< TODO:
+    constexpr int kPortionLeftHits     = 1024 / kCoeff;                 ///< portion of left hits
+    constexpr int kPortionLeftHitsP    = 1024 / kCoeff / fvec::size();  ///< portion of left hits per one vector word
+    constexpr int kMaxPortionDoublets  = 10000 / 5 * 64 / 2 / kCoeff;   ///< Max size of the doublets portion
+    constexpr int kMaxPortionTriplets  = 10000 * 5 * 64 / 2 / kCoeff;   ///< Max size of the triplets portion
+    constexpr int kMaxPortionTripletsP = kMaxPortionTriplets / fvec::size();  ///< Max size of the triplets portion
+  }                                                                           // namespace size
 
   /// Control flags
   namespace control
diff --git a/reco/L1/L1Algo/L1MaterialInfo.cxx b/reco/L1/L1Algo/L1MaterialInfo.cxx
index 0cfa4d6a64..c8ffcea7e3 100644
--- a/reco/L1/L1Algo/L1MaterialInfo.cxx
+++ b/reco/L1/L1Algo/L1MaterialInfo.cxx
@@ -138,7 +138,7 @@ float L1Material::GetRadThick(float x, float y) const
 fvec L1Material::GetRadThick(fvec x, fvec y) const
 {
   fvec r;
-  for (int i = 0; i < fvecLen; i++)
+  for (size_t i = 0; i < fvec::size(); i++)
     r[i] = GetRadThick(x[i], y[i]);
   return r;
 }
diff --git a/reco/L1/L1Algo/L1TrackFitter.cxx b/reco/L1/L1Algo/L1TrackFitter.cxx
index 45334216b4..6aeb45a1f2 100644
--- a/reco/L1/L1Algo/L1TrackFitter.cxx
+++ b/reco/L1/L1Algo/L1TrackFitter.cxx
@@ -333,7 +333,7 @@ void L1Algo::L1KFTrackFitter()
 
   const int nHits = fParameters.GetNstationsActive();
   int iVec = 0, i = 0;
-  int nTracks_SIMD = fvecLen;
+  int nTracks_SIMD = fvec::size();
   L1TrackPar T;  // fitting parametr coresponding to current track
 
   L1TrackParFit T1;  // fitting parametr coresponding to current track
@@ -342,7 +342,7 @@ void L1Algo::L1KFTrackFitter()
   L1Fit fit;
   fit.SetParticleMass(GetDefaultParticleMass());
 
-  L1Track* t[fvecLen];
+  L1Track* t[fvec::size()];
 
   const L1Station* sta = fParameters.GetStations().begin();
   L1Station staFirst, staLast;  // FIXME (?): Probably, we should replace these variables with references (S.Zharko)
@@ -405,8 +405,8 @@ void L1Algo::L1KFTrackFitter()
 
   unsigned short N_vTracks = fTracks.size();  // number of tracks processed per one SSE register
 
-  for (unsigned short itrack = 0; itrack < N_vTracks; itrack += fvecLen) {
-    if (N_vTracks - itrack < static_cast<unsigned short>(fvecLen)) nTracks_SIMD = N_vTracks - itrack;
+  for (unsigned short itrack = 0; itrack < N_vTracks; itrack += fvec::size()) {
+    if (N_vTracks - itrack < static_cast<unsigned short>(fvec::size())) nTracks_SIMD = N_vTracks - itrack;
 
     for (i = 0; i < nTracks_SIMD; i++)
       t[i] = &fTracks[itrack + i];  // current track
@@ -798,7 +798,7 @@ void L1Algo::L1KFTrackFitterMuch()
 
   const int nHits = fParameters.GetNstationsActive();
   int iVec = 0, i = 0;
-  int nTracks_SIMD = fvecLen;
+  int nTracks_SIMD = fvec::size();
   L1TrackPar T;  // fitting parametr coresponding to current track
 
   L1TrackParFit T1;  // fitting parametr coresponding to current track
@@ -807,7 +807,7 @@ void L1Algo::L1KFTrackFitterMuch()
   L1Fit fit;
   fit.SetParticleMass(GetDefaultParticleMass());
 
-  L1Track* t[fvecLen];
+  L1Track* t[fvec::size()];
 
   const L1Station* sta = fParameters.GetStations().begin();
   L1Station staFirst, staLast;
@@ -869,8 +869,8 @@ void L1Algo::L1KFTrackFitterMuch()
 
   unsigned short N_vTracks = fTracks.size();
 
-  for (unsigned short itrack = 0; itrack < N_vTracks; itrack += fvecLen) {
-    if (N_vTracks - itrack < static_cast<unsigned short>(fvecLen)) nTracks_SIMD = N_vTracks - itrack;
+  for (unsigned short itrack = 0; itrack < N_vTracks; itrack += fvec::size()) {
+    if (N_vTracks - itrack < static_cast<unsigned short>(fvec::size())) nTracks_SIMD = N_vTracks - itrack;
 
     for (i = 0; i < nTracks_SIMD; i++)
       t[i] = &fTracks[itrack + i];  // current track
@@ -1216,7 +1216,7 @@ void L1Algo::L1KFTrackFitterMuch()
 
           int max_steps = 0;
 
-          for (int j = 0; j < fvecLen; j++) {
+          for (size_t j = 0; j < fvec::size(); j++) {
             nofSteps[j] = int(fabs(d_z[j]) / 10);  //*w1[i];
             if (max_steps < nofSteps[j]) max_steps = nofSteps[j];
           }
diff --git a/reco/L1/L1Algo/L1TrackPar.h b/reco/L1/L1Algo/L1TrackPar.h
index ed0666115d..bd1a011d01 100644
--- a/reco/L1/L1Algo/L1TrackPar.h
+++ b/reco/L1/L1Algo/L1TrackPar.h
@@ -328,16 +328,16 @@ inline bool L1TrackPar::IsEntryConsistent(bool printWhenWrong, int k) const
 
 inline bool L1TrackPar::IsConsistent(bool printWhenWrong, int nFilled) const
 {
-  assert(nFilled <= fvecLen);
+  assert(nFilled <= (int) fvec::size());
   bool ok = true;
-  if (nFilled < 0) { nFilled = fvecLen; }
+  if (nFilled < 0) { nFilled = fvec::size(); }
   for (int i = 0; i < nFilled; ++i) {
     ok = ok && IsEntryConsistent(printWhenWrong, i);
   }
 
   if (!ok && printWhenWrong) {
     std::cout << "L1TrackPar parameters are not consistent: " << std::endl;
-    if (nFilled == fvecLen) { std::cout << "  All vector elements are filled " << std::endl; }
+    if (nFilled == (int) fvec::size()) { std::cout << "  All vector elements are filled " << std::endl; }
     else {
       std::cout << "  Only first " << nFilled << " vector elements are filled " << std::endl;
     }
diff --git a/reco/L1/OffLineInterface/CbmL1RichENNRingFinderParallel.cxx b/reco/L1/OffLineInterface/CbmL1RichENNRingFinderParallel.cxx
index 71e128a516..cfa04e1d88 100644
--- a/reco/L1/OffLineInterface/CbmL1RichENNRingFinderParallel.cxx
+++ b/reco/L1/OffLineInterface/CbmL1RichENNRingFinderParallel.cxx
@@ -145,15 +145,15 @@ Int_t CbmL1RichENNRingFinderParallel::DoFind(CbmEvent* event, TClonesArray* HitA
   // save local-out indices correspondece
   nsL1vector<ENNHitV>::TSimd UpV;
   nsL1vector<ENNHitV>::TSimd DownV;
-  UpV.resize((Up.size() + fvecLen - 1) / fvecLen);
-  DownV.resize((Down.size() + fvecLen - 1) / fvecLen);
+  UpV.resize((Up.size() + fvec::size() - 1) / fvec::size());
+  DownV.resize((Down.size() + fvec::size() - 1) / fvec::size());
   for (THitIndex k = 0; k < Up.size(); k++) {
-    int k_4 = k % fvecLen, k_V = k / fvecLen;
+    int k_4 = k % fvec::size(), k_V = k / fvec::size();
     ENNHitV& hits = UpV[k_V];  // TODO change on ENNHitV
     hits.CopyHit(Up[k], k_4);
   }
   for (THitIndex k = 0; k < Down.size(); k++) {
-    int k_4 = k % fvecLen, k_V = k / fvecLen;
+    int k_4 = k % fvec::size(), k_V = k / fvec::size();
     ENNHitV& hits = DownV[k_V];
     hits.CopyHit(Down[k], k_4);
   }
@@ -284,10 +284,10 @@ void CbmL1RichENNRingFinderParallel::ENNRingFinder(const int NHits, nsL1vector<E
 
   //  ENNRingHit* ileft = &(Hits[0]), *iright = ileft;//, i_main = ileft;
   int ileft = 0, iright = ileft;
-  // int ileft[fvecLen] = {0, 0, 0, 0};
-  // int iright[fvecLen] = {0, 0, 0, 0};
+  // int ileft[fvec::size()] = {0, 0, 0, 0};
+  // int iright[fvec::size()] = {0, 0, 0, 0};
 
-  THitIndex i_mains[fvecLen] = {0};
+  THitIndex i_mains[fvec::size()] = {0};
 
   THitIndex i_main_array[NHits];  // need for proceed in paralled almost independent areas
   for (THitIndex i = 0; i < NHits; i++) {
@@ -310,9 +310,9 @@ void CbmL1RichENNRingFinderParallel::ENNRingFinder(const int NHits, nsL1vector<E
     fvec SearchAreaSize = 0;  // number of hits to fit and search ring
     fvec PickUpAreaSize = 0;
 
-    for (int i_4 = 0; (i_4 < fvecLen) && (ii_main < NHits); ii_main++) {
+    for (size_t i_4 = 0; (i_4 < fvec::size()) && (ii_main < NHits); ii_main++) {
       const THitIndex i_main = i_main_array[ii_main];
-      const int i_main_4 = i_main % fvecLen, i_main_V = i_main / fvecLen;
+      const int i_main_4 = i_main % fvec::size(), i_main_V = i_main / fvec::size();
       ENNHitV* i = &HitsV[i_main_V];
       if (i->quality[i_main_4] >= StartHitMaxQuality) continue;  // already found hit
 
@@ -321,16 +321,16 @@ void CbmL1RichENNRingFinderParallel::ENNRingFinder(const int NHits, nsL1vector<E
       float left  = i->x[i_main_4] - AreaSize;
       float right = i->x[i_main_4] + AreaSize;
 
-      // while(                          (HitsV[ileft[i_4]/fvecLen] .x[ileft[i_4]%fvecLen] < left ) ) ++ileft[i_4];
-      // while( (iright[i_4] < NHits) && (HitsV[iright[i_4]/fvecLen].x[ileft[i_4]%fvecLen] < right) ) ++iright[i_4];
+      // while(                          (HitsV[ileft[i_4]/fvec::size()] .x[ileft[i_4]%fvec::size()] < left ) ) ++ileft[i_4];
+      // while( (iright[i_4] < NHits) && (HitsV[iright[i_4]/fvec::size()].x[ileft[i_4]%fvec::size()] < right) ) ++iright[i_4];
       // for( int j = ileft[i_4]; j < iright[i_4]; ++j ){
-      while ((HitsV[ileft / fvecLen].x[ileft % fvecLen] < left))
+      while ((HitsV[ileft / fvec::size()].x[ileft % fvec::size()] < left))
         ++ileft;  // TODO SIMDize
-      while ((iright < NHits) && (HitsV[iright / fvecLen].x[ileft % fvecLen] < right))
+      while ((iright < NHits) && (HitsV[iright / fvec::size()].x[ileft % fvec::size()] < right))
         ++iright;
 
       for (int j = ileft; j < iright; ++j) {
-        const int j_4 = j % fvecLen, j_V = j / fvecLen;
+        const int j_4 = j % fvec::size(), j_V = j / fvec::size();
         ENNSearchHitV& sHit = SearchArea[int(SearchAreaSize[i_4])];
         sHit.CopyHit(HitsV[j_V], j_4, i_4);
 
@@ -360,8 +360,8 @@ void CbmL1RichENNRingFinderParallel::ENNRingFinder(const int NHits, nsL1vector<E
     ENNHitV iHit;
     int MaxSearchAreaSize = 0;
     int MaxPickUpAreaSize = 0;
-    for (int i_4 = 0; i_4 < fvecLen; i_4++) {
-      iHit.CopyHit(HitsV[i_mains[i_4] / fvecLen], i_mains[i_4] % fvecLen, i_4);
+    for (size_t i_4 = 0; i_4 < fvec::size(); i_4++) {
+      iHit.CopyHit(HitsV[i_mains[i_4] / fvec::size()], i_mains[i_4] % fvec::size(), i_4);
       MaxSearchAreaSize = (MaxSearchAreaSize < SearchAreaSize[i_4]) ? int(SearchAreaSize[i_4]) : MaxSearchAreaSize;
       MaxPickUpAreaSize = (MaxPickUpAreaSize < PickUpAreaSize[i_4]) ? int(PickUpAreaSize[i_4]) : MaxPickUpAreaSize;
     }
@@ -563,7 +563,7 @@ void CbmL1RichENNRingFinderParallel::ENNRingFinder(const int NHits, nsL1vector<E
         // } 
    
         //quality *= ShadowOpacity;
-      for( int i_4 = 0; (i_4 < fvecLen); i_4++) { 
+      for( int i_4 = 0; (i_4 < fvec::size()); i_4++) { 
         const int NShadow = Shadow.size();
         for( int is = 0; is < NShadow; is++ ) { // CHECKME change loops to speed up?
           cout << i_4 << Shadow[is] << endl;
@@ -571,10 +571,10 @@ void CbmL1RichENNRingFinderParallel::ENNRingFinder(const int NHits, nsL1vector<E
           if (ih_f == -1) continue;
            int ih = static_cast<int>(ih_f);  // TODO ! problem in conversion...
            float ih_f2 =  static_cast<float>(ih);
-          cout << ih_f << " " << ih << " " << ih_f2 << " " << ih%fvecLen << " " << ih/fvecLen << endl;
+          cout << ih_f << " " << ih << " " << ih_f2 << " " << ih%fvec::size() << " " << ih/fvec::size() << endl;
 
-          const THitIndex ih_4 = ih%fvecLen;
-          ENNHitV & hitV = HitsV[ih/fvecLen];
+          const THitIndex ih_4 = ih%fvec::size();
+          ENNHitV & hitV = HitsV[ih/fvec::size()];
 
             //          hitV.quality[ih_4] = ( hitV.quality[ih_4] < quality[i_4] ) ? quality[i_4] : hitV.quality[ih_4];
             //        shHit->quality = iif( shHit->quality < quality, quality, shHit->quality );
@@ -584,7 +584,7 @@ void CbmL1RichENNRingFinderParallel::ENNRingFinder(const int NHits, nsL1vector<E
 #endif  // 0
     ////////////////
 
-    for (int i_4 = 0; (i_4 < fvecLen); i_4++) {
+    for (size_t i_4 = 0; (i_4 < fvec::size()); i_4++) {
       //      if( NRingHits < MinRingHits || R2 > R2Max || R2 < R2Min ) continue;
 
       if (/*ISUNLIKELY*/ (!validRing[i_4])) continue;
@@ -641,8 +641,8 @@ void CbmL1RichENNRingFinderParallel::ENNRingFinder(const int NHits, nsL1vector<E
       const int NShadow = Shadow.size();
       for (int is = 0; is < NShadow; is++) {
         const THitIndex ih   = Shadow[is];
-        const THitIndex ih_4 = ih % fvecLen;
-        ENNHitV& hitV        = HitsV[ih / fvecLen];
+        const THitIndex ih_4 = ih % fvec::size();
+        ENNHitV& hitV        = HitsV[ih / fvec::size()];
 
         hitV.quality[ih_4] = (hitV.quality[ih_4] < quality) ? quality : hitV.quality[ih_4];
         //        shHit->quality = iif( shHit->quality < quality, quality, shHit->quality );
@@ -729,16 +729,16 @@ void CbmL1RichENNRingFinderParallel::ENNRingFinder(const int NHits, nsL1vector<E
 
 
       const THitIndex firstIh = i->localIHits[0];
-      const ENNHitV& firstHit = HitsV[firstIh / fvecLen];
-      const int firstIh_4     = firstIh % fvecLen;
+      const ENNHitV& firstHit = HitsV[firstIh / fvec::size()];
+      const int firstIh_4     = firstIh % fvec::size();
       const THitIndex maxI    = i->localIHits.size();
 
       vector<ENNSearchHitV> shits;
       shits.resize(maxI);
       for (THitIndex iih = 0; iih < maxI; iih++) {
         const THitIndex ih  = i->localIHits[iih];
-        const ENNHitV& hit  = HitsV[ih / fvecLen];
-        const int ih_4      = ih % fvecLen;
+        const ENNHitV& hit  = HitsV[ih / fvec::size()];
+        const int ih_4      = ih % fvec::size();
         ENNSearchHitV& shit = shits[iih];
 
         shit.ly[0]  = hit.y[ih_4] - firstHit.y[firstIh_4];
@@ -831,9 +831,9 @@ void CbmL1RichENNRingFinderParallel::ENNRingFinder(const int NHits, nsL1vector<E
 
       for (THitIndex iih = 0; iih < maxI; iih++) {
         const THitIndex ih  = i->localIHits[iih];
-        const ENNHitV& hit  = HitsV[ih / fvecLen];
+        const ENNHitV& hit  = HitsV[ih / fvec::size()];
         ENNSearchHitV& shit = shits[iih];
-        const int ih_4      = ih % fvecLen;
+        const int ih_4      = ih % fvec::size();
 
         float dx           = hit.x[ih_4] - i->x;
         float dy           = hit.y[ih_4] - i->y;
@@ -869,8 +869,8 @@ void CbmL1RichENNRingFinderParallel::ENNRingFinder(const int NHits, nsL1vector<E
       const THitIndex maxI = i->localIHits.size();
       for (THitIndex n = 0; n < maxI; n++) {
         const THitIndex ih = i->localIHits[n];
-        ENNHitV& hit       = HitsV[ih / fvecLen];
-        const int ih_4     = ih % fvecLen;
+        ENNHitV& hit       = HitsV[ih / fvec::size()];
+        const int ih_4     = ih % fvec::size();
         hit.quality[ih_4]  = 1;
       }
       for (iR j = i + 1; j != Rend; ++j) {
@@ -881,8 +881,8 @@ void CbmL1RichENNRingFinderParallel::ENNRingFinder(const int NHits, nsL1vector<E
         const THitIndex maxJ = j->localIHits.size();
         for (THitIndex m = 0; m < maxJ; m++) {
           const THitIndex ihm = j->localIHits[m];
-          const ENNHitV& hitm = HitsV[ihm / fvecLen];
-          if (hitm.quality[ihm % fvecLen] == 0) j->NOwn++;
+          const ENNHitV& hitm = HitsV[ihm / fvec::size()];
+          if (hitm.quality[ihm % fvec::size()] == 0) j->NOwn++;
         }
       }
       i->on   = 1;
@@ -924,8 +924,8 @@ void CbmL1RichENNRingFinderParallel::ENNRingFinder(const int NHits, nsL1vector<E
     best->on                  = 1;
     const THitIndex NHitsBest = best->localIHits.size();
     for (THitIndex iih = 0; iih < NHitsBest; iih++) {
-      const THitIndex ih                        = best->localIHits[iih];
-      HitsV[ih / fvecLen].quality[ih % fvecLen] = 1;
+      const THitIndex ih                                  = best->localIHits[iih];
+      HitsV[ih / fvec::size()].quality[ih % fvec::size()] = 1;
     }
     for (iR ir = Rbeg; ir != Rend; ++ir) {
       if (ir->skip) continue;
@@ -935,7 +935,7 @@ void CbmL1RichENNRingFinderParallel::ENNRingFinder(const int NHits, nsL1vector<E
       const THitIndex NHitsCur = ir->localIHits.size();
       for (THitIndex iih = 0; iih < NHitsCur; iih++) {
         const THitIndex ih = ir->localIHits[iih];
-        ir->NOwn += (HitsV[ih / fvecLen].quality[ih % fvecLen] == 0);
+        ir->NOwn += (HitsV[ih / fvec::size()].quality[ih % fvec::size()] == 0);
       }
     }
   } while (1);
diff --git a/reco/L1/ParticleFinder/CbmL1PFFitter.cxx b/reco/L1/ParticleFinder/CbmL1PFFitter.cxx
index a1f47d7b8e..3d3c88e799 100644
--- a/reco/L1/ParticleFinder/CbmL1PFFitter.cxx
+++ b/reco/L1/ParticleFinder/CbmL1PFFitter.cxx
@@ -98,13 +98,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 = fvecLen;
+  int nTracks_SIMD = fvec::size();
   L1TrackPar T;  // fitting parametr coresponding to current track
 
   L1Fit fit;
   fit.SetParticleMass(0.000511f);  // muon
 
-  CbmStsTrack* t[fvecLen];
+  CbmStsTrack* t[fvec::size()];
 
   int ista;
   const L1Station* sta = CbmL1::Instance()->fpAlgo->GetParameters()->GetStations().begin();
@@ -130,9 +130,9 @@ void CbmL1PFFitter::Fit(vector<CbmStsTrack>& Tracks, vector<int>& pidHypo)
 
   fvec mass = 0.000511f;
 
-  for (unsigned short itrack = 0; itrack < N_vTracks; itrack += fvecLen) {
+  for (unsigned short itrack = 0; itrack < N_vTracks; itrack += fvec::size()) {
 
-    if (N_vTracks - itrack < static_cast<unsigned short>(fvecLen)) nTracks_SIMD = N_vTracks - itrack;
+    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();
@@ -400,11 +400,11 @@ void CbmL1PFFitter::GetChiToVertex(vector<CbmStsTrack>& Tracks, vector<L1FieldRe
 {
   chiToVtx.reserve(Tracks.size());
 
-  int nTracks_SIMD = fvecLen;
+  int nTracks_SIMD = fvec::size();
   L1TrackPar T;  // fitting parametr coresponding to current track
   L1Fit fit;
 
-  CbmStsTrack* t[fvecLen];
+  CbmStsTrack* t[fvec::size()];
 
   int nStations        = CbmL1::Instance()->fpAlgo->GetParameters()->GetNstationsActive();
   int NMvdStations     = CbmL1::Instance()->fpAlgo->GetNstationsBeforePipe();
@@ -426,8 +426,8 @@ void CbmL1PFFitter::GetChiToVertex(vector<CbmStsTrack>& Tracks, vector<L1FieldRe
 
   unsigned short N_vTracks = Tracks.size();
   int ista;
-  for (unsigned short itrack = 0; itrack < N_vTracks; itrack += fvecLen) {
-    if (N_vTracks - itrack < static_cast<unsigned short>(fvecLen)) { nTracks_SIMD = N_vTracks - itrack; }
+  for (unsigned short itrack = 0; itrack < N_vTracks; itrack += fvec::size()) {
+    if (N_vTracks - itrack < static_cast<unsigned short>(fvec::size())) { nTracks_SIMD = N_vTracks - itrack; }
 
     fvec mass2;
     for (int iVec = 0; iVec < nTracks_SIMD; iVec++) {
@@ -578,10 +578,10 @@ void CbmL1PFFitter::CalculateFieldRegion(vector<CbmStsTrack>& Tracks, vector<L1F
   int NMvdStations          = CbmL1::Instance()->fpAlgo->GetNstationsBeforePipe();
   if (NMvdStations > 0.) listMvdHits = (TClonesArray*) fManger->GetObject("MvdHit");
 
-  int nTracks_SIMD = fvecLen;
+  int nTracks_SIMD = fvec::size();
   L1TrackPar T;  // fitting parametr coresponding to current track
 
-  CbmStsTrack* t[fvecLen];
+  CbmStsTrack* t[fvec::size()];
 
   int ista;
   const L1Station* sta = CbmL1::Instance()->fpAlgo->GetParameters()->GetStations().begin();
@@ -590,8 +590,8 @@ void CbmL1PFFitter::CalculateFieldRegion(vector<CbmStsTrack>& Tracks, vector<L1F
 
   unsigned short N_vTracks = Tracks.size();
 
-  for (unsigned short itrack = 0; itrack < N_vTracks; itrack += fvecLen) {
-    if (N_vTracks - itrack < static_cast<unsigned short>(fvecLen)) nTracks_SIMD = N_vTracks - itrack;
+  for (unsigned short itrack = 0; itrack < N_vTracks; itrack += fvec::size()) {
+    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
@@ -650,10 +650,10 @@ void CbmL1PFFitter::CalculateFieldRegionAtLastPoint(vector<CbmStsTrack>& Tracks,
   int NMvdStations          = CbmL1::Instance()->fpAlgo->GetNstationsBeforePipe();
   if (NMvdStations > 0.) listMvdHits = (TClonesArray*) fManger->GetObject("MvdHit");
 
-  int nTracks_SIMD = fvecLen;
+  int nTracks_SIMD = fvec::size();
   L1TrackPar T;  // fitting parametr coresponding to current track
 
-  CbmStsTrack* t[fvecLen];
+  CbmStsTrack* t[fvec::size()];
 
   int ista;
   const L1Station* sta = CbmL1::Instance()->fpAlgo->GetParameters()->GetStations().begin();
@@ -662,8 +662,8 @@ void CbmL1PFFitter::CalculateFieldRegionAtLastPoint(vector<CbmStsTrack>& Tracks,
 
   unsigned short N_vTracks = Tracks.size();
 
-  for (unsigned short itrack = 0; itrack < N_vTracks; itrack += fvecLen) {
-    if (N_vTracks - itrack < static_cast<unsigned short>(fvecLen)) nTracks_SIMD = N_vTracks - itrack;
+  for (unsigned short itrack = 0; itrack < N_vTracks; itrack += fvec::size()) {
+    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
diff --git a/reco/L1/vectors/L1vecPseudo.h b/reco/L1/vectors/L1vecPseudo.h
index b2dd05849a..28abbbe388 100644
--- a/reco/L1/vectors/L1vecPseudo.h
+++ b/reco/L1/vectors/L1vecPseudo.h
@@ -11,7 +11,6 @@
 #include <cmath>
 
 typedef float fscal;
-const int fvecLen = 4;
 
 /**********************************
  *
@@ -28,9 +27,9 @@ fscal sgn(fscal x);
 class fmask {
 
 public:
-  static constexpr int Size {4};
+  static constexpr size_t size() { return 4; }
 
-  bool v[Size];
+  bool v[size()];
 
   bool& operator[](int i) { return v[i]; }
   bool operator[](int i) const { return v[i]; }
@@ -39,14 +38,14 @@ public:
 
   fmask(const fmask& a)
   {
-    for (int i = 0; i < Size; i++) {
+    for (int i = 0; i < size(); i++) {
       v[i] = a.v[i];
     }
   }
 
   fmask(bool a)
   {
-    for (int i = 0; i < Size; i++) {
+    for (int i = 0; i < size(); i++) {
       v[i] = a;
     }
   }
@@ -57,7 +56,7 @@ public:
 
 #define _op(A, B, F)                                                                                                   \
   fmask z;                                                                                                             \
-  for (int i = 0; i < Size; i++) {                                                                                     \
+  for (int i = 0; i < size(); i++) {                                                                                   \
     z[i] = (A[i] F B[i]);                                                                                              \
   }                                                                                                                    \
   return z;
@@ -74,7 +73,7 @@ public:
   friend fmask operator!(const fmask& a)
   {
     fmask z;
-    for (int i = 0; i < Size; i++) {
+    for (int i = 0; i < size(); i++) {
       z[i] = !a[i];
     }
     return z;
@@ -95,7 +94,7 @@ public:
   friend std::ostream& operator<<(std::ostream& strm, const fmask& a)
   {
     strm << '[';
-    for (int i = 0; i < Size; i++) {
+    for (int i = 0; i < size(); i++) {
       strm << std::setw(12) << std::setfill(' ') << a[i] << ' ';
     }
     return strm;
@@ -103,7 +102,7 @@ public:
 
   friend std::istream& operator>>(std::istream& strm, fmask& a)
   {
-    for (int i = 0; i < Size; i++) {
+    for (int i = 0; i < size(); i++) {
       strm >> a[i];
     }
     return strm;
@@ -114,22 +113,21 @@ public:
 class fvec {
 
 public:
-  static constexpr int Size {fmask::Size};
-
-  fscal v[Size];
+  static constexpr size_t size() { return fmask::size(); }
+  fscal v[size()];
 
   fvec() : fvec(0.f) {}
 
   fvec(const fvec& a)
   {
-    for (int i = 0; i < Size; i++) {
+    for (int i = 0; i < size(); i++) {
       v[i] = a.v[i];
     }
   }
 
   fvec(fscal a)
   {
-    for (int i = 0; i < Size; i++) {
+    for (int i = 0; i < size(); i++) {
       v[i] = a;
     }
   }
@@ -144,35 +142,35 @@ public:
 
   void setZero(fmask m)
   {
-    for (int i = 0; i < Size; i++) {
+    for (int i = 0; i < size(); i++) {
       if (m[i]) { v[i] = 0.; }
     }
   }
 
 #define _f1(A, F)                                                                                                      \
   fvec z;                                                                                                              \
-  for (int i = 0; i < Size; i++) {                                                                                     \
+  for (int i = 0; i < size(); i++) {                                                                                   \
     z[i] = F(A[i]);                                                                                                    \
   }                                                                                                                    \
   return z;
 
 #define _f2(A, B, F)                                                                                                   \
   fvec z;                                                                                                              \
-  for (int i = 0; i < Size; i++) {                                                                                     \
+  for (int i = 0; i < size(); i++) {                                                                                   \
     z[i] = F(A[i], B[i]);                                                                                              \
   }                                                                                                                    \
   return z;
 
 #define _op(A, B, F)                                                                                                   \
   fvec z;                                                                                                              \
-  for (int i = 0; i < Size; i++) {                                                                                     \
+  for (int i = 0; i < size(); i++) {                                                                                   \
     z[i] = (A[i] F B[i]);                                                                                              \
   }                                                                                                                    \
   return z;
 
 #define _opComp(A, B, F)                                                                                               \
   fmask z;                                                                                                             \
-  for (int i = 0; i < Size; i++) {                                                                                     \
+  for (int i = 0; i < size(); i++) {                                                                                   \
     z[i] = (A[i] F B[i]);                                                                                              \
   }                                                                                                                    \
   return z;
@@ -194,7 +192,7 @@ public:
   friend fvec iif(fmask a, fvec b, fvec c)
   {
     fvec z;
-    for (int i = 0; i < Size; i++) {
+    for (int i = 0; i < size(); i++) {
       z[i] = a[i] ? b[i] : c[i];
     }
     return z;
@@ -246,7 +244,7 @@ public:
   {
     //strm << "[" << a[0] << " " << a[1] << " " << a[2] << " " << a[3] << "]";
     strm << '[';
-    for (int i = 0; i < Size; i++) {
+    for (int i = 0; i < size(); i++) {
       strm << std::setw(12) << std::setfill(' ') << a[i] << ' ';
     }
     return strm;
@@ -254,7 +252,7 @@ public:
 
   friend std::istream& operator>>(std::istream& strm, fvec& a)
   {
-    for (int i = 0; i < Size; i++) {
+    for (int i = 0; i < size(); i++) {
       strm >> a[i];
     }
     return strm;
@@ -263,7 +261,7 @@ public:
 } __attribute__((aligned(16)));
 
 
-#define _fvecalignment __attribute__((aligned(fvec::Size * sizeof(fscal))))
+#define _fvecalignment __attribute__((aligned(fvec::size() * sizeof(fscal))))
 
 
 /// Checks, if all bands are equal
@@ -273,7 +271,7 @@ inline bool IsHorizontallyEqual(const fvec& v)
 {
   fscal s  = v[0];
   bool ret = true;
-  for (int i = 1; i < fvecLen; i++) {
+  for (int i = 1; i < fvec::size(); i++) {
     ret = ret && (v[i] == s);
   }
   return ret;
@@ -283,7 +281,7 @@ inline bool IsHorizontallyEqual(const fvec& v)
 inline bool IsNanAny(const fvec& v)
 {
   bool ret = false;
-  for (int i = 0; i < fvecLen; i++) {
+  for (int i = 0; i < fvec::size(); i++) {
     ret = ret || std::isnan(v[i]);
   }
   return ret;
diff --git a/reco/L1/vectors/L1vecVc.h b/reco/L1/vectors/L1vecVc.h
index 996307e175..08253a0c73 100644
--- a/reco/L1/vectors/L1vecVc.h
+++ b/reco/L1/vectors/L1vecVc.h
@@ -10,7 +10,6 @@
 typedef Vc::float_v fvec;
 typedef fvec::EntryType fscal;
 typedef Vc::float_m fmask;
-const int fvecLen = fvec::Size;
 
 #define _fvecalignment __attribute__((aligned(Vc::VectorAlignment)))
 
@@ -34,7 +33,7 @@ inline bool IsHorizontallyEqual(const fvec& v)
 {
   fscal s  = v[0];
   bool ret = true;
-  for (int i = 1; i < fvecLen; i++) {
+  for (size_t i = 1; i < fvec::size(); i++) {
     ret = ret && (v[i] == s);
   }
   return ret;
@@ -44,7 +43,7 @@ inline bool IsHorizontallyEqual(const fvec& v)
 inline bool IsNanAny(const fvec& v)
 {
   bool ret = false;
-  for (int i = 0; i < fvecLen; i++) {
+  for (size_t i = 0; i < fvec::size(); i++) {
     ret = ret || std::isnan(v[i]);
   }
   return ret;
diff --git a/reco/littrack/parallel/LitFieldGrid.h b/reco/littrack/parallel/LitFieldGrid.h
index 5e3edc9c80..5acad2148c 100644
--- a/reco/littrack/parallel/LitFieldGrid.h
+++ b/reco/littrack/parallel/LitFieldGrid.h
@@ -184,7 +184,7 @@ namespace lit
       {
         LitFieldValue<fscal> v;
         // Get field value for each packed value
-        for (unsigned int i = 0; i < fvecLen; i++) {
+        for (size_t i = 0; i < fvec::size(); i++) {
           // Get field value in scalar format
           GetFieldValue(x[i], y[i], v);
           // Store field value in vector format
diff --git a/reco/littrack/parallel/LitMaterialGrid.h b/reco/littrack/parallel/LitMaterialGrid.h
index ad8b2fced8..1bed4d602f 100644
--- a/reco/littrack/parallel/LitMaterialGrid.h
+++ b/reco/littrack/parallel/LitMaterialGrid.h
@@ -154,7 +154,7 @@ namespace lit
       {
         fvec v;
         // Get material thickness for each packed value
-        for (unsigned int i = 0; i < fvecLen; i++) {
+        for (size_t i = 0; i < fvec::size(); i++) {
           v[i] = GetMaterial(x[i], y[i]);
         }
         return v;
-- 
GitLab