1 #include "artdaq-core/Data/Fragment.hh"
2 #include "artdaq-core/Utilities/ExceptionHandler.hh"
3 #include "artdaq/TransferPlugins/MakeTransferPlugin.hh"
4 #include "artdaq/TransferPlugins/TransferInterface.hh"
5 #include "cetlib/BasicPluginFactory.h"
7 #include "fhiclcpp/ParameterSet.h"
8 #include "messagefacility/MessageLogger/MessageLogger.h"
10 #include <boost/tokenizer.hpp>
37 NthEventTransfer( fhicl::ParameterSet
const& ps, artdaq::TransferInterface::Role role );
46 size_t send_timeout_usec )
override;
64 return physical_transfer_->receiveFragment( fragment, receiveTimeout );
75 return physical_transfer_->receiveFragmentHeader( header, receiveTimeout );
86 return physical_transfer_->receiveFragmentData( destination, wordCount );
93 int source_rank()
const override {
return physical_transfer_->source_rank(); }
99 int destination_rank()
const override {
return physical_transfer_->destination_rank(); }
105 bool isRunning()
override {
return physical_transfer_->isRunning(); }
114 bool pass(
const artdaq::Fragment& )
const;
116 std::unique_ptr<TransferInterface> physical_transfer_;
122 : TransferInterface( pset, role ), nth_( pset.get<size_t>(
"nth" ) ), offset_( pset.get<size_t>(
"offset", 0 ) )
124 if ( pset.has_key(
"source_rank" ) || pset.has_key(
"destination_rank" ) )
126 throw cet::exception(
"NthEvent" )
127 <<
"The parameters \"source_rank\" and \"destination_rank\" must be explicitly defined in the body of the "
128 "physical_transfer_plugin table, and not outside of it";
131 if ( offset_ >= nth_ )
133 throw cet::exception(
"NthEvent" )
134 <<
"Offset value of " << offset_ <<
" must not be larger than the modulus value of " << nth_;
139 mf::LogWarning(
"NthEventTransfer" )
140 <<
"0 was passed as the nth parameter to NthEventTransfer. Will change to 1 (0 is undefined behavior)";
144 physical_transfer_ = MakeTransferPlugin( pset,
"physical_transfer_plugin", role );
148 size_t send_timeout_usec )
150 if ( !pass( fragment ) )
153 return TransferInterface::CopyStatus::kSuccess;
157 return physical_transfer_->transfer_fragment_min_blocking_mode( fragment, send_timeout_usec );
162 if ( !pass( fragment ) )
165 return TransferInterface::CopyStatus::kSuccess;
169 return physical_transfer_->transfer_fragment_reliable_mode( std::move( fragment ) );
172 bool NthEventTransfer::pass(
const artdaq::Fragment& fragment )
const
176 if ( fragment.type() == artdaq::Fragment::DataFragmentType )
177 { passed = ( fragment.sequenceID() + nth_ - offset_ ) % nth_ == 0 ?
true :
false; }
Demonstration TransferInterface plugin showing how to discard events Intended for use in the transfer...
int receiveFragment(artdaq::Fragment &fragment, size_t receiveTimeout) override
Receive a fragment from the transfer plugin.
int receiveFragmentHeader(detail::RawFragmentHeader &header, size_t receiveTimeout) override
Receive a Fragment Header from the transport mechanism.
TransferInterface::CopyStatus transfer_fragment_min_blocking_mode(artdaq::Fragment const &fragment, size_t send_timeout_usec) override
Transfer a Fragment to the destination. May not necessarily be reliable, but will not block longer th...
bool isRunning() override
Determine whether the TransferInterface plugin is able to send/receive data.
NthEventTransfer(fhicl::ParameterSet const &ps, artdaq::TransferInterface::Role role)
NthEventTransfer Constructor.
int destination_rank() const override
Get the destination rank from the physical transfer.
void flush_buffers() override
Flush any in-flight data. This should be used by the receiver after the receive loop has ended...
TransferInterface::CopyStatus transfer_fragment_reliable_mode(artdaq::Fragment &&fragment) override
Copy a fragment, using the reliable channel. moveFragment assumes ownership of the fragment...
int receiveFragmentData(RawDataType *destination, size_t wordCount) override
Receive the body of a Fragment to the given destination pointer.
int source_rank() const override
Get the source rank from the physical transfer.