artdaq  v3_10_01
BinaryNetOutput_module.cc
1 #define TRACE_NAME "BinaryNetOutput"
2 #include "artdaq/DAQdata/Globals.hh"
3 
4 #include "art/Framework/Core/ModuleMacros.h"
5 #include "art/Framework/Core/OutputModule.h"
6 #include "art/Framework/Principal/EventPrincipal.h"
7 #include "art/Framework/Principal/Handle.h"
8 #include "art/Framework/Principal/RunPrincipal.h"
9 #include "art/Framework/Principal/Selector.h"
10 #include "art/Framework/Principal/SubRunPrincipal.h"
11 #include "art/Persistency/Common/GroupQueryResult.h"
12 #include "canvas/Persistency/Common/Wrapper.h"
13 #include "canvas/Utilities/DebugMacros.h"
14 #include "canvas/Utilities/Exception.h"
15 #if ART_HEX_VERSION < 0x30901
16 #include "canvas/Utilities/WrappedTypeID.h"
17 #endif
18 #include "fhiclcpp/ParameterSet.h"
19 
20 #include "artdaq-core/Data/Fragment.hh"
21 #include "artdaq/DAQrate/DataSenderManager.hh"
22 
23 #include <unistd.h>
24 #include <iomanip>
25 #include <iostream>
26 #include <memory>
27 #include <sstream>
28 #include <string>
29 #include <vector>
30 
31 namespace art {
32 class BinaryNetOutput;
33 }
34 
36 using fhicl::ParameterSet;
37 
43 class art::BinaryNetOutput final : public OutputModule
44 {
45 public:
58  explicit BinaryNetOutput(ParameterSet const& ps);
59 
63  ~BinaryNetOutput() override;
64 
65 private:
66  BinaryNetOutput(BinaryNetOutput const&) = delete;
67  BinaryNetOutput(BinaryNetOutput&&) = delete;
68  BinaryNetOutput& operator=(BinaryNetOutput const&) = delete;
69  BinaryNetOutput& operator=(BinaryNetOutput&&) = delete;
70 
71  void beginJob() override;
72 
73  void endJob() override;
74 
75  void write(EventPrincipal& /*ep*/) override;
76 
77  void writeRun(RunPrincipal& /*r*/) override{};
78  void writeSubRun(SubRunPrincipal& /*sr*/) override{};
79 
80  void initialize_MPI_();
81 
82  void deinitialize_MPI_();
83 
84  bool readParameterSet_(fhicl::ParameterSet const& pset);
85 
86 private:
87  ParameterSet data_pset_;
88  std::string name_ = "BinaryNetOutput";
89  int rt_priority_ = 0;
90  std::unique_ptr<artdaq::DataSenderManager> sender_ptr_ = {nullptr};
91 };
92 
94  : OutputModule(ps)
95 {
96  TLOG(TLVL_DEBUG) << "Begin: BinaryNetOutput::BinaryNetOutput(ParameterSet const& ps)\n";
97  readParameterSet_(ps);
98  TLOG(TLVL_DEBUG) << "End: BinaryNetOutput::BinaryNetOutput(ParameterSet const& ps)\n";
99 }
100 
101 art::BinaryNetOutput::~BinaryNetOutput() { TLOG(TLVL_DEBUG) << "Begin/End: BinaryNetOutput::~BinaryNetOutput()\n"; }
102 
103 void art::BinaryNetOutput::beginJob()
104 {
105  TLOG(TLVL_DEBUG) << "Begin: BinaryNetOutput::beginJob()\n";
106  initialize_MPI_();
107  TLOG(TLVL_DEBUG) << "End: BinaryNetOutput::beginJob()\n";
108 }
109 
110 void art::BinaryNetOutput::endJob()
111 {
112  TLOG(TLVL_DEBUG) << "Begin: BinaryNetOutput::endJob()\n";
113  deinitialize_MPI_();
114  TLOG(TLVL_DEBUG) << "End: BinaryNetOutput::endJob()\n";
115 }
116 
117 void art::BinaryNetOutput::initialize_MPI_()
118 {
119  if (rt_priority_ > 0)
120  {
121 #pragma GCC diagnostic push
122 #pragma GCC diagnostic ignored "-Wmissing-field-initializers"
123  sched_param s_param = {};
124  s_param.sched_priority = rt_priority_;
125  int status = pthread_setschedparam(pthread_self(), SCHED_RR, &s_param);
126  if (status != 0)
127  {
128  TLOG(TLVL_ERROR) << name_ << "Failed to set realtime priority to " << rt_priority_
129  << ", return code = " << status;
130  }
131 #pragma GCC diagnostic pop
132  }
133 
134  sender_ptr_ = std::make_unique<artdaq::DataSenderManager>(data_pset_);
135  assert(sender_ptr_);
136 }
137 
138 void art::BinaryNetOutput::deinitialize_MPI_() { sender_ptr_.reset(nullptr); }
139 
140 bool art::BinaryNetOutput::readParameterSet_(fhicl::ParameterSet const& pset)
141 {
142  TLOG(TLVL_DEBUG) << name_ << "BinaryNetOutput::readParameterSet_ method called with "
143  << "ParameterSet = \"" << pset.to_string() << "\".";
144 
145  // determine the data sending parameters
146  data_pset_ = pset;
147  name_ = pset.get<std::string>("module_name", "BinaryNetOutput");
148  rt_priority_ = pset.get<int>("rt_priority", 0);
149 
150  TLOG(TLVL_TRACE) << "BinaryNetOutput::readParameterSet()";
151 
152  return true;
153 }
154 
155 void art::BinaryNetOutput::write(EventPrincipal& ep)
156 {
157  assert(sender_ptr_);
158 
159  using RawEvent = artdaq::Fragments;
160  ;
161  using RawEvents = std::vector<RawEvent>;
162  using RawEventHandle = art::Handle<RawEvent>;
163  using RawEventHandles = std::vector<RawEventHandle>;
164 
165  auto result_handles = std::vector<art::GroupQueryResult>();
166 
167  auto const& wrapped = art::WrappedTypeID::make<RawEvent>();
168 
169  ModuleContext const mc{moduleDescription()};
170  ProcessTag const processTag{"", mc.moduleDescription().processName()};
171 
172  result_handles = ep.getMany(mc, wrapped, art::MatchAllSelector{}, processTag);
173 
174  artdaq::Fragment::sequence_id_t sequence_id = 0;
175 
176  for (auto const& result_handle : result_handles)
177  {
178  auto const raw_event_handle = RawEventHandle(result_handle);
179 
180  if (!raw_event_handle.isValid())
181  {
182  continue;
183  }
184 
185  for (auto const& fragment : *raw_event_handle)
186  {
187  auto fragment_copy = fragment;
188  auto fragid_id = fragment_copy.fragmentID();
189  sequence_id = fragment_copy.sequenceID();
190  TLOG(TLVL_DEBUG) << "BinaryNetOutput::write seq=" << sequence_id << " frag=" << fragid_id << " start";
191  sender_ptr_->sendFragment(std::move(fragment_copy));
192  TLOG(TLVL_DEBUG) << "BinaryNetOutput::write seq=" << sequence_id << " frag=" << fragid_id << " done";
193  }
194  }
195 
196  // Events are unique in art, so this will be the only send with this sequence ID!
197  // ELF 1/23/2020: Only remove routing entry AFTER all Fragments have been sent!
198  sender_ptr_->RemoveRoutingTableEntry(sequence_id);
199 }
200 
201 DEFINE_ART_MODULE(art::BinaryNetOutput) // NOLINT(performance-unnecessary-value-param)
BinaryNetOutput(ParameterSet const &ps)
BinaryNetOutput Constructor.
An art::OutputModule which sends Fragments using DataSenderManager. This module produces output ident...
~BinaryNetOutput() override
BinaryNetOutput Destructor.