1 #define TRACE_NAME "TransferOutput"
3 #include "art/Framework/Core/ModuleMacros.h"
4 #include "art/Framework/Core/OutputModule.h"
5 #include "art/Framework/Principal/EventPrincipal.h"
6 #include "art/Framework/Principal/OutputHandle.h"
7 #include "art/Framework/Principal/RunPrincipal.h"
8 #include "art/Framework/Principal/SubRunPrincipal.h"
9 #include "art/Framework/Services/Registry/ServiceHandle.h"
10 #include "art/Persistency/Provenance/ProcessHistoryRegistry.h"
11 #include "art/Persistency/Provenance/ProductMetaData.h"
13 #include "canvas/Persistency/Provenance/BranchDescription.h"
14 #include "canvas/Persistency/Provenance/BranchKey.h"
15 #include "canvas/Persistency/Provenance/History.h"
16 #include "canvas/Persistency/Provenance/ParentageRegistry.h"
17 #include "canvas/Persistency/Provenance/ProcessConfiguration.h"
18 #include "canvas/Persistency/Provenance/ProcessConfigurationID.h"
19 #include "canvas/Persistency/Provenance/ProcessHistoryID.h"
20 #include "canvas/Persistency/Provenance/ProductList.h"
21 #include "canvas/Persistency/Provenance/ProductProvenance.h"
22 #include "canvas/Persistency/Provenance/RunAuxiliary.h"
23 #include "canvas/Persistency/Provenance/SubRunAuxiliary.h"
24 #include "canvas/Utilities/DebugMacros.h"
25 #include "canvas/Utilities/Exception.h"
26 #include "cetlib/column_width.h"
27 #include "cetlib/lpad.h"
28 #include "cetlib/rpad.h"
31 #include "fhiclcpp/ParameterSet.h"
32 #include "fhiclcpp/ParameterSetID.h"
33 #include "fhiclcpp/ParameterSetRegistry.h"
35 #include "artdaq/TransferPlugins/TransferInterface.hh"
36 #include "artdaq/TransferPlugins/MakeTransferPlugin.hh"
37 #include "artdaq-core/Data/detail/ParentageMap.hh"
38 #include "artdaq/DAQdata/Globals.hh"
39 #include "artdaq/DAQdata/NetMonHeader.hh"
81 virtual void openFile(FileBlock
const&);
83 virtual void closeFile();
85 virtual void respondToCloseInputFile(FileBlock
const&);
87 virtual void respondToCloseOutputFiles(FileBlock
const&);
89 virtual void endJob();
91 virtual void write(EventPrincipal&);
93 virtual void writeRun(RunPrincipal&);
95 virtual void writeSubRun(SubRunPrincipal&);
97 void writeDataProducts(TBufferFile&,
const Principal&,
98 std::vector<BranchKey*>&);
102 size_t send_timeout_us_;
103 size_t send_retry_count_;
104 std::unique_ptr<artdaq::TransferInterface> transfer_;
106 void sendMessage_(uint64_t sequenceId, uint8_t messageType, TBufferFile& msg);
107 void send_init_message();
114 , initMsgSent_(false)
115 , send_timeout_us_(ps.get<size_t>(
"send_timeout_us", 5000000))
116 , send_retry_count_(ps.get<size_t>(
"send_retry_count", 5))
118 TLOG(TLVL_DEBUG) <<
"Begin: TransferOutput::TransferOutput(ParameterSet const& ps)";
120 TLOG(TLVL_DEBUG) <<
"END: TransferOutput::TransferOutput";
126 TLOG(TLVL_DEBUG) <<
"Begin: TransferOutput::~TransferOutput()";
128 auto sts = transfer_->moveFragment(std::move(*artdaq::Fragment::eodFrag(0)));
130 transfer_.reset(
nullptr);
131 TLOG(TLVL_DEBUG) <<
"End: TransferOutput::~TransferOutput()";
135 art::TransferOutput::
136 openFile(FileBlock
const&)
138 TLOG(TLVL_TRACE) <<
"Begin/End: TransferOutput::openFile(const FileBlock&)";
142 art::TransferOutput::
145 TLOG(TLVL_TRACE) <<
"Begin/End: TransferOutput::closeFile()";
149 art::TransferOutput::
150 respondToCloseInputFile(FileBlock
const&)
152 TLOG(TLVL_TRACE) <<
"Begin/End: TransferOutput::" <<
153 "respondToCloseOutputFiles(FileBlock const&)";
157 art::TransferOutput::
158 respondToCloseOutputFiles(FileBlock
const&)
160 TLOG(TLVL_TRACE) <<
"Begin/End: TransferOutput::" <<
161 "respondToCloseOutputFiles(FileBlock const&)";
165 art::TransferOutput::
168 TLOG(TLVL_TRACE) <<
"Begin: TransferOutput::endJob()";
174 art::TransferOutput::
177 TLOG(TLVL_TRACE) <<
"Begin: TransferOutput static send_init_message()";
187 static TClass* product_list_class = TClass::GetClass(
188 "std::map<art::BranchKey,art::BranchDescription>");
189 if (product_list_class ==
nullptr)
191 throw art::Exception(art::errors::DictionaryNotFound) <<
192 "TransferOutput static send_init_message(): "
193 "Could not get TClass for "
194 "map<art::BranchKey,art::BranchDescription>!";
200 static TClass* process_history_map_class = TClass::GetClass(
201 "std::map<const art::Hash<2>,art::ProcessHistory>");
202 if (process_history_map_class ==
nullptr)
204 throw art::Exception(art::errors::DictionaryNotFound) <<
205 "TransferOutput static send_init_message(): "
206 "Could not get class for "
207 "std::map<const art::Hash<2>,art::ProcessHistory>!";
212 static TClass* parentage_map_class = TClass::GetClass(
"art::ParentageMap");
213 if (parentage_map_class ==
nullptr)
215 throw art::Exception(art::errors::DictionaryNotFound) <<
216 "TransferOutput static send_init_message(): "
217 "Could not get class for ParentageMap";
222 TBufferFile msg(TBuffer::kWrite);
227 TLOG(TLVL_TRACE) <<
" TransferOutput static send_init_message(): "
228 "Streaming message type code ...";
230 TLOG(TLVL_TRACE) <<
" TransferOutput static send_init_message(): "
231 "Finished streaming message type code.";
236 unsigned long ps_cnt = fhicl::ParameterSetRegistry::size();
237 TLOG(TLVL_TRACE) <<
" TransferOutput static send_init_message(): parameter set count: " << ps_cnt;
238 msg.WriteULong(ps_cnt);
239 TLOG(TLVL_TRACE) <<
" TransferOutput static send_init_message(): Streaming parameter sets ...";
241 auto I = std::begin(fhicl::ParameterSetRegistry::get()),
242 E = std::end(fhicl::ParameterSetRegistry::get());
245 std::string pset_str = I->second.to_string();
247 msg.WriteStdString(pset_str);
249 TLOG(TLVL_TRACE) <<
" TransferOutput static send_init_message(): Finished streaming parameter sets.";
254 TLOG(TLVL_TRACE) <<
" TransferOutput static send_init_message(): Streaming MasterProductRegistry ...";;
255 art::ProductList productList(art::ProductMetaData::instance().productList());
256 msg.WriteObjectAny(&productList, product_list_class);
257 TLOG(TLVL_TRACE) <<
" TransferOutput static send_init_message(): Finished streaming MasterProductRegistry.";
259 art::ProcessHistoryMap phr;
260 for (
auto const& pr : art::ProcessHistoryRegistry::get())
267 if (art::debugit() >= 1)
269 TLOG(TLVL_TRACE) <<
" TransferOutput static send_init_message(): "
270 "Dumping ProcessHistoryRegistry ...";
273 TLOG(TLVL_TRACE) <<
" TransferOutput static send_init_message(): " <<
274 "phr: size: " + std::to_string(phr.size());
275 for (
auto I = phr.begin(), E = phr.end(); I != E; ++I)
277 std::ostringstream OS;
279 TLOG(TLVL_TRACE) <<
" TransferOutput static send_init_message(): " <<
280 "phr: id: '" + OS.str() +
"'";
287 TLOG(TLVL_TRACE) <<
" TransferOutput static send_init_message(): " <<
288 "Streaming ProcessHistoryRegistry ...";
291 const art::ProcessHistoryMap& phm = phr;
292 TLOG(TLVL_TRACE) <<
" TransferOutput static send_init_message(): " <<
293 "phm: size: " << phm.size();
294 msg.WriteObjectAny(&phm, process_history_map_class);
295 TLOG(TLVL_TRACE) <<
" TransferOutput static send_init_message(): " <<
296 "Finished streaming ProcessHistoryRegistry.";
302 TLOG(TLVL_DEBUG) <<
"TransferOutput static send_init_message(): " <<
303 "Streaming ParentageRegistry ... sz=" << msg.Length();
305 art::ParentageMap parentageMap{};
306 for (
auto const& pr : art::ParentageRegistry::get())
308 parentageMap.emplace(pr.first, pr.second);
311 TLOG(TLVL_TRACE) <<
"Before WriteObjectAny ParentageMap";
315 msg.WriteObjectAny(&parentageMap, parentage_map_class);
316 TLOG(TLVL_TRACE) <<
"After WriteObjectAny ParentageMap";
318 TLOG(TLVL_DEBUG) <<
"TransferOutput: TransferOutput static send_init_message(): " <<
319 "Finished streaming ParentageRegistry." <<
" sts=" << sts <<
", sz=" << msg.Length();
326 TLOG(TLVL_DEBUG) <<
"TransferOutput: TransferOutput static send_init_message(): " <<
"Sending the init message.";
327 sendMessage_(artdaq::Fragment::InvalidSequenceID - 1, artdaq::Fragment::InitFragmentType, msg);
328 TLOG(TLVL_TRACE) <<
" TransferOutput static send_init_message(): "
329 "Init message(s) sent.";
331 TLOG(TLVL_TRACE) <<
" End: TransferOutput static send_init_message()";
334 #//pragma GCC pop_options
337 art::TransferOutput::
338 writeDataProducts(TBufferFile& msg,
const Principal& principal,
339 std::vector<BranchKey*>& bkv)
341 TLOG(TLVL_TRACE) <<
" Begin: TransferOutput::writeDataProducts(...)";
346 static TClass* branch_key_class = TClass::GetClass(
"art::BranchKey");
347 if (branch_key_class ==
nullptr)
349 throw art::Exception(art::errors::DictionaryNotFound) <<
350 "TransferOutput::writeDataProducts(...): "
351 "Could not get TClass for art::BranchKey!";
353 static TClass* prdprov_class = TClass::GetClass(
"art::ProductProvenance");
354 if (prdprov_class ==
nullptr)
356 throw art::Exception(art::errors::DictionaryNotFound) <<
357 "TransferOutput::writeDataProducts(...): "
358 "Could not get TClass for art::ProductProvenance!";
363 unsigned long prd_cnt = 0;
365 for (
auto I = principal.begin(), E = principal.end(); I != E; ++I)
367 auto const& productDescription = I->second->productDescription();
368 auto const& refs = keptProducts()[productDescription.branchType()];
370 for (
auto const& ref : refs)
372 if (*ref == productDescription)
378 if (I->second->productUnavailable() || !found)
388 TLOG(TLVL_TRACE) <<
" TransferOutput::writeDataProducts(...): "
389 "Streaming product count: " << prd_cnt;
390 msg.WriteULong(prd_cnt);
391 TLOG(TLVL_TRACE) <<
" TransferOutput::writeDataProducts(...): "
392 "Finished streaming product count.";
404 bkv.reserve(prd_cnt);
406 for (
auto I = principal.begin(), E = principal.end(); I != E; ++I)
408 auto const& productDescription = I->second->productDescription();
409 auto const& refs = keptProducts()[productDescription.branchType()];
411 for (
auto const& ref : refs)
413 if (*ref == productDescription)
419 if (I->second->productUnavailable() || !found)
423 const BranchDescription& bd(I->second->productDescription());
424 bkv.push_back(
new BranchKey(bd));
425 if (art::debugit() >= 2)
427 TLOG(TLVL_TRACE) <<
"TransferOutput::writeDataProducts(...): "
428 "Dumping branch key of class: '"
429 << bkv.back()->friendlyClassName_
431 << bkv.back()->moduleLabel_
433 << bkv.back()->productInstanceName_
435 << bkv.back()->processName_
439 TLOG(TLVL_TRACE) <<
" TransferOutput::writeDataProducts(...): "
440 "Streaming branch key of class: '"
441 + bd.producedClassName()
445 + bd.productInstanceName()
449 msg.WriteObjectAny(bkv.back(), branch_key_class);
452 TLOG(TLVL_TRACE) <<
" TransferOutput::writeDataProducts(...): "
453 "Streaming product of class: '"
454 + bd.producedClassName()
458 + bd.productInstanceName()
463 OutputHandle oh = principal.getForOutput(bd.productID(),
true);
464 const EDProduct* prd = oh.wrapper();
465 msg.WriteObjectAny(prd, TClass::GetClass(bd.wrappedName().c_str()));
468 TLOG(TLVL_TRACE) <<
" TransferOutput::writeDataProducts(...): "
469 "Streaming product provenance of class: '"
470 + bd.producedClassName()
474 + bd.productInstanceName()
478 const ProductProvenance* prdprov =
479 I->second->productProvenancePtr().get();
480 msg.WriteObjectAny(prdprov, prdprov_class);
483 TLOG(TLVL_TRACE) <<
" End: TransferOutput::writeDataProducts(...)";
487 art::TransferOutput::
488 write(EventPrincipal& ep)
493 TLOG(TLVL_TRACE) <<
" Begin: TransferOutput::"
494 "write(const EventPrincipal& ep)";
503 static TClass* run_aux_class = TClass::GetClass(
"art::RunAuxiliary");
504 if (run_aux_class ==
nullptr)
506 throw art::Exception(art::errors::DictionaryNotFound) <<
507 "TransferOutput::write(const EventPrincipal& ep): "
508 "Could not get TClass for art::RunAuxiliary!";
510 static TClass* subrun_aux_class = TClass::GetClass(
"art::SubRunAuxiliary");
511 if (subrun_aux_class ==
nullptr)
513 throw art::Exception(art::errors::DictionaryNotFound) <<
514 "TransferOutput::write(const EventPrincipal& ep): "
515 "Could not get TClass for art::SubRunAuxiliary!";
517 static TClass* event_aux_class = TClass::GetClass(
"art::EventAuxiliary");
518 if (event_aux_class ==
nullptr)
520 throw art::Exception(art::errors::DictionaryNotFound) <<
521 "TransferOutput::write(const EventPrincipal& ep): "
522 "Could not get TClass for art::EventAuxiliary!";
524 static TClass* history_class = TClass::GetClass(
"art::History");
525 if (history_class ==
nullptr)
527 throw art::Exception(art::errors::DictionaryNotFound) <<
528 "TransferOutput::write(const EventPrincipal& ep): "
529 "Could not get TClass for art::History!";
534 TBufferFile msg(TBuffer::kWrite);
540 TLOG(TLVL_TRACE) <<
" TransferOutput::write(const EventPrincipal& ep): "
541 "Streaming message type code ...";
543 TLOG(TLVL_TRACE) <<
" TransferOutput::write(const EventPrincipal& ep): "
544 "Finished streaming message type code.";
550 TLOG(TLVL_TRACE) <<
" TransferOutput::write(const EventPrincipal& ep): "
551 "Streaming RunAuxiliary ...";
552 msg.WriteObjectAny(&ep.subRunPrincipal().runPrincipal().aux(),
554 TLOG(TLVL_TRACE) <<
" TransferOutput::write(const EventPrincipal& ep): "
555 "Finished streaming RunAuxiliary.";
561 TLOG(TLVL_TRACE) <<
" TransferOutput::write(const EventPrincipal& ep): "
562 "Streaming SubRunAuxiliary ...";
563 msg.WriteObjectAny(&ep.subRunPrincipal().aux(),
565 TLOG(TLVL_TRACE) <<
" TransferOutput::write(const EventPrincipal& ep): "
566 "Finished streaming SubRunAuxiliary.";
572 TLOG(TLVL_TRACE) <<
" TransferOutput::write(const EventPrincipal& ep): "
573 "Streaming EventAuxiliary ...";
574 msg.WriteObjectAny(&ep.aux(), event_aux_class);
575 TLOG(TLVL_TRACE) <<
" TransferOutput::write(const EventPrincipal& ep): "
576 "Finished streaming EventAuxiliary.";
582 TLOG(TLVL_TRACE) <<
" TransferOutput::write(const EventPrincipal& ep): "
583 "Streaming History ...";
584 msg.WriteObjectAny(&ep.history(), history_class);
585 TLOG(TLVL_TRACE) <<
" TransferOutput::write(const EventPrincipal& ep): "
586 "Finished streaming History.";
591 std::vector<BranchKey*> bkv;
592 writeDataProducts(msg, ep, bkv);
597 TLOG(TLVL_TRACE) <<
" TransferOutput::write(const EventPrincipal& ep): "
598 "Sending a message ...";
599 sendMessage_(ep.id().event(), artdaq::Fragment::DataFragmentType, msg);
600 TLOG(TLVL_TRACE) <<
" TransferOutput::write(const EventPrincipal& ep): "
606 for (
auto I = bkv.begin(), E = bkv.end(); I != E; ++I)
611 TLOG(TLVL_TRACE) <<
" End: TransferOutput::write(const EventPrincipal& ep)";
615 art::TransferOutput::
616 writeRun(RunPrincipal& rp)
621 TLOG(TLVL_TRACE) <<
" Begin: TransferOutput::writeRun(const RunPrincipal& rp)";
633 static TClass* run_aux_class = TClass::GetClass(
"art::RunAuxiliary");
634 assert(run_aux_class !=
nullptr &&
"writeRun: Could not get TClass for "
635 "art::RunAuxiliary!");
639 TBufferFile msg(TBuffer::kWrite);
645 TLOG(TLVL_TRACE) <<
" writeRun: streaming message type code ...");
647 TLOG(TLVL_TRACE) <<
" writeRun: finished streaming message type code.");
653 TLOG(TLVL_TRACE) <<
" writeRun: streaming RunAuxiliary ...");
654 if (art::debugit() >= 1)
656 TLOG(TLVL_TRACE) <<
" writeRun: dumping ProcessHistoryRegistry ...");
659 art::ProcessHistoryMap
const& phr =
660 art::ProcessHistoryRegistry::get();
661 TLOG(TLVL_TRACE) <<
" writeRun: phr: size: " << phr.size() <<
'\n';
662 for (
auto I = phr.begin(), E = phr.end(); I != E; ++I)
664 std::ostringstream OS;
666 TLOG(TLVL_TRACE) <<
" writeRun: phr: id: '" << OS.str() <<
"'");
668 TLOG(TLVL_TRACE) <<
" writeRun: phr: data.size(): "
669 << I->second.data().size() <<
'\n';
670 if (I->second.data().size())
672 I->second.data().back().id().print(OS);
673 TLOG(TLVL_TRACE) <<
" writeRun: phr: data.back().id(): '"
677 if (!rp.aux().processHistoryID().isValid())
679 TLOG(TLVL_TRACE) <<
" writeRun: ProcessHistoryID: 'INVALID'");
683 std::ostringstream OS;
684 rp.aux().processHistoryID().print(OS);
685 TLOG(TLVL_TRACE) <<
" writeRun: ProcessHistoryID: '"
688 const ProcessHistory& processHistory =
689 ProcessHistoryRegistry::get(rp.aux().processHistoryID());
690 if (processHistory.data().size())
693 processHistory.data().back().id().print(OS);
694 TLOG(TLVL_TRACE) <<
" writeRun: ProcessConfigurationID: '"
697 TLOG(TLVL_TRACE) <<
" writeRun: ProcessConfiguration: '"
698 << processHistory.data().back() <<
'\n';
702 msg.WriteObjectAny(&rp.aux(), run_aux_class);
703 TLOG(TLVL_TRACE) <<
" writeRun: streamed RunAuxiliary.");
708 std::vector<BranchKey*> bkv;
709 writeDataProducts(msg, rp, bkv);
714 TLOG(TLVL_TRACE) <<
" writeRun: sending a message ...");
715 sendMessage_(0, artdaq::Fragment::EndOfRunFragmentType, msg);
716 TLOG(TLVL_TRACE) <<
" writeRun: message sent.");
721 for (
auto I = bkv.begin(), E = bkv.end(); I != E; ++I)
727 TLOG(TLVL_TRACE) <<
" End: TransferOutput::writeRun(const RunPrincipal& rp)";
731 art::TransferOutput::writeSubRun(SubRunPrincipal& srp)
736 TLOG(TLVL_TRACE) <<
" Begin: TransferOutput::"
737 "writeSubRun(const SubRunPrincipal& srp)";
747 static TClass* subrun_aux_class = TClass::GetClass(
"art::SubRunAuxiliary");
748 if (subrun_aux_class ==
nullptr)
750 throw art::Exception(art::errors::DictionaryNotFound) <<
751 "TransferOutput::writeSubRun: "
752 "Could not get TClass for art::SubRunAuxiliary!";
757 TBufferFile msg(TBuffer::kWrite);
763 TLOG(TLVL_TRACE) <<
" TransferOutput::writeSubRun: "
764 "streaming message type code ...";
766 TLOG(TLVL_TRACE) <<
" TransferOutput::writeSubRun: "
767 "finished streaming message type code.";
773 TLOG(TLVL_TRACE) <<
" TransferOutput::writeSubRun: "
774 "streaming SubRunAuxiliary ...";
775 if (art::debugit() >= 1)
777 TLOG(TLVL_TRACE) <<
" TransferOutput::writeSubRun: "
778 "dumping ProcessHistoryRegistry ...";
781 for (
auto I = std::begin(art::ProcessHistoryRegistry::get())
782 , E = std::end(art::ProcessHistoryRegistry::get()); I != E; ++I)
784 std::ostringstream OS;
786 TLOG(TLVL_TRACE) <<
" TransferOutput::writeSubRun: "
787 "phr: id: '" + OS.str() +
"'";
789 TLOG(TLVL_TRACE) <<
" TransferOutput::writeSubRun: "
790 "phr: data.size(): " << I->second.data().size();
791 if (I->second.data().size())
793 I->second.data().back().id().print(OS);
794 TLOG(TLVL_TRACE) <<
" TransferOutput::writeSubRun: "
795 "phr: data.back().id(): '"
799 if (!srp.aux().processHistoryID().isValid())
801 TLOG(TLVL_TRACE) <<
" TransferOutput::writeSubRun: "
802 "ProcessHistoryID: 'INVALID'";;
806 std::ostringstream OS;
807 srp.aux().processHistoryID().print(OS);
808 TLOG(TLVL_TRACE) <<
" TransferOutput::writeSubRun: ProcessHistoryID: '"
811 ProcessHistory processHistory;
812 ProcessHistoryRegistry::get(srp.aux().processHistoryID(), processHistory);
813 if (processHistory.data().size())
816 processHistory.data().back().id().print(OS);
817 TLOG(TLVL_TRACE) <<
" TransferOutput::writeSubRun: "
818 "ProcessConfigurationID: '"
821 OS << processHistory.data().back();
822 TLOG(TLVL_TRACE) <<
" TransferOutput::writeSubRun: "
823 "ProcessConfiguration: '"
828 msg.WriteObjectAny(&srp.aux(), subrun_aux_class);
829 TLOG(TLVL_TRACE) <<
" TransferOutput::writeSubRun: streamed SubRunAuxiliary.";
834 std::vector<BranchKey*> bkv;
835 writeDataProducts(msg, srp, bkv);
840 TLOG(TLVL_TRACE) <<
" TransferOutput::writeSubRun: "
841 "Sending the EndOfSubrun message.";
842 sendMessage_(0, artdaq::Fragment::EndOfSubrunFragmentType, msg);
843 TLOG(TLVL_TRACE) <<
" TransferOutput::writeSubRun: "
844 "EndOfSubrun message(s) sent.";
850 for (
auto I = bkv.begin(), E = bkv.end(); I != E; ++I)
855 TLOG(TLVL_TRACE) <<
" End: TransferOutput::writeSubRun(const SubRunPrincipal& srp)";
860 art::TransferOutput::sendMessage_(uint64_t sequenceId, uint8_t messageType, TBufferFile& msg)
862 TLOG(TLVL_DEBUG) <<
"Sending message with sequenceID=" << sequenceId <<
", type=" << (int)messageType <<
", length=" << msg.Length();
864 header.
data_length =
static_cast<uint64_t
>(msg.Length());
866 fragment(std::ceil(msg.Length() /
867 static_cast<double>(
sizeof(artdaq::RawDataType))),
868 sequenceId, 0, messageType, header);
870 memcpy(&*fragment.dataBegin(), msg.Buffer(), msg.Length());
875 sts = transfer_->copyFragment(fragment, send_timeout_us_);
880 if (messageType == artdaq::Fragment::InitFragmentType)
882 std::fstream ostream(
"sendInitMessage_TransferOutput.bin", std::ios::out | std::ios::binary);
883 ostream.write(msg.Buffer(), msg.Length());
~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.
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.