$treeview $search $mathjax $extrastylesheet
otsdaq
v2_03_00
$projectbrief
|
$projectbrief
|
$searchbox |
00001 #include "otsdaq-core/ConfigurationInterface/ConfigurationManager.h" 00002 #include "otsdaq-core/Macros/TablePluginMacros.h" 00003 #include "otsdaq-core/TablePluginDataFormats/IterateTable.h" 00004 00005 #include <iostream> 00006 #include <string> 00007 00008 using namespace ots; 00009 00010 // instantiate static members 00011 00012 const std::string IterateTable::COMMAND_BEGIN_LABEL = "BEGIN_LABEL"; 00013 const std::string IterateTable::COMMAND_CHOOSE_FSM = "CHOOSE_FSM"; 00014 const std::string IterateTable::COMMAND_CONFIGURE_ACTIVE_GROUP = "CONFIGURE_ACTIVE_GROUP"; 00015 const std::string IterateTable::COMMAND_CONFIGURE_ALIAS = "CONFIGURE_ALIAS"; 00016 const std::string IterateTable::COMMAND_CONFIGURE_GROUP = "CONFIGURE_GROUP"; 00017 const std::string IterateTable::COMMAND_EXECUTE_FE_MACRO = "EXECUTE_FE_MACRO"; 00018 const std::string IterateTable::COMMAND_EXECUTE_MACRO = "EXECUTE_MACRO"; 00019 const std::string IterateTable::COMMAND_MODIFY_ACTIVE_GROUP = "MODIFY_ACTIVE_GROUP"; 00020 const std::string IterateTable::COMMAND_REPEAT_LABEL = "REPEAT_LABEL"; 00021 const std::string IterateTable::COMMAND_RUN = "RUN"; 00022 00023 const std::string IterateTable::ITERATE_TABLE = "IterateTable"; 00024 const std::string IterateTable::PLAN_TABLE = "IterationPlanTable"; 00025 const std::string IterateTable::TARGET_TABLE = "IterationTargetTable"; 00026 00027 const std::map<std::string, std::string> IterateTable::commandToTableMap_ = 00028 IterateTable::createCommandToTableMap(); 00029 00030 IterateTable::PlanTableColumns IterateTable::planTableCols_; 00031 IterateTable::IterateTableColumns IterateTable::iterateTableCols_; 00032 00033 IterateTable::CommandBeginLabelParams IterateTable::commandBeginLabelParams_; 00034 IterateTable::CommandConfigureActiveParams IterateTable::commandConfigureActiveParams_; 00035 IterateTable::CommandConfigureAliasParams IterateTable::commandConfigureAliasParams_; 00036 IterateTable::CommandConfigureGroupParams IterateTable::commandConfigureGroupParams_; 00037 IterateTable::CommandExecuteMacroParams IterateTable::commandExecuteMacroParams_; 00038 IterateTable::CommandModifyActiveParams IterateTable::commandModifyActiveParams_; 00039 IterateTable::CommandRepeatLabelParams IterateTable::commandRepeatLabelParams_; 00040 IterateTable::CommandRunParams IterateTable::commandRunParams_; 00041 IterateTable::CommandChooseFSMParams IterateTable::commandChooseFSMParams_; 00042 00043 IterateTable::TargetParams IterateTable::targetParams_; 00044 IterateTable::TargetTableColumns IterateTable::targetCols_; 00045 IterateTable::CommandTargetColumns IterateTable::commandTargetCols_; 00046 00047 IterateTable::MacroDimLoopTableColumns IterateTable::macroDimLoopCols_; 00048 IterateTable::MacroParamTableColumns IterateTable::macroParamCols_; 00049 00050 //============================================================================== 00051 IterateTable::IterateTable(void) : TableBase(IterateTable::ITERATE_TABLE) {} 00052 00053 //============================================================================== 00054 IterateTable::~IterateTable(void) {} 00055 00056 //============================================================================== 00057 void IterateTable::init(ConfigurationManager* configManager) 00058 { 00059 // do something to validate or refactor table 00060 // __COUT__ << "*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*" << std::endl; 00061 // __COUT__ << configManager->__SELF_NODE__ << std::endl; 00062 00063 std::string value; 00064 auto childrenMap = configManager->__SELF_NODE__.getChildren(); 00065 for(auto& childPair : childrenMap) 00066 { 00067 // do something for each row in table 00068 //__COUT__ << childPair.first << std::endl; 00069 // __COUT__ << childPair.second.getNode(colNames_.colColumnName_) << 00070 // std::endl; childPair.second.getNode(colNames_.colColumnName_ 00071 // ).getValue(value); 00072 } 00073 } 00074 00075 //============================================================================== 00076 std::vector<IterateTable::Command> IterateTable::getPlanCommands( 00077 ConfigurationManager* configManager, const std::string& plan) const 00078 { 00079 __COUT__ << configManager->__SELF_NODE__ << std::endl; 00080 00081 ConfigurationTree planNode = configManager->__SELF_NODE__.getNode(plan); 00082 00083 if(!planNode.getNode(IterateTable::planTableCols_.Status_).getValue<bool>()) 00084 { 00085 __SS__ << "Error! Attempt to access disabled plan (Status=FALSE)." << std::endl; 00086 __COUT_ERR__ << ss.str(); 00087 __SS_THROW__; 00088 } 00089 00090 std::vector<IterateTable::Command> commands; 00091 00092 auto commandChildren = 00093 planNode.getNode(IterateTable::iterateTableCols_.PlanLink_).getChildren(); 00094 00095 for(auto& commandChild : commandChildren) 00096 { 00097 __COUT__ << "Command \t" << commandChild.first << std::endl; 00098 00099 __COUT__ << "\t\tStatus \t" 00100 << commandChild.second.getNode(IterateTable::planTableCols_.Status_) 00101 << std::endl; 00102 00103 __COUT__ << "\t\tType \t" 00104 << commandChild.second.getNode(IterateTable::planTableCols_.CommandType_) 00105 << std::endl; 00106 00107 if(!commandChild.second.getNode(IterateTable::planTableCols_.Status_) 00108 .getValue<bool>()) 00109 continue; // skip disabled commands 00110 00111 commands.push_back(IterateTable::Command()); 00112 commands.back().type_ = 00113 commandChild.second.getNode(IterateTable::planTableCols_.CommandType_) 00114 .getValue<std::string>(); 00115 00116 if(commandChild.second.getNode(IterateTable::planTableCols_.CommandLink_) 00117 .isDisconnected()) 00118 continue; // skip if no command parameters 00119 00120 auto commandSpecificFields = 00121 commandChild.second.getNode(IterateTable::planTableCols_.CommandLink_) 00122 .getChildren(); 00123 00124 for(unsigned int i = 0; i < commandSpecificFields.size() - 3; 00125 ++i) // ignore last three columns 00126 { 00127 // NOTE -- that links turn into one field with value LinkID/GroupID unless 00128 // specially handled 00129 00130 __COUT__ << "\t\tParameter \t" << commandSpecificFields[i].first << " = \t" 00131 << commandSpecificFields[i].second << std::endl; 00132 00133 if(commandSpecificFields[i].first == 00134 IterateTable::commandTargetCols_.TargetsLink_) 00135 { 00136 __COUT__ << "Extracting targets..." << __E__; 00137 auto targets = commandSpecificFields[i].second.getChildren(); 00138 00139 __COUTV__(targets.size()); 00140 00141 for(auto& target : targets) 00142 { 00143 __COUT__ << "\t\t\tTarget \t" << target.first << __E__; 00144 00145 ConfigurationTree targetNode = 00146 target.second.getNode(IterateTable::targetCols_.TargetLink_); 00147 if(targetNode.isDisconnected()) 00148 { 00149 __COUT_ERR__ << "Disconnected target!?" << __E__; 00150 continue; 00151 } 00152 00153 __COUT__ << "\t\t = \t" 00154 << "Table:" << targetNode.getTableName() 00155 << " UID:" << targetNode.getUIDAsString() << std::endl; 00156 commands.back().addTarget(); 00157 commands.back().targets_.back().table_ = targetNode.getTableName(); 00158 commands.back().targets_.back().UID_ = targetNode.getUIDAsString(); 00159 } 00160 } 00161 else if(commandSpecificFields[i].first == 00162 IterateTable::commandExecuteMacroParams_.MacroParameterLink_) 00163 { 00164 // get Macro parameters, place them in params_ 00165 __COUT__ << "Extracting macro parameters..." << __E__; 00166 00167 // need to extract input arguments 00168 // by dimension (by priority) 00169 // 00170 // two vector by dimension <map of params> 00171 // one vector for long and for double 00172 // 00173 // map of params := 00174 // name => { 00175 // <long/double current value> 00176 // <long/double init value> 00177 // <long/double step size> 00178 // } 00179 00180 auto dimensionalLoops = commandSpecificFields[i].second.getChildren( 00181 std::map<std::string /*relative-path*/, 00182 std::string /*value*/>() /*no filter*/, 00183 true /*by Priority*/); 00184 00185 __COUTV__(dimensionalLoops.size()); 00186 00187 // inputs: 00188 // - inputArgs: dimensional semi-colon-separated, 00189 // comma separated: dimension iterations and arguments 00190 //(colon-separated name/value/stepsize sets) 00191 std::string argStr = ""; 00192 // inputArgsStr = "3;3,myOtherArg:5:2"; //example 00193 00194 // std::string name, value; 00195 unsigned long numberOfIterations; 00196 bool firstDimension = true; 00197 00198 for(auto& dimensionalLoop : dimensionalLoops) 00199 { 00200 __COUT__ << "\t\t\tDimensionalLoop \t" << dimensionalLoop.first 00201 << __E__; 00202 00203 numberOfIterations = 00204 dimensionalLoop.second 00205 .getNode(IterateTable::macroDimLoopCols_.NumberOfIterations_) 00206 .getValue<unsigned long>(); 00207 00208 __COUTV__(numberOfIterations); 00209 00210 if(numberOfIterations == 0) 00211 { 00212 __SS__ << "Illegal number of iterations value of '" 00213 << numberOfIterations << ".' Must be a positive integer!" 00214 << __E__; 00215 __SS_THROW__; 00216 } 00217 00218 // at this point add dimension parameter with value numberOfIterations 00219 00220 if(!firstDimension) 00221 argStr += ";"; 00222 firstDimension = false; 00223 argStr += std::to_string(numberOfIterations); 00224 00225 auto paramLinkNode = dimensionalLoop.second.getNode( 00226 IterateTable::macroDimLoopCols_.ParamLink_); 00227 00228 if(paramLinkNode.isDisconnected()) 00229 { 00230 __COUT__ << "Disconnected parameter link, so no parameters for " 00231 "this dimension." 00232 << __E__; 00233 continue; 00234 } 00235 00236 auto macroParams = paramLinkNode.getChildren(); 00237 00238 __COUTV__(macroParams.size()); 00239 00240 for(auto& macroParam : macroParams) 00241 { 00242 __COUT__ << "\t\t\tParam \t" << macroParam.first << __E__; 00243 00244 // add parameter name:value:step 00245 00246 argStr += ","; 00247 argStr += 00248 macroParam.second.getNode(IterateTable::macroParamCols_.Name_) 00249 .getValue<std::string>(); 00250 argStr += ":"; 00251 argStr += macroParam.second 00252 .getNode(IterateTable::macroParamCols_.Value_) 00253 .getValue<std::string>(); 00254 argStr += ":"; 00255 argStr += 00256 macroParam.second.getNode(IterateTable::macroParamCols_.Step_) 00257 .getValue<std::string>(); 00258 00259 } // end parameter loop 00260 } // end dimension loop 00261 00262 // Macro argument string is done 00263 __COUTV__(argStr); 00264 00265 // assume no conflict with fixed parameters in map 00266 // because of prepend 00267 // IterateTable::commandExecuteMacroParams_.MacroParameterPrepend_ 00268 //+ 00269 commands.back().params_.emplace( 00270 std::pair<std::string /*param name*/, std::string /*param value*/>( 00271 IterateTable::commandExecuteMacroParams_.MacroArgumentString_, 00272 argStr)); 00273 } 00274 else // all other non-special fields 00275 { 00276 if( // bool type, convert to 1 or 0 00277 commandSpecificFields[i].second.isValueBoolType()) 00278 commands.back().params_.emplace( 00279 std::pair<std::string /*param name*/, 00280 std::string /*param value*/>( 00281 commandSpecificFields[i].first, 00282 commandSpecificFields[i].second.getValue<bool>() ? "1" 00283 : "0")); 00284 else if( // number data type, get raw value string (note: does not do 00285 // math or variable substitution) 00286 commandSpecificFields[i].second.isValueNumberDataType()) 00287 commands.back().params_.emplace( 00288 std::pair<std::string /*param name*/, 00289 std::string /*param value*/>( 00290 commandSpecificFields[i].first, 00291 commandSpecificFields[i].second.getValueAsString())); 00292 else 00293 commands.back().params_.emplace( 00294 std::pair<std::string /*param name*/, 00295 std::string /*param value*/>( 00296 commandSpecificFields[i].first, 00297 commandSpecificFields[i].second.getValue<std::string>())); 00298 } 00299 } 00300 } 00301 00302 return commands; 00303 } 00304 00305 DEFINE_OTS_TABLE(IterateTable)