Iguana LATEST
Implementation Guardian of Analysis Algorithms
Loading...
Searching...
No Matches
Algorithm.h
1#pragma once
2
3#include <mutex>
4#include <optional>
5#include <set>
6
7#include <hipo4/bank.h>
8
10#include "iguana/bankdefs/BankDefs.h"
11#include "iguana/services/RCDBReader.h"
12#include "iguana/services/YAMLReader.h"
13#include <iguana/services/GlobalParam.h>
14
15namespace iguana {
16
18 // ALGORITHM TOOLS
20
22 namespace tools {
32 hipo::banklist::size_type GetBankIndex(
33 hipo::banklist& banks,
34 std::string const& bank_name,
35 unsigned int const& variant = 0) noexcept(false);
36 }
37
39 // BASE CLASS ALGORITHM
41
43 /* NOTE: if you modify this, you also must modify:
44 * - [ ] `PrintOptionValue`
45 * - [ ] Template specializations in this class
46 * - [ ] Template specializations in `YAMLReader` or `ConfigFileReader`, and `ConcurrentParam`
47 * - [ ] Add new tests, if you added new types
48 * - FIXME: adding `bool` type may be tricky, see https://github.com/JeffersonLab/iguana/issues/347
49 */
50 using option_t = std::variant<
51 int,
52 double,
53 std::string,
54 std::vector<int>,
55 std::vector<double>,
56 std::vector<std::string>>;
57
66 class Algorithm : public Object
67 {
68
69 public:
70
72 Algorithm(std::string_view name)
73 : Object(name)
74 , m_rows_only(false)
78 {}
79 virtual ~Algorithm() {}
80
86 virtual void Start(hipo::banklist& banks) = 0;
87
91 void Start();
92
99 virtual bool Run(hipo::banklist& banks) const = 0;
100
102 virtual void Stop() = 0;
103
109 template <typename OPTION_TYPE>
110 OPTION_TYPE SetOption(std::string const& key, const OPTION_TYPE val)
111 {
112 // FIXME: this template is not specialized, to be friendlier to python `cppyy` bindings
113 if(key == "log") {
114 if constexpr(std::disjunction<
115 std::is_same<OPTION_TYPE, std::string>,
116 std::is_same<OPTION_TYPE, char const*>,
117 std::is_same<OPTION_TYPE, Logger::Level>>::value)
118 m_log->SetLevel(val);
119 else
120 m_log->Error("Option '{}' must be a string or a Logger::Level", key);
121 }
122 m_option_cache[key] = val;
123 return val;
124 }
125
130 template <typename OPTION_TYPE>
131 OPTION_TYPE GetOptionScalar(std::string const& key, YAMLReader::node_path_t node_path = {}) const;
132
137 template <typename OPTION_TYPE>
138 std::vector<OPTION_TYPE> GetOptionVector(std::string const& key, YAMLReader::node_path_t node_path = {}) const;
139
144 template <typename OPTION_TYPE>
145 std::set<OPTION_TYPE> GetOptionSet(std::string const& key, YAMLReader::node_path_t node_path = {}) const;
146
149 void SetName(std::string_view name);
150
153 std::unique_ptr<YAMLReader> const& GetConfig() const;
154
157 void SetConfig(std::unique_ptr<YAMLReader>&& yaml_config);
158
162 void SetConfigFile(std::string const& name);
163
167 void SetConfigDirectory(std::string const& name);
168
175 hipo::banklist::size_type GetBankIndex(hipo::banklist& banks, std::string const& bank_name) const noexcept(false);
176
182 hipo::banklist::size_type GetCreatedBankIndex(hipo::banklist& banks) const noexcept(false);
183
187 std::vector<std::string> GetCreatedBankNames() const noexcept(false);
188
192 std::string GetCreatedBankName() const noexcept(false);
193
199 hipo::bank GetCreatedBank(std::string const& bank_name = "") const noexcept(false);
200
205 hipo::schema GetCreatedBankSchema(std::string const& bank_name = "") const noexcept(false);
206
209 unsigned int GetCreatedBankVariant() const;
210
212 std::unique_ptr<RCDBReader>& GetRCDBReader();
213
214 protected: // methods
215
218
221
227 hipo::bank& GetBank(hipo::banklist& banks, hipo::banklist::size_type const idx, std::string const& expected_bank_name = "") const noexcept(false);
228
234 hipo::schema CreateBank(
235 hipo::banklist& banks,
236 hipo::banklist::size_type& bank_idx,
237 std::string const& bank_name) noexcept(false);
238
243 void ShowBanks(hipo::banklist const& banks, std::string_view message = "", Logger::Level const level = Logger::trace) const;
244
249 void ShowBank(hipo::bank const& bank, std::string_view message = "", Logger::Level const level = Logger::trace) const;
250
254 template <typename OPTION_TYPE>
255 std::optional<OPTION_TYPE> GetCachedOption(std::string const& key) const;
256
261 void ThrowSinceRenamed(std::string const& new_name, std::string const& version) const noexcept(false);
262
263 private: // methods
264
268 void CompleteOptionNodePath(std::string const& key, YAMLReader::node_path_t& node_path) const;
269
270 // PrintOptionValue: overloaded for different value types
271 void PrintOptionValue(std::string const& key, int const& val, Logger::Level const level = Logger::debug, std::string_view prefix = "OPTION") const;
272 void PrintOptionValue(std::string const& key, double const& val, Logger::Level const level = Logger::debug, std::string_view prefix = "OPTION") const;
273 void PrintOptionValue(std::string const& key, std::string const& val, Logger::Level const level = Logger::debug, std::string_view prefix = "OPTION") const;
274 void PrintOptionValue(std::string const& key, std::vector<int> const& val, Logger::Level const level = Logger::debug, std::string_view prefix = "OPTION") const;
275 void PrintOptionValue(std::string const& key, std::vector<double> const& val, Logger::Level const level = Logger::debug, std::string_view prefix = "OPTION") const;
276 void PrintOptionValue(std::string const& key, std::vector<std::string> const& val, Logger::Level const level = Logger::debug, std::string_view prefix = "OPTION") const;
277
278 protected: // members
279
281 std::string m_class_name;
282
285
288
292
295 std::string o_user_config_dir;
296
298 mutable std::mutex m_mutex;
299
302 unsigned int m_created_bank_variant{0};
303
305 std::unique_ptr<RCDBReader> m_rcdb;
306
307 private: // members
308
310 std::unique_ptr<YAMLReader> m_yaml_config;
311
313 std::unordered_map<std::string, option_t> m_option_cache;
314 };
315
317 // ALGORITHM FACTORY
319
321 using algo_t = std::unique_ptr<Algorithm>;
322
324 class AlgorithmFactory
325 {
326
327 public:
328
330 using algo_creator_t = std::function<algo_t()>;
331
332 AlgorithmFactory() = delete;
333
339 static bool Register(std::string const& algo_name, algo_creator_t creator, std::vector<std::string> const new_banks = {}) noexcept;
340
344 static algo_t Create(std::string const& algo_name) noexcept(false);
345
349 static std::optional<std::vector<std::string>> GetCreatorAlgorithms(std::string const& bank_name) noexcept;
350
354 static std::optional<std::vector<std::string>> GetCreatedBanks(std::string const& algo_name) noexcept(false);
355
356 private:
357
359 static std::unordered_map<std::string, algo_creator_t> s_creators;
360
362 static std::unordered_map<std::string, std::vector<std::string>> s_bank_to_algos;
363
365 static std::unordered_map<std::string, std::vector<std::string>> s_algo_to_banks;
366 };
367}
Preprocessor macros to generate standardized algorithm boilerplate code.
static std::optional< std::vector< std::string > > GetCreatedBanks(std::string const &algo_name) noexcept(false)
std::function< algo_t()> algo_creator_t
Algorithm creator function type.
Definition Algorithm.h:330
static std::optional< std::vector< std::string > > GetCreatorAlgorithms(std::string const &bank_name) noexcept
static bool Register(std::string const &algo_name, algo_creator_t creator, std::vector< std::string > const new_banks={}) noexcept
static algo_t Create(std::string const &algo_name) noexcept(false)
Base class for all algorithms to inherit from.
Definition Algorithm.h:67
void SetName(std::string_view name)
std::string GetCreatedBankName() const noexcept(false)
void SetConfigDirectory(std::string const &name)
std::optional< OPTION_TYPE > GetCachedOption(std::string const &key) const
virtual void Start(hipo::banklist &banks)=0
Initialize this algorithm before any events are processed, with the intent to process banks.
std::set< OPTION_TYPE > GetOptionSet(std::string const &key, YAMLReader::node_path_t node_path={}) const
std::unique_ptr< YAMLReader > const & GetConfig() const
void SetConfig(std::unique_ptr< YAMLReader > &&yaml_config)
std::unique_ptr< RCDBReader > m_rcdb
RCDB reader.
Definition Algorithm.h:305
std::string m_class_name
Class name of this algorithm.
Definition Algorithm.h:281
OPTION_TYPE GetOptionScalar(std::string const &key, YAMLReader::node_path_t node_path={}) const
std::vector< std::string > GetCreatedBankNames() const noexcept(false)
void ShowBanks(hipo::banklist const &banks, std::string_view message="", Logger::Level const level=Logger::trace) const
std::vector< OPTION_TYPE > GetOptionVector(std::string const &key, YAMLReader::node_path_t node_path={}) const
hipo::bank & GetBank(hipo::banklist &banks, hipo::banklist::size_type const idx, std::string const &expected_bank_name="") const noexcept(false)
unsigned int m_created_bank_variant
Definition Algorithm.h:302
std::mutex m_mutex
A mutex for this algorithm.
Definition Algorithm.h:298
hipo::schema GetCreatedBankSchema(std::string const &bank_name="") const noexcept(false)
void Start()
Initialize this algorithm before any events are processed, with the intent to process bank rows rathe...
void SetConfigFile(std::string const &name)
hipo::schema CreateBank(hipo::banklist &banks, hipo::banklist::size_type &bank_idx, std::string const &bank_name) noexcept(false)
void ParseYAMLConfig()
Parse YAML configuration files. Sets m_yaml_config.
std::string o_user_config_dir
Definition Algorithm.h:295
void ShowBank(hipo::bank const &bank, std::string_view message="", Logger::Level const level=Logger::trace) const
unsigned int GetCreatedBankVariant() const
void ThrowSinceRenamed(std::string const &new_name, std::string const &version) const noexcept(false)
virtual void Stop()=0
Finalize this algorithm after all events are processed.
OPTION_TYPE SetOption(std::string const &key, const OPTION_TYPE val)
Definition Algorithm.h:110
bool m_rows_only
If true, algorithm can only operate on bank rows; Algorithm::GetBank, and therefore Algorithm::Run,...
Definition Algorithm.h:284
hipo::banklist::size_type GetBankIndex(hipo::banklist &banks, std::string const &bank_name) const noexcept(false)
std::string o_user_config_file
Definition Algorithm.h:291
std::string m_default_config_file
Default configuration file name.
Definition Algorithm.h:287
hipo::banklist::size_type GetCreatedBankIndex(hipo::banklist &banks) const noexcept(false)
void StartRCDBReader()
Instantiate the RCDBReader instance for this algorithm.
hipo::bank GetCreatedBank(std::string const &bank_name="") const noexcept(false)
std::unique_ptr< RCDBReader > & GetRCDBReader()
Algorithm(std::string_view name)
Definition Algorithm.h:72
virtual bool Run(hipo::banklist &banks) const =0
Run Function: Process an event's hipo::banklist
Simple logger service.
Definition Logger.h:18
std::unique_ptr< Logger > m_log
Logger instance for this object
Definition Object.h:52
Object(std::string_view name="", Logger::Level lev=Logger::DEFAULT_LEVEL)
RCDB reader.
Definition RCDBReader.h:32
A YAMLReader based on yaml-cpp.
Definition YAMLReader.h:15
std::deque< node_id_t > node_path_t
Representation of a path of YAML::Nodes in a YAML::Node tree, e.g., in a YAML file.
Definition YAMLReader.h:28
general algorithm tools
Definition Algorithm.h:22
hipo::banklist::size_type GetBankIndex(hipo::banklist &banks, std::string const &bank_name, unsigned int const &variant=0) noexcept(false)