otsdaq  3.06.00
ARTDAQDataLoggerTable_table.cc
1 #include "otsdaq/Macros/TablePluginMacros.h"
2 #include "otsdaq/TablePlugins/ARTDAQDataLoggerTable.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_artdaqDataLogger-ai.dbg"): \
12  (EPICS_CONFIG_PATH + "/_otsdaq_artdaqDataLogger-ai.dbg") )
13 
14 // clang-format on
15 
16 //==============================================================================
17 ARTDAQDataLoggerTable::ARTDAQDataLoggerTable(void)
18  : TableBase("ARTDAQDataLoggerTable")
19  , ARTDAQTableBase("ARTDAQDataLoggerTable")
20  , SlowControlsTableBase("ARTDAQDataLoggerTable")
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__ << "ARTDAQDataLoggerTable TRACE reinit and Constructed." << __E__;
37  }
38  else
39  __COUT__ << "ARTDAQDataLoggerTable Constructed." << __E__;
40 } // end constructor()
41 
42 //==============================================================================
43 ARTDAQDataLoggerTable::~ARTDAQDataLoggerTable(void) {}
44 
45 //==============================================================================
47 {
48  lastConfigManager_ = configManager;
49  if(!ARTDAQTableBase::doGenFiles(configManager))
50  {
51  __COUTS__(3) << "ARTDAQTableBase indicates file generation can be skipped."
52  << __E__;
53  return;
54  }
55 
56  __COUTS__(3) << "*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*" << __E__;
57  __COUTS__(3) << lastConfigManager_->__SELF_NODE__ << __E__;
58 
59  genFlatFHiCL();
60 } // end init()
61 
62 //==============================================================================
63 void ARTDAQDataLoggerTable::genFlatFHiCL(void)
64 {
65  // handle fcl file generation, wherever the level of this table
66 
67  auto dataloggers = lastConfigManager_->__SELF_NODE__.getChildren(
68  /*default filterMap*/ std::map<std::string /*relative-path*/,
69  std::string /*value*/>(),
70  /*default byPriority*/ false,
71  /*TRUE! onlyStatusTrue*/ true);
72 
73  for(auto& datalogger : dataloggers)
74  {
76  datalogger.second, ARTDAQTableBase::ARTDAQAppType::DataLogger);
77 
78  ARTDAQTableBase::flattenFHICL(
79  ARTDAQAppType::DataLogger,
80  datalogger.second.getValue(),
81  &(fclMap_[ARTDAQAppType::DataLogger][datalogger.first]));
82  }
83  __COUTS__(3) << "*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*" << __E__;
84 } // end genFlatFHiCL()
85 
86 //==============================================================================
87 unsigned int ARTDAQDataLoggerTable::slowControlsHandlerConfig(
88  std::stringstream& out,
89  ConfigurationManager* configManager,
90  std::vector<std::pair<std::string /*channelName*/, std::vector<std::string>>>*
91  channelList /*= 0*/
92 ) const
93 {
95  // generate xdaq run parameter file
96 
97  std::string tabStr = "";
98  std::string commentStr = "";
99 
100  // loop through ARTDAQ DataLogger records starting at ARTDAQSupervisorTable
101  std::vector<std::pair<std::string, ConfigurationTree>> artdaqRecords =
102  configManager->getNode("ARTDAQSupervisorTable").getChildren();
103 
104  unsigned int numberOfDataLoggerMetricParameters = 0;
105 
106  for(auto& artdaqPair : artdaqRecords) // start main artdaq record loop
107  {
108  if(artdaqPair.second.getNode(colARTDAQSupervisor_.colLinkToDataLoggers_)
109  .isDisconnected())
110  continue;
111 
112  std::vector<std::pair<std::string, ConfigurationTree>> dataLoggerRecords =
113  artdaqPair.second.getNode(colARTDAQSupervisor_.colLinkToDataLoggers_)
114  .getChildren();
115 
116  for(auto& dataLoggerPair :
117  dataLoggerRecords) // start main dataLogger record loop
118  {
119  if(!dataLoggerPair.second.status())
120  continue;
121 
122  try
123  {
124  if(dataLoggerPair.second.getNode("daqLink").isDisconnected())
125  continue;
126 
127  auto daqLink = dataLoggerPair.second.getNode("daqLink");
128 
129  if(daqLink.getNode("daqMetricsLink").isDisconnected())
130  continue;
131 
132  auto daqMetricsLinks = daqLink.getNode("daqMetricsLink").getChildren();
133  for(auto& daqMetricsLink :
134  daqMetricsLinks) // start daqMetricsLinks record loop
135  {
136  if(!daqMetricsLink.second.status())
137  continue;
138 
139  if(daqMetricsLink.second.getNode("metricParametersLink")
140  .isDisconnected())
141  continue;
142 
143  // ConfigurationTree slowControlsLink = configManager->getNode("ARTDAQMetricAlarmThresholdsTable");
144  ConfigurationTree slowControlsLink =
145  dataLoggerPair.second.getNode("MetricAlarmThresholdsLink");
146 
147  auto metricParametersLinks =
148  daqMetricsLink.second.getNode("metricParametersLink")
149  .getChildren();
150  for(auto& metricParametersLink :
151  metricParametersLinks) // start daq MetricParametersLinks record loop
152  {
153  if(!metricParametersLink.second.status())
154  continue;
155 
156  std::string subsystem =
157  metricParametersLink.second.getNode("metricParameterValue")
158  .getValueWithDefault<std::string>(std::string("TDAQ_") +
159  __ENV__("MU2E_OWNER"));
160  if(subsystem.find("Mu2e:") != std::string::npos)
161  subsystem = subsystem.replace(subsystem.find("Mu2e:"), 5, "");
162  while(subsystem.find("\"") != std::string::npos)
163  subsystem = subsystem.replace(subsystem.find("\""), 1, "");
164 
165  numberOfDataLoggerMetricParameters =
166  slowControlsHandler(out,
167  tabStr,
168  commentStr,
169  subsystem,
170  dataLoggerPair.first,
171  slowControlsLink,
172  channelList);
173 
174  __COUT__ << "DataLogger '" << dataLoggerPair.first
175  << "' number of metrics for slow controls: "
176  << numberOfDataLoggerMetricParameters << __E__;
177  }
178  }
179  }
180  catch(const std::runtime_error& e)
181  {
182  __COUT_ERR__ << "Ignoring DataLogger error: " << e.what() << __E__;
183  }
184  }
185  }
186 
187  return numberOfDataLoggerMetricParameters;
188 } // end slowControlsHandlerConfig()
189 
190 //==============================================================================
193 {
194  return SLOWCONTROL_PV_FILE_PATH;
195 }
196 
197 DEFINE_OTS_TABLE(ARTDAQDataLoggerTable)
virtual std::string setFilePath(void) const override
return out file path
void init(ConfigurationManager *configManager) override
Methods.
<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