DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
CRTFrameBuilderApplication.cpp
Go to the documentation of this file.
1
10
12
14
21
23
29
30#include "logging/Logging.hpp"
31
32#include <fmt/core.h>
33
34#include <string>
35#include <vector>
36#include <memory>
37
38namespace dunedaq::appmodel {
39
40std::vector<const confmodel::Resource*>
44
45void
46 CRTFrameBuilderApplication::generate_modules(std::shared_ptr<appmodel::ConfigurationHelper> helper) const
47{
48
49 TLOG_DEBUG(6) << "Generating modules for application " << this->UID();
50
51 std::vector<const confmodel::DaqModule*> modules;
52
53 ConfigObjectFactory obj_fac(this);
54
55 //
56 // Extract basic configuration objects
57 //
58
59 // Detector frame builder
60 const auto det_frame_builder_conf = get_detector_frame_builder();
61 if (det_frame_builder_conf == nullptr) {
62 throw(BadConf(ERS_HERE, "No DetectorFrameBuilderModule configuration given"));
63 }
64 const std::string builder_class = det_frame_builder_conf->get_template_for();
65
66 // Data writer
67 const auto writer_conf = get_data_writer();
68 if (writer_conf == nullptr) {
69 throw(BadConf(ERS_HERE, "No DataWriterModule configuration given"));
70 }
71 const std::string writer_class = writer_conf->get_template_for();
72
73 //
74 // Process the queue rules looking for inputs to our socket writer modules
75 //
76 const QueueDescriptor* crtframebuilder_output_qdesc = nullptr;
77 auto queue_rules = get_queue_rules();
78 if (queue_rules.size() != 1) {
79 throw(BadConf(ERS_HERE, "Strictly 1 queue rule is expected"));
80 }
81 crtframebuilder_output_qdesc = queue_rules[0]->get_descriptor();
82
83 //
84 // Scan Detector 2 DAQ connections to extract sender, receiver and stream information
85 //
86
87 // Loop over the detector to daq connections and generate:
88 // - One detector frame builder per data sender
89 // - One data writer per data sender
90 // - One queue per data sender
91
92 for (auto d2d_conn : get_detector_connections()) {
93
94 auto d2d_conn_uid = d2d_conn->UID();
95
96 // Are we sure?
97 if (helper->is_disabled(d2d_conn)) {
98 TLOG_DEBUG(7) << "Ignoring disabled DetectorToDaqConnection " << d2d_conn_uid;
99 continue;
100 }
101
102 TLOG_DEBUG(6) << "Processing DetectorToDaqConnection " << d2d_conn_uid;
103
104 auto receiver = d2d_conn->receiver();
105
106 uint16_t sender_idx = 0; // NOLINT(build/unsigned)
107
108 // Loop over senders
109 for (auto sender : d2d_conn->senders()) {
110
111 // Are we sure?
112 if (helper->is_disabled(sender)) {
113 TLOG_DEBUG(7) << "Ignoring disabled DataSender " << sender->UID();
114 continue;
115 }
116
117
118 bool has_enabled_det_stream = false;
119 // Loop over streams
120 for (auto stream : sender->get_streams()) {
121
122 // Are we sure?
123 if (helper->is_disabled(stream)) {
124 TLOG_DEBUG(7) << "Ignoring disabled DetectorStream " << stream->UID();
125 continue;
126 }
127
128 has_enabled_det_stream = true;
129 break;
130 }
131
132 if (!has_enabled_det_stream) {
133 continue;
134 }
135
136 const auto sender_idx_str = std::to_string(sender_idx);
137
138 // Create a connection that is dedicated to this sender
139 std::string sender_conn_uid(d2d_conn_uid + sender_idx_str);
140 auto sender_conn_obj = obj_fac.create("SocketDetectorToDaqConnection", sender_conn_uid);
141 sender_conn_obj.set_objs("net_senders", { &sender->config_object() });
142 sender_conn_obj.set_obj("net_receiver", &receiver->config_object());
143 const auto* sender_conn = obj_fac.get_dal<appmodel::SocketDetectorToDaqConnection>(sender_conn_obj.UID());
144 const auto* sender_conn_conf_obj = &sender_conn->config_object();
145
146 // Create data queue
147 conffwk::ConfigObject queue_obj = obj_fac.create_queue_obj(crtframebuilder_output_qdesc, sender_idx_str);
148 const auto* queue = obj_fac.get_dal<confmodel::Connection>(queue_obj.UID());
149 const auto* queue_conf_obj = &queue->config_object();
150
151 //-----------------------------------------------------------------
152 //
153 // Create DetectorFrameBuilderModule object
154 //
155
156 //
157 // Instantiate DetectorFrameBuilderModule of type CRTBernFrameBuilderModule/CRTGrenobleFrameBuilderModule
158 //
159
160 // Create the detector frame builder object
161
162 std::string builder_uid(fmt::format("crt-frame-builder-{}-{}", this->UID(), sender_idx_str));
163 TLOG_DEBUG(6) << fmt::format("creating OKS configuration object for detector frame builder class {} with id {}", builder_class, builder_uid);
164 auto builder_obj = obj_fac.create(builder_class, builder_uid);
165
166 // Populate configuration and interfaces
167 builder_obj.set_obj("configuration", &det_frame_builder_conf->config_object());
168 builder_obj.set_obj("connection", sender_conn_conf_obj);
169 builder_obj.set_objs("outputs", { queue_conf_obj });
170
171 modules.push_back(obj_fac.get_dal<confmodel::DaqModule>(builder_obj.UID()));
172
173 //-----------------------------------------------------------------
174 //
175 // Create DataWriterModule object
176 //
177
178 //
179 // Instantiate DataWriterModule of type SocketWriterModule
180 //
181
182 // Create the SocketWriterModule object
183
184 std::string writer_uid(fmt::format("socket-writer-{}-{}", this->UID(), sender_idx_str));
185 TLOG_DEBUG(6) << fmt::format("Creating OKS configuration object for socket writer class {} with id {}", writer_class, writer_uid);
186 auto writer_obj = obj_fac.create(writer_class, writer_uid);
187
188 // Populate configuration and interfaces
189 writer_obj.set_obj("configuration", &writer_conf->config_object());
190 writer_obj.set_obj("connection", sender_conn_conf_obj);
191 writer_obj.set_objs("inputs", { queue_conf_obj });
192
193 modules.push_back(obj_fac.get_dal<confmodel::DaqModule>(writer_obj.UID()));
194
195 ++sender_idx;
196 }
197 }
198
199 obj_fac.update_modules(modules);
200}
201
202} // namespace dunedaq::appmodel
#define ERS_HERE
const dunedaq::appmodel::SocketDataWriterConf * get_data_writer() const
Get "data_writer" relationship value.
const std::vector< const dunedaq::confmodel::DetectorToDaqConnection * > & get_detector_connections() const
Get "detector_connections" relationship value.
virtual std::vector< const Resource * > contained_resources() const override
void generate_modules(std::shared_ptr< appmodel::ConfigurationHelper >) const override
const dunedaq::appmodel::DetectorFrameBuilderConf * get_detector_frame_builder() const
Get "detector_frame_builder" relationship value.
void update_modules(const std::vector< const confmodel::DaqModule * > &modules)
const T * get_dal(std::string uid) const
conffwk::ConfigObject create_queue_obj(const QueueDescriptor *qdesc, std::string uid="") const
conffwk::ConfigObject create(const std::string &class_name, const std::string &id) const
const std::vector< const dunedaq::appmodel::QueueConnectionRule * > & get_queue_rules() const
Get "queue_rules" relationship value.
void set_objs(const std::string &name, const std::vector< const ConfigObject * > &o, bool skip_non_null_check=false)
Set relationship multi-value.
const std::string & UID() const noexcept
Return object identity.
void set_obj(const std::string &name, const ConfigObject *o, bool skip_non_null_check=false)
Set relationship single-value.
const std::string & UID() const noexcept
std::vector< const dunedaq::confmodel::Resource * > to_resources(const std::vector< T * > &vector_of_children)
#define TLOG_DEBUG(lvl,...)
Definition Logging.hpp:112