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