Line data Source code
1 : /**
2 : * @file dal_methods.cpp
3 : *
4 : * This is part of the DUNE DAQ Software Suite, copyright 2020.
5 : * Licensing/copyright details are in the COPYING file that you should have
6 : * received with this code.
7 : */
8 :
9 : #include "pybind11/operators.h"
10 : #include "pybind11/pybind11.h"
11 : #include "pybind11/stl.h"
12 :
13 : #include "confmodel/Application.hpp"
14 : #include "confmodel/DaqApplication.hpp"
15 : #include "confmodel/DetectorToDaqConnection.hpp"
16 : #include "confmodel/DetectorStream.hpp"
17 : #include "confmodel/DetDataReceiver.hpp"
18 : #include "confmodel/DetDataSender.hpp"
19 : #include "confmodel/HostComponent.hpp"
20 : #include "confmodel/RCApplication.hpp"
21 : #include "confmodel/Session.hpp"
22 :
23 :
24 : #include <sstream>
25 :
26 : namespace py = pybind11;
27 : using namespace dunedaq::conffwk;
28 :
29 : namespace dunedaq::confmodel::python {
30 :
31 : struct ObjectLocator {
32 0 : ObjectLocator(const std::string& id_arg, const std::string& class_name_arg) :
33 0 : id(id_arg), class_name(class_name_arg)
34 0 : {}
35 : const std::string id;
36 : const std::string class_name;
37 : };
38 :
39 :
40 : std::vector<ObjectLocator>
41 0 : session_get_all_applications(Configuration& db,
42 : const std::string& session_name) {
43 0 : auto session=db.get<Session>(session_name);
44 0 : std::vector<ObjectLocator> apps;
45 0 : for (auto app : session->all_applications()) {
46 0 : apps.push_back({app->UID(),app->class_name()});
47 0 : }
48 0 : return apps;
49 0 : }
50 :
51 : std::vector<ObjectLocator>
52 0 : session_get_enabled_applications(Configuration& db,
53 : const std::string& session_name) {
54 0 : auto session=db.get<Session>(session_name);
55 0 : std::vector<ObjectLocator> apps;
56 0 : for (auto app : session->enabled_applications()) {
57 0 : apps.push_back({app->UID(),app->class_name()});
58 0 : }
59 0 : return apps;
60 0 : }
61 :
62 :
63 0 : void disable_component(Configuration& db,
64 : const std::string& session_id,
65 : const std::string& component_id) {
66 0 : auto session_ptr = const_cast<dunedaq::confmodel::Session*>(db.get<dunedaq::confmodel::Session>(session_id));
67 0 : auto component_ptr = db.get<dunedaq::confmodel::Resource>(component_id);
68 0 : if (session_ptr == nullptr) {
69 0 : throw (std::runtime_error(std::format("Session {} not found", session_id)));
70 : }
71 0 : if (component_ptr == nullptr) {
72 0 : throw (std::runtime_error(std::format("Component {} not found", component_id)));
73 : }
74 0 : session_ptr->disable(component_ptr);
75 0 : }
76 0 : void enable_component(Configuration& db,
77 : const std::string& session_id,
78 : const std::string& component_id) {
79 0 : auto session_ptr = const_cast<dunedaq::confmodel::Session*>(db.get<dunedaq::confmodel::Session>(session_id));
80 0 : auto component_ptr = db.get<dunedaq::confmodel::Resource>(component_id);
81 0 : if (session_ptr == nullptr) {
82 0 : throw (std::runtime_error(std::format("Session {} not found", session_id)));
83 : }
84 0 : if (component_ptr == nullptr) {
85 0 : throw (std::runtime_error(std::format("Component {} not found", component_id)));
86 : }
87 0 : session_ptr->enable(component_ptr);
88 0 : }
89 :
90 :
91 0 : bool component_disabled(Configuration& db,
92 : const std::string& session_id,
93 : const std::string& component_id) {
94 0 : const dunedaq::confmodel::Session* session_ptr = db.get<dunedaq::confmodel::Session>(session_id);
95 0 : const dunedaq::confmodel::Resource* component_ptr = db.get<dunedaq::confmodel::Resource>(component_id);
96 0 : if (component_ptr == nullptr) {
97 : return false;
98 : }
99 0 : return component_ptr->is_disabled(*session_ptr);
100 : }
101 :
102 :
103 0 : std::vector<std::vector<ObjectLocator>> component_get_parents(Configuration& db,
104 : const std::string& session_id,
105 : const std::string& component_id) {
106 0 : const dunedaq::confmodel::Session* session_ptr = db.get<dunedaq::confmodel::Session>(session_id);
107 0 : const dunedaq::confmodel::Resource* component_ptr = db.get<dunedaq::confmodel::Resource>(component_id);
108 :
109 0 : std::list<std::vector<const dunedaq::confmodel::Resource*>> parents;
110 0 : std::vector<std::vector<ObjectLocator>> parent_ids;
111 :
112 0 : component_ptr->parents(*session_ptr, parents);
113 :
114 0 : for (const auto& parent : parents) {
115 0 : std::vector<ObjectLocator> parents_components;
116 0 : for (const auto& ancestor_component_ptr : parent) {
117 0 : parents_components.emplace_back(
118 0 : ObjectLocator(ancestor_component_ptr->UID(),
119 0 : ancestor_component_ptr->class_name()) );
120 : }
121 0 : parent_ids.emplace_back(parents_components);
122 0 : }
123 0 : return parent_ids;
124 0 : }
125 :
126 0 : std::vector<std::string> daq_application_get_used_hostresources(Configuration& db, const std::string& app_id) {
127 0 : auto app = db.get<dunedaq::confmodel::DaqApplication>(app_id);
128 0 : std::vector<std::string> resources;
129 0 : for (auto res : app->get_used_hostresources()) {
130 0 : resources.push_back(res->UID());
131 0 : }
132 0 : return resources;
133 0 : }
134 :
135 0 : std::vector<std::string> daq_application_construct_commandline_parameters(Configuration& db,
136 : const std::string& session_id,
137 : const std::string& app_id) {
138 0 : const auto* app = db.get<dunedaq::confmodel::DaqApplication>(app_id);
139 0 : const auto* session = db.get<dunedaq::confmodel::Session>(session_id);
140 0 : return app->construct_commandline_parameters(db, session);
141 : }
142 :
143 0 : std::vector<std::string> rc_application_construct_commandline_parameters(Configuration& db,
144 : const std::string& session_id,
145 : const std::string& app_id) {
146 0 : const auto* app = db.get<dunedaq::confmodel::RCApplication>(app_id);
147 0 : const auto* session = db.get<dunedaq::confmodel::Session>(session_id);
148 0 : return app->construct_commandline_parameters(db, session);
149 : }
150 :
151 :
152 0 : std::string d2d_receiver(Configuration& db,
153 : const std::string& d2d_id) {
154 0 : const auto* d2d = db.get<dunedaq::confmodel::DetectorToDaqConnection>(d2d_id);
155 0 : if (d2d == nullptr) {
156 0 : return "";
157 : }
158 0 : return d2d->receiver()->UID();
159 : }
160 :
161 0 : std::vector<std::string> d2d_senders(Configuration& db,
162 : const std::string& d2d_id) {
163 0 : std::vector<std::string> senders;
164 0 : const auto* d2d = db.get<dunedaq::confmodel::DetectorToDaqConnection>(d2d_id);
165 0 : if (d2d != nullptr) {
166 0 : for (auto sender: d2d->senders()) {
167 0 : senders.push_back(sender->UID());
168 0 : }
169 : }
170 0 : return senders;
171 0 : }
172 :
173 0 : std::vector<std::string> d2d_streams(Configuration& db,
174 : const std::string& d2d_id) {
175 0 : std::vector<std::string> streams;
176 0 : const auto* d2d = db.get<dunedaq::confmodel::DetectorToDaqConnection>(d2d_id);
177 0 : if (d2d != nullptr) {
178 0 : for (auto stream: d2d->streams()) {
179 0 : streams.push_back(stream->UID());
180 0 : }
181 : }
182 0 : return streams;
183 0 : }
184 :
185 : std::vector<std::string>
186 0 : resourceset_contains(Configuration& db,
187 : const std::string& res_id) {
188 0 : std::vector<std::string> resources;
189 0 : auto res_set = db.get<dunedaq::confmodel::ResourceSet>(res_id);
190 0 : if (res_set != nullptr) {
191 0 : for (auto res: res_set->contained_resources()) {
192 0 : resources.push_back(res->UID());
193 0 : }
194 : }
195 0 : return resources;
196 0 : }
197 :
198 :
199 : void
200 0 : register_dal_methods(py::module& m)
201 : {
202 0 : py::class_<ObjectLocator>(m, "ObjectLocator")
203 0 : .def(py::init<const std::string&, const std::string&>())
204 0 : .def_readonly("id", &ObjectLocator::id)
205 0 : .def_readonly("class_name", &ObjectLocator::class_name)
206 : ;
207 :
208 0 : m.def("session_get_all_applications", &session_get_all_applications, "Get list of ALL applications (regardless of enabled/disabled state) in the requested session");
209 0 : m.def("session_get_enabled_applications", &session_get_enabled_applications, "Get list of enabled applications in the requested session");
210 :
211 0 : m.def("disable_component", &disable_component, "Disable a Resource-derived object (e.g. a Segment)");
212 0 : m.def("enable_component", &enable_component, "Enable a Resource-derived object (e.g. a Segment)");
213 :
214 0 : m.def("component_disabled", &component_disabled, "Determine if a Resource-derived object (e.g. a Segment) has been disabled");
215 0 : m.def("component_get_parents", &component_get_parents, "Get the Resource-derived class instances of the parent(s) of the Resource-derived object in question");
216 0 : m.def("daqapp_get_used_resources", &daq_application_get_used_hostresources, "Get list of HostResources used by DAQApplication");
217 0 : m.def("daq_application_construct_commandline_parameters", &daq_application_construct_commandline_parameters, "Get a version of the command line agruments parsed");
218 0 : m.def("rc_application_construct_commandline_parameters", &rc_application_construct_commandline_parameters, "Get a version of the command line agruments parsed");
219 :
220 0 : m.def("d2d_receiver", &d2d_receiver, "Get receiver associated with DetectorToDaqConnection");
221 0 : m.def("d2d_senders", &d2d_senders, "Get senders associated with DetectorToDaqConnection");
222 0 : m.def("d2d_streams", &d2d_streams, "Get streams associated with DetectorToDaqConnection");
223 0 : m.def("resourceset_contains", &resourceset_contains, "Get contained Resources from ResourceSet");
224 0 : }
225 :
226 : } // namespace dunedaq::confmodel::python
|