From b2a0e4a7ba844cb120e5c7f61e491f9018ba1532 Mon Sep 17 00:00:00 2001
From: "P.-A. Loizeau" <p.-a.loizeau@gsi.de>
Date: Fri, 6 May 2022 12:34:27 +0200
Subject: [PATCH] [Evt Builder] In AlgoBuildRawEvent, add STS support in layers
 nb cut

---
 .../digis/CbmAlgoBuildRawEvents.cxx           | 49 +++++++++++++++++--
 1 file changed, 44 insertions(+), 5 deletions(-)

diff --git a/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.cxx b/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.cxx
index da1397bf84..7dbc8bc3e4 100644
--- a/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.cxx
+++ b/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.cxx
@@ -617,9 +617,49 @@ Bool_t CbmAlgoBuildRawEvents::CheckTriggerConditions(CbmEvent* event, RawEventBu
   if (0 < det.fuTriggerMinLayers) {
     switch (det.detId) {
       case ECbmModuleId::kSts: {
-        LOG(fatal) << "CbmAlgoBuildRawEvents::CheckDataAvailable => Fired layers check not implemented yet for "
-                   << det.sName;
-        return kFALSE;
+        /// check for requested number of different stations
+        /// loop over sts digis and check for
+        std::set<uint32_t> setStations;  // Use set instead of vector as search by value later
+        std::map<uint32_t, int> mModules;
+
+        for (int idigi = 0; idigi < iNbDigis; ++idigi) {
+          uint idx                = event->GetIndex(det.dataType, idigi);
+          const CbmStsDigi* pDigi = GetDigi<CbmStsDigi>(idx);
+          if (nullptr == pDigi) continue;
+
+          int iAddr = pDigi->GetAddress();
+          /// Module full address
+          int iModuleAddr = CbmStsAddress::GetMotherAddress(iAddr, EStsElementLevel::kStsModule);
+          /// Station index: station = unit in the mCBM addresses ?!?
+          int iStationAddr = CbmStsAddress::GetElementId(iAddr, EStsElementLevel::kStsUnit);
+          //int iStationAddr = CbmStsAddress::GetElementId(iAddr, EStsElementLevel::kStsUnit) / 2;
+
+          std::map<uint32_t, int>::iterator itModule = mModules.find(iModuleAddr);
+          if (itModule == mModules.end()) {
+            // LOG(info) << Form("Found new module 0x%08x, side %u", iModuleAddr,
+            //                   static_cast<uint32_t>(pDigi->GetChannel() / 1024));
+            mModules[iModuleAddr] = static_cast<int32_t>(pDigi->GetChannel() / 1024);  // extend map
+          }
+          else {
+            // LOG(info) << Form("Check side %u of module 0x%08x: %d ?",
+            //                   static_cast<int32_t>(pDigi->GetChannel() / 1024),
+            //                   iModuleAddr, itModule->second);
+            if (static_cast<int32_t>(pDigi->GetChannel() / 1024) == (1 - itModule->second)) {
+              /// Found other side => non-zero cluster chance, insert into stations set
+              auto itStation = setStations.find(iStationAddr);
+              if (itStation == setStations.end()) {
+                // LOG(info) << Form("Add station 0x%08x ", iStationAddr);
+                setStations.insert(iStationAddr);
+              }
+            }
+          }
+        }
+        // LOG(info) << "Found " << setStations.size() << " Sts stations, " << " in " << iNbDigis << " Sts digis";
+        if (setStations.size() < det.fuTriggerMinLayers) {
+          LOG(debug2) << "Event does not have enough layers fired: " << setStations.size() << " vs "
+                      << det.fuTriggerMinLayers << " for " << det.sName;
+          return kFALSE;
+        }
         break;
       }
       case ECbmModuleId::kMuch: {
@@ -640,7 +680,6 @@ Bool_t CbmAlgoBuildRawEvents::CheckTriggerConditions(CbmEvent* event, RawEventBu
         /// loop over tof digis and count different RPCs
         std::set<uint32_t> setRpcs;  // Use set instead of vector as search by value later
         std::map<uint32_t, int> mStrips;
-        std::map<uint32_t, int>::iterator it;
 
         for (int idigi = 0; idigi < iNbDigis; ++idigi) {
           uint idx                = event->GetIndex(det.dataType, idigi);
@@ -659,7 +698,7 @@ Bool_t CbmAlgoBuildRawEvents::CheckTriggerConditions(CbmEvent* event, RawEventBu
           else {
             // LOG(info) << Form("Check side %u of  strip 0x%08x: %d ?", pDigi->GetSide(), iStripAddr, itStrip->second);
             if ((int) pDigi->GetSide() == (1 - itStrip->second)) {
-              /// Found other end => full strip, insert into counter vector
+              /// Found other end => full strip, insert into counter set
               auto itRpc = setRpcs.find(iRpcAddr);
               if (itRpc == setRpcs.end()) {
                 // LOG(info) << Form("Add counter 0x%08x ", iRpcAddr);
-- 
GitLab