DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
trigger_activity.cpp
Go to the documentation of this file.
1
8
10
11#include <pybind11/pybind11.h>
12#include <pybind11/stl.h>
13#include <cstring>
14
15namespace py = pybind11;
16
17// NOLINTBEGIN(build/unsigned)
18
20
21/*
22 Doesn't work
23*/
25
26
28 m_size = size;
29 m_data.reset(new uint8_t[m_size]);
30 std::memcpy(m_data.get(), ptr, size);
31 }
32
33 TriggerActivity* ptr() { return reinterpret_cast<TriggerActivity*>(m_data.get()); }
34
35 size_t m_size;
36 std::unique_ptr<uint8_t[]> m_data;
37
38};
39
40void
42{
43
44
45 py::class_<TriggerActivityData> trigger_activity_data(m, "TriggerActivityData", py::buffer_protocol());
46 trigger_activity_data
47 .def(py::init())
48 .def(py::init([](py::capsule capsule) {
49 auto tp = *static_cast<TriggerActivityData*>(capsule.get_pointer());
50 return tp;
51 } ))
52 .def(py::init([](py::bytes bytes){
53 py::buffer_info info(py::buffer(bytes).request());
54 auto tp = *static_cast<TriggerActivityData*>(info.ptr);
55 return tp;
56 }))
57 .def_property_readonly_static("s_trigger_activity_version", [](py::object /*self*/) { return TriggerActivityData::s_trigger_activity_version; })
58 .def_property_readonly_static("s_invalid_channel", [](py::object /*self*/) { return TriggerActivityData::s_invalid_channel; })
59 .def_property_readonly("version", [](TriggerActivityData& self) -> uint16_t {return self.version;})
60 .def_property_readonly("time_start", [](TriggerActivityData& self) -> uint64_t {return self.time_start;})
61 .def_property_readonly("time_end", [](TriggerActivityData& self) -> uint64_t {return self.time_end;})
62 .def_property_readonly("time_peak", [](TriggerActivityData& self) -> uint64_t {return self.time_peak;})
63 .def_property_readonly("time_activity", [](TriggerActivityData& self) -> uint64_t {return self.time_activity;})
64 .def_property_readonly("channel_start", [](TriggerActivityData& self) -> channel_t {return self.channel_start;})
65 .def_property_readonly("channel_end", [](TriggerActivityData& self) -> channel_t {return self.channel_end;})
66 .def_property_readonly("channel_peak", [](TriggerActivityData& self) -> channel_t {return self.channel_peak;})
67 .def_property_readonly("adc_integral", [](TriggerActivityData& self) -> uint32_t {return self.adc_integral;})
68 .def_property_readonly("adc_peak", [](TriggerActivityData& self) -> uint32_t {return self.adc_peak;})
69 .def_property_readonly("detid", [](TriggerActivityData& self) -> uint16_t {return self.detid;})
70 .def_property_readonly("type", [](TriggerActivityData& self) -> TriggerActivityData::Type {return self.type;})
71 .def_property_readonly("algorithm", [](TriggerActivityData& self) -> TriggerActivityData::Algorithm {return self.algorithm;})
72 .def_static("sizeof", [](){ return sizeof(TriggerActivityData); })
73 ;
74
75
76 py::enum_<TriggerActivityData::Type>(trigger_activity_data, "Type")
77 .value("kUnknown", TriggerActivityData::Type::kUnknown)
79 .value("kPDS", TriggerActivityData::Type::kPDS);
80
81 py::enum_<TriggerActivityData::Algorithm>(trigger_activity_data, "Algorithm")
85 .value("kADCSimpleWindow", TriggerActivityData::Algorithm::kADCSimpleWindow)
89 .value("kPlaneCoincidence", TriggerActivityData::Algorithm::kPlaneCoincidence)
91 .value("kChannelDistance", TriggerActivityData::Algorithm::kChannelDistance)
92 .value("kChannelAdjacency", TriggerActivityData::Algorithm::kChannelAdjacency)
94 .value("kProtoDUNEBSMWindow", TriggerActivityData::Algorithm::kProtoDUNEBSMWindow);
95
96 py::class_<TriggerActivity>(m, "TriggerActivityOverlay", py::buffer_protocol())
97 .def(py::init())
98 .def(py::init([](py::capsule capsule) {
99 auto tp = *static_cast<TriggerActivity*>(capsule.get_pointer());
100 return tp;
101 } ))
102 .def_property_readonly("data", [](TriggerActivity& self) -> TriggerActivityData& {return self.data;})
103 .def("__len__", [](TriggerActivity& self){ return self.n_inputs; })
104 .def("sizeof", [](TriggerActivity& self){ return sizeof(TriggerActivity)+self.n_inputs*sizeof(TriggerPrimitive); })
105 ;
106
107
108 py::class_<TriggerActivityHolder>(m, "TriggerActivity", py::buffer_protocol())
109 // .def(py::init())
110 .def(py::init([](py::capsule capsule) {
111 auto ta_ptr = static_cast<TriggerActivity*>(capsule.get_pointer());
112 TriggerActivityHolder tah(ta_ptr, sizeof(TriggerActivity)+ta_ptr->n_inputs*sizeof(TriggerPrimitive));
113 return tah;
114 }))
115 .def(py::init([](py::bytes bytes){
116 py::buffer_info info(py::buffer(bytes).request());
117 TriggerActivityHolder tah(info.ptr, info.size);
118
119 return tah;
120 }))
121
122 .def("get_bytes",
123 [](TriggerActivityHolder& tah) -> py::bytes {
124 return py::bytes(reinterpret_cast<char*>(tah.ptr()), tah.m_size);
125 }, py::return_value_policy::reference_internal
126 )
127 .def_property_readonly("data", [](TriggerActivityHolder& self) -> TriggerActivityData& {return self.ptr()->data;})
128 .def("n_inputs", [](TriggerActivityHolder& self){ return self.ptr()->n_inputs; })
129 .def("__len__", [](TriggerActivityHolder& self){ return self.ptr()->n_inputs; })
130 .def("__getitem__",
131 [](TriggerActivityHolder &self, size_t i) -> const TriggerPrimitive& {
132 if (i >= self.ptr()->n_inputs) {
133 throw py::index_error();
134 }
135 return self.ptr()->inputs[i];
136 }, py::return_value_policy::reference_internal)
137 .def("sizeof", [](TriggerActivityHolder& self){ return self.m_size; })
138
139 ;
140} // NOLINT function length, while long enough to trip the linter, is fine
141
142} // namespace dunedaq::trgdataformats::python
143
144static_assert(
146 "Version of TriggerActivityData appears to have changed; as a developer please update the Python bindings in this file before updating this static_assert");
147
148// NOLINTEND(build/unsigned)
void register_trigger_activity(pybind11::module &)
TriggerObjectOverlay< TriggerActivityData, TriggerPrimitive > TriggerActivity
FELIX Initialization std::string initerror FELIX queue timed std::string queuename Unexpected chunk size
A single energy deposition on a TPC or PDS channel.