1 #include "otsdaq/ConfigurationInterface/ConfigurationManager.h"
2 #include "otsdaq/Macros/StringMacros.h"
3 #include "otsdaq/TablePlugins/IterateTable.h"
13 const std::string IterateTable::COMMAND_CHOOSE_FSM =
"CHOOSE_FSM";
14 const std::string IterateTable::COMMAND_CONFIGURE_ACTIVE_GROUP =
"CONFIGURE_ACTIVE_GROUP";
15 const std::string IterateTable::COMMAND_CONFIGURE_ALIAS =
"CONFIGURE_ALIAS";
16 const std::string IterateTable::COMMAND_CONFIGURE_GROUP =
"CONFIGURE_GROUP";
17 const std::string IterateTable::COMMAND_ACTIVATE_ALIAS =
"ACTIVATE_ALIAS";
18 const std::string IterateTable::COMMAND_ACTIVATE_GROUP =
"ACTIVATE_GROUP";
19 const std::string IterateTable::COMMAND_EXECUTE_FE_MACRO =
"EXECUTE_FE_MACRO";
20 const std::string IterateTable::COMMAND_EXECUTE_MM_MACRO =
"EXECUTE_MM_MACRO";
21 const std::string IterateTable::COMMAND_MODIFY_ACTIVE_GROUP =
"MODIFY_ACTIVE_GROUP";
22 const std::string IterateTable::COMMAND_REPEAT_LABEL =
"REPEAT_LABEL";
23 const std::string IterateTable::COMMAND_RUN =
"RUN";
24 const std::string IterateTable::COMMAND_WAIT =
"WAIT";
25 const std::string IterateTable::COMMAND_START =
"START";
26 const std::string IterateTable::COMMAND_STOP =
"STOP";
27 const std::string IterateTable::COMMAND_PAUSE =
"PAUSE";
28 const std::string IterateTable::COMMAND_RESUME =
"RESUME";
29 const std::string IterateTable::COMMAND_HALT =
"HALT";
31 const std::string IterateTable::ITERATE_TABLE =
"IterateTable";
32 const std::string IterateTable::PLAN_TABLE =
"IterationPlanTable";
33 const std::string IterateTable::TARGET_TABLE =
"IterationTargetTable";
34 const std::string IterateTable::MACRO_DIM_LOOP_TABLE =
35 "IterationCommandMacroDimensionalLoopTable";
36 const std::string IterateTable::MACRO_DIM_LOOP_PARAM_TABLE =
37 "IterationCommandMacroDimensionalLoopParameterTable";
39 const std::map<std::string, std::string> IterateTable::commandToTableMap_ =
73 IterateTable::~IterateTable(
void) {}
97 std::vector<IterateTable::Command> IterateTable::getPlanCommands(
100 __COUT__ << configManager->__SELF_NODE__ << std::endl;
104 if(!planNode.
getNode(IterateTable::planTableCols_.Status_).
getValue<
bool>())
106 __SS__ <<
"Error! Attempt to access disabled plan (Status=FALSE)." << std::endl;
107 __COUT_ERR__ << ss.str();
111 std::vector<IterateTable::Command> commands;
113 auto commandChildren =
116 for(
auto& commandChild : commandChildren)
118 __COUT__ <<
"Command \t" << commandChild.first << std::endl;
120 __COUT__ <<
"\t\tStatus \t"
121 << commandChild.second.getNode(IterateTable::planTableCols_.Status_)
124 __COUT__ <<
"\t\tType \t"
125 << commandChild.second.getNode(IterateTable::planTableCols_.CommandType_)
128 if(!commandChild.second.getNode(IterateTable::planTableCols_.Status_)
133 commands.back().type_ =
134 commandChild.second.getNode(IterateTable::planTableCols_.CommandType_)
135 .getValue<std::string>();
141 commands.back().targetSubsystem_ =
142 commandChild.second.getNode(IterateTable::planTableCols_.TargetSubsystem_)
143 .getValueWithDefault<std::string>(
"");
147 commands.back().targetSubsystem_ =
"";
150 if(commandChild.second.getNode(IterateTable::planTableCols_.CommandLink_)
154 auto commandSpecificFields =
155 commandChild.second.getNode(IterateTable::planTableCols_.CommandLink_)
158 for(
unsigned int i = 0; i < commandSpecificFields.size() - 3;
164 __COUT__ <<
"\t\tParameter \t" << commandSpecificFields[i].first <<
" = \t"
165 << commandSpecificFields[i].second << std::endl;
167 if(commandSpecificFields[i].first ==
168 IterateTable::commandTargetCols_.TargetsLink_)
170 __COUT__ <<
"Extracting targets..." << __E__;
171 auto targets = commandSpecificFields[i].second.getChildren();
173 __COUTV__(targets.size());
175 for(
auto& target : targets)
177 __COUT__ <<
"\t\t\tTarget \t" << target.first << __E__;
180 target.second.
getNode(IterateTable::targetCols_.TargetLink_);
187 if(commands.back().targetSubsystem_ ==
"")
189 <<
"Disconnected target '"
192 << commandChild.first
193 <<
" (no such record in the active configuration); "
194 "keeping it, but a local macro will fail on it."
201 <<
" (not in local configuration; resolved on remote "
203 << commands.back().targetSubsystem_ <<
"')" << __E__;
205 commands.back().addTarget();
206 commands.back().targets_.back().table_ =
208 commands.back().targets_.back().UID_ =
213 __COUT__ <<
"\t\t = \t"
216 commands.back().addTarget();
217 commands.back().targets_.back().table_ = targetNode.
getTableName();
218 commands.back().targets_.back().UID_ = targetNode.
getUIDAsString();
221 else if(commandSpecificFields[i].first ==
222 IterateTable::commandExecuteMacroParams_.MacroParameterLink_)
225 __COUT__ <<
"Extracting macro parameters..." << __E__;
240 auto dimensionalLoops = commandSpecificFields[i].second.getChildren(
241 std::map<std::string ,
245 __COUTV__(dimensionalLoops.size());
251 std::string argStr =
"";
255 std::string labelsStr =
"";
258 unsigned long numberOfIterations;
259 bool firstDimension =
true;
261 for(
auto& dimensionalLoop : dimensionalLoops)
263 __COUT__ <<
"\t\t\tDimensionalLoop \t" << dimensionalLoop.first
267 dimensionalLoop.second
268 .getNode(IterateTable::macroDimLoopCols_.NumberOfIterations_)
269 .getValue<
unsigned long>();
271 __COUTV__(numberOfIterations);
273 if(numberOfIterations == 0)
275 __SS__ <<
"Illegal number of iterations value of '"
276 << numberOfIterations <<
".' Must be a positive integer!"
281 std::string stepLabel =
"";
287 dimensionalLoop.second
288 .getNode(IterateTable::macroDimLoopCols_.StepLabel_)
289 .getValueWithDefault<std::string>(
"");
302 firstDimension =
false;
303 argStr += std::to_string(numberOfIterations);
304 labelsStr += stepLabel;
306 auto paramLinkNode = dimensionalLoop.second.getNode(
307 IterateTable::macroDimLoopCols_.ParamLink_);
309 if(paramLinkNode.isDisconnected())
311 __COUT__ <<
"Disconnected parameter link, so no parameters for "
317 auto macroParams = paramLinkNode.getChildren();
319 __COUTV__(macroParams.size());
321 for(
auto& macroParam : macroParams)
323 __COUT__ <<
"\t\t\tParam \t" << macroParam.first << __E__;
328 argStr += StringMacros::encodeURIComponent(
329 macroParam.second.getNode(IterateTable::macroParamCols_.Name_)
330 .getValue<std::string>());
332 argStr += StringMacros::encodeURIComponent(
334 .getNode(IterateTable::macroParamCols_.Value_)
335 .getValue<std::string>());
337 argStr += StringMacros::encodeURIComponent(
338 macroParam.second.getNode(IterateTable::macroParamCols_.Step_)
339 .getValue<std::string>());
351 commands.back().params_.emplace(
352 std::pair<std::string /*param name*/, std::string /*param value*/>(
353 IterateTable::commandExecuteMacroParams_.MacroArgumentString_,
355 commands.back().params_.emplace(
356 std::pair<std::string /*param name*/, std::string /*param value*/>(
357 IterateTable::commandExecuteMacroParams_.MacroArgumentLabels_,
363 commandSpecificFields[i].second.isValueBoolType())
364 commands.back().params_.emplace(
365 std::pair<std::string ,
367 commandSpecificFields[i].first,
368 commandSpecificFields[i].second.getValue<
bool>() ?
"1"
372 commandSpecificFields[i].second.isValueNumberDataType())
373 commands.back().params_.emplace(
374 std::pair<std::string ,
376 commandSpecificFields[i].first,
377 commandSpecificFields[i].second.getValueAsString()));
379 commands.back().params_.emplace(
380 std::pair<std::string ,
382 commandSpecificFields[i].first,
383 commandSpecificFields[i].second.getValue<std::string>()));
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
const std::string & getDisconnectedTableName(void) const
getDisconnectedTableName
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
const std::string & getDisconnectedLinkID(void) const
getDisconnectedLinkID
void init(ConfigurationManager *configManager)
Methods.
static std::map< std::string, std::string > createCommandToTableMap()
static const std::string COMMAND_BEGIN_LABEL
defines used also by OtsConfigurationWizardSupervisor
< treat FE and Macro the same
for macro dimensional loop parameters