From e0a5546c2ba33b0cf36015eceeadaba8b8ac3c03 Mon Sep 17 00:00:00 2001 From: Christopher Dilks Date: Tue, 14 Nov 2023 22:47:42 -0500 Subject: [PATCH] feat: filter a bank with `mode: blank` --- meson.build | 3 +- .../EventBuilderFilter.cc | 63 ++++++++++++++----- .../event_builder_filter/EventBuilderFilter.h | 15 ++++- src/services/Algorithm.cc | 15 +++++ src/services/Algorithm.h | 16 ++++- src/services/Logger.cc | 4 ++ src/services/Logger.h | 1 + src/tests/main.cc | 2 +- 8 files changed, 97 insertions(+), 22 deletions(-) diff --git a/meson.build b/meson.build index ad05c82b..a1048224 100644 --- a/meson.build +++ b/meson.build @@ -2,7 +2,8 @@ project( 'iguana', 'cpp', version: '0.0.0', - license: 'LGPLv3' + license: 'LGPLv3', + default_options: [ 'cpp_std=c++20' ], ) project_inc = include_directories('src') diff --git a/src/algorithms/clas12/event_builder_filter/EventBuilderFilter.cc b/src/algorithms/clas12/event_builder_filter/EventBuilderFilter.cc index 5910529e..d55123fd 100644 --- a/src/algorithms/clas12/event_builder_filter/EventBuilderFilter.cc +++ b/src/algorithms/clas12/event_builder_filter/EventBuilderFilter.cc @@ -3,38 +3,67 @@ namespace iguana::clas12 { void EventBuilderFilter::Start() { - m_log->Info("start event builder filter"); + m_log->Debug("START {}", m_name); + + // set configuration + m_log->SetLevel(Logger::Level::trace); + m_opt.mode = EventBuilderFilterOptions::Modes::blank; + m_opt.pids = {11, 211, -211}; } - Algorithm::BankMap EventBuilderFilter::Run(Algorithm::BankMap inputBanks) { + + Algorithm::BankMap EventBuilderFilter::Run(Algorithm::BankMap inBanks) { + m_log->Debug("RUN {}", m_name); // check the input banks existence - if(MissingInputBanks(inputBanks, {"particles"})) + if(MissingInputBanks(inBanks, {"particles"})) ThrowRun(); // define the output schemata and banks - BankMap outputBanks = { - { "particles", hipo::bank(inputBanks.at("particles").getSchema(), inputBanks.at("particles").getRows()) } + BankMap outBanks = { + { "particles", hipo::bank(inBanks.at("particles").getSchema()) } }; - // filter the input bank for requested PDG code(s) - int j=0; - for(int i=0; iInfo("INPUT PID = {}", pid); - if(pid==11) - outputBanks.at("particles").put("pid", j++, pid); + // set number of output rows + switch(m_opt.mode) { + case EventBuilderFilterOptions::Modes::blank: + outBanks.at("particles").setRows(inBanks.at("particles").getRows()); + break; + case EventBuilderFilterOptions::Modes::compact: + outBanks.at("particles").setRows(inBanks.at("particles").getRows()); // FIXME + break; } - // print - m_log->Info("SHOW OUTPUT BANKS"); - outputBanks.at("particles").show(); + // filter the input bank for requested PDG code(s) + int outRow = -1; + for(int inRow=0; inRowDebug("input PID {} -- accept", inPid); + if(m_opt.mode == EventBuilderFilterOptions::Modes::blank) + outRow = inRow; + else + outRow++; + outBanks.at("particles").put("pid", outRow, inPid); + } - return outputBanks; + else { + m_log->Debug("input PID {} -- reject", inPid); + if(m_opt.mode == EventBuilderFilterOptions::blank) + outBanks.at("particles").put("pid", inRow, 0); + } + + } + + // dump the banks and return the output + ShowBanks(inBanks, outBanks); + return outBanks; } + void EventBuilderFilter::Stop() { - m_log->Info("stop event builder filter"); + m_log->Debug("STOP {}", m_name); } } diff --git a/src/algorithms/clas12/event_builder_filter/EventBuilderFilter.h b/src/algorithms/clas12/event_builder_filter/EventBuilderFilter.h index b9c559b6..89b249b7 100644 --- a/src/algorithms/clas12/event_builder_filter/EventBuilderFilter.h +++ b/src/algorithms/clas12/event_builder_filter/EventBuilderFilter.h @@ -4,6 +4,14 @@ namespace iguana::clas12 { + class EventBuilderFilterOptions { + public: + enum Modes { blank, compact }; + Modes mode = blank; + std::set pids = {11, 211}; + }; + + class EventBuilderFilter : public Algorithm { public: @@ -11,7 +19,12 @@ namespace iguana::clas12 { ~EventBuilderFilter() {} void Start() override; - Algorithm::BankMap Run(Algorithm::BankMap inputBanks) override; + Algorithm::BankMap Run(Algorithm::BankMap inBanks) override; void Stop() override; + + private: + EventBuilderFilterOptions m_opt; + }; + } diff --git a/src/services/Algorithm.cc b/src/services/Algorithm.cc index 8608432e..dd1c2e19 100644 --- a/src/services/Algorithm.cc +++ b/src/services/Algorithm.cc @@ -23,4 +23,19 @@ namespace iguana { throw std::runtime_error(fmt::format("Algorithm '{}' cannot `Run`", m_name)); } + void Algorithm::ShowBanks(BankMap banks, std::string message, Logger::Level level) { + if(m_log->GetLevel() <= level) { + m_log->Print(level, message); + for(auto [key,bank] : banks) { + m_log->Print(level, "BANK: '{}'", key); + bank.show(); + } + } + } + + void Algorithm::ShowBanks(BankMap inBanks, BankMap outBanks, Logger::Level level) { + ShowBanks(inBanks, "===== INPUT BANKS =====", level); + ShowBanks(outBanks, "===== OUTPUT BANKS =====", level); + } + } diff --git a/src/services/Algorithm.h b/src/services/Algorithm.h index f82ddac0..f3af1e4e 100644 --- a/src/services/Algorithm.h +++ b/src/services/Algorithm.h @@ -23,9 +23,9 @@ namespace iguana { virtual void Start() = 0; /// Run an algorithm - /// @param inputBanks the set of input banks + /// @param inBanks the set of input banks /// @return a set of output banks - virtual BankMap Run(BankMap inputBanks) = 0; + virtual BankMap Run(BankMap inBanks) = 0; /// Finalize an algorithm after all events are processed virtual void Stop() = 0; @@ -41,6 +41,18 @@ namespace iguana { /// Throw a runtime exception when calling `Run` void ThrowRun(); + /// Dump all banks in a BankMap + /// @param banks the banks to show + /// @param message optionally print a header message + /// @param level the log level + void ShowBanks(BankMap banks, std::string message="", Logger::Level level=Logger::trace); + + /// Dump all input and output banks + /// @param inBanks the input banks + /// @param outBanks the output banks + /// @param level the log level + void ShowBanks(BankMap inBanks, BankMap outBanks, Logger::Level level=Logger::trace); + /// algorithm name std::string m_name; diff --git a/src/services/Logger.cc b/src/services/Logger.cc index 42282c3b..9af7d518 100644 --- a/src/services/Logger.cc +++ b/src/services/Logger.cc @@ -18,4 +18,8 @@ namespace iguana { Debug("Logger '{}' set to '{}'", m_name, m_level_names.at(m_level)); } + Logger::Level Logger::GetLevel() { + return m_level; + } + } diff --git a/src/services/Logger.h b/src/services/Logger.h index d95fd53e..7ff1039a 100644 --- a/src/services/Logger.h +++ b/src/services/Logger.h @@ -23,6 +23,7 @@ namespace iguana { ~Logger() {} void SetLevel(Level lev); + Level GetLevel(); template void Trace(std::string msg, VALUES... vals) { Print(trace, msg, vals...); } template void Debug(std::string msg, VALUES... vals) { Print(debug, msg, vals...); } diff --git a/src/tests/main.cc b/src/tests/main.cc index 65bfbfe8..782e0a58 100644 --- a/src/tests/main.cc +++ b/src/tests/main.cc @@ -10,7 +10,7 @@ int main(int argc, char **argv) { reader.open(inFile.c_str()); hipo::dictionary factory; reader.readDictionary(factory); - factory.show(); + // factory.show(); hipo::bank particleBank(factory.getSchema("REC::Particle")); hipo::event event;