otsdaq  3.06.00
ARTDAQDispatcherTable_table.cc
1 #include "otsdaq/Macros/TablePluginMacros.h"
2 #include "otsdaq/TablePlugins/ARTDAQDispatcherTable.h"
3 
4 using namespace ots;
5 
6 // clang-format off
7 
8 #define SLOWCONTROL_PV_FILE_PATH \
9  std::string( \
10  getenv("OTSDAQ_EPICS_DATA")? \
11  (std::string(getenv("OTSDAQ_EPICS_DATA")) + "/" + __ENV__("MU2E_OWNER") + "_otsdaq_artdaqDispatcher-ai.dbg"): \
12  (EPICS_CONFIG_PATH + "/_otsdaq_artdaqDispatcher-ai.dbg") )
13 
14 // clang-format on
15 
16 //==============================================================================
17 ARTDAQDispatcherTable::ARTDAQDispatcherTable(void)
18  : TableBase("ARTDAQDispatcherTable")
19  , ARTDAQTableBase("ARTDAQDispatcherTable")
20  , SlowControlsTableBase("ARTDAQDispatcherTable")
21 
22 {
24  // WARNING: the names used in C++ MUST match the Table INFO //
26  __COUT__ << "ARTDAQDispatcherTable Constructed." << __E__;
27 } // end constructor()
28 
29 //==============================================================================
30 ARTDAQDispatcherTable::~ARTDAQDispatcherTable(void) {}
31 
32 //==============================================================================
34 {
35  lastConfigManager_ = configManager;
36  if(!ARTDAQTableBase::doGenFiles(configManager))
37  {
38  __COUTS__(3) << "ARTDAQTableBase indicates file generation can be skipped."
39  << __E__;
40  return;
41  }
42 
43  __COUTS__(3) << "*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*" << __E__;
44  __COUTS__(3) << configManager->__SELF_NODE__ << __E__;
45 
46  genFlatFHiCL();
47 } // end init()
48 
49 //==============================================================================
50 void ARTDAQDispatcherTable::genFlatFHiCL(void)
51 {
52  // handle fcl file generation, wherever the level of this table
53 
54  auto dispatchers = lastConfigManager_->__SELF_NODE__.getChildren(
55  /*default filterMap*/ std::map<std::string /*relative-path*/,
56  std::string /*value*/>(),
57  /*default byPriority*/ false,
58  /*TRUE! onlyStatusTrue*/ true);
59 
60  for(auto& dispatcher : dispatchers)
61  {
63  dispatcher.second, ARTDAQTableBase::ARTDAQAppType::Dispatcher);
64  ARTDAQTableBase::flattenFHICL(
65  ARTDAQAppType::Dispatcher,
66  dispatcher.second.getValue(),
67  &(fclMap_[ARTDAQAppType::Dispatcher][dispatcher.first]));
68  }
69  __COUTS__(3) << "*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*" << __E__;
70 } // end genFlatFHiCL()
71 
72 //==============================================================================
73 unsigned int ARTDAQDispatcherTable::slowControlsHandlerConfig(
74  std::stringstream& out,
75  ConfigurationManager* configManager,
76  std::vector<std::pair<std::string /*channelName*/, std::vector<std::string>>>*
77  channelList /*= 0*/
78 ) const
79 {
81  // generate xdaq run parameter file
82 
83  std::string tabStr = "";
84  std::string commentStr = "";
85 
86  // loop through ARTDAQ Dispatcher records starting at ARTDAQSupervisorTable
87  std::vector<std::pair<std::string, ConfigurationTree>> artdaqRecords =
88  configManager->getNode("ARTDAQSupervisorTable").getChildren();
89 
90  unsigned int numberOfDispatcherMetricParameters = 0;
91 
92  for(auto& artdaqPair : artdaqRecords) // start main artdaq record loop
93  {
94  if(artdaqPair.second.getNode(colARTDAQSupervisor_.colLinkToDispatchers_)
95  .isDisconnected())
96  continue;
97 
98  std::vector<std::pair<std::string, ConfigurationTree>> dispatcherRecords =
99  artdaqPair.second.getNode(colARTDAQSupervisor_.colLinkToDispatchers_)
100  .getChildren();
101 
102  for(auto& dispatcherPair :
103  dispatcherRecords) // start main dispatcher record loop
104  {
105  if(!dispatcherPair.second.status())
106  continue;
107 
108  try
109  {
110  if(dispatcherPair.second.getNode("daqLink").isDisconnected())
111  continue;
112 
113  auto daqLink = dispatcherPair.second.getNode("daqLink");
114 
115  if(daqLink.getNode("daqMetricsLink").isDisconnected())
116  continue;
117 
118  auto daqMetricsLinks = daqLink.getNode("daqMetricsLink").getChildren();
119  for(auto& daqMetricsLink :
120  daqMetricsLinks) // start daqMetricsLinks record loop
121  {
122  if(!daqMetricsLink.second.status())
123  continue;
124 
125  if(daqMetricsLink.second.getNode("metricParametersLink")
126  .isDisconnected())
127  continue;
128 
129  // ConfigurationTree slowControlsLink = configManager->getNode("ARTDAQMetricAlarmThresholdsTable");
130  ConfigurationTree slowControlsLink =
131  dispatcherPair.second.getNode("MetricAlarmThresholdsLink");
132 
133  auto metricParametersLinks =
134  daqMetricsLink.second.getNode("metricParametersLink")
135  .getChildren();
136  for(auto& metricParametersLink :
137  metricParametersLinks) // start daq MetricParametersLinks record loop
138  {
139  if(!metricParametersLink.second.status())
140  continue;
141 
142  std::string subsystem =
143  metricParametersLink.second.getNode("metricParameterValue")
144  .getValueWithDefault<std::string>(std::string("TDAQ_") +
145  __ENV__("MU2E_OWNER"));
146  if(subsystem.find("Mu2e:") != std::string::npos)
147  subsystem = subsystem.replace(subsystem.find("Mu2e:"), 5, "");
148  while(subsystem.find("\"") != std::string::npos)
149  subsystem = subsystem.replace(subsystem.find("\""), 1, "");
150 
151  numberOfDispatcherMetricParameters =
152  slowControlsHandler(out,
153  tabStr,
154  commentStr,
155  subsystem,
156  dispatcherPair.first,
157  slowControlsLink,
158  channelList);
159 
160  __COUT__ << "Dispatcher '" << dispatcherPair.first
161  << "' number of metrics for slow controls: "
162  << numberOfDispatcherMetricParameters << __E__;
163  }
164  }
165  }
166  catch(const std::runtime_error& e)
167  {
168  __COUT_ERR__ << "Ignoring Dispatcher error: " << e.what() << __E__;
169  }
170  }
171  }
172 
173  return numberOfDispatcherMetricParameters;
174 } // end slowControlsHandlerConfig()
175 
176 //==============================================================================
179 {
180  return SLOWCONTROL_PV_FILE_PATH;
181 }
182 
183 DEFINE_OTS_TABLE(ARTDAQDispatcherTable)
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/"
std::vector< std::pair< std::string, ConfigurationTree > > getChildren(std::map< std::string, TableVersion > *memberMap=0, std::string *accumulatedTreeErrors=0) const
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
defines used also by OtsConfigurationWizardSupervisor