DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
trigger_record.cpp
Go to the documentation of this file.
1
8
11
12#include <pybind11/pybind11.h>
13#include <pybind11/stl.h>
14
15#include <memory>
16#include <sstream>
17#include <vector>
18
19namespace py = pybind11;
20
22
23void
25{
26 py::class_<TriggerRecordHeader>(m, "TriggerRecordHeader", pybind11::buffer_protocol())
27 .def(py::init<std::vector<ComponentRequest> const&>())
28 .def(py::init([](py::capsule capsule, bool copy_from_buffer) {
29 return std::make_unique<TriggerRecordHeader>(capsule.get_pointer(), copy_from_buffer);
30 }))
31 .def(py::init<TriggerRecordHeader const&>())
32 .def("get_header", &TriggerRecordHeader::get_header)
33 .def("get_trigger_number", &TriggerRecordHeader::get_trigger_number)
34 //.def("set_trigger_number", &TriggerRecordHeader::set_trigger_number)
35 .def("get_trigger_timestamp", &TriggerRecordHeader::get_trigger_timestamp)
36 //.def("set_trigger_timestamp", &TriggerRecordHeader::set_trigger_timestamp)
37 .def("get_num_requested_components", &TriggerRecordHeader::get_num_requested_components)
38 .def("get_run_number", &TriggerRecordHeader::get_run_number)
39 //.def("set_run_number", &TriggerRecordHeader::set_run_number)
40 .def("get_status_bits", &TriggerRecordHeader::get_status_bits)
41 //.def("set_status_bits", &TriggerRecordHeader::set_status_bits)
42 .def("get_status_bit", &TriggerRecordHeader::get_status_bit)
43 //.def("set_status_bit", &TriggerRecordHeader::set_status_bit)
44 .def("get_trigger_type", &TriggerRecordHeader::get_trigger_type)
45 //.def("set_trigger_type", &TriggerRecordHeader::set_trigger_type)
46 .def("get_sequence_number", &TriggerRecordHeader::get_sequence_number)
47 //.def("set_sequence_number", &TriggerRecordHeader::set_sequence_number)
48 .def("get_max_sequence_number", &TriggerRecordHeader::get_max_sequence_number)
49 //.def("set_max_sequence_number", &TriggerRecordHeader::set_max_sequence_number)
50 .def("get_total_size_bytes", &TriggerRecordHeader::get_total_size_bytes)
51 .def(
52 "get_storage_location", &TriggerRecordHeader::get_storage_location, py::return_value_policy::reference_internal)
53 .def("get_element_id", &TriggerRecordHeader::get_element_id)
54 .def("get_component_for_source_id",
56 py::return_value_policy::reference_internal)
57 .def("at", &TriggerRecordHeader::at)
58 .def("__getitem__", &TriggerRecordHeader::at, py::return_value_policy::reference_internal);
59
60 py::class_<TriggerRecordHeaderData>(m, "TriggerRecordHeaderData")
61 .def(py::init<>())
62 .def_property_readonly_static("s_trigger_record_header_magic",
63 [](const py::object&) -> uint32_t { // NOLINT(build/unsigned)
65 })
66 .def_property_readonly_static("s_trigger_record_header_version",
67 [](const py::object&) -> uint32_t { // NOLINT(build/unsigned)
69 })
70 .def_property_readonly_static("s_invalid_number_components",
71 [](const py::object&) -> uint64_t { // NOLINT(build/unsigned)
73 })
74 .def_property_readonly_static("s_default_status_bits",
75 [](const py::object&) -> uint32_t { // NOLINT(build/unsigned)
77 })
78 .def_property_readonly("trigger_record_header_marker",
79 [](const TriggerRecordHeaderData& self) -> uint32_t { // NOLINT(build/unsigned)
81 })
82 .def_property_readonly(
83 "version", [](const TriggerRecordHeaderData& self) -> uint32_t { return self.version; }) // NOLINT(build/unsigned)
84 .def_property_readonly("trigger_number",
85 [](const TriggerRecordHeaderData& self) -> trigger_number_t { return self.trigger_number; })
86 .def_property_readonly("trigger_timestamp",
87 [](const TriggerRecordHeaderData& self) -> timestamp_t { return self.trigger_timestamp; })
88 .def_property_readonly("num_requested_components",
89 [](const TriggerRecordHeaderData& self) -> uint64_t { // NOLINT(build/unsigned)
90 return self.num_requested_components;
91 })
92 .def_property_readonly("run_number",
93 [](const TriggerRecordHeaderData& self) -> run_number_t { return self.run_number; })
94 .def_property_readonly(
95 "status_bits",
96 [](const TriggerRecordHeaderData& self) -> uint32_t { return self.status_bits; }) // NOLINT(build/unsigned)
97 .def_property_readonly("trigger_type",
98 [](const TriggerRecordHeaderData& self) -> trigger_type_t { return self.trigger_type; })
99 .def_property_readonly(
100 "sequence_number", [](const TriggerRecordHeaderData& self) -> sequence_number_t { return self.sequence_number; })
101 .def_property_readonly(
102 "max_sequence_number",
103 [](const TriggerRecordHeaderData& self) -> sequence_number_t { return self.max_sequence_number; })
104 .def_property_readonly("element_id",
105 [](const TriggerRecordHeaderData& self) -> SourceID { return self.element_id; })
106 .def("__str__",
107 [](const TriggerRecordHeaderData& hdr) {
108 std::ostringstream oss;
109 oss << hdr;
110 return oss.str();
111 })
112 .def("__repr__", [](const TriggerRecordHeaderData& hdr) {
113 std::ostringstream oss;
114 oss << "<daqdataformats::TriggerRecordHeaderData " << hdr << ">";
115 return oss.str();
116 });
117
118 py::enum_<TriggerRecordStatusBits>(m, "TriggerRecordStatusBits")
119 .value("kIncomplete", TriggerRecordStatusBits::kIncomplete)
120 .value("kMismatch", TriggerRecordStatusBits::kMismatch)
121 .value("kUnassigned2", TriggerRecordStatusBits::kUnassigned2)
122 .value("kUnassigned3", TriggerRecordStatusBits::kUnassigned3)
123 .value("kUnassigned4", TriggerRecordStatusBits::kUnassigned4)
124 .value("kUnassigned5", TriggerRecordStatusBits::kUnassigned5)
125 .value("kUnassigned6", TriggerRecordStatusBits::kUnassigned6)
126 .value("kUnassigned7", TriggerRecordStatusBits::kUnassigned7)
127 .value("kUnassigned8", TriggerRecordStatusBits::kUnassigned8)
128 .value("kUnassigned9", TriggerRecordStatusBits::kUnassigned9)
129 .value("kUnassigned10", TriggerRecordStatusBits::kUnassigned10)
130 .value("kUnassigned11", TriggerRecordStatusBits::kUnassigned11)
131 .value("kUnassigned12", TriggerRecordStatusBits::kUnassigned12)
132 .value("kUnassigned13", TriggerRecordStatusBits::kUnassigned13)
133 .value("kUnassigned14", TriggerRecordStatusBits::kUnassigned14)
134 .value("kUnassigned15", TriggerRecordStatusBits::kUnassigned15)
135 .value("kUnassigned16", TriggerRecordStatusBits::kUnassigned16)
136 .value("kUnassigned17", TriggerRecordStatusBits::kUnassigned17)
137 .value("kUnassigned18", TriggerRecordStatusBits::kUnassigned18)
138 .value("kUnassigned19", TriggerRecordStatusBits::kUnassigned19)
139 .value("kUnassigned20", TriggerRecordStatusBits::kUnassigned20)
140 .value("kUnassigned21", TriggerRecordStatusBits::kUnassigned21)
141 .value("kUnassigned22", TriggerRecordStatusBits::kUnassigned22)
142 .value("kUnassigned23", TriggerRecordStatusBits::kUnassigned23)
143 .value("kUnassigned24", TriggerRecordStatusBits::kUnassigned24)
144 .value("kUnassigned25", TriggerRecordStatusBits::kUnassigned25)
145 .value("kUnassigned26", TriggerRecordStatusBits::kUnassigned26)
146 .value("kUnassigned27", TriggerRecordStatusBits::kUnassigned27)
147 .value("kUnassigned28", TriggerRecordStatusBits::kUnassigned28)
148 .value("kUnassigned29", TriggerRecordStatusBits::kUnassigned29)
149 .value("kUnassigned30", TriggerRecordStatusBits::kUnassigned30)
150 .value("kUnassigned31", TriggerRecordStatusBits::kUnassigned31)
151 .value("kInvalid", TriggerRecordStatusBits::kInvalid);
152
153 py::class_<TriggerRecord> py_trigger_record(m, "TriggerRecord", pybind11::buffer_protocol());
154 py_trigger_record.def(py::init<TriggerRecordHeader const&>())
155 .def(py::init<std::vector<ComponentRequest> const&>())
156 .def(
157 "get_header_ref",
158 [](TriggerRecord& self) { return self.get_header_ref(); },
159 py::return_value_policy::reference_internal)
160 .def("get_header_data", &TriggerRecord::get_header_data)
161 .def(
162 "get_fragments_ref",
163 [](TriggerRecord& self) {
164 auto fragments = py::list();
165 for (auto& fragment : self.get_fragments_ref()) {
166 auto py_fragment = py::cast(*fragment, py::return_value_policy::reference);
167 fragments.append(py_fragment);
168 }
169 return fragments;
170 },
171 py::return_value_policy::reference_internal)
172 .def("get_total_size_bytes", &TriggerRecord::get_total_size_bytes);
173} // NOLINT
174
175} // namespace dunedaq::daqdataformats::python
const ComponentRequest & at(size_t idx) const
Access ComponentRequest by index.
size_t get_total_size_bytes() const
Get the total size of the TriggerRecordHeader, including header and all component requests.
const void * get_storage_location() const
Get read-only access to the underlying flat data array.
ComponentRequest const & get_component_for_source_id(SourceID const &source_id) const
Access ComponentRequest by SourceID.
SourceID get_element_id() const
Get the SourceID for this TriggerRecordHeader.
bool get_status_bit(TriggerRecordStatusBits bit) const
Get the value of the given status bit.
C++ Representation of a DUNE TriggerRecord, consisting of a TriggerRecordHeader object and a vector o...
TriggerRecordHeaderData get_header_data() const
size_t get_total_size_bytes() const
Get size of trigger record from underlying TriggerRecordHeader and Fragments.
void register_trigger_record(py::module &)
uint64_t trigger_number_t
Definition Types.hpp:18
@ kMismatch
We have as many fragments as requested but they do not match the requested components.
@ kIncomplete
Indicates a trigger record that is missing requested components.
@ kInvalid
Status bit 32 and higher are not valid (status_bits is only 32 bits).
uint16_t sequence_number_t
Type used to represent sequence within a trigger record.
Definition Types.hpp:38
uint64_t timestamp_t
Type used to represent DUNE timing system timestamps.
Definition Types.hpp:26
uint64_t trigger_type_t
Type used to represent Trigger Decision trigger types.
Definition Types.hpp:35
SourceID is a generalized representation of the source of a piece of data in the DAQ....
Definition SourceID.hpp:32
Data fields associated with a TriggerRecordHeader.
sequence_number_t max_sequence_number
Maximum sequence number of TriggerRecords corresponding to this trigger.
sequence_number_t sequence_number
Sequence number of this TriggerRecord within the trigger response.
timestamp_t trigger_timestamp
Timestamp of the TriggerDecision.
uint64_t num_requested_components
Number of ComponentRequest objects stored in the TriggerRecordHeader.
trigger_type_t trigger_type
Type of the TriggerDecision.
static constexpr uint32_t s_trigger_record_header_magic
Magic bytes used to identify a TriggerRecordHeaderData struct in a raw data stream.