Back to home page

EIC code displayed by LXR

 
 

    


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; // Assume that source can peek ahead to request a different level
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); // Queue capacity = N(PhysicsEvent)
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