From a8baedf99fa47381b103898e0ab8d495377e5c41 Mon Sep 17 00:00:00 2001
From: Valentina <v.akishina@gsi.de>
Date: Tue, 7 Feb 2023 13:30:24 +0100
Subject: [PATCH] L1: remove time sorting when event is present, remove zero
 detector hits, bug in global track - duplicated hits

---
 reco/L1/CbmL1.cxx                             | 43 +++++++++++--------
 reco/L1/CbmL1ReadEvent.cxx                    |  3 ++
 .../CbmL1GlobalTrackFinder.cxx                | 10 ++---
 3 files changed, 30 insertions(+), 26 deletions(-)

diff --git a/reco/L1/CbmL1.cxx b/reco/L1/CbmL1.cxx
index 1a54247857..eabdfb260f 100644
--- a/reco/L1/CbmL1.cxx
+++ b/reco/L1/CbmL1.cxx
@@ -905,25 +905,30 @@ void CbmL1::Reconstruct(CbmEvent* event)
   // TODO: Refactor this part, check usage ---------------------------------
   int nStsHits = (fUseSTS && fpStsHits ? fpStsHits->GetEntriesFast() : 0);
 
-  /// sort input hits by time
-  L1Vector<std::pair<double, int>> SortHits("CbmL1::SortHits");
-  SortHits.reserve(nStsHits);
-  float start_t = 10000000000;
-  for (Int_t j = 0; j < nStsHits; j++) {
-    CbmStsHit* sh = L1_DYNAMIC_CAST<CbmStsHit*>(fpStsHits->At(j));
-    double t      = sh->GetTime();
-    if (t < start_t) start_t = t;
-    SortHits.push_back(std::pair<double, int>(t, j));
+  if (!event) {
+    /// sort input hits by time
+    L1Vector<std::pair<double, int>> SortHits("CbmL1::SortHits");
+    SortHits.reserve(nStsHits);
+    for (Int_t j = 0; j < nStsHits; j++) {
+      CbmStsHit* sh = L1_DYNAMIC_CAST<CbmStsHit*>(fpStsHits->At(j));
+      double t      = sh->GetTime();
+      SortHits.push_back(std::pair<double, int>(t, j));
+    }
+    std::sort(SortHits.begin(), SortHits.end());
+    if (SortHits.size() > 0) TsStart = SortHits[0].first;  ///reco TS start time is set to smallest hit time
+    fvSortedStsHitsIndexes.clear();
+    fvSortedStsHitsIndexes.reserve(SortHits.size());
+    for (unsigned int i = 0; i < SortHits.size(); i++) {
+      int j = SortHits[i].second;
+      fvSortedStsHitsIndexes.push_back(j);
+    };
+  }
+  else {
+    fvSortedStsHitsIndexes.clear();
+    fvSortedStsHitsIndexes.reserve(nStsHits);
+    for (unsigned int i = 0; i < nStsHits; i++)
+      fvSortedStsHitsIndexes.push_back(i);
   }
-  TsStart = start_t;  ///reco TS start time is set to smallest hit time
-
-  std::sort(SortHits.begin(), SortHits.end());
-  fvSortedStsHitsIndexes.clear();
-  fvSortedStsHitsIndexes.reserve(SortHits.size());
-  for (unsigned int i = 0; i < SortHits.size(); i++) {
-    int j = SortHits[i].second;
-    fvSortedStsHitsIndexes.push_back(j);
-  };
   // -----------------------------------------------------------------------
 
   if (!fLegacyEventMode && fPerformance) {
@@ -1008,7 +1013,7 @@ void CbmL1::Reconstruct(CbmEvent* event)
 
     if (fVerbose > 1) { cout << "L1 Track finder..." << endl; }
     fpAlgo->CATrackFinder();
-    //     IdealTrackFinder();
+    //       IdealTrackFinder();
     fTrackingTime += fpAlgo->fCATime;
 
     if (fVerbose > 1) { cout << "L1 Track finder ok" << endl; }
diff --git a/reco/L1/CbmL1ReadEvent.cxx b/reco/L1/CbmL1ReadEvent.cxx
index 91bf7632e4..6640dc4d36 100644
--- a/reco/L1/CbmL1ReadEvent.cxx
+++ b/reco/L1/CbmL1ReadEvent.cxx
@@ -1142,6 +1142,8 @@ void CbmL1::ReadEvent(float& TsStart, float& TsLength, float& /*TsOverlap*/, int
 
       if (0x00202806 == h->GetAddress() || 0x00002806 == h->GetAddress()) continue;  // TODO: Why? (S.Zharko)
 
+      if (5 == CbmTofAddress::GetSmType(h->GetAddress())) continue;
+
       int sttof = CbmTofTrackingInterface::Instance()->GetTrackingStationIndex(h);
 
       if (sttof < 0) continue;
@@ -1169,6 +1171,7 @@ void CbmL1::ReadEvent(float& TsStart, float& TsLength, float& /*TsOverlap*/, int
       th.y = pos.Y();
       th.z = pos.Z();
 
+
       if (th.z > 400) continue;  // is it still needed here? (S.Zharko)
 
       int stIdx = fpAlgo->GetParameters()->GetStationIndexActive(sttof, L1DetectorID::kTof);
diff --git a/reco/L1/OffLineInterface/CbmL1GlobalTrackFinder.cxx b/reco/L1/OffLineInterface/CbmL1GlobalTrackFinder.cxx
index cf98e78395..6d5f8b2540 100644
--- a/reco/L1/OffLineInterface/CbmL1GlobalTrackFinder.cxx
+++ b/reco/L1/OffLineInterface/CbmL1GlobalTrackFinder.cxx
@@ -117,7 +117,6 @@ Int_t CbmL1GlobalTrackFinder::CopyL1Tracks(CbmEvent* event)
         t->SetStsTrackIndex(stsTrackIndex);
         if (event) event->AddData(ECbmDataType::kStsTrack, stsTrackIndex);
         CbmL1TrackToCbmStsTrack(T, track, h.Det);
-        track->AddStsHit(h.ExtIndex);
         stsTrackIndex++;
       }
       if (h.Det == 2 && hasMuchHits == false) {
@@ -127,7 +126,6 @@ Int_t CbmL1GlobalTrackFinder::CopyL1Tracks(CbmEvent* event)
         t->SetMuchTrackIndex(muchTrackIndex);
         if (event) event->AddData(ECbmDataType::kMuchTrack, muchTrackIndex);
         CbmL1TrackToCbmMuchTrack(T, track, h.Det);
-        track->AddMuchHit(h.ExtIndex);
         muchTrackIndex++;
       }
       if (h.Det == 3 && hasTrdHits == false) {
@@ -136,7 +134,6 @@ Int_t CbmL1GlobalTrackFinder::CopyL1Tracks(CbmEvent* event)
         t->SetTrdTrackIndex(trdTrackIndex);
         if (event) event->AddData(ECbmDataType::kTrdTrack, trdTrackIndex);
         CbmL1TrackToCbmTrdTrack(T, track, h.Det);
-        track->AddTrdHit(h.ExtIndex);
         trdTrackIndex++;
       }
       if (h.Det == 4 && hasTofHits == false) {
@@ -148,9 +145,8 @@ Int_t CbmL1GlobalTrackFinder::CopyL1Tracks(CbmEvent* event)
         if (event) event->AddData(ECbmDataType::kTofTrack, tofTrackIndex);
         CbmL1TrackToCbmTofTrack(T, track, h.Det);
         tofTrackIndex++;
-        track->AddTofHit(h.ExtIndex);
 
-        if (event) event->AddData(ECbmDataType::kTofHit, h.ExtIndex);
+        // if (event) event->AddData(ECbmDataType::kTofHit, h.ExtIndex);
       }
     }
     //END create detector tracks if needed
@@ -280,7 +276,7 @@ void CbmL1GlobalTrackFinder::CbmL1TrackToCbmTrdTrack(CbmL1Track l1track, CbmTrdT
 // -------------------------------------------------------------------------
 
 // -----   Public method CbmL1TrackToCbmTofTrack   ------------------------------------------
-void CbmL1GlobalTrackFinder::CbmL1TrackToCbmTofTrack(CbmL1Track l1track, CbmTofTrack* /*track*/, int systemIdT)
+void CbmL1GlobalTrackFinder::CbmL1TrackToCbmTofTrack(CbmL1Track l1track, CbmTofTrack* track, int systemIdT)
 {
   Int_t ndf = 0;
 
@@ -291,7 +287,7 @@ void CbmL1GlobalTrackFinder::CbmL1TrackToCbmTofTrack(CbmL1Track l1track, CbmTofT
   for (vector<int>::iterator ih = T->Hits.begin(); ih != T->Hits.end(); ++ih) {
     CbmL1HitStore& h = L1->fvHitStore[*ih];
     if (h.Det != systemIdT) continue;
-    // track->AddHit(h.ExtIndex, kTOFHIT);
+    track->AddHit(h.ExtIndex, kTOFHIT);
   }
   ndf -= 5;
   if (ndf <= 0) ndf = 1;
-- 
GitLab