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 __COUT__ <<
"*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*" << std::endl;
46 __COUT__ << configManager->__SELF_NODE__ << std::endl;
49 std::vector<const XDAQContextConfiguration::XDAQContext *> aggContexts =
50 contextConfig->getAggregatorContexts();
54 for(
auto &aggContext: aggContexts)
56 ConfigurationTree aggConfigNode = contextConfig->getSupervisorConfigNode(configManager,
57 aggContext->contextUID_, aggContext->applications_[0].applicationUID_);
59 __COUT__ <<
"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 __COUT__ <<
"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 __COUT__ <<
"fcl: " << filename << std::endl;
91 void ARTDAQAggregatorConfiguration::outputFHICL(
const ConfigurationTree &aggregatorNode,
92 unsigned int selfRank,
238 std::string filename = getFHICLFilename(aggregatorNode);
240 __COUT__ <<
"selfRank = " << selfRank << std::endl;
247 std::string tabStr =
"";
248 std::string commentStr =
"";
250 out.open(filename, std::fstream::out | std::fstream::trunc);
253 __SS__ <<
"Failed to open ARTDAQ Builder fcl file: " << filename << std::endl;
254 throw std::runtime_error(ss.str());
258 if(aggregatorNode.isDisconnected())
268 auto services = aggregatorNode.getNode(
"servicesLink");
269 if(!services.isDisconnected())
271 OUT <<
"services: {\n";
275 OUT <<
"scheduler: {\n";
278 OUT <<
"fileMode: " << services.getNode(
"schedulerFileMode").getValue() <<
280 OUT <<
"errorOnFailureToPut: " <<
281 (services.getNode(
"schedulerErrorOnFailtureToPut").getValue<
bool>()?
"true":
"false") <<
289 OUT <<
"NetMonTransportServiceInterface: {\n";
292 OUT <<
"service_provider: " <<
294 services.getNode(
"NetMonTrasportServiceInterfaceServiceProvider").getValue()
307 auto daq = aggregatorNode.getNode(
"daqLink");
308 if(!daq.isDisconnected())
314 OUT <<
"aggregator: {\n";
317 auto parametersLink = daq.getNode(
"daqAggregatorParametersLink");
318 if(!parametersLink.isDisconnected())
321 auto parameters = parametersLink.getChildren();
322 for(
auto ¶meter:parameters)
324 if(!parameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
327 auto comment = parameter.second.getNode(
"CommentDescription");
328 OUT << parameter.second.getNode(
"daqParameterKey").getValue() <<
330 parameter.second.getNode(
"daqParameterValue").getValue()
332 (comment.isDefaultValue()?
"":(
"\t # " + comment.getValue())) <<
335 if(!parameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
341 OUT <<
"sources: {\n";
344 auto sourcesGroup = daq.getNode(
"daqAggregatorSourcesLink");
345 if(!sourcesGroup.isDisconnected())
349 auto sources = sourcesGroup.getChildren();
350 for(
auto &source:sources)
352 unsigned int sourceRank =
353 contextConfig->getARTDAQAppRank(
354 source.second.getNode(
"sourceARTDAQContextLink").getValue());
356 OUT << source.second.getNode(
"sourceKey").getValue() <<
358 " transferPluginType: " <<
359 source.second.getNode(
"transferPluginType").getValue() <<
362 " max_fragment_size_words: " <<
363 source.second.getNode(
"ARTDAQGlobalConfigurationLink/maxFragmentSizeWords").getValue<
unsigned int>() <<
367 catch(
const std::runtime_error& e)
369 __SS__ <<
"Are the DAQ sources valid? Error occurred looking for Aggregator DAQ sources for UID '" <<
370 aggregatorNode.getValue() <<
"': " << e.what() << std::endl;
371 __COUT_ERR__ << ss.str() << std::endl;
372 throw std::runtime_error(ss.str());
382 OUT <<
"metrics: {\n";
385 auto metricsGroup = daq.getNode(
"daqMetricsLink");
386 if(!metricsGroup.isDisconnected())
388 auto metrics = metricsGroup.getChildren();
390 for(
auto &metric:metrics)
392 if(!metric.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
395 OUT << metric.second.getNode(
"metricKey").getValue() <<
399 OUT <<
"metricPluginType: " <<
400 metric.second.getNode(
"metricPluginType").getValue()
403 metric.second.getNode(
"metricLevel").getValue()
406 auto metricParametersGroup = metric.second.getNode(
"metricParametersLink");
407 if(!metricParametersGroup.isDisconnected())
409 auto metricParameters = metricParametersGroup.getChildren();
410 for(
auto &metricParameter:metricParameters)
412 if(!metricParameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
415 auto comment = metricParameter.second.getNode(
"CommentDescription");
416 OUT << metricParameter.second.getNode(
"metricParameterKey").getValue() <<
418 metricParameter.second.getNode(
"metricParameterValue").getValue()
420 (comment.isDefaultValue()?
"":(
"\t # " + comment.getValue())) <<
423 if(!metricParameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
431 if(!metric.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
439 auto destinationsGroup = daq.getNode(
"daqAggregatorDestinationsLink");
440 if(!destinationsGroup.isDisconnected())
444 auto destinations = destinationsGroup.getChildren();
445 for(
auto &destination:destinations)
447 unsigned int destinationRank = contextConfig->getARTDAQAppRank(
448 destination.second.getNode(
"destinationARTDAQContextLink").getValueAsString());
450 OUT << destination.second.getNode(
"destinationKey").getValue() <<
452 " transferPluginType: " <<
453 destination.second.getNode(
"transferPluginType").getValue() <<
456 " destination_rank: " <<
458 " max_fragment_size_words: " <<
459 destination.second.getNode(
"ARTDAQGlobalConfigurationLink/maxFragmentSizeWords").getValue<
unsigned int>() <<
463 catch(
const std::runtime_error& e)
465 __SS__ <<
"Are the DAQ destinations valid? Error occurred looking for Aggregator DAQ destinations for UID '" <<
466 aggregatorNode.getValue() <<
"': " << e.what() << std::endl;
467 __COUT_ERR__ << ss.str() << std::endl;
468 throw std::runtime_error(ss.str());
479 auto source = aggregatorNode.getNode(
"sourceLink");
480 if(!source.isDisconnected())
482 OUT <<
"source: {\n";
485 OUT <<
"module_type: " << source.getNode(
"sourceModuleType").getValue() <<
493 auto outputs = aggregatorNode.getNode(
"outputsLink");
494 if(!outputs.isDisconnected())
496 OUT <<
"outputs: {\n";
500 auto outputPlugins = outputs.getChildren();
501 for(
auto &outputPlugin:outputPlugins)
503 if(!outputPlugin.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
506 OUT << outputPlugin.second.getNode(
"outputKey").getValue() <<
509 OUT <<
"module_type: " <<
510 outputPlugin.second.getNode(
"outputModuleType").getValue() <<
512 auto pluginParameterLink = outputPlugin.second.getNode(
"outputModuleParameterLink");
513 if(!pluginParameterLink.isDisconnected())
515 auto pluginParameters = pluginParameterLink.getChildren();
516 for(
auto &pluginParameter:pluginParameters)
518 if(!pluginParameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
521 auto comment = pluginParameter.second.getNode(
"CommentDescription");
522 OUT << pluginParameter.second.getNode(
"outputParameterKey").getValue() <<
524 pluginParameter.second.getNode(
"outputParameterValue").getValue()
526 (comment.isDefaultValue()?
"":(
"\t # " + comment.getValue())) <<
529 if(!pluginParameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
536 if(!outputPlugin.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
547 auto physics = aggregatorNode.getNode(
"physicsLink");
548 if(!physics.isDisconnected())
551 OUT <<
"physics: {\n";
555 auto analyzers = physics.getNode(
"analyzersLink");
556 if(!analyzers.isDisconnected())
559 OUT <<
"analyzers: {\n";
562 auto modules = analyzers.getChildren();
563 for(
auto &module:modules)
565 if(!module.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
568 OUT << module.second.getNode(
"analyzerKey").getValue() <<
571 OUT <<
"module_type: " <<
572 module.second.getNode(
"analyzerModuleType").getValue() <<
574 auto moduleParameterLink = module.second.getNode(
"analyzerModuleParameterLink");
575 if(!moduleParameterLink.isDisconnected())
577 auto moduleParameters = moduleParameterLink.getChildren();
578 for(
auto &moduleParameter:moduleParameters)
580 if(!moduleParameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
583 auto comment = moduleParameter.second.getNode(
"CommentDescription");
584 OUT << moduleParameter.second.getNode(
"analyzerParameterKey").getValue() <<
586 moduleParameter.second.getNode(
"analyzerParameterValue").getValue()
588 (comment.isDefaultValue()?
"":(
"\t # " + comment.getValue())) <<
591 if(!moduleParameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
598 if(!module.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
605 auto producers = physics.getNode(
"producersLink");
606 if(!producers.isDisconnected())
609 OUT <<
"producers: {\n";
612 auto modules = producers.getChildren();
613 for(
auto &module:modules)
615 if(!module.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
618 OUT << module.second.getNode(
"producerKey").getValue() <<
621 OUT <<
"module_type: " <<
622 module.second.getNode(
"producerModuleType").getValue() <<
624 auto moduleParameterLink = module.second.getNode(
"producerModuleParameterLink");
625 if(!moduleParameterLink.isDisconnected())
627 auto moduleParameters = moduleParameterLink.getChildren();
628 for(
auto &moduleParameter:moduleParameters)
630 if(!moduleParameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
633 auto comment = moduleParameter.second.getNode(
"CommentDescription");
634 OUT << moduleParameter.second.getNode(
"producerParameterKey").getValue() <<
636 moduleParameter.second.getNode(
"producerParameterValue").getValue()
638 (comment.isDefaultValue()?
"":(
"\t # " + comment.getValue())) <<
641 if(!moduleParameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
648 if(!module.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
656 auto filters = physics.getNode(
"filtersLink");
657 if(!filters.isDisconnected())
660 OUT <<
"filters: {\n";
663 auto modules = filters.getChildren();
664 for(
auto &module:modules)
666 if(!module.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
669 OUT << module.second.getNode(
"filterKey").getValue() <<
672 OUT <<
"module_type: " <<
673 module.second.getNode(
"filterModuleType").getValue() <<
675 auto moduleParameterLink = module.second.getNode(
"filterModuleParameterLink");
676 if(!moduleParameterLink.isDisconnected())
678 auto moduleParameters = moduleParameterLink.getChildren();
679 for(
auto &moduleParameter:moduleParameters)
681 if(!moduleParameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
684 auto comment = moduleParameter.second.getNode(
"CommentDescription");
685 OUT << moduleParameter.second.getNode(
"filterParameterKey").getValue()
687 moduleParameter.second.getNode(
"filterParameterValue").getValue()
689 (comment.isDefaultValue()?
"":(
"\t # " + comment.getValue())) <<
692 if(!moduleParameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
699 if(!module.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
707 auto otherParameterLink = physics.getNode(
"physicsOtherParametersLink");
708 if(!otherParameterLink.isDisconnected())
711 auto physicsParameters = otherParameterLink.getChildren();
712 for(
auto ¶meter:physicsParameters)
714 if(!parameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
717 auto comment = parameter.second.getNode(
"CommentDescription");
718 OUT << parameter.second.getNode(
"physicsParameterKey").getValue() <<
720 parameter.second.getNode(
"physicsParameterValue").getValue()
722 (comment.isDefaultValue()?
"":(
"\t # " + comment.getValue())) <<
725 if(!parameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
736 OUT <<
"process_name: " <<
737 aggregatorNode.getNode(
"ARTDAQGlobalConfigurationForProcessNameLink/processNameForAggregators")