1 #include "otsdaq-core/ConfigurationInterface/ConfigurationManager.h"
2 #include "otsdaq-core/Macros/TablePluginMacros.h"
3 #include "otsdaq-core/TablePlugins/IterateTable.h"
12 const std::string IterateTable::COMMAND_BEGIN_LABEL =
"BEGIN_LABEL";
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_EXECUTE_FE_MACRO =
"EXECUTE_FE_MACRO";
18 const std::string IterateTable::COMMAND_EXECUTE_MACRO =
"EXECUTE_MACRO";
19 const std::string IterateTable::COMMAND_MODIFY_ACTIVE_GROUP =
"MODIFY_ACTIVE_GROUP";
20 const std::string IterateTable::COMMAND_REPEAT_LABEL =
"REPEAT_LABEL";
21 const std::string IterateTable::COMMAND_RUN =
"RUN";
23 const std::string IterateTable::ITERATE_TABLE =
"IterateTable";
24 const std::string IterateTable::PLAN_TABLE =
"IterationPlanTable";
25 const std::string IterateTable::TARGET_TABLE =
"IterationTargetTable";
27 const std::map<std::string, std::string> IterateTable::commandToTableMap_ =
28 IterateTable::createCommandToTableMap();
54 IterateTable::~IterateTable(
void) {}
64 auto childrenMap = configManager->__SELF_NODE__.getChildren();
65 for(
auto& childPair : childrenMap)
76 std::vector<IterateTable::Command> IterateTable::getPlanCommands(
79 __COUT__ << configManager->__SELF_NODE__ << std::endl;
83 if(!planNode.getNode(IterateTable::planTableCols_.Status_).getValue<
bool>())
85 __SS__ <<
"Error! Attempt to access disabled plan (Status=FALSE)." << std::endl;
86 __COUT_ERR__ << ss.str();
90 std::vector<IterateTable::Command> commands;
92 auto commandChildren =
93 planNode.getNode(IterateTable::iterateTableCols_.PlanLink_).getChildren();
95 for(
auto& commandChild : commandChildren)
97 __COUT__ <<
"Command \t" << commandChild.first << std::endl;
99 __COUT__ <<
"\t\tStatus \t"
100 << commandChild.second.getNode(IterateTable::planTableCols_.Status_)
103 __COUT__ <<
"\t\tType \t"
104 << commandChild.second.getNode(IterateTable::planTableCols_.CommandType_)
107 if(!commandChild.second.getNode(IterateTable::planTableCols_.Status_)
112 commands.back().type_ =
113 commandChild.second.getNode(IterateTable::planTableCols_.CommandType_)
114 .getValue<std::string>();
116 if(commandChild.second.getNode(IterateTable::planTableCols_.CommandLink_)
120 auto commandSpecificFields =
121 commandChild.second.getNode(IterateTable::planTableCols_.CommandLink_)
124 for(
unsigned int i = 0; i < commandSpecificFields.size() - 3;
130 __COUT__ <<
"\t\tParameter \t" << commandSpecificFields[i].first <<
" = \t"
131 << commandSpecificFields[i].second << std::endl;
133 if(commandSpecificFields[i].first ==
134 IterateTable::commandTargetCols_.TargetsLink_)
136 __COUT__ <<
"Extracting targets..." << __E__;
137 auto targets = commandSpecificFields[i].second.getChildren();
139 __COUTV__(targets.size());
141 for(
auto& target : targets)
143 __COUT__ <<
"\t\t\tTarget \t" << target.first << __E__;
146 target.second.getNode(IterateTable::targetCols_.TargetLink_);
147 if(targetNode.isDisconnected())
149 __COUT_ERR__ <<
"Disconnected target!?" << __E__;
153 __COUT__ <<
"\t\t = \t"
154 <<
"Table:" << targetNode.getTableName()
155 <<
" UID:" << targetNode.getUIDAsString() << std::endl;
156 commands.back().addTarget();
157 commands.back().targets_.back().table_ = targetNode.getTableName();
158 commands.back().targets_.back().UID_ = targetNode.getUIDAsString();
161 else if(commandSpecificFields[i].first ==
162 IterateTable::commandExecuteMacroParams_.MacroParameterLink_)
165 __COUT__ <<
"Extracting macro parameters..." << __E__;
180 auto dimensionalLoops = commandSpecificFields[i].second.getChildren(
181 std::map<std::string ,
185 __COUTV__(dimensionalLoops.size());
191 std::string argStr =
"";
195 unsigned long numberOfIterations;
196 bool firstDimension =
true;
198 for(
auto& dimensionalLoop : dimensionalLoops)
200 __COUT__ <<
"\t\t\tDimensionalLoop \t" << dimensionalLoop.first
204 dimensionalLoop.second
205 .getNode(IterateTable::macroDimLoopCols_.NumberOfIterations_)
206 .getValue<
unsigned long>();
208 __COUTV__(numberOfIterations);
210 if(numberOfIterations == 0)
212 __SS__ <<
"Illegal number of iterations value of '"
213 << numberOfIterations <<
".' Must be a positive integer!"
222 firstDimension =
false;
223 argStr += std::to_string(numberOfIterations);
225 auto paramLinkNode = dimensionalLoop.second.getNode(
226 IterateTable::macroDimLoopCols_.ParamLink_);
228 if(paramLinkNode.isDisconnected())
230 __COUT__ <<
"Disconnected parameter link, so no parameters for "
236 auto macroParams = paramLinkNode.getChildren();
238 __COUTV__(macroParams.size());
240 for(
auto& macroParam : macroParams)
242 __COUT__ <<
"\t\t\tParam \t" << macroParam.first << __E__;
248 macroParam.second.getNode(IterateTable::macroParamCols_.Name_)
249 .getValue<std::string>();
251 argStr += macroParam.second
252 .getNode(IterateTable::macroParamCols_.Value_)
253 .getValue<std::string>();
256 macroParam.second.getNode(IterateTable::macroParamCols_.Step_)
257 .getValue<std::string>();
269 commands.back().params_.emplace(
270 std::pair<std::string /*param name*/, std::string /*param value*/>(
271 IterateTable::commandExecuteMacroParams_.MacroArgumentString_,
277 commandSpecificFields[i].second.isValueBoolType())
278 commands.back().params_.emplace(
279 std::pair<std::string ,
281 commandSpecificFields[i].first,
282 commandSpecificFields[i].second.getValue<
bool>() ?
"1"
286 commandSpecificFields[i].second.isValueNumberDataType())
287 commands.back().params_.emplace(
288 std::pair<std::string ,
290 commandSpecificFields[i].first,
291 commandSpecificFields[i].second.getValueAsString()));
293 commands.back().params_.emplace(
294 std::pair<std::string ,
296 commandSpecificFields[i].first,
297 commandSpecificFields[i].second.getValue<std::string>()));