From 81b6233f66eedf1d3f39411f54a9fbd1ef79a1be Mon Sep 17 00:00:00 2001 From: Christopher Dilks Date: Thu, 7 Dec 2023 18:28:16 -0500 Subject: [PATCH] feat: Lorentz transformer algorithm (#46) --- .github/workflows/linux.yml | 6 ++- doc/Doxyfile | 2 +- .../event_builder_filter/EventBuilderFilter.h | 1 - .../clas12/event_builder_filter/README.md | 3 -- src/algorithms/clas12/fiducial_cuts/README.md | 3 -- .../lorentz_transformer/LorentzTransformer.cc | 50 +++++++++++++++++++ .../lorentz_transformer/LorentzTransformer.h | 43 ++++++++++++++++ .../clas12/momentum_corrections/README.md | 3 -- .../clas12/pid_refinement/README.md | 3 -- src/algorithms/meson.build | 2 + src/iguana/AlgorithmSequence.cc | 1 + src/iguana/AlgorithmSequence.h | 4 +- src/services/Algorithm.h | 1 + src/tests/run_banks.cc | 3 +- 14 files changed, 107 insertions(+), 18 deletions(-) delete mode 100644 src/algorithms/clas12/event_builder_filter/README.md delete mode 100644 src/algorithms/clas12/fiducial_cuts/README.md create mode 100644 src/algorithms/clas12/lorentz_transformer/LorentzTransformer.cc create mode 100644 src/algorithms/clas12/lorentz_transformer/LorentzTransformer.h delete mode 100644 src/algorithms/clas12/momentum_corrections/README.md delete mode 100644 src/algorithms/clas12/pid_refinement/README.md diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index 50a52e81..1e57da72 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -179,8 +179,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - run: sudo apt install -y doxygen - - run: doxygen doc/Doxyfile + - name: doxygen + uses: mattnotmitt/doxygen-action@v1 + with: + doxyfile-path: doc/Doxyfile - uses: actions/upload-pages-artifact@v2 with: retention-days: 1 diff --git a/doc/Doxyfile b/doc/Doxyfile index e1f87a7a..2de7e309 100644 --- a/doc/Doxyfile +++ b/doc/Doxyfile @@ -1768,7 +1768,7 @@ FORMULA_MACROFILE = # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. -USE_MATHJAX = NO +USE_MATHJAX = YES # With MATHJAX_VERSION it is possible to specify the MathJax version to be used. # Note that the different versions of MathJax have different requirements with diff --git a/src/algorithms/clas12/event_builder_filter/EventBuilderFilter.h b/src/algorithms/clas12/event_builder_filter/EventBuilderFilter.h index 5eadba0d..d3bb54db 100644 --- a/src/algorithms/clas12/event_builder_filter/EventBuilderFilter.h +++ b/src/algorithms/clas12/event_builder_filter/EventBuilderFilter.h @@ -1,7 +1,6 @@ #pragma once #include "services/Algorithm.h" -#include namespace iguana::clas12 { diff --git a/src/algorithms/clas12/event_builder_filter/README.md b/src/algorithms/clas12/event_builder_filter/README.md deleted file mode 100644 index 79958d20..00000000 --- a/src/algorithms/clas12/event_builder_filter/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Event Builder Filter - -Filters a particle bank for specific Event Builder PDGs diff --git a/src/algorithms/clas12/fiducial_cuts/README.md b/src/algorithms/clas12/fiducial_cuts/README.md deleted file mode 100644 index 1dfd0d09..00000000 --- a/src/algorithms/clas12/fiducial_cuts/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Fiducial Cuts - -Prototype many-to-one algorithm diff --git a/src/algorithms/clas12/lorentz_transformer/LorentzTransformer.cc b/src/algorithms/clas12/lorentz_transformer/LorentzTransformer.cc new file mode 100644 index 00000000..ccc1e837 --- /dev/null +++ b/src/algorithms/clas12/lorentz_transformer/LorentzTransformer.cc @@ -0,0 +1,50 @@ +#include "LorentzTransformer.h" + +namespace iguana::clas12 { + + void LorentzTransformer::Start(hipo::banklist& banks) { + + CacheOption("frame", std::string{"mirror"}, o_frame); + CacheBankIndex(banks, "REC::Particle", b_particle); + + // define transformation function + // TODO: add more useful frames, e.g., Breit + if(o_frame == "mirror") { // reverses the momentum, just for demonstration + m_transform = [] (float& px, float& py, float& pz, float& e) { + px = -px; + py = -py; + pz = -pz; + }; + } + else + Throw(fmt::format("unknown frame '{}'", o_frame)); + + } + + + void LorentzTransformer::Run(hipo::banklist& banks) const { + auto& particleBank = GetBank(banks, b_particle, "REC::Particle"); + ShowBank(particleBank, Logger::Header("INPUT PARTICLES")); + for(int row = 0; row < particleBank.getRows(); row++) { + auto px = particleBank.getFloat("px", row); + auto py = particleBank.getFloat("py", row); + auto pz = particleBank.getFloat("pz", row); + float e = 0.0; // TODO: get the energy + Transform(px, py, pz, e); + particleBank.putFloat("px", row, px); + particleBank.putFloat("py", row, py); + particleBank.putFloat("pz", row, pz); + } + ShowBank(particleBank, Logger::Header("OUTPUT PARTICLES")); + } + + + void LorentzTransformer::Transform(float& px, float& py, float& pz, float& e) const { + m_transform(px, py, pz, e); + } + + + void LorentzTransformer::Stop() { + } + +} diff --git a/src/algorithms/clas12/lorentz_transformer/LorentzTransformer.h b/src/algorithms/clas12/lorentz_transformer/LorentzTransformer.h new file mode 100644 index 00000000..fac00fb8 --- /dev/null +++ b/src/algorithms/clas12/lorentz_transformer/LorentzTransformer.h @@ -0,0 +1,43 @@ +#pragma once + +#include "services/Algorithm.h" + +namespace iguana::clas12 { + + /// @brief Lorentz transform momenta in `REC::Particle` (or similar banks) + /// + /// Available frames are: + /// - `"mirror"`: reverse the momentum (just a demo) + class LorentzTransformer : public Algorithm { + + public: + + /// @see `Algorithm::Algorithm` + LorentzTransformer(std::string name="lorentz_transformer") : Algorithm(name) {} + ~LorentzTransformer() {} + + void Start(hipo::banklist& banks) override; + void Run(hipo::banklist& banks) const override; + void Stop() override; + + /// **Action function**: transform the 4-momentum @f$p=(p_x,p_y,p_z,E)@f$ to the specified frame + /// @param px @f$p_x@f$ + /// @param py @f$p_y@f$ + /// @param pz @f$p_z@f$ + /// @param e @f$E@f$ + void Transform(float& px, float& py, float& pz, float& e) const; + + private: + + /// `hipo::banklist` index for the particle bank + int b_particle; + + /// configuration options + std::string o_frame; + + /// Lorentz transformation function + std::function m_transform; + + }; + +} diff --git a/src/algorithms/clas12/momentum_corrections/README.md b/src/algorithms/clas12/momentum_corrections/README.md deleted file mode 100644 index 841830b1..00000000 --- a/src/algorithms/clas12/momentum_corrections/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Momentum Corrections - -Prototype one-to-one algorithm, where the output is a modified input diff --git a/src/algorithms/clas12/pid_refinement/README.md b/src/algorithms/clas12/pid_refinement/README.md deleted file mode 100644 index 28da260b..00000000 --- a/src/algorithms/clas12/pid_refinement/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Particle Identification Refinement - -Prototype many-to-many algorithm diff --git a/src/algorithms/meson.build b/src/algorithms/meson.build index b8d90cf2..17cc5aa2 100644 --- a/src/algorithms/meson.build +++ b/src/algorithms/meson.build @@ -1,9 +1,11 @@ algo_headers = [ 'clas12/event_builder_filter/EventBuilderFilter.h', + 'clas12/lorentz_transformer/LorentzTransformer.h', ] algo_sources = [ 'clas12/event_builder_filter/EventBuilderFilter.cc', + 'clas12/lorentz_transformer/LorentzTransformer.cc', ] algo_lib = shared_library( diff --git a/src/iguana/AlgorithmSequence.cc b/src/iguana/AlgorithmSequence.cc index 7df8233a..d2b12869 100644 --- a/src/iguana/AlgorithmSequence.cc +++ b/src/iguana/AlgorithmSequence.cc @@ -4,6 +4,7 @@ namespace iguana { AlgorithmSequence::AlgorithmSequence() { algo_map.insert({clas12_EventBuilderFilter, std::move(std::make_unique())}); + algo_map.insert({clas12_LorentzTransformer, std::move(std::make_unique())}); } } diff --git a/src/iguana/AlgorithmSequence.h b/src/iguana/AlgorithmSequence.h index 0ab8b8a7..e979eae3 100644 --- a/src/iguana/AlgorithmSequence.h +++ b/src/iguana/AlgorithmSequence.h @@ -4,6 +4,7 @@ // TODO: avoid listing the algos #include "algorithms/clas12/event_builder_filter/EventBuilderFilter.h" +#include "algorithms/clas12/lorentz_transformer/LorentzTransformer.h" namespace iguana { @@ -19,7 +20,8 @@ namespace iguana { // TODO: avoid listing the algos // TODO: who should own the algorithm instances: AlgorithmSequence or the user? enum algo { - clas12_EventBuilderFilter + clas12_EventBuilderFilter, + clas12_LorentzTransformer }; /// Map of algorithm enumerator to the algorithm diff --git a/src/services/Algorithm.h b/src/services/Algorithm.h index 6d677367..c206ea32 100644 --- a/src/services/Algorithm.h +++ b/src/services/Algorithm.h @@ -6,6 +6,7 @@ #include #include #include +#include #include diff --git a/src/tests/run_banks.cc b/src/tests/run_banks.cc index 3864ad23..69f69429 100644 --- a/src/tests/run_banks.cc +++ b/src/tests/run_banks.cc @@ -20,7 +20,8 @@ int main(int argc, char **argv) { * use the test algorithm directly */ const iguana::AlgorithmSequence I; - auto& algo = I.algo_map.at(iguana::AlgorithmSequence::clas12_EventBuilderFilter); + // auto& algo = I.algo_map.at(iguana::AlgorithmSequence::clas12_EventBuilderFilter); + auto& algo = I.algo_map.at(iguana::AlgorithmSequence::clas12_LorentzTransformer); algo->Log()->SetLevel("trace"); // algo->Log()->DisableStyle(); algo->SetOption("pids", std::set{11, 211, -211});