From 394a064dc06f54339d4a066afe0b521da29730d3 Mon Sep 17 00:00:00 2001
From: Volker Friese <v.friese@gsi.de>
Date: Mon, 10 Jul 2023 11:19:55 +0200
Subject: [PATCH] Added event selector to CbmReco and its YAML configuration

---
 algo/evselector/DigiEventSelector.cxx |  7 +++++++
 algo/evselector/DigiEventSelector.h   |  5 +++--
 reco/tasks/CbmReco.cxx                | 27 +++++++++++++++++++++++++++
 reco/tasks/CbmReco.h                  |  4 ++++
 4 files changed, 41 insertions(+), 2 deletions(-)

diff --git a/algo/evselector/DigiEventSelector.cxx b/algo/evselector/DigiEventSelector.cxx
index e47bf8d516..771fc1d7c1 100644
--- a/algo/evselector/DigiEventSelector.cxx
+++ b/algo/evselector/DigiEventSelector.cxx
@@ -24,12 +24,19 @@ namespace cbm::algo
     //TO DO: Investigate possible algorithms that use bitset instead of std::unordered_map.
     //This requires consequtive addresses for modules and stations.
 
+    // --- Digi number in BMON
+    if (!(event.fData.fT0.fDigis.size() > fParams.fMinNumDigisBmon)) return false;
+
+    // --- Number of STS stations
     if (0 < fParams.fStsMinStations) {
       if (!CheckSts(event.fData.fSts.fDigis)) return false;
     }
+
+    // --- Number of TOF layers
     if (0 < fParams.fTofMinLayers) {
       if (!CheckTof(event.fData.fTof.fDigis)) return false;
     }
+
     return true;
   }
 
diff --git a/algo/evselector/DigiEventSelector.h b/algo/evselector/DigiEventSelector.h
index f55b9fb48c..119dda5955 100644
--- a/algo/evselector/DigiEventSelector.h
+++ b/algo/evselector/DigiEventSelector.h
@@ -13,8 +13,9 @@ namespace cbm::algo
 {
 
   struct DigiEventSelectorParams {
-    uint8_t fStsMinStations = 0;
-    uint8_t fTofMinLayers   = 0;
+    size_t fStsMinStations  = 0;
+    size_t fTofMinLayers    = 0;
+    size_t fMinNumDigisBmon = 0;
   };
 
   /** @class DigiEventSelector
diff --git a/reco/tasks/CbmReco.cxx b/reco/tasks/CbmReco.cxx
index 0c19981f42..7c77a76f94 100644
--- a/reco/tasks/CbmReco.cxx
+++ b/reco/tasks/CbmReco.cxx
@@ -25,6 +25,8 @@
 
 #include <yaml-cpp/yaml.h>
 
+#include "DigiEventSelector.h"
+
 using std::make_unique;
 using std::string;
 
@@ -33,11 +35,13 @@ using std::string;
 void CbmRecoConfig::LoadYaml(const std::string& filename)
 {
   YAML::Node config = YAML::LoadFile(filename);
+
   // --- Digi trigger
   fTriggerDet       = ToCbmModuleIdCaseInsensitive(config["trigger"]["detector"].as<std::string>());
   fTriggerWin       = config["trigger"]["window"].as<double>();
   fTriggerThreshold = config["trigger"]["threshold"].as<size_t>();
   fTriggerDeadTime  = config["trigger"]["deadtime"].as<double>();
+
   // --- Event builder: (detector -> (tMin, tMax))
   if (auto eventbuilder = config["eventbuilder"]) {
     if (auto windows = eventbuilder["windows"]) {
@@ -49,10 +53,17 @@ void CbmRecoConfig::LoadYaml(const std::string& filename)
       }
     }
   }
+
+  // --- Event selector parameters
+  fSelectMinStationsSts = config["selector"]["minStationsSts"].as<size_t>();
+  fSelectMinStationsTof = config["selector"]["minStationsTof"].as<size_t>();
+  fSelectMinDigisBmon   = config["selector"]["minDigisBmon"].as<size_t>();
+
   // --- Branch persistence in output file
   fStoreTimeslice = config["store"]["timeslice"].as<bool>();
   fStoreTrigger   = config["store"]["triggers"].as<bool>();
   fStoreEvents    = config["store"]["events"].as<bool>();
+
   // --- QA publishing
   fHttpServerRefreshRate = config["qa"]["refreshrate"].as<int32_t>(fHttpServerRefreshRate);
 }
@@ -63,17 +74,26 @@ void CbmRecoConfig::LoadYaml(const std::string& filename)
 void CbmRecoConfig::SaveYaml(const std::string& filename)
 {
   YAML::Node config;
+
   // --- Digi trigger
   config["trigger"]["detector"]  = ToString(fTriggerDet);
   config["trigger"]["window"]    = fTriggerWin;
   config["trigger"]["threshold"] = fTriggerThreshold;
   config["trigger"]["deadtime"]  = fTriggerDeadTime;
+
   // --- Event builder: (detector -> (tMin, tMax))
   for (const auto& [key, value] : fEvtbuildWindows) {
     auto det = ToString(key);
     config["eventbuilder"]["windows"][det].push_back(value.first);
     config["eventbuilder"]["windows"][det].push_back(value.second);
   };
+
+  // --- Event selector
+  config["selector"]["minStationsSts"] = fSelectMinStationsSts;
+  config["selector"]["minStationsTof"] = fSelectMinStationsTof;
+  config["selector"]["minDigisBmon"]   = fSelectMinDigisBmon;
+
+
   // --- Branch persistence in output file
   config["store"]["timeslice"] = fStoreTimeslice;
   config["store"]["triggers"]  = fStoreTrigger;
@@ -187,11 +207,18 @@ int32_t CbmReco::Run()
   trigger->SetOutputBranchPersistent("Trigger", fConfig.fStoreTrigger);
   run.AddTask(trigger.release());
 
+  // --- Event selector parameters
+  size_t minStatSts   = fConfig.fSelectMinStationsSts;
+  size_t minStatTof   = fConfig.fSelectMinStationsTof;
+  size_t minDigisBmon = fConfig.fSelectMinDigisBmon;
+  auto selectPar      = cbm::algo::DigiEventSelectorParams {minStatSts, minStatTof, minDigisBmon};
+
   // --- Event building
   auto evtBuild = make_unique<CbmTaskBuildEvents>();
   for (auto& entry : fConfig.fEvtbuildWindows)
     evtBuild->SetEventWindow(entry.first, entry.second.first, entry.second.second);
   evtBuild->SetOutputBranchPersistent("DigiEvent", fConfig.fStoreEvents);
+  evtBuild->SetDigiEventSelector(selectPar);
   run.AddTask(evtBuild.release());
 
   // --- Event QA
diff --git a/reco/tasks/CbmReco.h b/reco/tasks/CbmReco.h
index 2c233a4474..a031d0c968 100644
--- a/reco/tasks/CbmReco.h
+++ b/reco/tasks/CbmReco.h
@@ -28,6 +28,10 @@ public:
   double fTriggerDeadTime  = 0.;                       // Minimal time between two trigger [ns]
   // --- Event builder: (detector -> (tMin, tMax))
   std::map<ECbmModuleId, std::pair<double, double>> fEvtbuildWindows = {};
+  // --- Event selector
+  size_t fSelectMinStationsSts = 0;
+  size_t fSelectMinStationsTof = 0;
+  size_t fSelectMinDigisBmon   = 0;
   // --- Branch persistence in output file
   bool fStoreTimeslice = false;
   bool fStoreTrigger   = false;
-- 
GitLab