1 #include "TRACE/tracemf.h"
3 #include "artdaq/ArtModules/ArtdaqOutput.hh"
4 #include "artdaq/ArtModules/ArtdaqSharedMemoryServiceInterface.h"
5 #include "artdaq/DAQdata/Globals.hh"
6 #include "artdaq/DAQrate/DataSenderManager.hh"
8 #include "art/Framework/Core/ModuleMacros.h"
9 #include "art/Framework/Services/Registry/ServiceHandle.h"
10 #include "fhiclcpp/ParameterSet.h"
15 #define TRACE_NAME (app_name + "_RootNetOutput").c_str()
17 #define DUMP_SEND_MESSAGE 0
56 void SendMessage(artdaq::FragmentPtr& fragment)
override;
67 std::unique_ptr<artdaq::DataSenderManager> sender_ptr_;
68 fhicl::ParameterSet data_pset_;
69 double init_timeout_s_;
74 , sender_ptr_(nullptr)
77 TLOG(TLVL_DEBUG + 32) <<
"Begin: RootNetOutput::RootNetOutput(ParameterSet const& ps)";
79 art::ServiceHandle<ArtdaqSharedMemoryServiceInterface> shm;
80 init_timeout_s_ = ps.get<
double>(
"init_fragment_timeout_seconds", 1.0);
82 TLOG(TLVL_DEBUG + 32) <<
"End: RootNetOutput::RootNetOutput(ParameterSet const& ps)";
87 TLOG(TLVL_DEBUG + 32) <<
"Begin: RootNetOutput::~RootNetOutput()";
89 TLOG(TLVL_DEBUG + 32) <<
"End: RootNetOutput::~RootNetOutput()";
98 TLOG(TLVL_WRITE) <<
"RootNetOutput::SendMessage Sending a message with type code "
99 << artdaq::detail::RawFragmentHeader::SystemTypeToString(fragment->type());
100 if (sender_ptr_ ==
nullptr)
102 TLOG(TLVL_DEBUG + 32) <<
"Reconnecting DataSenderManager";
106 #if DUMP_SEND_MESSAGE
107 std::string fileName =
"sendMessage_" + std::to_string(my_rank) +
"_" + std::to_string(getpid()) +
"_" +
108 std::to_string(sequenceId) +
".bin";
109 std::fstream ostream(fileName, std::ios::out | std::ios::binary);
110 ostream.write(msg.Buffer(), msg.Length());
114 auto sequenceId = fragment->sequenceID();
115 TLOG(TLVL_DEBUG + 32) <<
"Sending message with sequenceID=" << sequenceId <<
", type=" <<
static_cast<int>(fragment->type())
116 <<
", length=" << fragment->dataSizeBytes();
118 sender_ptr_->sendFragment(std::move(*fragment));
120 sender_ptr_->RemoveRoutingTableEntry(sequenceId);
121 TLOG(TLVL_WRITE) <<
"RootNetOutput::SendMessage: Message sent.";
125 void art::RootNetOutput::connect()
127 auto start_time = std::chrono::steady_clock::now();
129 char const* artapp_env = getenv(
"ARTDAQ_RANK");
130 if (artapp_env !=
nullptr && my_rank < 0)
132 my_rank = strtol(artapp_env,
nullptr, 10);
135 while (my_rank == -1 && artdaq::TimeUtils::GetElapsedTime(start_time) < init_timeout_s_)
139 sender_ptr_ = std::make_unique<artdaq::DataSenderManager>(data_pset_);
142 void art::RootNetOutput::disconnect()
146 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