artdaq  v3_09_01
GenericFragmentSimulator_generator.cc
1 #include "artdaq/DAQdata/GenericFragmentSimulator.hh"
2 
3 #include "artdaq-core/Generators/GeneratorMacros.hh"
4 #include "fhiclcpp/ParameterSet.h"
5 
6 #include <algorithm>
7 #include <functional>
8 #include <limits>
9 #include <memory>
10 
12  : content_selection_(static_cast<content_selector_t>(ps.get<size_t>("content_selection", 0)))
13  , payload_size_spec_(ps.get<size_t>("payload_size", 10240))
14  , want_random_payload_size_(ps.get<bool>("want_random_payload_size", false))
15  , current_event_num_(0)
16  , engine_(ps.get<int64_t>("random_seed", 314159))
17  , payload_size_generator_(payload_size_spec_)
18 
19 {
20  fragment_ids_.resize(ps.get<size_t>("fragments_per_event", 5));
21  auto current_id = ps.get<Fragment::fragment_id_t>("starting_fragment_id", 0);
22  std::generate(fragment_ids_.begin(),
23  fragment_ids_.end(),
24  [&current_id]() { return current_id++; });
25 }
26 
27 bool artdaq::GenericFragmentSimulator::getNext_(FragmentPtrs& frags)
28 {
29  ++current_event_num_;
30  //frags.reserve(frags.size() + fragment_ids_.size());
31  for (auto fragID : fragment_ids_)
32  {
33  frags.emplace_back();
34  bool result =
35  getNext(current_event_num_, fragID, frags.back());
36  if (!result) { return result; }
37  }
38  return true;
39 }
40 
42  getNext(Fragment::sequence_id_t sequence_id,
43  Fragment::fragment_id_t fragment_id,
44  FragmentPtr& frag_ptr)
45 {
46  frag_ptr = std::make_unique<Fragment>(sequence_id, fragment_id);
47  size_t payload_size = generateFragmentSize_();
48  frag_ptr->resize(payload_size, 0);
49  frag_ptr->setSystemType(artdaq::Fragment::EmptyFragmentType);
50  switch (content_selection_)
51  {
52  case content_selector_t::EMPTY:
53  break; // values are already correct
54  case content_selector_t::FRAG_ID:
55  std::fill_n(frag_ptr->dataBegin(), payload_size, fragment_id);
56  break;
57  case content_selector_t::RANDOM:
58  std::generate_n(frag_ptr->dataBegin(),
59  payload_size,
60  [&]() -> int64_t {
61  return fragment_content_generator_(engine_);
62  });
63  break;
64  case content_selector_t::DEAD_BEEF:
65  std::fill_n(frag_ptr->dataBegin(),
66  payload_size,
67  0xDEADBEEFDEADBEEF);
68  break;
69  default:
70  throw cet::exception("UnknownContentSelection") // NOLINT(cert-err60-cpp)
71  << "Unknown content selection: "
72  << static_cast<uint8_t>(content_selection_);
73  }
74  assert(frag_ptr != nullptr);
75  return true;
76 }
77 
78 std::vector<artdaq::Fragment::fragment_id_t>
79 artdaq::GenericFragmentSimulator::
80  fragmentIDs_()
81 {
82  return fragment_ids_;
83 }
84 
85 std::size_t
86 artdaq::GenericFragmentSimulator::
87  generateFragmentSize_()
88 {
89  return want_random_payload_size_ ? payload_size_generator_(engine_) : payload_size_spec_;
90 }
91 
92 DEFINE_ARTDAQ_GENERATOR(artdaq::GenericFragmentSimulator)
GenericFragmentSimulator(fhicl::ParameterSet const &ps)
GenericFragmentSimulator Constructor.
GenericFragmentSimulator creates simulated Generic events, with data distributed according to a &quot;hist...
content_selector_t
What type of content should the GenericFragmentSimulator put in Fragment objects? ...
bool getNext(Fragment::sequence_id_t sequence_id, Fragment::fragment_id_t fragment_id, FragmentPtr &frag_ptr)
Generate a Fragment according to the value of the content_selectior_t enum.