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)
44 .def(
45 "get_data",
47 return static_cast<void*
>(
static_cast<char*
>(self.
get_data()) +
offset);
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);
59 },
60 "offset"_a = 0,
61 py::return_value_policy::reference_internal);
62
63 py::enum_<Fragment::BufferAdoptionMode>(py_fragment, "BufferAdoptionMode")
66 .export_values();
67
68 py::class_<FragmentHeader>(m, "FragmentHeader")
69 .def(py::init<>())
70 .def_property_readonly_static(
71 "s_fragment_header_marker",
73 .def_property_readonly_static(
74 "s_fragment_header_version",
76 .def_property_readonly_static(
77 "s_default_status_bits",
79 .def_property_readonly(
80 "fragment_header_marker",
81 [](const FragmentHeader& self) -> uint32_t { return self.fragment_header_marker; })
82 .def_property_readonly(
83 "version", [](const FragmentHeader& self) -> uint32_t { return self.version; })
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; })
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; })
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")
123
124 .export_values();
125
126 py::enum_<FragmentType>(m, "FragmentType")
147 .export_values();
148
152}