DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
fragment.cpp
Go to the documentation of this file.
1
11
12#include <pybind11/pybind11.h>
13#include <pybind11/stl.h>
14
15namespace py = pybind11;
16using namespace pybind11::literals; // to bring in the `_a` literal
17
18namespace dunedaq {
19namespace daqdataformats {
20namespace python {
21
22void
23register_fragment(py::module& m)
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_error_bits", [](Fragment& self) { return self.get_error_bits().to_ullong(); } )
38 .def("get_error_bit", &Fragment::get_error_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", [](Fragment& self, size_t offset) { return static_cast<void*>(static_cast<char*>(self.get_data()) + offset); }, "offset"_a = 0, py::return_value_policy::reference_internal)
46 .def(
47 "get_data_bytes",
48 [](Fragment* self, size_t offset) -> py::bytes {
49 if (offset > self->get_data_size()) {
50 throw std::runtime_error("Fragment.get_data_bytes: offset exceeds fragment size.");
51 }
52 size_t bytes_size = self->get_data_size() - offset;
53 return py::bytes(reinterpret_cast<char*>(self->get_data()) + offset, bytes_size);
54 },
55 "offset"_a = 0,
56 py::return_value_policy::reference_internal);
57
58 py::enum_<Fragment::BufferAdoptionMode>(py_fragment, "BufferAdoptionMode")
59 .value("kReadOnlyMode", Fragment::BufferAdoptionMode::kReadOnlyMode)
60 .value("kTakeOverBuffer", Fragment::BufferAdoptionMode::kTakeOverBuffer)
61 .value("kCopyFromBuffer", Fragment::BufferAdoptionMode::kCopyFromBuffer)
62 .export_values();
63
64 py::class_<FragmentHeader>(m, "FragmentHeader")
65 .def_property_readonly(
66 "fragment_header_marker",
67 [](const FragmentHeader& self) -> uint32_t { return self.fragment_header_marker; }) // NOLINT(build/unsigned)
68 .def_property_readonly(
69 "version", [](const FragmentHeader& self) -> uint32_t { return self.version; }) // NOLINT(build/unsigned)
70 .def_property_readonly("size", [](const FragmentHeader& self) -> fragment_size_t { return self.size; })
71 .def_property_readonly("trigger_number",
72 [](const FragmentHeader& self) -> trigger_number_t { return self.trigger_number; })
73 .def_property_readonly("trigger_timestamp",
74 [](const FragmentHeader& self) -> timestamp_t { return self.trigger_timestamp; })
75 .def_property_readonly("window_begin", [](const FragmentHeader& self) -> timestamp_t { return self.window_begin; })
76 .def_property_readonly("window_end", [](const FragmentHeader& self) -> timestamp_t { return self.window_end; })
77 .def_property_readonly("run_number", [](const FragmentHeader& self) -> run_number_t { return self.run_number; })
78 .def_property_readonly(
79 "error_bits", [](const FragmentHeader& self) -> uint32_t { return self.error_bits; }) // NOLINT(build/unsigned)
80 .def_property_readonly("fragment_type",
81 [](const FragmentHeader& self) -> fragment_type_t { return self.fragment_type; })
82 .def_property_readonly("sequence_number",
83 [](const FragmentHeader& self) -> sequence_number_t { return self.sequence_number; })
84 .def_property_readonly("detector_id", [](const FragmentHeader& self) -> uint16_t { return self.detector_id; })
85 .def_property_readonly("element_id", [](const FragmentHeader& self) -> SourceID { return self.element_id; })
86 .def_static("sizeof", []() { return sizeof(FragmentHeader); });
87
88 py::enum_<FragmentErrorBits>(m, "FragmentErrorBits")
89 .value("kDataNotFound", FragmentErrorBits::kDataNotFound)
90 .value("kIncomplete", FragmentErrorBits::kIncomplete)
91 .value("kInvalidWindow", FragmentErrorBits::kInvalidWindow)
92 // TODO, Alessandro Thea <thea@github.com> Oct-31-2021: Add unassigned
93 .export_values();
94
95 py::enum_<FragmentType>(m, "FragmentType")
96 .value("kUnknown", FragmentType::kUnknown)
97 .value("kProtoWIB", FragmentType::kProtoWIB)
98 .value("kWIB", FragmentType::kWIB)
99 .value("kDAPHNE", FragmentType::kDAPHNE)
100 .value("kTDE_AMC", FragmentType::kTDE_AMC)
101 .value("kFW_TriggerPrimitive", FragmentType::kFW_TriggerPrimitive)
102 .value("kTriggerPrimitive", FragmentType::kTriggerPrimitive)
103 .value("kTriggerActivity", FragmentType::kTriggerActivity)
104 .value("kTriggerCandidate", FragmentType::kTriggerCandidate)
105 .value("kHardwareSignal", FragmentType::kHardwareSignal)
106 .value("kPACMAN", FragmentType::kPACMAN)
107 .value("kWIBEth", FragmentType::kWIBEth)
108 .value("kDAPHNEStream", FragmentType::kDAPHNEStream)
109 .value("kCRT", FragmentType::kCRT)
110 .value("kTDEEth", FragmentType::kTDEEth)
111 .export_values();
112}
113
114} // namespace python
115} // namespace daqdataformats
116} // namespace dunedaq
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
Get the trigger_timestamp field from the header.
Definition Fragment.hpp:133
bool get_error_bit(FragmentErrorBits bit) const
Get the value of a designated error bit.
Definition Fragment.hpp:202
sequence_number_t get_sequence_number() const
Get the sequence_number field from the header.
Definition Fragment.hpp:231
fragment_type_t get_fragment_type_code() const
Get the fragment_type_t value stored in the header.
Definition Fragment.hpp:215
timestamp_t get_window_begin() const
Get the window_begin field from the header.
Definition Fragment.hpp:143
timestamp_t get_window_end() const
Get the window_end field from the header.
Definition Fragment.hpp:153
run_number_t get_run_number() const
Get the run_number field from the header.
Definition Fragment.hpp:122
@ kCopyFromBuffer
Copy the contents of the buffer into a new Fragment array.
@ kReadOnlyMode
Just use the buffer in non-owning mode.
@ kTakeOverBuffer
Take over control of the buffer.
SourceID get_element_id() const
Get the SourceID for the Fragment.
Definition Fragment.hpp:164
FragmentType get_fragment_type() const
Get the fragment_type header field.
Definition Fragment.hpp:220
std::bitset< 32 > get_error_bits() const
Get the error_bits header field.
Definition Fragment.hpp:191
FragmentHeader get_header() const
Get a copy of the FragmentHeader struct.
Definition Fragment.hpp:92
uint16_t get_detector_id() const noexcept
Get the DetID for the Fragment.
Definition Fragment.hpp:177
void * get_data() const
Get a pointer to the data payload in the Fragmnet.
Definition Fragment.hpp:254
fragment_size_t get_data_size() const
Get the size of the Fragment data.
Definition Fragment.hpp:248
fragment_size_t get_size() const
Get the total size of the Fragment.
Definition Fragment.hpp:242
const void * get_storage_location() const
Get a pointer to the Fragment's data array to read its contents directly.
Definition Fragment.hpp:105
trigger_number_t get_trigger_number() const
Get the trigger_number field from the header.
Definition Fragment.hpp:112
double offset
void register_fragment(py::module &m)
Definition fragment.cpp:23
uint32_t run_number_t
Type used to represent run number.
Definition Types.hpp:20
@ kTriggerPrimitive
Trigger format TPs produced by trigger code.
@ kFW_TriggerPrimitive
FW TP frame format.
uint64_t trigger_number_t
Type used to represent trigger number.
Definition Types.hpp:24
uint16_t sequence_number_t
Type used to represent sequence within a trigger record.
Definition Types.hpp:45
uint64_t timestamp_t
Type used to represent DUNE timing system timestamps.
Definition Types.hpp:36
uint32_t fragment_type_t
Type used to represent Fragment type ID.
Definition Types.hpp:28
uint64_t fragment_size_t
Type used to represent Fragment size.
Definition Types.hpp:32
@ kIncomplete
Only part of the requested data is present in the fragment.
@ kInvalidWindow
The requested data window was too large.
@ kDataNotFound
The requested data was not found at all, so the fragment is empty.
Including Qt Headers.
The header for a DUNE Fragment.
SourceID is a generalized representation of the source of a piece of data in the DAQ....
Definition SourceID.hpp:32