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