DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
triggeralgs::TriggerActivityMakerSWIFT Class Reference

#include <TAMakerSWIFTAlgorithm.hpp>

Inheritance diagram for triggeralgs::TriggerActivityMakerSWIFT:
[legend]
Collaboration diagram for triggeralgs::TriggerActivityMakerSWIFT:
[legend]

Public Member Functions

void process (const TriggerPrimitive &input_tp, std::vector< TriggerActivity > &output_tas) override
 TP processing function that creates & fills TAs.
void configure (const nlohmann::json &config)
void set_ta_attributes ()
void flush (timestamp_t until, std::vector< TriggerActivity > &output_tas) override
bool preprocess (const TriggerPrimitive &input_tp)
 TP pre-processing/filtering.
Public Member Functions inherited from triggeralgs::TriggerActivityMaker
virtual ~TriggerActivityMaker ()=default
void operator() (const TriggerPrimitive &input_tp, std::vector< TriggerActivity > &output_ta)
virtual void postprocess (std::vector< TriggerActivity > &output_ta)
 Post-processing/filtering of the TAs, e.g. prescale.

Private Types

enum class  WindowDecision { kReject , kInspect , kAccept }

Private Member Functions

void close_window (std::vector< TriggerActivity > &output_tas)
void reset_window_state (uint64_t new_window_start)
uint64_t extract_dominant_cluster_energy (const std::vector< TriggerPrimitive > &tps, float eps, int min_samples)

Private Attributes

TriggerActivity m_current_ta
uint64_t m_window_length
uint64_t m_inspect_energy_threshold_sadc
uint64_t m_accept_energy_threshold_sadc
uint16_t m_min_adc_peak
uint16_t m_min_samples_over_threshold
float m_cm_per_tick
float m_wire_pitch
int m_db_min_samples
float m_db_eps
uint64_t m_cluster_energy_cut_sadc
bool m_initialised = false
uint64_t m_window_start = 0
uint64_t m_window_energy_sadc = 0
uint16_t m_tp_count = 0

Additional Inherited Members

Public Attributes inherited from triggeralgs::TriggerActivityMaker
std::atomic< uint64_t > m_data_vs_system_time = 0
std::atomic< uint64_t > m_initial_offset = 0
uint64_t m_prescale = 1
 Configurable prescale factor.
uint64_t m_ta_count = 0
 TA made count for prescaling.
uint32_t m_max_samples_over_threshold = std::numeric_limits<uint32_t>::max()
 Time-over-threshold TP filtering.

Detailed Description

Definition at line 17 of file TAMakerSWIFTAlgorithm.hpp.

Member Enumeration Documentation

◆ WindowDecision

Enumerator
kReject 
kInspect 
kAccept 

Definition at line 58 of file TAMakerSWIFTAlgorithm.hpp.

58{ kReject, kInspect, kAccept };

Member Function Documentation

◆ close_window()

void triggeralgs::TriggerActivityMakerSWIFT::close_window ( std::vector< TriggerActivity > & output_tas)
private

Definition at line 95 of file TAMakerSWIFTAlgorithm.cpp.

95 {
96
97 if (m_current_ta.inputs.empty()) return;
98
99 //Prompt window categorisatoin : immidiate accept, inspect, reject based on local energy in window
100 WindowDecision decision;
103 else return; // Reject
104
105 // cluster inspect cases
106 if (decision == WindowDecision::kInspect) {
107 const uint64_t max_cluster_energy = extract_dominant_cluster_energy(m_current_ta.inputs, m_db_eps, m_db_min_samples);
108 if (max_cluster_energy <= m_cluster_energy_cut_sadc) return; // reject window if it didn't pass inspection
109 }
110
111 // Emit TA: should only reach this step if dealing with Accept, or Inspect windows that passed clustering
113 output_tas.push_back(m_current_ta);
114 }
uint64_t extract_dominant_cluster_energy(const std::vector< TriggerPrimitive > &tps, float eps, int min_samples)

◆ configure()

void triggeralgs::TriggerActivityMakerSWIFT::configure ( const nlohmann::json & config)
virtual

Reimplemented from triggeralgs::TriggerActivityMaker.

Definition at line 13 of file TAMakerSWIFTAlgorithm.cpp.

14 {
15 //window settings
16 m_window_length = config.value("window_length", 32000); // in DTS ticks (32 * 1000 readout ticks @ 500ns/tick)
17 m_inspect_energy_threshold_sadc = config.value("inspect_energy_threshold_sadc", 15000);
18 m_accept_energy_threshold_sadc = config.value("accept_energy_threshold_sadc", 55000);
19
20 //tp filtering settings
21 m_min_adc_peak = config.value("min_adc_peak", 80); //ADC
22 m_min_samples_over_threshold = config.value("min_samples_over_threshold", 256); // 8 * 32 DTS ticks while still using TPv1 FIXME
23
24 //clustering
25 //these depend on detector properties. default values for HD
26 m_cm_per_tick = config.value("cm_per_tick", 0.016 * 0.16); // sampling rate [us/tick] * drift velocity [cm/us]
27 m_wire_pitch = config.value("wire_pitch", 0.48); // cm
28 m_db_min_samples = config.value("min_samples", 2); //min. number of TPs for valid cluster
29 m_db_eps = config.value("epsilon", 2); //dbscan search radius in cm
30 m_cluster_energy_cut_sadc = config.value("cluster_energy_cut_sadc", 22000); // min energy of dominant cluster eng. in window for acceptance
31
32 assert(m_window_length > 0);
33 }

◆ extract_dominant_cluster_energy()

uint64_t triggeralgs::TriggerActivityMakerSWIFT::extract_dominant_cluster_energy ( const std::vector< TriggerPrimitive > & tps,
float eps,
int min_samples )
private

Definition at line 121 of file TAMakerSWIFTAlgorithm.cpp.

121 {
122
123 struct Point {
124 float z;
125 float t;
126 uint64_t adc;
127 };
128
129 //since time and channel are in different units, express TPs as points in unified coordinate system (z,t)
130 std::vector<Point> points;
131 points.reserve(tps.size());
132 for (const auto& tp : tps) {
133 points.push_back({tp.channel * m_wire_pitch, (tp.time_start - m_window_start) * m_cm_per_tick, tp.adc_integral});
134 }
135
136 const int N = points.size(); //number of elements to cluster
137 int cluster_id = 0;
138 std::vector<int> labels(N, -1); // initialise all labels to noise for now
139 std::vector<uint8_t> visited(N, 0);
140 float eps2 = eps * eps; //clustering radius
141
142 for (int i = 0; i < N; ++i) {
143 if (visited[i]) continue;
144 visited[i] = 1;
145
146 std::vector<int> neigh;
147 const float zi = points[i].z;
148 const float ti = points[i].t;
149 for (int j = 0; j < N; ++j) {
150 float dz = points[j].z - zi;
151 float dt = points[j].t - ti;
152 if (dz*dz + dt*dt <= eps2) neigh.push_back(j);
153 }
154
155 if (neigh.size() < static_cast<size_t>(min_samples)) {
156 labels[i] = -1;
157 continue;
158 }
159
160 labels[i] = cluster_id;
161
162 size_t k = 0;
163 while (k < neigh.size()) {
164 int j = neigh[k];
165
166 if (!visited[j]) {
167 visited[j] = 1;
168
169 std::vector<int> neigh2;
170 const float zj = points[j].z;
171 const float tj = points[j].t;
172 for (int m = 0; m < N; ++m) {
173 float dz = points[m].z - zj;
174 float dt = points[m].t - tj;
175 if (dz*dz + dt*dt <= eps2) neigh2.push_back(m);
176 }
177 if (neigh2.size() >= static_cast<size_t>(min_samples)) {
178 for (int m : neigh2) {
179 if (std::find(neigh.begin(), neigh.end(), m) == neigh.end())
180 neigh.push_back(m);
181 }
182 }
183 }
184
185 if (labels[j] == -1) labels[j] = cluster_id;
186 ++k;
187 }
188 ++cluster_id;
189 }
190
191 // once clusters are formed, calculate the energies
192 std::vector<uint64_t> cluster_sums(cluster_id, 0);
193 for (int i = 0; i < N; ++i) {
194 if (labels[i] >= 0) cluster_sums[labels[i]] += points[i].adc;
195 }
196 //return dominant cluster energy in window
197 if (cluster_sums.empty()) return 0;
198 return *std::max_element(cluster_sums.begin(), cluster_sums.end());
199 }

◆ flush()

void triggeralgs::TriggerActivityMakerSWIFT::flush ( timestamp_t until,
std::vector< TriggerActivity > & output_tas )
overridevirtual

Reimplemented from triggeralgs::TriggerActivityMaker.

Definition at line 238 of file TAMakerSWIFTAlgorithm.cpp.

239 {
240 if (!m_initialised) return;
241 close_window(output_tas);
242 }
void close_window(std::vector< TriggerActivity > &output_tas)

◆ preprocess()

bool triggeralgs::TriggerActivityMakerSWIFT::preprocess ( const TriggerPrimitive & input_tp)
virtual

TP pre-processing/filtering.

Takes a TP and returns true or false depending whether we want to process that TP into a TA algorithm.

Todo

: Implement tp-filtering, e.g. SOT, plane, channel and whatnot

: Implement something smarter & more efficient if no filtering: vector of functions, or c-o-c

Parameters
[in]intput_tpinput TP reference for filtering
Returns
bool true if we want to keep the TP

Reimplemented from triggeralgs::TriggerActivityMaker.

Definition at line 36 of file TAMakerSWIFTAlgorithm.cpp.

36 {
37 if ((input_tp.adc_peak < m_min_adc_peak) && (input_tp.samples_over_threshold < m_min_samples_over_threshold )) {
38 return false;
39 }
40 return true;
41 }

◆ process()

void triggeralgs::TriggerActivityMakerSWIFT::process ( const TriggerPrimitive & input_tp,
std::vector< TriggerActivity > & output_ta )
overridevirtual

TP processing function that creates & fills TAs.

Parameters
input_tp[in]Input TP for the triggering algorithm
output_ta[out]Output vector of TAs to fill by the algorithm

Implements triggeralgs::TriggerActivityMaker.

Definition at line 54 of file TAMakerSWIFTAlgorithm.cpp.

55 {
56
57 // Apply TP filtering
58 if (!preprocess(input_tp)) {
59 return;
60 }
61
62 // If TP is valid, determine which window this TP belongs to
63 const uint64_t tp_window_start = (input_tp.time_start / m_window_length) * m_window_length;
64
65 // Initialise on first TP
66 if (!m_initialised) {
67
68 //create TA instance once at run start
70
71 //reset window state
72 reset_window_state(tp_window_start);
73 m_initialised = true;
74 }
75
76 //if TP belongs to past window (already closed), reject it (not ideal)
77 if (tp_window_start < m_window_start){
78 return;
79 }
80
81 //if TP belongs to future window, close existing TA and start a new one at current time
82 if (tp_window_start > m_window_start){
83 close_window(output_tas);
84 reset_window_state(tp_window_start);
85 }
86
87 //If we got here, the TP belongs to the current window
88 m_current_ta.inputs.push_back(input_tp);
89 m_window_energy_sadc += input_tp.adc_integral;
90 ++m_tp_count;
91 }
bool preprocess(const TriggerPrimitive &input_tp)
TP pre-processing/filtering.
void reset_window_state(uint64_t new_window_start)

◆ reset_window_state()

void triggeralgs::TriggerActivityMakerSWIFT::reset_window_state ( uint64_t new_window_start)
private

Definition at line 44 of file TAMakerSWIFTAlgorithm.cpp.

44 {
45 m_window_start = new_window_start;
47 m_tp_count = 0;
49 m_current_ta.time_start = m_window_start;
50 }

◆ set_ta_attributes()

void triggeralgs::TriggerActivityMakerSWIFT::set_ta_attributes ( )

Definition at line 203 of file TAMakerSWIFTAlgorithm.cpp.

204 {
205 m_current_ta.time_start = m_window_start;
207 m_current_ta.adc_integral = m_window_energy_sadc;
208
209 const TriggerPrimitive& first_tp = m_current_ta.inputs.front();
210 m_current_ta.detid = first_tp.detid;
213
214
215 dunedaq::trgdataformats::channel_t min_ch = first_tp.channel;
216 dunedaq::trgdataformats::channel_t max_ch = first_tp.channel;
217
218 // Peak quantities
219 m_current_ta.adc_peak = 0;
220 for (const auto& tp : m_current_ta.inputs) {
221 if (tp.channel < min_ch) min_ch = tp.channel;
222 if (tp.channel > max_ch) max_ch = tp.channel;
223
224 if (tp.adc_peak > m_current_ta.adc_peak) {
225 m_current_ta.adc_peak = tp.adc_peak;
226 m_current_ta.channel_peak = tp.channel;
227 m_current_ta.time_peak = tp.time_start;
228 }
229 }
230
231 m_current_ta.channel_start = min_ch;
232 m_current_ta.channel_end = max_ch;
233 m_current_ta.time_activity = m_current_ta.time_peak;
234
235 }
dunedaq::trgdataformats::TriggerPrimitive TriggerPrimitive

Member Data Documentation

◆ m_accept_energy_threshold_sadc

uint64_t triggeralgs::TriggerActivityMakerSWIFT::m_accept_energy_threshold_sadc
private

Definition at line 35 of file TAMakerSWIFTAlgorithm.hpp.

◆ m_cluster_energy_cut_sadc

uint64_t triggeralgs::TriggerActivityMakerSWIFT::m_cluster_energy_cut_sadc
private

Definition at line 46 of file TAMakerSWIFTAlgorithm.hpp.

◆ m_cm_per_tick

float triggeralgs::TriggerActivityMakerSWIFT::m_cm_per_tick
private

Definition at line 42 of file TAMakerSWIFTAlgorithm.hpp.

◆ m_current_ta

TriggerActivity triggeralgs::TriggerActivityMakerSWIFT::m_current_ta
private

Definition at line 27 of file TAMakerSWIFTAlgorithm.hpp.

◆ m_db_eps

float triggeralgs::TriggerActivityMakerSWIFT::m_db_eps
private

Definition at line 45 of file TAMakerSWIFTAlgorithm.hpp.

◆ m_db_min_samples

int triggeralgs::TriggerActivityMakerSWIFT::m_db_min_samples
private

Definition at line 44 of file TAMakerSWIFTAlgorithm.hpp.

◆ m_initialised

bool triggeralgs::TriggerActivityMakerSWIFT::m_initialised = false
private

Definition at line 52 of file TAMakerSWIFTAlgorithm.hpp.

◆ m_inspect_energy_threshold_sadc

uint64_t triggeralgs::TriggerActivityMakerSWIFT::m_inspect_energy_threshold_sadc
private

Definition at line 34 of file TAMakerSWIFTAlgorithm.hpp.

◆ m_min_adc_peak

uint16_t triggeralgs::TriggerActivityMakerSWIFT::m_min_adc_peak
private

Definition at line 38 of file TAMakerSWIFTAlgorithm.hpp.

◆ m_min_samples_over_threshold

uint16_t triggeralgs::TriggerActivityMakerSWIFT::m_min_samples_over_threshold
private

Definition at line 39 of file TAMakerSWIFTAlgorithm.hpp.

◆ m_tp_count

uint16_t triggeralgs::TriggerActivityMakerSWIFT::m_tp_count = 0
private

Definition at line 55 of file TAMakerSWIFTAlgorithm.hpp.

◆ m_window_energy_sadc

uint64_t triggeralgs::TriggerActivityMakerSWIFT::m_window_energy_sadc = 0
private

Definition at line 54 of file TAMakerSWIFTAlgorithm.hpp.

◆ m_window_length

uint64_t triggeralgs::TriggerActivityMakerSWIFT::m_window_length
private

Definition at line 33 of file TAMakerSWIFTAlgorithm.hpp.

◆ m_window_start

uint64_t triggeralgs::TriggerActivityMakerSWIFT::m_window_start = 0
private

Definition at line 53 of file TAMakerSWIFTAlgorithm.hpp.

◆ m_wire_pitch

float triggeralgs::TriggerActivityMakerSWIFT::m_wire_pitch
private

Definition at line 43 of file TAMakerSWIFTAlgorithm.hpp.


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