diff --git a/CMakeLists.txt b/CMakeLists.txt index 016129a..95ac819 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -52,6 +52,7 @@ add_library(triggeralgs SHARED src/TPWindow.cpp src/dbscan/dbscan.cpp src/dbscan/Hit.cpp + src/TriggerActivityFactory.cpp ) target_include_directories(triggeralgs PUBLIC diff --git a/include/triggeralgs/ADCSimpleWindow/TriggerActivityMakerADCSimpleWindow.hpp b/include/triggeralgs/ADCSimpleWindow/TriggerActivityMakerADCSimpleWindow.hpp index d6c7661..941c65d 100644 --- a/include/triggeralgs/ADCSimpleWindow/TriggerActivityMakerADCSimpleWindow.hpp +++ b/include/triggeralgs/ADCSimpleWindow/TriggerActivityMakerADCSimpleWindow.hpp @@ -10,6 +10,7 @@ #define TRIGGERALGS_ADCSIMPLEWINDOW_TRIGGERACTIVITYMAKERADCSIMPLEWINDOW_HPP_ #include "triggeralgs/TriggerActivityMaker.hpp" +#include "triggeralgs/TriggerActivityFactory.hpp" #include "triggeralgs/Types.hpp" #include @@ -94,7 +95,6 @@ class TriggerActivityMakerADCSimpleWindow : public TriggerActivityMaker // Configurable parameters. uint32_t m_adc_threshold = 1200000; timestamp_t m_window_length = 100000; - }; } // namespace triggeralgs diff --git a/include/triggeralgs/HorizontalMuon/TriggerActivityMakerHorizontalMuon.hpp b/include/triggeralgs/HorizontalMuon/TriggerActivityMakerHorizontalMuon.hpp index e88e0cd..4bfd192 100644 --- a/include/triggeralgs/HorizontalMuon/TriggerActivityMakerHorizontalMuon.hpp +++ b/include/triggeralgs/HorizontalMuon/TriggerActivityMakerHorizontalMuon.hpp @@ -11,6 +11,7 @@ #include "triggeralgs/TriggerActivityMaker.hpp" #include "triggeralgs/TPWindow.hpp" +#include "triggeralgs/TriggerActivityFactory.hpp" #include #include diff --git a/include/triggeralgs/MichelElectron/TriggerActivityMakerMichelElectron.hpp b/include/triggeralgs/MichelElectron/TriggerActivityMakerMichelElectron.hpp index cc9fe6b..bc77311 100644 --- a/include/triggeralgs/MichelElectron/TriggerActivityMakerMichelElectron.hpp +++ b/include/triggeralgs/MichelElectron/TriggerActivityMakerMichelElectron.hpp @@ -10,6 +10,7 @@ #define TRIGGERALGS_MICHELELECTRON_TRIGGERACTIVITYMAKERMICHELELECTRON_HPP_ #include "triggeralgs/TriggerActivityMaker.hpp" +#include "triggeralgs/TriggerActivityFactory.hpp" #include #include diff --git a/include/triggeralgs/PlaneCoincidence/TriggerActivityMakerPlaneCoincidence.hpp b/include/triggeralgs/PlaneCoincidence/TriggerActivityMakerPlaneCoincidence.hpp index f1e56b1..62025ff 100644 --- a/include/triggeralgs/PlaneCoincidence/TriggerActivityMakerPlaneCoincidence.hpp +++ b/include/triggeralgs/PlaneCoincidence/TriggerActivityMakerPlaneCoincidence.hpp @@ -11,6 +11,7 @@ #include "detchannelmaps/TPCChannelMap.hpp" #include "triggeralgs/TriggerActivityMaker.hpp" +#include "triggeralgs/TriggerActivityFactory.hpp" #include "triggeralgs/TPWindow.hpp" #include #include @@ -67,7 +68,6 @@ class TriggerActivityMakerPlaneCoincidence : public TriggerActivityMaker void dump_window_record(); void dump_tp(TriggerPrimitive const& input_tp); std::vector m_window_record; - }; } // namespace triggeralgs #endif // TRIGGERALGS_PLANECOINCIDENCE_TRIGGERACTIVITYMAKERPLANECOINCIDENCE_HPP_ diff --git a/include/triggeralgs/Prescale/TriggerActivityMakerPrescale.hpp b/include/triggeralgs/Prescale/TriggerActivityMakerPrescale.hpp index 496dfeb..5a2a0f4 100644 --- a/include/triggeralgs/Prescale/TriggerActivityMakerPrescale.hpp +++ b/include/triggeralgs/Prescale/TriggerActivityMakerPrescale.hpp @@ -10,6 +10,7 @@ #define TRIGGERALGS_PRESCALE_TRIGGERACTIVITYMAKERPRESCALE_HPP_ #include "triggeralgs/TriggerActivityMaker.hpp" +#include "triggeralgs/TriggerActivityFactory.hpp" #include @@ -25,7 +26,6 @@ class TriggerActivityMakerPrescale : public TriggerActivityMaker private: uint64_t m_primitive_count = 0; // NOLINT(build/unsigned) uint64_t m_prescale = 1; // NOLINT(build/unsigned) - }; } // namespace triggeralgs diff --git a/include/triggeralgs/Supernova/TriggerActivityMakerSupernova.hpp b/include/triggeralgs/Supernova/TriggerActivityMakerSupernova.hpp index eebfacb..9eb0340 100644 --- a/include/triggeralgs/Supernova/TriggerActivityMakerSupernova.hpp +++ b/include/triggeralgs/Supernova/TriggerActivityMakerSupernova.hpp @@ -10,6 +10,7 @@ #define TRIGGERALGS_SRC_TRIGGERALGS_SUPERNOVA_TRIGGERACTIVITYMAKERSUPERNOVA_HPP_ #include "triggeralgs/TriggerActivityMaker.hpp" +#include "triggeralgs/TriggerActivityFactory.hpp" #include #include @@ -51,6 +52,8 @@ class TriggerActivityMakerSupernova : public TriggerActivityMaker void flush(timestamp_t, std::vector& tas) override { tas.push_back(MakeTriggerActivity()); } + static std::shared_ptr createMaker(); + protected: timestamp_diff_t m_time_tolerance = 250; /// Maximum tolerated time difference between two primitives to form an activity (in 50 MHz clock ticks) diff --git a/include/triggeralgs/TriggerActivityFactory.hpp b/include/triggeralgs/TriggerActivityFactory.hpp new file mode 100644 index 0000000..75db248 --- /dev/null +++ b/include/triggeralgs/TriggerActivityFactory.hpp @@ -0,0 +1,49 @@ +/* @file: TriggerActivityFactory.hpp + * + * This is part of the DUNE DAQ Application Framework, copyright 2023. + * Licensing/copyright details are in the COPYING file that you should have + * received with this code. + */ + +#ifndef TRIGGERALGS_TRIGGER_ACTIVITY_FACTORY_HPP_ +#define TRIGGERALGS_TRIGGER_ACTIVITY_FACTORY_HPP_ + +#include "triggeralgs/TriggerActivityMaker.hpp" + +#include +#include +#include +#include + +#define REGISTER_TRIGGER_ACTIVITY_MAKER(tam_name, tam_class) \ + static struct tam_class##Registrar { \ + tam_class##Registrar() { \ + TriggerActivityFactory::registerCreator(tam_name, []() -> std::shared_ptr {return std::make_shared();}); \ + } \ + } tam_class##_registrar; + +namespace triggeralgs { + +class TriggerActivityFactory +{ + public: + using TAMakerCreator = std::function()>; + using TAMakerMap = std::unordered_map; + + public: + TriggerActivityFactory(const TriggerActivityFactory&) = delete; + TriggerActivityFactory& operator=(const TriggerActivityFactory&) = delete; + virtual ~TriggerActivityFactory() {} + + static std::shared_ptr makeTAMaker(const std::string& algName); + + static void registerCreator(const std::string algName, TAMakerCreator creator); + + private: + static TAMakerMap& getTAMakers(); +}; + +} /* namespace triggeralgs */ + +// TODO: Define ers exceptions +#endif // TRIGGERALGS_TRIGGER_ACTIVITY_FACTORY_HPP_ diff --git a/include/triggeralgs/dbscan/TriggerActivityMakerDBSCAN.hpp b/include/triggeralgs/dbscan/TriggerActivityMakerDBSCAN.hpp index 11d410f..2d98017 100644 --- a/include/triggeralgs/dbscan/TriggerActivityMakerDBSCAN.hpp +++ b/include/triggeralgs/dbscan/TriggerActivityMakerDBSCAN.hpp @@ -10,6 +10,7 @@ #define TRIGGERALGS_DBSCAN_TRIGGERACTIVITYMAKERDBSCAN_HPP_ #include "triggeralgs/TriggerActivityMaker.hpp" +#include "triggeralgs/TriggerActivityFactory.hpp" #include "triggeralgs/dbscan/dbscan.hpp" #include @@ -30,7 +31,6 @@ class TriggerActivityMakerDBSCAN : public TriggerActivityMaker timestamp_t m_prev_timestamp{0}; std::vector m_dbscan_clusters; std::unique_ptr m_dbscan; - }; } // namespace triggeralgs diff --git a/src/TriggerActivityFactory.cpp b/src/TriggerActivityFactory.cpp new file mode 100644 index 0000000..b87af7d --- /dev/null +++ b/src/TriggerActivityFactory.cpp @@ -0,0 +1,40 @@ +/* @file: TriggerActivityFactory.cpp + * + * This is part of the DUNE DAQ Application Framework, copyright 2023. + * Licensing/copyright details are in the COPYING file that you should have + * received with this code. + */ +#include + +#include "triggeralgs/TriggerActivityFactory.hpp" +#include "TRACE/trace.h" +#define TRACE_NAME "TriggerActivityFactory" + +using namespace triggeralgs; + +TriggerActivityFactory::TAMakerMap& TriggerActivityFactory::getTAMakers() { + static TAMakerMap s_makers; + return s_makers; +} + +void TriggerActivityFactory::registerCreator(const std::string algName, TAMakerCreator creator) +{ + TAMakerMap& makers = getTAMakers(); + + auto it = makers.find(algName); + if (it == makers.end()) { + makers[algName] = creator; + } +} + +std::shared_ptr TriggerActivityFactory::makeTAMaker(const std::string& algName) +{ + TAMakerMap& makers = getTAMakers(); + + auto it = makers.find(algName); + if (it != makers.end()) { + return it->second(); + } + + return nullptr; +} diff --git a/src/TriggerActivityMakerADCSimpleWindow.cpp b/src/TriggerActivityMakerADCSimpleWindow.cpp index 96ebd68..d562c87 100644 --- a/src/TriggerActivityMakerADCSimpleWindow.cpp +++ b/src/TriggerActivityMakerADCSimpleWindow.cpp @@ -9,7 +9,7 @@ #include "triggeralgs/ADCSimpleWindow/TriggerActivityMakerADCSimpleWindow.hpp" #include "TRACE/trace.h" -#define TRACE_NAME "TriggerActivityMakerADCSimpleWindow" +#define TRACE_NAME "TriggerActivityMakerADCSimpleWindowPlugin" #include @@ -96,3 +96,6 @@ TriggerActivityMakerADCSimpleWindow::construct_ta() const ta.inputs = m_current_window.tp_list; return ta; } + +// Register algo in TA Factory +REGISTER_TRIGGER_ACTIVITY_MAKER(TRACE_NAME, TriggerActivityMakerADCSimpleWindow) diff --git a/src/TriggerActivityMakerDBSCAN.cpp b/src/TriggerActivityMakerDBSCAN.cpp index 236fb08..6fb1366 100644 --- a/src/TriggerActivityMakerDBSCAN.cpp +++ b/src/TriggerActivityMakerDBSCAN.cpp @@ -13,7 +13,7 @@ #include "triggeralgs/Types.hpp" #include #include -#define TRACE_NAME "TriggerActivityMakerDBSCAN" +#define TRACE_NAME "TriggerActivityMakerDBSCANPlugin" #include @@ -86,3 +86,6 @@ TriggerActivityMakerDBSCAN::configure(const nlohmann::json &config) m_dbscan=std::make_unique(10, m_min_pts, 10000); } + +// Register algo in TA Factory +REGISTER_TRIGGER_ACTIVITY_MAKER(TRACE_NAME, TriggerActivityMakerDBSCAN) diff --git a/src/TriggerActivityMakerHorizontalMuon.cpp b/src/TriggerActivityMakerHorizontalMuon.cpp index d07d24a..05067c0 100644 --- a/src/TriggerActivityMakerHorizontalMuon.cpp +++ b/src/TriggerActivityMakerHorizontalMuon.cpp @@ -8,7 +8,7 @@ #include "triggeralgs/HorizontalMuon/TriggerActivityMakerHorizontalMuon.hpp" #include "TRACE/trace.h" -#define TRACE_NAME "TriggerActivityMakerHorizontalMuon" +#define TRACE_NAME "TriggerActivityMakerHorizontalMuonPlugin" #include #include @@ -342,3 +342,6 @@ TriggerActivityMakerHorizontalMuon::check_tot() const return window_tot; } + +// Register algo in TA Factory +REGISTER_TRIGGER_ACTIVITY_MAKER(TRACE_NAME, TriggerActivityMakerHorizontalMuon) diff --git a/src/TriggerActivityMakerMichelElectron.cpp b/src/TriggerActivityMakerMichelElectron.cpp index 3c6fc27..f630fa6 100644 --- a/src/TriggerActivityMakerMichelElectron.cpp +++ b/src/TriggerActivityMakerMichelElectron.cpp @@ -8,7 +8,7 @@ #include "triggeralgs/MichelElectron/TriggerActivityMakerMichelElectron.hpp" #include "TRACE/trace.h" -#define TRACE_NAME "TriggerActivityMakerMichelElectron" +#define TRACE_NAME "TriggerActivityMakerMichelElectronPlugin" #include #include @@ -384,3 +384,6 @@ reset."; m_current_window.clear(); return; }*/ + +// Register algo in TA Factory +REGISTER_TRIGGER_ACTIVITY_MAKER(TRACE_NAME, TriggerActivityMakerMichelElectron) diff --git a/src/TriggerActivityMakerPlaneCoincidence.cpp b/src/TriggerActivityMakerPlaneCoincidence.cpp index 9552da4..594f8f9 100644 --- a/src/TriggerActivityMakerPlaneCoincidence.cpp +++ b/src/TriggerActivityMakerPlaneCoincidence.cpp @@ -8,7 +8,7 @@ #include "triggeralgs/PlaneCoincidence/TriggerActivityMakerPlaneCoincidence.hpp" #include "TRACE/trace.h" -#define TRACE_NAME "TriggerActivityMakerPlaneCoincidence" +#define TRACE_NAME "TriggerActivityMakerPlaneCoincidencePlugin" #include using namespace triggeralgs; @@ -273,4 +273,6 @@ TriggerActivityMakerPlaneCoincidence::check_tot(TPWindow m_current_window) const return window_tot; } +// Regiser algo in TA Factory +REGISTER_TRIGGER_ACTIVITY_MAKER(TRACE_NAME, TriggerActivityMakerPlaneCoincidence) // END OF TA MAKER - LOW ENERGY EVENTS diff --git a/src/TriggerActivityMakerPrescale.cpp b/src/TriggerActivityMakerPrescale.cpp index ce10573..cefb828 100644 --- a/src/TriggerActivityMakerPrescale.cpp +++ b/src/TriggerActivityMakerPrescale.cpp @@ -9,7 +9,7 @@ #include "triggeralgs/Prescale/TriggerActivityMakerPrescale.hpp" #include "TRACE/trace.h" -#define TRACE_NAME "TriggerActivityMakerPrescale" +#define TRACE_NAME "TriggerActivityMakerPrescalePlugin" #include @@ -62,3 +62,6 @@ TriggerActivityMakerPrescale::configure(const nlohmann::json &config) } TLOG_DEBUG(TRACE_NAME) << "Using activity prescale " << m_prescale; } + +// Register algo in TA Factory +REGISTER_TRIGGER_ACTIVITY_MAKER(TRACE_NAME, TriggerActivityMakerPrescale) diff --git a/src/TriggerActivityMakerSupernova.cpp b/src/TriggerActivityMakerSupernova.cpp index 00e11da..b6af733 100644 --- a/src/TriggerActivityMakerSupernova.cpp +++ b/src/TriggerActivityMakerSupernova.cpp @@ -8,6 +8,9 @@ #include "triggeralgs/Supernova/TriggerActivityMakerSupernova.hpp" +#include "TRACE/trace.h" +#define TRACE_NAME "TriggerActivityMakerSupernovaPlugin" + #include #include @@ -79,3 +82,6 @@ TriggerActivityMakerSupernova::operator()(const TriggerPrimitive& input_tp, std: m_adc_integral += input_tp.adc_integral; m_detid |= input_tp.detid; } + +// Register algo in TA Factory +REGISTER_TRIGGER_ACTIVITY_MAKER(TRACE_NAME, TriggerActivityMakerSupernova) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index edebd9d..9a402bc 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,8 +1,4 @@ - -add_executable(test_trivial test_trivial.cxx) -target_include_directories(test_trivial PRIVATE ${BOOST_INCLUDE_DIRS}) -add_test(NAME trivial COMMAND test_trivial) - -add_executable(test_supernova test_supernova.cxx) -target_include_directories(test_supernova PRIVATE ${BOOST_INCLUDE_DIRS}) -add_test(NAME supernova COMMAND test_supernova) +add_executable(test_factory test_factory.cxx) +target_link_libraries(test_factory PRIVATE triggeralgs trgdataformats::trgdataformats) +target_include_directories(test_factory PRIVATE ${BOOST_INCLUDE_DIRS}) +add_test(NAME factory COMMAND test_factory) diff --git a/test/test_factory.cxx b/test/test_factory.cxx new file mode 100644 index 0000000..59ef61f --- /dev/null +++ b/test/test_factory.cxx @@ -0,0 +1,48 @@ +/** + * @file test_factory.cxx + * + * This is part of the DUNE DAQ Application Framework, copyright 2023. + * Licensing/copyright details are in the COPYING file that you should have + * received with this code. + */ + +// NOLINTNEXTLINE(build/define_used) +#define BOOST_TEST_MODULE boost_test_macro_overview + +#include "triggeralgs/TriggerActivityFactory.hpp" +#include "triggeralgs/TriggerActivityMaker.hpp" + +#include + +#include +#include + +using namespace dunedaq; + +namespace triggeralgs { + +BOOST_AUTO_TEST_CASE(test_macro_overview) +{ + std::shared_ptr prescale_maker = TriggerActivityFactory::makeTAMaker("TriggerActivityMakerPrescalePlugin"); + + std::vector prescale_ta; + TriggerPrimitive some_tp; + for (int idx = 0; idx < 10; idx++) { + some_tp.type = TriggerPrimitive::Type::kTPC; + some_tp.algorithm = TriggerPrimitive::Algorithm::kTPCDefault; + some_tp.time_start = idx; + some_tp.time_peak = 1+idx; + some_tp.time_over_threshold = 2; + some_tp.adc_integral = 1000+idx; + some_tp.adc_peak = 1000+idx; + some_tp.channel = 0+idx; + some_tp.detid = 0; + (*prescale_maker)(some_tp, prescale_ta); + } + + bool same_alg = (prescale_ta[0].algorithm == TriggerActivity::Algorithm::kPrescale); + + BOOST_TEST(same_alg); +} + +} /* namespace triggeralgs */ diff --git a/test/test_supernova.cxx b/test/test_supernova.cxx deleted file mode 100644 index c65e26a..0000000 --- a/test/test_supernova.cxx +++ /dev/null @@ -1,18 +0,0 @@ -/** - * @file test_supernova.cxx - * - * This is part of the DUNE DAQ Application Framework, copyright 2020. - * Licensing/copyright details are in the COPYING file that you should have - * received with this code. - */ - -// NOLINTNEXTLINE(build/define_used) -#define BOOST_TEST_MODULE boost_test_macro_overview -#include - -BOOST_AUTO_TEST_CASE(test_macro_overview) -{ - int a = 1; - int b = 2; - BOOST_TEST(a == b - 1); -} diff --git a/test/test_trivial.cxx b/test/test_trivial.cxx deleted file mode 100644 index 68bd360..0000000 --- a/test/test_trivial.cxx +++ /dev/null @@ -1,45 +0,0 @@ -/** - * @file test_trivial.cxx - * - * This is part of the DUNE DAQ Application Framework, copyright 2020. - * Licensing/copyright details are in the COPYING file that you should have - * received with this code. - */ - -// NOLINTNEXTLINE(build/define_used) -#define BOOST_TEST_MODULE boost_test_macro_overview - -#include "TriggerPrimitive.hpp" - -#include - -#include -#include -#include - -using namespace DuneTriggers; - -BOOST_AUTO_TEST_CASE(test_macro_overview) -{ - std::default_random_engine generator; - // All this in milliseconds - std::exponential_distribution tp_coming(1000); - std::normal_distribution tp_time_over_threshold(20, 2); - std::exponential_distribution electronic_delay(500); - - auto start = std::chrono::steady_clock::now(); - while (true) { - auto now = std::chrono::steady_clock::now(); - - TriggerPrimitive tp; - - std::chrono::milliseconds millisec_wait(tp_coming(generator)); - std::this_thread::sleep_for(millisec_wait); - if (start - now > std::chrono::seconds(10)) { - break; - } - } - int a = 1; - int b = 2; - BOOST_TEST(a == b - 1); -}