otsdaq  3.06.00
ARTDAQBoardReaderTable_table.cc
1 #include "otsdaq/Macros/TablePluginMacros.h"
2 #include "otsdaq/TablePlugins/ARTDAQBoardReaderTable.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_artdaqBoardReader-ai.dbg"): \
12  (EPICS_CONFIG_PATH + "/_otsdaq_artdaqBoardReader-ai.dbg") )
13 
14 // clang-format on
15 
16 //==============================================================================
17 ARTDAQBoardReaderTable::ARTDAQBoardReaderTable(void)
18  : TableBase("ARTDAQBoardReaderTable")
19  , ARTDAQTableBase("ARTDAQBoardReaderTable")
20  , SlowControlsTableBase("ARTDAQBoardReaderTable")
21 {
23  // WARNING: the names used in C++ MUST match the Table INFO //
25  // December 2021 started seeing an issue where traceTID is found to be cleared to 0
26  // which crashes TRACE if __COUT__ is used in a Table plugin constructor
27  // This check and re-initialization seems to cover up the issue for now.
28  // Why it is cleared to 0 after the constructor sets it to -1 is still unknown.
29  // Note: it seems to only happen on the first alphabetially ARTDAQ Configure Table plugin.
30  if(traceTID == 0)
31  {
32  std::cout << "ARTDAQBoardReaderTable Before traceTID=" << traceTID << __E__;
33  char buf[40];
34  traceInit(trace_name(TRACE_NAME, __TRACE_FILE__, buf, sizeof(buf)), 0);
35  std::cout << "ARTDAQBoardReaderTable After traceTID=" << traceTID << __E__;
36  __COUT__ << "ARTDAQBoardReaderTable TRACE reinit and Constructed." << __E__;
37  }
38  else
39  __COUT__ << "ARTDAQBoardReaderTable Constructed." << __E__;
40 } // end constructor()
41 
42 //==============================================================================
43 ARTDAQBoardReaderTable::~ARTDAQBoardReaderTable(void) {}
44 
45 //==============================================================================
47 {
48  __COUTS__(10) << "*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*" << __E__;
49  __COUTS__(10) << configManager->__SELF_NODE__ << __E__;
50 
51  lastConfigManager_ = configManager; //for Slow Controls member
52  if(!ARTDAQTableBase::doGenFiles(configManager))
53  {
54  __COUTS__(3) << "ARTDAQTableBase indicates file generation can be skipped."
55  << __E__;
56  return;
57  }
58 
59  __COUTS__(3) << "*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*" << __E__;
60  __COUTS__(3) << configManager->__SELF_NODE__ << __E__;
61 
62  genFlatFHiCL();
63 } // end init()
64 
65 //==============================================================================
66 void ARTDAQBoardReaderTable::genFlatFHiCL(void)
67 {
68  // handle fcl file generation, wherever the level of this table
69 
70  // auto readers = lastConfigManager_->getNode(ARTDAQTableBase::getTableName()).getChildren(
71  auto readers = lastConfigManager_->__SELF_NODE__.getChildren(
72  /*default filterMap*/ std::map<std::string /*relative-path*/,
73  std::string /*value*/>(),
74  /*default byPriority*/ false,
75  /*TRUE! onlyStatusTrue*/ true);
76 
77  for(auto& reader : readers)
78  {
79  ARTDAQTableBase::outputBoardReaderFHICL(reader.second);
80  ARTDAQTableBase::flattenFHICL(
81  ARTDAQAppType::BoardReader,
82  reader.second.getValue(),
83  &(fclMap_[ARTDAQAppType::BoardReader][reader.first]));
84  }
85  __COUTS__(3) << "*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*" << __E__;
86 } // end genFlatFHiCL()
87 
88 //==============================================================================
89 unsigned int ARTDAQBoardReaderTable::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 BoardReader records starting at ARTDAQSupervisorTable
103  std::vector<std::pair<std::string, ConfigurationTree>> artdaqRecords =
104  configManager->getNode("ARTDAQSupervisorTable").getChildren();
105 
106  unsigned int numberOfBoardReaderMetricParameters = 0;
107 
108  for(auto& artdaqPair : artdaqRecords) // start main artdaq record loop
109  {
110  if(artdaqPair.second.getNode(colARTDAQSupervisor_.colLinkToBoardReaders_)
111  .isDisconnected())
112  continue;
113 
114  std::vector<std::pair<std::string, ConfigurationTree>> boardReaderRecords =
115  artdaqPair.second.getNode(colARTDAQSupervisor_.colLinkToBoardReaders_)
116  .getChildren();
117 
118  for(auto& boardReaderPair :
119  boardReaderRecords) // start main boardReader record loop
120  {
121  if(!boardReaderPair.second.status())
122  continue;
123 
124  try
125  {
126  if(boardReaderPair.second.getNode("daqMetricsLink").isDisconnected())
127  continue;
128 
129  auto daqMetricsLinks =
130  boardReaderPair.second.getNode("daqMetricsLink").getChildren();
131  for(auto& daqMetricsLink :
132  daqMetricsLinks) // start daqMetricsLinks record loop
133  {
134  if(!daqMetricsLink.second.status())
135  continue;
136 
137  if(daqMetricsLink.second.getNode("metricParametersLink")
138  .isDisconnected())
139  continue;
140 
141  // ConfigurationTree slowControlsLink = configManager->getNode("ARTDAQMetricAlarmThresholdsTable");
142  ConfigurationTree slowControlsLink =
143  boardReaderPair.second.getNode("MetricAlarmThresholdsLink");
144 
145  auto metricParametersLinks =
146  daqMetricsLink.second.getNode("metricParametersLink")
147  .getChildren();
148  for(auto& metricParametersLink :
149  metricParametersLinks) // start daq MetricParametersLinks record loop
150  {
151  if(!metricParametersLink.second.status())
152  continue;
153 
154  std::string subsystem =
155  metricParametersLink.second.getNode("metricParameterValue")
156  .getValueWithDefault<std::string>(std::string("TDAQ_") +
157  __ENV__("MU2E_OWNER"));
158  if(subsystem.find("Mu2e:") != std::string::npos)
159  subsystem = subsystem.replace(subsystem.find("Mu2e:"), 5, "");
160  while(subsystem.find("\"") != std::string::npos)
161  subsystem = subsystem.replace(subsystem.find("\""), 1, "");
162 
163  numberOfBoardReaderMetricParameters =
164  slowControlsHandler(out,
165  tabStr,
166  commentStr,
167  subsystem,
168  boardReaderPair.first,
169  slowControlsLink,
170  channelList);
171 
172  __COUT__ << "BoardReader '" << boardReaderPair.first
173  << "' number of metrics for slow controls: "
174  << numberOfBoardReaderMetricParameters << __E__;
175  }
176  }
177  }
178  catch(const std::runtime_error& e)
179  {
180  __COUT_ERR__ << "Ignoring BoardReader error: " << e.what() << __E__;
181  }
182  }
183  }
184 
185  return numberOfBoardReaderMetricParameters;
186 } // end slowControlsHandlerConfig()
187 
188 //==============================================================================
191 {
192  return SLOWCONTROL_PV_FILE_PATH;
193 }
194 
195 DEFINE_OTS_TABLE(ARTDAQBoardReaderTable)
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