00001 #include "artdaq/DAQdata/GenericFragmentSimulator.hh"
00002
00003 #include "artdaq-core/Generators/GeneratorMacros.hh"
00004 #include "fhiclcpp/ParameterSet.h"
00005
00006 #include <algorithm>
00007 #include <limits>
00008 #include <functional>
00009
00010 artdaq::GenericFragmentSimulator::GenericFragmentSimulator(fhicl::ParameterSet const& ps) :
00011 content_selection_(static_cast<content_selector_t>
00012 (ps.get<size_t>("content_selection", 0)))
00013 , payload_size_spec_(ps.get<size_t>("payload_size", 10240))
00014 , fragment_ids_()
00015 , want_random_payload_size_(ps.get<bool>("want_random_payload_size", false))
00016 , current_event_num_(0)
00017 , engine_(ps.get<int64_t>("random_seed", 314159))
00018 , payload_size_generator_(payload_size_spec_)
00019 , fragment_content_generator_()
00020 {
00021 fragment_ids_.resize(ps.get<size_t>("fragments_per_event", 5));
00022 auto current_id = ps.get<Fragment::fragment_id_t>("starting_fragment_id", 0);
00023 std::generate(fragment_ids_.begin(),
00024 fragment_ids_.end(),
00025 [¤t_id]() { return current_id++; });
00026 }
00027
00028 bool
00029 artdaq::GenericFragmentSimulator::getNext_(FragmentPtrs& frags)
00030 {
00031 ++current_event_num_;
00032
00033 for (auto fragID : fragment_ids_)
00034 {
00035 frags.emplace_back();
00036 bool result =
00037 getNext(current_event_num_, fragID, frags.back());
00038 if (!result) { return result; }
00039 }
00040 return true;
00041 }
00042
00043 bool
00044 artdaq::GenericFragmentSimulator::
00045 getNext(Fragment::sequence_id_t sequence_id,
00046 Fragment::fragment_id_t fragment_id,
00047 FragmentPtr& frag_ptr)
00048 {
00049 frag_ptr.reset(new Fragment(sequence_id, fragment_id));
00050 size_t payload_size = generateFragmentSize_();
00051 frag_ptr->resize(payload_size, 0);
00052 switch (content_selection_)
00053 {
00054 case content_selector_t::EMPTY:
00055 break;
00056 case content_selector_t::FRAG_ID:
00057 std::fill_n(frag_ptr->dataBegin(), payload_size, fragment_id);
00058 break;
00059 case content_selector_t::RANDOM:
00060 std::generate_n(frag_ptr->dataBegin(),
00061 payload_size,
00062 [&]() -> long
00063 {
00064 return
00065 fragment_content_generator_(engine_);
00066 }
00067 );
00068 break;
00069 case content_selector_t::DEAD_BEEF:
00070 std::fill_n(frag_ptr->dataBegin(),
00071 payload_size,
00072 0xDEADBEEFDEADBEEF);
00073 break;
00074 default:
00075 throw cet::exception("UnknownContentSelection")
00076 << "Unknown content selection: "
00077 << static_cast<uint8_t>(content_selection_);
00078 }
00079 assert(frag_ptr != nullptr);
00080 return true;
00081 }
00082
00083 std::vector<artdaq::Fragment::fragment_id_t>
00084 artdaq::GenericFragmentSimulator::
00085 fragmentIDs_()
00086 {
00087 return fragment_ids_;
00088 }
00089
00090 std::size_t
00091 artdaq::GenericFragmentSimulator::
00092 generateFragmentSize_()
00093 {
00094 return want_random_payload_size_ ?
00095 payload_size_generator_(engine_) :
00096 payload_size_spec_;
00097 }
00098
00099 DEFINE_ARTDAQ_GENERATOR(artdaq::GenericFragmentSimulator)