DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
TriggerApplication.cpp
Go to the documentation of this file.
1
10
13
16#include "confmodel/Service.hpp"
17
22
25
28
31
33
36
37#include "logging/Logging.hpp"
38
39#include <string>
40#include <vector>
41
42namespace dunedaq {
43namespace appmodel {
44
55conffwk::ConfigObject
57 const NetworkConnectionDescriptor* ntDesc,
59 const std::string& dbfile)
60{
61 auto ntServiceObj = ntDesc->get_associated_service()->config_object();
63 confdb->create(dbfile, "NetworkConnection", uid, ntObj);
64 ntObj.set_by_val<std::string>("data_type", ntDesc->get_data_type());
65 ntObj.set_by_val<std::string>("connection_type", ntDesc->get_connection_type());
66 ntObj.set_obj("associated_service", &ntServiceObj);
67
68 return ntObj;
69}
70
71void
72TriggerApplication::generate_modules(std::shared_ptr<appmodel::ConfigurationHelper> helper) const
73{
74
75 std::vector<const confmodel::DaqModule*> modules;
76
77 ConfigObjectFactory obj_fac(this);
78
79 auto ti_conf = get_trigger_inputs_handler();
80 auto ti_class = ti_conf->get_template_for();
81 std::string handler_name("");
82 // Process the queue rules looking for inputs to our trigger handler modules
83 const QueueDescriptor* ti_inputq_desc = nullptr;
84
85 for (auto rule : get_queue_rules()) {
86 auto destination_class = rule->get_destination_class();
87 auto data_type = rule->get_descriptor()->get_data_type();
88 if (destination_class == "DataHandlerModule" || destination_class == ti_class) {
89 ti_inputq_desc = rule->get_descriptor();
90 }
91 }
92 // Process the network rules looking for the TP handler data reuest inputs
93 const NetworkConnectionDescriptor* req_net_desc = nullptr;
94 const NetworkConnectionDescriptor* tin_net_desc = nullptr;
95 const NetworkConnectionDescriptor* tout_net_desc = nullptr;
96 const NetworkConnectionDescriptor* tset_out_net_desc = nullptr;
97 for (auto rule : get_network_rules()) {
98 auto endpoint_class = rule->get_endpoint_class();
99 auto data_type = rule->get_descriptor()->get_data_type();
100
101 if (data_type == "DataRequest") {
102 req_net_desc = rule->get_descriptor();
103 } else if (data_type == "TASet" || data_type == "TCSet") {
104 tset_out_net_desc = rule->get_descriptor();
105 } else if (endpoint_class == "DataSubscriberModule") {
106 if (!tin_net_desc) {
107 tin_net_desc = rule->get_descriptor();
108 } else if (rule->get_descriptor()->get_data_type() == tin_net_desc->get_data_type()) {
109 // For now endpoint_class of DataSubscriberModule for both input and output
110 // with the same data type is not possible.
111 throw(BadConf(ERS_HERE, "Have two network connections of the same data_type and the same endpoint_class"));
112 } else if (tin_net_desc->get_data_type() == "TriggerActivity" &&
113 rule->get_descriptor()->get_data_type() == "TriggerCandidate") {
114 // For TA->TC
115 tout_net_desc = rule->get_descriptor();
116 handler_name = "tahandler";
117 } else if (tin_net_desc->get_data_type() == "TriggerCandidate" &&
118 rule->get_descriptor()->get_data_type() == "TriggerActivity") {
119 // For TA->TC if we saved TC network connection as input first...
120 tout_net_desc = tin_net_desc;
121 tin_net_desc = rule->get_descriptor();
122 handler_name = "tahandler";
123 } else {
124 throw(BadConf(ERS_HERE, "Unexpected input & output network connection descriptors provided"));
125 }
126 } else if (data_type == "TriggerActivity" || data_type == "TriggerCandidate") {
127 tout_net_desc = rule->get_descriptor();
128 if (data_type == "TriggerActivity")
129 handler_name = "tphandler";
130 else
131 handler_name = "tahandler";
132 }
133 }
134
135 // Process special Network rules!
136 std::vector<conffwk::ConfigObject> fragOutObjs;
137 for (auto [uid, descriptor] : helper->get_netdescriptors("Fragment", "DFApplication")) {
138 fragOutObjs.push_back(obj_fac.create_net_obj(descriptor, uid));
139 }
140 if (req_net_desc == nullptr) {
141 throw(BadConf(ERS_HERE, "No network descriptor given to receive request and send data was set"));
142 }
143 if (tin_net_desc == nullptr) {
144 throw(BadConf(ERS_HERE, "No network descriptor given to receive trigger objects"));
145 }
146 if (tout_net_desc == nullptr) {
147 throw(BadConf(ERS_HERE, "No network descriptor given to publish trigger objects"));
148 }
149 if (ti_inputq_desc == nullptr) {
150 throw(BadConf(ERS_HERE, "No data input queue descriptor given"));
151 }
152
153 auto input_queue_obj = obj_fac.create_queue_obj(ti_inputq_desc);
154
155 auto req_net_obj = obj_fac.create_net_obj(req_net_desc, UID());
156
157 auto tin_net_obj = obj_fac.create_net_obj(tin_net_desc, ".*");
158
159 auto tout_net_obj = obj_fac.create_net_obj(tout_net_desc, UID());
160 conffwk::ConfigObject tset_out_net_obj;
161 if (tset_out_net_desc) {
162 tset_out_net_obj = obj_fac.create_net_obj(tset_out_net_desc, UID());
163 }
164
165 // build up the full list of outputs
166 std::vector<const conffwk::ConfigObject*> ti_output_objs;
167 for (auto& fNet : fragOutObjs) {
168 ti_output_objs.push_back(&fNet);
169 }
170 ti_output_objs.push_back(&tout_net_obj);
171 if (tset_out_net_desc != nullptr) {
172 ti_output_objs.push_back(&tset_out_net_obj);
173 }
174
175 if (get_source_id() == nullptr) {
176 throw(BadConf(ERS_HERE, "No source_id associated with this TriggerApplication!"));
177 }
178 uint32_t source_id = get_source_id()->get_sid();
179 std::string ti_uid(handler_name + "-" + std::to_string(source_id));
180 auto ti_obj = obj_fac.create(ti_class, ti_uid);
181
182 ti_obj.set_by_val<uint32_t>("source_id", source_id);
183 ti_obj.set_by_val<uint32_t>("detector_id", 1); // 1 == kDAQ
184 ti_obj.set_by_val<bool>("post_processing_enabled", !get_tx_generation_disabled());
185
186 auto ti_conf_obj = ti_conf->config_object();
187 ti_obj.set_obj("module_configuration", &ti_conf_obj);
188 ti_obj.set_objs("inputs", { &input_queue_obj, &req_net_obj });
189 ti_obj.set_objs("outputs", ti_output_objs);
190 // Add to our list of modules to return
191 modules.push_back(obj_fac.get_dal<DataHandlerModule>(ti_uid));
192
193 // Now create the DataSubscriberModule object
194 auto rdr_conf = get_data_subscriber();
195 if (rdr_conf == nullptr) {
196 throw(BadConf(ERS_HERE, "No DataReaderModule configuration given"));
197 }
198
199 // Create a DataReaderModule
200
201 std::string reader_uid("data-reader-" + UID());
202 std::string reader_class = rdr_conf->get_template_for();
203 TLOG_DEBUG(7) << "creating OKS configuration object for Data subscriber class " << reader_class;
204 auto reader_obj = obj_fac.create(reader_class, reader_uid);
205 reader_obj.set_objs("inputs", { &tin_net_obj });
206 reader_obj.set_objs("outputs", { &input_queue_obj });
207 reader_obj.set_obj("configuration", &rdr_conf->config_object());
208
209 modules.push_back(obj_fac.get_dal<DataSubscriberModule>(reader_uid));
210
211 obj_fac.update_modules(modules);
212}
213
214} // namespace appmodel
215} // namespace dunedaq
#define ERS_HERE
void update_modules(const std::vector< const confmodel::DaqModule * > &modules)
conffwk::ConfigObject create_net_obj(const NetworkConnectionDescriptor *ndesc, std::string uid) const
Helper function that gets a network connection config.
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::string & get_connection_type() const
Get "connection_type" attribute value.
const std::string & get_data_type() const
Get "data_type" attribute value. string identifying type of data transferred through this connection.
const dunedaq::confmodel::Service * get_associated_service() const
Get "associated_service" relationship value. Service provided by this connection.
const std::vector< const dunedaq::appmodel::NetworkConnectionRule * > & get_network_rules() const
Get "network_rules" relationship value.
const std::vector< const dunedaq::appmodel::QueueConnectionRule * > & get_queue_rules() const
Get "queue_rules" relationship value.
const dunedaq::appmodel::SourceIDConf * get_source_id() const
Get "source_id" relationship value.
uint32_t get_sid() const
Get "sid" attribute value.
const dunedaq::appmodel::DataHandlerConf * get_trigger_inputs_handler() const
Get "trigger_inputs_handler" relationship value.
const dunedaq::appmodel::DataReaderConf * get_data_subscriber() const
Get "data_subscriber" relationship value.
bool get_tx_generation_disabled() const
Get "tx_generation_disabled" attribute value. Disable TA/TC generation as a post-processing task – on...
void generate_modules(std::shared_ptr< appmodel::ConfigurationHelper >) const override
void set_by_val(const std::string &name, T value)
Set attribute value.
void set_objs(const std::string &name, const std::vector< const ConfigObject * > &o, bool skip_non_null_check=false)
Set relationship multi-value.
void set_obj(const std::string &name, const ConfigObject *o, bool skip_non_null_check=false)
Set relationship single-value.
void create(const std::string &at, const std::string &class_name, const std::string &id, ConfigObject &object)
Create new object by class name and object id.
const ConfigObject & config_object() const
const std::string & UID() const noexcept
conffwk entry point
#define TLOG_DEBUG(lvl,...)
Definition Logging.hpp:116
conffwk::ConfigObject create_network_connection(std::string uid, const NetworkConnectionDescriptor *ntDesc, conffwk::Configuration *confdb, const std::string &dbfile)
Helper function that gets a network connection config.
The DUNE-DAQ namespace.
CIB Buffer std::string descriptor Message from std::string descriptor CIB process std::string descriptor descriptor