1 #include "artdaq/DAQdata/Globals.hh"
2 #include "artdaq/ArtModules/NetMonTransportService.h"
3 #include "artdaq/DAQrate/DataSenderManager.hh"
4 #include "artdaq-core/Core/GlobalQueue.hh"
6 #include "artdaq-core/Data/Fragment.hh"
7 #include "artdaq/DAQdata/NetMonHeader.hh"
8 #include "artdaq-core/Data/RawEvent.hh"
10 #include "art/Framework/Services/Registry/ActivityRegistry.h"
11 #include "canvas/Utilities/Exception.h"
12 #include "cetlib/container_algorithms.h"
13 #include "cetlib/exception.h"
14 #include "fhiclcpp/ParameterSet.h"
15 #include "fhiclcpp/ParameterSetRegistry.h"
18 #include <TBufferFile.h>
26 using namespace fhicl;
29 static ParameterSet empty_pset;
41 , sender_ptr_(nullptr)
42 , incoming_events_(artdaq::getGlobalQueue())
43 , recvd_fragments_(nullptr)
45 if(pset.has_key(
"rank")) my_rank = pset.get<
int>(
"rank");
46 incoming_events_.setReaderIsReady();
67 if (sender_ptr_) sender_ptr_.reset(
nullptr);
72 sendMessage(uint64_t sequenceId, uint8_t messageType, TBufferFile& msg)
74 if (sender_ptr_ ==
nullptr)
76 TLOG_DEBUG(
"NetMonTransportService") <<
"Reconnecting DataSenderManager" << TLOG_ENDL;
80 TLOG_DEBUG(
"NetMonTransportService") <<
"Sending message" << TLOG_ENDL;
82 header.
data_length =
static_cast<uint64_t
>(msg.Length());
84 fragment(std::ceil(msg.Length() /
85 static_cast<double>(
sizeof(artdaq::RawDataType))),
86 sequenceId, 0, messageType, header);
88 memcpy(&*fragment.dataBegin(), msg.Buffer(), msg.Length());
89 sender_ptr_->sendFragment(std::move(fragment));
96 if (recvd_fragments_ ==
nullptr)
98 std::shared_ptr<artdaq::RawEvent> popped_event;
99 incoming_events_.deqWait(popped_event);
101 if (popped_event ==
nullptr)
107 recvd_fragments_ = popped_event->releaseProduct();
111 std::sort(recvd_fragments_->begin(), recvd_fragments_->end(),
112 artdaq::fragmentSequenceIDCompare);
115 artdaq::Fragment topFrag = std::move(recvd_fragments_->at(0));
116 recvd_fragments_->erase(recvd_fragments_->begin());
117 if (recvd_fragments_->size() == 0)
119 recvd_fragments_.reset(
nullptr);
123 auto buffer =
static_cast<char *
>(malloc(header->data_length));
124 memcpy(buffer, &*topFrag.dataBegin(), header->
data_length);
125 msg =
new TBufferFile(TBuffer::kRead, header->data_length, buffer, kTRUE, 0);
Sends Fragment objects using TransferInterface plugins. Uses Routing Tables if confgiured, otherwise will Round-Robin Fragments to the destinations.
void sendMessage(uint64_t sequenceId, uint8_t messageType, TBufferFile &msg) override
Send ROOT data, wrapped in an artdaq::Fragment object.
NetMonTransportService extends NetMonTransportServiceInterface. It sends events using DataSenderManag...
void receiveMessage(TBufferFile *&msg) override
Receive data from the ConcurrentQueue.
void connect() override
Reconnect the NetMonTransportService.
virtual ~NetMonTransportService()
NetMonTransportService Destructor. Calls disconnect().
NetMonTransportService(fhicl::ParameterSet const &pset, art::ActivityRegistry &)
NetMonTransportService Constructor.
void disconnect() override
Disconnects the NetMonTranportService.
Interface for NetMonTranportService. This interface is declared to art as part of the required regist...
void listen() override
Listen for connections. This method is a No-Op.