File indexing completed on 2025-08-28 09:13:26
0001
0002 #include "JANA/JApplicationFwd.h"
0003 #include "JANA/Topology/JEventPool.h"
0004 #include "JANA/Topology/JEventTapArrow.h"
0005 #include "JANA/Utils/JEventLevel.h"
0006 #include <catch.hpp>
0007
0008 #include <JANA/Topology/JTopologyBuilder.h>
0009 #include <JANA/Topology/JMultilevelSourceArrow.h>
0010 #include <JANA/JEventProcessor.h>
0011
0012
0013 class DeinterleavedProc : public JEventProcessor {
0014 public:
0015 DeinterleavedProc() {
0016 SetCallbackStyle(CallbackStyle::ExpertMode);
0017 }
0018 void ProcessSequential(const JEvent& event) override {
0019 LOG_INFO(GetLogger()) << "Consuming " << event.GetEventStamp();
0020 }
0021 };
0022
0023
0024 class MyMultiSource : public JEventSource {
0025 public:
0026 MyMultiSource() {
0027 SetCallbackStyle(CallbackStyle::ExpertMode);
0028 SetEventLevels({JEventLevel::Run, JEventLevel::SlowControls, JEventLevel::PhysicsEvent});
0029 }
0030 Result Emit(JEvent& event) override {
0031 auto count = GetEmittedEventCount();
0032 const auto& levels = GetEventLevels();
0033 SetNextEventLevel(levels.at((count+1) % levels.size()));
0034 LOG_INFO(GetLogger()) << "Emitting " << event.GetEventStamp();
0035 return Result::Success;
0036 }
0037 };
0038
0039 void configure_multisource_topology(JTopologyBuilder& builder) {
0040
0041 auto run_pool = new JEventPool(builder.m_components, 1, 1, JEventLevel::Run);
0042 auto controls_pool = new JEventPool(builder.m_components, 2, 1, JEventLevel::SlowControls);
0043 auto physics_pool = new JEventPool(builder.m_components, 4, 1, JEventLevel::PhysicsEvent);
0044
0045 builder.pools.push_back(run_pool);
0046 builder.pools.push_back(controls_pool);
0047 builder.pools.push_back(physics_pool);
0048
0049 physics_pool->AttachForwardingPool(controls_pool);
0050 physics_pool->AttachForwardingPool(run_pool);
0051
0052 auto* src_arrow = new JMultilevelSourceArrow;
0053 src_arrow->set_name("MultilevelSource");
0054 src_arrow->SetEventSource(builder.m_components->get_evt_srces().at(0));
0055 src_arrow->attach(run_pool, src_arrow->GetPortIndex(JEventLevel::Run, JMultilevelSourceArrow::Direction::In));
0056 src_arrow->attach(controls_pool, src_arrow->GetPortIndex(JEventLevel::SlowControls, JMultilevelSourceArrow::Direction::In));
0057 src_arrow->attach(physics_pool, src_arrow->GetPortIndex(JEventLevel::PhysicsEvent, JMultilevelSourceArrow::Direction::In));
0058
0059 src_arrow->attach(run_pool, src_arrow->GetPortIndex(JEventLevel::Run, JMultilevelSourceArrow::Direction::Out));
0060 src_arrow->attach(controls_pool, src_arrow->GetPortIndex(JEventLevel::SlowControls, JMultilevelSourceArrow::Direction::Out));
0061
0062 JEventTapArrow* tap_arrow = new JEventTapArrow("DeinterleavedTap");
0063 for (auto proc : builder.m_components->get_evt_procs()) {
0064 tap_arrow->add_processor(proc);
0065 }
0066
0067 builder.connect(src_arrow, src_arrow->GetPortIndex(JEventLevel::PhysicsEvent, JMultilevelSourceArrow::Direction::Out),
0068 tap_arrow, tap_arrow->EVENT_IN);
0069
0070 builder.queues.at(0)->Scale(4);
0071
0072 tap_arrow->attach(physics_pool, tap_arrow->EVENT_OUT);
0073
0074 builder.arrows.push_back(src_arrow);
0075 builder.arrows.push_back(tap_arrow);
0076 }
0077
0078
0079 TEST_CASE("MultilevelSourceCustomTopology") {
0080
0081 JApplication app;
0082 app.SetParameterValue("jana:loglevel", "trace");
0083 app.SetParameterValue("jana:nevents", 10);
0084 app.Add(new MyMultiSource);
0085 app.Add(new DeinterleavedProc);
0086 auto builder = app.GetService<JTopologyBuilder>();
0087 builder->set_configure_fn(configure_multisource_topology);
0088 app.Run();
0089 }
0090
0091