1 #include "otsdaq-core/ConfigurationPluginDataFormats/ARTDAQBuilderConfiguration.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 "builder"
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 ARTDAQBuilderConfiguration::ARTDAQBuilderConfiguration(
void)
37 ARTDAQBuilderConfiguration::~ARTDAQBuilderConfiguration(
void)
43 configManager_ = configManager;
45 mkdir((ARTDAQ_FCL_PATH).c_str(), 0755);
47 __COUT__ <<
"*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*" << std::endl;
48 __COUT__ << configManager->__SELF_NODE__ << std::endl;
58 std::vector<const XDAQContextConfiguration::XDAQContext *> builderContexts =
59 contextConfig->getEventBuilderContexts();
63 for(
auto &builderContext: builderContexts)
65 ConfigurationTree builderConfigNode = contextConfig->getSupervisorConfigNode(configManager,
66 builderContext->contextUID_, builderContext->applications_[0].applicationUID_);
68 __COUT__ <<
"Path for this aggregator config is " <<
69 builderContext->contextUID_ <<
"/" <<
70 builderContext->applications_[0].applicationUID_ <<
"/" <<
71 builderConfigNode.getValueAsString() <<
74 outputFHICL(builderConfigNode,
80 std::string ARTDAQBuilderConfiguration::getFHICLFilename(
const ConfigurationTree &builderNode)
82 __COUT__ <<
"ARTDAQ Builder UID: " << builderNode.getValue() << std::endl;
83 std::string filename = ARTDAQ_FCL_PATH + ARTDAQ_FILE_PREAMBLE +
"-";
84 std::string uid = builderNode.getValue();
85 for(
unsigned int i=0;i<uid.size();++i)
86 if((uid[i] >=
'a' && uid[i] <=
'z') ||
87 (uid[i] >=
'A' && uid[i] <=
'Z') ||
88 (uid[i] >=
'0' && uid[i] <=
'9'))
93 __COUT__ <<
"fcl: " << filename << std::endl;
99 void ARTDAQBuilderConfiguration::outputFHICL(
const ConfigurationTree &builderNode,
221 std::string filename = getFHICLFilename(builderNode);
227 std::string tabStr =
"";
228 std::string commentStr =
"";
230 out.open(filename, std::fstream::out | std::fstream::trunc);
233 __SS__ <<
"Failed to open ARTDAQ Builder fcl file: " << filename << std::endl;
234 throw std::runtime_error(ss.str());
239 if(builderNode.isDisconnected())
250 auto services = builderNode.getNode(
"servicesLink");
251 if(!services.isDisconnected())
253 OUT <<
"services: {\n";
257 OUT <<
"scheduler: {\n";
260 OUT <<
"fileMode: " << services.getNode(
"schedulerFileMode").getValue() <<
262 OUT <<
"errorOnFailureToPut: " <<
263 (services.getNode(
"schedulerErrorOnFailtureToPut").getValue<
bool>()?
"true":
"false") <<
271 OUT <<
"NetMonTransportServiceInterface: {\n";
274 OUT <<
"service_provider: " <<
276 services.getNode(
"NetMonTrasportServiceInterfaceServiceProvider").getValue()
278 OUT <<
"destinations: {\n";
281 auto destinationsGroup = services.getNode(
"NetMonTrasportServiceInterfaceDestinationsLink");
282 if(!destinationsGroup.isDisconnected())
286 auto destinations = destinationsGroup.getChildren();
287 for(
auto &destination:destinations)
289 unsigned int destinationRank =
290 contextConfig->getARTDAQAppRank(
291 destination.second.getNode(
"destinationARTDAQContextLink").getValue());
292 OUT << destination.second.getNode(
"destinationKey").getValue() <<
294 " transferPluginType: " <<
295 destination.second.getNode(
"transferPluginType").getValue() <<
296 " destination_rank: " <<
298 " max_fragment_size_words: " <<
299 destination.second.getNode(
"ARTDAQGlobalConfigurationLink/maxFragmentSizeWords").getValue<
unsigned int>() <<
303 catch(
const std::runtime_error& e)
305 __SS__ <<
"Are the Net Monitor Transport Service destinations valid? Error occurred looking for Event Builder transport service destinations for UID '" <<
306 builderNode.getValue() <<
"': " << e.what() << std::endl;
307 __COUT_ERR__ << ss.str() << std::endl;
308 throw std::runtime_error(ss.str());
324 auto daq = builderNode.getNode(
"daqLink");
325 if(!daq.isDisconnected())
332 OUT <<
"event_builder: {\n";
335 auto parametersLink = daq.getNode(
"daqEventBuilderParametersLink");
336 if(!parametersLink.isDisconnected())
339 auto parameters = parametersLink.getChildren();
340 for(
auto ¶meter:parameters)
342 if(!parameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
345 OUT << parameter.second.getNode(
"daqParameterKey").getValue() <<
347 parameter.second.getNode(
"daqParameterValue").getValue()
350 if(!parameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
357 OUT <<
"sources: {\n";
360 auto sourcesGroup = daq.getNode(
"daqEventBuilderSourcesLink");
361 if(!sourcesGroup.isDisconnected())
365 auto sources = sourcesGroup.getChildren();
366 for(
auto &source:sources)
368 unsigned int sourceRank =
369 contextConfig->getARTDAQAppRank(
370 source.second.getNode(
"sourceARTDAQContextLink").getValue());
372 OUT << source.second.getNode(
"sourceKey").getValue() <<
374 " transferPluginType: " <<
375 source.second.getNode(
"transferPluginType").getValue() <<
378 " max_fragment_size_words: " <<
379 source.second.getNode(
"ARTDAQGlobalConfigurationLink/maxFragmentSizeWords").getValue<
unsigned int>() <<
383 catch(
const std::runtime_error& e)
385 __SS__ <<
"Are the DAQ sources valid? Error occurred looking for Event Builder DAQ sources for UID '" <<
386 builderNode.getValue() <<
"': " << e.what() << std::endl;
387 __COUT_ERR__ << ss.str() << std::endl;
388 throw std::runtime_error(ss.str());
398 OUT <<
"metrics: {\n";
401 auto metricsGroup = daq.getNode(
"daqMetricsLink");
402 if(!metricsGroup.isDisconnected())
404 auto metrics = metricsGroup.getChildren();
406 for(
auto &metric:metrics)
408 if(!metric.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
411 OUT << metric.second.getNode(
"metricKey").getValue() <<
415 OUT <<
"metricPluginType: " <<
416 metric.second.getNode(
"metricPluginType").getValue()
419 metric.second.getNode(
"metricLevel").getValue()
422 auto metricParametersGroup = metric.second.getNode(
"metricParametersLink");
423 if(!metricParametersGroup.isDisconnected())
425 auto metricParameters = metricParametersGroup.getChildren();
426 for(
auto &metricParameter:metricParameters)
428 if(!metricParameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
431 OUT << metricParameter.second.getNode(
"metricParameterKey").getValue() <<
433 metricParameter.second.getNode(
"metricParameterValue").getValue()
436 if(!metricParameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
444 if(!metric.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
457 auto outputs = builderNode.getNode(
"outputsLink");
458 if(!outputs.isDisconnected())
460 OUT <<
"outputs: {\n";
464 auto outputPlugins = outputs.getChildren();
465 for(
auto &outputPlugin:outputPlugins)
467 if(!outputPlugin.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
470 OUT << outputPlugin.second.getNode(
"outputKey").getValue() <<
473 OUT <<
"module_type: " <<
474 outputPlugin.second.getNode(
"outputModuleType").getValue() <<
476 auto pluginParameterLink = outputPlugin.second.getNode(
"outputModuleParameterLink");
477 if(!pluginParameterLink.isDisconnected())
479 auto pluginParameters = pluginParameterLink.getChildren();
480 for(
auto &pluginParameter:pluginParameters)
482 if(!pluginParameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
485 OUT << pluginParameter.second.getNode(
"outputParameterKey").getValue() <<
487 pluginParameter.second.getNode(
"outputParameterValue").getValue()
490 if(!pluginParameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
497 if(!outputPlugin.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
508 auto physics = builderNode.getNode(
"physicsLink");
509 if(!physics.isDisconnected())
512 OUT <<
"physics: {\n";
516 auto analyzers = physics.getNode(
"analyzersLink");
517 if(!analyzers.isDisconnected())
520 OUT <<
"analyzers: {\n";
523 auto modules = analyzers.getChildren();
524 for(
auto &module:modules)
526 if(!module.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
529 OUT << module.second.getNode(
"analyzerKey").getValue() <<
532 OUT <<
"module_type: " <<
533 module.second.getNode(
"analyzerModuleType").getValue() <<
535 auto moduleParameterLink = module.second.getNode(
"analyzerModuleParameterLink");
536 if(!moduleParameterLink.isDisconnected())
538 auto moduleParameters = moduleParameterLink.getChildren();
539 for(
auto &moduleParameter:moduleParameters)
541 if(!moduleParameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
544 OUT << moduleParameter.second.getNode(
"analyzerParameterKey").getValue() <<
546 moduleParameter.second.getNode(
"analyzerParameterValue").getValue()
549 if(!moduleParameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
556 if(!module.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
563 auto producers = physics.getNode(
"producersLink");
564 if(!producers.isDisconnected())
567 OUT <<
"producers: {\n";
570 auto modules = producers.getChildren();
571 for(
auto &module:modules)
573 if(!module.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
576 OUT << module.second.getNode(
"producerKey").getValue() <<
579 OUT <<
"module_type: " <<
580 module.second.getNode(
"producerModuleType").getValue() <<
582 auto moduleParameterLink = module.second.getNode(
"producerModuleParameterLink");
583 if(!moduleParameterLink.isDisconnected())
585 auto moduleParameters = moduleParameterLink.getChildren();
586 for(
auto &moduleParameter:moduleParameters)
588 if(!moduleParameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
591 OUT << moduleParameter.second.getNode(
"producerParameterKey").getValue() <<
593 moduleParameter.second.getNode(
"producerParameterValue").getValue()
596 if(!moduleParameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
603 if(!module.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
611 auto filters = physics.getNode(
"filtersLink");
612 if(!filters.isDisconnected())
615 OUT <<
"filters: {\n";
618 auto modules = filters.getChildren();
619 for(
auto &module:modules)
621 if(!module.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
624 OUT << module.second.getNode(
"filterKey").getValue() <<
627 OUT <<
"module_type: " <<
628 module.second.getNode(
"filterModuleType").getValue() <<
630 auto moduleParameterLink = module.second.getNode(
"filterModuleParameterLink");
631 if(!moduleParameterLink.isDisconnected())
633 auto moduleParameters = moduleParameterLink.getChildren();
634 for(
auto &moduleParameter:moduleParameters)
636 if(!moduleParameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
639 OUT << moduleParameter.second.getNode(
"filterParameterKey").getValue()
641 moduleParameter.second.getNode(
"filterParameterValue").getValue()
644 if(!moduleParameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
651 if(!module.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
659 auto otherParameterLink = physics.getNode(
"physicsOtherParametersLink");
660 if(!otherParameterLink.isDisconnected())
663 auto physicsParameters = otherParameterLink.getChildren();
664 for(
auto ¶meter:physicsParameters)
666 if(!parameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
669 OUT << parameter.second.getNode(
"physicsParameterKey").getValue() <<
671 parameter.second.getNode(
"physicsParameterValue").getValue()
674 if(!parameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
685 auto source = builderNode.getNode(
"sourceLink");
686 if(!source.isDisconnected())
688 OUT <<
"source: {\n";
691 OUT <<
"module_type: " << source.getNode(
"sourceModuleType").getValue() <<
693 OUT <<
"waiting_time: " << source.getNode(
"sourceWaitingTime").getValue() <<
695 OUT <<
"resume_after_timeout: " <<
696 (source.getNode(
"sourceResumeAfterTimeout").getValue<
bool>()?
"true":
"false") <<
704 OUT <<
"process_name: " <<
705 builderNode.getNode(
"ARTDAQGlobalConfigurationForProcessNameLink/processNameForBuilders")