2 #include "art/Framework/Services/Registry/ServiceHandle.h"
3 #include "artdaq/ArtModules/ArtdaqOutput.hh"
4 #include "artdaq/ArtModules/ArtdaqSharedMemoryService.h"
5 #include "artdaq/DAQdata/Globals.hh"
6 #include "artdaq/DAQdata/NetMonHeader.hh"
7 #include "artdaq/DAQrate/DataSenderManager.hh"
10 #define TRACE_NAME (app_name + "_RootNetOutput").c_str()
12 #define DUMP_SEND_MESSAGE 0
63 virtual void SendMessage(artdaq::Fragment::sequence_id_t sequence_id, artdaq::Fragment::type_t messageType, TBufferFile& msg);
68 void sendMessage(uint64_t sequenceId, uint8_t messageType, TBufferFile& msg);
70 std::unique_ptr<artdaq::DataSenderManager> sender_ptr_;
71 fhicl::ParameterSet data_pset_;
72 double init_timeout_s_;
77 , sender_ptr_(nullptr)
80 TLOG(TLVL_DEBUG) <<
"Begin: RootNetOutput::RootNetOutput(ParameterSet const& ps)";
82 art::ServiceHandle<ArtdaqSharedMemoryService> shm;
83 init_timeout_s_ = ps.get<
double>(
"init_fragment_timeout_seconds", 1.0);
85 TLOG(TLVL_DEBUG) <<
"End: RootNetOutput::RootNetOutput(ParameterSet const& ps)";
90 TLOG(TLVL_DEBUG) <<
"Begin: RootNetOutput::~RootNetOutput()";
92 TLOG(TLVL_DEBUG) <<
"End: RootNetOutput::~RootNetOutput()";
101 TLOG(TLVL_WRITE) <<
"RootNetOutput::SendMessage Sending a message with type code "
102 << artdaq::detail::RawFragmentHeader::SystemTypeToString(messageType);
103 sendMessage(sequence_id, messageType, msg);
104 TLOG(TLVL_WRITE) <<
"RootNetOutput::SendMessage: Message sent.";
108 void art::RootNetOutput::connect()
110 auto start_time = std::chrono::steady_clock::now();
112 char const* artapp_env = getenv(
"ARTDAQ_RANK");
113 if (artapp_env != NULL && my_rank < 0)
114 my_rank = std::atoi(artapp_env);
116 while (my_rank == -1 && artdaq::TimeUtils::GetElapsedTime(start_time) < init_timeout_s_)
123 void art::RootNetOutput::disconnect()
125 if (sender_ptr_) sender_ptr_.reset(
nullptr);
128 void art::RootNetOutput::sendMessage(uint64_t sequenceId, uint8_t messageType, TBufferFile& msg)
130 if (sender_ptr_ ==
nullptr)
132 TLOG(TLVL_DEBUG) <<
"Reconnecting DataSenderManager";
136 #if DUMP_SEND_MESSAGE
137 std::string fileName =
"sendMessage_" + std::to_string(my_rank) +
"_" + std::to_string(getpid()) +
"_" +
138 std::to_string(sequenceId) +
".bin";
139 std::fstream ostream(fileName, std::ios::out | std::ios::binary);
140 ostream.write(msg.Buffer(), msg.Length());
144 TLOG(TLVL_DEBUG) <<
"Sending message with sequenceID=" << sequenceId <<
", type=" << (int)messageType
145 <<
", length=" << msg.Length();
147 header.
data_length =
static_cast<uint64_t
>(msg.Length());
148 artdaq::Fragment fragment(std::ceil(msg.Length() /
static_cast<double>(
sizeof(artdaq::RawDataType))), sequenceId, 0,
149 messageType, header);
151 memcpy(&*fragment.dataBegin(), msg.Buffer(), msg.Length());
152 sender_ptr_->sendFragment(std::move(fragment));
154 sender_ptr_->RemoveRoutingTableEntry(sequenceId);
fhicl::TableFragment< artdaq::DataSenderManager::Config > dataSenderConfig
Configuration for DataSenderManager. See artdaq::DataSenderManager::Config.
Sends Fragment objects using TransferInterface plugins. Uses Routing Tables if confgiured, otherwise will Round-Robin Fragments to the destinations.
This is the base class for artdaq OutputModules, providing the serialization interface for art Events...
virtual void SendMessage(artdaq::Fragment::sequence_id_t sequence_id, artdaq::Fragment::type_t messageType, TBufferFile &msg)
Send a message using DataSenderManager
~RootNetOutput()
RootNetOutput Destructor.
Allowed Configuration parameters of NetMonTransportService. May be used for configuration validation ...
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.
fhicl::WrappedTable< Config > Parameters
Used for ParameterSet validation (if desired)