1 #include "otsdaq/ConfigurationInterface/ConfigurationManager.h"
2 #include "otsdaq/TablePlugins/IterateTable.h"
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";
30 const std::string IterateTable::ITERATE_TABLE =
"IterateTable";
31 const std::string IterateTable::PLAN_TABLE =
"IterationPlanTable";
32 const std::string IterateTable::TARGET_TABLE =
"IterationTargetTable";
34 const std::map<std::string, std::string> IterateTable::commandToTableMap_ =
68 IterateTable::~IterateTable(
void) {}
92 std::vector<IterateTable::Command> IterateTable::getPlanCommands(
95 __COUT__ << configManager->__SELF_NODE__ << std::endl;
99 if(!planNode.
getNode(IterateTable::planTableCols_.Status_).
getValue<
bool>())
101 __SS__ <<
"Error! Attempt to access disabled plan (Status=FALSE)." << std::endl;
102 __COUT_ERR__ << ss.str();
106 std::vector<IterateTable::Command> commands;
108 auto commandChildren =
111 for(
auto& commandChild : commandChildren)
113 __COUT__ <<
"Command \t" << commandChild.first << std::endl;
115 __COUT__ <<
"\t\tStatus \t"
116 << commandChild.second.getNode(IterateTable::planTableCols_.Status_)
119 __COUT__ <<
"\t\tType \t"
120 << commandChild.second.getNode(IterateTable::planTableCols_.CommandType_)
123 if(!commandChild.second.getNode(IterateTable::planTableCols_.Status_)
128 commands.back().type_ =
129 commandChild.second.getNode(IterateTable::planTableCols_.CommandType_)
130 .getValue<std::string>();
132 if(commandChild.second.getNode(IterateTable::planTableCols_.CommandLink_)
136 auto commandSpecificFields =
137 commandChild.second.getNode(IterateTable::planTableCols_.CommandLink_)
140 for(
unsigned int i = 0; i < commandSpecificFields.size() - 3;
146 __COUT__ <<
"\t\tParameter \t" << commandSpecificFields[i].first <<
" = \t"
147 << commandSpecificFields[i].second << std::endl;
149 if(commandSpecificFields[i].first ==
150 IterateTable::commandTargetCols_.TargetsLink_)
152 __COUT__ <<
"Extracting targets..." << __E__;
153 auto targets = commandSpecificFields[i].second.getChildren();
155 __COUTV__(targets.size());
157 for(
auto& target : targets)
159 __COUT__ <<
"\t\t\tTarget \t" << target.first << __E__;
162 target.second.
getNode(IterateTable::targetCols_.TargetLink_);
165 __COUT_ERR__ <<
"Disconnected target!?" << __E__;
169 __COUT__ <<
"\t\t = \t"
172 commands.back().addTarget();
173 commands.back().targets_.back().table_ = targetNode.
getTableName();
174 commands.back().targets_.back().UID_ = targetNode.
getUIDAsString();
177 else if(commandSpecificFields[i].first ==
178 IterateTable::commandExecuteMacroParams_.MacroParameterLink_)
181 __COUT__ <<
"Extracting macro parameters..." << __E__;
196 auto dimensionalLoops = commandSpecificFields[i].second.getChildren(
197 std::map<std::string ,
201 __COUTV__(dimensionalLoops.size());
207 std::string argStr =
"";
211 unsigned long numberOfIterations;
212 bool firstDimension =
true;
214 for(
auto& dimensionalLoop : dimensionalLoops)
216 __COUT__ <<
"\t\t\tDimensionalLoop \t" << dimensionalLoop.first
220 dimensionalLoop.second
221 .getNode(IterateTable::macroDimLoopCols_.NumberOfIterations_)
222 .getValue<
unsigned long>();
224 __COUTV__(numberOfIterations);
226 if(numberOfIterations == 0)
228 __SS__ <<
"Illegal number of iterations value of '"
229 << numberOfIterations <<
".' Must be a positive integer!"
238 firstDimension =
false;
239 argStr += std::to_string(numberOfIterations);
241 auto paramLinkNode = dimensionalLoop.second.getNode(
242 IterateTable::macroDimLoopCols_.ParamLink_);
244 if(paramLinkNode.isDisconnected())
246 __COUT__ <<
"Disconnected parameter link, so no parameters for "
252 auto macroParams = paramLinkNode.getChildren();
254 __COUTV__(macroParams.size());
256 for(
auto& macroParam : macroParams)
258 __COUT__ <<
"\t\t\tParam \t" << macroParam.first << __E__;
264 macroParam.second.getNode(IterateTable::macroParamCols_.Name_)
265 .getValue<std::string>();
267 argStr += macroParam.second
268 .getNode(IterateTable::macroParamCols_.Value_)
269 .getValue<std::string>();
272 macroParam.second.getNode(IterateTable::macroParamCols_.Step_)
273 .getValue<std::string>();
285 commands.back().params_.emplace(
286 std::pair<std::string /*param name*/, std::string /*param value*/>(
287 IterateTable::commandExecuteMacroParams_.MacroArgumentString_,
293 commandSpecificFields[i].second.isValueBoolType())
294 commands.back().params_.emplace(
295 std::pair<std::string ,
297 commandSpecificFields[i].first,
298 commandSpecificFields[i].second.getValue<
bool>() ?
"1"
302 commandSpecificFields[i].second.isValueNumberDataType())
303 commands.back().params_.emplace(
304 std::pair<std::string ,
306 commandSpecificFields[i].first,
307 commandSpecificFields[i].second.getValueAsString()));
309 commands.back().params_.emplace(
310 std::pair<std::string ,
312 commandSpecificFields[i].first,
313 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
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()
static const std::string COMMAND_BEGIN_LABEL
< treat FE and Macro the same
for macro dimensional loop parameters