DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
TriggerApplication.cpp
Go to the documentation of this file.
1
13
17#include "confmodel/Service.hpp"
18#include "confmodel/Session.hpp"
19
24
27
30
33
35
39
40#include "logging/Logging.hpp"
41
42#include <string>
43#include <vector>
44
45namespace dunedaq {
46namespace appmodel {
47
60 const NetworkConnectionDescriptor* ntDesc,
62 const std::string& dbfile)
63{
64 auto ntServiceObj = ntDesc->get_associated_service()->config_object();
66 confdb->create(dbfile, "NetworkConnection", uid, ntObj);
67 ntObj.set_by_val<std::string>("data_type", ntDesc->get_data_type());
68 ntObj.set_by_val<std::string>("connection_type", ntDesc->get_connection_type());
69 ntObj.set_obj("associated_service", &ntServiceObj);
70
71 return ntObj;
72}
73
74
75std::vector<const confmodel::DaqModule*>
77{
78
79 std::vector<const confmodel::DaqModule*> modules;
80
81 ConfigObjectFactory obj_fac(this);
82
83 auto ti_conf = get_trigger_inputs_handler();
84 auto ti_class = ti_conf->get_template_for();
85 std::string handler_name("");
86 // Process the queue rules looking for inputs to our trigger handler modules
87 const QueueDescriptor* ti_inputq_desc = nullptr;
88
89 for (auto rule : get_queue_rules()) {
90 auto destination_class = rule->get_destination_class();
91 auto data_type = rule->get_descriptor()->get_data_type();
92 if (destination_class == "DataHandlerModule" || destination_class == ti_class) {
93 ti_inputq_desc = rule->get_descriptor();
94 }
95 }
96 // Process the network rules looking for the TP handler data reuest inputs
97 const NetworkConnectionDescriptor* req_net_desc = nullptr;
98 const NetworkConnectionDescriptor* tin_net_desc = nullptr;
99 const NetworkConnectionDescriptor* tout_net_desc = nullptr;
100 const NetworkConnectionDescriptor* tset_out_net_desc = nullptr;
101 for (auto rule : get_network_rules()) {
102 auto endpoint_class = rule->get_endpoint_class();
103 auto data_type = rule->get_descriptor()->get_data_type();
104
105 if (data_type == "DataRequest") {
106 req_net_desc = rule->get_descriptor();
107 }
108 else if (data_type == "TASet" || data_type == "TCSet"){
109 tset_out_net_desc = rule->get_descriptor();
110 }
111 else if (endpoint_class == "DataSubscriberModule") {
112 if (!tin_net_desc) {
113 tin_net_desc = rule->get_descriptor();
114 }
115 else if (rule->get_descriptor()->get_data_type() == tin_net_desc->get_data_type()) {
116 // For now endpoint_class of DataSubscriberModule for both input and output
117 // with the same data type is not possible.
118 throw (BadConf(ERS_HERE, "Have two network connections of the same data_type and the same endpoint_class"));
119 }
120 else if (tin_net_desc->get_data_type() == "TriggerActivity" &&
121 rule->get_descriptor()->get_data_type() == "TriggerCandidate") {
122 // For TA->TC
123 tout_net_desc = rule->get_descriptor();
124 handler_name = "tahandler";
125 }
126 else if (tin_net_desc->get_data_type() == "TriggerCandidate" &&
127 rule->get_descriptor()->get_data_type() == "TriggerActivity") {
128 // For TA->TC if we saved TC network connection as input first...
129 tout_net_desc = tin_net_desc;
130 tin_net_desc = rule->get_descriptor();
131 handler_name = "tahandler";
132 }
133 else {
134 throw (BadConf(ERS_HERE, "Unexpected input & output network connection descriptors provided"));
135 }
136 }
137 else if (data_type == "TriggerActivity" || data_type == "TriggerCandidate"){
138 tout_net_desc = rule->get_descriptor();
139 if (data_type == "TriggerActivity")
140 handler_name = "tphandler";
141 else
142 handler_name = "tahandler";
143 }
144 }
145
146 // Process special Network rules!
147 // Looking for Fragment rules from DFAppplications in current Session
148 auto sessionApps = session->get_enabled_applications();
149 std::vector<conffwk::ConfigObject> fragOutObjs;
150 for (auto app : sessionApps) {
151 auto dfapp = app->cast<appmodel::DFApplication>();
152 if (dfapp == nullptr)
153 continue;
154
155 auto dfNRules = dfapp->get_network_rules();
156 for (auto rule : dfNRules) {
157 auto descriptor = rule->get_descriptor();
158 auto data_type = descriptor->get_data_type();
159 if (data_type == "Fragment") {
160 // std::string dreqNetUid(descriptor->get_uid_base() + )
161 auto frag_conn = obj_fac.create_net_obj(descriptor, dfapp->UID());
162
163 fragOutObjs.push_back(frag_conn);
164 } // If network rule has TriggerDecision type of data
165 } // Loop over Apps network rules
166 } // loop over Session specific Apps
167
168
169 if ( req_net_desc== nullptr) {
170 throw (BadConf(ERS_HERE, "No network descriptor given to receive request and send data was set"));
171 }
172 if ( tin_net_desc== nullptr) {
173 throw (BadConf(ERS_HERE, "No network descriptor given to receive trigger objects"));
174 }
175 if ( tout_net_desc== nullptr) {
176 throw (BadConf(ERS_HERE, "No network descriptor given to publish trigger objects"));
177 }
178 if (ti_inputq_desc == nullptr) {
179 throw (BadConf(ERS_HERE, "No data input queue descriptor given"));
180 }
181
182 auto input_queue_obj = obj_fac.create_queue_obj(ti_inputq_desc);
183
184 auto req_net_obj = obj_fac.create_net_obj(req_net_desc, UID());
185
186 auto tin_net_obj = obj_fac.create_net_obj(tin_net_desc, ".*");
187
188 auto tout_net_obj = obj_fac.create_net_obj(tout_net_desc, UID());
189 conffwk::ConfigObject tset_out_net_obj;
190 if (tset_out_net_desc) {
191 tset_out_net_obj = obj_fac.create_net_obj(tset_out_net_desc, UID());
192 }
193
194
195 // build up the full list of outputs
196 std::vector<const conffwk::ConfigObject*> ti_output_objs;
197 for (auto& fNet : fragOutObjs) {
198 ti_output_objs.push_back(&fNet);
199 }
200 ti_output_objs.push_back(&tout_net_obj);
201 if (tset_out_net_desc!= nullptr) {
202 ti_output_objs.push_back(&tset_out_net_obj);
203 }
204
205 if (get_source_id() == nullptr) {
206 throw(BadConf(ERS_HERE, "No source_id associated with this TriggerApplication!"));
207 }
208 uint32_t source_id = get_source_id()->get_sid();
209 std::string ti_uid(handler_name + "-" + std::to_string(source_id));
210 auto ti_obj = obj_fac.create(ti_class, ti_uid);
211
212 ti_obj.set_by_val<uint32_t>("source_id", source_id);
213 ti_obj.set_by_val<uint32_t>("detector_id", 1); // 1 == kDAQ
214 ti_obj.set_by_val<bool>("post_processing_enabled", !get_tx_generation_disabled());
215
216 auto ti_conf_obj = ti_conf->config_object();
217 ti_obj.set_obj("module_configuration", &ti_conf_obj);
218 ti_obj.set_objs("inputs", {&input_queue_obj, &req_net_obj});
219 ti_obj.set_objs("outputs", ti_output_objs);
220 // Add to our list of modules to return
221 modules.push_back(obj_fac.get_dal<DataHandlerModule>(ti_uid));
222
223
224 // Now create the DataSubscriberModule object
225 auto rdr_conf = get_data_subscriber();
226 if (rdr_conf == nullptr) {
227 throw (BadConf(ERS_HERE, "No DataReaderModule configuration given"));
228 }
229
230 // Create a DataReaderModule
231
232 std::string reader_uid("data-reader-"+UID());
233 std::string reader_class = rdr_conf->get_template_for();
234 TLOG_DEBUG(7) << "creating OKS configuration object for Data subscriber class " << reader_class;
235 auto reader_obj = obj_fac.create(reader_class, reader_uid);
236 reader_obj.set_objs("inputs", {&tin_net_obj} );
237 reader_obj.set_objs("outputs", {&input_queue_obj} );
238 reader_obj.set_obj("configuration", &rdr_conf->config_object());
239
240 modules.push_back(obj_fac.get_dal<DataSubscriberModule>(reader_uid));
241
242 return modules;
243}
244
245} // namespace appmodel
246} // namespace dunedaq
#define ERS_HERE
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.
std::vector< const dunedaq::confmodel::DaqModule * > generate_modules(const confmodel::Session *) const override
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 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:112
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.
Including Qt Headers.