Skip to content

Commit c5d2218

Browse files
authored
Merge pull request #274 from DUNE-DAQ/eflumerf/DMCRConfiguration
Configuration objects for DataMoveCallbackRegistry
2 parents 9b1794c + 2bb1bbd commit c5d2218

File tree

7 files changed

+139
-84
lines changed

7 files changed

+139
-84
lines changed

schema/appmodel/application.schema.xml

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@
8080

8181
<oks-schema>
8282

83-
<info name="" type="" num-of-items="66" oks-format="schema" oks-version="862f2957270" created-by="gjc" created-on="thinkpad" creation-time="20230616T091343" last-modified-by="eflumerf" last-modified-on="ironvirt9.mshome.net" last-modification-time="20251104T211957"/>
83+
<info name="" type="" num-of-items="69" oks-format="schema" oks-version="862f2957270" created-by="gjc" created-on="thinkpad" creation-time="20230616T091343" last-modified-by="eflumerf" last-modified-on="ironvirt9.mshome.net" last-modification-time="20260203T131505"/>
8484

8585
<include>
8686
<file path="schema/confmodel/dunedaq.schema.xml"/>
@@ -94,6 +94,7 @@
9494
<relationship name="data_writers" class-type="SocketDataWriterConf" low-cc="one" high-cc="many" is-composite="no" is-exclusive="no" is-dependent="no"/>
9595
<relationship name="data_reader" class-type="DataReaderConf" low-cc="one" high-cc="one" is-composite="no" is-exclusive="no" is-dependent="no"/>
9696
<relationship name="detector_connections" class-type="DetectorToDaqConnection" low-cc="zero" high-cc="many" is-composite="no" is-exclusive="no" is-dependent="no"/>
97+
<relationship name="callback_desc" class-type="DataMoveCallbackDescriptor" low-cc="one" high-cc="one" is-composite="no" is-exclusive="no" is-dependent="no"/>
9798
<method name="generate_modules" description="Generate daq module dal objects for streams of the CRTReaderApplication on the fly">
9899
<method-implementation language="c++" prototype="void generate_modules(const confmodel::Session*) const override" body=""/>
99100
</method>
@@ -167,6 +168,7 @@
167168
<attribute name="emulation_mode" type="bool" init-value="false" is-not-null="yes"/>
168169
<attribute name="post_processing_enabled" type="bool" init-value="true"/>
169170
<relationship name="geo_id" class-type="GeoId" low-cc="zero" high-cc="one" is-composite="no" is-exclusive="no" is-dependent="no"/>
171+
<relationship name="raw_data_callback" description="Configuration for raw data callback" class-type="DataMoveCallbackConf" low-cc="zero" high-cc="one" is-composite="no" is-exclusive="no" is-dependent="no"/>
170172
<relationship name="module_configuration" class-type="DataHandlerConf" low-cc="one" high-cc="one" is-composite="no" is-exclusive="no" is-dependent="no"/>
171173
</class>
172174

@@ -187,6 +189,7 @@
187189
<superclass name="DaqModule"/>
188190
<relationship name="configuration" class-type="DataReaderConf" low-cc="one" high-cc="one" is-composite="no" is-exclusive="no" is-dependent="no"/>
189191
<relationship name="connections" class-type="DetectorToDaqConnection" low-cc="one" high-cc="many" is-composite="yes" is-exclusive="no" is-dependent="no"/>
192+
<relationship name="raw_data_callbacks" description="Configurations for raw data callbacks" class-type="DataMoveCallbackConf" low-cc="one" high-cc="many" is-composite="no" is-exclusive="no" is-dependent="no"/>
190193
</class>
191194

192195
<class name="DataRecorderConf">
@@ -403,6 +406,16 @@
403406
<attribute name="data_type" description="string identifying type of data transferred through this queue" type="string" is-not-null="yes"/>
404407
</class>
405408

409+
<class name="DataMoveCallbackConf">
410+
<attribute name="source_id" type="u32" init-value="0" is-not-null="yes"/>
411+
<attribute name="data_type" description="Name of the output data type. Should be defined via a call to DUNE_DAQ_TYPESTRING" type="string" init-value="WIBEthFrame"/>
412+
</class>
413+
414+
<class name="DataMoveCallbackDescriptor">
415+
<attribute name="uid_base" description="Base for callback UID string. May be combined with a source id" type="string" is-not-null="yes"/>
416+
<attribute name="data_type" description="string identifying type of data passed as a callback parameter" type="string" is-not-null="yes"/>
417+
</class>
418+
406419
<class name="ReadoutApplication">
407420
<superclass name="SmartDaqApplication"/>
408421
<superclass name="ResourceSetDisableAND"/>
@@ -417,6 +430,7 @@
417430
<relationship name="data_recorder" class-type="DataRecorderConf" low-cc="zero" high-cc="one" is-composite="no" is-exclusive="no" is-dependent="no"/>
418431
<relationship name="fragment_aggregator" class-type="FragmentAggregatorConf" low-cc="one" high-cc="one" is-composite="no" is-exclusive="no" is-dependent="no"/>
419432
<relationship name="detector_connections" description="The list of detector channels to be read out by this readout application." class-type="DetectorToDaqConnection" low-cc="zero" high-cc="many" is-composite="no" is-exclusive="no" is-dependent="no"/>
433+
<relationship name="callback_desc" class-type="DataMoveCallbackDescriptor" low-cc="one" high-cc="one" is-composite="no" is-exclusive="no" is-dependent="no"/>
420434
<method name="generate_modules" description="Generate daq module dal objects for streams of thie ReadoutApplication on the fly">
421435
<method-implementation language="c++" prototype="void generate_modules(const confmodel::Session*) const override" body=""/>
422436
</method>
@@ -514,6 +528,7 @@
514528
<superclass name="DaqModule"/>
515529
<relationship name="configuration" class-type="SocketDataWriterConf" low-cc="one" high-cc="one" is-composite="no" is-exclusive="no" is-dependent="no"/>
516530
<relationship name="connections" class-type="NetworkDetectorToDaqConnection" low-cc="one" high-cc="many" is-composite="yes" is-exclusive="no" is-dependent="no"/>
531+
<relationship name="raw_data_callback" description="Configuration for raw data callback" class-type="DataMoveCallbackConf" low-cc="one" high-cc="one" is-composite="no" is-exclusive="no" is-dependent="no"/>
517532
</class>
518533

519534
<class name="SourceIDConf">

src/CRTReaderApplication.cpp

Lines changed: 14 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "appmodel/DataReaderConf.hpp"
1616
#include "appmodel/SocketWriterConf.hpp"
1717
#include "appmodel/SocketWriterModule.hpp"
18+
#include "appmodel/DataMoveCallbackConf.hpp"
1819
#include "appmodel/QueueConnectionRule.hpp"
1920
#include "appmodel/QueueDescriptor.hpp"
2021

@@ -66,24 +67,12 @@ CRTReaderApplication::generate_modules(const confmodel::Session* session) const
6667
}
6768

6869
//
69-
// Process the queue rules looking for inputs to our DL/TP handler modules
70+
// Get the callback descriptor
7071
//
71-
const QueueDescriptor* dlh_input_qdesc = nullptr;
72-
73-
for (auto rule : get_queue_rules()) {
74-
auto destination_class = rule->get_destination_class();
75-
auto data_type = rule->get_descriptor()->get_data_type();
76-
// Why datahander here? It is the base class for several DataHandler types (e.g. FDDataHandlerModule,
77-
// SNBDataHandlerModule)
78-
if (destination_class == "DataHandlerModule") {
79-
if (data_type != "DataRequest") {
80-
dlh_input_qdesc = rule->get_descriptor();
81-
}
82-
}
83-
}
72+
const DataMoveCallbackDescriptor* raw_data_callback_desc = get_callback_desc();
8473

85-
if (dlh_input_qdesc == nullptr) {
86-
throw(BadConf(ERS_HERE, "No data link handler input queue descriptor given"));
74+
if (raw_data_callback_desc == nullptr) {
75+
throw(BadConf(ERS_HERE, "No Raw Data Callback descriptor given"));
8776
}
8877

8978
//
@@ -93,7 +82,7 @@ CRTReaderApplication::generate_modules(const confmodel::Session* session) const
9382
// Loop over the detector to daq connections and generate one data reader per connection
9483

9584
// Collect all streams
96-
std::map<uint32_t, const confmodel::Connection*> data_queues_by_sid;
85+
std::map<uint32_t, const appmodel::DataMoveCallbackConf*> callback_confs_by_sid;
9786

9887
uint16_t conn_idx = 0;
9988

@@ -121,16 +110,15 @@ CRTReaderApplication::generate_modules(const confmodel::Session* session) const
121110
enabled_det_streams.push_back(stream);
122111
}
123112

124-
// Create the raw data queues
125-
std::vector<const conffwk::ConfigObject*> data_queue_objs;
126-
// keep a map for convenience
113+
// Create the raw data callbacks
114+
std::vector<const conffwk::ConfigObject*> raw_data_callback_objs;
127115

128116
// Create data queues
129117
for (auto ds : enabled_det_streams) {
130-
conffwk::ConfigObject queue_obj = obj_fac.create_queue_sid_obj(dlh_input_qdesc, ds);
131-
const auto* data_queue = obj_fac.get_dal<confmodel::Connection>(queue_obj.UID());
132-
data_queue_objs.push_back(&data_queue->config_object());
133-
data_queues_by_sid[ds->get_source_id()] = data_queue;
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;
134122
}
135123

136124
//-----------------------------------------------------------------
@@ -150,8 +138,8 @@ CRTReaderApplication::generate_modules(const confmodel::Session* session) const
150138

151139
// Populate configuration and interfaces (leave output queues for later)
152140
reader_obj.set_obj("configuration", &reader_conf->config_object());
153-
reader_obj.set_objs("connections", {&d2d_conn->config_object()});
154-
reader_obj.set_objs("outputs", data_queue_objs);
141+
reader_obj.set_objs("connections", { &d2d_conn->config_object() });
142+
reader_obj.set_objs("raw_data_callbacks", raw_data_callback_objs);
155143

156144
modules.push_back(obj_fac.get_dal<confmodel::DaqModule>(reader_obj.UID()));
157145

@@ -180,7 +168,6 @@ CRTReaderApplication::generate_modules(const confmodel::Session* session) const
180168
// Populate configuration and interfaces
181169
writer_obj.set_obj("configuration", &writer_conf->config_object());
182170
writer_obj.set_objs("connections", {&d2d_conn->config_object()});
183-
writer_obj.set_objs("inputs", data_queue_objs);
184171

185172
modules.push_back(obj_fac.get_dal<confmodel::DaqModule>(writer_obj.UID()));
186173
}

src/ConfigObjectFactory.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ ConfigObjectFactory::~ConfigObjectFactory() {
2222
oks::OksFile::set_nolock_mode(false);
2323
}
2424

25-
conffwk::ConfigObject
25+
conffwk::ConfigObject
2626
ConfigObjectFactory::create(const std::string& class_name,
2727
const std::string& id) const {
2828
conffwk::ConfigObject cfg_obj;
@@ -58,12 +58,24 @@ ConfigObjectFactory::create_queue_sid_obj(const QueueDescriptor* qdesc, uint32_t
5858
}
5959

6060
//---
61-
conffwk::ConfigObject
61+
conffwk::ConfigObject
6262
ConfigObjectFactory::create_queue_sid_obj(const QueueDescriptor* qdesc,
6363
const confmodel::DetectorStream* stream) const {
6464
return create_queue_sid_obj(qdesc, stream->get_source_id());
6565
}
6666

67+
//---
68+
conffwk::ConfigObject
69+
ConfigObjectFactory::create_callback_sid_obj(const DataMoveCallbackDescriptor* cdesc, uint32_t src_id) const
70+
{
71+
std::string rdc_uid(fmt::format("{}{}", cdesc->get_uid_base(), src_id));
72+
auto rdc_obj = create("DataMoveCallbackConf", rdc_uid);
73+
74+
rdc_obj.set_by_val<std::string>("data_type", cdesc->get_data_type());
75+
rdc_obj.set_by_val<uint32_t>("source_id", src_id);
76+
77+
return rdc_obj;
78+
}
6779
//---
6880

6981
/**

src/ConfigObjectFactory.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "appmodel/appmodelIssues.hpp"
1414
#include "appmodel/NetworkConnectionDescriptor.hpp"
1515
#include "appmodel/QueueDescriptor.hpp"
16+
#include "appmodel/DataMoveCallbackDescriptor.hpp"
1617
#include "appmodel/SmartDaqApplication.hpp"
1718

1819
#include "conffwk/ConfigObject.hpp"
@@ -53,7 +54,10 @@ class ConfigObjectFactory
5354
//---
5455
[[nodiscard]] conffwk::ConfigObject
5556
create_queue_sid_obj(const QueueDescriptor* qdesc, const confmodel::DetectorStream* stream) const;
57+
5658
//---
59+
[[nodiscard]] conffwk::ConfigObject create_callback_sid_obj(const DataMoveCallbackDescriptor* cdesc,
60+
uint32_t src_id) const;
5761

5862
/**
5963
* \brief Helper function that gets a network connection config

src/NP02ReadoutApplication.cpp

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
#include "confmodel/Service.hpp"
3737

3838
#include "appmodel/SourceIDConf.hpp"
39+
#include "appmodel/DataMoveCallbackConf.hpp"
3940
#include "appmodel/DataReaderModule.hpp"
4041
#include "appmodel/DataReaderConf.hpp"
4142
#include "appmodel/DataRecorderModule.hpp"
@@ -76,7 +77,7 @@ NP02ReadoutApplication::generate_modules(const confmodel::Session* session) cons
7677
TLOG_DEBUG(6) << "Generating modules for application " << this->UID();
7778

7879
ConfigObjectFactory obj_fac(this);
79-
80+
8081
//
8182
// Extract basic configuration objects
8283
//
@@ -106,7 +107,6 @@ NP02ReadoutApplication::generate_modules(const confmodel::Session* session) cons
106107
//
107108
// Process the queue rules looking for inputs to our DL/TP handler modules
108109
//
109-
const QueueDescriptor* dlh_input_qdesc = nullptr;
110110
const QueueDescriptor* dlh_reqinput_qdesc = nullptr;
111111
const QueueDescriptor* tp_input_qdesc = nullptr;
112112
// const QueueDescriptor* tpReqInputQDesc = nullptr;
@@ -121,8 +121,6 @@ NP02ReadoutApplication::generate_modules(const confmodel::Session* session) cons
121121
dlh_reqinput_qdesc = rule->get_descriptor();
122122
} else if ((data_type == "TriggerPrimitive" || data_type == "TriggerPrimitiveVector") && get_tp_generation_enabled()) {
123123
tp_input_qdesc = rule->get_descriptor();
124-
} else {
125-
dlh_input_qdesc = rule->get_descriptor();
126124
}
127125
} else if (destination_class == "FragmentAggregatorModule") {
128126
fa_output_qdesc = rule->get_descriptor();
@@ -159,6 +157,15 @@ NP02ReadoutApplication::generate_modules(const confmodel::Session* session) cons
159157
std::vector<const confmodel::Connection*> req_queues;
160158
conffwk::ConfigObject frag_queue_obj = obj_fac.create_queue_obj(fa_output_qdesc);
161159

160+
//
161+
// Get the callback descriptor
162+
//
163+
const DataMoveCallbackDescriptor* raw_data_callback_desc = get_callback_desc();
164+
165+
if (raw_data_callback_desc == nullptr) {
166+
throw(BadConf(ERS_HERE, "No Raw Data Callback descriptor given"));
167+
}
168+
162169
//
163170
// Scan Detector 2 DAQ connections to extract sender, receiver and stream information
164171
//
@@ -170,11 +177,11 @@ NP02ReadoutApplication::generate_modules(const confmodel::Session* session) cons
170177

171178
// Collect all streams
172179
std::vector<std::pair<int16_t, const confmodel::DetectorStream*>> all_enabled_det_streams;
173-
std::map<uint32_t, const confmodel::Connection*> data_queues_by_sid;
180+
std::map<uint32_t, const appmodel::DataMoveCallbackConf*> callback_confs_by_sid;
174181

175182
std::vector<const conffwk::ConfigObject*> d2d_conn_objs;
176183
uint16_t conn_idx = 0;
177-
184+
178185

179186
std::set<int16_t> numas;
180187
for (auto d2d_conn : get_detector_connections()) {
@@ -264,19 +271,18 @@ NP02ReadoutApplication::generate_modules(const confmodel::Session* session) cons
264271
reader_obj.set_obj("configuration", &reader_conf->config_object());
265272
reader_obj.set_objs("connections", d2d_conn_objs);
266273

267-
// Create the raw data queues
268-
std::vector<const conffwk::ConfigObject*> data_queue_objs;
269-
// keep a map for convenience
274+
// Create the raw data callbacks
275+
std::vector<const conffwk::ConfigObject*> raw_data_callback_objs;
270276

271277
// Create data queues
272278
for (auto& [numa, ds] : all_enabled_det_streams) {
273-
conffwk::ConfigObject queue_obj = obj_fac.create_queue_sid_obj(dlh_input_qdesc, ds);
274-
const auto* data_queue = obj_fac.get_dal<confmodel::Connection>(queue_obj.UID());
275-
data_queue_objs.push_back(&data_queue->config_object());
276-
data_queues_by_sid[ds->get_source_id()] = data_queue;
279+
conffwk::ConfigObject callback_obj = obj_fac.create_callback_sid_obj(raw_data_callback_desc, ds->get_source_id());
280+
const auto* callback_conf = obj_fac.get_dal<DataMoveCallbackConf>(callback_obj.UID());
281+
raw_data_callback_objs.push_back(&callback_conf->config_object());
282+
callback_confs_by_sid[ds->get_source_id()] = callback_conf;
277283
}
278284

279-
reader_obj.set_objs("outputs", data_queue_objs);
285+
reader_obj.set_objs("raw_data_callbacks", raw_data_callback_objs);
280286

281287
modules.push_back(obj_fac.get_dal<confmodel::DaqModule>(reader_obj.UID()));
282288

@@ -384,10 +390,9 @@ NP02ReadoutApplication::generate_modules(const confmodel::Session* session) cons
384390
dlh_obj.set_by_val<bool>("emulation_mode", emulation_mode);
385391
dlh_obj.set_obj("geo_id", &ds->get_geo_id()->config_object());
386392
dlh_obj.set_obj("module_configuration", &numa_dhlconf_map[numa]);
387-
std::vector<const conffwk::ConfigObject*> dlh_ins, dlh_outs;
393+
dlh_obj.set_obj("raw_data_callback", &callback_confs_by_sid[sid]->config_object());
388394

389-
// Add datalink-handler queue to the inputs
390-
dlh_ins.push_back(&data_queues_by_sid.at(sid)->config_object());
395+
std::vector<const conffwk::ConfigObject*> dlh_ins, dlh_outs;
391396

392397
// Create request queue
393398
conffwk::ConfigObject req_queue_obj = obj_fac.create_queue_sid_obj(dlh_reqinput_qdesc, ds);
@@ -478,6 +483,6 @@ NP02ReadoutApplication::generate_modules(const confmodel::Session* session) cons
478483
obj_fac.update_modules(modules);
479484
}
480485

481-
486+
482487
}
483488
}

0 commit comments

Comments
 (0)