otsdaq  v1_01_04
 All Classes Namespaces Functions
ARTDAQAggregatorConfiguration_configuration.cc
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"
5 
6 #include <iostream>
7 #include <fstream> // std::fstream
8 #include <stdio.h>
9 #include <sys/stat.h> //for mkdir
10 
11 using namespace ots;
12 
13 
14 #define ARTDAQ_FCL_PATH std::string(getenv("USER_DATA")) + "/"+ "ARTDAQConfigurations/"
15 #define ARTDAQ_FILE_PREAMBLE "aggregator"
16 
17 //helpers
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)
23 
24 
25 //========================================================================================================================
26 ARTDAQAggregatorConfiguration::ARTDAQAggregatorConfiguration(void)
27 : ConfigurationBase("ARTDAQAggregatorConfiguration")
28 {
30  //WARNING: the names used in C++ MUST match the Configuration INFO //
32 
33 }
34 
35 //========================================================================================================================
36 ARTDAQAggregatorConfiguration::~ARTDAQAggregatorConfiguration(void)
37 {}
38 
39 //========================================================================================================================
40 void ARTDAQAggregatorConfiguration::init(ConfigurationManager* configManager)
41 {
42  //make directory just in case
43  mkdir((ARTDAQ_FCL_PATH).c_str(), 0755);
44 
45  __COUT__ << "*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*" << std::endl;
46  __COUT__ << configManager->__SELF_NODE__ << std::endl;
47 
48  const XDAQContextConfiguration *contextConfig = configManager->__GET_CONFIG__(XDAQContextConfiguration);
49  std::vector<const XDAQContextConfiguration::XDAQContext *> aggContexts =
50  contextConfig->getAggregatorContexts();
51 
52  //for each aggregator context
53  // output associated fcl config file
54  for(auto &aggContext: aggContexts)
55  {
56  ConfigurationTree aggConfigNode = contextConfig->getSupervisorConfigNode(configManager,
57  aggContext->contextUID_, aggContext->applications_[0].applicationUID_);
58 
59  __COUT__ << "Path for this aggregator config is " <<
60  aggContext->contextUID_ << "/" <<
61  aggContext->applications_[0].applicationUID_ << "/" <<
62  aggConfigNode.getValueAsString() <<
63  std::endl;
64 
65  outputFHICL(aggConfigNode,
66  contextConfig->getARTDAQAppRank(aggContext->contextUID_),
67  contextConfig);
68  }
69 }
70 
71 //========================================================================================================================
72 std::string ARTDAQAggregatorConfiguration::getFHICLFilename(const ConfigurationTree &aggregatorNode)
73 {
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')) //only allow alpha numeric in file name
81  filename += uid[i];
82 
83  filename += ".fcl";
84 
85  __COUT__ << "fcl: " << filename << std::endl;
86 
87  return filename;
88 }
89 
90 //========================================================================================================================
91 void ARTDAQAggregatorConfiguration::outputFHICL(const ConfigurationTree &aggregatorNode,
92  unsigned int selfRank,
93  const XDAQContextConfiguration *contextConfig)
94 {
95  /*
96  the file will look something like this:
97 
98  services: {
99  scheduler: {
100  fileMode: NOMERGE
101  errorOnFailureToPut: false
102  }
103  NetMonTransportServiceInterface: {
104  service_provider: NetMonTransportService
105  }
106 
107  #SimpleMemoryCheck: { }
108  }
109 
110  daq: {
111  aggregator: {
112  expected_events_per_bunch: 1
113  print_event_store_stats: true
114  event_queue_depth: 20
115  event_queue_wait_time: 5
116  onmon_event_prescale: 1
117  xmlrpc_client_list: ";http://ironwork.fnal.gov:5205/RPC2,3;http://ironwork.fnal.gov:5206/RPC2,3;http://ironwork.fnal.gov:5235/RPC2,4;http://ironwork.fnal.gov:5236/RPC2,4;http://ironwork.fnal.gov:5265/RPC2,5;http://ironwork.fnal.gov:5266/RPC2,5"
118  file_size_MB: 0.0
119  file_duration: 0
120  file_event_count: 0
121  is_data_logger: true
122 
123  sources: {
124  s2: { transferPluginType: MPI source_rank: 2 max_fragment_size_words: 2097152}
125  s3: { transferPluginType: MPI source_rank: 3 max_fragment_size_words: 2097152}
126 
127  }
128  }
129 
130  metrics: {
131  aggFile: {
132  metricPluginType: "file"
133  level: 3
134  fileName: "/tmp/aggregator/agg_%UID%_metrics.log"
135  uniquify: true
136  }
137  # ganglia: {
138  # metricPluginType: "ganglia"
139  # level: %{ganglia_level}
140  # reporting_interval: 15.0
141  #
142  # configFile: "/etc/ganglia/gmond.conf"
143  # group: "ARTDAQ"
144  # }
145  # msgfac: {
146  # level: %{mf_level}
147  # metricPluginType: "msgFacility"
148  # output_message_application_name: "ARTDAQ Metric"
149  # output_message_severity: 0
150  # }
151  # graphite: {
152  # level: %{graphite_level}
153  # metricPluginType: "graphite"
154  # host: "localhost"
155  # port: 20030
156  # namespace: "artdaq."
157  # }
158  }
159 
160  transfer_to_dispatcher: {
161  transferPluginType: Shmem
162  source_rank: 4
163  destination_rank: 5
164  max_fragment_size_words: 2097152
165  }
166 
167  }
168 
169  source: {
170  module_type: NetMonInput
171  }
172  outputs: {
173  normalOutput: {
174  module_type: RootOutput
175  fileName: "/tmp/artdaqdemo_r%06r_sr%02s_%to.root"
176  }
177 
178  #normalOutputMod2: {
179  # module_type: RootOutput
180  # fileName: "/tmp/artdaqdemo_r%06r_sr%02s_%to_mod2.root"
181  # SelectEvents: { SelectEvents: [ pmod2 ] }
182  #}
183 
184  #normalOutputMod3: {
185  # module_type: RootOutput
186  # fileName: "/tmp/artdaqdemo_r%06r_sr%02s_%to_mod3.root"
187  # SelectEvents: { SelectEvents: [ pmod3 ] }
188  #}
189 
190  }
191  physics: {
192  analyzers: {
193 
194 
195  checkintegrity: {
196  module_type: CheckIntegrity
197  raw_data_label: daq
198  frag_type: TOY1
199  }
200 
201  }
202 
203  producers: {
204 
205  BuildInfo:
206  {
207  module_type: ArtdaqDemoBuildInfo
208  instance_name: ArtdaqDemo
209  }
210  }
211 
212  filters: {
213 
214  prescaleMod2: {
215  module_type: NthEvent
216  nth: 2
217  }
218 
219  prescaleMod3: {
220  module_type: NthEvent
221  nth: 3
222  }
223  }
224 
225  p2: [ BuildInfo ]
226  pmod2: [ prescaleMod2 ]
227  pmod3: [ prescaleMod3 ]
228 
229  #a1: [ app, wf]
230 
231  my_output_modules: [ normalOutput ]
232  #my_output_modules: [ normalOutputMod2, normalOutputMod3 ]
233  }
234  process_name: DAQAG
235 
236  */
237 
238  std::string filename = getFHICLFilename(aggregatorNode);
239 
240  __COUT__ << "selfRank = " << selfRank << std::endl;
241 
242 
244  //generate xdaq run parameter file
245  std::fstream out;
246 
247  std::string tabStr = "";
248  std::string commentStr = "";
249 
250  out.open(filename, std::fstream::out | std::fstream::trunc);
251  if(out.fail())
252  {
253  __SS__ << "Failed to open ARTDAQ Builder fcl file: " << filename << std::endl;
254  throw std::runtime_error(ss.str());
255  }
256 
257  //no primary link to configuration tree for aggregator node!
258  if(aggregatorNode.isDisconnected())
259  {
260  //create empty fcl
261  OUT << "{}\n\n";
262  out.close();
263  return;
264  }
265 
266  //--------------------------------------
267  //handle services
268  auto services = aggregatorNode.getNode("servicesLink");
269  if(!services.isDisconnected())
270  {
271  OUT << "services: {\n";
272 
273  //scheduler
274  PUSHTAB;
275  OUT << "scheduler: {\n";
276 
277  PUSHTAB;
278  OUT << "fileMode: " << services.getNode("schedulerFileMode").getValue() <<
279  "\n";
280  OUT << "errorOnFailureToPut: " <<
281  (services.getNode("schedulerErrorOnFailtureToPut").getValue<bool>()?"true":"false") <<
282  "\n";
283  POPTAB;
284 
285  OUT << "}\n\n";
286 
287 
288  //NetMonTransportServiceInterface
289  OUT << "NetMonTransportServiceInterface: {\n";
290 
291  PUSHTAB;
292  OUT << "service_provider: " <<
293  //services.getNode("NetMonTrasportServiceInterfaceServiceProvider").getEscapedValue()
294  services.getNode("NetMonTrasportServiceInterfaceServiceProvider").getValue()
295  << "\n";
296 
297  POPTAB;
298  OUT << "}\n\n"; //end NetMonTransportServiceInterface
299 
300  POPTAB;
301  OUT << "}\n\n"; //end services
302 
303  }
304 
305  //--------------------------------------
306  //handle daq
307  auto daq = aggregatorNode.getNode("daqLink");
308  if(!daq.isDisconnected())
309  {
310  OUT << "daq: {\n";
311 
312  //aggregator
313  PUSHTAB;
314  OUT << "aggregator: {\n";
315 
316  PUSHTAB;
317  auto parametersLink = daq.getNode("daqAggregatorParametersLink");
318  if(!parametersLink.isDisconnected())
319  {
320 
321  auto parameters = parametersLink.getChildren();
322  for(auto &parameter:parameters)
323  {
324  if(!parameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<bool>())
325  PUSHCOMMENT;
326 
327  auto comment = parameter.second.getNode("CommentDescription");
328  OUT << parameter.second.getNode("daqParameterKey").getValue() <<
329  ": " <<
330  parameter.second.getNode("daqParameterValue").getValue()
331  <<
332  (comment.isDefaultValue()?"":("\t # " + comment.getValue())) <<
333  "\n";
334 
335  if(!parameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<bool>())
336  POPCOMMENT;
337  }
338  }
339  OUT << "\n"; //end daq aggregator parameters
340 
341  OUT << "sources: {\n";
342 
343  PUSHTAB;
344  auto sourcesGroup = daq.getNode("daqAggregatorSourcesLink");
345  if(!sourcesGroup.isDisconnected())
346  {
347  try
348  {
349  auto sources = sourcesGroup.getChildren();
350  for(auto &source:sources)
351  {
352  unsigned int sourceRank =
353  contextConfig->getARTDAQAppRank(
354  source.second.getNode("sourceARTDAQContextLink").getValue());
355 
356  OUT << source.second.getNode("sourceKey").getValue() <<
357  ": {" <<
358  " transferPluginType: " <<
359  source.second.getNode("transferPluginType").getValue() <<
360  " source_rank: " <<
361  sourceRank <<
362  " max_fragment_size_words: " <<
363  source.second.getNode("ARTDAQGlobalConfigurationLink/maxFragmentSizeWords").getValue<unsigned int>() <<
364  "}\n";
365  }
366  }
367  catch(const std::runtime_error& e)
368  {
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());
373  }
374  }
375  POPTAB;
376  OUT << "}\n\n"; //end sources
377 
378  POPTAB;
379  OUT << "}\n\n"; //end aggregator
380 
381 
382  OUT << "metrics: {\n";
383 
384  PUSHTAB;
385  auto metricsGroup = daq.getNode("daqMetricsLink");
386  if(!metricsGroup.isDisconnected())
387  {
388  auto metrics = metricsGroup.getChildren();
389 
390  for(auto &metric:metrics)
391  {
392  if(!metric.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<bool>())
393  PUSHCOMMENT;
394 
395  OUT << metric.second.getNode("metricKey").getValue() <<
396  ": {\n";
397  PUSHTAB;
398 
399  OUT << "metricPluginType: " <<
400  metric.second.getNode("metricPluginType").getValue()
401  << "\n";
402  OUT << "level: " <<
403  metric.second.getNode("metricLevel").getValue()
404  << "\n";
405 
406  auto metricParametersGroup = metric.second.getNode("metricParametersLink");
407  if(!metricParametersGroup.isDisconnected())
408  {
409  auto metricParameters = metricParametersGroup.getChildren();
410  for(auto &metricParameter:metricParameters)
411  {
412  if(!metricParameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<bool>())
413  PUSHCOMMENT;
414 
415  auto comment = metricParameter.second.getNode("CommentDescription");
416  OUT << metricParameter.second.getNode("metricParameterKey").getValue() <<
417  ": " <<
418  metricParameter.second.getNode("metricParameterValue").getValue()
419  <<
420  (comment.isDefaultValue()?"":("\t # " + comment.getValue())) <<
421  "\n";
422 
423  if(!metricParameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<bool>())
424  POPCOMMENT;
425 
426  }
427  }
428  POPTAB;
429  OUT << "}\n\n"; //end metric
430 
431  if(!metric.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<bool>())
432  POPCOMMENT;
433  }
434  }
435  POPTAB;
436  OUT << "}\n\n"; //end metrics
437 
438  //other destinations
439  auto destinationsGroup = daq.getNode("daqAggregatorDestinationsLink");
440  if(!destinationsGroup.isDisconnected())
441  {
442  try
443  {
444  auto destinations = destinationsGroup.getChildren();
445  for(auto &destination:destinations)
446  {
447  unsigned int destinationRank = contextConfig->getARTDAQAppRank(
448  destination.second.getNode("destinationARTDAQContextLink").getValueAsString());
449 
450  OUT << destination.second.getNode("destinationKey").getValue() <<
451  ": {" <<
452  " transferPluginType: " <<
453  destination.second.getNode("transferPluginType").getValue() <<
454  " source_rank: " <<
455  selfRank <<
456  " destination_rank: " <<
457  destinationRank <<
458  " max_fragment_size_words: " <<
459  destination.second.getNode("ARTDAQGlobalConfigurationLink/maxFragmentSizeWords").getValue<unsigned int>() <<
460  "}\n";
461  }
462  }
463  catch(const std::runtime_error& e)
464  {
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());
469  }
470  }
471 
472  POPTAB;
473  OUT << "}\n\n"; //end daq
474  }
475 
476 
477  //--------------------------------------
478  //handle source
479  auto source = aggregatorNode.getNode("sourceLink");
480  if(!source.isDisconnected())
481  {
482  OUT << "source: {\n";
483 
484  PUSHTAB;
485  OUT << "module_type: " << source.getNode("sourceModuleType").getValue() <<
486  "\n";
487  POPTAB;
488  OUT << "}\n\n"; //end source
489  }
490 
491  //--------------------------------------
492  //handle outputs
493  auto outputs = aggregatorNode.getNode("outputsLink");
494  if(!outputs.isDisconnected())
495  {
496  OUT << "outputs: {\n";
497 
498  PUSHTAB;
499 
500  auto outputPlugins = outputs.getChildren();
501  for(auto &outputPlugin:outputPlugins)
502  {
503  if(!outputPlugin.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<bool>())
504  PUSHCOMMENT;
505 
506  OUT << outputPlugin.second.getNode("outputKey").getValue() <<
507  ": {\n";
508  PUSHTAB;
509  OUT << "module_type: " <<
510  outputPlugin.second.getNode("outputModuleType").getValue() <<
511  "\n";
512  auto pluginParameterLink = outputPlugin.second.getNode("outputModuleParameterLink");
513  if(!pluginParameterLink.isDisconnected())
514  {
515  auto pluginParameters = pluginParameterLink.getChildren();
516  for(auto &pluginParameter:pluginParameters)
517  {
518  if(!pluginParameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<bool>())
519  PUSHCOMMENT;
520 
521  auto comment = pluginParameter.second.getNode("CommentDescription");
522  OUT << pluginParameter.second.getNode("outputParameterKey").getValue() <<
523  ": " <<
524  pluginParameter.second.getNode("outputParameterValue").getValue()
525  <<
526  (comment.isDefaultValue()?"":("\t # " + comment.getValue())) <<
527  "\n";
528 
529  if(!pluginParameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<bool>())
530  POPCOMMENT;
531  }
532  }
533  POPTAB;
534  OUT << "}\n\n"; //end output module
535 
536  if(!outputPlugin.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<bool>())
537  POPCOMMENT;
538  }
539 
540  POPTAB;
541  OUT << "}\n\n"; //end outputs
542  }
543 
544 
545  //--------------------------------------
546  //handle physics
547  auto physics = aggregatorNode.getNode("physicsLink");
548  if(!physics.isDisconnected())
549  {
551  OUT << "physics: {\n";
552 
553  PUSHTAB;
554 
555  auto analyzers = physics.getNode("analyzersLink");
556  if(!analyzers.isDisconnected())
557  {
559  OUT << "analyzers: {\n";
560 
561  PUSHTAB;
562  auto modules = analyzers.getChildren();
563  for(auto &module:modules)
564  {
565  if(!module.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<bool>())
566  PUSHCOMMENT;
567 
568  OUT << module.second.getNode("analyzerKey").getValue() <<
569  ": {\n";
570  PUSHTAB;
571  OUT << "module_type: " <<
572  module.second.getNode("analyzerModuleType").getValue() <<
573  "\n";
574  auto moduleParameterLink = module.second.getNode("analyzerModuleParameterLink");
575  if(!moduleParameterLink.isDisconnected())
576  {
577  auto moduleParameters = moduleParameterLink.getChildren();
578  for(auto &moduleParameter:moduleParameters)
579  {
580  if(!moduleParameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<bool>())
581  PUSHCOMMENT;
582 
583  auto comment = moduleParameter.second.getNode("CommentDescription");
584  OUT << moduleParameter.second.getNode("analyzerParameterKey").getValue() <<
585  ": " <<
586  moduleParameter.second.getNode("analyzerParameterValue").getValue()
587  <<
588  (comment.isDefaultValue()?"":("\t # " + comment.getValue())) <<
589  "\n";
590 
591  if(!moduleParameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<bool>())
592  POPCOMMENT;
593  }
594  }
595  POPTAB;
596  OUT << "}\n\n"; //end analyzer module
597 
598  if(!module.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<bool>())
599  POPCOMMENT;
600  }
601  POPTAB;
602  OUT << "}\n\n"; //end analyzer
603  }
604 
605  auto producers = physics.getNode("producersLink");
606  if(!producers.isDisconnected())
607  {
609  OUT << "producers: {\n";
610 
611  PUSHTAB;
612  auto modules = producers.getChildren();
613  for(auto &module:modules)
614  {
615  if(!module.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<bool>())
616  PUSHCOMMENT;
617 
618  OUT << module.second.getNode("producerKey").getValue() <<
619  ": {\n";
620  PUSHTAB;
621  OUT << "module_type: " <<
622  module.second.getNode("producerModuleType").getValue() <<
623  "\n";
624  auto moduleParameterLink = module.second.getNode("producerModuleParameterLink");
625  if(!moduleParameterLink.isDisconnected())
626  {
627  auto moduleParameters = moduleParameterLink.getChildren();
628  for(auto &moduleParameter:moduleParameters)
629  {
630  if(!moduleParameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<bool>())
631  PUSHCOMMENT;
632 
633  auto comment = moduleParameter.second.getNode("CommentDescription");
634  OUT << moduleParameter.second.getNode("producerParameterKey").getValue() <<
635  ":" <<
636  moduleParameter.second.getNode("producerParameterValue").getValue()
637  <<
638  (comment.isDefaultValue()?"":("\t # " + comment.getValue())) <<
639  "\n";
640 
641  if(!moduleParameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<bool>())
642  POPCOMMENT;
643  }
644  }
645  POPTAB;
646  OUT << "}\n\n"; //end producer module
647 
648  if(!module.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<bool>())
649  POPCOMMENT;
650  }
651  POPTAB;
652  OUT << "}\n\n"; //end producer
653  }
654 
655 
656  auto filters = physics.getNode("filtersLink");
657  if(!filters.isDisconnected())
658  {
660  OUT << "filters: {\n";
661 
662  PUSHTAB;
663  auto modules = filters.getChildren();
664  for(auto &module:modules)
665  {
666  if(!module.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<bool>())
667  PUSHCOMMENT;
668 
669  OUT << module.second.getNode("filterKey").getValue() <<
670  ": {\n";
671  PUSHTAB;
672  OUT << "module_type: " <<
673  module.second.getNode("filterModuleType").getValue() <<
674  "\n";
675  auto moduleParameterLink = module.second.getNode("filterModuleParameterLink");
676  if(!moduleParameterLink.isDisconnected())
677  {
678  auto moduleParameters = moduleParameterLink.getChildren();
679  for(auto &moduleParameter:moduleParameters)
680  {
681  if(!moduleParameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<bool>())
682  PUSHCOMMENT;
683 
684  auto comment = moduleParameter.second.getNode("CommentDescription");
685  OUT << moduleParameter.second.getNode("filterParameterKey").getValue()
686  << ": " <<
687  moduleParameter.second.getNode("filterParameterValue").getValue()
688  <<
689  (comment.isDefaultValue()?"":("\t # " + comment.getValue())) <<
690  "\n";
691 
692  if(!moduleParameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<bool>())
693  POPCOMMENT;
694  }
695  }
696  POPTAB;
697  OUT << "}\n\n"; //end filter module
698 
699  if(!module.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<bool>())
700  POPCOMMENT;
701  }
702  POPTAB;
703  OUT << "}\n\n"; //end filter
704  }
705 
706 
707  auto otherParameterLink = physics.getNode("physicsOtherParametersLink");
708  if(!otherParameterLink.isDisconnected())
709  {
711  auto physicsParameters = otherParameterLink.getChildren();
712  for(auto &parameter:physicsParameters)
713  {
714  if(!parameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<bool>())
715  PUSHCOMMENT;
716 
717  auto comment = parameter.second.getNode("CommentDescription");
718  OUT << parameter.second.getNode("physicsParameterKey").getValue() <<
719  ": " <<
720  parameter.second.getNode("physicsParameterValue").getValue()
721  <<
722  (comment.isDefaultValue()?"":("\t # " + comment.getValue())) <<
723  "\n";
724 
725  if(!parameter.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<bool>())
726  POPCOMMENT;
727  }
728  }
729  POPTAB;
730  OUT << "}\n\n"; //end physics
731  }
732 
733 
734  //--------------------------------------
735  //handle process_name
736  OUT << "process_name: " <<
737  aggregatorNode.getNode("ARTDAQGlobalConfigurationForProcessNameLink/processNameForAggregators")
738  << "\n";
739 
740 
741 
742 
743  out.close();
744 }
745 
746 DEFINE_OTS_CONFIGURATION(ARTDAQAggregatorConfiguration)