Loading [MathJax]/extensions/tex2jax.js
Iguana 0.8.0
Implementation Guardian of Analysis Algorithms
All Classes Namespaces Files Functions Variables Typedefs Enumerations Macros Modules Pages
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/YAMLReader.h"
12#include <iguana/services/GlobalParam.h>
13
14namespace iguana {
15
17 /* NOTE: if you modify this, you also must modify:
18 * - [ ] `PrintOptionValue`
19 * - [ ] Template specializations in this class
20 * - [ ] Template specializations in `YAMLReader` or `ConfigFileReader`, and `ConcurrentParam`
21 * - [ ] Add new tests, if you added new types
22 * - FIXME: adding `bool` type may be tricky, see https://github.com/JeffersonLab/iguana/issues/347
23 */
24 using option_t = std::variant<
25 int,
26 double,
27 std::string,
28 std::vector<int>,
29 std::vector<double>,
30 std::vector<std::string>>;
31
40 class Algorithm : public Object
41 {
42
43 public:
44
46 Algorithm(std::string_view name)
47 : Object(name)
48 , m_rows_only(false)
52 {}
53 virtual ~Algorithm() {}
54
60 virtual void Start(hipo::banklist& banks) = 0;
61
65 void Start();
66
69 virtual void Run(hipo::banklist& banks) const = 0;
70
72 virtual void Stop() = 0;
73
79 template <typename OPTION_TYPE>
80 OPTION_TYPE SetOption(std::string const& key, const OPTION_TYPE val)
81 {
82 // FIXME: this template is not specialized, to be friendlier to python `cppyy` bindings
83 if(key == "log") {
84 if constexpr(std::disjunction<
85 std::is_same<OPTION_TYPE, std::string>,
86 std::is_same<OPTION_TYPE, char const*>,
87 std::is_same<OPTION_TYPE, Logger::Level>>::value)
88 m_log->SetLevel(val);
89 else
90 m_log->Error("Option '{}' must be a string or a Logger::Level", key);
91 }
92 m_option_cache[key] = val;
93 return val;
94 }
95
100 template <typename OPTION_TYPE>
101 OPTION_TYPE GetOptionScalar(std::string const& key, YAMLReader::node_path_t node_path = {}) const;
102
107 template <typename OPTION_TYPE>
108 std::vector<OPTION_TYPE> GetOptionVector(std::string const& key, YAMLReader::node_path_t node_path = {}) const;
109
114 template <typename OPTION_TYPE>
115 std::set<OPTION_TYPE> GetOptionSet(std::string const& key, YAMLReader::node_path_t node_path = {}) const;
116
119 void SetName(std::string_view name);
120
123 std::unique_ptr<YAMLReader> const& GetConfig() const;
124
127 void SetConfig(std::unique_ptr<YAMLReader>&& yaml_config);
128
132 void SetConfigFile(std::string const& name);
133
137 void SetConfigDirectory(std::string const& name);
138
139 protected: // methods
140
143
149 hipo::bank& GetBank(hipo::banklist& banks, hipo::banklist::size_type const idx, std::string const& expected_bank_name = "") const noexcept(false);
150
155 hipo::banklist::size_type GetBankIndex(hipo::banklist& banks, std::string const& bank_name) const noexcept(false);
156
162 hipo::schema CreateBank(
163 hipo::banklist& banks,
164 hipo::banklist::size_type& bank_idx,
165 std::string const& bank_name) const noexcept(false);
166
171 void ShowBanks(hipo::banklist& banks, std::string_view message = "", Logger::Level const level = Logger::trace) const;
172
177 void ShowBank(hipo::bank& bank, std::string_view message = "", Logger::Level const level = Logger::trace) const;
178
182 template <typename OPTION_TYPE>
183 std::optional<OPTION_TYPE> GetCachedOption(std::string const& key) const;
184
185 private: // methods
186
190 void CompleteOptionNodePath(std::string const& key, YAMLReader::node_path_t& node_path) const;
191
192 // PrintOptionValue: overloaded for different value types
193 void PrintOptionValue(std::string const& key, int const& val, Logger::Level const level = Logger::debug, std::string_view prefix = "OPTION") const;
194 void PrintOptionValue(std::string const& key, double const& val, Logger::Level const level = Logger::debug, std::string_view prefix = "OPTION") const;
195 void PrintOptionValue(std::string const& key, std::string const& val, Logger::Level const level = Logger::debug, std::string_view prefix = "OPTION") const;
196 void PrintOptionValue(std::string const& key, std::vector<int> const& val, Logger::Level const level = Logger::debug, std::string_view prefix = "OPTION") const;
197 void PrintOptionValue(std::string const& key, std::vector<double> const& val, Logger::Level const level = Logger::debug, std::string_view prefix = "OPTION") const;
198 void PrintOptionValue(std::string const& key, std::vector<std::string> const& val, Logger::Level const level = Logger::debug, std::string_view prefix = "OPTION") const;
199
200 protected: // members
201
203 std::string m_class_name;
204
207
210
214
217 std::string o_user_config_dir;
218
220 mutable std::mutex m_mutex;
221
222 private: // members
223
225 std::unique_ptr<YAMLReader> m_yaml_config;
226
228 std::unordered_map<std::string, option_t> m_option_cache;
229
230 };
231
233
235 using algo_t = std::unique_ptr<Algorithm>;
236
238 class AlgorithmFactory
239 {
240
241 public:
242
244 using algo_creator_t = std::function<algo_t()>;
245
246 AlgorithmFactory() = delete;
247
253 static bool Register(std::string const& name, algo_creator_t creator, std::vector<std::string> const new_banks = {}) noexcept;
254
258 static algo_t Create(std::string const& name) noexcept(false);
259
263 static std::optional<std::vector<std::string>> QueryNewBank(std::string const& bank_name) noexcept;
264
265 private:
266
268 static std::unordered_map<std::string, algo_creator_t> s_creators;
269
271 static std::unordered_map<std::string, std::vector<std::string>> s_created_banks;
272 };
273}
Preprocessor macros to generate standardized algorithm boilerplate code.
static algo_t Create(std::string const &name) noexcept(false)
std::function< algo_t()> algo_creator_t
Algorithm creator function type.
Definition Algorithm.h:244
static bool Register(std::string const &name, algo_creator_t creator, std::vector< std::string > const new_banks={}) noexcept
static std::optional< std::vector< std::string > > QueryNewBank(std::string const &bank_name) noexcept
Base class for all algorithms to inherit from.
Definition Algorithm.h:41
void SetName(std::string_view name)
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::string m_class_name
Class name of this algorithm.
Definition Algorithm.h:203
OPTION_TYPE GetOptionScalar(std::string const &key, YAMLReader::node_path_t node_path={}) const
virtual void Run(hipo::banklist &banks) const =0
Run this algorithm for an event.
std::vector< OPTION_TYPE > GetOptionVector(std::string const &key, YAMLReader::node_path_t node_path={}) const
void ShowBank(hipo::bank &bank, std::string_view message="", Logger::Level const level=Logger::trace) const
hipo::bank & GetBank(hipo::banklist &banks, hipo::banklist::size_type const idx, std::string const &expected_bank_name="") const noexcept(false)
std::mutex m_mutex
A mutex for this algorithm.
Definition Algorithm.h:220
void Start()
Initialize this algorithm before any events are processed, with the intent to process bank rows rathe...
void SetConfigFile(std::string const &name)
void ParseYAMLConfig()
Parse YAML configuration files. Sets m_yaml_config.
std::string o_user_config_dir
Definition Algorithm.h:217
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:80
bool m_rows_only
If true, algorithm can only operate on bank rows; Algorithm::GetBank, and therefore Algorithm::Run,...
Definition Algorithm.h:206
hipo::banklist::size_type GetBankIndex(hipo::banklist &banks, std::string const &bank_name) const noexcept(false)
hipo::schema CreateBank(hipo::banklist &banks, hipo::banklist::size_type &bank_idx, std::string const &bank_name) const noexcept(false)
std::string o_user_config_file
Definition Algorithm.h:213
std::string m_default_config_file
Default configuration file name.
Definition Algorithm.h:209
void ShowBanks(hipo::banklist &banks, std::string_view message="", Logger::Level const level=Logger::trace) const
Algorithm(std::string_view name)
Definition Algorithm.h:46
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)
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, top-level namespace for algorithms and infrastructure. For algorithms and bindings,...
Definition Algorithm.h:14
std::variant< int, double, std::string, std::vector< int >, std::vector< double >, std::vector< std::string > > option_t
Option value variant type.
Definition Algorithm.h:24
std::unique_ptr< Algorithm > algo_t
Algorithm pointer type.
Definition Algorithm.h:235