CbmRoot
Loading...
Searching...
No Matches
RecoSetup.h
Go to the documentation of this file.
1/* Copyright (C) 2025 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Sergei Zharko [committer] */
4
9
10
11#ifndef CBM_ALGO_RecoSetup_h
12#define CBM_ALGO_RecoSetup_h 1
13
14#include "CbmDefs.h"
15#include "CbmStructLooper.h"
16#include "CbmTypeTraits.h"
22
23#include <boost/serialization/access.hpp>
24#include <boost/serialization/split_free.hpp>
25
26#include <functional>
27#include <optional>
28#include <tuple>
29#include <type_traits>
30#include <variant>
31
32namespace cbm::algo
33{
34 // clang-format off
35 namespace detail
36 {
39 template<ECbmModuleId> struct RecoSetupUnitMapper;
40
46 }
47 // clang-format on
48
49 template<ECbmModuleId ModuleId>
51
52 // clang-format off
53 using RecoSetupUnitPtrVariant_t = std::variant<const mvd::RecoSetupUnit*,
54 const sts::RecoSetupUnit*,
55 const much::RecoSetupUnit*,
56 const trd::RecoSetupUnit*,
57 const tof::RecoSetupUnit*>;
58 // clang-format on
59
62 class RecoSetup {
63 public:
64 //* Member methods
65
67 RecoSetup() = default;
68
71 RecoSetup(const std::string& filename);
72
76 template<class Visitor>
77 void ForEachOptUnit(Visitor&& visitor) const
78 {
79 kUnits.ForEachVariable(this, std::forward<Visitor>(visitor));
80 }
81
85 template<class Visitor>
86 void ForEachOptUnit(Visitor&& visitor)
87 {
88 kUnits.ForEachVariable(this, std::forward<Visitor>(visitor));
89 }
90
94 template<class Visitor>
95 void ForEachUnit(Visitor&& visitor) const
96 {
97 kUnits.ForEachValue(this, std::forward<Visitor>(visitor));
98 }
99
103 template<class Visitor>
104 void ForEachUnit(Visitor&& visitor)
105 {
106 kUnits.ForEachValue(this, std::forward<Visitor>(visitor));
107 }
108
109
111 template<ECbmModuleId ModuleId>
113 {
116 "Unsupported ECbmModuleId (SFINAE)");
117
118 if constexpr (ModuleId == ECbmModuleId::kMuch)
119 return GetMuch();
120 else if constexpr (ModuleId == ECbmModuleId::kMvd)
121 return GetMvd();
122 else if constexpr (ModuleId == ECbmModuleId::kSts)
123 return GetSts();
124 else if constexpr (ModuleId == ECbmModuleId::kTrd)
125 return GetTrd();
126 else if constexpr (ModuleId == ECbmModuleId::kTof)
127 return GetTof();
128 }
129
132 const much::RecoSetupUnit* GetMuch() const { return HasMuch() ? &fMuch.value() : nullptr; }
133
136 const mvd::RecoSetupUnit* GetMvd() const { return HasMvd() ? &fMvd.value() : nullptr; }
137
140 const sts::RecoSetupUnit* GetSts() const { return HasSts() ? &fSts.value() : nullptr; }
141
144 const tof::RecoSetupUnit* GetTof() const { return HasTof() ? &fTof.value() : nullptr; }
145
148 const trd::RecoSetupUnit* GetTrd() const { return HasTrd() ? &fTrd.value() : nullptr; }
149
152 template<ECbmModuleId ModuleId>
153 bool Has() const
154 {
155 if constexpr (ModuleId == ECbmModuleId::kMuch)
156 return HasMuch();
157 else if constexpr (ModuleId == ECbmModuleId::kMvd)
158 return HasMvd();
159 else if constexpr (ModuleId == ECbmModuleId::kSts)
160 return HasSts();
161 else if constexpr (ModuleId == ECbmModuleId::kTrd)
162 return HasTrd();
163 else if constexpr (ModuleId == ECbmModuleId::kTof)
164 return HasTof();
165 return false;
166 }
167
169 bool Has(ECbmModuleId moduleId) const;
170
172 bool HasMuch() const { return fMuch.has_value(); }
173
175 bool HasMvd() const { return fMvd.has_value(); }
176
178 bool HasSts() const { return fSts.has_value(); }
179
181 bool HasTof() const { return fTof.has_value(); }
182
184 bool HasTrd() const { return fTrd.has_value(); }
185
187 void SetMuch(much::RecoSetupUnit much) { fMuch = std::make_optional(std::move(much)); }
188
190 void SetMvd(mvd::RecoSetupUnit mvd) { fMvd = std::make_optional(std::move(mvd)); }
191
193 void SetSts(sts::RecoSetupUnit sts) { fSts = std::make_optional(std::move(sts)); }
194
196 void SetTof(tof::RecoSetupUnit tof) { fTof = std::make_optional(std::move(tof)); }
197
199 void SetTrd(trd::RecoSetupUnit trd) { fTrd = std::make_optional(std::move(trd)); }
200
202 std::string ToString() const;
203
204
205 //* Static methods
206
210 static RecoSetup Load(const std::string& filename);
211
216 static void Store(const RecoSetup& setup, const std::string& filename);
217
218 private:
219 std::optional<mvd::RecoSetupUnit> fMvd{std::nullopt};
220 std::optional<sts::RecoSetupUnit> fSts{std::nullopt};
221 std::optional<much::RecoSetupUnit> fMuch{std::nullopt};
222 std::optional<trd::RecoSetupUnit> fTrd{std::nullopt};
223 std::optional<tof::RecoSetupUnit> fTof{std::nullopt};
224
226 // clang-format off
227 static constexpr auto kUnits = cbm::util::StructLooper(
233 );
234 // clang-format on
235
238 template<class Archive>
239 void load(Archive& ar, const unsigned int /*version*/)
240 {
241 ForEachOptUnit([&ar](auto& unit) {
242 bool isNotNullopt;
243 ar >> isNotNullopt;
244 if (isNotNullopt) {
245 using Unit_t = typename std::remove_reference_t<decltype(unit)>::value_type;
246 Unit_t res{};
247 ar >> res;
248 unit = std::make_optional(std::move(res));
249 }
250 else {
251 unit = std::nullopt;
252 }
253 });
254 }
255
257 template<class Archive>
258 void save(Archive& ar, const unsigned int /*version*/) const
259 {
260 ForEachOptUnit([&ar](const auto& unit) {
261 if (unit.has_value()) {
262 ar << true;
263 ar << unit.value();
264 }
265 else {
266 ar << false;
267 }
268 });
269 }
270
272 template<class Archive>
273 void serialize(Archive& ar, const unsigned int version)
274 {
275 boost::serialization::split_member(ar, *this, version);
276 }
277 };
278
279} // namespace cbm::algo
280
281#endif // CBM_ALGO_RecoSetup_h
ECbmModuleId
Enumerator for module Identifiers.
Definition CbmDefs.h:45
@ kMvd
Micro-Vertex Detector.
Definition CbmDefs.h:47
@ kTrd
Transition Radiation Detector.
Definition CbmDefs.h:51
@ kTof
Time-of-flight Detector.
Definition CbmDefs.h:52
@ kSts
Silicon Tracking System.
Definition CbmDefs.h:48
@ kMuch
Muon detection system.
Definition CbmDefs.h:50
A generic looper over selected variables of a struct/class.
Different metaprogramming utilities (type traits) for CBM experiment.
An instance of reconstruction setup unit interfaces for online/offline data reconstruction.
Definition RecoSetup.h:62
void ForEachUnit(Visitor &&visitor) const
A for-each method, which is applied to each unit, if it has a value (constant access)
Definition RecoSetup.h:95
void SetMvd(mvd::RecoSetupUnit mvd)
Defines STS reconstruction setup unit.
Definition RecoSetup.h:190
std::string ToString() const
Dumps contents to string.
Definition RecoSetup.cxx:87
const sts::RecoSetupUnit * GetSts() const
Access to STS reconstruction setup unit.
Definition RecoSetup.h:140
static RecoSetup Load(const std::string &filename)
Loads setup from a file.
Definition RecoSetup.cxx:42
static constexpr auto kUnits
A tuple of units (for loops)
Definition RecoSetup.h:227
std::optional< tof::RecoSetupUnit > fTof
TOF reconstruction setup unit.
Definition RecoSetup.h:223
void save(Archive &ar, const unsigned int) const
Serialization save method.
Definition RecoSetup.h:258
bool HasMvd() const
Checks, if the MVD reconstruction setup unit is available.
Definition RecoSetup.h:175
void SetTof(tof::RecoSetupUnit tof)
Defines TOF reconstruction setup unit.
Definition RecoSetup.h:196
std::optional< mvd::RecoSetupUnit > fMvd
MVD reconstruction setup unit.
Definition RecoSetup.h:219
bool HasTrd() const
Checks, if the TRD reconstruction setup unit is available.
Definition RecoSetup.h:184
void SetSts(sts::RecoSetupUnit sts)
Defines STS reconstruction setup unit.
Definition RecoSetup.h:193
const RecoSetupUnit_t< ModuleId > * Get() const
Access to a reconstruction setup unit.
Definition RecoSetup.h:112
std::optional< trd::RecoSetupUnit > fTrd
TRD reconstruction setup unit.
Definition RecoSetup.h:222
const mvd::RecoSetupUnit * GetMvd() const
Access to MVD reconstruction setup unit.
Definition RecoSetup.h:136
void ForEachOptUnit(Visitor &&visitor) const
A for-each method, which is applied to each unit as an std::optional<> (constant access)
Definition RecoSetup.h:77
void load(Archive &ar, const unsigned int)
Serialization load method.
Definition RecoSetup.h:239
void ForEachOptUnit(Visitor &&visitor)
A for-each method, which is applied to each unit as an std::optional<> (mutable access)
Definition RecoSetup.h:86
static void Store(const RecoSetup &setup, const std::string &filename)
Stores setup in a file.
Definition RecoSetup.cxx:69
bool HasTof() const
Checks, if the TOF reconstruction setup unit is available.
Definition RecoSetup.h:181
std::optional< sts::RecoSetupUnit > fSts
STS reconstruction setup unit.
Definition RecoSetup.h:220
bool Has() const
Checks, if a setup unit is available (compile-time)
Definition RecoSetup.h:153
const trd::RecoSetupUnit * GetTrd() const
Access to TRD reconstruction setup unit.
Definition RecoSetup.h:148
const much::RecoSetupUnit * GetMuch() const
Access to MuCh reconstruction setup unit.
Definition RecoSetup.h:132
friend class boost::serialization::access
Definition RecoSetup.h:236
void SetTrd(trd::RecoSetupUnit trd)
Defines TRD reconstruction setup unit.
Definition RecoSetup.h:199
const tof::RecoSetupUnit * GetTof() const
Access to TOF reconstruction setup unit.
Definition RecoSetup.h:144
bool HasMuch() const
Checks, if the MuCh reconstruction setup unit is available.
Definition RecoSetup.h:172
void SetMuch(much::RecoSetupUnit much)
Defines MuCh reconstruction setup unit.
Definition RecoSetup.h:187
RecoSetup()=default
Default constructor.
bool HasSts() const
Checks, if the STS reconstruction setup unit is available.
Definition RecoSetup.h:178
void ForEachUnit(Visitor &&visitor)
A for-each method, which is applied to each unit, if it has a value (mutable access)
Definition RecoSetup.h:104
void serialize(Archive &ar, const unsigned int version)
Serialization method.
Definition RecoSetup.h:273
std::optional< much::RecoSetupUnit > fMuch
MuCh reconstruction setup unit.
Definition RecoSetup.h:221
TOF detector representation in online/offline reconstruction.
An utility, which allows to apply a callable to selected variables of a class in a loop.
MuCh representation for tracking.
MVD representation for tracking.
std::variant< const mvd::RecoSetupUnit *, const sts::RecoSetupUnit *, const much::RecoSetupUnit *, const trd::RecoSetupUnit *, const tof::RecoSetupUnit * > RecoSetupUnitPtrVariant_t
Definition RecoSetup.h:53
typename detail::RecoSetupUnitMapper< ModuleId >::type RecoSetupUnit_t
Definition RecoSetup.h:50
constexpr bool is_in_sequence_v
STS representation for tracking.
TOF representation for tracking.
TRD representation for tracking.