From e99e84d141d09c7024791322758e27901cff0274 Mon Sep 17 00:00:00 2001
From: Valentina <v.akishina@gsi.de>
Date: Tue, 19 Jul 2022 14:01:40 +0200
Subject: [PATCH] L1: fix bug in TOF performance

---
 reco/L1/CbmL1ReadEvent.cxx | 91 +++++++++++++++++++++++---------------
 1 file changed, 55 insertions(+), 36 deletions(-)

diff --git a/reco/L1/CbmL1ReadEvent.cxx b/reco/L1/CbmL1ReadEvent.cxx
index b0b2f9178c..efc2fa5dc6 100644
--- a/reco/L1/CbmL1ReadEvent.cxx
+++ b/reco/L1/CbmL1ReadEvent.cxx
@@ -407,62 +407,76 @@ void CbmL1::ReadEvent(L1AlgoInputData* fData_, float& TsStart, float& TsLength,
             TofPointToTrack[iSt][i]   = -1;
           }
 
+        std::vector<char> isTofPointMatched;
+        isTofPointMatched.resize(fTofPoints->Size(iFile, iEvent), 0);
+
+        for (int iHit = 0; iHit < fTofHits->GetEntriesFast(); iHit++) {
+          CbmMatch* matchHitMatch = L1_DYNAMIC_CAST<CbmMatch*>(fTofHitDigiMatches->At(iHit));
+          for (int iLink = 0; iLink < matchHitMatch->GetNofLinks(); iLink++) {
+            Int_t iMC              = matchHitMatch->GetLink(iLink).GetIndex();
+            isTofPointMatched[iMC] = 1;
+          }
+        }
+
 
         for (Int_t iMC = 0; iMC < fTofPoints->Size(iFile, iEvent); iMC++) {
+          if (isTofPointMatched[iMC] == 0) continue;
           CbmL1MCPoint MC;
           if (!ReadMCPoint(&MC, iMC, iFile, iEvent, 4)) {
             Double_t dtrck          = dFEI(iFile, iEvent, MC.ID);
             DFEI2I::iterator trk_it = dFEI2vMCTracks.find(dtrck);
             if (trk_it == dFEI2vMCTracks.end()) continue;
-            Int_t IND_Track = trk_it->second;
+            Int_t iTrack = trk_it->second;
 
             MC.iStation          = -1;
             const L1Station* sta = algo->GetParameters()->GetStations().begin();
-            for (Int_t iSt = 0; iSt < NTOFStationGeom; iSt++) {
+
+            float dist = 1000;
+            int iSta   = -1;
+            for (int iSt = 0; iSt < NTOFStationGeom; iSt++) {
               int iStActive = algo->GetParameters()->GetStationIndexActive(iSt, L1DetectorID::kTof);
               if (iStActive == -1) { continue; }
-              MC.iStation = (MC.z > sta[iStActive].z[0] - 15) ? iStActive : MC.iStation;
+              if (fabs(MC.z - sta[iStActive].z[0]) < dist) {
+                dist = fabs(MC.z - sta[iStActive].z[0]);
+                iSta = iSt;
+              }
             }
+            MC.iStation = algo->GetParameters()->GetStationIndexActive(iSta, L1DetectorID::kTof);
             if (MC.iStation < 0) continue;
             assert(MC.iStation >= 0);
-            int iTofSta = MC.iStation - (NMvdStations + NStsStations + NMuchStations + NTrdStations);
 
-            if (iTofSta >= 0) {
-              float dz = TofPointToTrackdZ[iTofSta][IND_Track];
-              if (fabs(sta[MC.iStation].z[0] - MC.z) < dz) { TofPointToTrack[iTofSta][IND_Track] = iMC; }
-              TofPointToTrackdZ[iTofSta][IND_Track] = fabs(sta[MC.iStation].z[0] - MC.z);
+            if (iSta >= 0) {
+              if (fabs(sta[iSta].z[0] - MC.z) < TofPointToTrackdZ[iSta][iTrack]) {
+                TofPointToTrack[iSta][iTrack]   = iMC;
+                TofPointToTrackdZ[iSta][iTrack] = fabs(sta[iSta].z[0] - MC.z);
+              }
             }
           }
         }
 
         for (int iTofSta = 0; iTofSta < NTOFStation; iTofSta++)
-          for (unsigned int iMC = 0; iMC < TofPointToTrack[iTofSta].size(); iMC++) {
+          for (unsigned int iTrack = 0; iTrack < TofPointToTrack[iTofSta].size(); iTrack++) {
 
-            if (TofPointToTrack[iTofSta][iMC] == -1) continue;
+            if (TofPointToTrack[iTofSta][iTrack] < 0) continue;
 
             CbmL1MCPoint MC;
 
-            if (!ReadMCPoint(&MC, TofPointToTrack[iTofSta][iMC], iFile, iEvent, 4)) {
+            if (!ReadMCPoint(&MC, TofPointToTrack[iTofSta][iTrack], iFile, iEvent, 4)) {
 
-              MC.iStation          = -1;
-              const L1Station* sta = algo->GetParameters()->GetStations().begin();
-              for (Int_t iSt = 0; iSt < NTOFStation; iSt++) {
-                int iStActive = algo->GetParameters()->GetStationIndexActive(iSt, L1DetectorID::kTof);
-                if (iStActive == -1) { continue; }
-                MC.iStation = (MC.z > sta[iStActive].z[0] - 15) ? iStActive : MC.iStation;
-              }
-              if (MC.iStation < 0) continue;
-              TofPointToTrack[iTofSta][iMC] = vMCPoints.size();
-              vMCTracks[iMC].Points.push_back_no_warning(vMCPoints.size());
+              MC.iStation = (NMvdStations + NStsStations + NMuchStations + NTrdStations + iTofSta);
 
-              MC.ID = iMC;
+              vMCTracks[iTrack].Points.push_back_no_warning(vMCPoints.size());
 
-              vMCPoints.push_back(MC);
-              vMCPoints_in_Time_Slice.push_back(0);
+              MC.ID = iTrack;
 
               dFEI2vMCPoints.insert(DFEI2I::value_type(
-                dFEI(iFile, iEvent, TofPointToTrack[iTofSta][iMC] + nMvdPoints + nStsPoints + nMuchPoints + nTrdPoints),
-                vMCPoints.size() - 1));
+                dFEI(iFile, iEvent,
+                     TofPointToTrack[iTofSta][iTrack] + nMvdPoints + nStsPoints + nMuchPoints + nTrdPoints),
+                vMCPoints.size()));
+
+              vMCPoints.push_back(MC);
+
+              vMCPoints_in_Time_Slice.push_back(0);
               nTofPoints++;
             }
           }
@@ -1048,17 +1062,21 @@ void CbmL1::ReadEvent(L1AlgoInputData* fData_, float& TsStart, float& TsLength,
 
         CbmMatch* matchHitMatch = L1_DYNAMIC_CAST<CbmMatch*>(fTofHitDigiMatches->At(j));
 
+        for (int iLink = 0; iLink < matchHitMatch->GetNofLinks(); iLink++)  //matchHitMatch->GetNofLinks(); k++)
+        {
+          Int_t iMC    = matchHitMatch->GetLink(iLink).GetIndex();
+          Int_t iFile  = matchHitMatch->GetLink(iLink).GetFile();
+          Int_t iEvent = matchHitMatch->GetLink(iLink).GetEntry();
 
-        if (0 < matchHitMatch->GetNofLinks()) {
-          Int_t iMC    = matchHitMatch->GetLink(0).GetIndex();
-          Int_t iFile  = matchHitMatch->GetLink(0).GetFile();
-          Int_t iEvent = matchHitMatch->GetLink(0).GetEntry();
+          Int_t iIndex = iMC + nMvdPoints + nStsPoints + nMuchPoints + nTrdPoints;
 
-          CbmTofPoint* pt = L1_DYNAMIC_CAST<CbmTofPoint*>(fTofPoints->Get(iFile, iEvent, iMC));
-          pt->GetTrackID();
-          Double_t dtrck          = dFEI(iFile, iEvent, pt->GetTrackID());
+          //CbmTofPoint* pt = L1_DYNAMIC_CAST<CbmTofPoint*>(fTofPoints->Get(iFile, iEvent, iMC));
+          // pt->GetTrackID();
+          Double_t dtrck          = dFEI(iFile, iEvent, iIndex);
           DFEI2I::iterator trk_it = dFEI2vMCPoints.find(dtrck);
-          if (trk_it != dFEI2vMCPoints.end()) th.iMC = TofPointToTrack[sttof][trk_it->second];
+          if (trk_it == dFEI2vMCPoints.end()) continue;
+
+          th.iMC = trk_it->second;
           if ((1 == fTofUseMcHit) && (th.iMC > -1))
             th.SetHitFromPoint(vMCPoints[th.iMC], algo->GetParameters()->GetStation(th.iStation));
         }
@@ -1150,6 +1168,7 @@ void CbmL1::ReadEvent(L1AlgoInputData* fData_, float& TsStart, float& TsLength,
 
     h.t  = th.time;
     h.dt = th.dt;
+
     //  h.track = th.track;
     //    h.dx  = th.dx;
     //    h.dy  = th.dy;
@@ -1261,8 +1280,8 @@ void CbmL1::Fill_vMCTracks()
       }
 
 
-      Int_t IND_Track = vMCTracks.size();  //or iMCTrack?
-      CbmL1MCTrack T(mass, q, vr, vp, IND_Track, mother_ID, pdg);
+      Int_t iTrack = vMCTracks.size();  //or iMCTrack?
+      CbmL1MCTrack T(mass, q, vr, vp, iTrack, mother_ID, pdg);
       //        CbmL1MCTrack T(mass, q, vr, vp, iMCTrack, mother_ID, pdg);
       T.time   = MCTrack->GetStartT();
       T.iFile  = iFile;
-- 
GitLab