10#include "iguana/bankdefs/BankDefs.h"
11#include "iguana/services/DataFileReader.h"
12#include "iguana/services/Deprecated.h"
13#include "iguana/services/GlobalParam.h"
14#include "iguana/services/RCDBReader.h"
15#include "iguana/services/YAMLReader.h"
35 hipo::banklist& banks,
36 std::string
const& bank_name,
37 unsigned int const& variant = 0) noexcept(false);
52 using option_t = std::variant<
58 std::vector<std::
string>>;
91 virtual void Start(hipo::banklist& banks)
final;
107 virtual
bool Run(hipo::banklist& banks) const final;
133 template <typename OPTION_TYPE>
134 OPTION_TYPE
SetOption(std::
string const& key, const OPTION_TYPE val)
138 if constexpr(std::disjunction<
139 std::is_same<OPTION_TYPE, std::string>,
140 std::is_same<OPTION_TYPE, char const*>,
141 std::is_same<OPTION_TYPE, Logger::Level>>::value)
142 m_log->SetLevel(val);
144 m_log->Error(
"Option '{}' must be a string or a Logger::Level", key);
147 iguana::deprecated::CheckSetOptionKey(
m_class_name, key);
149 m_option_cache[key] = val;
156 template <
typename OPTION_TYPE>
162 template <
typename OPTION_TYPE>
168 template <
typename OPTION_TYPE>
190 void SetConfig(std::unique_ptr<YAMLReader>&& yaml_config);
215 hipo::banklist::size_type
GetBankIndex(hipo::banklist& banks, std::string
const& bank_name)
const noexcept(
false);
239 hipo::bank
GetCreatedBank(std::
string const& bank_name =
"") const noexcept(false);
264 hipo::bank&
GetBank(hipo::banklist& banks, hipo::banklist::size_type const idx, std::
string const& expected_bank_name =
"") const noexcept(false);
272 hipo::banklist& banks,
273 hipo::banklist::size_type& bank_idx,
274 std::
string const& bank_name) noexcept(false);
280 void ShowBanks(hipo::banklist const& banks, std::string_view message =
"",
Logger::Level const level =
Logger::trace) const;
286 void ShowBank(hipo::bank const& bank, std::string_view message =
"",
Logger::Level const level =
Logger::trace) const;
292 void ThrowSinceRenamed(std::
string const& new_name, std::
string const& version) const noexcept(false);
299 virtual
void ConfigHook() {}
304 virtual void StartHook(hipo::banklist& banks) {}
308 virtual bool RunHook(hipo::banklist& banks)
const {
return true; }
312 virtual void StopHook() {}
315 void ParseYAMLConfig();
320 template <
typename OPTION_TYPE>
321 std::optional<OPTION_TYPE> GetCachedOption(std::string
const& key)
const;
324 void PrintOptionValue(std::string
const& key,
int const& val,
Logger::Level const level = Logger::debug, std::string_view prefix =
"OPTION")
const;
325 void PrintOptionValue(std::string
const& key,
double const& val,
Logger::Level const level = Logger::debug, std::string_view prefix =
"OPTION")
const;
326 void PrintOptionValue(std::string
const& key, std::string
const& val,
Logger::Level const level = Logger::debug, std::string_view prefix =
"OPTION")
const;
327 void PrintOptionValue(std::string
const& key, std::vector<int>
const& val,
Logger::Level const level = Logger::debug, std::string_view prefix =
"OPTION")
const;
328 void PrintOptionValue(std::string
const& key, std::vector<double>
const& val,
Logger::Level const level = Logger::debug, std::string_view prefix =
"OPTION")
const;
329 void PrintOptionValue(std::string
const& key, std::vector<std::string>
const& val,
Logger::Level const level = Logger::debug, std::string_view prefix =
"OPTION")
const;
363 std::unique_ptr<YAMLReader> m_yaml_config;
366 std::unordered_map<std::string, option_t> m_option_cache;
369 std::unique_ptr<DataFileReader> m_datafile_reader;
377 using algo_t = std::unique_ptr<Algorithm>;
380 class AlgorithmFactory
388 AlgorithmFactory() =
delete;
395 static bool Register(std::string
const& algo_name,
algo_creator_t creator, std::vector<std::string>
const new_banks = {})
noexcept;
400 static algo_t
Create(std::string
const& algo_name)
noexcept(
false);
410 static std::optional<std::vector<std::string>>
GetCreatedBanks(std::string
const& algo_name)
noexcept(
false);
415 static std::unordered_map<std::string, algo_creator_t> s_creators;
418 static std::unordered_map<std::string, std::vector<std::string>> s_bank_to_algos;
421 static std::unordered_map<std::string, std::vector<std::string>> s_algo_to_banks;
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.
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.
void SetName(std::string_view name)
std::string GetCreatedBankName() const noexcept(false)
void SetConfigDirectory(std::string const &name)
std::string GetAlgorithmDir() const
virtual bool Run(hipo::banklist &banks) const final
Run Function: Process an event's hipo::banklist
std::unique_ptr< YAMLReader > const & GetConfig() const
void SetConfig(std::unique_ptr< YAMLReader > &&yaml_config)
std::unique_ptr< RCDBReader > m_rcdb
RCDB reader.
std::string m_class_name
Class name of this algorithm.
virtual void Stop() final
Stop Function: Finalize this algorithm after all events are processed.
virtual void Start(hipo::banklist &banks) final
Start Function: Initialize this algorithm before any events are processed, with the intent to process...
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
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
std::mutex m_mutex
A mutex for this algorithm.
hipo::schema GetCreatedBankSchema(std::string const &bank_name="") const noexcept(false)
std::string GetModelFile(std::string const &name)
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)
std::string o_user_config_dir
void ShowBank(hipo::bank const &bank, std::string_view message="", Logger::Level const level=Logger::trace) const
unsigned int GetCreatedBankVariant() const
OPTION_TYPE GetOptionScalar(YAMLReader::node_path_t node_path={}) const
void ThrowSinceRenamed(std::string const &new_name, std::string const &version) const noexcept(false)
OPTION_TYPE SetOption(std::string const &key, const OPTION_TYPE val)
Set an option specified by the user.
std::vector< OPTION_TYPE > GetOptionVector(YAMLReader::node_path_t node_path={}) const
bool m_rows_only
If true, algorithm can only operate on bank rows; Algorithm::GetBank, and therefore Algorithm::Run,...
hipo::banklist::size_type GetBankIndex(hipo::banklist &banks, std::string const &bank_name) const noexcept(false)
std::string o_user_config_file
std::string m_default_config_file
Default configuration file name.
std::set< OPTION_TYPE > GetOptionSet(YAMLReader::node_path_t node_path={}) const
hipo::banklist::size_type GetCreatedBankIndex(hipo::banklist &banks) const noexcept(false)
YAML::Node GetOptionNode(YAMLReader::node_path_t node_path) const
virtual void Start() final
Start Function: Initialize this algorithm before any events are processed, with the intent to process...
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)
std::unique_ptr< Logger > m_log
Logger instance for this object
Object(std::string_view name="", Logger::Level lev=Logger::DEFAULT_LEVEL)
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.