00001 #ifndef artdaq_DAQdata_GenericFragmentSimulator_hh
00002 #define artdaq_DAQdata_GenericFragmentSimulator_hh
00003
00004 #include "artdaq-core/Data/Fragment.hh"
00005 #include "artdaq-core/Generators/FragmentGenerator.hh"
00006 #include "fhiclcpp/fwd.h"
00007
00008 #include <random>
00009
00010 namespace artdaq
00011 {
00012 class GenericFragmentSimulator;
00013 }
00014
00026 class artdaq::GenericFragmentSimulator : public artdaq::FragmentGenerator
00027 {
00028 public:
00048 explicit GenericFragmentSimulator(fhicl::ParameterSet const& ps);
00049
00053 enum class content_selector_t : uint8_t
00054 {
00055 EMPTY = 0,
00056 FRAG_ID = 1,
00057 RANDOM = 2,
00058 DEAD_BEEF
00059 };
00060
00061
00062 using FragmentGenerator::getNext;
00063
00071 bool getNext(Fragment::sequence_id_t sequence_id,
00072 Fragment::fragment_id_t fragment_id,
00073 FragmentPtr& frag_ptr);
00074
00080 bool getNext(FragmentPtrs& output) override
00081 {
00082 return getNext_(output);
00083 }
00084
00089 std::vector<Fragment::fragment_id_t> fragmentIDs() override
00090 {
00091 return fragmentIDs_();
00092 }
00093
00094 private:
00095 bool getNext_(FragmentPtrs& output);
00096
00097 std::vector<Fragment::fragment_id_t> fragmentIDs_();
00098
00099 std::size_t generateFragmentSize_();
00100
00101
00102 content_selector_t const content_selection_;
00103 std::size_t const payload_size_spec_;
00104 std::vector<Fragment::fragment_id_t> fragment_ids_;
00105
00106 bool const want_random_payload_size_;
00107
00108
00109 std::size_t current_event_num_;
00110 std::mt19937 engine_;
00111 std::poisson_distribution<size_t> payload_size_generator_;
00112 std::uniform_int_distribution<uint64_t> fragment_content_generator_;
00113 };
00114
00115 #endif