artdaq  v2_03_00
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Pages
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 <limits>
8 #include <functional>
9 
11  content_selection_(static_cast<content_selector_t>
12  (ps.get<size_t>("content_selection", 0)))
13  , payload_size_spec_(ps.get<size_t>("payload_size", 10240))
14  , fragment_ids_()
15  , want_random_payload_size_(ps.get<bool>("want_random_payload_size", false))
16  , current_event_num_(0)
17  , engine_(ps.get<int64_t>("random_seed", 314159))
18  , payload_size_generator_(payload_size_spec_)
19  , fragment_content_generator_()
20 {
21  fragment_ids_.resize(ps.get<size_t>("fragments_per_event", 5));
22  auto current_id = ps.get<Fragment::fragment_id_t>("starting_fragment_id", 0);
23  std::generate(fragment_ids_.begin(),
24  fragment_ids_.end(),
25  [&current_id]() { return current_id++; });
26 }
27 
28 bool
29 artdaq::GenericFragmentSimulator::getNext_(FragmentPtrs& frags)
30 {
31  ++current_event_num_;
32  //frags.reserve(frags.size() + fragment_ids_.size());
33  for (auto fragID : fragment_ids_)
34  {
35  frags.emplace_back();
36  bool result =
37  getNext(current_event_num_, fragID, frags.back());
38  if (!result) { return result; }
39  }
40  return true;
41 }
42 
43 bool
45 getNext(Fragment::sequence_id_t sequence_id,
46  Fragment::fragment_id_t fragment_id,
47  FragmentPtr& frag_ptr)
48 {
49  frag_ptr.reset(new Fragment(sequence_id, fragment_id));
50  size_t payload_size = generateFragmentSize_();
51  frag_ptr->resize(payload_size, 0);
52  switch (content_selection_)
53  {
54  case content_selector_t::EMPTY:
55  break; // values are already correct
56  case content_selector_t::FRAG_ID:
57  std::fill_n(frag_ptr->dataBegin(), payload_size, fragment_id);
58  break;
59  case content_selector_t::RANDOM:
60  std::generate_n(frag_ptr->dataBegin(),
61  payload_size,
62  [&]() -> long
63  {
64  return
65  fragment_content_generator_(engine_);
66  }
67  );
68  break;
69  case content_selector_t::DEAD_BEEF:
70  std::fill_n(frag_ptr->dataBegin(),
71  payload_size,
72  0xDEADBEEFDEADBEEF);
73  break;
74  default:
75  throw cet::exception("UnknownContentSelection")
76  << "Unknown content selection: "
77  << static_cast<uint8_t>(content_selection_);
78  }
79  assert(frag_ptr != nullptr);
80  return true;
81 }
82 
83 std::vector<artdaq::Fragment::fragment_id_t>
84 artdaq::GenericFragmentSimulator::
85 fragmentIDs_()
86 {
87  return fragment_ids_;
88 }
89 
90 std::size_t
91 artdaq::GenericFragmentSimulator::
92 generateFragmentSize_()
93 {
94  return want_random_payload_size_ ?
95  payload_size_generator_(engine_) :
96  payload_size_spec_;
97 }
98 
99 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.