4 #include "art/Framework/Services/Registry/ServiceHandle.h"
5 #include "artdaq/ArtModules/ArtdaqOutput.hh"
6 #include "artdaq/ArtModules/ArtdaqSharedMemoryService.h"
7 #include "artdaq/DAQdata/Globals.hh"
8 #include "artdaq/DAQdata/NetMonHeader.hh"
9 #include "artdaq/DAQrate/DataSenderManager.hh"
12 #define TRACE_NAME (app_name + "_RootNetOutput").c_str()
14 #define DUMP_SEND_MESSAGE 0
53 void SendMessage(artdaq::FragmentPtr& fragment)
override;
64 std::unique_ptr<artdaq::DataSenderManager> sender_ptr_;
65 fhicl::ParameterSet data_pset_;
66 double init_timeout_s_;
71 , sender_ptr_(nullptr)
74 TLOG(TLVL_DEBUG) <<
"Begin: RootNetOutput::RootNetOutput(ParameterSet const& ps)";
76 art::ServiceHandle<ArtdaqSharedMemoryServiceInterface> shm;
77 init_timeout_s_ = ps.get<
double>(
"init_fragment_timeout_seconds", 1.0);
79 TLOG(TLVL_DEBUG) <<
"End: RootNetOutput::RootNetOutput(ParameterSet const& ps)";
84 TLOG(TLVL_DEBUG) <<
"Begin: RootNetOutput::~RootNetOutput()";
86 TLOG(TLVL_DEBUG) <<
"End: RootNetOutput::~RootNetOutput()";
95 TLOG(TLVL_WRITE) <<
"RootNetOutput::SendMessage Sending a message with type code "
96 << artdaq::detail::RawFragmentHeader::SystemTypeToString(fragment->type());
97 if (sender_ptr_ ==
nullptr)
99 TLOG(TLVL_DEBUG) <<
"Reconnecting DataSenderManager";
103 #if DUMP_SEND_MESSAGE
104 std::string fileName =
"sendMessage_" + std::to_string(my_rank) +
"_" + std::to_string(getpid()) +
"_" +
105 std::to_string(sequenceId) +
".bin";
106 std::fstream ostream(fileName, std::ios::out | std::ios::binary);
107 ostream.write(msg.Buffer(), msg.Length());
111 auto sequenceId = fragment->sequenceID();
112 TLOG(TLVL_DEBUG) <<
"Sending message with sequenceID=" << sequenceId <<
", type=" << fragment->type()
113 <<
", length=" << fragment->dataSizeBytes();
115 sender_ptr_->sendFragment(std::move(*fragment));
117 sender_ptr_->RemoveRoutingTableEntry(sequenceId);
118 TLOG(TLVL_WRITE) <<
"RootNetOutput::SendMessage: Message sent.";
122 void art::RootNetOutput::connect()
124 auto start_time = std::chrono::steady_clock::now();
126 char const* artapp_env = getenv(
"ARTDAQ_RANK");
127 if (artapp_env !=
nullptr && my_rank < 0)
129 my_rank = strtol(artapp_env,
nullptr, 10);
132 while (my_rank == -1 && artdaq::TimeUtils::GetElapsedTime(start_time) < init_timeout_s_)
136 sender_ptr_ = std::make_unique<artdaq::DataSenderManager>(data_pset_);
139 void art::RootNetOutput::disconnect()
143 sender_ptr_.reset(
nullptr);
This is the base class for artdaq OutputModules, providing the serialization interface for art Events...
size_t dataReceiverCount() const
Get the number of data receivers.
An art::OutputModule which sends events using DataSenderManager. This module is designed for transpor...
RootNetOutput(fhicl::ParameterSet const &ps)
RootNetOutput Constructor.
~RootNetOutput() override
RootNetOutput Destructor.
void SendMessage(artdaq::FragmentPtr &fragment) override
Send a message using DataSenderManager