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 __MOUT__ <<
"*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*" << std::endl;
48 __MOUT__ << 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 __MOUT__ <<
"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 __MOUT__ <<
"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 __MOUT__ <<
"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())
284 auto destinations = destinationsGroup.getChildren();
285 for(
auto &destination:destinations)
287 unsigned int destinationRank =
288 contextConfig->getARTDAQAppRank(
289 destination.second.getNode(
"destinationARTDAQContextLink").getValue());
290 OUT << destination.second.getNode(
"destinationKey").getValue() <<
292 " transferPluginType: " <<
293 destination.second.getNode(
"transferPluginType").getValue() <<
294 " destination_rank: " <<
296 " max_fragment_size_words: " <<
297 destination.second.getNode(
"ARTDAQGlobalConfigurationLink/maxFragmentSizeWords").getValue<
unsigned int>() <<
314 auto daq = builderNode.getNode(
"daqLink");
315 if(!daq.isDisconnected())
322 OUT <<
"event_builder: {\n";
325 auto parametersLink = daq.getNode(
"daqEventBuilderParametersLink");
326 if(!parametersLink.isDisconnected())
329 auto parameters = parametersLink.getChildren();
330 for(
auto ¶meter:parameters)
332 if(!parameter.second.getNode(
"Status").getValue<
bool>())
335 OUT << parameter.second.getNode(
"daqParameterKey").getValue() <<
337 parameter.second.getNode(
"daqParameterValue").getValue()
340 if(!parameter.second.getNode(
"Status").getValue<
bool>())
347 OUT <<
"sources: {\n";
350 auto sourcesGroup = daq.getNode(
"daqEventBuilderSourcesLink");
351 if(!sourcesGroup.isDisconnected())
353 auto sources = sourcesGroup.getChildren();
354 for(
auto &source:sources)
356 unsigned int sourceRank =
357 contextConfig->getARTDAQAppRank(
358 source.second.getNode(
"sourceARTDAQContextLink").getValue());
360 OUT << source.second.getNode(
"sourceKey").getValue() <<
362 " transferPluginType: " <<
363 source.second.getNode(
"transferPluginType").getValue() <<
366 " max_fragment_size_words: " <<
367 source.second.getNode(
"ARTDAQGlobalConfigurationLink/maxFragmentSizeWords").getValue<
unsigned int>() <<
378 OUT <<
"metrics: {\n";
381 auto metricsGroup = daq.getNode(
"daqMetricsLink");
382 if(!metricsGroup.isDisconnected())
384 auto metrics = metricsGroup.getChildren();
386 for(
auto &metric:metrics)
388 if(!metric.second.getNode(
"Status").getValue<
bool>())
391 OUT << metric.second.getNode(
"metricKey").getValue() <<
395 OUT <<
"metricPluginType: " <<
396 metric.second.getNode(
"metricPluginType").getValue()
399 metric.second.getNode(
"metricLevel").getValue()
402 auto metricParametersGroup = metric.second.getNode(
"metricParametersLink");
403 if(!metricParametersGroup.isDisconnected())
405 auto metricParameters = metricParametersGroup.getChildren();
406 for(
auto &metricParameter:metricParameters)
408 if(!metricParameter.second.getNode(
"Status").getValue<
bool>())
411 OUT << metricParameter.second.getNode(
"metricParameterKey").getValue() <<
413 metricParameter.second.getNode(
"metricParameterValue").getValue()
416 if(!metricParameter.second.getNode(
"Status").getValue<
bool>())
424 if(!metric.second.getNode(
"Status").getValue<
bool>())
437 auto outputs = builderNode.getNode(
"outputsLink");
438 if(!outputs.isDisconnected())
440 OUT <<
"outputs: {\n";
444 auto outputPlugins = outputs.getChildren();
445 for(
auto &outputPlugin:outputPlugins)
447 if(!outputPlugin.second.getNode(
"Status").getValue<
bool>())
450 OUT << outputPlugin.second.getNode(
"outputKey").getValue() <<
453 OUT <<
"module_type: " <<
454 outputPlugin.second.getNode(
"outputModuleType").getValue() <<
456 auto pluginParameterLink = outputPlugin.second.getNode(
"outputModuleParameterLink");
457 if(!pluginParameterLink.isDisconnected())
459 auto pluginParameters = pluginParameterLink.getChildren();
460 for(
auto &pluginParameter:pluginParameters)
462 if(!pluginParameter.second.getNode(
"Status").getValue<
bool>())
465 OUT << pluginParameter.second.getNode(
"outputParameterKey").getValue() <<
467 pluginParameter.second.getNode(
"outputParameterValue").getValue()
470 if(!pluginParameter.second.getNode(
"Status").getValue<
bool>())
477 if(!outputPlugin.second.getNode(
"Status").getValue<
bool>())
488 auto physics = builderNode.getNode(
"physicsLink");
489 if(!physics.isDisconnected())
492 OUT <<
"physics: {\n";
496 auto analyzers = physics.getNode(
"analyzersLink");
497 if(!analyzers.isDisconnected())
500 OUT <<
"analyzers: {\n";
503 auto modules = analyzers.getChildren();
504 for(
auto &module:modules)
506 if(!module.second.getNode(
"Status").getValue<
bool>())
509 OUT << module.second.getNode(
"analyzerKey").getValue() <<
512 OUT <<
"module_type: " <<
513 module.second.getNode(
"analyzerModuleType").getValue() <<
515 auto moduleParameterLink = module.second.getNode(
"analyzerModuleParameterLink");
516 if(!moduleParameterLink.isDisconnected())
518 auto moduleParameters = moduleParameterLink.getChildren();
519 for(
auto &moduleParameter:moduleParameters)
521 if(!moduleParameter.second.getNode(
"Status").getValue<
bool>())
524 OUT << moduleParameter.second.getNode(
"analyzerParameterKey").getValue() <<
526 moduleParameter.second.getNode(
"analyzerParameterValue").getValue()
529 if(!moduleParameter.second.getNode(
"Status").getValue<
bool>())
536 if(!module.second.getNode(
"Status").getValue<
bool>())
543 auto producers = physics.getNode(
"producersLink");
544 if(!producers.isDisconnected())
547 OUT <<
"producers: {\n";
550 auto modules = producers.getChildren();
551 for(
auto &module:modules)
553 if(!module.second.getNode(
"Status").getValue<
bool>())
556 OUT << module.second.getNode(
"producerKey").getValue() <<
559 OUT <<
"module_type: " <<
560 module.second.getNode(
"producerModuleType").getValue() <<
562 auto moduleParameterLink = module.second.getNode(
"producerModuleParameterLink");
563 if(!moduleParameterLink.isDisconnected())
565 auto moduleParameters = moduleParameterLink.getChildren();
566 for(
auto &moduleParameter:moduleParameters)
568 if(!moduleParameter.second.getNode(
"Status").getValue<
bool>())
571 OUT << moduleParameter.second.getNode(
"producerParameterKey").getValue() <<
573 moduleParameter.second.getNode(
"producerParameterValue").getValue()
576 if(!moduleParameter.second.getNode(
"Status").getValue<
bool>())
583 if(!module.second.getNode(
"Status").getValue<
bool>())
591 auto filters = physics.getNode(
"filtersLink");
592 if(!filters.isDisconnected())
595 OUT <<
"filters: {\n";
598 auto modules = filters.getChildren();
599 for(
auto &module:modules)
601 if(!module.second.getNode(
"Status").getValue<
bool>())
604 OUT << module.second.getNode(
"filterKey").getValue() <<
607 OUT <<
"module_type: " <<
608 module.second.getNode(
"filterModuleType").getValue() <<
610 auto moduleParameterLink = module.second.getNode(
"filterModuleParameterLink");
611 if(!moduleParameterLink.isDisconnected())
613 auto moduleParameters = moduleParameterLink.getChildren();
614 for(
auto &moduleParameter:moduleParameters)
616 if(!moduleParameter.second.getNode(
"Status").getValue<
bool>())
619 OUT << moduleParameter.second.getNode(
"filterParameterKey").getValue()
621 moduleParameter.second.getNode(
"filterParameterValue").getValue()
624 if(!moduleParameter.second.getNode(
"Status").getValue<
bool>())
631 if(!module.second.getNode(
"Status").getValue<
bool>())
639 auto otherParameterLink = physics.getNode(
"physicsOtherParametersLink");
640 if(!otherParameterLink.isDisconnected())
643 auto physicsParameters = otherParameterLink.getChildren();
644 for(
auto ¶meter:physicsParameters)
646 if(!parameter.second.getNode(
"Status").getValue<
bool>())
649 OUT << parameter.second.getNode(
"physicsParameterKey").getValue() <<
651 parameter.second.getNode(
"physicsParameterValue").getValue()
654 if(!parameter.second.getNode(
"Status").getValue<
bool>())
665 auto source = builderNode.getNode(
"sourceLink");
666 if(!source.isDisconnected())
668 OUT <<
"source: {\n";
671 OUT <<
"module_type: " << source.getNode(
"sourceModuleType").getValue() <<
673 OUT <<
"waiting_time: " << source.getNode(
"sourceWaitingTime").getValue() <<
675 OUT <<
"resume_after_timeout: " <<
676 (source.getNode(
"sourceResumeAfterTimeout").getValue<
bool>()?
"true":
"false") <<
684 OUT <<
"process_name: " <<
685 builderNode.getNode(
"ARTDAQGlobalConfigurationForProcessNameLink/processNameForBuilders")