1 #include "art/Framework/Core/ModuleMacros.h"
2 #include "art/Framework/Core/OutputModule.h"
3 #include "art/Framework/Principal/EventPrincipal.h"
4 #include "art/Framework/Principal/RunPrincipal.h"
5 #include "art/Framework/Principal/SubRunPrincipal.h"
6 #include "art/Framework/Principal/Handle.h"
7 #include "art/Persistency/Common/GroupQueryResult.h"
8 #include "canvas/Utilities/DebugMacros.h"
9 #include "canvas/Utilities/Exception.h"
10 #include "fhiclcpp/ParameterSet.h"
12 #include "artdaq/DAQrate/DataSenderManager.hh"
13 #include "artdaq/DAQdata/Globals.hh"
14 #include "artdaq-core/Data/Fragment.hh"
16 #define TRACE_NAME "BinaryMPIOutput"
32 using fhicl::ParameterSet;
62 void beginJob()
override;
64 void endJob()
override;
66 void write(EventPrincipal&)
override;
68 void writeRun(RunPrincipal&)
override {};
69 void writeSubRun(SubRunPrincipal&)
override {};
71 void initialize_MPI_();
73 void deinitialize_MPI_();
75 bool readParameterSet_(fhicl::ParameterSet
const& pset);
78 ParameterSet data_pset_;
79 std::string name_ =
"BinaryMPIOutput";
81 std::unique_ptr<artdaq::DataSenderManager> sender_ptr_ = {
nullptr};
88 FDEBUG(1) <<
"Begin: BinaryMPIOutput::BinaryMPIOutput(ParameterSet const& ps)\n";
89 readParameterSet_(ps);
90 FDEBUG(1) <<
"End: BinaryMPIOutput::BinaryMPIOutput(ParameterSet const& ps)\n";
96 FDEBUG(1) <<
"Begin/End: BinaryMPIOutput::~BinaryMPIOutput()\n";
100 art::BinaryMPIOutput::
103 FDEBUG(1) <<
"Begin: BinaryMPIOutput::beginJob()\n";
105 FDEBUG(1) <<
"End: BinaryMPIOutput::beginJob()\n";
109 art::BinaryMPIOutput::
112 FDEBUG(1) <<
"Begin: BinaryMPIOutput::endJob()\n";
114 FDEBUG(1) <<
"End: BinaryMPIOutput::endJob()\n";
119 art::BinaryMPIOutput::
122 if (rt_priority_ > 0)
124 #pragma GCC diagnostic push
125 #pragma GCC diagnostic ignored "-Wmissing-field-initializers"
126 sched_param s_param = {};
127 s_param.sched_priority = rt_priority_;
128 int status = pthread_setschedparam(pthread_self(), SCHED_RR, &s_param);
132 <<
"Failed to set realtime priority to " << rt_priority_
133 <<
", return code = " << status << TLOG_ENDL;
135 #pragma GCC diagnostic pop
138 sender_ptr_ = std::make_unique<artdaq::DataSenderManager>(data_pset_);
143 art::BinaryMPIOutput::
146 sender_ptr_.reset(
nullptr);
150 art::BinaryMPIOutput::
151 readParameterSet_(fhicl::ParameterSet
const& pset)
153 TLOG_DEBUG(name_) <<
"BinaryMPIOutput::readParameterSet_ method called with "
154 <<
"ParameterSet = \"" << pset.to_string()
155 <<
"\"." << TLOG_ENDL;
159 name_ = pset.get<std::string>(
"module_name",
"BinaryMPIOutput");
160 rt_priority_ = pset.get<
int>(
"rt_priority", 0);
162 TRACE(4,
"BinaryMPIOutput::readParameterSet()");
168 art::BinaryMPIOutput::
169 write(EventPrincipal& ep)
173 using RawEvent = artdaq::Fragments;;
174 using RawEvents = std::vector<RawEvent>;
175 using RawEventHandle = art::Handle<RawEvent>;
176 using RawEventHandles = std::vector<RawEventHandle>;
178 auto result_handles = std::vector<art::GroupQueryResult>();
179 ep.getManyByType(art::TypeID(
typeid(RawEvent)), result_handles);
181 for (
auto const& result_handle : result_handles)
183 auto const raw_event_handle = RawEventHandle(result_handle);
185 if (!raw_event_handle.isValid())
188 for (
auto const& fragment : *raw_event_handle)
190 auto fragment_copy = fragment;
191 auto fragid_id = fragment_copy.fragmentID();
192 auto sequence_id = fragment_copy.sequenceID();
193 TRACE(1,
"BinaryMPIOutput::write seq=%lu frag=%i start", sequence_id, fragid_id);
194 sender_ptr_->sendFragment(std::move(fragment_copy));
195 TRACE(2,
"BinaryMPIOutput::write seq=%lu frag=%i done", sequence_id, fragid_id);
An art::OutputModule which sends Fragments using DataSenderManager. This module produces output ident...
virtual ~BinaryMPIOutput()
BinaryMPIOutput Destructor.
BinaryMPIOutput(ParameterSet const &ps)
BinaryMPIOutput Constructor.