1 #include "otsdaq-core/ConfigurationPluginDataFormats/ARTDAQAggregatorConfiguration.h"
2 #include "otsdaq-core/Macros/ConfigurationPluginMacros.h"
3 #include "otsdaq-core/ConfigurationInterface/ConfigurationManager.h"
4 #include "otsdaq-core/ConfigurationPluginDataFormats/XDAQContextConfiguration.h"
14 #define ARTDAQ_FCL_PATH std::string(getenv("USER_DATA")) + "/"+ "ARTDAQConfigurations/"
15 #define ARTDAQ_FILE_PREAMBLE "aggregator"
18 #define OUT out << tabStr << commentStr
19 #define PUSHTAB tabStr += "\t"
20 #define POPTAB tabStr.resize(tabStr.size()-1)
21 #define PUSHCOMMENT commentStr += "# "
22 #define POPCOMMENT commentStr.resize(commentStr.size()-2)
26 ARTDAQAggregatorConfiguration::ARTDAQAggregatorConfiguration(
void)
36 ARTDAQAggregatorConfiguration::~ARTDAQAggregatorConfiguration(
void)
43 mkdir((ARTDAQ_FCL_PATH).c_str(), 0755);
45 __MOUT__ <<
"*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*" << std::endl;
46 __MOUT__ << configManager->__SELF_NODE__ << std::endl;
49 std::vector<const XDAQContextConfiguration::XDAQContext *> aggContexts =
50 contextConfig->getAggregatorContexts();
54 for(
auto &aggContext: aggContexts)
56 auto aggConfigNode = contextConfig->getSupervisorConfigNode(configManager,
57 aggContext->contextUID_, aggContext->applications_[0].applicationUID_);
59 __MOUT__ <<
"Path for this aggregator config is " <<
60 aggContext->contextUID_ <<
"/" <<
61 aggContext->applications_[0].applicationUID_ <<
"/" <<
62 aggConfigNode.getValueAsString() <<
65 outputFHICL(aggConfigNode,
66 contextConfig->getARTDAQAppRank(aggContext->contextUID_),
72 std::string ARTDAQAggregatorConfiguration::getFHICLFilename(
const ConfigurationTree &aggregatorNode)
74 __MOUT__ <<
"ARTDAQ Aggregator UID: " << aggregatorNode.getValue() << std::endl;
75 std::string filename = ARTDAQ_FCL_PATH + ARTDAQ_FILE_PREAMBLE +
"-";
76 std::string uid = aggregatorNode.getValue();
77 for(
unsigned int i=0;i<uid.size();++i)
78 if((uid[i] >=
'a' && uid[i] <=
'z') ||
79 (uid[i] >=
'A' && uid[i] <=
'Z') ||
80 (uid[i] >=
'0' && uid[i] <=
'9'))
85 __MOUT__ <<
"fcl: " << filename << std::endl;
91 void ARTDAQAggregatorConfiguration::outputFHICL(
const ConfigurationTree &aggregatorNode,
92 unsigned int selfRank,
238 std::string filename = getFHICLFilename(aggregatorNode);
240 __MOUT__ <<
"selfRank = " << selfRank << std::endl;
246 std::string tabStr =
"";
247 std::string commentStr =
"";
249 out.open(filename, std::fstream::out | std::fstream::trunc);
252 __SS__ <<
"Failed to open ARTDAQ Builder fcl file: " << filename << std::endl;
253 throw std::runtime_error(ss.str());
258 auto services = aggregatorNode.getNode(
"servicesLink");
259 if(!services.isDisconnected())
261 OUT <<
"services: {\n";
265 OUT <<
"scheduler: {\n";
268 OUT <<
"fileMode: " << services.getNode(
"schedulerFileMode").getValue() <<
270 OUT <<
"errorOnFailureToPut: " <<
271 (services.getNode(
"schedulerErrorOnFailtureToPut").getValue<
bool>()?
"true":
"false") <<
279 OUT <<
"NetMonTransportServiceInterface: {\n";
282 OUT <<
"service_provider: " <<
284 services.getNode(
"NetMonTrasportServiceInterfaceServiceProvider").getValue()
297 auto daq = aggregatorNode.getNode(
"daqLink");
298 if(!daq.isDisconnected())
304 OUT <<
"aggregator: {\n";
307 auto parametersLink = daq.getNode(
"daqAggregatorParametersLink");
308 if(!parametersLink.isDisconnected())
311 auto parameters = parametersLink.getChildren();
312 for(
auto ¶meter:parameters)
314 if(!parameter.second.getNode(
"Enabled").getValue<
bool>())
317 auto comment = parameter.second.getNode(
"CommentDescription");
318 OUT << parameter.second.getNode(
"daqParameterKey").getValue() <<
320 parameter.second.getNode(
"daqParameterValue").getValue()
322 (comment.isDefaultValue()?
"":(
"\t # " + comment.getValue())) <<
325 if(!parameter.second.getNode(
"Enabled").getValue<
bool>())
331 OUT <<
"sources: {\n";
334 auto sourcesGroup = daq.getNode(
"daqAggregatorSourcesLink");
335 if(!sourcesGroup.isDisconnected())
337 auto sources = sourcesGroup.getChildren();
338 for(
auto &source:sources)
340 unsigned int sourceRank =
341 contextConfig->getARTDAQAppRank(
342 source.second.getNode(
"sourceARTDAQContextLink").getValue());
344 OUT << source.second.getNode(
"sourceKey").getValue() <<
346 " transferPluginType: " <<
347 source.second.getNode(
"transferPluginType").getValue() <<
350 " max_fragment_size_words: " <<
351 source.second.getNode(
"ARTDAQGlobalConfigurationLink/maxFragmentSizeWords").getValue<
unsigned int>() <<
362 OUT <<
"metrics: {\n";
365 auto metricsGroup = daq.getNode(
"daqMetricsLink");
366 if(!metricsGroup.isDisconnected())
368 auto metrics = metricsGroup.getChildren();
370 for(
auto &metric:metrics)
372 if(!metric.second.getNode(
"Status").getValue<
bool>())
375 OUT << metric.second.getNode(
"metricKey").getValue() <<
379 OUT <<
"metricPluginType: " <<
380 metric.second.getNode(
"metricPluginType").getValue()
383 metric.second.getNode(
"metricLevel").getValue()
386 auto metricParametersGroup = metric.second.getNode(
"metricParametersLink");
387 if(!metricParametersGroup.isDisconnected())
389 auto metricParameters = metricParametersGroup.getChildren();
390 for(
auto &metricParameter:metricParameters)
392 if(!metricParameter.second.getNode(
"Enabled").getValue<
bool>())
395 auto comment = metricParameter.second.getNode(
"CommentDescription");
396 OUT << metricParameter.second.getNode(
"metricParameterKey").getValue() <<
398 metricParameter.second.getNode(
"metricParameterValue").getValue()
400 (comment.isDefaultValue()?
"":(
"\t # " + comment.getValue())) <<
403 if(!metricParameter.second.getNode(
"Enabled").getValue<
bool>())
411 if(!metric.second.getNode(
"Status").getValue<
bool>())
419 auto destinationsGroup = daq.getNode(
"daqAggregatorDestinationsLink");
420 if(!destinationsGroup.isDisconnected())
422 auto destinations = destinationsGroup.getChildren();
423 for(
auto &destination:destinations)
425 unsigned int destinationRank = contextConfig->getARTDAQAppRank(
426 destination.second.getNode(
"destinationARTDAQContextLink").getValueAsString());
428 OUT << destination.second.getNode(
"destinationKey").getValue() <<
430 " transferPluginType: " <<
431 destination.second.getNode(
"transferPluginType").getValue() <<
434 " destination_rank: " <<
436 " max_fragment_size_words: " <<
437 destination.second.getNode(
"ARTDAQGlobalConfigurationLink/maxFragmentSizeWords").getValue<
unsigned int>() <<
449 auto source = aggregatorNode.getNode(
"sourceLink");
450 if(!source.isDisconnected())
452 OUT <<
"source: {\n";
455 OUT <<
"module_type: " << source.getNode(
"sourceModuleType").getValue() <<
463 auto outputs = aggregatorNode.getNode(
"outputsLink");
464 if(!outputs.isDisconnected())
466 OUT <<
"outputs: {\n";
470 auto outputPlugins = outputs.getChildren();
471 for(
auto &outputPlugin:outputPlugins)
473 if(!outputPlugin.second.getNode(
"Status").getValue<
bool>())
476 OUT << outputPlugin.second.getNode(
"outputKey").getValue() <<
479 OUT <<
"module_type: " <<
480 outputPlugin.second.getNode(
"outputModuleType").getValue() <<
482 auto pluginParameterLink = outputPlugin.second.getNode(
"outputModuleParameterLink");
483 if(!pluginParameterLink.isDisconnected())
485 auto pluginParameters = pluginParameterLink.getChildren();
486 for(
auto &pluginParameter:pluginParameters)
488 if(!pluginParameter.second.getNode(
"Enabled").getValue<
bool>())
491 auto comment = pluginParameter.second.getNode(
"CommentDescription");
492 OUT << pluginParameter.second.getNode(
"outputParameterKey").getValue() <<
494 pluginParameter.second.getNode(
"outputParameterValue").getValue()
496 (comment.isDefaultValue()?
"":(
"\t # " + comment.getValue())) <<
499 if(!pluginParameter.second.getNode(
"Enabled").getValue<
bool>())
506 if(!outputPlugin.second.getNode(
"Status").getValue<
bool>())
517 auto physics = aggregatorNode.getNode(
"physicsLink");
518 if(!physics.isDisconnected())
521 OUT <<
"physics: {\n";
525 auto analyzers = physics.getNode(
"analyzersLink");
526 if(!analyzers.isDisconnected())
529 OUT <<
"analyzers: {\n";
532 auto modules = analyzers.getChildren();
533 for(
auto &module:modules)
535 if(!module.second.getNode(
"Status").getValue<
bool>())
538 OUT << module.second.getNode(
"analyzerKey").getValue() <<
541 OUT <<
"module_type: " <<
542 module.second.getNode(
"analyzerModuleType").getValue() <<
544 auto moduleParameterLink = module.second.getNode(
"analyzerModuleParameterLink");
545 if(!moduleParameterLink.isDisconnected())
547 auto moduleParameters = moduleParameterLink.getChildren();
548 for(
auto &moduleParameter:moduleParameters)
550 if(!moduleParameter.second.getNode(
"Enabled").getValue<
bool>())
553 auto comment = moduleParameter.second.getNode(
"CommentDescription");
554 OUT << moduleParameter.second.getNode(
"analyzerParameterKey").getValue() <<
556 moduleParameter.second.getNode(
"analyzerParameterValue").getValue()
558 (comment.isDefaultValue()?
"":(
"\t # " + comment.getValue())) <<
561 if(!moduleParameter.second.getNode(
"Enabled").getValue<
bool>())
568 if(!module.second.getNode(
"Status").getValue<
bool>())
575 auto producers = physics.getNode(
"producersLink");
576 if(!producers.isDisconnected())
579 OUT <<
"producers: {\n";
582 auto modules = producers.getChildren();
583 for(
auto &module:modules)
585 if(!module.second.getNode(
"Status").getValue<
bool>())
588 OUT << module.second.getNode(
"producerKey").getValue() <<
591 OUT <<
"module_type: " <<
592 module.second.getNode(
"producerModuleType").getValue() <<
594 auto moduleParameterLink = module.second.getNode(
"producerModuleParameterLink");
595 if(!moduleParameterLink.isDisconnected())
597 auto moduleParameters = moduleParameterLink.getChildren();
598 for(
auto &moduleParameter:moduleParameters)
600 if(!moduleParameter.second.getNode(
"Enabled").getValue<
bool>())
603 auto comment = moduleParameter.second.getNode(
"CommentDescription");
604 OUT << moduleParameter.second.getNode(
"producerParameterKey").getValue() <<
606 moduleParameter.second.getNode(
"producerParameterValue").getValue()
608 (comment.isDefaultValue()?
"":(
"\t # " + comment.getValue())) <<
611 if(!moduleParameter.second.getNode(
"Enabled").getValue<
bool>())
618 if(!module.second.getNode(
"Status").getValue<
bool>())
626 auto filters = physics.getNode(
"filtersLink");
627 if(!filters.isDisconnected())
630 OUT <<
"filters: {\n";
633 auto modules = filters.getChildren();
634 for(
auto &module:modules)
636 if(!module.second.getNode(
"Status").getValue<
bool>())
639 OUT << module.second.getNode(
"filterKey").getValue() <<
642 OUT <<
"module_type: " <<
643 module.second.getNode(
"filterModuleType").getValue() <<
645 auto moduleParameterLink = module.second.getNode(
"filterModuleParameterLink");
646 if(!moduleParameterLink.isDisconnected())
648 auto moduleParameters = moduleParameterLink.getChildren();
649 for(
auto &moduleParameter:moduleParameters)
651 if(!moduleParameter.second.getNode(
"Enabled").getValue<
bool>())
654 auto comment = moduleParameter.second.getNode(
"CommentDescription");
655 OUT << moduleParameter.second.getNode(
"filterParameterKey").getValue()
657 moduleParameter.second.getNode(
"filterParameterValue").getValue()
659 (comment.isDefaultValue()?
"":(
"\t # " + comment.getValue())) <<
662 if(!moduleParameter.second.getNode(
"Enabled").getValue<
bool>())
669 if(!module.second.getNode(
"Status").getValue<
bool>())
677 auto otherParameterLink = physics.getNode(
"physicsOtherParametersLink");
678 if(!otherParameterLink.isDisconnected())
681 auto physicsParameters = otherParameterLink.getChildren();
682 for(
auto ¶meter:physicsParameters)
684 if(!parameter.second.getNode(
"Enabled").getValue<
bool>())
687 auto comment = parameter.second.getNode(
"CommentDescription");
688 OUT << parameter.second.getNode(
"physicsParameterKey").getValue() <<
690 parameter.second.getNode(
"physicsParameterValue").getValue()
692 (comment.isDefaultValue()?
"":(
"\t # " + comment.getValue())) <<
695 if(!parameter.second.getNode(
"Enabled").getValue<
bool>())
706 OUT <<
"process_name: " <<
707 aggregatorNode.getNode(
"ARTDAQGlobalConfigurationForProcessNameLink/processNameForAggregators")