From ac55033761055a771a28c1075a8d64949ed31049 Mon Sep 17 00:00:00 2001 From: Christopher Dilks Date: Tue, 14 Nov 2023 23:36:50 -0500 Subject: [PATCH] feat: copy a bank row --- .../event_builder_filter/EventBuilderFilter.cc | 14 +++++++------- src/services/Algorithm.cc | 14 ++++++++++++++ src/services/Algorithm.h | 11 +++++++++++ 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/src/algorithms/clas12/event_builder_filter/EventBuilderFilter.cc b/src/algorithms/clas12/event_builder_filter/EventBuilderFilter.cc index d55123fdb..18075f5fa 100644 --- a/src/algorithms/clas12/event_builder_filter/EventBuilderFilter.cc +++ b/src/algorithms/clas12/event_builder_filter/EventBuilderFilter.cc @@ -36,22 +36,22 @@ namespace iguana::clas12 { // 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); + CopyBankRow( + inBanks.at("particles"), + outBanks.at("particles"), + m_opt.mode == EventBuilderFilterOptions::Modes::blank ? inRow : outRow++ + ); } else { m_log->Debug("input PID {} -- reject", inPid); if(m_opt.mode == EventBuilderFilterOptions::blank) - outBanks.at("particles").put("pid", inRow, 0); + BlankRow(outBanks.at("particles"), inRow); } } diff --git a/src/services/Algorithm.cc b/src/services/Algorithm.cc index dd1c2e198..60eeeb162 100644 --- a/src/services/Algorithm.cc +++ b/src/services/Algorithm.cc @@ -19,6 +19,20 @@ namespace iguana { return false; } + void Algorithm::CopyBankRow(hipo::bank srcBank, hipo::bank destBank, int row) { + // TODO: check srcBank.getSchema() == destBank.getSchema() + for(int item = 0; item < srcBank.getSchema().getEntries(); item++) { + auto val = srcBank.get(item, row); + destBank.put(item, row, val); + } + } + + void Algorithm::BlankRow(hipo::bank bank, int row) { + for(int item = 0; item < bank.getSchema().getEntries(); item++) { + bank.put(item, row, 0); + } + } + void Algorithm::ThrowRun() { throw std::runtime_error(fmt::format("Algorithm '{}' cannot `Run`", m_name)); } diff --git a/src/services/Algorithm.h b/src/services/Algorithm.h index f3af1e4ec..413327793 100644 --- a/src/services/Algorithm.h +++ b/src/services/Algorithm.h @@ -38,6 +38,17 @@ namespace iguana { /// @return true if `banks` is missing any keys in `keys` bool MissingInputBanks(BankMap banks, std::set keys); + /// Copy a row from one bank to another, assuming their schemata are equivalent + /// @param srcBank the source bank + /// @param destBank the destination bank + /// @param row the row to copy from `srcBank` to `destBank` + void CopyBankRow(hipo::bank srcBank, hipo::bank destBank, int row); + + /// Blank a row, setting all items to zero + /// @param bank the bank to modify + /// @param row the row to blank + void BlankRow(hipo::bank bank, int row); + /// Throw a runtime exception when calling `Run` void ThrowRun();