DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType > Class Template Reference

#include <SourceEmulatorModel.hpp>

Inheritance diagram for dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >:
[legend]
Collaboration diagram for dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >:
[legend]

Public Member Functions

 SourceEmulatorModel (std::string name, std::atomic< bool > &run_marker, uint64_t time_tick_diff, double dropout_rate, double frame_error_rate, double rate_khz, uint16_t frames_per_tick=1)
void acquire_callback () override
void conf (const confmodel::DetectorStream *stream_conf, const appmodel::StreamEmulationParameters *emu_conf)
void scrap (const appfwk::DAQModule::CommandData_t &)
bool is_configured () override
void start (const appfwk::DAQModule::CommandData_t &)
void stop (const appfwk::DAQModule::CommandData_t &)
Public Member Functions inherited from dunedaq::datahandlinglibs::SourceEmulatorConcept
 SourceEmulatorConcept ()
virtual ~SourceEmulatorConcept ()
 SourceEmulatorConcept (const SourceEmulatorConcept &)=delete
 SourceEmulatorConcept is not copy-constructible.
SourceEmulatorConcept & operator= (const SourceEmulatorConcept &)=delete
 SourceEmulatorConcept is not copy-assginable.
 SourceEmulatorConcept (SourceEmulatorConcept &&)=delete
 SourceEmulatorConcept is not move-constructible.
SourceEmulatorConcept & operator= (SourceEmulatorConcept &&)=delete
 SourceEmulatorConcept is not move-assignable.
void set_sink_config (const appmodel::DataMoveCallbackConf *sink_conf)
Public Member Functions inherited from dunedaq::opmonlib::MonitorableObject
 MonitorableObject (const MonitorableObject &)=delete
MonitorableObject & operator= (const MonitorableObject &)=delete
 MonitorableObject (MonitorableObject &&)=delete
MonitorableObject & operator= (MonitorableObject &&)=delete
virtual ~MonitorableObject ()=default
auto get_opmon_id () const noexcept
auto get_opmon_level () const noexcept

Protected Member Functions

void run_produce ()
virtual void generate_opmon_data () override
Protected Member Functions inherited from dunedaq::opmonlib::MonitorableObject
 MonitorableObject ()=default
void register_node (ElementId name, NewNodePtr)
void publish (google::protobuf::Message &&, CustomOrigin &&co={}, OpMonLevel l=to_level(EntryOpMonLevel::kDefault)) const noexcept

Private Attributes

std::atomic< bool > & m_run_marker
uint32_t m_this_apa_number
uint32_t m_this_link_number
uint64_t m_time_tick_diff
double m_dropout_rate
double m_frame_error_rate
std::atomic< int > m_packet_count { 0 }
std::atomic< int > m_packet_count_tot { 0 }
bool m_sender_is_set = false
std::shared_ptr< std::function< void(ReadoutType &&)> > m_raw_data_callback
std::unique_ptr< RateLimiter > m_rate_limiter
std::unique_ptr< FileSourceBuffer > m_file_source
ErrorBitGenerator m_error_bit_generator
utilities::ReusableThread m_producer_thread
std::string m_name
bool m_is_configured = false
double m_rate_khz
uint16_t m_frames_per_tick
std::vector< bool > m_dropouts
std::vector< bool > m_frame_errors
uint m_dropouts_length
uint m_frame_errors_length
daqdataformats::SourceID m_sourceid
int m_crateid
int m_slotid
int m_linkid
bool m_t0_now
bool m_generate_periodic_adc_pattern
SourceEmulatorPatternGenerator m_pattern_generator
uint32_t m_time_to_wait = 9768

Additional Inherited Members

Public Types inherited from dunedaq::opmonlib::MonitorableObject
using NodePtr = std::weak_ptr<MonitorableObject>
using NewNodePtr = std::shared_ptr<MonitorableObject>
using ElementId = std::string
Static Public Member Functions inherited from dunedaq::opmonlib::MonitorableObject
static bool publishable_metric (OpMonLevel entry, OpMonLevel system) noexcept
Public Attributes inherited from dunedaq::datahandlinglibs::SourceEmulatorConcept
const appmodel::DataMoveCallbackConf * m_sink_conf

Detailed Description

template<class ReadoutType>
class dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >

Definition at line 69 of file SourceEmulatorModel.hpp.

Constructor & Destructor Documentation

◆ SourceEmulatorModel()

template<class ReadoutType>
dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::SourceEmulatorModel ( std::string name,
std::atomic< bool > & run_marker,
uint64_t time_tick_diff,
double dropout_rate,
double frame_error_rate,
double rate_khz,
uint16_t frames_per_tick = 1 )
inlineexplicit

Definition at line 72 of file SourceEmulatorModel.hpp.

83 , m_packet_count{ 0 }
85 , m_name(name)
88 {
89 }

Member Function Documentation

◆ acquire_callback()

template<class ReadoutType>
void dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::acquire_callback ( )
overridevirtual

Implements dunedaq::datahandlinglibs::SourceEmulatorConcept.

Definition at line 23 of file SourceEmulatorModel.hxx.

24{
25 if (!m_sender_is_set) {
28 m_sender_is_set = true;
29 } else {
30 // ers::error();
31 }
32}
static std::shared_ptr< DataMoveCallbackRegistry > get()
std::shared_ptr< std::function< void(ReadoutType &&)> > m_raw_data_callback

◆ conf()

template<class ReadoutType>
void dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::conf ( const confmodel::DetectorStream * stream_conf,
const appmodel::StreamEmulationParameters * emu_conf )
virtual

Implements dunedaq::datahandlinglibs::SourceEmulatorConcept.

Definition at line 36 of file SourceEmulatorModel.hxx.

38{
39 if (m_is_configured) {
40 TLOG_DEBUG(TLVL_WORK_STEPS) << "This emulator is already configured!";
41 } else {
42 // m_conf = args.get<module_conf_t>();
43 // m_link_conf = link_conf.get<link_conf_t>();
44
45 std::mt19937 mt(rand()); // NOLINT(runtime/threadsafe_fn)
47
48 m_sourceid.id = link_conf->get_source_id();
50
51 m_crateid = link_conf->get_geo_id()->get_crate_id();
52 m_slotid = link_conf->get_geo_id()->get_slot_id();
53 m_linkid = link_conf->get_geo_id()->get_stream_id();
54
55 m_t0_now = emu_params->get_set_t0();
56 m_file_source = std::make_unique<FileSourceBuffer>(emu_params->get_input_file_size_limit(), sizeof(ReadoutType));
57 try {
58 m_file_source->read(emu_params->get_data_file_name());
59 } catch (const ers::Issue& ex) {
62 }
63 m_dropouts_length = emu_params->get_random_population_size();
64 if (m_dropout_rate == 0.0) {
66 } else {
68 }
69 for (size_t i = 0; i < m_dropouts.size(); ++i) {
71 }
72
73 m_frame_errors_length = emu_params->get_random_population_size();
74 m_frame_error_rate = emu_params->get_frame_error_rate_hz();
76 m_error_bit_generator.generate();
77
78 // Generate random ADC pattern
79 m_generate_periodic_adc_pattern = emu_params->get_generate_periodic_adc_pattern();
80 auto vec_size = emu_params->get_random_population_size();
82 TLOG() << "Generated pattern.";
84
85 if (emu_params->get_TP_rate_per_channel() != 0) {
86 TLOG() << "TP rate per channel multiplier (base of 100 Hz/ch): " << emu_params->get_TP_rate_per_channel();
87 // Define time to wait when adding an ADC above threshold
88 // Adding a hit every 9768 gives a total Sent TP rate of approx 100 Hz/wire with WIBEth
89 m_time_to_wait = m_time_to_wait / emu_params->get_TP_rate_per_channel();
90 }
91 }
92
93 m_is_configured = true;
94 }
95 // Configure thread:
96 m_producer_thread.set_name("fakeprod", m_sourceid.id);
97}
std::unique_ptr< FileSourceBuffer > m_file_source
void fatal(const Issue &issue)
Definition ers.hpp:111

◆ generate_opmon_data()

template<class ReadoutType>
void dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::generate_opmon_data ( )
overrideprotectedvirtual

Hook for customisable pubblication. The function can throw, exception will be caught by the monitoring thread

Reimplemented from dunedaq::opmonlib::MonitorableObject.

Definition at line 123 of file SourceEmulatorModel.hxx.

124{
126 info.set_sum_packets(m_packet_count_tot.load());
127 info.set_num_packets(m_packet_count.exchange(0));
128
129 this->publish(std::move(info));
130}
void publish(google::protobuf::Message &&, CustomOrigin &&co={}, OpMonLevel l=to_level(EntryOpMonLevel::kDefault)) const noexcept

◆ is_configured()

template<class ReadoutType>
bool dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::is_configured ( )
inlineoverridevirtual

Implements dunedaq::datahandlinglibs::SourceEmulatorConcept.

Definition at line 100 of file SourceEmulatorModel.hpp.

100{ return m_is_configured; }

◆ run_produce()

template<class ReadoutType>
void dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::run_produce ( )
protected

Definition at line 134 of file SourceEmulatorModel.hxx.

135{
136 TLOG_DEBUG(TLVL_WORK_STEPS) << "Data generation thread " << m_this_link_number << " started";
137
138 // pthread_setname_np(pthread_self(), get_name().c_str());
139
140 uint offset = 0; // NOLINT(build/unsigned)
141 auto& source = m_file_source->get();
142
143 uint num_elem = m_file_source->num_elements();
144 if (num_elem == 0) {
145 TLOG_DEBUG(TLVL_WORK_STEPS) << "No elements to read from buffer! Sleeping...";
147 num_elem = m_file_source->num_elements();
148 }
149
150 auto rptr = reinterpret_cast<ReadoutType*>(source.data()); // NOLINT
151
152 // set the initial timestamp to a configured value, otherwise just use the timestamp from the header
153 uint64_t ts_0 = rptr->get_timestamp(); // NOLINT(build/unsigned)
154 if (m_t0_now) {
155 auto time_now = std::chrono::system_clock::now().time_since_epoch();
156 uint64_t current_time = // NOLINT (build/unsigned)
158 // FIXME: where do I get the clockspeed from?
159 // ts_0 = (m_conf.clock_speed_hz / 100000) * current_time;
160 ts_0 = 625 * current_time / 10;
161 }
162 TLOG_DEBUG(TLVL_BOOKKEEPING) << "Using first timestamp: " << ts_0;
163 uint64_t timestamp = ts_0; // NOLINT(build/unsigned)
164 int dropout_index = 0;
166 // 64 total channels, placing on slot 0 gives 64 available slots.
167 const uint64_t max_tps_per_frame = 64;
168
169 while (m_run_marker.load()) {
170 // TLOG() << "Generating " << m_frames_per_tick << " for TS " << timestamp;
171 for (uint16_t i = 0; i < m_frames_per_tick; i++) {
172 // Which element to push to the buffer
173 if (offset == num_elem || (offset + 1) * sizeof(ReadoutType) > source.size()) {
174 offset = 0;
175 }
176
177 bool create_frame = m_dropouts[dropout_index]; // NOLINT(runtime/threadsafe_fn)
178 dropout_index = (dropout_index + 1) % m_dropouts.size();
179 if (create_frame) {
181 // Memcpy from file buffer to flat char array
182 ::memcpy(static_cast<void*>(&payload),
183 static_cast<void*>(source.data() + offset * sizeof(ReadoutType)),
184 sizeof(ReadoutType));
185
186 // Fake timestamp
187 payload.fake_timestamps(timestamp, m_time_tick_diff);
188
189 // Fake geoid
190 payload.fake_geoid(m_crateid, m_slotid, m_linkid);
191
192 // Introducing frame errors
193 std::vector<uint16_t> frame_errs; // NOLINT(build/unsigned)
194 for (size_t i = 0; i < rptr->get_num_frames(); ++i) {
195 frame_errs.push_back(m_error_bit_generator.next());
196 }
197 payload.fake_frame_errors(&frame_errs);
198
201
202 // Calculate how many TPs to generate in this frame
206 }
207
210 }
211
212 // Distribute TPs across channels via the pattern generator.
213 for (uint64_t tp_idx = 0; tp_idx < tps_this_frame; ++tp_idx) {
214 int channel = m_pattern_generator.get_channel_number();
215 // The pattern generator draws channel in range 0-63, current
216 // behaviour for frame type with 32 channels is silent dropping.
217 try {
218 payload.fake_adc_pattern(channel);
219 } catch (const std::out_of_range&) {
220 }
221 }
222
223 // Count the number of patterns attempted to inject. Prevents
224 // expected - generated deficit from accumulating in case of
225 // injection failure.
227 }
228
229 // send it
230 try {
231 (*m_raw_data_callback)(std::move(payload));
232 } catch (ers::Issue& excpt) {
233 ers::warning(CannotWriteToQueue(ERS_HERE, m_sourceid, "raw data input queue", excpt));
234 // std::runtime_error("Queue timed out...");
235 }
236
237 // Count packet and limit rate if needed.
238 ++offset;
241 }
242 }
243 timestamp += m_time_tick_diff * rptr->get_num_frames();
244
245 m_rate_limiter->limit();
246 }
247 TLOG_DEBUG(TLVL_WORK_STEPS) << "Data generation thread " << m_sourceid.to_string() << " finished";
248}
void warning(const Issue &issue)
Definition ers.hpp:150

◆ scrap()

template<class ReadoutType>
void dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::scrap ( const appfwk::DAQModule::CommandData_t & )
inlinevirtual

Implements dunedaq::datahandlinglibs::SourceEmulatorConcept.

Definition at line 95 of file SourceEmulatorModel.hpp.

96 {
97 m_file_source.reset();
98 m_is_configured = false;
99 }

◆ start()

template<class ReadoutType>
void dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::start ( const appfwk::DAQModule::CommandData_t & )
virtual

Implements dunedaq::datahandlinglibs::SourceEmulatorConcept.

Definition at line 101 of file SourceEmulatorModel.hxx.

102{
104 TLOG_DEBUG(TLVL_WORK_STEPS) << "Starting threads...";
105 // FIXME: don't know where to take the slowdown from... m_rate_limiter = std::make_unique<RateLimiter>(m_rate_khz /
106 // m_link_conf.slowdown);
108 // m_stats_thread.set_work(&SourceEmulatorModel<ReadoutType>::run_stats, this);
110}

◆ stop()

template<class ReadoutType>
void dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::stop ( const appfwk::DAQModule::CommandData_t & )
virtual

Implements dunedaq::datahandlinglibs::SourceEmulatorConcept.

Definition at line 114 of file SourceEmulatorModel.hxx.

115{
116 while (!m_producer_thread.get_readiness()) {
118 }
119}

Member Data Documentation

◆ m_crateid

template<class ReadoutType>
int dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::m_crateid
private

Definition at line 153 of file SourceEmulatorModel.hpp.

◆ m_dropout_rate

template<class ReadoutType>
double dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::m_dropout_rate
private

Definition at line 120 of file SourceEmulatorModel.hpp.

◆ m_dropouts

template<class ReadoutType>
std::vector<bool> dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::m_dropouts
private

Definition at line 147 of file SourceEmulatorModel.hpp.

◆ m_dropouts_length

template<class ReadoutType>
uint dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::m_dropouts_length
private

Definition at line 150 of file SourceEmulatorModel.hpp.

◆ m_error_bit_generator

template<class ReadoutType>
ErrorBitGenerator dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::m_error_bit_generator
private

Definition at line 138 of file SourceEmulatorModel.hpp.

◆ m_file_source

template<class ReadoutType>
std::unique_ptr<FileSourceBuffer> dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::m_file_source
private

Definition at line 137 of file SourceEmulatorModel.hpp.

◆ m_frame_error_rate

template<class ReadoutType>
double dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::m_frame_error_rate
private

Definition at line 121 of file SourceEmulatorModel.hpp.

◆ m_frame_errors

template<class ReadoutType>
std::vector<bool> dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::m_frame_errors
private

Definition at line 148 of file SourceEmulatorModel.hpp.

◆ m_frame_errors_length

template<class ReadoutType>
uint dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::m_frame_errors_length
private

Definition at line 151 of file SourceEmulatorModel.hpp.

◆ m_frames_per_tick

template<class ReadoutType>
uint16_t dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::m_frames_per_tick
private

Definition at line 145 of file SourceEmulatorModel.hpp.

◆ m_generate_periodic_adc_pattern

template<class ReadoutType>
bool dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::m_generate_periodic_adc_pattern
private

Definition at line 159 of file SourceEmulatorModel.hpp.

◆ m_is_configured

template<class ReadoutType>
bool dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::m_is_configured = false
private

Definition at line 143 of file SourceEmulatorModel.hpp.

◆ m_linkid

template<class ReadoutType>
int dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::m_linkid
private

Definition at line 155 of file SourceEmulatorModel.hpp.

◆ m_name

template<class ReadoutType>
std::string dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::m_name
private

Definition at line 142 of file SourceEmulatorModel.hpp.

◆ m_packet_count

template<class ReadoutType>
std::atomic<int> dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::m_packet_count { 0 }
private

Definition at line 124 of file SourceEmulatorModel.hpp.

◆ m_packet_count_tot

template<class ReadoutType>
std::atomic<int> dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::m_packet_count_tot { 0 }
private

Definition at line 125 of file SourceEmulatorModel.hpp.

◆ m_pattern_generator

template<class ReadoutType>
SourceEmulatorPatternGenerator dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::m_pattern_generator
private

Definition at line 160 of file SourceEmulatorModel.hpp.

◆ m_producer_thread

template<class ReadoutType>
utilities::ReusableThread dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::m_producer_thread
private

Definition at line 140 of file SourceEmulatorModel.hpp.

◆ m_rate_khz

template<class ReadoutType>
double dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::m_rate_khz
private

Definition at line 144 of file SourceEmulatorModel.hpp.

◆ m_rate_limiter

template<class ReadoutType>
std::unique_ptr<RateLimiter> dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::m_rate_limiter
private

Definition at line 136 of file SourceEmulatorModel.hpp.

◆ m_raw_data_callback

template<class ReadoutType>
std::shared_ptr<std::function<void(ReadoutType&&)> > dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::m_raw_data_callback
private

Definition at line 130 of file SourceEmulatorModel.hpp.

◆ m_run_marker

template<class ReadoutType>
std::atomic<bool>& dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::m_run_marker
private

Definition at line 113 of file SourceEmulatorModel.hpp.

◆ m_sender_is_set

template<class ReadoutType>
bool dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::m_sender_is_set = false
private

Definition at line 129 of file SourceEmulatorModel.hpp.

◆ m_slotid

template<class ReadoutType>
int dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::m_slotid
private

Definition at line 154 of file SourceEmulatorModel.hpp.

◆ m_sourceid

template<class ReadoutType>
daqdataformats::SourceID dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::m_sourceid
private

Definition at line 152 of file SourceEmulatorModel.hpp.

◆ m_t0_now

template<class ReadoutType>
bool dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::m_t0_now
private

Definition at line 157 of file SourceEmulatorModel.hpp.

◆ m_this_apa_number

template<class ReadoutType>
uint32_t dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::m_this_apa_number
private

Definition at line 116 of file SourceEmulatorModel.hpp.

◆ m_this_link_number

template<class ReadoutType>
uint32_t dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::m_this_link_number
private

Definition at line 117 of file SourceEmulatorModel.hpp.

◆ m_time_tick_diff

template<class ReadoutType>
uint64_t dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::m_time_tick_diff
private

Definition at line 119 of file SourceEmulatorModel.hpp.

◆ m_time_to_wait

template<class ReadoutType>
uint32_t dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::m_time_to_wait = 9768
private

Definition at line 162 of file SourceEmulatorModel.hpp.


The documentation for this class was generated from the following files: