artdaq  v3_07_02
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 
11  : content_selection_(static_cast<content_selector_t>(ps.get<size_t>("content_selection", 0)))
12  , payload_size_spec_(ps.get<size_t>("payload_size", 10240))
13  , fragment_ids_()
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  , fragment_content_generator_()
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.reset(new Fragment(sequence_id, fragment_id));
47  size_t payload_size = generateFragmentSize_();
48  frag_ptr->resize(payload_size, 0);
49  switch (content_selection_)
50  {
51  case content_selector_t::EMPTY:
52  break; // values are already correct
53  case content_selector_t::FRAG_ID:
54  std::fill_n(frag_ptr->dataBegin(), payload_size, fragment_id);
55  break;
56  case content_selector_t::RANDOM:
57  std::generate_n(frag_ptr->dataBegin(),
58  payload_size,
59  [&]() -> long {
60  return fragment_content_generator_(engine_);
61  });
62  break;
63  case content_selector_t::DEAD_BEEF:
64  std::fill_n(frag_ptr->dataBegin(),
65  payload_size,
66  0xDEADBEEFDEADBEEF);
67  break;
68  default:
69  throw cet::exception("UnknownContentSelection")
70  << "Unknown content selection: "
71  << static_cast<uint8_t>(content_selection_);
72  }
73  assert(frag_ptr != nullptr);
74  return true;
75 }
76 
77 std::vector<artdaq::Fragment::fragment_id_t>
78 artdaq::GenericFragmentSimulator::
79  fragmentIDs_()
80 {
81  return fragment_ids_;
82 }
83 
84 std::size_t
85 artdaq::GenericFragmentSimulator::
86  generateFragmentSize_()
87 {
88  return want_random_payload_size_ ? payload_size_generator_(engine_) : payload_size_spec_;
89 }
90 
91 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.