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