otsdaq  3.03.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 
36  // use isFirstAppInContext to only run once per context, for example to avoid
37  // generating files on local disk multiple times.
38  isFirstAppInContext_ = configManager->isOwnerFirstAppInContext();
39 
40  //__COUTV__(isFirstAppInContext);
42  return;
43 
44  //if artdaq supervisor is disabled, skip fcl handling
45  if(!ARTDAQTableBase::isARTDAQEnabled(configManager))
46  {
47  __COUT_INFO__ << "ARTDAQ Supervisor is disabled, so skipping fcl handling."
48  << __E__;
49  return;
50  }
51 
52  // make directory just in case
53  mkdir((ARTDAQTableBase::ARTDAQ_FCL_PATH).c_str(), 0755);
54 
55  // __COUT__ << "*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*" << __E__;
56  // __COUT__ << configManager->__SELF_NODE__ << __E__;
57 
58  // handle fcl file generation, wherever the level of this table
59 
60  auto routingManagers = lastConfigManager_->__SELF_NODE__.getChildren(
61  /*default filterMap*/ std::map<std::string /*relative-path*/,
62  std::string /*value*/>(),
63  /*default byPriority*/ false,
64  /*TRUE! onlyStatusTrue*/ true);
65 
66  for(auto& routingManager : routingManagers)
67  {
68  ARTDAQTableBase::outputRoutingManagerFHICL(routingManager.second);
69  ARTDAQTableBase::flattenFHICL(ARTDAQAppType::RoutingManager,
70  routingManager.second.getValue());
71  }
72 
73 } // end init()
74 
75 //==============================================================================
76 unsigned int ARTDAQRoutingManagerTable::slowControlsHandlerConfig(
77  std::stringstream& out,
78  ConfigurationManager* configManager,
79  std::vector<std::pair<std::string /*channelName*/, std::vector<std::string>>>*
80  channelList /*= 0*/
81 ) const
82 {
84  // generate xdaq run parameter file
85 
86  std::string tabStr = "";
87  std::string commentStr = "";
88 
89  // loop through ARTDAQ RoutingManager records starting at ARTDAQSupervisorTable
90  std::vector<std::pair<std::string, ConfigurationTree>> artdaqRecords =
91  configManager->getNode("ARTDAQSupervisorTable").getChildren();
92 
93  unsigned int numberOfRoutingManagerMetricParameters = 0;
94 
95  for(auto& artdaqPair : artdaqRecords) // start main artdaq record loop
96  {
97  if(artdaqPair.second.getNode(colARTDAQSupervisor_.colLinkToRoutingManagers_)
98  .isDisconnected())
99  continue;
100 
101  std::vector<std::pair<std::string, ConfigurationTree>> routingManagerRecords =
102  artdaqPair.second.getNode(colARTDAQSupervisor_.colLinkToRoutingManagers_)
103  .getChildren();
104 
105  for(auto& routingManagerPair :
106  routingManagerRecords) // start main routingManager record loop
107  {
108  if(!routingManagerPair.second.status())
109  continue;
110 
111  try
112  {
113  if(routingManagerPair.second.getNode("daqMetricsLink").isDisconnected())
114  continue;
115 
116  auto daqMetricsLinks =
117  routingManagerPair.second.getNode("daqMetricsLink").getChildren();
118  for(auto& daqMetricsLink :
119  daqMetricsLinks) // start daqMetricsLinks record loop
120  {
121  if(!daqMetricsLink.second.status())
122  continue;
123 
124  if(daqMetricsLink.second.getNode("metricParametersLink")
125  .isDisconnected())
126  continue;
127 
128  // ConfigurationTree slowControlsLink = configManager->getNode("ARTDAQMetricAlarmThresholdsTable");
129  ConfigurationTree slowControlsLink =
130  routingManagerPair.second.getNode("MetricAlarmThresholdsLink");
131 
132  auto metricParametersLinks =
133  daqMetricsLink.second.getNode("metricParametersLink")
134  .getChildren();
135  for(auto& metricParametersLink :
136  metricParametersLinks) // start daq MetricParametersLinks record loop
137  {
138  if(!metricParametersLink.second.status())
139  continue;
140 
141  std::string subsystem =
142  metricParametersLink.second.getNode("metricParameterValue")
143  .getValueWithDefault<std::string>(std::string("TDAQ_") +
144  __ENV__("MU2E_OWNER"));
145  if(subsystem.find("Mu2e:") != std::string::npos)
146  subsystem = subsystem.replace(subsystem.find("Mu2e:"), 5, "");
147  while(subsystem.find("\"") != std::string::npos)
148  subsystem = subsystem.replace(subsystem.find("\""), 1, "");
149 
150  numberOfRoutingManagerMetricParameters =
151  slowControlsHandler(out,
152  tabStr,
153  commentStr,
154  subsystem,
155  routingManagerPair.first,
156  slowControlsLink,
157  channelList);
158 
159  __COUT__ << "RoutingManager '" << routingManagerPair.first
160  << "' number of metrics for slow controls: "
161  << numberOfRoutingManagerMetricParameters << __E__;
162  }
163  }
164  }
165  catch(const std::runtime_error& e)
166  {
167  __COUT_ERR__ << "Ignoring RoutingManager error: " << e.what() << __E__;
168  }
169  }
170  }
171 
172  return numberOfRoutingManagerMetricParameters;
173 } // end slowControlsHandlerConfig()
174 
175 //==============================================================================
178 {
179  return SLOWCONTROL_PV_FILE_PATH;
180 }
181 
182 DEFINE_OTS_TABLE(ARTDAQRoutingManagerTable)
void init(ConfigurationManager *configManager) override
Methods.
virtual std::string setFilePath() const override
return out file path
<virtual so future plugins can inherit from multiple table base classes
static bool isARTDAQEnabled(const ConfigurationManager *cfgMgr)
isARTDAQEnabled
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
bool isFirstAppInContext_
for managing if PV list has changed