tdaq-develop-2025-02-12
IterateTableImpl.cc
1 #include "otsdaq/ConfigurationInterface/ConfigurationManager.h"
2 #include "otsdaq/TablePlugins/IterateTable.h"
3 
4 #include <iostream>
5 #include <string>
6 
7 using namespace ots;
8 
11 const std::string IterateTable::COMMAND_BEGIN_LABEL = "BEGIN_LABEL";
12 const std::string IterateTable::COMMAND_CHOOSE_FSM = "CHOOSE_FSM";
13 const std::string IterateTable::COMMAND_CONFIGURE_ACTIVE_GROUP = "CONFIGURE_ACTIVE_GROUP";
14 const std::string IterateTable::COMMAND_CONFIGURE_ALIAS = "CONFIGURE_ALIAS";
15 const std::string IterateTable::COMMAND_CONFIGURE_GROUP = "CONFIGURE_GROUP";
16 const std::string IterateTable::COMMAND_ACTIVATE_ALIAS = "ACTIVATE_ALIAS";
17 const std::string IterateTable::COMMAND_ACTIVATE_GROUP = "ACTIVATE_GROUP";
18 const std::string IterateTable::COMMAND_EXECUTE_FE_MACRO = "EXECUTE_FE_MACRO";
19 const std::string IterateTable::COMMAND_EXECUTE_MACRO = "EXECUTE_MACRO";
20 const std::string IterateTable::COMMAND_MODIFY_ACTIVE_GROUP = "MODIFY_ACTIVE_GROUP";
21 const std::string IterateTable::COMMAND_REPEAT_LABEL = "REPEAT_LABEL";
22 const std::string IterateTable::COMMAND_RUN = "RUN";
23 const std::string IterateTable::COMMAND_START = "START";
24 const std::string IterateTable::COMMAND_STOP = "STOP";
25 const std::string IterateTable::COMMAND_PAUSE = "PAUSE";
26 const std::string IterateTable::COMMAND_RESUME = "RESUME";
27 const std::string IterateTable::COMMAND_HALT = "HALT";
28 
29 const std::string IterateTable::ITERATE_TABLE = "IterateTable";
30 const std::string IterateTable::PLAN_TABLE = "IterationPlanTable";
31 const std::string IterateTable::TARGET_TABLE = "IterationTargetTable";
32 
33 const std::map<std::string, std::string> IterateTable::commandToTableMap_ =
35 
36 IterateTable::PlanTableColumns IterateTable::planTableCols_;
37 IterateTable::IterateTableColumns IterateTable::iterateTableCols_;
38 
39 IterateTable::CommandBeginLabelParams IterateTable::commandBeginLabelParams_;
40 IterateTable::CommandConfigureActiveParams IterateTable::commandConfigureActiveParams_;
41 IterateTable::CommandConfigureAliasParams IterateTable::commandConfigureAliasParams_;
42 IterateTable::CommandConfigureGroupParams IterateTable::commandConfigureGroupParams_;
43 IterateTable::CommandActivateAliasParams IterateTable::commandActivateAliasParams_;
44 IterateTable::CommandActivateGroupParams IterateTable::commandActivateGroupParams_;
45 IterateTable::CommandExecuteMacroParams IterateTable::commandExecuteMacroParams_;
46 IterateTable::CommandModifyActiveParams IterateTable::commandModifyActiveParams_;
47 IterateTable::CommandRepeatLabelParams IterateTable::commandRepeatLabelParams_;
48 IterateTable::CommandRunParams IterateTable::commandRunParams_;
49 IterateTable::CommandChooseFSMParams IterateTable::commandChooseFSMParams_;
50 
51 IterateTable::TargetParams IterateTable::targetParams_;
52 IterateTable::TargetTableColumns IterateTable::targetCols_;
53 IterateTable::CommandTargetColumns IterateTable::commandTargetCols_;
54 
55 IterateTable::MacroDimLoopTableColumns IterateTable::macroDimLoopCols_;
56 IterateTable::MacroParamTableColumns IterateTable::macroParamCols_;
57 
58 //==============================================================================
59 IterateTable::IterateTable(void) : TableBase(IterateTable::ITERATE_TABLE) {}
60 
61 //==============================================================================
62 IterateTable::~IterateTable(void) {}
63 
64 //==============================================================================
65 void IterateTable::init(ConfigurationManager* /*configManager*/)
66 {
67  // do something to validate or refactor table
68  // __COUT__ << "*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*" << std::endl;
69  // __COUT__ << configManager->__SELF_NODE__ << std::endl;
70 
71  /*
72  std::string value;
73  auto childrenMap = configManager->__SELF_NODE__.getChildren();
74  for(auto& childPair : childrenMap)
75  {
76  // do something for each row in table
77  //__COUT__ << childPair.first << std::endl;
78  // __COUT__ << childPair.second.getNode(colNames_.colColumnName_) <<
79  // std::endl; childPair.second.getNode(colNames_.colColumnName_
80  // ).getValue(value);
81  }
82  */
83 }
84 
85 //==============================================================================
86 std::vector<IterateTable::Command> IterateTable::getPlanCommands(
87  ConfigurationManager* configManager, const std::string& plan) const
88 {
89  __COUT__ << configManager->__SELF_NODE__ << std::endl;
90 
91  ConfigurationTree planNode = configManager->__SELF_NODE__.getNode(plan);
92 
93  if(!planNode.getNode(IterateTable::planTableCols_.Status_).getValue<bool>())
94  {
95  __SS__ << "Error! Attempt to access disabled plan (Status=FALSE)." << std::endl;
96  __COUT_ERR__ << ss.str();
97  __SS_THROW__;
98  }
99 
100  std::vector<IterateTable::Command> commands;
101 
102  auto commandChildren =
103  planNode.getNode(IterateTable::iterateTableCols_.PlanLink_).getChildren();
104 
105  for(auto& commandChild : commandChildren)
106  {
107  __COUT__ << "Command \t" << commandChild.first << std::endl;
108 
109  __COUT__ << "\t\tStatus \t"
110  << commandChild.second.getNode(IterateTable::planTableCols_.Status_)
111  << std::endl;
112 
113  __COUT__ << "\t\tType \t"
114  << commandChild.second.getNode(IterateTable::planTableCols_.CommandType_)
115  << std::endl;
116 
117  if(!commandChild.second.getNode(IterateTable::planTableCols_.Status_)
118  .getValue<bool>())
119  continue; // skip disabled commands
120 
121  commands.push_back(IterateTable::Command());
122  commands.back().type_ =
123  commandChild.second.getNode(IterateTable::planTableCols_.CommandType_)
124  .getValue<std::string>();
125 
126  if(commandChild.second.getNode(IterateTable::planTableCols_.CommandLink_)
127  .isDisconnected())
128  continue; // skip if no command parameters
129 
130  auto commandSpecificFields =
131  commandChild.second.getNode(IterateTable::planTableCols_.CommandLink_)
132  .getChildren();
133 
134  for(unsigned int i = 0; i < commandSpecificFields.size() - 3;
135  ++i) // ignore last three columns
136  {
137  // NOTE -- that links turn into one field with value LinkID/GroupID unless
138  // specially handled
139 
140  __COUT__ << "\t\tParameter \t" << commandSpecificFields[i].first << " = \t"
141  << commandSpecificFields[i].second << std::endl;
142 
143  if(commandSpecificFields[i].first ==
144  IterateTable::commandTargetCols_.TargetsLink_)
145  {
146  __COUT__ << "Extracting targets..." << __E__;
147  auto targets = commandSpecificFields[i].second.getChildren();
148 
149  __COUTV__(targets.size());
150 
151  for(auto& target : targets)
152  {
153  __COUT__ << "\t\t\tTarget \t" << target.first << __E__;
154 
155  ConfigurationTree targetNode =
156  target.second.getNode(IterateTable::targetCols_.TargetLink_);
157  if(targetNode.isDisconnected())
158  {
159  __COUT_ERR__ << "Disconnected target!?" << __E__;
160  continue;
161  }
162 
163  __COUT__ << "\t\t = \t"
164  << "Table:" << targetNode.getTableName()
165  << " UID:" << targetNode.getUIDAsString() << std::endl;
166  commands.back().addTarget();
167  commands.back().targets_.back().table_ = targetNode.getTableName();
168  commands.back().targets_.back().UID_ = targetNode.getUIDAsString();
169  }
170  }
171  else if(commandSpecificFields[i].first == // treat FE and Macro the same
172  IterateTable::commandExecuteMacroParams_.MacroParameterLink_)
173  {
174  // get Macro parameters, place them in params_
175  __COUT__ << "Extracting macro parameters..." << __E__;
176 
177  // need to extract input arguments
178  // by dimension (by priority)
179  //
180  // two vector by dimension <map of params>
181  // one vector for long and for double
182  //
183  // map of params :=
184  // name => {
185  // <long/double current value>
186  // <long/double init value>
187  // <long/double step size>
188  // }
189 
190  auto dimensionalLoops = commandSpecificFields[i].second.getChildren(
191  std::map<std::string /*relative-path*/,
192  std::string /*value*/>() /*no filter*/,
193  true /*by Priority*/);
194 
195  __COUTV__(dimensionalLoops.size());
196 
197  // inputs:
198  // - inputArgs: dimensional semi-colon-separated,
199  // comma separated: dimension iterations and arguments
200  //(colon-separated name/value/stepsize sets)
201  std::string argStr = "";
202  // inputArgsStr = "3;3,myOtherArg:5:2"; //example
203 
204  // std::string name, value;
205  unsigned long numberOfIterations;
206  bool firstDimension = true;
207 
208  for(auto& dimensionalLoop : dimensionalLoops)
209  {
210  __COUT__ << "\t\t\tDimensionalLoop \t" << dimensionalLoop.first
211  << __E__;
212 
213  numberOfIterations =
214  dimensionalLoop.second
215  .getNode(IterateTable::macroDimLoopCols_.NumberOfIterations_)
216  .getValue<unsigned long>();
217 
218  __COUTV__(numberOfIterations);
219 
220  if(numberOfIterations == 0)
221  {
222  __SS__ << "Illegal number of iterations value of '"
223  << numberOfIterations << ".' Must be a positive integer!"
224  << __E__;
225  __SS_THROW__;
226  }
227 
228  // at this point add dimension parameter with value numberOfIterations
229 
230  if(!firstDimension)
231  argStr += ";";
232  firstDimension = false;
233  argStr += std::to_string(numberOfIterations);
234 
235  auto paramLinkNode = dimensionalLoop.second.getNode(
236  IterateTable::macroDimLoopCols_.ParamLink_);
237 
238  if(paramLinkNode.isDisconnected())
239  {
240  __COUT__ << "Disconnected parameter link, so no parameters for "
241  "this dimension."
242  << __E__;
243  continue;
244  }
245 
246  auto macroParams = paramLinkNode.getChildren();
247 
248  __COUTV__(macroParams.size());
249 
250  for(auto& macroParam : macroParams)
251  {
252  __COUT__ << "\t\t\tParam \t" << macroParam.first << __E__;
253 
254  // add parameter name:value:step
255 
256  argStr += ",";
257  argStr +=
258  macroParam.second.getNode(IterateTable::macroParamCols_.Name_)
259  .getValue<std::string>();
260  argStr += ":";
261  argStr += macroParam.second
262  .getNode(IterateTable::macroParamCols_.Value_)
263  .getValue<std::string>();
264  argStr += ":";
265  argStr +=
266  macroParam.second.getNode(IterateTable::macroParamCols_.Step_)
267  .getValue<std::string>();
268 
269  } // end parameter loop
270  } // end dimension loop
271 
272  // Macro argument string is done
273  __COUTV__(argStr);
274 
275  // assume no conflict with fixed parameters in map
276  // because of prepend
277  // IterateTable::commandExecuteMacroParams_.MacroParameterPrepend_
278  //+
279  commands.back().params_.emplace(
280  std::pair<std::string /*param name*/, std::string /*param value*/>(
281  IterateTable::commandExecuteMacroParams_.MacroArgumentString_,
282  argStr));
283  }
284  else // all other non-special fields
285  {
286  if( // bool type, convert to 1 or 0
287  commandSpecificFields[i].second.isValueBoolType())
288  commands.back().params_.emplace(
289  std::pair<std::string /*param name*/,
290  std::string /*param value*/>(
291  commandSpecificFields[i].first,
292  commandSpecificFields[i].second.getValue<bool>() ? "1"
293  : "0"));
294  else if( // number data type, get raw value string (note: does not do
295  // math or variable substitution)
296  commandSpecificFields[i].second.isValueNumberDataType())
297  commands.back().params_.emplace(
298  std::pair<std::string /*param name*/,
299  std::string /*param value*/>(
300  commandSpecificFields[i].first,
301  commandSpecificFields[i].second.getValueAsString()));
302  else
303  commands.back().params_.emplace(
304  std::pair<std::string /*param name*/,
305  std::string /*param value*/>(
306  commandSpecificFields[i].first,
307  commandSpecificFields[i].second.getValue<std::string>()));
308  }
309  }
310  }
311 
312  return commands;
313 }
ConfigurationTree getNode(const std::string &nodeString, bool doNotThrowOnBrokenUIDLinks=false) const
"root/parent/parent/"
bool isDisconnected(void) const
ConfigurationTree getNode(const std::string &nodeName, bool doNotThrowOnBrokenUIDLinks=false) const
navigating between nodes
const std::string & getTableName(void) const
getTableName
void getValue(T &value) const
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
const std::string & getUIDAsString(void) const
void init(ConfigurationManager *configManager)
Methods.
static std::map< std::string, std::string > createCommandToTableMap()
Definition: IterateTable.h:59
static const std::string COMMAND_BEGIN_LABEL
Definition: IterateTable.h:36
for macro dimensional loop parameters
Definition: IterateTable.h:165