38#include <toml++/toml.h>
79constexpr const char *default_names[] = {
80 "FIRST_FRAMES",
"TIMING",
"TRACKING",
81 "RING_FOUND",
"STREAMING_RING_FOUND",
83 "START_OF_SPILL",
"UNKNOWN"};
86constexpr int n_default_triggers = std::size(all_default_triggers);
96 for (
int i = 0; i < n_default_triggers; ++i)
97 if (all_default_triggers[i] == t)
189 std::vector<std::pair<uint8_t, std::string>>
triggers;
204 for (
const auto &t : config_triggers)
205 triggers.push_back({t.index, t.name});
206 for (
int i = 0; i < n_default_triggers; ++i)
207 triggers.push_back({all_default_triggers[i], default_names[i]});
221 for (
int i = 0; i < static_cast<int>(triggers.size()); ++i)
222 if (triggers[i].first == trigger_value)
225 std::cerr <<
"[WARN] trigger_registry: unknown trigger value "
226 <<
static_cast<int>(trigger_value)
227 <<
" — falling back to UNKNOWN\n";
236 std::string
name_of(uint8_t trigger_value)
const
238 return triggers[index_of(trigger_value)].second;
242 int size()
const {
return static_cast<int>(triggers.size()); }
254 for (
int i = 0; i < static_cast<int>(triggers.size()); ++i)
256 h->GetXaxis()->SetBinLabel(i + 1, triggers[i].second.c_str());
257 h->GetYaxis()->SetBinLabel(i + 1, triggers[i].second.c_str());
293inline std::vector<trigger_config>
296 std::vector<trigger_config> triggers;
301 tbl = toml::parse_file(config_file);
303 catch (
const toml::parse_error &e)
305 std::cerr <<
"[ERROR] Failed to parse trigger config \"" << config_file
306 <<
"\": " << e.description() <<
"\n";
310 std::cout <<
"[INFO] Loaded trigger config: " << config_file <<
"\n";
312 auto arr = tbl.get_as<toml::array>(
"trigger");
315 std::cerr <<
"[WARN] No [[trigger]] entries found in \"" << config_file <<
"\"\n";
321 bool used_indices[100] = {};
324 auto earliest_free = [&]() ->
int
326 for (
int i = 0; i < 100; ++i)
327 if (!used_indices[i])
332 for (
const auto &node : *arr)
334 const auto *entry = node.as_table();
339 if (!entry->contains(
"name") || !entry->contains(
"index") ||
340 !entry->contains(
"device") || !entry->contains(
"delay"))
342 std::cerr <<
"[WARN] Skipping incomplete [[trigger]] entry (missing required key)\n";
347 cfg.
name = entry->at(
"name").value_or(std::string{});
348 uint16_t raw_index =
static_cast<uint16_t
>(entry->at(
"index").value_or(0));
349 cfg.
device =
static_cast<uint16_t
>(entry->at(
"device").value_or(0));
350 cfg.
delay =
static_cast<uint16_t
>(entry->at(
"delay").value_or(0));
355 bool out_of_range = raw_index > 99;
356 bool duplicate = !out_of_range && used_indices[raw_index];
358 if (out_of_range || duplicate)
360 int free_slot = earliest_free();
363 std::cerr <<
"[ERROR] \"" << cfg.
name <<
"\""
364 << (duplicate ?
" has duplicate index " :
" has out-of-range index ")
366 <<
" and no free slot remains in [0, 99] — entry dropped\n";
370 std::cerr <<
"[WARN] \"" << cfg.
name <<
"\""
371 << (duplicate ?
" has duplicate index " :
" has out-of-range index ")
372 << raw_index <<
" (valid range: 0-99, unique)"
373 <<
" — reassigned to earliest available index " << free_slot <<
"\n";
374 raw_index =
static_cast<uint16_t
>(free_slot);
377 cfg.
index =
static_cast<uint8_t
>(raw_index);
378 used_indices[cfg.
index] =
true;
379 triggers.push_back(cfg);
381 std::cout <<
"[INFO] " << cfg.
name
382 <<
" | index=" <<
static_cast<int>(cfg.
index)
383 <<
" | device=" << cfg.
device
384 <<
" | delay=" << cfg.
delay <<
"\n";
Static configuration for a single trigger channel, loaded from TOML.
Definition triggers.h:153
uint8_t index
Trigger index in [0, 99] used in the data stream.
Definition triggers.h:155
std::string name
Human-readable trigger label (e.g. "luca_and_finger")
Definition triggers.h:154
uint16_t delay
Delay applied to this trigger channel (DAQ units)
Definition triggers.h:156
uint16_t device
Hardware device ID that produces this trigger.
Definition triggers.h:157
trigger_config(const std::string &_name, uint8_t _index, uint16_t _delay, uint16_t _device)
Construct from all fields.
Definition triggers.h:168
Per-event trigger data attached to a decoded data frame.
Definition triggers.h:114
float fine_time
Fine timestamp correction (ns)
Definition triggers.h:117
uint8_t index
Hardware trigger index.
Definition triggers.h:115
uint16_t coarse
Coarse timestamp (DAQ clock ticks)
Definition triggers.h:116
trigger_event(uint8_t idx)
Construct with index only; timestamps default to zero.
Definition triggers.h:125
trigger_event(uint8_t idx, uint16_t crs, float fine)
Construct with all fields.
Definition triggers.h:142
trigger_event(uint8_t idx, uint16_t crs)
Construct with index and coarse timestamp.
Definition triggers.h:133
Runtime lookup table that maps trigger values to names and positions.
Definition triggers.h:187
std::string name_of(uint8_t trigger_value) const
Returns the name associated with a trigger value.
Definition triggers.h:236
int index_of(uint8_t trigger_value) const
Returns the registry position for a given trigger value.
Definition triggers.h:219
trigger_registry(const std::vector< trigger_config > &config_triggers)
Build the registry from a list of config-defined triggers.
Definition triggers.h:202
int size() const
Definition triggers.h:242
void label_axes(TH2F *h) const
Labels both axes of a 2D ROOT histogram with trigger names.
Definition triggers.h:252
std::vector< std::pair< uint8_t, std::string > > triggers
Ordered list of {trigger value, name} pairs.
Definition triggers.h:189
constexpr int default_trigger_index(trigger_number t)
Returns the index of a trigger in the default table at compile time.
Definition triggers.h:94
std::vector< trigger_config > trigger_conf_reader(const std::string &config_file="Data/triggers.toml")
Reads trigger configuration from a TOML file.
Definition triggers.h:294
trigger_number
Enumeration of known hardware trigger types.
Definition triggers.h:55
@ _TRIGGER_FIRST_FRAMES_
First frames of a run.
Definition triggers.h:56
@ _TRIGGER_RING_FOUND_
Ring-finding trigger.
Definition triggers.h:59
@ _TRIGGER_HOUGH_RING_FOUND_
Hough-transform ring-finding trigger.
Definition triggers.h:61
@ _TRIGGER_TIMING_
Timing trigger.
Definition triggers.h:57
@ _TRIGGER_STREAMING_RING_FOUND_
Streaming ring-finding trigger.
Definition triggers.h:60
@ _TRIGGER_TRACKING_
Tracking trigger.
Definition triggers.h:58
@ _TRIGGER_UNKNOWN_
Unknown / unmapped trigger.
Definition triggers.h:63
@ _TRIGGER_START_OF_SPILL_
Start-of-spill signal.
Definition triggers.h:62