otsdaq  3.11.00
ARTDAQEventBuilderTable_table.cc
1 #include "otsdaq/Macros/TablePluginMacros.h"
2 #include "otsdaq/TablePlugins/ARTDAQEventBuilderTable.h"
3 
4 #include <fstream> // for std::ofstream
5 
6 using namespace ots;
7 
8 // clang-format off
9 
10 #define SLOWCONTROL_PV_FILE_PATH \
11  std::string( \
12  getenv("OTSDAQ_EPICS_DATA")? \
13  (std::string(getenv("OTSDAQ_EPICS_DATA")) + "/" + __ENV__("MU2E_OWNER") + "_otsdaq_artdaqEventBuilder-ai.dbg"): \
14  (EPICS_CONFIG_PATH + "/_otsdaq_artdaqEventBuilder-ai.dbg") )
15 
16 // clang-format on
17 
18 //==============================================================================
19 ARTDAQEventBuilderTable::ARTDAQEventBuilderTable(void)
20  : TableBase("ARTDAQEventBuilderTable")
21  , ARTDAQTableBase("ARTDAQEventBuilderTable")
22  , SlowControlsTableBase("ARTDAQEventBuilderTable")
23 {
25  // WARNING: the names used in C++ MUST match the Table INFO //
27  __COUT__ << "ARTDAQEventBuilderTable Constructed." << __E__;
28 } // end constructor()
29 
30 //==============================================================================
31 ARTDAQEventBuilderTable::~ARTDAQEventBuilderTable(void) {}
32 
33 //==============================================================================
35 {
36  lastConfigManager_ = configManager;
37  if(!ARTDAQTableBase::doGenFiles(configManager))
38  {
39  __COUTS__(3) << "ARTDAQTableBase indicates file generation can be skipped."
40  << __E__;
41  return;
42  }
43 
44  __COUTS__(3) << "*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*" << __E__;
45  __COUTS__(3) << configManager->__SELF_NODE__ << __E__;
46 
47  genFlatFHiCL();
48 } // end init()
49 
50 //==============================================================================
51 void ARTDAQEventBuilderTable::genFlatFHiCL(void)
52 {
53  // handle fcl file generation, wherever the level of this table
54 
55  auto builders = lastConfigManager_->getNode(ARTDAQTableBase::getTableName())
56  .getChildren(
57  /*default filterMap*/ std::map<std::string /*relative-path*/,
58  std::string /*value*/>(),
59  /*default byPriority*/ false,
60  /*TRUE! onlyStatusTrue*/ true);
61 
62  // Builder fcl generation happens in two stages: outputDataReceiverFHICL
63  // (config-tree access, sequential) inside the loop below, then the expensive
64  // flattens run together in parallel after the loop, each capturing its
65  // flattened fcl into fclMap_ (std::map nodes are stable, so the value
66  // pointers taken below stay valid while the map grows)
67  std::vector<std::pair<std::string, std::string*>> buildersToFlatten;
68  for(auto& builder : builders)
69  {
70  const std::string& builderUID = builder.first;
71  __COUTV__(builderUID);
72 
73  outputDataReceiverFHICL(builder.second,
74  ARTDAQAppType::EventBuilder,
75  DEFAULT_MAX_FRAGMENT_SIZE,
76  DEFAULT_ROUTING_TIMEOUT_MS,
77  DEFAULT_ROUTING_RETRY_COUNT);
78  buildersToFlatten.emplace_back(
79  builderUID, &(fclMap_[ARTDAQAppType::EventBuilder][builderUID]));
80  } //end builder fcl handling loop
81 
82  if(buildersToFlatten.size())
83  ARTDAQTableBase::flattenFHICLInParallel(ARTDAQAppType::EventBuilder,
84  buildersToFlatten);
85  __COUTS__(3) << "*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*" << __E__;
86 } // end init()
87 
88 //==============================================================================
89 unsigned int ARTDAQEventBuilderTable::slowControlsHandlerConfig(
90  std::stringstream& out,
91  ConfigurationManager* configManager,
92  std::vector<std::pair<std::string /*channelName*/, std::vector<std::string>>>*
93  channelList /*= 0*/
94 ) const
95 {
97  // generate xdaq run parameter file
98 
99  std::string tabStr = "";
100  std::string commentStr = "";
101 
102  // loop through ARTDAQ EventBuilder records starting at ARTDAQSupervisorTable
103  std::vector<std::pair<std::string, ConfigurationTree>> artdaqRecords =
104  configManager->getNode("ARTDAQSupervisorTable").getChildren();
105 
106  unsigned int numberOfEventBuiderMetricParameters = 0;
107 
108  for(auto& artdaqPair : artdaqRecords) // start main artdaq record loop
109  {
110  if(artdaqPair.second.getNode(colARTDAQSupervisor_.colLinkToEventBuilders_)
111  .isDisconnected())
112  continue;
113 
114  std::vector<std::pair<std::string, ConfigurationTree>> eventBuilderRecords =
115  artdaqPair.second.getNode(colARTDAQSupervisor_.colLinkToEventBuilders_)
116  .getChildren();
117 
118  for(auto& eventBuilderPair :
119  eventBuilderRecords) // start main eventBuilder record loop
120  {
121  if(!eventBuilderPair.second.status())
122  continue;
123 
124  try
125  {
126  if(eventBuilderPair.second.getNode("daqLink").isDisconnected())
127  continue;
128 
129  auto daqLink = eventBuilderPair.second.getNode("daqLink");
130 
131  if(daqLink.getNode("daqMetricsLink").isDisconnected())
132  continue;
133 
134  auto daqMetricsLinks = daqLink.getNode("daqMetricsLink").getChildren();
135  for(auto& daqMetricsLink :
136  daqMetricsLinks) // start daqMetricsLinks record loop
137  {
138  if(!daqMetricsLink.second.status())
139  continue;
140 
141  if(daqMetricsLink.second.getNode("metricParametersLink")
142  .isDisconnected())
143  continue;
144 
145  // ConfigurationTree slowControlsLink = configManager->getNode("ARTDAQMetricAlarmThresholdsTable");
146  ConfigurationTree slowControlsLink =
147  eventBuilderPair.second.getNode("MetricAlarmThresholdsLink");
148 
149  auto metricParametersLinks =
150  daqMetricsLink.second.getNode("metricParametersLink")
151  .getChildren();
152  for(auto& metricParametersLink :
153  metricParametersLinks) // start daq MetricParametersLinks record loop
154  {
155  if(!metricParametersLink.second.status())
156  continue;
157 
158  std::string subsystem =
159  metricParametersLink.second.getNode("metricParameterValue")
160  .getValueWithDefault<std::string>(std::string("TDAQ_") +
161  __ENV__("MU2E_OWNER"));
162  if(subsystem.find("Mu2e:") != std::string::npos)
163  subsystem = subsystem.replace(subsystem.find("Mu2e:"), 5, "");
164  while(subsystem.find("\"") != std::string::npos)
165  subsystem = subsystem.replace(subsystem.find("\""), 1, "");
166 
167  numberOfEventBuiderMetricParameters =
168  slowControlsHandler(out,
169  tabStr,
170  commentStr,
171  subsystem,
172  eventBuilderPair.first,
173  slowControlsLink,
174  channelList);
175 
176  __COUT__ << "EventBuilder '" << eventBuilderPair.first
177  << "' number of metrics for slow controls: "
178  << numberOfEventBuiderMetricParameters << __E__;
179  }
180  }
181  }
182  catch(const std::runtime_error& e)
183  {
184  __COUT_ERR__ << "Ignoring EventBuilder error: " << e.what() << __E__;
185  }
186  }
187  }
188 
189  return numberOfEventBuiderMetricParameters;
190 } // end slowControlsHandlerConfig()
191 
192 //==============================================================================
195 {
196  return SLOWCONTROL_PV_FILE_PATH;
197 }
198 
199 DEFINE_OTS_TABLE(ARTDAQEventBuilderTable)
void init(ConfigurationManager *configManager) override
Methods.
virtual std::string setFilePath(void) const override
return out file path
<virtual so future plugins can inherit from multiple table base classes
static void outputDataReceiverFHICL(const ConfigurationTree &receiverNode, ARTDAQAppType appType, size_t maxFragmentSizeBytes=DEFAULT_MAX_FRAGMENT_SIZE, size_t routingTimeoutMs=DEFAULT_ROUTING_TIMEOUT_MS, size_t routingRetryCount=DEFAULT_ROUTING_RETRY_COUNT, std::string *returnFcl=nullptr)
ConfigurationTree getNode(const std::string &nodeString, bool doNotThrowOnBrokenUIDLinks=false) const
"root/parent/parent/"
ConfigurationTree getNode(const std::string &nodeName, bool doNotThrowOnBrokenUIDLinks=false) const
navigating between nodes
std::vector< std::pair< std::string, ConfigurationTree > > getChildren(std::map< std::string, std::string > filterMap=std::map< std::string, std::string >(), bool byPriority=false, bool onlyStatusTrue=false) const
<virtual so future plugins can inherit from multiple table base classes
const std::string & getTableName(void) const
Getters.
Definition: TableBase.cc:814
defines used also by OtsConfigurationWizardSupervisor