artdaq  v3_07_01
TransferOutput_module.cc
1 #define TRACE_NAME "TransferOutput"
2 #include "artdaq/ArtModules/ArtdaqOutput.hh"
3 
4 #include "artdaq/DAQdata/NetMonHeader.hh"
5 #include "artdaq/TransferPlugins/MakeTransferPlugin.hh"
6 #include "artdaq/TransferPlugins/TransferInterface.hh"
7 
8 namespace art {
9 class TransferOutput;
10 }
11 
18 {
19 public:
27  explicit TransferOutput(fhicl::ParameterSet const& ps);
28 
33 
34 protected:
41  virtual void SendMessage(artdaq::Fragment::sequence_id_t sequenceId, artdaq::Fragment::type_t messageType, TBufferFile& msg);
42 
43 private:
44  size_t send_timeout_us_;
45  size_t send_retry_count_;
46  std::unique_ptr<artdaq::TransferInterface> transfer_;
47 };
48 
49 art::TransferOutput::TransferOutput(fhicl::ParameterSet const& ps)
50  : ArtdaqOutput(ps), send_timeout_us_(ps.get<size_t>("send_timeout_us", 5000000)), send_retry_count_(ps.get<size_t>("send_retry_count", 5))
51 {
52  TLOG(TLVL_DEBUG) << "Begin: TransferOutput::TransferOutput(ParameterSet const& ps)";
53  transfer_ = artdaq::MakeTransferPlugin(ps, "transfer_plugin", artdaq::TransferInterface::Role::kSend);
54  TLOG(TLVL_DEBUG) << "END: TransferOutput::TransferOutput";
55 }
56 
58 {
59  TLOG(TLVL_DEBUG) << "Begin: TransferOutput::~TransferOutput()";
60 
61  auto sts = transfer_->transfer_fragment_min_blocking_mode(*artdaq::Fragment::eodFrag(0), 10000);
62  if (sts != artdaq::TransferInterface::CopyStatus::kSuccess) TLOG(TLVL_ERROR) << "Error sending EOD Fragment!";
63  transfer_.reset(nullptr);
64  TLOG(TLVL_DEBUG) << "End: TransferOutput::~TransferOutput()";
65 }
66 
67 void art::TransferOutput::SendMessage(artdaq::Fragment::sequence_id_t sequenceId, artdaq::Fragment::type_t messageType, TBufferFile& msg)
68 {
69  TLOG(TLVL_DEBUG) << "Sending message with sequenceID=" << sequenceId << ", type=" << (int)messageType
70  << ", length=" << msg.Length();
71  artdaq::NetMonHeader header;
72  header.data_length = static_cast<uint64_t>(msg.Length());
73  artdaq::Fragment fragment(std::ceil(msg.Length() / static_cast<double>(sizeof(artdaq::RawDataType))), sequenceId, 0,
74  messageType, header);
75 
76  memcpy(&*fragment.dataBegin(), msg.Buffer(), msg.Length());
78  size_t retries = 0;
79  while (sts != artdaq::TransferInterface::CopyStatus::kSuccess && retries <= send_retry_count_)
80  {
81  sts = transfer_->transfer_fragment_min_blocking_mode(fragment, send_timeout_us_);
82  retries++;
83  }
84 
85 #if 0
86  if (messageType == artdaq::Fragment::InitFragmentType)
87  {
88  std::fstream ostream("sendInitMessage_TransferOutput.bin", std::ios::out | std::ios::binary);
89  ostream.write(msg.Buffer(), msg.Length());
90  ostream.close();
91  }
92 #endif
93 }
94 
95 DEFINE_ART_MODULE(art::TransferOutput)
This is the base class for artdaq OutputModules, providing the serialization interface for art Events...
Definition: ArtdaqOutput.hh:99
~TransferOutput()
TransferOutput Destructor.
std::unique_ptr< artdaq::TransferInterface > MakeTransferPlugin(const fhicl::ParameterSet &pset, std::string plugin_label, TransferInterface::Role role)
Load a TransferInterface plugin.
TransferOutput(fhicl::ParameterSet const &ps)
TransferOutput Constructor.
virtual void SendMessage(artdaq::Fragment::sequence_id_t sequenceId, artdaq::Fragment::type_t messageType, TBufferFile &msg)
Send a message using the Transfer Plugin
Header with length information for NetMonTransport messages.
Definition: NetMonHeader.hh:13
An art::OutputModule which sends events using DataSenderManager. This module is designed for transpor...
This TransferInterface is a Sender.
Some error occurred, but no exception was thrown.
The send operation completed successfully.
uint64_t data_length
The length of the message.
Definition: NetMonHeader.hh:15