DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
dunedaq::trigger::HSISourceModel Class Reference

#include <HSISourceModel.hpp>

Inheritance diagram for dunedaq::trigger::HSISourceModel:
[legend]
Collaboration diagram for dunedaq::trigger::HSISourceModel:
[legend]

Public Types

using inherited = datahandlinglibs::SourceConcept
Public Types inherited from dunedaq::opmonlib::MonitorableObject
using NodePtr = std::weak_ptr<MonitorableObject>
using NewNodePtr = std::shared_ptr<MonitorableObject>
using ElementId = std::string

Public Member Functions

 HSISourceModel ()
 SourceModel Constructor.
 ~HSISourceModel () override
void init (const confmodel::DaqModule *cfg) override
void start ()
void stop ()
bool handle_payload (dfmessages::HSIEvent &data)
void generate_opmon_data () override
void print_opmon_stats ()
Public Member Functions inherited from dunedaq::datahandlinglibs::SourceConcept
 SourceConcept ()
virtual ~SourceConcept ()
 SourceConcept (const SourceConcept &)=delete
 SourceConcept is not copy-constructible.
SourceConcept & operator= (const SourceConcept &)=delete
 SourceConcept is not copy-assginable.
 SourceConcept (SourceConcept &&)=delete
 SourceConcept is not move-constructible.
SourceConcept & operator= (SourceConcept &&)=delete
 SourceConcept is not move-assignable.
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

Private Types

using source_t = dunedaq::iomanager::ReceiverConcept<dfmessages::HSIEvent>
using sink_t = dunedaq::iomanager::SenderConcept<triggeralgs::TriggerCandidate>
using metric_counter_type = uint64_t

Private Attributes

std::shared_ptr< source_t > m_data_receiver
std::shared_ptr< sink_t > m_data_sender
std::map< uint32_t, HSISignal > m_signals
 map of HSI signal ID bits to TC output configurations
std::atomic< metric_counter_type > m_received_events_count { 0 }
std::atomic< metric_counter_type > m_tcs_made_count { 0 }
std::atomic< metric_counter_type > m_tcs_sent_count { 0 }
std::atomic< metric_counter_type > m_tcs_dropped_count { 0 }
uint64_t m_prescale
 {rescale for the input HSIEvents, default 1
std::atomic< bool > m_running_flag { false }
std::atomic< bool > m_latency_monitoring { false }
dunedaq::trigger::Latency m_latency_instance
std::atomic< metric_counter_type > m_latency_in { 0 }
std::atomic< metric_counter_type > m_latency_out { 0 }

Additional Inherited Members

Static Public Member Functions inherited from dunedaq::opmonlib::MonitorableObject
static bool publishable_metric (OpMonLevel entry, OpMonLevel system) noexcept
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

Detailed Description

Definition at line 44 of file HSISourceModel.hpp.

Member Typedef Documentation

◆ inherited

◆ metric_counter_type

Definition at line 228 of file HSISourceModel.hpp.

◆ sink_t

◆ source_t

Constructor & Destructor Documentation

◆ HSISourceModel()

dunedaq::trigger::HSISourceModel::HSISourceModel ( )
inline

SourceModel Constructor.

Parameters
nameInstance name for this SourceModel instance

Definition at line 53 of file HSISourceModel.hpp.

54 : datahandlinglibs::SourceConcept()
55 {
56 }

◆ ~HSISourceModel()

dunedaq::trigger::HSISourceModel::~HSISourceModel ( )
inlineoverride

Definition at line 57 of file HSISourceModel.hpp.

58 {
59 m_data_receiver.reset();
60 m_data_sender.reset();
61 m_signals.clear();
62 }
std::shared_ptr< sink_t > m_data_sender
std::map< uint32_t, HSISignal > m_signals
map of HSI signal ID bits to TC output configurations
std::shared_ptr< source_t > m_data_receiver

Member Function Documentation

◆ generate_opmon_data()

void dunedaq::trigger::HSISourceModel::generate_opmon_data ( )
inlineoverridevirtual

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

Reimplemented from dunedaq::opmonlib::MonitorableObject.

Definition at line 185 of file HSISourceModel.hpp.

186 {
187 opmon::HSISourceModelInfo info;
188
189 info.set_received_events_count(m_received_events_count);
190 info.set_tcs_made_count(m_tcs_made_count);
191 info.set_tcs_sent_count(m_tcs_sent_count);
192 info.set_tcs_dropped_count(m_tcs_dropped_count);
193
194 this->publish(std::move(info));
195
196 if (m_latency_monitoring.load() && m_running_flag.load()) {
197 opmon::TriggerLatency lat_info;
198
199 lat_info.set_latency_in(m_latency_instance.get_latency_in());
200 lat_info.set_latency_out(m_latency_instance.get_latency_out());
201
202 this->publish(std::move(lat_info));
203 }
204 }
void publish(google::protobuf::Message &&, CustomOrigin &&co={}, OpMonLevel l=to_level(EntryOpMonLevel::kDefault)) const noexcept
std::atomic< metric_counter_type > m_tcs_made_count
std::atomic< bool > m_latency_monitoring
std::atomic< metric_counter_type > m_received_events_count
dunedaq::trigger::Latency m_latency_instance
std::atomic< metric_counter_type > m_tcs_sent_count
std::atomic< metric_counter_type > m_tcs_dropped_count
latency get_latency_in() const
Definition Latency.hpp:49
latency get_latency_out() const
Definition Latency.hpp:52

◆ handle_payload()

bool dunedaq::trigger::HSISourceModel::handle_payload ( dfmessages::HSIEvent & data)
inline

Definition at line 132 of file HSISourceModel.hpp.

133 {
135 if (m_latency_monitoring.load())
137
138 // Prescale after n-hsi received
140 return true;
141 }
142
143 TLOG_DEBUG(1) << "Received HSIEvent with signal map " << data.signal_map << " and timestamp " << data.timestamp;
144
145 // Iterate over all the signals
146 uint32_t signal_map = data.signal_map;
147 while (signal_map) {
148 // Get the index of the least significant bit
149 int bit_index = __builtin_ctzll(signal_map);
150 uint32_t signal = 1 << bit_index;
151
152 // Throw an error if we don't have this signal bit configured
153 if (!m_signals.count(signal)) {
154 throw dunedaq::trigger::SignalTypeError(ERS_HERE, "HSI subscriber", data.signal_map);
155 }
156
157 // Create the trigger candidate
158 triggeralgs::TriggerCandidate candidate;
159 candidate.time_start = data.timestamp - m_signals[signal].time_before;
160 candidate.time_end = data.timestamp + m_signals[signal].time_after;
161 candidate.time_candidate = data.timestamp;
162 // throw away bits 31-16 of header, that's OK for now
163 candidate.detid = (uint)detdataformats::DetID::Subdetector::kDAQ; // NOLINT(build/unsigned)
164 candidate.type = m_signals[signal].type;
166 candidate.inputs = {};
168
169 if (m_latency_monitoring.load())
171 // Send the TC
172 if (!m_data_sender->try_send(std::move(candidate), iomanager::Sender::s_no_block)) {
174 } else {
176 }
177
178 // Clear the least significant bit
179 signal_map &= signal_map - 1;
180 }
181
182 return true;
183 }
#define ERS_HERE
static constexpr timeout_t s_no_block
Definition Sender.hpp:26
uint64_t m_prescale
{rescale for the input HSIEvents, default 1
void update_latency_out(uint64_t latency)
Definition Latency.hpp:46
void update_latency_in(uint64_t latency)
Definition Latency.hpp:43
#define TLOG_DEBUG(lvl,...)
Definition Logging.hpp:116
std::vector< dunedaq::trgdataformats::TriggerActivityData > inputs

◆ init()

void dunedaq::trigger::HSISourceModel::init ( const confmodel::DaqModule * cfg)
inlineoverridevirtual

Implements dunedaq::datahandlinglibs::SourceConcept.

Definition at line 64 of file HSISourceModel.hpp.

65 {
66 if (cfg->get_outputs().size() != 1) {
67 throw datahandlinglibs::InitializationError(ERS_HERE, "Only 1 output supported for subscribers");
68 }
69 m_data_sender = get_iom_sender<triggeralgs::TriggerCandidate>(cfg->get_outputs()[0]->UID());
70
71 if (cfg->get_inputs().size() != 1) {
72 throw datahandlinglibs::InitializationError(ERS_HERE, "Only 1 input supported for subscribers");
73 }
74 m_data_receiver = get_iom_receiver<dfmessages::HSIEvent>(cfg->get_inputs()[0]->UID());
75 auto data_reader = cfg->cast<appmodel::DataSubscriberModule>();
76 if (data_reader == nullptr) {
77 throw datahandlinglibs::InitializationError(ERS_HERE, "DAQ module is not a DataReader");
78 }
79 auto hsi_conf = data_reader->get_configuration()->cast<appmodel::HSI2TCTranslatorConf>();
80 if (hsi_conf == nullptr) {
81 throw datahandlinglibs::InitializationError(ERS_HERE, "Missing HSI2TCTranslatorConf");
82 }
83
84 // Get the HSI-signal to TC-output map
85 for (auto win : hsi_conf->get_signals()) {
87 tc_type = static_cast<triggeralgs::TriggerCandidate::Type>(
89
90 // Throw error if unknown TC type
92 throw datahandlinglibs::InitializationError(ERS_HERE, "Provided an unknown TC type output to HSISourceModel");
93 }
94
95 // Throw error if already exists
96 uint32_t signal = win->get_signal_type();
97 if (m_signals.count(signal)) {
98 throw datahandlinglibs::InitializationError(
99 ERS_HERE, "Provided more than one of the same HSI signal ID input to HSISourceModel");
100 }
101
102 // Fill the signal-tctype map
103 m_signals[signal] = { tc_type, win->get_time_before(), win->get_time_after() };
104
105 TLOG() << "Will cover HSI signal id: " << signal << " to TC type: " << win->get_tc_type_name()
106 << " window before: " << win->get_time_before() << " window after: " << win->get_time_after();
107 }
108
109 m_prescale = hsi_conf->get_prescale();
110 m_latency_monitoring.store(hsi_conf->get_latency_monitoring());
111 }
#define TLOG(...)
Definition macro.hpp:21
TriggerCandidateData::Type string_to_trigger_candidate_type(const std::string &name)

◆ print_opmon_stats()

void dunedaq::trigger::HSISourceModel::print_opmon_stats ( )
inline

Definition at line 206 of file HSISourceModel.hpp.

207 {
208 TLOG() << "HSI Source Model opmon counters summary:";
209 TLOG() << "------------------------------";
210 TLOG() << "Signals received: \t" << m_received_events_count;
211 TLOG() << "TCs made: \t\t" << m_tcs_made_count;
212 TLOG() << "TCs sent: \t\t" << m_tcs_sent_count;
213 TLOG() << "TCs dropped: \t\t" << m_tcs_dropped_count;
214 TLOG();
215 }

◆ start()

void dunedaq::trigger::HSISourceModel::start ( )
inlinevirtual

Implements dunedaq::datahandlinglibs::SourceConcept.

Definition at line 113 of file HSISourceModel.hpp.

114 {
115 m_data_receiver->add_callback(std::bind(&HSISourceModel::handle_payload, this, std::placeholders::_1));
116
117 m_running_flag.store(true);
118
120 m_tcs_made_count.store(0);
121 m_tcs_sent_count.store(0);
122 m_tcs_dropped_count.store(0);
123 }
bool handle_payload(dfmessages::HSIEvent &data)

◆ stop()

void dunedaq::trigger::HSISourceModel::stop ( )
inlinevirtual

Implements dunedaq::datahandlinglibs::SourceConcept.

Definition at line 125 of file HSISourceModel.hpp.

126 {
127 m_data_receiver->remove_callback();
128 m_running_flag.store(false);
130 }

Member Data Documentation

◆ m_data_receiver

std::shared_ptr<source_t> dunedaq::trigger::HSISourceModel::m_data_receiver
private

Definition at line 219 of file HSISourceModel.hpp.

◆ m_data_sender

std::shared_ptr<sink_t> dunedaq::trigger::HSISourceModel::m_data_sender
private

Definition at line 222 of file HSISourceModel.hpp.

◆ m_latency_in

std::atomic<metric_counter_type> dunedaq::trigger::HSISourceModel::m_latency_in { 0 }
private

Definition at line 241 of file HSISourceModel.hpp.

◆ m_latency_instance

dunedaq::trigger::Latency dunedaq::trigger::HSISourceModel::m_latency_instance
private

Definition at line 240 of file HSISourceModel.hpp.

◆ m_latency_monitoring

std::atomic<bool> dunedaq::trigger::HSISourceModel::m_latency_monitoring { false }
private

Definition at line 239 of file HSISourceModel.hpp.

◆ m_latency_out

std::atomic<metric_counter_type> dunedaq::trigger::HSISourceModel::m_latency_out { 0 }
private

Definition at line 242 of file HSISourceModel.hpp.

◆ m_prescale

uint64_t dunedaq::trigger::HSISourceModel::m_prescale
private

{rescale for the input HSIEvents, default 1

Definition at line 235 of file HSISourceModel.hpp.

◆ m_received_events_count

std::atomic<metric_counter_type> dunedaq::trigger::HSISourceModel::m_received_events_count { 0 }
private

Definition at line 229 of file HSISourceModel.hpp.

◆ m_running_flag

std::atomic<bool> dunedaq::trigger::HSISourceModel::m_running_flag { false }
private

Definition at line 238 of file HSISourceModel.hpp.

◆ m_signals

std::map<uint32_t, HSISignal> dunedaq::trigger::HSISourceModel::m_signals
private

map of HSI signal ID bits to TC output configurations

Definition at line 225 of file HSISourceModel.hpp.

◆ m_tcs_dropped_count

std::atomic<metric_counter_type> dunedaq::trigger::HSISourceModel::m_tcs_dropped_count { 0 }
private

Definition at line 232 of file HSISourceModel.hpp.

◆ m_tcs_made_count

std::atomic<metric_counter_type> dunedaq::trigger::HSISourceModel::m_tcs_made_count { 0 }
private

Definition at line 230 of file HSISourceModel.hpp.

◆ m_tcs_sent_count

std::atomic<metric_counter_type> dunedaq::trigger::HSISourceModel::m_tcs_sent_count { 0 }
private

Definition at line 231 of file HSISourceModel.hpp.


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