DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
CRTReaderApplication.cpp
Go to the documentation of this file.
1
12
14
21
23
27
28#include "logging/Logging.hpp"
29
30#include <fmt/core.h>
31
32#include <string>
33#include <vector>
34
35namespace dunedaq::appmodel {
36
37std::vector<const confmodel::Resource*>
41
42void
43 CRTReaderApplication::generate_modules(std::shared_ptr<appmodel::ConfigurationHelper> helper) const
44{
45
46 TLOG_DEBUG(6) << "Generating modules for application " << this->UID();
47
48 std::vector<const confmodel::DaqModule*> modules;
49
50 ConfigObjectFactory obj_fac(this);
51
52 //
53 // Extract basic configuration objects
54 //
55
56 // Data reader
57 const auto reader_conf = get_data_reader();
58 if (reader_conf == 0) {
59 throw(BadConf(ERS_HERE, "No DataReaderModule configuration given"));
60 }
61 const std::string reader_class = reader_conf->get_template_for();
62
63 // Data writers
64 const auto writer_confs = get_data_writers();
65 if (writer_confs.size() == 0) {
66 throw(BadConf(ERS_HERE, "No DataWriterModule configuration given"));
67 }
68
69 //
70 // Get the callback descriptor
71 //
72 const DataMoveCallbackDescriptor* raw_data_callback_desc = get_callback_desc();
73
74 if (raw_data_callback_desc == nullptr) {
75 throw(BadConf(ERS_HERE, "No Raw Data Callback descriptor given"));
76 }
77
78 //
79 // Scan Detector 2 DAQ connections to extract sender, receiver and stream information
80 //
81
82 // Loop over the detector to daq connections and generate one data reader per connection
83
84 // Collect all streams
85 std::map<uint32_t, const appmodel::DataMoveCallbackConf*> callback_confs_by_sid;
86
87 uint16_t conn_idx = 0;
88
89 for (auto d2d_conn : get_detector_connections()) {
90
91 // Are we sure?
92 if (helper->is_disabled(d2d_conn)) {
93 TLOG_DEBUG(7) << "Ignoring disabled DetectorToDaqConnection " << d2d_conn->UID();
94 continue;
95 }
96
97 TLOG_DEBUG(6) << "Processing DetectorToDaqConnection " << d2d_conn->UID();
98 // get the readout groups and the interfaces and streams therein; 1 reaout group corresponds to 1 data reader module
99
100 std::vector<const confmodel::DetectorStream*> enabled_det_streams;
101 // Loop over streams
102 for (auto stream : d2d_conn->streams()) {
103
104 // Are we sure?
105 if (helper->is_disabled(stream)) {
106 TLOG_DEBUG(7) << "Ignoring disabled DetectorStream " << stream->UID();
107 continue;
108 }
109
110 enabled_det_streams.push_back(stream);
111 }
112
113 // Create the raw data callbacks
114 std::vector<const conffwk::ConfigObject*> raw_data_callback_objs;
115
116 // Create data queues
117 for (auto ds : enabled_det_streams) {
118 conffwk::ConfigObject callback_obj = obj_fac.create_callback_sid_obj(raw_data_callback_desc, ds->get_source_id());
119 const auto* callback_conf = obj_fac.get_dal<DataMoveCallbackConf>(callback_obj.UID());
120 raw_data_callback_objs.push_back(&callback_conf->config_object());
121 callback_confs_by_sid[ds->get_source_id()] = callback_conf;
122 }
123
124 //-----------------------------------------------------------------
125 //
126 // Create DataReaderModule object
127 //
128
129 //
130 // Instantiate DataReaderModule of type CRTBernReaderModule/CRTGrenobleReaderModule
131 //
132
133 // Create the Data reader object
134
135 std::string reader_uid(fmt::format("crtdatareader-{}-{}", this->UID(), std::to_string(conn_idx++)));
136 TLOG_DEBUG(6) << fmt::format("creating OKS configuration object for Data reader class {} with id {}", reader_class, reader_uid);
137 auto reader_obj = obj_fac.create(reader_class, reader_uid);
138
139 // Populate configuration and interfaces (leave output queues for later)
140 reader_obj.set_obj("configuration", &reader_conf->config_object());
141 reader_obj.set_objs("connections", { &d2d_conn->config_object() });
142 reader_obj.set_objs("raw_data_callbacks", raw_data_callback_objs);
143
144 modules.push_back(obj_fac.get_dal<confmodel::DaqModule>(reader_obj.UID()));
145
146 //-----------------------------------------------------------------
147 //
148 // Create DataWriterModule objects
149 //
150
151 //
152 // Instantiate DataWriterModule of type SocketWriterModule
153 //
154
155 // Create the SocketWriterModule objects
156
157 conn_idx = 0;
158
159 for (const auto writer_conf : writer_confs) {
160
161 const std::string writer_class = writer_conf->get_template_for();
162
163 std::string writer_uid(fmt::format("socketdatawriter-{}-{}", this->UID(), std::to_string(conn_idx++)));
164 TLOG_DEBUG(6) << fmt::format(
165 "Creating OKS configuration object for socket data writer class {} with id {}", writer_class, writer_uid);
166 auto writer_obj = obj_fac.create(writer_class, writer_uid);
167
168 // Populate configuration and interfaces
169 writer_obj.set_obj("configuration", &writer_conf->config_object());
170 writer_obj.set_objs("connections", {&d2d_conn->config_object()});
171
172 modules.push_back(obj_fac.get_dal<confmodel::DaqModule>(writer_obj.UID()));
173 }
174 }
175
176 obj_fac.update_modules(modules);
177}
178
179} // namespace dunedaq::appmodel
#define ERS_HERE
const dunedaq::appmodel::DataReaderConf * get_data_reader() const
Get "data_reader" relationship value.
const dunedaq::appmodel::DataMoveCallbackDescriptor * get_callback_desc() const
Get "callback_desc" relationship value.
const std::vector< const dunedaq::appmodel::SocketDataWriterConf * > & get_data_writers() const
Get "data_writers" relationship value.
virtual std::vector< const Resource * > contained_resources() const override
void generate_modules(std::shared_ptr< appmodel::ConfigurationHelper >) const override
const std::vector< const dunedaq::confmodel::DetectorToDaqConnection * > & get_detector_connections() const
Get "detector_connections" relationship value.
void update_modules(const std::vector< const confmodel::DaqModule * > &modules)
conffwk::ConfigObject create_callback_sid_obj(const DataMoveCallbackDescriptor *cdesc, uint32_t src_id) const
const T * get_dal(std::string uid) const
conffwk::ConfigObject create(const std::string &class_name, const std::string &id) const
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