artdaq  v2_03_02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Pages
NetMonTransportService_service.cc
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"
5 
6 #include "artdaq-core/Data/Fragment.hh"
7 #include "artdaq/DAQdata/NetMonHeader.hh"
8 #include "artdaq-core/Data/RawEvent.hh"
9 
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"
16 
17 #include <TClass.h>
18 #include <TBufferFile.h>
19 
20 #include <iomanip>
21 #include <iostream>
22 #include <string>
23 #include <vector>
24 
25 using namespace cet;
26 using namespace fhicl;
27 using namespace std;
28 
29 static ParameterSet empty_pset;
30 
33 {
35 }
36 
38 NetMonTransportService(ParameterSet const& pset, art::ActivityRegistry&)
40  , data_pset_(pset)
41  , sender_ptr_(nullptr)
42  , incoming_events_(artdaq::getGlobalQueue())
43  , recvd_fragments_(nullptr)
44 {
45  if(pset.has_key("rank")) my_rank = pset.get<int>("rank");
46  incoming_events_.setReaderIsReady();
47 }
48 
49 void
52 {
53  sender_ptr_.reset(new artdaq::DataSenderManager(data_pset_));
54 }
55 
56 void
59 {
60  return;
61 }
62 
63 void
66 {
67  if (sender_ptr_) sender_ptr_.reset(nullptr);
68 }
69 
70 void
72 sendMessage(uint64_t sequenceId, uint8_t messageType, TBufferFile& msg)
73 {
74  if (sender_ptr_ == nullptr)
75  {
76  TLOG_DEBUG("NetMonTransportService") << "Reconnecting DataSenderManager" << TLOG_ENDL;
77  connect();
78  }
79 
80  TLOG_DEBUG("NetMonTransportService") << "Sending message" << TLOG_ENDL;
81  artdaq::NetMonHeader header;
82  header.data_length = static_cast<uint64_t>(msg.Length());
83  artdaq::Fragment
84  fragment(std::ceil(msg.Length() /
85  static_cast<double>(sizeof(artdaq::RawDataType))),
86  sequenceId, 0, messageType, header);
87 
88  memcpy(&*fragment.dataBegin(), msg.Buffer(), msg.Length());
89  sender_ptr_->sendFragment(std::move(fragment));
90 }
91 
92 void
94 receiveMessage(TBufferFile*& msg)
95 {
96  if (recvd_fragments_ == nullptr)
97  {
98  std::shared_ptr<artdaq::RawEvent> popped_event;
99  incoming_events_.deqWait(popped_event);
100 
101  if (popped_event == nullptr)
102  {
103  msg = nullptr;
104  return;
105  }
106 
107  recvd_fragments_ = popped_event->releaseProduct();
108  /* Events coming out of the EventStore are not sorted but need to be
109  sorted by sequence ID before they can be passed to art.
110  */
111  std::sort(recvd_fragments_->begin(), recvd_fragments_->end(),
112  artdaq::fragmentSequenceIDCompare);
113  }
114 
115  artdaq::Fragment topFrag = std::move(recvd_fragments_->at(0));
116  recvd_fragments_->erase(recvd_fragments_->begin());
117  if (recvd_fragments_->size() == 0)
118  {
119  recvd_fragments_.reset(nullptr);
120  }
121 
122  auto header = topFrag.metadata<artdaq::NetMonHeader>();
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);
126 }
127 
128 DEFINE_ART_SERVICE_INTERFACE_IMPL(NetMonTransportService, NetMonTransportServiceInterface)
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.
Header with length information for NetMonTransport messages.
Definition: NetMonHeader.hh:14
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.
uint64_t data_length
The length of the message.
Definition: NetMonHeader.hh:16
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.