CbmRoot
Loading...
Searching...
No Matches
DigiEventSelectorConfig.cxx
Go to the documentation of this file.
1/* Copyright (C) 2022-2025 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Shreya Roy. Pierre-Alain Loizeau, Volker Friese [committer], Dominik Smith, Sergei Zharko */
4
6
8
9#include <iomanip>
10
11namespace cbm::algo::evbuild
12{
13
14 // ----- Constructor from YAML ------------------------------------------
16 {
17 if (!config) return;
18 if (auto numDigis = config["minDigis"]) {
19 for (YAML::const_iterator it = numDigis.begin(); it != numDigis.end(); it++) {
20 auto det = util::FromString<ECbmModuleId>(it->first.as<std::string>(), false).value_or(ECbmModuleId::kNotExist);
21 if (det == ECbmModuleId::kNotExist) {
22 throw std::runtime_error("DigiEventSelectorConfig: invalid detector in minDigis entry: "
23 + it->first.as<std::string>());
24 }
25 auto value = it->second.as<size_t>();
26 if (value > 0)
27 fMinNumDigis[det] = value;
28 else
29 L_(warning) << "DigiEventSelectorConfig: Ignoring minimum 0 for digis in " << det;
30 }
31 }
32 if (auto numLayers = config["minLayers"]) {
33 for (YAML::const_iterator it = numLayers.begin(); it != numLayers.end(); it++) {
34 auto det = util::FromString<ECbmModuleId>(it->first.as<std::string>(), false).value_or(ECbmModuleId::kNotExist);
35 if (det == ECbmModuleId::kNotExist) {
36 throw std::runtime_error("DigiEventSelectorConfig: invalid detector in minLayers entry: "
37 + it->first.as<std::string>());
38 }
39 auto value = it->second.as<size_t>();
40 if (value > 0)
41 fMinNumLayers[det] = value;
42 else
43 L_(warning) << "DigiEventSelectorConfig: Ignoring minimum 0 for layers in " << det;
44 }
45 }
46 if (auto maskedChannels = config["maskedChannels"]) {
47 for (YAML::const_iterator it = maskedChannels.begin(); it != maskedChannels.end(); ++it) {
48 auto det = util::FromString<ECbmModuleId>(it->first.as<std::string>(), false).value_or(ECbmModuleId::kNotExist);
49 if (det == ECbmModuleId::kNotExist) {
50 throw std::runtime_error("DigiEventSelectorConfig: invalid detector in maskedChannels entry: "
51 + it->first.as<std::string>());
52 }
53 auto value = it->second.as<std::vector<uint32_t>>();
54 if (value.size() > 0) {
55 fMaskedChannels[det] = std::unordered_set<uint32_t>(value.begin(), value.end());
56 L_(info) << "Masking following " << det << " channels from event selecting: ";
57 for (auto address : fMaskedChannels[det]) {
58 L_(info) << " - 0x" << std::hex << std::setw(8) << std::setfill('0') << address << std::dec;
59 }
60 }
61 }
62 }
63 }
64 // --------------------------------------------------------------------------
65
66
67 // ----- Save to YAML ---------------------------------------------------
69 {
70 YAML::Node result;
71 for (const auto& entry : fMinNumDigis) {
72 result["minDigis"][std::string(util::ToString(entry.first))] = entry.second;
73 }
74 for (const auto& entry : fMinNumLayers) {
75 result["minLayers"][std::string(util::ToString(entry.first))] = entry.second;
76 }
77 // FIXME: implement masked channels storage
78 return result;
79 }
80 // --------------------------------------------------------------------------
81
82
83} // namespace cbm::algo::evbuild
#define L_(level)
@ kNotExist
If not found.
Definition CbmDefs.h:68
std::map< ECbmModuleId, size_t > fMinNumLayers
Key: detector, value: Minimal number of layers.
std::map< ECbmModuleId, std::unordered_set< uint32_t > > fMaskedChannels
A map of masked digi addresses, which should not participate in the event building.
std::map< ECbmModuleId, size_t > fMinNumDigis
Key: detector, value: minimal number of digis.
DigiEventSelectorConfig(YAML::Node config)
Constructor from YAML.
std::optional< T > FromString(std::string_view str, bool caseSensitive=false)
Definition CbmEnumDict.h:50
std::string_view ToString(T t)
Definition CbmEnumDict.h:64