42{
43
44 m.def("string_to_trigger_candidate_type", &trgdataformats::string_to_trigger_candidate_type);
45 m.def("trigger_candidate_type_to_string", &trgdataformats::trigger_candidate_type_to_string);
46
47 py::class_<TriggerCandidateData> trigger_candidate_data(m, "TriggerCandidateData", py::buffer_protocol());
48 trigger_candidate_data
49 .def(py::init())
50 .def(py::init([](py::capsule capsule) {
52 return tp;
53 } ))
54 .def(py::init([](py::bytes bytes){
55 py::buffer_info info(py::buffer(bytes).request());
57 return tp;
58 }))
59 .def_property_readonly("version", [](TriggerCandidateData& self) -> uint16_t {return self.version;})
60 .def_property_readonly("time_start", [](TriggerCandidateData& self) -> uint64_t {return self.time_start;})
61 .def_property_readonly("time_end", [](TriggerCandidateData& self) -> uint64_t {return self.time_end;})
62 .def_property_readonly("time_candidate", [](TriggerCandidateData& self) -> uint64_t {return self.time_candidate;})
63 .def_property_readonly("detid", [](TriggerCandidateData& self) -> uint16_t {return self.detid;})
64 .def_property_readonly("type", [](TriggerCandidateData& self) -> TriggerCandidateData::Type {return self.type;})
65 .def_property_readonly("algorithm", [](TriggerCandidateData& self) -> TriggerCandidateData::Algorithm {return self.algorithm;})
66 .def_static("sizeof", [](){ return sizeof(TriggerCandidateData); })
67 ;
68
69 py::enum_<TriggerCandidateData::Type>(trigger_candidate_data, "Type")
70 .value("kUnknown", TriggerCandidateData::Type::kUnknown)
71 .value("kTiming", TriggerCandidateData::Type::kTiming)
72 .value("kTPCLowE", TriggerCandidateData::Type::kTPCLowE)
73 .value("kSupernova", TriggerCandidateData::Type::kSupernova)
74 .value("kRandom", TriggerCandidateData::Type::kRandom)
75 .value("kPrescale", TriggerCandidateData::Type::kPrescale)
76 .value("kADCSimpleWindow", TriggerCandidateData::Type::kADCSimpleWindow)
77 .value("kHorizontalMuon", TriggerCandidateData::Type::kHorizontalMuon)
78 .value("kMichelElectron", TriggerCandidateData::Type::kMichelElectron)
79 .value("kPlaneCoincidence", TriggerCandidateData::Type::kPlaneCoincidence)
80 .value("kBundle", TriggerCandidateData::Type::kBundle)
81 .value("kChannelDistance", TriggerCandidateData::Type::kChannelDistance)
82 .value("kDBSCAN", TriggerCandidateData::Type::kDBSCAN)
83 .value("kCTBFakeTrigger", TriggerCandidateData::Type::kCTBFakeTrigger)
84 .value("kCTBBeam", TriggerCandidateData::Type::kCTBBeam)
85 .value("kCTBBeamChkvHL", TriggerCandidateData::Type::kCTBBeamChkvHL)
86 .value("kCTBCustomD", TriggerCandidateData::Type::kCTBCustomD)
87 .value("kCTBCustomE", TriggerCandidateData::Type::kCTBCustomE)
88 .value("kCTBCustomF", TriggerCandidateData::Type::kCTBCustomF)
89 .value("kCTBCustomG", TriggerCandidateData::Type::kCTBCustomG)
90 .value("kCTBBeamChkvHLx", TriggerCandidateData::Type::kCTBBeamChkvHLx)
91 .value("kCTBBeamChkvHxL", TriggerCandidateData::Type::kCTBBeamChkvHxL)
92 .value("kCTBBeamChkvHxLx", TriggerCandidateData::Type::kCTBBeamChkvHxLx)
93 .value("kNeutronSourceCalib", TriggerCandidateData::Type::kNeutronSourceCalib)
94 .value("kChannelAdjacency", TriggerCandidateData::Type::kChannelAdjacency)
95 .value("kCIBFakeTrigger", TriggerCandidateData::Type::kCIBFakeTrigger)
96 .value("kCIBLaserTriggerP1", TriggerCandidateData::Type::kCIBLaserTriggerP1)
97 .value("kCIBLaserTriggerP2", TriggerCandidateData::Type::kCIBLaserTriggerP2)
98 .value("kCIBLaserTriggerP3", TriggerCandidateData::Type::kCIBLaserTriggerP3)
99 .value("kCTBOffSpillSnapshot", TriggerCandidateData::Type::kCTBOffSpillSnapshot)
100 .value("kCTBOffSpillCosmicJura", TriggerCandidateData::Type::kCTBOffSpillCosmicJura)
101 .value("kCTBOffSpillCRTCosmic", TriggerCandidateData::Type::kCTBOffSpillCRTCosmic)
102 .value("kCTBCustomA", TriggerCandidateData::Type::kCTBCustomA)
103 .value("kCTBCustomB", TriggerCandidateData::Type::kCTBCustomB)
104 .value("kCTBCustomC", TriggerCandidateData::Type::kCTBCustomC)
105 .value("kCTBCustomPulseTrain", TriggerCandidateData::Type::kCTBCustomPulseTrain)
106 .value("kDTSPulser", TriggerCandidateData::Type::kDTSPulser)
107 .value("kDTSCosmic", TriggerCandidateData::Type::kDTSCosmic)
108 .value("kSSPLEDCalibration", TriggerCandidateData::Type::kSSPLEDCalibration);
109
110 py::enum_<TriggerCandidateData::Algorithm>(trigger_candidate_data, "Algorithm")
111 .value("kUnknown", TriggerCandidateData::Algorithm::kUnknown)
112 .value("kSupernova", TriggerCandidateData::Algorithm::kSupernova)
113 .value("kHSIEventToTriggerCandidate", TriggerCandidateData::Algorithm::kHSIEventToTriggerCandidate)
114 .value("kPrescale", TriggerCandidateData::Algorithm::kPrescale)
115 .value("kADCSimpleWindow", TriggerCandidateData::Algorithm::kADCSimpleWindow)
116 .value("kHorizontalMuon", TriggerCandidateData::Algorithm::kHorizontalMuon)
117 .value("kMichelElectron", TriggerCandidateData::Algorithm::kMichelElectron)
118 .value("kPlaneCoincidence", TriggerCandidateData::Algorithm::kPlaneCoincidence)
119 .value("kCustom", TriggerCandidateData::Algorithm::kCustom)
120 .value("kDBSCAN", TriggerCandidateData::Algorithm::kDBSCAN)
121 .value("kChannelDistance", TriggerCandidateData::Algorithm::kChannelDistance)
122 .value("kBundle", TriggerCandidateData::Algorithm::kBundle)
123 .value("kChannelAdjacency", TriggerCandidateData::Algorithm::kChannelAdjacency);
124
125 py::class_<TriggerCandidate>(m, "TriggerCandidateOverlay", py::buffer_protocol())
126 .def(py::init([](py::capsule capsule) {
128 return tp;
129 } ))
130 .def_property_readonly("data", [](TriggerCandidate& self) -> TriggerCandidateData& {return self.data;})
131 .def("__len__", [](TriggerCandidate& self){ return self.n_inputs; })
132 .def(
"sizeof", [](TriggerCandidate& self){
return sizeof(
TriggerCandidate)+self.n_inputs*
sizeof(TriggerActivityData); })
133 ;
134
135
136 py::class_<TriggerCandidateHolder>(m, "TriggerCandidate", py::buffer_protocol())
137 .def(py::init([](py::capsule capsule) {
139 TriggerCandidateHolder tch(tc_ptr, sizeof(TriggerCandidate)+tc_ptr->n_inputs*sizeof(TriggerActivityData));
140 return tch;
141 }))
142 .def(py::init([](py::bytes bytes){
143 py::buffer_info
info(py::buffer(bytes).request());
144
145 TriggerCandidateHolder tch(
info.ptr,
info.size);
146
147 return tch;
148 }))
149
150 .def("get_bytes",
151 [](TriggerCandidateHolder& tch) -> py::bytes {
152 return py::bytes(reinterpret_cast<char*>(tch.ptr()), tch.m_size);
153 }, py::return_value_policy::reference_internal
154 )
155 .def_property_readonly("data", [](TriggerCandidateHolder& self) -> TriggerCandidateData& {return self.ptr()->data;})
156 .def("n_inputs", [](TriggerCandidateHolder& self){ return self.ptr()->n_inputs; })
157 .def("__len__", [](TriggerCandidateHolder& self){ return self.ptr()->n_inputs; })
158 .def("__getitem__",
159 [](TriggerCandidateHolder &self, size_t i) -> const TriggerActivityData& {
160 if (i >= self.ptr()->n_inputs) {
161 throw py::index_error();
162 }
163 return self.ptr()->inputs[i];
164 }, py::return_value_policy::reference_internal)
165 .def("sizeof", [](TriggerCandidateHolder& self){ return self.m_size; })
166 ;
167}