1 #include "otsdaq/FECore/FEVInterfacesManager.h"
2 #include "otsdaq/ConfigurationInterface/ConfigurationManager.h"
3 #include "otsdaq/FECore/MakeInterface.h"
4 #include "otsdaq/Macros/CoutMacros.h"
5 #include "otsdaq/MessageFacility/MessageFacility.h"
7 #include "artdaq-core/Utilities/configureMessageFacility.hh"
8 #include "artdaq/BuildInfo/GetPackageBuildInfo.hh"
9 #include "fhiclcpp/make_ParameterSet.h"
10 #include "messagefacility/MessageLogger/MessageLogger.h"
19 FEVInterfacesManager::FEVInterfacesManager(
21 const std::string& supervisorConfigurationPath)
22 :
Configurable(theXDAQContextConfigTree, supervisorConfigurationPath)
26 __CFG_COUT__ <<
"Constructed." << __E__;
30 FEVInterfacesManager::~FEVInterfacesManager(
void)
33 __CFG_COUT__ <<
"Destructed." << __E__;
40 void FEVInterfacesManager::destroy(
void)
42 for(
auto& it : theFEInterfaces_)
45 theFEInterfaces_.clear();
46 theFENamesByPriority_.clear();
50 void FEVInterfacesManager::createInterfaces(
void)
52 const std::string COL_NAME_feGroupLink =
"LinkToFEInterfaceTable";
53 const std::string COL_NAME_feTypeLink =
"LinkToFETypeTable";
54 const std::string COL_NAME_fePlugin =
"FEInterfacePluginName";
56 __CFG_COUT__ <<
"Path: " << theConfigurationPath_ +
"/" + COL_NAME_feGroupLink
63 theXDAQContextConfigTree_.getBackNode(theConfigurationPath_, 1);
66 auto fes = appNode.
getNode(
"LinkToSupervisorTable")
67 .
getNode(
"LinkToFEInterfaceTable")
73 Configurable::getSelfNode().
getNode(COL_NAME_feGroupLink);
75 std::vector<std::pair<std::string, ConfigurationTree>> feChildren =
79 theFENamesByPriority_ =
83 for(
const auto& interface : feChildren)
87 if(!interface.second.getNode(TableViewColumnInfo::COL_NAME_STATUS)
93 __CFG_COUT_INFO__ <<
"Ignoring FE Status since Status column is missing!"
98 <<
"Interface Plugin Name: "
99 << interface.second.getNode(COL_NAME_fePlugin).getValue<std::string>()
101 __CFG_COUT__ <<
"Interface Name: " << interface.first << __E__;
102 __CFG_COUT__ <<
"XDAQContext Node: " << theXDAQContextConfigTree_ << __E__;
103 __CFG_COUT__ <<
"Path to configuration: "
104 << (theConfigurationPath_ +
"/" + COL_NAME_feGroupLink +
"/" +
105 interface.first +
"/" + COL_NAME_feTypeLink)
110 theFEInterfaces_[interface.first] = makeInterface(
111 interface.second.getNode(COL_NAME_fePlugin).getValue<std::string>(),
113 theXDAQContextConfigTree_,
114 (theConfigurationPath_ +
"/" + COL_NAME_feGroupLink +
"/" +
115 interface.first +
"/" + COL_NAME_feTypeLink));
119 theFEInterfaces_[interface.first]->setParentPointers(
122 __CFG_COUTV__(interface.first);
127 theFEInterfaces_[interface.first]->VStateMachine::parentSupervisor_);
128 __CFG_COUTTV__(theFEInterfaces_[interface.first]
129 ->VStateMachine::parentSupervisor_->getContextUID());
130 __CFG_COUTTV__(theFEInterfaces_[interface.first]
131 ->VStateMachine::parentSupervisor_->getSupervisorUID());
133 catch(
const cet::exception& e)
136 <<
"Failed to instantiate plugin named '" << interface.first
138 << interface.second.getNode(COL_NAME_fePlugin).getValue<std::string>()
139 <<
"' due to the following error: \n"
140 << e.what() << __E__;
141 __COUT_ERR__ << ss.str();
144 catch(
const std::runtime_error& e)
147 <<
"Failed to instantiate plugin named '" << interface.first
149 << interface.second.getNode(COL_NAME_fePlugin).getValue<std::string>()
150 <<
"' due to the following error: \n"
151 << e.what() << __E__;
152 __COUT_ERR__ << ss.str();
158 <<
"Failed to instantiate plugin named '" << interface.first
160 << interface.second.getNode(COL_NAME_fePlugin).getValue<std::string>()
161 <<
"' due to an unknown error." << __E__;
166 catch(
const std::exception& e)
168 ss <<
"Exception message: " << e.what();
173 __COUT_ERR__ << ss.str();
178 __CFG_COUT__ <<
"Done creating interfaces" << __E__;
188 std::string progress =
"";
189 unsigned int cnt = 0;
192 for(
unsigned int i = 0; i < theFENamesByPriority_.size(); ++i)
195 const std::string& name = theFENamesByPriority_[i];
198 if(feProgress.size())
200 ((cnt++) ?
"," :
"") + StringMacros::encodeURIComponent(feProgress);
213 unsigned int FEVInterfacesManager::getMinReadyForEventGenerationStartIteration(
void)
const
215 unsigned int maxIteration = 0;
216 for(
const auto& fePair : theFEInterfaces_)
218 unsigned int val = fePair.second->getMinReadyForEventGenerationStartIteration();
219 if(val > maxIteration)
228 const std::string transitionName =
"Configuring";
230 __CFG_COUT__ << transitionName <<
" FEVInterfacesManager " << __E__;
238 preStateMachineExecutionLoop();
239 for(
unsigned int i = 0; i < theFENamesByPriority_.size(); ++i)
242 if(subIterationWorkStateMachineIndex_ != (
unsigned int)-1 &&
243 i != subIterationWorkStateMachineIndex_)
246 const std::string& name = theFENamesByPriority_[i];
251 if(stateMachinesIterationDone_[name])
254 __CFG_COUT__ << transitionName <<
" interface " << name << __E__;
256 preStateMachineExecution(i, transitionName);
258 postStateMachineExecution(i);
261 if(!fe->VStateMachine::getSubIterationWork() &&
262 !fe->VStateMachine::getIterationWork() &&
263 !fe->VStateMachine::getSubsystemIterationWork())
268 fe->startSlowControlsWorkLoop();
270 __CFG_COUT__ <<
"Done " << transitionName <<
" interface " << name << __E__;
273 postStateMachineExecutionLoop();
275 __CFG_COUT__ <<
"Done " << transitionName <<
" all interfaces." << __E__;
279 void FEVInterfacesManager::halt(
void)
281 const std::string transitionName =
"Halting";
284 preStateMachineExecutionLoop();
285 for(
unsigned int i = 0; i < theFENamesByPriority_.size(); ++i)
288 if(subIterationWorkStateMachineIndex_ != (
unsigned int)-1 &&
289 i != subIterationWorkStateMachineIndex_)
292 const std::string& name = theFENamesByPriority_[i];
296 if(stateMachinesIterationDone_[name])
299 __CFG_COUT__ << transitionName <<
" interface " << name << __E__;
300 __CFG_COUT__ << transitionName <<
" interface " << name << __E__;
301 __CFG_COUT__ << transitionName <<
" interface " << name << __E__;
303 preStateMachineExecution(i, transitionName);
313 <<
"An error occurred while halting the front-end workloop for '" << name
314 <<
",' ignoring." << __E__;
320 fe->stopSlowControlsWorkLoop();
324 __CFG_COUT_WARN__ <<
"An error occurred while halting the Slow Controls "
325 "front-end workloop for '"
326 << name <<
",' ignoring." << __E__;
336 __CFG_COUT_WARN__ <<
"An error occurred while halting the front-end '" << name
337 <<
",' ignoring." << __E__;
340 postStateMachineExecution(i);
342 __CFG_COUT__ <<
"Done " << transitionName <<
" interface " << name << __E__;
343 __CFG_COUT__ <<
"Done " << transitionName <<
" interface " << name << __E__;
344 __CFG_COUT__ <<
"Done " << transitionName <<
" interface " << name << __E__;
346 postStateMachineExecutionLoop();
348 if(!VStateMachine::getSubIterationWork() && !VStateMachine::getIterationWork())
351 __CFG_COUT__ <<
"Done " << transitionName <<
" all interfaces." << __E__;
355 void FEVInterfacesManager::pause(
void)
357 const std::string transitionName =
"Pausing";
360 preStateMachineExecutionLoop();
361 for(
unsigned int i = 0; i < theFENamesByPriority_.size(); ++i)
364 if(subIterationWorkStateMachineIndex_ != (
unsigned int)-1 &&
365 i != subIterationWorkStateMachineIndex_)
368 const std::string& name = theFENamesByPriority_[i];
372 if(stateMachinesIterationDone_[name])
375 __CFG_COUT__ << transitionName <<
" interface " << name << __E__;
376 __CFG_COUT__ << transitionName <<
" interface " << name << __E__;
377 __CFG_COUT__ << transitionName <<
" interface " << name << __E__;
379 preStateMachineExecution(i, transitionName);
382 postStateMachineExecution(i);
384 __CFG_COUT__ <<
"Done " << transitionName <<
" interface " << name << __E__;
385 __CFG_COUT__ <<
"Done " << transitionName <<
" interface " << name << __E__;
386 __CFG_COUT__ <<
"Done " << transitionName <<
" interface " << name << __E__;
388 postStateMachineExecutionLoop();
390 __CFG_COUT__ <<
"Done " << transitionName <<
" all interfaces." << __E__;
394 void FEVInterfacesManager::resume(
void)
396 const std::string transitionName =
"Resuming";
399 preStateMachineExecutionLoop();
400 for(
unsigned int i = 0; i < theFENamesByPriority_.size(); ++i)
403 if(subIterationWorkStateMachineIndex_ != (
unsigned int)-1 &&
404 i != subIterationWorkStateMachineIndex_)
407 const std::string& name = theFENamesByPriority_[i];
411 if(stateMachinesIterationDone_[name])
414 __CFG_COUT__ << transitionName <<
" interface " << name << __E__;
415 __CFG_COUT__ << transitionName <<
" interface " << name << __E__;
416 __CFG_COUT__ << transitionName <<
" interface " << name << __E__;
418 preStateMachineExecution(i, transitionName);
421 if(postStateMachineExecution(i))
424 __CFG_COUT__ <<
"Done " << transitionName <<
" interface " << name << __E__;
425 __CFG_COUT__ <<
"Done " << transitionName <<
" interface " << name << __E__;
426 __CFG_COUT__ <<
"Done " << transitionName <<
" interface " << name << __E__;
428 postStateMachineExecutionLoop();
430 __CFG_COUT__ <<
"Done " << transitionName <<
" all interfaces." << __E__;
435 void FEVInterfacesManager::start(std::string runNumber)
437 const std::string transitionName =
"Starting";
440 preStateMachineExecutionLoop();
441 for(
unsigned int i = 0; i < theFENamesByPriority_.size(); ++i)
444 if(subIterationWorkStateMachineIndex_ != (
unsigned int)-1 &&
445 i != subIterationWorkStateMachineIndex_)
448 const std::string& name = theFENamesByPriority_[i];
452 if(stateMachinesIterationDone_[name])
455 __CFG_COUT__ << transitionName <<
" interface " << name << __E__;
456 __CFG_COUT__ << transitionName <<
" interface " << name << __E__;
457 __CFG_COUT__ << transitionName <<
" interface " << name << __E__;
459 preStateMachineExecution(i, transitionName);
460 fe->start(runNumber);
462 if(postStateMachineExecution(i))
465 __CFG_COUT__ <<
"Done " << transitionName <<
" interface " << name << __E__;
466 __CFG_COUT__ <<
"Done " << transitionName <<
" interface " << name << __E__;
467 __CFG_COUT__ <<
"Done " << transitionName <<
" interface " << name << __E__;
469 postStateMachineExecutionLoop();
471 __CFG_COUT__ <<
"Done " << transitionName <<
" all interfaces." << __E__;
476 void FEVInterfacesManager::stop(
void)
478 const std::string transitionName =
"Starting";
481 preStateMachineExecutionLoop();
482 for(
unsigned int i = 0; i < theFENamesByPriority_.size(); ++i)
485 if(subIterationWorkStateMachineIndex_ != (
unsigned int)-1 &&
486 i != subIterationWorkStateMachineIndex_)
489 const std::string& name = theFENamesByPriority_[i];
493 if(stateMachinesIterationDone_[name])
496 __CFG_COUT__ << transitionName <<
" interface " << name << __E__;
497 __CFG_COUT__ << transitionName <<
" interface " << name << __E__;
498 __CFG_COUT__ << transitionName <<
" interface " << name << __E__;
500 preStateMachineExecution(i, transitionName);
503 postStateMachineExecution(i);
505 __CFG_COUT__ <<
"Done " << transitionName <<
" interface " << name << __E__;
506 __CFG_COUT__ <<
"Done " << transitionName <<
" interface " << name << __E__;
507 __CFG_COUT__ <<
"Done " << transitionName <<
" interface " << name << __E__;
509 postStateMachineExecutionLoop();
511 __CFG_COUT__ <<
"Done " << transitionName <<
" all interfaces." << __E__;
521 return theFEInterfaces_.at(interfaceID).get();
525 __CFG_SS__ <<
"Interface ID '" << interfaceID
526 <<
"' not found in configured interfaces." << __E__;
534 const std::string& interfaceID)
const
538 return *(theFEInterfaces_.at(interfaceID));
542 __CFG_SS__ <<
"Interface ID '" << interfaceID
543 <<
"' not found in configured interfaces." << __E__;
563 const std::string& interfaceID)
572 const std::string& interfaceID)
594 std::string retList =
"";
596 for(
const auto& it : theFEInterfaces_)
598 __CFG_COUT__ <<
"FE name = " << it.first << __E__;
600 retList += it.second->getInterfaceType() +
":" + supervisorLid +
":" +
601 it.second->getInterfaceUID() +
"\n";
624 const std::string& interfaceID,
625 const std::string& macroName,
626 const std::string& macroString,
627 const bool enableSavingOutput,
628 const std::string& outputFilePath,
629 const std::string& outputFileRadix,
630 const std::string& inputArgs)
632 if(requester !=
"iterator")
634 __CFG_SS__ <<
"Invalid requester '" << requester <<
"'" << __E__;
638 __CFG_COUT__ <<
"Starting multi-dimensional Macro '" << macroName
639 <<
"' for interface '" << interfaceID <<
".'" << __E__;
641 __CFG_COUTV__(macroString);
643 __CFG_COUTV__(inputArgs);
649 if(macroMultiDimensionalStatusMap_.find(interfaceID) !=
650 macroMultiDimensionalStatusMap_.end())
652 __SS__ <<
"Failed to start multi-dimensional Macro '" << macroName
653 <<
"' for interface '" << interfaceID
654 <<
"' - this interface already has an active Macro launch!" << __E__;
657 macroMultiDimensionalStatusMap_.emplace(std::make_pair(interfaceID,
"Active"));
663 const std::string interfaceID,
664 const std::string macroName,
665 const std::string macroString,
666 const bool enableSavingOutput,
667 const std::string outputFilePath,
668 const std::string outputFileRadix,
669 const std::string inputArgsStr) {
671 std::string mfSubject_ =
"threadMultiD-" + macroName;
672 __GEN_COUT__ <<
"Thread started." << __E__;
674 std::string statusResult =
"Done";
688 FILE* outputFilePointer = 0;
689 if(enableSavingOutput)
693 std::string basePath = outputFilePath;
695 basePath == TableViewColumnInfo::DATATYPE_STRING_DEFAULT ||
696 basePath == TableViewColumnInfo::DATATYPE_STRING_ALT_DEFAULT)
697 basePath = std::string(__ENV__(
"OTSDAQ_DATA"));
698 std::string filename = basePath +
"/" + outputFileRadix + macroName +
699 "_" + std::to_string(time(0)) +
".txt";
700 __GEN_COUT__ <<
"Opening file... " << filename << __E__;
702 outputFilePointer = fopen(filename.c_str(),
"w");
703 if(!outputFilePointer)
705 __GEN_SS__ <<
"Failed to open output file: " << filename << __E__;
709 std::lock_guard<std::mutex> lock(
718 __GEN_COUTV__(inputArgsStr);
738 std::vector<
unsigned long > dimensionIterations,
739 dimensionIterationCnt;
741 using longParamMap_t = std::map<
744 std::pair<
long ,
long >>>;
746 std::vector<longParamMap_t> longDimensionParameters;
751 std::map<std::string , uint64_t > variableMap;
756 for(
const auto& inputArgName : macro.namesOfInputArguments_)
758 std::pair<std::string /*name*/, uint64_t /*value*/>(inputArgName,
760 for(
const auto& outputArgName : macro.namesOfOutputArguments_)
762 std::pair<std::string /*name*/, uint64_t /*value*/>(outputArgName,
769 dimensionIterations.push_back(2);
770 dimensionIterations.push_back(4);
772 longDimensionParameters.push_back(longParamMap_t());
773 longDimensionParameters.push_back(longParamMap_t());
775 longDimensionParameters.back().emplace(std::make_pair(
779 std::make_pair(3 , 4 ))));
782 std::vector<std::string> dimensionArgs;
784 inputArgsStr, dimensionArgs, {
';'} );
786 __GEN_COUTV__(dimensionArgs.size());
789 if(dimensionArgs.size() == 0)
794 dimensionIterations.push_back(1);
795 longDimensionParameters.push_back(longParamMap_t());
798 for(
unsigned int d = 0; d < dimensionArgs.size(); ++d)
803 std::vector<std::string> args;
805 dimensionArgs[d], args, {
','} );
813 __GEN_SS__ <<
"Invalid dimensional arguments! "
814 <<
"Need number of iterations at dimension " << d
819 unsigned long numOfIterations;
821 __GEN_COUT__ <<
"Dimension " << d
822 <<
" numOfIterations=" << numOfIterations << __E__;
826 dimensionIterations.push_back(numOfIterations);
827 longDimensionParameters.push_back(longParamMap_t());
831 for(
unsigned int a = 1; a < args.size(); ++a)
834 std::vector<std::string> argPieces(3);
836 args[a], argPieces[0], argPieces[1], argPieces[2]))
838 __GEN_SS__ <<
"Invalid argument '" << args[a]
839 <<
"'! Expected name:initialValue:stepSize."
851 if((argPieces[1].size() &&
852 (argPieces[1][argPieces[1].size() - 1] ==
'f' ||
853 argPieces[1].find(
'.') != std::string::npos)) ||
854 (argPieces[2].size() &&
855 (argPieces[2][argPieces[2].size() - 1] ==
'f' ||
856 argPieces[2].find(
'.') != std::string::npos)))
860 double startValue = strtod(argPieces[1].c_str(), 0);
861 double stepSize = strtod(argPieces[2].c_str(), 0);
863 __GEN_COUTV__(startValue);
864 __GEN_COUTV__(stepSize);
867 <<
"Error! Only integer aruments allowed for Macros. "
868 <<
"Double style arugment found: " << argPieces[0]
869 <<
"' := " << startValue <<
", " << stepSize << __E__;
893 __GEN_COUTV__(startValue);
894 __GEN_COUTV__(stepSize);
896 __GEN_COUT__ <<
"Creating long argument '" << argPieces[0]
897 <<
"' := " << startValue <<
", " << stepSize
900 longDimensionParameters.back().emplace(std::make_pair(
904 std::make_pair(startValue ,
912 if(dimensionIterations.size() != longDimensionParameters.size())
914 __GEN_SS__ <<
"Impossible vector size mismatch! "
915 << dimensionIterations.size() <<
" - "
916 << longDimensionParameters.size() << __E__;
922 std::stringstream outSS;
924 outSS <<
"\n==========================\n" << __E__;
925 outSS <<
"Macro '" << macro.macroName_
926 <<
"' multi-dimensional scan..." << __E__;
928 outSS <<
"\t" << dimensionIterations.size()
929 <<
" dimensions defined." << __E__;
930 for(
unsigned int i = 0; i < dimensionIterations.size(); ++i)
933 <<
"dimension[" << i <<
"] has "
934 << dimensionIterations[i] <<
" iterations and "
935 << (longDimensionParameters[i].size()) <<
" arguments."
938 for(
auto& param : longDimensionParameters[i])
940 <<
"'" << param.first <<
"' of type long with "
941 <<
"initial value and step value [decimal] = "
942 <<
"\t" << param.second.second.first <<
" & "
943 << param.second.second.second << __E__;
946 outSS <<
"\nInput argument names:" << __E__;
947 for(
const auto& inputArgName : macro.namesOfInputArguments_)
948 outSS <<
"\t" << inputArgName << __E__;
949 outSS <<
"\nOutput argument names:" << __E__;
950 for(
const auto& outputArgName : macro.namesOfOutputArguments_)
951 outSS <<
"\t" << outputArgName << __E__;
953 outSS <<
"\n==========================\n" << __E__;
957 __GEN_COUT__ <<
"\n" << outSS.str();
958 if(outputFilePointer)
959 fprintf(outputFilePointer,
"%s", outSS.str().c_str());
962 unsigned int iterationCount = 0;
970 std::function<void(
const unsigned int
972 localRecurse = [&dimensionIterations,
973 &dimensionIterationCnt,
975 &longDimensionParameters,
980 &localRecurse](
const unsigned int dimension) {
982 std::string mfSubject_ =
"multiD-" + std::to_string(dimension) +
983 "-" + macro.macroName_;
984 __GEN_COUTV__(dimension);
986 if(dimension >= dimensionIterations.size())
988 __GEN_COUT__ <<
"Iteration count: " << iterationCount++
990 __GEN_COUT__ <<
"Launching Macro '" << macro.macroName_
1001 for(
unsigned int j = 0; j < dimensionIterations.size();
1004 for(
auto& longParam : longDimensionParameters[j])
1007 <<
"Assigning argIn '" << longParam.first
1008 <<
"' to current long value '"
1009 << longParam.second.first
1010 <<
"' from dimension " << j <<
" parameter."
1012 variableMap.at(longParam.first) =
1013 longParam.second.first;
1021 std::stringstream outSS;
1023 outSS <<
"\n---------------\n" << __E__;
1024 outSS <<
"Macro '" << macro.macroName_
1025 <<
"' execution..." << __E__;
1027 <<
"iteration " << iterationCount << __E__;
1028 for(
unsigned int i = 0;
1029 i < dimensionIterationCnt.size();
1032 <<
"dimension[" << i
1033 <<
"] index := " << dimensionIterationCnt[i]
1038 <<
"Input arguments (count: "
1039 << macro.namesOfInputArguments_.size()
1041 for(
auto& argIn : macro.namesOfInputArguments_)
1042 outSS <<
"\t\t" << argIn <<
" = "
1043 << variableMap.at(argIn) << __E__;
1048 __GEN_COUT__ <<
"\n" << outSS.str();
1049 if(outputFilePointer)
1050 fprintf(outputFilePointer,
"%s", outSS.str().c_str());
1056 __GEN_COUT__ <<
"Macro complete!" << __E__;
1060 std::stringstream outSS;
1064 <<
"Output arguments (count: "
1065 << macro.namesOfOutputArguments_.size()
1067 for(
auto& argOut : macro.namesOfOutputArguments_)
1068 outSS <<
"\t\t" << argOut <<
" = "
1069 << variableMap.at(argOut) << __E__;
1073 __GEN_COUT__ <<
"\n" << outSS.str();
1074 if(outputFilePointer)
1075 fprintf(outputFilePointer,
"%s", outSS.str().c_str());
1082 if(dimension >= dimensionIterationCnt.size())
1083 dimensionIterationCnt.push_back(0);
1086 __GEN_COUT__ <<
"\n"
1087 <<
"======================================" << __E__
1088 <<
"dimension[" << dimension
1089 <<
"] number of iterations := "
1090 << dimensionIterations[dimension] << __E__;
1094 for(
auto& longPair : longDimensionParameters[dimension])
1096 longPair.second.first =
1097 longPair.second.second.first;
1099 <<
"arg '" << longPair.first
1100 <<
"' current value: " << longPair.second.first
1106 for(dimensionIterationCnt[dimension] =
1108 dimensionIterationCnt[dimension] <
1109 dimensionIterations[dimension];
1110 ++dimensionIterationCnt[dimension])
1112 __GEN_COUT__ <<
"dimension[" << dimension <<
"] index := "
1113 << dimensionIterationCnt[dimension] << __E__;
1115 localRecurse(dimension + 1);
1119 for(
auto& longPair : longDimensionParameters[dimension])
1121 longPair.second.first +=
1122 longPair.second.second.second;
1124 <<
"arg '" << longPair.first
1125 <<
"' current value: " << longPair.second.first
1131 __GEN_COUT__ <<
"Completed dimension[" << dimension
1132 <<
"] number of iterations := "
1133 << dimensionIterationCnt[dimension] <<
" of "
1134 << dimensionIterations[dimension] << __E__;
1141 if(outputFilePointer)
1142 fclose(outputFilePointer);
1144 catch(
const std::runtime_error& e)
1146 __SS__ <<
"Error executing multi-dimensional Macro: " << e.what()
1148 statusResult = ss.str();
1152 __SS__ <<
"Unknown error executing multi-dimensional Macro. " << __E__;
1157 catch(
const std::exception& e)
1159 ss <<
"Exception message: " << e.what();
1164 statusResult = ss.str();
1167 __COUTV__(statusResult);
1172 feMgr->macroMultiDimensionalStatusMap_[interfaceID] = statusResult;
1185 __CFG_COUT__ <<
"Started multi-dimensional Macro '" << macroName
1186 <<
"' for interface '" << interfaceID <<
".'" << __E__;
1208 const std::string& requester,
1209 const std::string& interfaceID,
1210 const std::string& feMacroName,
1211 const bool enableSavingOutput,
1212 const std::string& outputFilePath,
1213 const std::string& outputFileRadix,
1214 const std::string& inputArgs)
1216 if(requester !=
"iterator")
1218 __CFG_SS__ <<
"Invalid requester '" << requester <<
"'" << __E__;
1222 __CFG_COUT__ <<
"Starting multi-dimensional FE Macro '" << feMacroName
1223 <<
"' for interface '" << interfaceID <<
".'" << __E__;
1224 __CFG_COUTV__(inputArgs);
1230 if(macroMultiDimensionalStatusMap_.find(interfaceID) !=
1231 macroMultiDimensionalStatusMap_.end())
1233 __SS__ <<
"Failed to start multi-dimensional FE Macro '" << feMacroName
1234 <<
"' for interface '" << interfaceID
1235 <<
"' - this interface already has an active FE Macro launch!"
1239 macroMultiDimensionalStatusMap_.emplace(std::make_pair(interfaceID,
"Active"));
1245 const std::string interfaceID,
1246 const std::string feMacroName,
1247 const bool enableSavingOutput,
1248 const std::string outputFilePath,
1249 const std::string outputFileRadix,
1250 const std::string inputArgsStr) {
1252 std::string mfSubject_ =
"threadMultiD-" + feMacroName;
1253 __GEN_COUT__ <<
"Thread started." << __E__;
1255 std::string statusResult =
"Done";
1264 auto FEMacroIt = fe->getMapOfFEMacroFunctions().find(feMacroName);
1265 if(FEMacroIt == fe->getMapOfFEMacroFunctions().end())
1267 __GEN_SS__ <<
"FE Macro '" << feMacroName <<
"' of interfaceID '"
1268 << interfaceID <<
"' was not found!" << __E__;
1275 FILE* outputFilePointer = 0;
1276 if(enableSavingOutput)
1280 std::string basePath = outputFilePath;
1281 if(basePath ==
"" ||
1282 basePath == TableViewColumnInfo::DATATYPE_STRING_DEFAULT ||
1283 basePath == TableViewColumnInfo::DATATYPE_STRING_ALT_DEFAULT)
1284 basePath = std::string(__ENV__(
"OTSDAQ_DATA"));
1285 std::string filename = basePath +
"/" + outputFileRadix +
1286 feMacroName +
"_" + std::to_string(time(0)) +
1288 __GEN_COUT__ <<
"Opening file... " << filename << __E__;
1290 outputFilePointer = fopen(filename.c_str(),
"w");
1291 if(!outputFilePointer)
1293 __GEN_SS__ <<
"Failed to open output file: " << filename << __E__;
1297 std::lock_guard<std::mutex> lock(
1298 feMgr->macroMultiDimensionalDoneMutex_);
1299 feMgr->macroMultiDimensionalOutputFileMap_[interfaceID] =
1306 __GEN_COUTV__(inputArgsStr);
1326 std::vector<
unsigned long > dimensionIterations,
1327 dimensionIterationCnt;
1329 using longParamMap_t = std::map<
1332 std::pair<
long ,
long >>>;
1333 using doubleParamMap_t =
1334 std::map<std::string ,
1338 using stringParamMap_t =
1339 std::map<std::string , std::string >;
1341 std::vector<longParamMap_t> longDimensionParameters;
1342 std::vector<doubleParamMap_t> doubleDimensionParameters;
1343 std::vector<stringParamMap_t> stringDimensionParameters;
1345 std::vector<FEVInterface::frontEndMacroArg_t> argsIn;
1346 std::vector<FEVInterface::frontEndMacroArg_t> argsOut;
1348 for(
unsigned int i = 0; i < feMacro.namesOfInputArguments_.size(); ++i)
1349 argsIn.push_back(std::make_pair(
1350 feMacro.namesOfInputArguments_[i],
1352 for(
unsigned int i = 0; i < feMacro.namesOfOutputArguments_.size(); ++i)
1355 feMacro.namesOfOutputArguments_[i],
1362 argsIn.push_back(std::make_pair(
"myOtherArg",
"3"));
1364 dimensionIterations.push_back(2);
1365 dimensionIterations.push_back(4);
1367 longDimensionParameters.push_back(longParamMap_t());
1368 longDimensionParameters.push_back(longParamMap_t());
1370 doubleDimensionParameters.push_back(doubleParamMap_t());
1371 doubleDimensionParameters.push_back(doubleParamMap_t());
1373 longDimensionParameters.back().emplace(std::make_pair(
1377 std::make_pair(3 , 4 ))));
1380 std::vector<std::string> dimensionArgs;
1382 inputArgsStr, dimensionArgs, {
';'} );
1384 __GEN_COUTV__(dimensionArgs.size());
1387 if(dimensionArgs.size() == 0)
1392 dimensionIterations.push_back(1);
1393 longDimensionParameters.push_back(longParamMap_t());
1394 doubleDimensionParameters.push_back(doubleParamMap_t());
1395 stringDimensionParameters.push_back(stringParamMap_t());
1398 for(
unsigned int d = 0; d < dimensionArgs.size(); ++d)
1403 std::vector<std::string> args;
1405 dimensionArgs[d], args, {
','} );
1411 if(args.size() == 0)
1413 __GEN_SS__ <<
"Invalid dimensional arguments! "
1414 <<
"Need number of iterations at dimension " << d
1419 unsigned long numOfIterations;
1421 __GEN_COUT__ <<
"Dimension " << d
1422 <<
" numOfIterations=" << numOfIterations << __E__;
1426 dimensionIterations.push_back(numOfIterations);
1427 longDimensionParameters.push_back(longParamMap_t());
1428 doubleDimensionParameters.push_back(doubleParamMap_t());
1429 stringDimensionParameters.push_back(stringParamMap_t());
1433 for(
unsigned int a = 1; a < args.size(); ++a)
1436 std::vector<std::string> argPieces(3);
1438 args[a], argPieces[0], argPieces[1], argPieces[2]))
1440 __GEN_SS__ <<
"Invalid argument '" << args[a]
1441 <<
"'! Expected name:initialValue:stepSize."
1453 double stepAsNumber = 1;
1455 TableViewColumnInfo::DATATYPE_STRING_DEFAULT ||
1457 TableViewColumnInfo::DATATYPE_STRING_ALT_DEFAULT ||
1458 (argPieces[2].size() &&
1465 __GEN_COUT__ <<
"Creating string argument '"
1466 << argPieces[0] <<
"' := " << argPieces[1]
1469 stringDimensionParameters.back().emplace(
1470 std::make_pair(argPieces[0], argPieces[1]));
1472 else if((argPieces[1].size() &&
1473 (argPieces[1][argPieces[1].size() - 1] ==
'f' ||
1474 argPieces[1].find(
'.') != std::string::npos)) ||
1475 (argPieces[2].size() &&
1476 (argPieces[2][argPieces[2].size() - 1] ==
'f' ||
1477 argPieces[2].find(
'.') != std::string::npos)))
1482 double startValue = strtod(argPieces[1].c_str(), 0);
1483 double stepSize = strtod(argPieces[2].c_str(), 0);
1485 __GEN_COUTV__(startValue);
1486 __GEN_COUTV__(stepSize);
1488 __GEN_COUT__ <<
"Creating double argument '"
1489 << argPieces[0] <<
"' := " << startValue
1490 <<
", " << stepSize << __E__;
1492 doubleDimensionParameters.back().emplace(std::make_pair(
1496 std::make_pair(startValue ,
1504 long int startValue;
1510 __GEN_COUTV__(startValue);
1511 __GEN_COUTV__(stepSize);
1513 __GEN_COUT__ <<
"Creating long argument '" << argPieces[0]
1514 <<
"' := " << startValue <<
", " << stepSize
1517 longDimensionParameters.back().emplace(std::make_pair(
1521 std::make_pair(startValue ,
1529 if(dimensionIterations.size() != longDimensionParameters.size() ||
1530 dimensionIterations.size() != doubleDimensionParameters.size() ||
1531 dimensionIterations.size() != stringDimensionParameters.size())
1533 __GEN_SS__ <<
"Impossible vector size mismatch! "
1534 << dimensionIterations.size() <<
" - "
1535 << longDimensionParameters.size() <<
" - "
1536 << doubleDimensionParameters.size() <<
" - "
1537 << stringDimensionParameters.size() << __E__;
1543 std::stringstream outSS;
1545 outSS <<
"\n==========================\n" << __E__;
1546 outSS <<
"FEMacro '" << feMacro.feMacroName_
1547 <<
"' multi-dimensional scan..." << __E__;
1549 outSS <<
"\t" << dimensionIterations.size()
1550 <<
" dimensions defined." << __E__;
1551 for(
unsigned int i = 0; i < dimensionIterations.size(); ++i)
1554 <<
"dimension[" << i <<
"] has "
1555 << dimensionIterations[i] <<
" iterations and "
1556 << (longDimensionParameters[i].size() +
1557 doubleDimensionParameters[i].size() +
1558 stringDimensionParameters[i].size())
1559 <<
" arguments." << __E__;
1561 for(
auto& param : longDimensionParameters[i])
1563 <<
"'" << param.first <<
"' of type long with "
1564 <<
"initial value and step value [decimal] = "
1565 <<
"\t" << param.second.second.first <<
" & "
1566 << param.second.second.second << __E__;
1568 for(
auto& param : doubleDimensionParameters[i])
1570 <<
"'" << param.first <<
"' of type double with "
1571 <<
"initial value and step value = "
1572 <<
"\t" << param.second.second.first <<
" & "
1573 << param.second.second.second << __E__;
1575 for(
auto& param : stringDimensionParameters[i])
1577 <<
"'" << param.first <<
"' of type string with "
1579 <<
"\t" << param.second << __E__;
1582 outSS <<
"\nHere are the identified input arguments:" << __E__;
1583 for(
unsigned int i = 0; i < feMacro.namesOfInputArguments_.size();
1585 outSS <<
"\t" << feMacro.namesOfInputArguments_[i] << __E__;
1586 outSS <<
"\nHere are the identified input arguments:" << __E__;
1587 for(
unsigned int i = 0;
1588 i < feMacro.namesOfOutputArguments_.size();
1590 outSS <<
"\t" << feMacro.namesOfOutputArguments_[i] << __E__;
1592 outSS <<
"\n==========================\n" << __E__;
1596 __GEN_COUT__ <<
"\n" << outSS.str();
1597 if(outputFilePointer)
1598 fprintf(outputFilePointer,
"%s", outSS.str().c_str());
1601 unsigned int iterationCount = 0;
1609 std::function<void(
const unsigned int
1611 localRecurse = [&dimensionIterations,
1612 &dimensionIterationCnt,
1614 &longDimensionParameters,
1615 &doubleDimensionParameters,
1616 &stringDimensionParameters,
1622 &localRecurse](
const unsigned int dimension) {
1624 std::string mfSubject_ =
"multiD-" + std::to_string(dimension) +
1625 "-" + feMacro.feMacroName_;
1626 __GEN_COUTV__(dimension);
1628 if(dimension >= dimensionIterations.size())
1630 __GEN_COUT__ <<
"Iteration count: " << iterationCount++
1632 __GEN_COUT__ <<
"Launching FE Macro '" << feMacro.feMacroName_
1633 <<
"' ..." << __E__;
1644 for(
unsigned int i = 0; i < argsIn.size(); ++i)
1646 foundAsLong =
false;
1647 for(
unsigned int j = 0; j < dimensionIterations.size();
1651 longDimensionParameters[j].find(argsIn[i].first);
1652 if(longIt == longDimensionParameters[j].end())
1656 __GEN_COUT__ <<
"Assigning argIn '" << argsIn[i].first
1657 <<
"' to current long value '"
1658 << longIt->second.first
1659 <<
"' from dimension " << j
1660 <<
" parameter." << __E__;
1662 std::to_string(longIt->second.first);
1672 for(
unsigned int j = 0; j < dimensionIterations.size();
1675 auto doubleIt = doubleDimensionParameters[j].find(
1677 if(doubleIt == doubleDimensionParameters[j].end())
1681 __GEN_COUT__ <<
"Assigning argIn '" << argsIn[i].first
1682 <<
"' to current double value '"
1683 << doubleIt->second.first
1684 <<
"' from dimension " << j
1685 <<
" parameter." << __E__;
1687 std::to_string(doubleIt->second.first);
1697 for(
unsigned int j = 0; j < dimensionIterations.size();
1700 auto stringIt = stringDimensionParameters[j].find(
1702 if(stringIt == stringDimensionParameters[j].end())
1706 __GEN_COUT__ <<
"Assigning argIn '" << argsIn[i].first
1707 <<
"' to current string value '"
1709 <<
"' from dimension " << j
1710 <<
" parameter." << __E__;
1711 argsIn[i].second = stringIt->second;
1721 __GEN_SS__ <<
"ArgIn '" << argsIn[i].first
1722 <<
"' was not assigned a value "
1723 <<
"by any dimensional loop parameter sets. "
1724 "This is illegal. FEMacro '"
1725 << feMacro.feMacroName_ <<
"' requires '"
1727 <<
"' as an input argument. Either remove the "
1728 "input argument from this FEMacro, "
1729 <<
"or define a value as a dimensional loop "
1736 (fe->*(feMacro.macroFunction_))(feMacro, argsIn, argsOut);
1738 __GEN_COUT__ <<
"FE Macro complete!" << __E__;
1742 std::stringstream outSS;
1744 outSS <<
"\n---------------\n" << __E__;
1745 outSS <<
"FEMacro '" << feMacro.feMacroName_
1746 <<
"' execution..." << __E__;
1748 <<
"iteration " << iterationCount << __E__;
1749 for(
unsigned int i = 0;
1750 i < dimensionIterationCnt.size();
1753 <<
"dimension[" << i
1754 <<
"] index := " << dimensionIterationCnt[i]
1759 <<
"Input arguments (count: " << argsIn.size()
1761 for(
auto& argIn : argsIn)
1762 outSS <<
"\t\t" << argIn.first <<
" = "
1763 << argIn.second << __E__;
1767 <<
"Output arguments (count: " << argsOut.size()
1769 for(
auto& argOut : argsOut)
1770 outSS <<
"\t\t" << argOut.first <<
" = "
1771 << argOut.second << __E__;
1775 __GEN_COUT__ <<
"\n" << outSS.str();
1776 if(outputFilePointer)
1777 fprintf(outputFilePointer,
"%s", outSS.str().c_str());
1784 if(dimension >= dimensionIterationCnt.size())
1785 dimensionIterationCnt.push_back(0);
1788 __GEN_COUT__ <<
"\n"
1789 <<
"======================================" << __E__
1790 <<
"dimension[" << dimension
1791 <<
"] number of iterations := "
1792 << dimensionIterations[dimension] << __E__;
1797 for(
auto& longPair : longDimensionParameters[dimension])
1799 longPair.second.first =
1800 longPair.second.second.first;
1802 <<
"arg '" << longPair.first
1803 <<
"' current value: " << longPair.second.first
1807 for(
auto& doublePair : doubleDimensionParameters[dimension])
1809 doublePair.second.first =
1810 doublePair.second.second.first;
1812 <<
"arg '" << doublePair.first
1813 <<
"' current value: " << doublePair.second.first
1819 for(dimensionIterationCnt[dimension] =
1821 dimensionIterationCnt[dimension] <
1822 dimensionIterations[dimension];
1823 ++dimensionIterationCnt[dimension])
1825 __GEN_COUT__ <<
"dimension[" << dimension <<
"] index := "
1826 << dimensionIterationCnt[dimension] << __E__;
1828 localRecurse(dimension + 1);
1833 for(
auto& longPair : longDimensionParameters[dimension])
1835 longPair.second.first +=
1836 longPair.second.second.second;
1838 <<
"arg '" << longPair.first
1839 <<
"' current value: " << longPair.second.first
1843 for(
auto& doublePair :
1844 doubleDimensionParameters[dimension])
1846 doublePair.second.first +=
1847 doublePair.second.second.second;
1850 <<
"arg '" << doublePair.first
1851 <<
"' current value: " << doublePair.second.first
1857 __GEN_COUT__ <<
"Completed dimension[" << dimension
1858 <<
"] number of iterations := "
1859 << dimensionIterationCnt[dimension] <<
" of "
1860 << dimensionIterations[dimension] << __E__;
1867 if(outputFilePointer)
1868 fclose(outputFilePointer);
1870 catch(
const std::runtime_error& e)
1872 __SS__ <<
"Error executing multi-dimensional FE Macro: " << e.what()
1874 statusResult = ss.str();
1878 __SS__ <<
"Unknown error executing multi-dimensional FE Macro. " << __E__;
1883 catch(
const std::exception& e)
1885 ss <<
"Exception message: " << e.what();
1890 statusResult = ss.str();
1893 __COUTV__(statusResult);
1898 feMgr->macroMultiDimensionalStatusMap_[interfaceID] = statusResult;
1910 __CFG_COUT__ <<
"Started multi-dimensional FE Macro '" << feMacroName
1911 <<
"' for interface '" << interfaceID <<
".'" << __E__;
1922 bool FEVInterfacesManager::checkMacroMultiDimensional(
const std::string& interfaceID,
1923 const std::string& macroName,
1924 std::string* outputFile)
1930 auto statusIt = macroMultiDimensionalStatusMap_.find(interfaceID);
1931 if(statusIt == macroMultiDimensionalStatusMap_.end())
1933 __CFG_SS__ <<
"Status missing for multi-dimensional launch of Macro '"
1934 << macroName <<
"' for interface '" << interfaceID <<
".'" << __E__;
1937 else if(statusIt->second ==
"Done")
1939 __CFG_COUT__ <<
"Completed multi-dimensional launch of Macro '" << macroName
1940 <<
"' for interface '" << interfaceID <<
".'" << __E__;
1952 macroMultiDimensionalStatusMap_.erase(statusIt);
1955 else if(statusIt->second ==
"Active")
1957 __CFG_COUT__ <<
"Still running multi-dimensional launch of Macro '" << macroName
1958 <<
"' for interface '" << interfaceID <<
".'" << __E__;
1963 __CFG_SS__ <<
"Error occured during multi-dimensional launch of Macro '" << macroName
1964 <<
"' for interface '" << interfaceID <<
"':" << statusIt->second << __E__;
1982 const std::string& interfaceID,
1983 const std::string& feMacroName,
1984 const std::string& inputArgs,
1985 std::string& outputArgs)
1987 __CFG_COUTV__(callingInterfaceID);
1993 auto FEMacroIt = fe->getMapOfFEMacroFunctions().find(feMacroName);
1994 if(FEMacroIt == fe->getMapOfFEMacroFunctions().end())
1996 __CFG_SS__ <<
"FE Macro '" << feMacroName <<
"' of interfaceID '" << interfaceID
1997 <<
"' was not found!" << __E__;
1998 ss <<
"\nHere is the list of available FE Macros:\n";
1999 for(
const auto& feMacro : fe->getMapOfFEMacroFunctions())
2000 ss << feMacro.first <<
"... ";
2002 __CFG_COUT_ERR__ <<
"\n" << ss.str();
2008 std::set<std::string> allowedFEsSet;
2014 __CFG_SS__ <<
"FE Macro '" << feMacroName <<
"' of interfaceID '" << interfaceID
2015 <<
"' does not allow access to calling interfaceID '"
2016 << callingInterfaceID
2017 <<
"!' Did the interface add the calling interfaceID "
2018 <<
"to the access list when registering the front-end macro." << __E__;
2019 __CFG_COUT_ERR__ <<
"\n" << ss.str();
2028 for(
unsigned int i = 0; i < feMacro.namesOfOutputArguments_.size(); ++i)
2029 outputArgs += (i ?
"," :
"") + feMacro.namesOfOutputArguments_[i];
2031 __CFG_COUTV__(outputArgs);
2033 runFEMacro(interfaceID, feMacro, inputArgs, outputArgs);
2035 __CFG_COUTV__(outputArgs);
2051 const std::string& macroObjectString,
2052 const std::string& inputArgs,
2053 std::string& outputArgs)
2064 std::vector<FEVInterface::frontEndMacroArg_t> argsIn;
2066 std::istringstream inputStream(inputArgs);
2067 std::string splitVal, argName, argValue;
2068 while(getline(inputStream, splitVal,
';'))
2070 std::istringstream pairInputStream(splitVal);
2071 getline(pairInputStream, argName,
',');
2072 getline(pairInputStream, argValue,
',');
2073 argsIn.push_back(std::make_pair(argName, argValue));
2078 if(macro.namesOfInputArguments_.size() != argsIn.size())
2080 __CFG_SS__ <<
"MacroMaker Macro '" << macro.macroName_
2081 <<
"' was attempted on interfaceID '" << interfaceID
2082 <<
"' with a mismatch in"
2083 <<
" number of input arguments. " << argsIn.size() <<
" were given. "
2084 << macro.namesOfInputArguments_.size() <<
" expected." << __E__;
2087 for(
unsigned int i = 0; i < argsIn.size(); ++i)
2088 if(macro.namesOfInputArguments_.find(argsIn[i].first) ==
2089 macro.namesOfInputArguments_.end())
2091 __CFG_SS__ <<
"MacroMaker Macro '" << macro.macroName_
2092 <<
"' was attempted on interfaceID '" << interfaceID
2093 <<
"' with a mismatch in"
2094 <<
" a name of an input argument. " << argsIn[i].first
2095 <<
" was given. Expected: "
2103 std::vector<std::string> returnStrings;
2104 std::vector<FEVInterface::frontEndMacroArg_t> argsOut;
2107 std::istringstream inputStream(outputArgs);
2108 std::string argName;
2109 while(getline(inputStream, argName,
','))
2111 __CFG_COUT__ <<
"argName " << argName << __E__;
2113 returnStrings.push_back(
"DEFAULT");
2114 argsOut.push_back(FEVInterface::frontEndMacroArg_t(
2115 argName, returnStrings[returnStrings.size() - 1]));
2124 if(macro.namesOfOutputArguments_.size() != argsOut.size())
2126 __CFG_SS__ <<
"MacroMaker Macro '" << macro.macroName_
2127 <<
"' was attempted on interfaceID '" << interfaceID
2128 <<
"' with a mismatch in"
2129 <<
" number of output arguments. " << argsOut.size() <<
" were given. "
2130 << macro.namesOfOutputArguments_.size() <<
" expected." << __E__;
2134 for(
unsigned int i = 0; i < argsOut.size(); ++i)
2135 if(macro.namesOfOutputArguments_.find(argsOut[i].first) ==
2136 macro.namesOfOutputArguments_.end())
2138 __CFG_SS__ <<
"MacroMaker Macro '" << macro.macroName_
2139 <<
"' was attempted on interfaceID '" << interfaceID
2140 <<
"' with a mismatch in"
2141 <<
" a name of an output argument. " << argsOut[i].first
2142 <<
" were given. Expected: "
2149 __CFG_COUT__ <<
"# of input args = " << argsIn.size() << __E__;
2151 std::map<std::string , uint64_t > variableMap;
2153 for(
const auto& outputArgName : macro.namesOfOutputArguments_)
2154 variableMap.emplace(
2155 std::pair<std::string /*name*/, uint64_t /*value*/>(outputArgName, 0));
2156 for(
const auto& inputArgName : macro.namesOfInputArguments_)
2157 variableMap.emplace(
2158 std::pair<std::string /*name*/, uint64_t /*value*/>(inputArgName, 0));
2160 for(
auto& argIn : argsIn)
2162 __CFG_COUT__ << argIn.first <<
": " << argIn.second << __E__;
2168 __CFG_COUT__ <<
"MacroMaker Macro complete!" << __E__;
2170 __CFG_COUT__ <<
"# of output args = " << argsOut.size() << __E__;
2171 for(
auto& arg : argsOut)
2173 std::stringstream numberSs;
2174 numberSs << std::dec << variableMap.at(arg.first) <<
" (0x" << std::hex
2175 << variableMap.at(arg.first) <<
")" << std::dec;
2176 arg.second = numberSs.str();
2177 __CFG_COUT__ << arg.first <<
": " << arg.second << __E__;
2182 for(
unsigned int i = 0; i < argsOut.size(); ++i)
2186 outputArgs += argsOut[i].first +
"," + argsOut[i].second;
2189 __CFG_COUT__ <<
"outputArgs = " << outputArgs << __E__;
2205 const std::string& feMacroName,
2206 const std::string& inputArgs,
2207 std::string& outputArgs)
2213 auto FEMacroIt = fe->getMapOfFEMacroFunctions().find(feMacroName);
2214 if(FEMacroIt == fe->getMapOfFEMacroFunctions().end())
2216 __CFG_SS__ <<
"FE Macro '" << feMacroName <<
"' of interfaceID '" << interfaceID
2217 <<
"' was not found!" << __E__;
2218 __CFG_COUT_ERR__ <<
"\n" << ss.str();
2222 runFEMacro(interfaceID, FEMacroIt->second, inputArgs, outputArgs);
2239 const std::string& inputArgs,
2240 std::string& outputArgs)
2242 __CFG_COUTV__(inputArgs);
2246 std::vector<FEVInterface::frontEndMacroArg_t> argsIn;
2248 std::istringstream inputStream(inputArgs);
2249 std::string splitVal, argName, argValue;
2250 while(getline(inputStream, splitVal,
';'))
2252 std::istringstream pairInputStream(splitVal);
2253 getline(pairInputStream, argName,
',');
2254 getline(pairInputStream, argValue,
',');
2261 if(feMacro.namesOfInputArguments_.size() != argsIn.size())
2263 __CFG_SS__ <<
"FE Macro '" << feMacro.feMacroName_ <<
"' of interfaceID '"
2264 << interfaceID <<
"' was attempted with a mismatch in"
2265 <<
" number of input arguments. " << argsIn.size() <<
" were given. "
2266 << feMacro.namesOfInputArguments_.size() <<
" expected." << __E__;
2267 __CFG_COUT_ERR__ <<
"\n" << ss.str();
2271 for(
unsigned int i = 0; i < argsIn.size(); ++i)
2272 if(argsIn[i].first.substr(0, argsIn[i].first.find(
'(')) !=
2273 feMacro.namesOfInputArguments_[i].substr(
2274 0, feMacro.namesOfInputArguments_[i].find(
'(')))
2276 __CFG_SS__ <<
"FE Macro '" << feMacro.feMacroName_ <<
"' of interfaceID '"
2277 << interfaceID <<
"' was attempted with a mismatch in"
2278 <<
" a name of an input argument. '" << argsIn[i].first
2279 <<
"' was given. '" << feMacro.namesOfInputArguments_[i]
2280 <<
"' expected." << __E__;
2281 __CFG_COUT_ERR__ <<
"\n" << ss.str();
2286 std::vector<std::string> returnStrings;
2287 std::vector<FEVInterface::frontEndMacroArg_t> argsOut;
2289 const std::string ARG_OUT_DEFAULT =
"DEFAULT";
2292 std::istringstream inputStream(outputArgs);
2293 std::string argName;
2294 while(getline(inputStream, argName,
','))
2296 __CFG_COUTT__ <<
"argName " << argName << __E__;
2298 returnStrings.push_back(ARG_OUT_DEFAULT);
2299 argsOut.push_back(FEVInterface::frontEndMacroArg_t(
2301 returnStrings[returnStrings.size() - 1]));
2304 __CFG_COUTT__ << (uint64_t) & (returnStrings[returnStrings.size() - 1])
2310 if(feMacro.namesOfOutputArguments_.size() != argsOut.size())
2312 __CFG_SS__ <<
"FE Macro '" << feMacro.feMacroName_ <<
"' of interfaceID '"
2313 << interfaceID <<
"' was attempted with a mismatch in"
2314 <<
" number of output arguments. " << argsOut.size() <<
" were given. "
2315 << feMacro.namesOfOutputArguments_.size() <<
" expected." << __E__;
2316 __CFG_COUT_ERR__ <<
"\n" << ss.str();
2319 for(
unsigned int i = 0; i < argsOut.size(); ++i)
2320 if(argsOut[i].first != feMacro.namesOfOutputArguments_[i])
2322 __CFG_SS__ <<
"FE Macro '" << feMacro.feMacroName_ <<
"' of interfaceID '"
2323 << interfaceID <<
"' was attempted with a mismatch in"
2324 <<
" a name of an output argument. " << argsOut[i].first
2325 <<
" were given. " << feMacro.namesOfOutputArguments_[i]
2326 <<
" expected." << __E__;
2327 __CFG_COUT_ERR__ <<
"\n" << ss.str();
2332 const uint16_t BUILT_IN_ARGOUT_COUNT = 1;
2334 returnStrings.push_back(ARG_OUT_DEFAULT);
2335 argsOut.push_back(FEVInterface::frontEndMacroArg_t(
2336 PLOTLY_PLOT, returnStrings[returnStrings.size() - 1]));
2339 __CFG_COUT__ <<
"# of input args = " << argsIn.size() << __E__;
2340 for(
auto& argIn : argsIn)
2341 __CFG_COUT__ << argIn.first <<
": " << argIn.second << __E__;
2343 __CFG_COUT__ <<
"Launching FE Macro '" << feMacro.feMacroName_ <<
"' ..." << __E__;
2347 __CFG_COUT__ <<
"FE Macro complete!" << __E__;
2349 __CFG_COUT__ <<
"# of output args = " << argsOut.size() <<
" including "
2350 << BUILT_IN_ARGOUT_COUNT <<
" built-in args." << __E__;
2351 for(
const auto& arg : argsOut)
2352 __CFG_COUT__ << arg.first <<
": " << arg.second << __E__;
2355 if(feMacro.namesOfOutputArguments_.size() != argsOut.size() - BUILT_IN_ARGOUT_COUNT)
2357 __CFG_SS__ <<
"FE Macro '" << feMacro.feMacroName_ <<
"' of interfaceID '"
2359 <<
"' was attempted but the FE macro "
2360 "manipulated the output arguments vector. It is illegal "
2361 "to add or remove output vector name/value pairs."
2363 __CFG_COUT_ERR__ <<
"\n" << ss.str();
2370 for(
unsigned int i = 0; i < argsOut.size(); ++i)
2372 if(i >= argsOut.size() -
2373 BUILT_IN_ARGOUT_COUNT &&
2374 argsOut[i].second == ARG_OUT_DEFAULT)
2389 std::stringstream outNumberSs;
2390 outNumberSs << std::dec << tmpNumber <<
" (0x" << std::hex << tmpNumber
2392 outputArgs += StringMacros::encodeURIComponent(argsOut[i].first) +
"," +
2401 outputArgs += StringMacros::encodeURIComponent(argsOut[i].first) +
"," +
2402 StringMacros::encodeURIComponent(argsOut[i].second);
2405 __CFG_COUTT__ <<
"outputArgs = " << outputArgs << __E__;
2419 const std::string& supervisorLid)
2421 std::string retList =
"";
2423 __CFG_COUTV__(theFEInterfaces_.size());
2425 for(
const auto& it : theFEInterfaces_)
2427 __CFG_COUTT__ <<
"FE interface UID = " << it.first << __E__;
2429 retList += supervisorName +
";" + supervisorLid +
";" +
2430 it.second->getInterfaceType() +
";" + it.second->getInterfaceUID();
2432 for(
const auto& macroPair : it.second->getMapOfFEMacroFunctions())
2434 __CFG_COUTT__ <<
"FE Macro name = " << macroPair.first << __E__;
2436 ";" + macroPair.first +
";" + macroPair.second.requiredUserPermissions_;
2438 ";" + StringMacros::encodeURIComponent(macroPair.second.feMacroTooltip_);
2441 ";" + std::to_string(macroPair.second.namesOfInputArguments_.size());
2442 for(
const auto& name : macroPair.second.namesOfInputArguments_)
2443 retList +=
";" + StringMacros::encodeURIComponent(name);
2446 ";" + std::to_string(macroPair.second.namesOfOutputArguments_.size());
2447 for(
const auto& name : macroPair.second.namesOfOutputArguments_)
2448 retList +=
";" + StringMacros::encodeURIComponent(name);
2461 const std::string& interfaceID,
2462 const std::string& feMacroName,
2463 const std::string& inputArgs)
2466 auto macroIt = fe->getMapOfFEMacroFunctions().find(feMacroName);
2467 if(macroIt == fe->getMapOfFEMacroFunctions().end())
2469 __CFG_SS__ <<
"FE Macro '" << feMacroName <<
"' of interfaceID '" << interfaceID
2470 <<
"' was not found." << __E__;
2474 std::map<std::string, std::string> currentInputValues;
2475 if(!inputArgs.empty())
2477 std::istringstream inputStream(inputArgs);
2478 std::string splitValue;
2479 while(getline(inputStream, splitValue,
';'))
2481 std::istringstream pairInputStream(splitValue);
2482 std::string encodedName, encodedValue;
2483 getline(pairInputStream, encodedName,
',');
2484 getline(pairInputStream, encodedValue,
',');
2488 if(inputName.empty())
2494 const std::string inputBase = inputName.substr(0, inputName.find(
'('));
2495 const std::string* declaredName =
nullptr;
2496 for(
const auto& candidate : macroIt->second.namesOfInputArguments_)
2497 if(candidate.substr(0, candidate.find(
'(')) == inputBase)
2499 declaredName = &candidate;
2504 __CFG_SS__ <<
"Dynamic default request for FE Macro '" << feMacroName
2505 <<
"' of interfaceID '" << interfaceID
2506 <<
"' included undeclared input name '" << inputName <<
"'."
2510 currentInputValues[*declaredName] = inputValue;
2515 for(
const auto& defaultValue : defaults)
2517 bool declaredInput =
false;
2518 for(
const auto& inputName : macroIt->second.namesOfInputArguments_)
2519 if(inputName == defaultValue.first)
2521 declaredInput =
true;
2527 __CFG_SS__ <<
"Dynamic default provider for FE Macro '" << feMacroName
2528 <<
"' of interfaceID '" << interfaceID
2529 <<
"' returned undeclared input name '" << defaultValue.first
2543 for(
const auto& FEInterface : theFEInterfaces_)
2545 isActive = FEInterface.second->WorkLoop::isActive();
2547 __CFG_COUT__ << FEInterface.second->getInterfaceUID() <<
" of type "
2548 << FEInterface.second->getInterfaceType() <<
": \t"
2549 <<
"workLoop_->isActive() " << (isActive ?
"yes" :
"no") << __E__;
2562 void FEVInterfacesManager::preStateMachineExecutionLoop(
void)
2564 VStateMachine::clearSubsystemIterationWork();
2565 VStateMachine::clearIterationWork();
2566 VStateMachine::clearSubIterationWork();
2568 stateMachinesIterationWorkCount_ = 0;
2570 __CFG_COUT__ <<
"Number of front ends to transition: " << theFENamesByPriority_.size()
2577 subIterationWorkStateMachineIndex_ = -1;
2579 stateMachinesIterationDone_.clear();
2580 for(
const auto& FEPair : theFEInterfaces_)
2581 stateMachinesIterationDone_[FEPair.first] =
false;
2583 stateMachinesWaitingSubsystemIteration_.clear();
2584 lastSubsystemIterationIndexSeen_ = VStateMachine::getSubsystemIterationIndex();
2588 __CFG_COUT__ <<
"SubsystemIteration "
2589 << VStateMachine::getSubsystemIterationIndexString() <<
" Iteration "
2590 << VStateMachine::getIterationIndex() <<
"."
2591 << VStateMachine::getSubIterationIndex() <<
"("
2592 << (int)subIterationWorkStateMachineIndex_ <<
")" << __E__;
2595 if(VStateMachine::getSubsystemIterationIndex() !=
2596 lastSubsystemIterationIndexSeen_)
2598 lastSubsystemIterationIndexSeen_ =
2599 VStateMachine::getSubsystemIterationIndex();
2600 for(
const auto& name : stateMachinesWaitingSubsystemIteration_)
2601 stateMachinesIterationDone_[name] =
false;
2602 stateMachinesWaitingSubsystemIteration_.clear();
2608 void FEVInterfacesManager::preStateMachineExecution(
unsigned int i,
2609 const std::string& transitionName)
2611 if(i >= theFENamesByPriority_.size())
2613 __CFG_SS__ <<
"FE Interface " << i <<
" not found!" << __E__;
2617 const std::string& name = theFENamesByPriority_[i];
2621 fe->VStateMachine::setTransitionName(transitionName);
2622 fe->VStateMachine::setSubsystemIterationIndex(
2623 VStateMachine::getSubsystemIterationIndex());
2624 fe->VStateMachine::setIterationIndex(VStateMachine::getIterationIndex());
2625 fe->VStateMachine::setSubIterationIndex(VStateMachine::getSubIterationIndex());
2626 fe->VStateMachine::setSystemMinReadyForEventGenerationStartIteration(
2627 VStateMachine::getSystemMinReadyForEventGenerationStartIteration());
2629 fe->VStateMachine::clearSubsystemIterationWork();
2630 fe->VStateMachine::clearIterationWork();
2631 fe->VStateMachine::clearSubIterationWork();
2633 __CFG_COUT__ <<
"theStateMachineImplementation SubsystemIteration "
2634 << fe->VStateMachine::getSubsystemIterationIndexString() <<
" Iteration "
2635 << fe->VStateMachine::getIterationIndex() <<
"."
2636 << fe->VStateMachine::getSubIterationIndex() << __E__;
2642 bool FEVInterfacesManager::postStateMachineExecution(
unsigned int i)
2644 if(i >= theFENamesByPriority_.size())
2646 __CFG_SS__ <<
"FE Interface index " << i <<
" not found!" << __E__;
2650 const std::string& name = theFENamesByPriority_[i];
2655 if(fe->VStateMachine::getSubIterationWork())
2657 subIterationWorkStateMachineIndex_ = i;
2658 VStateMachine::indicateSubIterationWork();
2660 __CFG_COUT__ <<
"FE Interface '" << name
2661 <<
"' is flagged for another sub-iteration..." << __E__;
2665 subIterationWorkStateMachineIndex_ = -1;
2667 if(fe->VStateMachine::getIterationWork())
2670 stateMachinesIterationDone_[name] =
false;
2671 VStateMachine::indicateIterationWork();
2673 ++stateMachinesIterationWorkCount_;
2675 __CFG_COUT__ <<
"FE Interface '" << name
2676 <<
"' is flagged for another iteration..." << __E__;
2680 if(fe->VStateMachine::getSubsystemIterationWork())
2684 stateMachinesIterationDone_[name] =
true;
2685 stateMachinesWaitingSubsystemIteration_.insert(name);
2686 VStateMachine::indicateSubsystemIterationWork();
2688 __CFG_COUT__ <<
"FE Interface '" << name
2689 <<
"' is flagged for another subsystem-iteration..." << __E__;
2694 stateMachinesIterationDone_[name] =
true;
2697 fe->VStateMachine::setTransitionName(
"");
2702 void FEVInterfacesManager::postStateMachineExecutionLoop(
void)
2704 if(VStateMachine::getSubIterationWork())
2705 __CFG_COUT__ <<
"FE Interface state machine implementation "
2706 << subIterationWorkStateMachineIndex_
2707 <<
" is flagged for another sub-iteration..." << __E__;
2708 else if(VStateMachine::getIterationWork())
2709 __CFG_COUT__ << stateMachinesIterationWorkCount_
2710 <<
" FE Interface state machine implementation(s) flagged for "
2711 "another iteration..."
2713 else if(VStateMachine::getSubsystemIterationWork())
2714 __CFG_COUT__ <<
"FE Interface state machine implementation(s) flagged for "
2715 "another subsystem-iteration (cross-subsystem sync)..."
2718 __CFG_COUT__ <<
"Done transitioning all state machine implementations..."
std::vector< std::string > getChildrenNames(bool byPriority=false, bool onlyStatusTrue=false) const
ConfigurationTree getNode(const std::string &nodeName, bool doNotThrowOnBrokenUIDLinks=false) const
navigating between nodes
const std::string & getValueAsString(bool returnLinkTableValue=false) 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
void runMacro(FEVInterface::macroStruct_t ¯o, std::map< std::string, uint64_t > &variableMap)
runMacro
virtual void configureSlowControls(void)
end State Machine handlers
virtual void configure(void)
virtual std::map< std::string, std::string > getFEMacroInputDefaults(const std::string &, const std::map< std::string, std::string > &) const
virtual void universalRead(char *address, char *returnValue)=0
throw std::runtime_error exception on error/timeout
const FEVInterface & getFEInterface(const std::string &interfaceID) const
getFEInterface
std::string getFEMacrosString(const std::string &supervisorName, const std::string &supervisorLid)
used by MacroMaker
std::mutex macroMultiDimensionalDoneMutex_
multi-dimensional FE Macro helpers
FEVInterface * getFEInterfaceP(const std::string &interfaceID)
getFEInterfaceP
void runFEMacro(const std::string &interfaceID, const FEVInterface::frontEndMacroStruct_t &feMacro, const std::string &inputArgs, std::string &outputArgs)
used by MacroMaker and FE calling indirectly
unsigned int getInterfaceUniversalAddressSize(const std::string &interfaceID)
used by MacroMaker
void startFEMacroMultiDimensional(const std::string &requester, const std::string &interfaceID, const std::string &feMacroName, const bool enableSavingOutput, const std::string &outputFilePath, const std::string &outputFileRadix, const std::string &inputArgs)
used by iterator calling (i.e. FESupervisor)
void universalWrite(const std::string &interfaceID, char *address, char *writeValue)
used by MacroMaker
bool allFEWorkloopsAreDone(void)
used by Iterator, e.g.
std::map< std::string, std::string > macroMultiDimensionalOutputFileMap_
set when saving outputs; guarded by macroMultiDimensionalDoneMutex_
virtual void configure(void) override
State Machine Methods.
void runFEMacroByFE(const std::string &callingInterfaceID, const std::string &interfaceID, const std::string &feMacroName, const std::string &inputArgs, std::string &outputArgs)
used by FE calling (i.e. FESupervisor)
unsigned int getInterfaceUniversalDataSize(const std::string &interfaceID)
used by MacroMaker
void universalRead(const std::string &interfaceID, char *address, char *returnValue)
used by MacroMaker
std::map< std::string, std::string > getFEMacroInputDefaults(const std::string &interfaceID, const std::string &feMacroName, const std::string &inputArgs)
used by MacroMaker
virtual std::string getStatusProgressDetail(void) override
overriding VStateMachine::getStatusProgressDetail
void startMacroMultiDimensional(const std::string &requester, const std::string &interfaceID, const std::string ¯oName, const std::string ¯oString, const bool enableSavingOutput, const std::string &outputFilePath, const std::string &outputFileRadix, const std::string &inputArgs)
used by iterator calling (i.e. FESupervisor)
void runMacro(const std::string &interfaceID, const std::string ¯oObjectString, const std::string &inputArgs, std::string &outputArgs)
used by MacroMaker
std::string getFEListString(const std::string &supervisorLid)
used by MacroMaker
virtual std::string getStatusProgressDetail(void)
Status.
bool isFirstIteration(void) const
true on the very first call of a transition (all indices at their starting value)
CoreSupervisorBase * parentSupervisor_
defines used also by OtsConfigurationWizardSupervisor
< members fully define a front-end macro function
const frontEndMacroFunction_t macroFunction_
Note: must be called using this instance.
static std::string getTimestampString(const std::string &linuxTimeInSeconds)
static void getVectorFromString(const std::string &inputString, std::vector< std::string > &listToReturn, const std::set< char > &delimiter={',', '|', '&'}, const std::set< char > &whitespace={' ', '\t', '\n', '\r'}, std::vector< char > *listOfDelimiters=0, bool decodeURIComponents=false)
static bool splitMacroArgTriple(const std::string &inputString, std::string &name, std::string &initValue, std::string &stepValue, char delimiter=':')
static void getSetFromString(const std::string &inputString, std::set< std::string > &setToReturn, const std::set< char > &delimiter={',', '|', '&'}, const std::set< char > &whitespace={' ', '\t', '\n', '\r'})
static std::string setToString(const std::set< T > &setToReturn, const std::string &delimeter=", ")
setToString ~
static std::string vectorToString(const std::vector< T > &setToReturn, const std::string &delimeter=", ")
vectorToString ~
static bool inWildCardSet(const std::string &needle, const std::set< std::string > &haystack)
static std::string decodeURIComponent(const std::string &data)
static bool getNumber(const std::string &s, T &retValue)