$treeview $search $mathjax $extrastylesheet
artdaq
v3_04_01
$projectbrief
|
$projectbrief
|
$searchbox |
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 //frags.reserve(frags.size() + fragment_ids_.size()); 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; // values are already correct 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)