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 <memory>
35#include <string>
36#include <vector>
37
38namespace dunedaq::appmodel {
39
40std::vector<const confmodel::ExcludableEntity*>
45
46void
47CRTFrameBuilderApplication::generate_modules(std::shared_ptr<appmodel::ConfigurationHelper> helper) const
48{
49
50 TLOG_DEBUG(6) << "Generating modules for application " << this->UID();
51
52 std::vector<const confmodel::DaqModule*> modules;
53
54 ConfigObjectFactory obj_fac(this);
55
56 //
57 // Extract basic configuration objects
58 //
59
60 // Detector frame builder
61 const auto det_frame_builder_conf = get_detector_frame_builder();
62 if (det_frame_builder_conf == nullptr) {
63 throw(BadConf(ERS_HERE, "No DetectorFrameBuilderModule configuration given"));
64 }
65 const std::string builder_class = det_frame_builder_conf->get_template_for();
66
67 // Data writer
68 const auto writer_conf = get_data_writer();
69 if (writer_conf == nullptr) {
70 throw(BadConf(ERS_HERE, "No DataWriterModule configuration given"));
71 }
72 const std::string writer_class = writer_conf->get_template_for();
73
74 //
75 // Process the queue rules looking for inputs to our socket writer modules
76 //
77 const QueueDescriptor* crtframebuilder_output_qdesc = nullptr;
78 auto queue_rules = get_queue_rules();
79 if (queue_rules.size() != 1) {
80 throw(BadConf(ERS_HERE, "Strictly 1 queue rule is expected"));
81 }
82 crtframebuilder_output_qdesc = queue_rules[0]->get_descriptor();
83
84 //
85 // Scan Detector 2 DAQ connections to extract sender, receiver and stream information
86 //
87
88 // Loop over the detector to daq connections and generate:
89 // - One detector frame builder per data sender
90 // - One data writer per data sender
91 // - One queue per data sender
92
93 for (auto d2d_conn : get_detector_connections()) {
94
95 auto d2d_conn_uid = d2d_conn->UID();
96
97 // Are we sure?
98 if (helper->is_excluded(d2d_conn)) {
99 TLOG_DEBUG(7) << "Ignoring excluded DetectorToDaqConnection " << d2d_conn_uid;
100 continue;
101 }
102
103 TLOG_DEBUG(6) << "Processing DetectorToDaqConnection " << d2d_conn_uid;
104
105 auto receiver = d2d_conn->receiver();
106
107 uint16_t sender_idx = 0; // NOLINT(build/unsigned)
108
109 // Loop over senders
110 for (auto sender : d2d_conn->senders()) {
111
112 // Are we sure?
113 if (helper->is_excluded(sender)) {
114 TLOG_DEBUG(7) << "Ignoring excluded DataSender " << sender->UID();
115 continue;
116 }
117
118 bool has_included_det_stream = false;
119 // Loop over streams
120 for (auto stream : sender->get_streams()) {
121
122 // Are we sure?
123 if (helper->is_excluded(stream)) {
124 TLOG_DEBUG(7) << "Ignoring excluded DetectorStream " << stream->UID();
125 continue;
126 }
127
128 has_included_det_stream = true;
129 break;
130 }
131
132 if (!has_included_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(
164 "creating OKS configuration object for detector frame builder class {} with id {}", builder_class, builder_uid);
165 auto builder_obj = obj_fac.create(builder_class, builder_uid);
166
167 // Populate configuration and interfaces
168 builder_obj.set_obj("configuration", &det_frame_builder_conf->config_object());
169 builder_obj.set_obj("connection", sender_conn_conf_obj);
170 builder_obj.set_objs("outputs", { queue_conf_obj });
171
172 modules.push_back(obj_fac.get_dal<confmodel::DaqModule>(builder_obj.UID()));
173
174 //-----------------------------------------------------------------
175 //
176 // Create DataWriterModule object
177 //
178
179 //
180 // Instantiate DataWriterModule of type SocketWriterModule
181 //
182
183 // Create the SocketWriterModule object
184
185 std::string writer_uid(fmt::format("socket-writer-{}-{}", this->UID(), sender_idx_str));
186 TLOG_DEBUG(6) << fmt::format(
187 "Creating OKS configuration object for socket writer class {} with id {}", writer_class, writer_uid);
188 auto writer_obj = obj_fac.create(writer_class, writer_uid);
189
190 // Populate configuration and interfaces
191 writer_obj.set_obj("configuration", &writer_conf->config_object());
192 writer_obj.set_obj("connection", sender_conn_conf_obj);
193 writer_obj.set_objs("inputs", { queue_conf_obj });
194
195 modules.push_back(obj_fac.get_dal<confmodel::DaqModule>(writer_obj.UID()));
196
197 ++sender_idx;
198 }
199 }
200
201 obj_fac.update_modules(modules);
202}
203
204} // 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.
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.
virtual std::vector< const ExcludableEntity * > contained_excludable_entities() const override
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::ExcludableEntity * > to_resources(const std::vector< T * > &vector_of_children)
#define TLOG_DEBUG(lvl,...)
Definition Logging.hpp:116