DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
dunedaq::daqdataformats::python Namespace Reference

Functions

void register_component_request (py::module &m)
void register_fragment (py::module &m)
void register_sourceid (py::module &)
void register_trigger_record (py::module &)
void register_timeslice (py::module &)
 PYBIND11_MODULE (_daq_daqdataformats_py, m)

Function Documentation

◆ PYBIND11_MODULE()

dunedaq::daqdataformats::python::PYBIND11_MODULE ( _daq_daqdataformats_py ,
m  )

Definition at line 27 of file module.cpp.

28{
29
30 m.doc() = "c++ implementation of the dunedaq daqdataformats modules"; // optional module docstring
31
37}
void register_fragment(py::module &m)
Definition fragment.cpp:23
void register_trigger_record(py::module &)
void register_timeslice(py::module &)
void register_component_request(py::module &m)
void register_sourceid(py::module &)
Definition sourceid.cpp:22

◆ register_component_request()

void dunedaq::daqdataformats::python::register_component_request ( py::module & m)

Definition at line 21 of file component_request.cpp.

22{
23
24 py::class_<ComponentRequest>(m, "ComponentRequest")
25 .def(py::init())
26 .def(py::init<SourceID const&, timestamp_t const&, timestamp_t const&>())
27 .def("__str__",
28 [](const ComponentRequest& cr) {
29 std::ostringstream oss;
30 oss << cr;
31 return oss.str();
32 })
33 .def("__repr__",
34 [](const ComponentRequest& cr) {
35 std::ostringstream oss;
36 oss << "<daqdataformats::ComponentRequest " << cr << ">";
37 return oss.str();
38 })
39 .def_readonly_static("s_component_request_version", &ComponentRequest::s_component_request_version)
40 .def_readonly("version", &ComponentRequest::version)
41 .def_readonly("unused", &ComponentRequest::unused)
42 .def_readonly("component", &ComponentRequest::component)
43 .def_readonly("window_begin", &ComponentRequest::window_begin)
44 .def_readonly("window_end", &ComponentRequest::window_end);
45}
A request sent to a Component, including the SourceID of the component and the window offset and widt...
uint32_t unused
Padding to ensure 64b alignment // NOLINT(build/unsigned).
timestamp_t window_end
End of the data collection window.
static constexpr uint32_t s_component_request_version
SourceID component
The ID of the Requested Component.
timestamp_t window_begin
Start of the data collection window.

◆ register_fragment()

void dunedaq::daqdataformats::python::register_fragment ( py::module & m)

Definition at line 23 of file fragment.cpp.

24{
25
26 py::class_<Fragment> py_fragment(m, "Fragment", py::buffer_protocol());
27
28 py_fragment.def("get_header", &Fragment::get_header, py::return_value_policy::reference_internal)
29 .def("get_storage_location", &Fragment::get_storage_location, py::return_value_policy::reference_internal)
30 .def("get_trigger_number", &Fragment::get_trigger_number)
31 .def("get_run_number", &Fragment::get_run_number)
32 .def("get_trigger_timestamp", &Fragment::get_trigger_timestamp)
33 .def("get_window_begin", &Fragment::get_window_begin)
34 .def("get_window_end", &Fragment::get_window_end)
35 .def("get_element_id", &Fragment::get_element_id)
36 .def("get_detector_id", &Fragment::get_detector_id)
37 .def("get_status_bits", [](Fragment& self) { return self.get_status_bits().to_ullong(); })
38 .def("get_status_bit", &Fragment::get_status_bit)
39 .def("get_fragment_type_code", &Fragment::get_fragment_type_code)
40 .def("get_fragment_type", &Fragment::get_fragment_type)
41 .def("get_sequence_number", &Fragment::get_sequence_number)
42 .def("get_size", &Fragment::get_size)
43 .def("get_data_size", &Fragment::get_data_size)
44 .def(
45 "get_data",
46 [](Fragment& self, size_t offset) {
47 return static_cast<void*>(static_cast<char*>(self.get_data()) + offset); // NOLINT
48 },
49 "offset"_a = 0,
50 py::return_value_policy::reference_internal)
51 .def(
52 "get_data_bytes",
53 [](Fragment* self, size_t offset) -> py::bytes {
54 if (offset > self->get_data_size()) {
55 throw std::runtime_error("Fragment.get_data_bytes: offset exceeds fragment size.");
56 }
57 size_t bytes_size = self->get_data_size() - offset;
58 return py::bytes(reinterpret_cast<char*>(self->get_data()) + offset, bytes_size); // NOLINT
59 },
60 "offset"_a = 0,
61 py::return_value_policy::reference_internal);
62
63 py::enum_<Fragment::BufferAdoptionMode>(py_fragment, "BufferAdoptionMode")
64 .value("kTakeOverBuffer", Fragment::BufferAdoptionMode::kTakeOverBuffer)
65 .value("kCopyFromBuffer", Fragment::BufferAdoptionMode::kCopyFromBuffer)
66 .export_values();
67
68 py::class_<FragmentHeader>(m, "FragmentHeader")
69 .def(py::init<>())
70 .def_property_readonly_static(
71 "s_fragment_header_marker",
72 [](const py::object&) -> uint32_t { return FragmentHeader::s_fragment_header_marker; }) // NOLINT(build/unsigned)
73 .def_property_readonly_static(
74 "s_fragment_header_version",
75 [](const py::object&) -> uint32_t { return FragmentHeader::s_fragment_header_version; }) // NOLINT(build/unsigned)
76 .def_property_readonly_static(
77 "s_default_status_bits",
78 [](const py::object&) -> uint32_t { return FragmentHeader::s_default_status_bits; }) // NOLINT(build/unsigned)
79 .def_property_readonly(
80 "fragment_header_marker",
81 [](const FragmentHeader& self) -> uint32_t { return self.fragment_header_marker; }) // NOLINT(build/unsigned)
82 .def_property_readonly(
83 "version", [](const FragmentHeader& self) -> uint32_t { return self.version; }) // NOLINT(build/unsigned)
84 .def_property_readonly("size", [](const FragmentHeader& self) -> fragment_size_t { return self.size; })
85 .def_property_readonly("trigger_number",
86 [](const FragmentHeader& self) -> trigger_number_t { return self.trigger_number; })
87 .def_property_readonly("trigger_timestamp",
88 [](const FragmentHeader& self) -> timestamp_t { return self.trigger_timestamp; })
89 .def_property_readonly("window_begin", [](const FragmentHeader& self) -> timestamp_t { return self.window_begin; })
90 .def_property_readonly("window_end", [](const FragmentHeader& self) -> timestamp_t { return self.window_end; })
91 .def_property_readonly("run_number", [](const FragmentHeader& self) -> run_number_t { return self.run_number; })
92 .def_property_readonly(
93 "status_bits", [](const FragmentHeader& self) -> uint32_t { return self.status_bits; }) // NOLINT(build/unsigned)
94 .def_property_readonly("fragment_type",
95 [](const FragmentHeader& self) -> fragment_type_t { return self.fragment_type; })
96 .def_property_readonly("sequence_number",
97 [](const FragmentHeader& self) -> sequence_number_t { return self.sequence_number; })
98 .def_property_readonly(
99 "detector_id", [](const FragmentHeader& self) -> uint16_t { return self.detector_id; }) // NOLINT(build/unsigned)
100 .def_property_readonly("element_id", [](const FragmentHeader& self) -> SourceID { return self.element_id; })
101
102 .def_static("sizeof", []() { return sizeof(FragmentHeader); })
103 .def("__str__",
104 [](const FragmentHeader& hdr) {
105 std::ostringstream oss;
106 oss << hdr;
107 return oss.str();
108 })
109 .def("__repr__", [](const FragmentHeader& hdr) {
110 std::ostringstream oss;
111 oss << "<daqdataformats::FragmentHeader " << hdr << ">";
112 return oss.str();
113 });
114
115 py::enum_<FragmentStatusBits>(m, "FragmentStatusBits")
116 .value("kLatencyBufferEmpty", FragmentStatusBits::kLatencyBufferEmpty)
117 .value("kIncomplete", FragmentStatusBits::kIncomplete)
118 .value("kInvalidRequestWindow", FragmentStatusBits::kInvalidRequestWindow)
119 .value("kRequestTimeout", FragmentStatusBits::kRequestTimeout)
120 .value("kRequestWindowBeforeBuffer", FragmentStatusBits::kRequestWindowBeforeBuffer)
121 .value("kRequestWindowAfterBuffer", FragmentStatusBits::kRequestWindowAfterBuffer)
122 .value("kEmptyFragment", FragmentStatusBits::kEmptyFragment)
123 // TODO, Alessandro Thea <thea@github.com> Oct-31-2021: Add unassigned
124 .export_values();
125
126 py::enum_<FragmentType>(m, "FragmentType")
127 .value("kUnknown", FragmentType::kUnknown)
128 .value("kProtoWIB", FragmentType::kProtoWIB)
129 .value("kWIB", FragmentType::kWIB)
130 .value("kDAPHNE", FragmentType::kDAPHNE)
131 .value("kTDE_AMC", FragmentType::kTDE_AMC)
132 .value("kFW_TriggerPrimitive", FragmentType::kFW_TriggerPrimitive)
133 .value("kTriggerPrimitive", FragmentType::kTriggerPrimitive)
134 .value("kTriggerActivity", FragmentType::kTriggerActivity)
135 .value("kTriggerCandidate", FragmentType::kTriggerCandidate)
136 .value("kHardwareSignal", FragmentType::kHardwareSignal)
137 .value("kPACMAN", FragmentType::kPACMAN)
138 .value("kWIBEth", FragmentType::kWIBEth)
139 .value("kMPD", FragmentType::kMPD)
140 .value("kDAPHNEStream", FragmentType::kDAPHNEStream)
141 .value("kCRT", FragmentType::kCRT)
142 .value("kTDEEth", FragmentType::kTDEEth)
143 .value("kCRTBern", FragmentType::kCRTBern)
144 .value("kCRTGrenoble", FragmentType::kCRTGrenoble)
145 .value("kDAPHNEEth", FragmentType::kDAPHNEEth)
146 .value("kDAPHNEEthStream", FragmentType::kDAPHNEEthStream)
147 .export_values();
148
149 m.def("fragment_type_to_string", &fragment_type_to_string);
150 m.def("string_to_fragment_type", &string_to_fragment_type);
151 m.def("get_fragment_type_names", &get_fragment_type_names);
152} // NOLINT(readability/fn_size)
C++ Representation of a DUNE Fragment, wrapping the flat byte array that is the Fragment's "actual" f...
Definition Fragment.hpp:38
timestamp_t get_trigger_timestamp() const
Definition Fragment.hpp:79
bool get_status_bit(FragmentStatusBits bit) const
Get the value of a designated status bit.
Definition Fragment.hpp:118
sequence_number_t get_sequence_number() const
Definition Fragment.hpp:143
fragment_type_t get_fragment_type_code() const
Get the fragment_type_t value stored in the header.
Definition Fragment.hpp:131
timestamp_t get_window_begin() const
Definition Fragment.hpp:82
timestamp_t get_window_end() const
Definition Fragment.hpp:85
run_number_t get_run_number() const
Definition Fragment.hpp:76
@ kCopyFromBuffer
Copy the contents of the buffer into a new Fragment array.
Definition Fragment.hpp:44
@ kTakeOverBuffer
Take over control of the buffer.
Definition Fragment.hpp:43
SourceID get_element_id() const
Get the SourceID for the Fragment.
Definition Fragment.hpp:92
FragmentType get_fragment_type() const
Get the fragment_type header field.
Definition Fragment.hpp:136
FragmentHeader get_header() const
Definition Fragment.hpp:65
uint16_t get_detector_id() const noexcept
Definition Fragment.hpp:100
void * get_data() const
Get a pointer to the data payload in the Fragmnet.
Definition Fragment.hpp:153
fragment_size_t get_data_size() const
Get the size of the Fragment payload in bytes (total size minus FragmentHeader).
Definition Fragment.hpp:150
std::bitset< 32 > get_status_bits() const
Get the status_bits header field.
Definition Fragment.hpp:107
fragment_size_t get_size() const
Get the total size of the Fragment in bytes, including header and all payload pieces.
Definition Fragment.hpp:147
const void * get_storage_location() const
Get read-only access to the Fragment's underlying data array via a pointer.
Definition Fragment.hpp:71
trigger_number_t get_trigger_number() const
Definition Fragment.hpp:73
double offset
@ kTriggerPrimitive
Trigger format TPs produced by trigger code.
uint64_t trigger_number_t
Definition Types.hpp:18
FragmentType string_to_fragment_type(const std::string &name)
uint16_t sequence_number_t
Type used to represent sequence within a trigger record.
Definition Types.hpp:38
std::string fragment_type_to_string(const FragmentType &type)
uint64_t timestamp_t
Type used to represent DUNE timing system timestamps.
Definition Types.hpp:26
uint32_t fragment_type_t
Type used to represent Fragment type ID.
Definition Types.hpp:21
uint64_t fragment_size_t
Definition Types.hpp:23
std::map< FragmentType, std::string > get_fragment_type_names()
This map relates FragmentType values to string names.
@ kRequestWindowBeforeBuffer
The request window extends before the latency buffer start.
@ kIncomplete
Only part of the requested data is present in the fragment.
@ kInvalidRequestWindow
The requested data window was too large.
@ kLatencyBufferEmpty
The latency buffer had zero occupancy when the data request was made.
@ kRequestWindowAfterBuffer
The request window extends after the latency buffer end.
@ kEmptyFragment
This Fragment contains no data.
@ kRequestTimeout
A timeout occurred while processing the data request.
static constexpr uint32_t s_fragment_header_marker
Marker bytes to identify a FragmentHeader entry in a raw data stream.
static constexpr uint32_t s_default_status_bits
static constexpr uint32_t s_fragment_header_version

◆ register_sourceid()

void dunedaq::daqdataformats::python::register_sourceid ( py::module & m)
extern

Definition at line 22 of file sourceid.cpp.

23{
24
25 py::class_<SourceID> py_sourceid(m, "SourceID");
26 py_sourceid.def(py::init()).def(py::init<const SourceID::Subsystem&, const SourceID::ID_t&>());
27 py_sourceid.def(py::self < py::self)
28 .def(py::self == py::self)
29 .def(py::self != py::self)
30 .def("__hash__",
31 [](const SourceID& self) {
32 return py::hash(py::make_tuple(static_cast<uint32_t>(self.subsystem), self.id)); // NOLINT(build/unsigned)
33 })
34 .def_property_readonly_static(
35 "s_source_id_version", [](const py::object&) -> SourceID::Version_t { return SourceID::s_source_id_version; })
36 .def_property_readonly_static("s_invalid_id",
37 [](const py::object&) -> SourceID::ID_t { return SourceID::s_invalid_id; })
38 .def("__str__",
39 [](const SourceID& gid) {
40 std::ostringstream oss;
41 oss << gid;
42 return oss.str();
43 })
44 .def("__repr__", [](const SourceID& gid) {
45 std::ostringstream oss;
46 oss << "<daqdataformats::SourceID " << gid << ">";
47 return oss.str();
48 });
49
50 py::enum_<SourceID::Subsystem>(py_sourceid, "Subsystem")
51 .value("kUnknown", SourceID::Subsystem::kUnknown)
52 .value("kDetectorReadout", SourceID::Subsystem::kDetectorReadout)
53 .value("kHwSignalsInterface", SourceID::Subsystem::kHwSignalsInterface)
54 .value("kTrigger", SourceID::Subsystem::kTrigger)
55 .value("kTRBuilder", SourceID::Subsystem::kTRBuilder)
56 .export_values();
57
58 py_sourceid.def_readwrite("version", &SourceID::version)
59 .def_readwrite("subsystem", &SourceID::subsystem)
60 .def_readwrite("id", &SourceID::id);
61
62 py_sourceid.def("subsystem_to_string", &SourceID::subsystem_to_string)
63 .def("string_to_subsystem", &SourceID::string_to_subsystem)
64 .def("to_string", &SourceID::to_string)
65 .def("is_in_valid_state", &SourceID::is_in_valid_state);
66}
SourceID is a generalized representation of the source of a piece of data in the DAQ....
Definition SourceID.hpp:32
static constexpr Version_t s_source_id_version
Definition SourceID.hpp:49
Subsystem subsystem
The general subsystem of the source of the data.
Definition SourceID.hpp:56
static std::string subsystem_to_string(const Subsystem &type)
Definition SourceID.hxx:63
static Subsystem string_to_subsystem(const std::string &typestring)
Definition SourceID.hxx:81
std::string to_string() const
Definition SourceID.hpp:69
static constexpr ID_t s_invalid_id
Definition SourceID.hpp:51
bool is_in_valid_state() const noexcept
Definition SourceID.hpp:76
ID_t id
Unique identifier of the source of the data.
Definition SourceID.hpp:59

◆ register_timeslice()

void dunedaq::daqdataformats::python::register_timeslice ( py::module & m)
extern

Definition at line 24 of file time_slice.cpp.

25{
26 py::class_<TimeSliceHeader>(m, "TimeSliceHeader")
27 .def(py::init<>())
28 .def_property_readonly_static("s_timeslice_header_marker",
29 [](const py::object&) -> uint32_t { // NOLINT(build/unsigned)
31 })
32 .def_property_readonly_static("s_timeslice_header_version",
33 [](const py::object&) -> uint32_t { // NOLINT(build/unsigned)
35 })
36 .def_property_readonly("timeslice_header_marker",
37 [](const TimeSliceHeader& self) -> uint32_t { // NOLINT(build/unsigned)
38 return self.timeslice_header_marker;
39 })
40 .def_property_readonly(
41 "version", [](const TimeSliceHeader& self) -> uint32_t { return self.version; }) // NOLINT(build/unsigned)
42 .def_property_readonly("timeslice_number",
43 [](const TimeSliceHeader& self) -> timeslice_number_t { return self.timeslice_number; })
44 .def_property_readonly("run_number", [](const TimeSliceHeader& self) -> run_number_t { return self.run_number; })
45 .def_property_readonly("element_id", [](const TimeSliceHeader& self) -> SourceID { return self.element_id; })
46 .def("__str__",
47 [](const TimeSliceHeader& hdr) {
48 std::ostringstream oss;
49 oss << hdr;
50 return oss.str();
51 })
52 .def("__repr__", [](const TimeSliceHeader& hdr) {
53 std::ostringstream oss;
54 oss << "<daqdataformats::TimeSliceHeader " << hdr << ">";
55 return oss.str();
56 });
57
58 py::class_<TimeSlice> py_timeslice(m, "TimeSlice", pybind11::buffer_protocol());
59 py_timeslice.def(py::init<TimeSliceHeader const&>())
60 .def(py::init<timeslice_number_t, run_number_t>())
61 .def(
62 "get_header", [](TimeSlice& self) { return self.get_header(); }, py::return_value_policy::reference_internal)
63 // .def("set_header", &TimeSlice::set_header)
64 .def(
65 "get_fragments_ref",
66 [](TimeSlice& self) {
67 auto fragments = py::list();
68 for (auto& fragment : self.get_fragments_ref()) {
69 auto py_fragment = py::cast(*fragment, py::return_value_policy::reference);
70 fragments.append(py_fragment);
71 }
72 return fragments;
73 },
74 py::return_value_policy::reference_internal)
75 .def("get_total_size_bytes", &TimeSlice::get_total_size_bytes)
76 .def("get_sum_of_fragment_payload_sizes", &TimeSlice::get_sum_of_fragment_payload_sizes);
77} // NOLINT
size_t get_total_size_bytes() const
Get size of timeslice from underlying TimeSliceHeader and Fragments.
Definition TimeSlice.hpp:78
size_t get_sum_of_fragment_payload_sizes() const
Get the sum of the fragment payload sizes.
Definition TimeSlice.hpp:91
uint64_t timeslice_number_t
Definition Types.hpp:40
static constexpr uint32_t s_timeslice_header_marker
Marker bytes to identify a TimeSliceHeader entry in a raw data stream.
static constexpr uint32_t s_timeslice_header_version

◆ register_trigger_record()

void dunedaq::daqdataformats::python::register_trigger_record ( py::module & m)
extern

Definition at line 24 of file trigger_record.cpp.

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)
80 return self.trigger_record_header_marker;
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
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.
TriggerRecordHeaderData get_header_data() const
size_t get_total_size_bytes() const
Get size of trigger record from underlying TriggerRecordHeader and Fragments.
@ 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).
uint64_t trigger_type_t
Type used to represent Trigger Decision trigger types.
Definition Types.hpp:35
static constexpr uint32_t s_trigger_record_header_magic
Magic bytes used to identify a TriggerRecordHeaderData struct in a raw data stream.