1 #define TRACE_NAME "NetMonWrapper"
3 #include "artdaq/ArtModules/NetMonWrapper.hh"
4 #include "art/Framework/Services/Registry/ServiceHandle.h"
5 #include "artdaq/ArtModules/ArtdaqSharedMemoryService.h"
6 #include "artdaq/DAQdata/NetMonHeader.hh"
10 init_timeout_s_ = ps.get<
double>(
"init_fragment_timeout_seconds", 1.0);
12 art::ServiceHandle<ArtdaqSharedMemoryService> shm;
17 TLOG(5) <<
"Receiving Fragment from NetMonTransportService";
18 TLOG(TLVL_TRACE) <<
"receiveMessage BEGIN";
19 art::ServiceHandle<ArtdaqSharedMemoryService> shm;
22 auto start = std::chrono::steady_clock::now();
23 while (!init_received_ && artdaq::TimeUtils::GetElapsedTime(start) < init_timeout_s_)
25 usleep(init_timeout_s_ * 1000000 / 100);
29 TLOG(TLVL_ERROR) <<
"Did not receive Init Fragment after " << init_timeout_s_ <<
" seconds. Art will crash.";
33 artdaq::Fragments recvd_fragments;
34 while (recvd_fragments.size() == 0)
36 auto eventMap = shm->ReceiveEvent(
false);
38 if (eventMap.size() == 0)
40 TLOG(TLVL_DEBUG) <<
"Did not receive event after timeout, returning from receiveMessage ";
44 if (eventMap.count(artdaq::Fragment::type_t(artdaq::Fragment::EndOfDataFragmentType)))
46 TLOG(TLVL_DEBUG) <<
"Received shutdown message, returning";
49 if (eventMap.count(artdaq::Fragment::type_t(artdaq::Fragment::DataFragmentType)))
51 std::move(eventMap[artdaq::Fragment::type_t(artdaq::Fragment::DataFragmentType)]->begin(), eventMap[artdaq::Fragment::type_t(artdaq::Fragment::DataFragmentType)]->end(), std::back_inserter(recvd_fragments));
53 std::sort(recvd_fragments.begin(), recvd_fragments.end(), artdaq::fragmentSequenceIDCompare);
56 TLOG(TLVL_TRACE) <<
"receiveMessage: Returning top Fragment";
57 artdaq::FragmentPtr topFrag = artdaq::FragmentPtr(
new artdaq::Fragment(std::move(recvd_fragments.at(0))));
58 recvd_fragments.erase(recvd_fragments.begin());
60 TLOG(TLVL_TRACE) <<
"receiveMessage: Returning Fragment, length="
63 #if DUMP_RECEIVE_MESSAGE
64 std::string fileName =
"receiveMessage_" + std::to_string(my_rank) +
"_" + std::to_string(getpid()) +
"_" +
65 std::to_string(topFrag.sequenceID()) +
".bin";
66 std::fstream ostream(fileName.c_str(), std::ios::out | std::ios::binary);
67 ostream.write(buffer, header->data_length);
71 TLOG(TLVL_TRACE) <<
"receiveMessage END";
73 TLOG(5) <<
"Done Receiving Fragment from NetMonTransportService";
79 TLOG(5) <<
"Receiving Init Fragment from NetMonTransportService";
81 TLOG(TLVL_TRACE) <<
"receiveInitMessage BEGIN";
82 art::ServiceHandle<ArtdaqSharedMemoryService> shm;
83 std::unordered_map<artdaq::Fragment::type_t, std::unique_ptr<artdaq::Fragments>> eventMap;
84 while (eventMap.size() == 0)
86 eventMap = shm->ReceiveEvent(
true);
88 if (eventMap.count(artdaq::Fragment::type_t(artdaq::Fragment::EndOfDataFragmentType)))
90 TLOG(TLVL_DEBUG) <<
"Received shutdown message, returning";
93 else if (!eventMap.count(artdaq::Fragment::type_t(artdaq::Fragment::InitFragmentType)) && eventMap.size() > 0)
95 TLOG(TLVL_WARNING) <<
"Did NOT receive Init Fragment as first broadcast! Type="
96 << artdaq::detail::RawFragmentHeader::SystemTypeToString(eventMap.begin()->first);
107 TLOG(TLVL_TRACE) <<
"receiveInitMessage: Returning top Fragment";
108 artdaq::FragmentPtr topFrag = artdaq::FragmentPtr(
new artdaq::Fragment(std::move(eventMap[artdaq::Fragment::InitFragmentType]->at(0))));
110 #if DUMP_RECEIVE_MESSAGE
111 std::string fileName =
"receiveInitMessage_" + std::to_string(getpid()) +
".bin";
112 std::fstream ostream(fileName.c_str(), std::ios::out | std::ios::binary);
113 ostream.write(buffer, header->data_length);
117 TLOG(TLVL_TRACE) <<
"receiveInitMessage END";
118 init_received_ =
true;
120 TLOG(5) <<
"Done Receiving Init Fragment from NetMonTransportService";
artdaq::FragmentPtr receiveInitMessage()
Receive an init message from the NetMonTransportService.
NetMonWrapper(fhicl::ParameterSet const &ps)
NetMonWrapper Constructor.
artdaq::FragmentPtr receiveMessage()
Receive a message from the NetMonTransportService.