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 set_sender (const appmodel::DataMoveCallbackConf *conf)
 
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.
 
SourceEmulatorConceptoperator= (const SourceEmulatorConcept &)=delete
 SourceEmulatorConcept is not copy-assginable.
 
 SourceEmulatorConcept (SourceEmulatorConcept &&)=delete
 SourceEmulatorConcept is not move-constructible.
 
SourceEmulatorConceptoperator= (SourceEmulatorConcept &&)=delete
 SourceEmulatorConcept is not move-assignable.
 
- Public Member Functions inherited from dunedaq::opmonlib::MonitorableObject
 MonitorableObject (const MonitorableObject &)=delete
 
MonitorableObjectoperator= (const MonitorableObject &)=delete
 
 MonitorableObject (MonitorableObject &&)=delete
 
MonitorableObjectoperator= (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< RateLimiterm_rate_limiter
 
std::unique_ptr< FileSourceBufferm_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< boolm_dropouts
 
std::vector< boolm_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
 
uint64_t m_pattern_generator_previous_ts
 
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
 

Detailed Description

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

Definition at line 68 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 71 of file SourceEmulatorModel.hpp.

79 , m_time_tick_diff(time_tick_diff)
80 , m_dropout_rate(dropout_rate)
81 , m_frame_error_rate(frame_error_rate)
82 , m_packet_count{ 0 }
84 , m_name(name)
85 , m_rate_khz(rate_khz)
86 ,m_frames_per_tick(frames_per_tick)
87 {}
std::atomic< bool > run_marker
Global atomic for process lifetime.

Member Function Documentation

◆ 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 35 of file SourceEmulatorModel.hxx.

36{
37 if (m_is_configured) {
38 TLOG_DEBUG(TLVL_WORK_STEPS) << "This emulator is already configured!";
39 } else {
40 //m_conf = args.get<module_conf_t>();
41 //m_link_conf = link_conf.get<link_conf_t>();
42
43 std::mt19937 mt(rand()); // NOLINT(runtime/threadsafe_fn)
44 std::uniform_real_distribution<double> dis(0.0, 1.0);
45
46 m_sourceid.id = link_conf->get_source_id();
47 m_sourceid.subsystem = ReadoutType::subsystem;
48
49 m_crateid = link_conf->get_geo_id()->get_crate_id();
50 m_slotid = link_conf->get_geo_id()->get_slot_id();
51 m_linkid = link_conf->get_geo_id()->get_stream_id();
52
53 m_t0_now = emu_params->get_set_t0();
54 m_file_source = std::make_unique<FileSourceBuffer>(emu_params->get_input_file_size_limit(), sizeof(ReadoutType));
55 try {
56 m_file_source->read(emu_params->get_data_file_name());
57 } catch (const ers::Issue& ex) {
58 ers::fatal(ex);
59 throw ConfigurationError(ERS_HERE, m_sourceid, "", ex);
60 }
61 m_dropouts_length = emu_params->get_random_population_size();
62 if (m_dropout_rate == 0.0) {
63 m_dropouts = std::vector<bool>(1);
64 } else {
65 m_dropouts = std::vector<bool>(m_dropouts_length);
66 }
67 for (size_t i = 0; i < m_dropouts.size(); ++i) {
68 m_dropouts[i] = dis(mt) >= m_dropout_rate;
69 }
70
71 m_frame_errors_length = emu_params->get_random_population_size();
72 m_frame_error_rate = emu_params->get_frame_error_rate_hz();
73 m_error_bit_generator = ErrorBitGenerator(m_frame_error_rate);
75
76 // Generate random ADC pattern
77 m_generate_periodic_adc_pattern = emu_params->get_generate_periodic_adc_pattern();
78 auto vec_size = emu_params->get_random_population_size();
80 TLOG() << "Generated pattern.";
82
83 if (emu_params->get_TP_rate_per_channel() != 0) {
84 TLOG() << "TP rate per channel multiplier (base of 100 Hz/ch): " << emu_params->get_TP_rate_per_channel();
85 // Define time to wait when adding an ADC above threshold
86 // Adding a hit every 9768 gives a total Sent TP rate of approx 100 Hz/wire with WIBEth
87 m_time_to_wait = m_time_to_wait / emu_params->get_TP_rate_per_channel();
88 }
89 }
90
91 m_is_configured = true;
92 }
93 // Configure thread:
95}
#define ERS_HERE
std::unique_ptr< FileSourceBuffer > m_file_source
void set_name(const std::string &name, int tid)
Base class for any user define issue.
Definition Issue.hpp:69
#define TLOG_DEBUG(lvl,...)
Definition Logging.hpp:112
#define TLOG(...)
Definition macro.hpp:22
void fatal(const Issue &issue)
Definition ers.hpp:88
Subsystem subsystem
The general subsystem of the source of the data.
Definition SourceID.hpp:69
ID_t id
Unique identifier of the source of the data.
Definition SourceID.hpp:74

◆ 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 120 of file SourceEmulatorModel.hxx.

121{
122 opmon::DataSourceInfo info;
123 info.set_sum_packets(m_packet_count_tot.load());
124 info.set_num_packets(m_packet_count.exchange(0));
125
126 this->publish(std::move(info));
127}
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 98 of file SourceEmulatorModel.hpp.

98{ return m_is_configured; }

◆ run_produce()

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

Definition at line 131 of file SourceEmulatorModel.hxx.

132{
133 TLOG_DEBUG(TLVL_WORK_STEPS) << "Data generation thread " << m_this_link_number << " started";
134
135 // pthread_setname_np(pthread_self(), get_name().c_str());
136
137 uint offset = 0; // NOLINT(build/unsigned)
138 auto& source = m_file_source->get();
139
140 uint num_elem = m_file_source->num_elements();
141 if (num_elem == 0) {
142 TLOG_DEBUG(TLVL_WORK_STEPS) << "No elements to read from buffer! Sleeping...";
143 std::this_thread::sleep_for(std::chrono::milliseconds(100));
144 num_elem = m_file_source->num_elements();
145 }
146
147 auto rptr = reinterpret_cast<ReadoutType*>(source.data()); // NOLINT
148
149 // set the initial timestamp to a configured value, otherwise just use the timestamp from the header
150 uint64_t ts_0 = rptr->get_timestamp(); // NOLINT(build/unsigned)
151 if (m_t0_now) {
152 auto time_now = std::chrono::system_clock::now().time_since_epoch();
153 uint64_t current_time = // NOLINT (build/unsigned)
154 std::chrono::duration_cast<std::chrono::microseconds>(time_now).count();
155 // FIXME: where do I get the clockspeed from?
156 // ts_0 = (m_conf.clock_speed_hz / 100000) * current_time;
157 ts_0 = 625 * current_time / 10;
158
159 }
160 TLOG_DEBUG(TLVL_BOOKKEEPING) << "Using first timestamp: " << ts_0;
161 uint64_t timestamp = ts_0; // NOLINT(build/unsigned)
162 int dropout_index = 0;
163
164 while (m_run_marker.load()) {
165 // TLOG() << "Generating " << m_frames_per_tick << " for TS " << timestamp;
166 for (uint16_t i = 0; i < m_frames_per_tick; i++) {
167 // Which element to push to the buffer
168 if (offset == num_elem || (offset + 1) * sizeof(ReadoutType) > source.size()) {
169 offset = 0;
170 }
171
172 bool create_frame = m_dropouts[dropout_index]; // NOLINT(runtime/threadsafe_fn)
173 dropout_index = (dropout_index + 1) % m_dropouts.size();
174 if (create_frame) {
176 // Memcpy from file buffer to flat char array
177 ::memcpy(static_cast<void*>(&payload),
178 static_cast<void*>(source.data() + offset * sizeof(ReadoutType)),
179 sizeof(ReadoutType));
180
181 // Fake timestamp
182 payload.fake_timestamps(timestamp, m_time_tick_diff);
183
184 // Fake geoid
185 payload.fake_geoid(m_crateid, m_slotid, m_linkid);
186
187 // Introducing frame errors
188 std::vector<uint16_t> frame_errs; // NOLINT(build/unsigned)
189 for (size_t i = 0; i < rptr->get_num_frames(); ++i) {
190 frame_errs.push_back(m_error_bit_generator.next());
191 }
192 payload.fake_frame_errors(&frame_errs);
193
196
197 /* Reset the pattern from the beginning if it reaches the maximum
198 m_pattern_index++;
199 if (m_pattern_index == m_pattern_generator.get_total_size()) {
200 m_pattern_index = 0;
201 }
202 */
203 // Set the ADC to the uint16 maximum value
204 try {
206 }
207 catch (std::exception & ex) {
208 //FIXME: should not happen
209 }
210
211 //TLOG() << "Lift channel " << channel;
212
213 // Update the previous timestamp of the pattern generator
215
216 } // timestamp difference
217 }
218
219 // send it
220 try {
221 (*m_raw_data_callback)(std::move(payload));
222 } catch (ers::Issue& excpt) {
223 ers::warning(CannotWriteToQueue(ERS_HERE, m_sourceid, "raw data input queue", excpt));
224 // std::runtime_error("Queue timed out...");
225 }
226
227 // Count packet and limit rate if needed.
228 ++offset;
231
232
233 }
234 }
235 timestamp += m_time_tick_diff * rptr->get_num_frames();
236
237
238
239 m_rate_limiter->limit();
240 }
241 TLOG_DEBUG(TLVL_WORK_STEPS) << "Data generation thread " << m_sourceid.to_string() << " finished";
242}
double offset
ReadoutType
Which type of readout to use for TriggerDecision and DataRequest.
Definition Types.hpp:57
void warning(const Issue &issue)
Definition ers.hpp:115
std::string to_string() const
Definition SourceID.hpp:83

◆ scrap()

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

Implements dunedaq::datahandlinglibs::SourceEmulatorConcept.

Definition at line 93 of file SourceEmulatorModel.hpp.

94 {
95 m_file_source.reset();
96 m_is_configured = false;
97 }

◆ set_sender()

template<class ReadoutType >
void dunedaq::datahandlinglibs::SourceEmulatorModel< ReadoutType >::set_sender ( const appmodel::DataMoveCallbackConf * conf)
virtual

Implements dunedaq::datahandlinglibs::SourceEmulatorConcept.

Definition at line 23 of file SourceEmulatorModel.hxx.

24{
25 if (!m_sender_is_set) {
27 m_sender_is_set = true;
28 } else {
29 // ers::error();
30 }
31}
static std::shared_ptr< DataMoveCallbackRegistry > get()
void conf(const confmodel::DetectorStream *stream_conf, const appmodel::StreamEmulationParameters *emu_conf)
std::shared_ptr< std::function< void(ReadoutType &&)> > m_raw_data_callback

◆ start()

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

Implements dunedaq::datahandlinglibs::SourceEmulatorConcept.

Definition at line 99 of file SourceEmulatorModel.hxx.

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

◆ stop()

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

Implements dunedaq::datahandlinglibs::SourceEmulatorConcept.

Definition at line 111 of file SourceEmulatorModel.hxx.

112{
114 std::this_thread::sleep_for(std::chrono::milliseconds(100));
115 }
116}

Member Data Documentation

◆ m_crateid

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

Definition at line 151 of file SourceEmulatorModel.hpp.

◆ m_dropout_rate

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

Definition at line 118 of file SourceEmulatorModel.hpp.

◆ m_dropouts

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

Definition at line 145 of file SourceEmulatorModel.hpp.

◆ m_dropouts_length

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

Definition at line 148 of file SourceEmulatorModel.hpp.

◆ m_error_bit_generator

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

Definition at line 136 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 135 of file SourceEmulatorModel.hpp.

◆ m_frame_error_rate

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

Definition at line 119 of file SourceEmulatorModel.hpp.

◆ m_frame_errors

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

Definition at line 146 of file SourceEmulatorModel.hpp.

◆ m_frame_errors_length

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

Definition at line 149 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 143 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 157 of file SourceEmulatorModel.hpp.

◆ m_is_configured

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

Definition at line 141 of file SourceEmulatorModel.hpp.

◆ m_linkid

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

Definition at line 153 of file SourceEmulatorModel.hpp.

◆ m_name

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

Definition at line 140 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 122 of file SourceEmulatorModel.hpp.

122{ 0 };

◆ m_packet_count_tot

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

Definition at line 123 of file SourceEmulatorModel.hpp.

123{ 0 };

◆ m_pattern_generator

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

Definition at line 158 of file SourceEmulatorModel.hpp.

◆ m_pattern_generator_previous_ts

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

Definition at line 159 of file SourceEmulatorModel.hpp.

◆ m_producer_thread

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

Definition at line 138 of file SourceEmulatorModel.hpp.

◆ m_rate_khz

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

Definition at line 142 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 134 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 128 of file SourceEmulatorModel.hpp.

◆ m_run_marker

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

Definition at line 111 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 127 of file SourceEmulatorModel.hpp.

◆ m_slotid

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

Definition at line 152 of file SourceEmulatorModel.hpp.

◆ m_sourceid

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

Definition at line 150 of file SourceEmulatorModel.hpp.

◆ m_t0_now

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

Definition at line 155 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 114 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 115 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 117 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 161 of file SourceEmulatorModel.hpp.


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