DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
TPReplayApplication.cpp
Go to the documentation of this file.
1
12
14
17#include "confmodel/Service.hpp"
18
35
36#include "logging/Logging.hpp"
37
38#include <iomanip>
39#include <set>
40#include <string>
41#include <vector>
42
43namespace dunedaq {
44namespace appmodel {
45
46std::vector<const confmodel::DaqModule*>
48{
49
50 std::vector<const confmodel::DaqModule*> modules;
51
52 ConfigObjectFactory obj_fac(this);
53
54 /**************************************************************
55 * Instantiate the Trigger Primitive Maker Module module
56 **************************************************************/
57
58 auto tprm_conf = get_tprm_conf();
59
60 if (!tprm_conf) {
61 throw(BadConf(ERS_HERE, "No TPPM configuration in TPReplayApplication given"));
62 }
63
64 const std::string tprm_uid(tprm_conf->UID());
65 const std::string tprm_class = tprm_conf->get_template_for();
66 auto tpm_obj = obj_fac.create(tprm_class, tprm_uid);
67 tpm_obj.set_obj("configuration", &(tprm_conf->config_object()));
68
69 /**************************************************************
70 * Get total planes from config
71 **************************************************************/
72 const int total_planes = tprm_conf->get_total_planes();
73
74 /**************************************************************
75 * Extract # of filtered planes
76 **************************************************************/
77 const auto plane_filtering = tprm_conf->get_filter_out_plane();
78 if (plane_filtering.size() >= 3) {
79 throw(BadConf(ERS_HERE,
80 "TPReplayApplication: too many planes configured for filtering! At most 2 planes can be filtered!"));
81 }
82
83 /**************************************************************
84 * Instantiate the TP Handler (TA Maker) module(s)
85 **************************************************************/
86 auto tph_conf = get_tp_handler();
87 if (!tph_conf) {
88 throw(BadConf(ERS_HERE, "TP handler configuration object is missing"));
89 }
90 std::string tph_class = "";
91 if (tph_conf != nullptr) {
92 tph_class = tph_conf->get_template_for();
93 }
94
95 // For now, have X (X=total_planes) identical config TP Handlers
96 std::vector<conffwk::ConfigObject> TPHs;
97 std::vector<std::string> TPHs_uids;
98
99 // Source IDs
100 auto tpsrc_ids = get_tp_source_ids();
101 if (tpsrc_ids.size() < static_cast<size_t>(total_planes)) {
102 throw(BadConf(ERS_HERE, "Not enough TP source IDs provided"));
103 }
104
105 const auto tph_conf_obj = tph_conf->config_object();
106 for (int i = 0; i < total_planes; i++) {
107 std::string tp_uid = "tphandler-tpreplay-" + std::to_string(i + 1);
108 TPHs_uids.push_back(tp_uid);
109 auto tph_obj = obj_fac.create(tph_class, tp_uid);
110 tph_obj.set_by_val<uint32_t>("source_id", tpsrc_ids[i]->get_sid());
111 tph_obj.set_by_val<uint32_t>("detector_id", 1); // 1 == kDAQ
112 tph_obj.set_by_val<bool>("post_processing_enabled", true);
113 tph_obj.set_obj("module_configuration", &tph_conf_obj);
114 TPHs.push_back(tph_obj);
115 }
116
117 /**************************************************************
118 * Deal with queues
119 **************************************************************/
120 // Load queue configurations
121 const QueueDescriptor* tp_inputq_desc = nullptr;
122
123 for (const auto& rule : get_queue_rules()) {
124 auto destination_class = rule->get_destination_class();
125 auto data_type = rule->get_descriptor()->get_data_type();
126 if (destination_class == "TriggerDataHandlerModule" && data_type == "TriggerPrimitiveVector") {
127 tp_inputq_desc = rule->get_descriptor();
128 }
129 }
130 if (!tp_inputq_desc) {
131 throw(BadConf(ERS_HERE, "No matching queue descriptor found for TP input"));
132 }
133
134 // Same as above (ROUs * planes queues), later dynamically
135 std::vector<conffwk::ConfigObject> TP_queues;
136 for (int i = 0; i < total_planes; i++) {
137 std::string tp_q_uid = "tpinput-" + std::to_string(i + 1);
138 auto tp_q_obj = obj_fac.create_queue_obj(tp_inputq_desc, tp_q_uid);
139 TP_queues.push_back(tp_q_obj);
140 }
141
142 /**************************************************************
143 * Deal with network connections
144 **************************************************************/
145 const NetworkConnectionDescriptor* ta_net_desc = nullptr;
146 const NetworkConnectionDescriptor* dr_net_desc = nullptr;
147
148 for (const auto& rule : get_network_rules()) {
149 auto endpoint_class = rule->get_endpoint_class();
150 auto data_type = rule->get_descriptor()->get_data_type();
151 if (data_type == "TriggerActivity") {
152 ta_net_desc = rule->get_descriptor();
153 } else if (data_type == "DataRequest") {
154 dr_net_desc = rule->get_descriptor();
155 }
156 }
157 if (!ta_net_desc || !dr_net_desc) {
158 throw(BadConf(ERS_HERE, "Missing network descriptors for TA or DR"));
159 }
160
161 // Create vectors for network connections
162 std::vector<conffwk::ConfigObject> ta_net_objects;
163 std::vector<conffwk::ConfigObject> dr_net_objects;
164
165 // Outputs for each handler
166 for (int i = 0; i < total_planes; i++) {
167 const auto ta_service_obj = ta_net_desc->get_associated_service()->config_object();
168 const std::string ta_stream_uid = ta_net_desc->get_uid_base() + UID() + "-" + std::to_string(i + 1);
169 auto ta_net_obj = obj_fac.create_net_obj(ta_net_desc, ta_stream_uid);
170 ta_net_obj.set_obj("associated_service", &ta_service_obj);
171 ta_net_objects.push_back(ta_net_obj);
172 }
173
174 // Data requests
175 for (int i = 0; i < total_planes; i++) {
176 const auto dr_service_obj = dr_net_desc->get_associated_service()->config_object();
177 // Format the integer with leading zeros to maintain consistent length
178 std::ostringstream oss;
179 oss << UID() << "-1000" << std::setfill('0') << std::setw(2) // Ensures at least 2 digits (e.g., 01, 10)
180 << (i + 1);
181 const std::string dr_stream_uid = oss.str();
182 auto dr_net_obj = obj_fac.create_net_obj(dr_net_desc, dr_stream_uid);
183 dr_net_obj.set_obj("associated_service", &dr_service_obj);
184 dr_net_objects.push_back(dr_net_obj);
185 }
186
187 /**************************************************************
188 * Finally set inputs & outputs
189 **************************************************************/
190 // Convert TP_queues to a vector of raw pointers
191 std::vector<const conffwk::ConfigObject*> raw_tp_queues;
192 for (const auto& tp_queue : TP_queues) {
193 raw_tp_queues.push_back(&tp_queue);
194 }
195 tpm_obj.set_objs("outputs", raw_tp_queues);
196
197 for (int i = 0; i < total_planes; i++) {
198 // Convert network objects to raw pointers
199 const std::vector<const conffwk::ConfigObject*> temp_inputs = { &TP_queues[i], &dr_net_objects[i] };
200 const std::vector<const conffwk::ConfigObject*> temp_outputs = { &ta_net_objects[i] };
201 TPHs[i].set_objs("inputs", temp_inputs);
202 TPHs[i].set_objs("outputs", temp_outputs);
203 }
204
205 // Store modules
206 modules.push_back(obj_fac.get_dal<confmodel::DaqModule>(tprm_conf->UID()));
207 for (int i = 0; i < total_planes; i++) {
208 modules.push_back(obj_fac.get_dal<confmodel::DaqModule>(TPHs_uids[i]));
209 }
210
211 return modules;
212}
213
214} // namespace appmodel
215} // 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_uid_base() const
Get "uid_base" attribute value. Base for UID string. To be combined with a source id.
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 std::vector< const dunedaq::appmodel::SourceIDConf * > & get_tp_source_ids() const
Get "tp_source_ids" relationship value.
const dunedaq::appmodel::DataHandlerConf * get_tp_handler() const
Get "tp_handler" relationship value.
const dunedaq::appmodel::TPReplayModuleConf * get_tprm_conf() const
Get "tprm_conf" relationship value.
std::vector< const dunedaq::confmodel::DaqModule * > generate_modules(const confmodel::Session *) const override
void set_by_val(const std::string &name, T value)
Set attribute value.
void set_obj(const std::string &name, const ConfigObject *o, bool skip_non_null_check=false)
Set relationship single-value.
const ConfigObject & config_object() const
const std::string & UID() const noexcept
conffwk entry point
The DUNE-DAQ namespace.
Definition DataStore.hpp:57