1 #include "otsdaq/TablePlugins/ARTDAQTableBase/ARTDAQTableBase.h"
8 #include "otsdaq/Macros/CoutMacros.h"
9 #define TRACE_NAME "ARTDAQTableBase"
11 #include <fhiclcpp/ParameterSet.h>
12 #include <fhiclcpp/detail/print_mode.h>
13 #include <fhiclcpp/intermediate_table.h>
14 #include <fhiclcpp/parse.h>
16 #include "otsdaq/ProgressBar/ProgressBar.h"
17 #include "otsdaq/TablePlugins/XDAQContextTable/XDAQContextTable.h"
22 #define __MF_SUBJECT__ "ARTDAQTableBase"
26 const std::string ARTDAQTableBase::ARTDAQ_FCL_PATH = std::string(__ENV__(
"USER_DATA")) +
"/" +
"ARTDAQConfigurations/";
27 const std::string ARTDAQTableBase::ARTDAQ_CONFIG_LAYOUTS_PATH = std::string(__ENV__(
"SERVICE_DATA_PATH")) +
"/ConfigurationGUI_artdaqLayouts/";
28 const bool ARTDAQTableBase::ARTDAQ_DONOTWRITE_FCL = ((getenv(
"OTS_FCL_DONOTWRITE") == NULL) ?
false :
true);
30 const std::string ARTDAQTableBase::ARTDAQ_SUPERVISOR_CLASS =
"ots::ARTDAQSupervisor";
31 const std::string ARTDAQTableBase::ARTDAQ_SUPERVISOR_TABLE =
"ARTDAQSupervisorTable";
33 const std::string ARTDAQTableBase::ARTDAQ_READER_TABLE =
"ARTDAQBoardReaderTable";
34 const std::string ARTDAQTableBase::ARTDAQ_BUILDER_TABLE =
"ARTDAQEventBuilderTable";
35 const std::string ARTDAQTableBase::ARTDAQ_LOGGER_TABLE =
"ARTDAQDataLoggerTable";
36 const std::string ARTDAQTableBase::ARTDAQ_DISPATCHER_TABLE =
"ARTDAQDispatcherTable";
37 const std::string ARTDAQTableBase::ARTDAQ_MONITOR_TABLE =
"ARTDAQMonitorTable";
38 const std::string ARTDAQTableBase::ARTDAQ_ROUTER_TABLE =
"ARTDAQRoutingManagerTable";
40 const std::string ARTDAQTableBase::ARTDAQ_SUBSYSTEM_TABLE =
"ARTDAQSubsystemTable";
41 const std::string ARTDAQTableBase::ARTDAQ_DAQ_TABLE =
"ARTDAQDaqTable";
42 const std::string ARTDAQTableBase::ARTDAQ_DAQ_PARAMETER_TABLE =
"ARTDAQDaqParameterTable";
43 const std::string ARTDAQTableBase::ARTDAQ_ART_TABLE =
"ARTDAQArtTable";
45 const std::string ARTDAQTableBase::ARTDAQ_TYPE_TABLE_HOSTNAME =
"ExecutionHostname";
46 const std::string ARTDAQTableBase::ARTDAQ_TYPE_TABLE_ALLOWED_PROCESSORS =
"AllowedProcessors";
47 const std::string ARTDAQTableBase::ARTDAQ_TYPE_TABLE_SUBSYSTEM_LINK =
"SubsystemLink";
48 const std::string ARTDAQTableBase::ARTDAQ_TYPE_TABLE_SUBSYSTEM_LINK_UID =
"SubsystemLinkUID";
51 const int ARTDAQTableBase::NULL_SUBSYSTEM_DESTINATION = 0;
52 const std::string ARTDAQTableBase::NULL_SUBSYSTEM_DESTINATION_LABEL =
"nullDestinationSubsystem";
76 std::string* accumulatedExceptions )
77 :
TableBase(tableName, accumulatedExceptions)
80 mkdir((ARTDAQ_FCL_PATH).c_str(), 0755);
89 std::cout <<
"ARTDAQTableBase Before traceTID=" << traceTID << __E__;
91 traceInit(trace_name(TRACE_NAME, __TRACE_FILE__, buf,
sizeof(buf)), 0);
92 std::cout <<
"ARTDAQTableBase After traceTID=" << traceTID << __E__;
93 __COUT__ <<
"ARTDAQTableBase TRACE reinit and Constructed." << __E__;
103 __SS__ <<
"Should not call void constructor, table type is lost!" << __E__;
108 ARTDAQTableBase::~ARTDAQTableBase(
void) {}
111 const std::string& ARTDAQTableBase::getTypeString(ARTDAQAppType type)
115 case ARTDAQAppType::EventBuilder:
117 case ARTDAQAppType::DataLogger:
119 case ARTDAQAppType::Dispatcher:
121 case ARTDAQAppType::BoardReader:
123 case ARTDAQAppType::Monitor:
125 case ARTDAQAppType::RoutingManager:
129 __SS__ <<
"Illegal translation attempt for type '" << (
unsigned int)type <<
"'"
135 std::string ARTDAQTableBase::getFHICLFilename(ARTDAQAppType type,
const std::string& name)
139 std::string filename = ARTDAQ_FCL_PATH + getTypeString(type) +
"-";
140 std::string uid = name;
141 for(
unsigned int i = 0; i < uid.size(); ++i)
142 if((uid[i] >=
'a' && uid[i] <=
'z') || (uid[i] >=
'A' && uid[i] <=
'Z') ||
143 (uid[i] >=
'0' && uid[i] <=
'9'))
154 std::string ARTDAQTableBase::getFlatFHICLFilename(ARTDAQAppType type,
155 const std::string& name)
159 std::string filename = ARTDAQ_FCL_PATH + getTypeString(type) +
"-";
160 std::string uid = name;
161 for(
unsigned int i = 0; i < uid.size(); ++i)
162 if((uid[i] >=
'a' && uid[i] <=
'z') || (uid[i] >=
'A' && uid[i] <=
'Z') ||
163 (uid[i] >=
'0' && uid[i] <=
'9'))
166 filename +=
"_flattened.fcl";
174 void ARTDAQTableBase::flattenFHICL(ARTDAQAppType type,
175 const std::string& name,
176 std::string* returnFcl )
178 std::chrono::steady_clock::time_point startClock = std::chrono::steady_clock::now();
179 __COUTS__(3) <<
"flattenFHICL()" << __ENV__(
"FHICL_FILE_PATH") << __E__;
182 std::string inFile = getFHICLFilename(type, name);
183 std::string outFile = getFlatFHICLFilename(type, name);
185 __COUTVS__(3, inFile);
186 __COUTVS__(3, outFile);
188 cet::filepath_lookup_nonabsolute policy(
"FHICL_FILE_PATH");
189 fhicl::ParameterSet pset;
193 __COUT_INFO__ <<
"parsing document: " << inFile;
196 pset = fhicl::ParameterSet::make(inFile, policy);
197 __COUTT__ <<
"document: " << inFile <<
" parsed";
198 __COUTT__ <<
"got pset from table:";
200 std::ofstream ofs{outFile};
203 __SS__ <<
"Failed to open fhicl output file '" << outFile <<
"!'" << __E__;
206 std::ostringstream out;
207 out << pset.to_indented_string(
211 *returnFcl = out.str();
212 __COUTVS__(21, returnFcl);
216 catch(cet::exception
const& e)
218 __SS__ <<
"Failed to parse fhicl into output file '" << outFile
219 <<
"' - here is the error: " << e.what() << __E__;
224 <<
" Flatten Clock time = " << artdaq::TimeUtils::GetElapsedTime(startClock)
237 std::string& commentStr,
239 const std::string& parameterPreamble,
240 bool onlyInsertAtTableParameters ,
241 bool includeAtTableParameters )
247 auto otherParameters = parameterGroupLink.
getChildren();
251 for(
auto& parameter : otherParameters)
253 key = parameter.second.getNode(parameterPreamble +
"Key").getValue();
257 if(key.find(
"@table::") != std::string::npos)
260 if(onlyInsertAtTableParameters || includeAtTableParameters)
262 if(!parameter.second.status())
268 OUT << parameter.second.getNode(parameterPreamble +
"Value")
272 if(!parameter.second.status())
281 if(onlyInsertAtTableParameters)
284 if(!parameter.second.status())
290 if(key.find(
"#include") == std::string::npos)
292 OUT << parameter.second.getNode(parameterPreamble +
"Value").getValue()
295 if(!parameter.second.status())
309 std::string& commentStr,
312 std::string value = moduleTypeNode.
getValue();
315 if(value.find(
"@table::") == std::string::npos)
316 out <<
"module_type: ";
317 out << value <<
"\n";
326 std::string& commentStr,
329 OUT <<
"\n\nmetrics: {\n";
332 auto metricsGroup = daqNode.
getNode(
"daqMetricsLink");
333 if(!metricsGroup.isDisconnected())
336 bool sendSystemMetrics(
false), sendProcessMetrics(
false);
337 for(
auto& metric : metrics)
339 if(!metric.second.status())
342 OUT << metric.second.getNode(
"metricKey").getValue() <<
": {\n";
345 if(metric.second.getNode(
"sendSystemMetrics").getValue<
bool>())
347 sendSystemMetrics =
true;
349 if(metric.second.getNode(
"sendProcessMetrics").getValue<
bool>())
351 sendProcessMetrics =
true;
354 OUT <<
"metricPluginType: "
355 << metric.second.getNode(
"metricPluginType").getValue() <<
"\n";
356 OUT <<
"level_string: "
357 << metric.second.getNode(
"metricLevelString").getValue() <<
"\n";
359 auto metricParametersGroup = metric.second.getNode(
"metricParametersLink");
360 if(!metricParametersGroup.isDisconnected())
362 auto metricParameters = metricParametersGroup.getChildren();
363 for(
auto& metricParameter : metricParameters)
365 if(!metricParameter.second.status())
368 OUT << metricParameter.second.getNode(
"metricParameterKey").getValue()
370 << metricParameter.second.getNode(
"metricParameterValue")
374 if(!metricParameter.second.status())
381 if(!metric.second.status())
385 if(sendSystemMetrics)
387 OUT <<
"send_system_metrics: true\n";
389 if(sendProcessMetrics)
391 OUT <<
"send_process_metrics: true\n";
400 void ARTDAQTableBase::outputBoardReaderFHICL(
403 size_t routingTimeoutMs ,
404 size_t routingRetryCount )
406 if(ARTDAQ_DONOTWRITE_FCL)
408 __COUT__ <<
"Skipping fcl generation." << __E__;
537 std::string filename =
538 getFHICLFilename(ARTDAQAppType::BoardReader, boardReaderNode.
getValue());
544 std::string tabStr =
"";
545 std::string commentStr =
"";
547 out.open(filename, std::fstream::out | std::fstream::trunc);
550 __SS__ <<
"Failed to open ARTDAQ BoardReader fcl file: " << filename << __E__;
556 OUT <<
"###########################################################" << __E__;
558 OUT <<
"# artdaq reader fcl configuration file produced by otsdaq." << __E__;
561 OUT <<
"# Original filename: \t" << filename << __E__;
562 OUT <<
"# otsdaq-ARTDAQ Reader UID:\t" << boardReaderNode.
getValue() << __E__;
564 OUT <<
"###########################################################" << __E__;
578 catch(
const std::runtime_error&)
591 boardReaderNode.
getNode(
"preambleParametersLink"),
602 OUT <<
"fragment_receiver: {\n";
608 <<
": " << boardReaderNode.
getNode(
"daqGeneratorPluginType").
getValue()
609 << (
"\t #daq generator plug-in type") <<
"\n";
610 OUT <<
"fragment_type"
611 <<
": " << boardReaderNode.
getNode(
"daqGeneratorFragmentType").
getValue()
612 << (
"\t #generator data fragment type") <<
"\n\n";
615 auto parametersLink = boardReaderNode.
getNode(
"daqParametersLink");
616 if(!parametersLink.isDisconnected())
619 for(
auto& parameter : parameters)
621 if(!parameter.second.status())
624 __COUTS__(20) << parameter.second.getNode(
"daqParameterKey").getValue()
626 << parameter.second.getNode(
"daqParameterValue").getValue()
630 parameter.second.getNode(TableViewColumnInfo::COL_NAME_COMMENT);
631 OUT << parameter.second.getNode(
"daqParameterKey").getValue() <<
": "
632 << parameter.second.getNode(
"daqParameterValue").getValue()
633 << (comment.isDefaultValue() ?
"" : (
"\t # " + comment.getValue()))
636 if(!parameter.second.status())
643 auto fragmentId = boardReaderNode.
getNode(
"daqFragmentIDs");
644 std::string value = fragmentId.
getValue();
645 if(value.size() < 2 || value[0] !=
'[' || value[value.size() - 1] !=
']')
647 __SS__ <<
"Invalid 'daqFragmentIDs' - the value must be a valid fcl "
648 "array with starting and ending square brackets: [ ]"
652 OUT <<
"fragment_ids: " << fragmentId.getValue() << __E__;
653 __COUTS__(20) <<
"fragment_ids: " << fragmentId.getValue() << __E__;
658 <<
"Ignoring missing fragment_id column associated with Board Reader."
665 OUT <<
"destinations: {\n";
669 OUT <<
"routing_table_config: {\n";
672 auto readerSubsystemID = 1;
673 auto readerSubsystemLink = boardReaderNode.
getNode(
"SubsystemLink");
674 if(!readerSubsystemLink.isDisconnected())
676 readerSubsystemID = getSubsytemId(readerSubsystemLink);
678 if(info_.subsystems[readerSubsystemID].hasRoutingManager)
680 OUT <<
"use_routing_manager: true\n";
681 OUT <<
"routing_manager_hostname: \""
682 << info_.subsystems[readerSubsystemID].routingManagerHost <<
"\"\n";
683 OUT <<
"table_update_port: 0\n";
684 OUT <<
"table_update_address: \"0.0.0.0\"\n";
685 OUT <<
"table_update_multicast_interface: \"0.0.0.0\"\n";
686 OUT <<
"table_acknowledge_port : 0\n";
687 OUT <<
"routing_timeout_ms: " << routingTimeoutMs <<
"\n";
688 OUT <<
"routing_retry_count: " << routingRetryCount <<
"\n";
692 OUT <<
"use_routing_manager: false\n";
712 boardReaderNode.
getNode(
"addOnParametersLink"),
726 ARTDAQAppType appType,
728 size_t routingTimeoutMs ,
729 size_t routingRetryCount ,
730 std::string* returnFcl )
732 if(ARTDAQ_DONOTWRITE_FCL)
734 __COUT__ <<
"Skipping fcl generation." << __E__;
738 std::string filename = getFHICLFilename(appType, receiverNode.
getValue());
743 std::ostringstream out;
745 std::string tabStr =
"";
746 std::string commentStr =
"";
748 outf.open(filename, std::fstream::out | std::fstream::trunc);
751 __SS__ <<
"Failed to open ARTDAQ fcl file: " << filename << __E__;
757 OUT <<
"###########################################################" << __E__;
759 OUT <<
"# artdaq " << getTypeString(appType)
760 <<
" fcl configuration file produced by otsdaq." << __E__;
763 OUT <<
"# Original filename: \t" << filename << __E__;
764 OUT <<
"# otsdaq-ARTDAQ " << getTypeString(appType) <<
" UID:\t"
765 << receiverNode.
getValue() << __E__;
767 OUT <<
"###########################################################" << __E__;
782 catch(
const std::runtime_error&)
784 __COUTT__ <<
"Ignoring error, assume this a valid UID node." << __E__;
791 __COUTT__ <<
"Inserting preamble parameters..." << __E__;
795 receiverNode.
getNode(
"preambleParametersLink"),
802 __COUTT__ <<
"Generating daq block..." << __E__;
803 auto daq = receiverNode.
getNode(
"daqLink");
804 if(!daq.isDisconnected())
810 if(appType == ARTDAQAppType::EventBuilder)
813 OUT <<
"event_builder: {\n";
818 OUT <<
"aggregator: {\n";
823 if(appType == ARTDAQAppType::DataLogger)
825 OUT <<
"is_datalogger: true\n";
827 else if(appType == ARTDAQAppType::Dispatcher)
829 OUT <<
"is_dispatcher: true\n";
834 __COUTT__ <<
"Inserting DAQ Parameters..." << __E__;
838 daq.getNode(
"daqParametersLink"),
843 if(appType == ARTDAQAppType::EventBuilder)
845 OUT <<
"routing_token_config: {\n";
848 auto builderSubsystemID = 1;
849 auto builderSubsystemLink = receiverNode.
getNode(
"SubsystemLink");
850 if(!builderSubsystemLink.isDisconnected())
852 builderSubsystemID = getSubsytemId(builderSubsystemLink);
855 if(info_.subsystems[builderSubsystemID].hasRoutingManager)
857 OUT <<
"use_routing_manager: true\n";
858 OUT <<
"routing_manager_hostname: \""
859 << info_.subsystems[builderSubsystemID].routingManagerHost <<
"\"\n";
860 OUT <<
"routing_token_port: 0\n";
864 OUT <<
"use_routing_manager: false\n";
870 __COUTT__ <<
"Adding sources placeholder" << __E__;
871 OUT <<
"sources: {\n"
885 __COUTT__ <<
"Filling art block..." << __E__;
886 auto art = receiverNode.
getNode(ARTDAQTableBase::colARTDAQNotReader_.colLinkToArt_);
887 if(!art.isDisconnected())
897 receiverNode.
getNode(
"SubsystemLink"),
907 __COUTT__ <<
"Inserting add-on parameters" << __E__;
911 receiverNode.
getNode(
"addOnParametersLink"),
916 __COUTT__ <<
"outputDataReceiverFHICL DONE" << __E__;
919 *returnFcl = out.str();
920 __COUTVS__(21, *returnFcl);
931 if(ARTDAQ_DONOTWRITE_FCL)
933 __COUT__ <<
"Skipping fcl generation." << __E__;
937 std::string filename =
938 getFHICLFilename(ARTDAQAppType::Monitor, monitorNode.
getValue());
944 std::string tabStr =
"";
945 std::string commentStr =
"";
947 out.open(filename, std::fstream::out | std::fstream::trunc);
950 __SS__ <<
"Failed to open ARTDAQ fcl file: " << filename << __E__;
956 OUT <<
"###########################################################" << __E__;
958 OUT <<
"# artdaq " << getTypeString(ARTDAQAppType::Monitor)
959 <<
" fcl configuration file produced by otsdaq." << __E__;
962 OUT <<
"# Original filename: \t" << filename << __E__;
963 OUT <<
"# otsdaq-ARTDAQ " << getTypeString(ARTDAQAppType::Monitor) <<
" UID:\t"
966 OUT <<
"###########################################################" << __E__;
980 catch(
const std::runtime_error&)
993 monitorNode.
getNode(
"preambleParametersLink"),
1001 auto art = monitorNode.
getNode(ARTDAQTableBase::colARTDAQNotReader_.colLinkToArt_);
1002 if(!art.isDisconnected())
1005 OUT <<
"services.message: { "
1006 << artdaq::generateMessageFacilityConfiguration(
1007 mf::GetApplicationName().c_str(),
true,
false)
1009 OUT <<
"services.message.destinations.file: {type: \"GenFile\" threshold: "
1010 "\"INFO\" seperator: \"-\""
1011 <<
" pattern: \"" << monitorNode.
getValue() <<
"-%?H%t-%p.log"
1013 <<
" timestamp_pattern: \"%Y%m%d%H%M%S\""
1014 <<
" directory: \"" << __ENV__(
"OTSDAQ_LOG_ROOT") <<
"/"
1016 <<
" append : false }\n";
1019 auto dispatcherLink = monitorNode.
getNode(
"dispatcherLink");
1020 if(!dispatcherLink.isDisconnected())
1022 std::string monitorHost =
1023 monitorNode.
getNode(ARTDAQTableBase::ARTDAQ_TYPE_TABLE_HOSTNAME)
1025 std::string dispatcherHost =
1026 dispatcherLink.getNode(ARTDAQTableBase::ARTDAQ_TYPE_TABLE_HOSTNAME)
1027 .getValueWithDefault(
"localhost");
1028 OUT <<
"source.dispatcherHost: \"" << dispatcherHost <<
"\"\n";
1029 int dispatcherPort = dispatcherLink.getNode(
"DispatcherPort").getValue<
int>();
1030 OUT <<
"source.dispatcherPort: " << dispatcherPort <<
"\n";
1031 OUT <<
"source.commanderPluginType: xmlrpc\n";
1034 int disp_fake_rank =
1035 dispatcherLink.getNode(
"DispatcherID").getValueWithDefault<
int>(200);
1037 size_t max_fragment_size =
1039 std::string transfer_plugin_type =
1042 OUT <<
"TransferPluginConfig: {\n";
1044 OUT <<
"transferPluginType: " << transfer_plugin_type <<
"\n";
1045 OUT <<
"host_map: [{ rank: " << disp_fake_rank <<
" host: \"" << dispatcherHost
1046 <<
"\"}, { rank: " << om_rank <<
" host: \"" << monitorHost <<
"\"}]\n";
1047 OUT <<
"max_fragment_size_words: " << max_fragment_size <<
"\n";
1048 OUT <<
"source_rank: " << disp_fake_rank <<
"\n";
1049 OUT <<
"destination_rank: " << om_rank <<
"\n";
1050 OUT <<
"unique_label: " << monitorNode.
getValue() <<
"_to_"
1051 << dispatcherLink.getValue() <<
"\n";
1054 OUT <<
"source.transfer_plugin: @local::TransferPluginConfig \n";
1055 auto dispatcherArt = monitorNode.
getNode(
"dispatcherArtLink");
1056 if(!dispatcherArt.isDisconnected())
1058 OUT <<
"source.dispatcher_config: {\n";
1062 OUT <<
"path: " << monitorNode.
getNode(
"dispatcher_path").
getValue() <<
"\n";
1063 OUT <<
"filter_paths: [\n";
1067 auto filterPathsLink = monitorNode.
getNode(
"filterPathsLink");
1068 if(!filterPathsLink.isDisconnected())
1075 for(
auto& filterPath : filterPaths)
1081 if(!filterPath.second.status())
1084 OUT <<
"name: " << filterPath.second.getNode(
"Name").getValue()
1086 OUT <<
"path: " << filterPath.second.getNode(
"Path").getValue()
1090 if(!filterPath.second.status())
1099 OUT <<
"unique_label: " << monitorNode.
getValue() <<
"\n";
1113 monitorNode.
getNode(
"addOnParametersLink"),
1126 std::string& tabStr,
1127 std::string& commentStr,
1130 size_t routingTimeoutMs,
1131 size_t routingRetryCount)
1136 auto services = art.
getNode(
"servicesLink");
1137 if(!services.isDisconnected())
1139 OUT <<
"services: {\n";
1148 services.getNode(
"ServicesParametersLink"),
1153 OUT <<
"ArtdaqSharedMemoryServiceInterface: { service_provider: "
1154 "ArtdaqSharedMemoryService \n";
1156 OUT <<
"waiting_time: " << services.getNode(
"sharedMemoryWaitingTime").getValue()
1158 OUT <<
"resume_after_timeout: "
1159 << (services.getNode(
"sharedMemoryResumeAfterTimeout").getValue<
bool>()
1165 OUT <<
"ArtdaqFragmentNamingServiceInterface: { service_provider: "
1166 "ArtdaqFragmentNamingService helper_plugin: "
1167 << (services.getNode(
"fragmentNamingServiceProvider").getValue<std::string>())
1175 services.getNode(
"ServicesParametersLink"),
1187 auto outputs = art.
getNode(
"outputsLink");
1188 if(!outputs.isDisconnected())
1190 OUT <<
"outputs: {\n";
1194 auto outputPlugins = outputs.getChildren();
1195 for(
auto& outputPlugin : outputPlugins)
1197 if(!outputPlugin.second.status())
1200 OUT << outputPlugin.second.getNode(
"outputKey").getValue() <<
": {\n";
1204 out, tabStr, commentStr, outputPlugin.second.getNode(
"outputModuleType"));
1211 outputPlugin.second.getNode(
"outputModuleParameterLink"),
1216 if(outputPlugin.second.getNode(
"outputModuleType").getValue() ==
1217 "BinaryNetOutput" ||
1218 outputPlugin.second.getNode(
"outputModuleType").getValue() ==
1221 OUT <<
"destinations: {\n";
1223 OUT <<
"routing_table_config: {\n";
1226 auto mySubsystemID = 1;
1227 auto destinationSubsystemID = 1;
1230 mySubsystemID = getSubsytemId(subsystemLink);
1232 destinationSubsystemID = info_.subsystems[mySubsystemID].destination;
1233 if(info_.subsystems[destinationSubsystemID].hasRoutingManager)
1235 OUT <<
"use_routing_manager: true\n";
1236 OUT <<
"routing_manager_hostname: \""
1237 << info_.subsystems[destinationSubsystemID].routingManagerHost
1239 OUT <<
"table_update_port: 0\n";
1240 OUT <<
"table_update_address: \"0.0.0.0\"\n";
1241 OUT <<
"table_update_multicast_interface: \"0.0.0.0\"\n";
1242 OUT <<
"table_acknowledge_port : 0\n";
1243 OUT <<
"routing_timeout_ms: " << routingTimeoutMs <<
"\n";
1244 OUT <<
"routing_retry_count: " << routingRetryCount <<
"\n";
1248 OUT <<
"use_routing_manager: false\n";
1251 if(outputPlugin.second.getNode(
"outputModuleType").getValue() ==
1254 info_.subsystems[mySubsystemID].eventMode =
true;
1260 if(outputPlugin.second.getNode(
"outputModuleType").getValue() ==
1262 outputPlugin.second.getNode(
"outputModuleType").getValue() ==
1263 "TransferOutputReliable")
1265 OUT <<
"transfer_plugin: @local::TransferPluginConfig \n";
1271 if(!outputPlugin.second.status())
1282 auto physics = art.
getNode(
"physicsLink");
1283 if(!physics.isDisconnected())
1286 OUT <<
"physics: {\n";
1295 physics.getNode(
"physicsOtherParametersLink"),
1296 "physicsParameter" ,
1300 auto analyzers = physics.getNode(
"analyzersLink");
1301 if(!analyzers.isDisconnected())
1304 OUT <<
"analyzers: {\n";
1308 auto modules = analyzers.getChildren();
1309 for(
auto& module : modules)
1311 if(!module.second.status())
1319 module.second.getNode(
"analyzerModuleParameterLink"),
1320 "analyzerParameter" ,
1324 OUT << module.second.getNode(
"analyzerKey").getValue() <<
": {\n";
1327 out, tabStr, commentStr, module.second.getNode(
"analyzerModuleType"));
1334 module.second.getNode(
"analyzerModuleParameterLink"),
1335 "analyzerParameter" ,
1342 if(!module.second.status())
1349 auto producers = physics.getNode(
"producersLink");
1350 if(!producers.isDisconnected())
1353 OUT <<
"producers: {\n";
1357 auto modules = producers.getChildren();
1358 for(
auto& module : modules)
1360 if(!module.second.status())
1368 module.second.getNode(
"producerModuleParameterLink"),
1369 "producerParameter" ,
1373 if(module.second.status() &&
1374 module.second.getNode(
"producerModuleType").getValue() ==
"")
1376 OUT << module.second.getNode(
"producerKey").getValue() <<
": {\n";
1380 out, tabStr, commentStr, module.second.getNode(
"producerModuleType"));
1387 module.second.getNode(
"producerModuleParameterLink"),
1388 "producerParameter" ,
1395 if(!module.second.status())
1402 auto filters = physics.getNode(
"filtersLink");
1403 if(!filters.isDisconnected())
1406 OUT <<
"filters: {\n";
1410 auto modules = filters.getChildren();
1411 for(
auto& module : modules)
1413 if(!module.second.status())
1421 module.second.getNode(
"filterModuleParameterLink"),
1425 if(module.second.status() &&
1426 module.second.getNode(
"filterModuleType").getValue() ==
"")
1428 OUT << module.second.getNode(
"filterKey").getValue() <<
": {\n";
1432 out, tabStr, commentStr, module.second.getNode(
"filterModuleType"));
1439 module.second.getNode(
"filterModuleParameterLink"),
1447 if(!module.second.status())
1459 physics.getNode(
"physicsOtherParametersLink"),
1460 "physicsParameter" ,
1471 auto source = art.
getNode(
"sourceLink");
1472 if(!source.isDisconnected())
1474 OUT <<
"source: {\n";
1476 insertModuleType(out, tabStr, commentStr, source.getNode(
"sourceModuleType"));
1482 OUT <<
"source: {\n";
1484 OUT <<
"module_type: ArtdaqInput";
1492 OUT <<
"process_name: " << art.
getNode(ARTDAQTableBase::colARTDAQArt_.colProcessName_)
1500 art.
getNode(
"AddOnParametersLink"),
1508 void ARTDAQTableBase::outputRoutingManagerFHICL(
1510 size_t routingTimeoutMs ,
1511 size_t routingRetryCount )
1513 if(ARTDAQ_DONOTWRITE_FCL)
1515 __COUT__ <<
"Skipping fcl generation." << __E__;
1519 std::string filename =
1520 getFHICLFilename(ARTDAQAppType::RoutingManager, routingManagerNode.
getValue());
1526 std::string tabStr =
"";
1527 std::string commentStr =
"";
1529 out.open(filename, std::fstream::out | std::fstream::trunc);
1532 __SS__ <<
"Failed to open ARTDAQ RoutingManager fcl file: " << filename << __E__;
1538 OUT <<
"###########################################################" << __E__;
1539 OUT <<
"#" << __E__;
1540 OUT <<
"# artdaq routingManager fcl configuration file produced by otsdaq." << __E__;
1543 OUT <<
"# Original filename: \t" << filename << __E__;
1544 OUT <<
"# otsdaq-ARTDAQ RoutingManager UID:\t" << routingManagerNode.
getValue()
1546 OUT <<
"#" << __E__;
1547 OUT <<
"###########################################################" << __E__;
1561 catch(
const std::runtime_error&)
1573 OUT <<
"policy: {\n";
1575 auto policyName = routingManagerNode.
getNode(
"routingPolicyPluginType").
getValue();
1576 if(policyName ==
"DEFAULT")
1577 policyName =
"NoOp";
1578 OUT <<
"policy: " << policyName <<
"\n";
1579 OUT <<
"receiver_ranks: []\n";
1582 auto parametersLink = routingManagerNode.
getNode(
"routingPolicyParametersLink");
1583 if(!parametersLink.isDisconnected())
1586 for(
auto& parameter : parameters)
1588 if(!parameter.second.status())
1599 parameter.second.getNode(TableViewColumnInfo::COL_NAME_COMMENT);
1600 OUT << parameter.second.getNode(
"daqParameterKey").getValue() <<
": "
1601 << parameter.second.getNode(
"daqParameterValue").getValue()
1602 << (comment.isDefaultValue() ?
"" : (
"\t # " + comment.getValue()))
1605 if(!parameter.second.status())
1613 OUT <<
"use_routing_manager: true\n";
1615 auto routingManagerSubsystemID = 1;
1616 auto routingManagerSubsystemLink = routingManagerNode.
getNode(
"SubsystemLink");
1617 std::string rmHost =
"localhost";
1618 if(!routingManagerSubsystemLink.isDisconnected())
1620 routingManagerSubsystemID = getSubsytemId(routingManagerSubsystemLink);
1621 rmHost = info_.subsystems[routingManagerSubsystemID].routingManagerHost;
1623 if(rmHost ==
"localhost" || rmHost ==
"127.0.0.1")
1625 char hostbuf[HOST_NAME_MAX + 1];
1626 gethostname(hostbuf, HOST_NAME_MAX);
1627 rmHost = std::string(hostbuf);
1631 OUT <<
"routing_manager_hostname: \"" << rmHost <<
"\"\n";
1632 OUT <<
"sender_ranks: []\n";
1633 OUT <<
"table_update_port: 0\n";
1634 OUT <<
"table_update_address: \"0.0.0.0\"\n";
1635 OUT <<
"table_acknowledge_port: 0\n";
1636 OUT <<
"token_receiver: {\n";
1639 OUT <<
"routing_token_port: 0\n";
1645 auto tableUpdateIntervalMs =
1647 if(tableUpdateIntervalMs !=
"DEFAULT")
1649 OUT <<
"table_update_interval_ms: " << tableUpdateIntervalMs <<
"\n";
1651 auto tableAckRetryCount = routingManagerNode.
getNode(
"tableAckRetryCount").
getValue();
1652 if(tableAckRetryCount !=
"DEFAULT")
1654 OUT <<
"table_ack_retry_count: " << tableAckRetryCount <<
"\n";
1657 OUT <<
"routing_timeout_ms: " << routingTimeoutMs <<
"\n";
1658 OUT <<
"routing_retry_count: " << routingRetryCount <<
"\n";
1671 bool getStatusFalseNodes ,
1673 size_t maxFragmentSizeBytes ,
1674 size_t routingTimeoutMs ,
1675 size_t routingRetryCount ,
1679 progressBar->
step();
1682 info_.subsystems.clear();
1683 info_.processes.clear();
1686 progressBar->
step();
1688 info_.subsystems[NULL_SUBSYSTEM_DESTINATION].id = NULL_SUBSYSTEM_DESTINATION;
1689 info_.subsystems[NULL_SUBSYSTEM_DESTINATION].label = NULL_SUBSYSTEM_DESTINATION_LABEL;
1694 __COUT__ <<
"artdaqSupervisorNode is disconnected." << __E__;
1699 extractRoutingManagersInfo(artdaqSupervisorNode,
1700 getStatusFalseNodes,
1704 __COUT__ <<
"artdaqSupervisorNode RoutingManager size: "
1705 << info_.processes.at(ARTDAQAppType::RoutingManager).size() << __E__;
1708 progressBar->
step();
1710 extractBoardReadersInfo(artdaqSupervisorNode,
1711 getStatusFalseNodes,
1713 maxFragmentSizeBytes,
1716 __COUT__ <<
"artdaqSupervisorNode BoardReader size: "
1717 << info_.processes.at(ARTDAQAppType::BoardReader).size() << __E__;
1720 progressBar->
step();
1722 extractEventBuildersInfo(
1723 artdaqSupervisorNode, getStatusFalseNodes, doWriteFHiCL, maxFragmentSizeBytes);
1724 __COUT__ <<
"artdaqSupervisorNode EventBuilder size: "
1725 << info_.processes.at(ARTDAQAppType::EventBuilder).size() << __E__;
1728 progressBar->
step();
1730 extractDataLoggersInfo(
1731 artdaqSupervisorNode, getStatusFalseNodes, doWriteFHiCL, maxFragmentSizeBytes);
1732 __COUT__ <<
"artdaqSupervisorNode DataLogger size: "
1733 << info_.processes.at(ARTDAQAppType::DataLogger).size() << __E__;
1736 progressBar->
step();
1738 extractDispatchersInfo(
1739 artdaqSupervisorNode, getStatusFalseNodes, doWriteFHiCL, maxFragmentSizeBytes);
1740 __COUT__ <<
"artdaqSupervisorNode Dispatcher size: "
1741 << info_.processes.at(ARTDAQAppType::Dispatcher).size() << __E__;
1744 progressBar->
step();
1750 void ARTDAQTableBase::extractRoutingManagersInfo(
ConfigurationTree artdaqSupervisorNode,
1751 bool getStatusFalseNodes,
1753 size_t routingTimeoutMs,
1754 size_t routingRetryCount)
1756 __COUT__ <<
"Checking for Routing Managers..." << __E__;
1757 info_.processes[ARTDAQAppType::RoutingManager].clear();
1760 artdaqSupervisorNode.
getNode(colARTDAQSupervisor_.colLinkToRoutingManagers_);
1763 std::vector<std::pair<std::string, ConfigurationTree>> routingManagers =
1766 __COUT__ <<
"There are " << routingManagers.size()
1767 <<
" configured Routing Managers" << __E__;
1769 for(
auto& routingManager : routingManagers)
1771 const std::string& rmUID = routingManager.first;
1773 if(getStatusFalseNodes || routingManager.second.status())
1775 std::string rmHost =
1776 routingManager.second
1777 .getNode(ARTDAQTableBase::ARTDAQ_TYPE_TABLE_HOSTNAME)
1778 .getValueWithDefault(
"localhost");
1779 if(rmHost ==
"localhost" || rmHost ==
"127.0.0.1")
1781 char hostbuf[HOST_NAME_MAX + 1];
1782 gethostname(hostbuf, HOST_NAME_MAX);
1783 rmHost = std::string(hostbuf);
1787 routingManager.second
1788 .getNode(ARTDAQTableBase::ARTDAQ_TYPE_TABLE_ALLOWED_PROCESSORS)
1789 .getValueWithDefault(
"");
1791 int routingManagerSubsystemID = 1;
1793 routingManager.second.
getNode(
1794 ARTDAQTableBase::ARTDAQ_TYPE_TABLE_SUBSYSTEM_LINK);
1797 routingManagerSubsystemID =
1798 getSubsytemId(routingManagerSubsystemLink);
1801 info_.subsystems[routingManagerSubsystemID].id =
1802 routingManagerSubsystemID;
1804 const std::string& routingManagerSubsystemName =
1808 info_.subsystems[routingManagerSubsystemID].label =
1809 routingManagerSubsystemName;
1811 if(info_.subsystems[routingManagerSubsystemID].hasRoutingManager)
1813 __SS__ <<
"Error: You cannot have multiple Routing Managers in a "
1819 auto routingManagerSubsystemDestinationLink =
1820 routingManagerSubsystemLink.
getNode(
1821 colARTDAQSubsystem_.colLinkToDestination_);
1822 if(routingManagerSubsystemDestinationLink.isDisconnected())
1825 info_.subsystems[routingManagerSubsystemID].destination = 0;
1830 info_.subsystems[routingManagerSubsystemID].destination =
1831 getSubsytemId(routingManagerSubsystemDestinationLink);
1837 if(!info_.subsystems.count(
1838 info_.subsystems[routingManagerSubsystemID].destination) ||
1840 .subsystems[info_.subsystems[routingManagerSubsystemID]
1842 .sources.count(routingManagerSubsystemID))
1845 .subsystems[info_.subsystems[routingManagerSubsystemID]
1847 .sources.insert(routingManagerSubsystemID);
1852 __COUT__ <<
"Found Routing Manager with UID " << rmUID
1853 <<
", DAQInterface Hostname " << rmHost <<
", and Subsystem "
1854 << routingManagerSubsystemID << __E__;
1855 info_.processes[ARTDAQAppType::RoutingManager].emplace_back(
1859 routingManagerSubsystemID,
1860 ARTDAQAppType::RoutingManager,
1861 routingManager.second.status());
1863 info_.subsystems[routingManagerSubsystemID].hasRoutingManager =
true;
1864 info_.subsystems[routingManagerSubsystemID].routingManagerHost = rmHost;
1868 outputRoutingManagerFHICL(
1869 routingManager.second, routingTimeoutMs, routingRetryCount);
1871 flattenFHICL(ARTDAQAppType::RoutingManager,
1872 routingManager.second.getValue());
1877 __COUT__ <<
"Routing Manager " << rmUID <<
" is disabled." << __E__;
1884 void ARTDAQTableBase::extractBoardReadersInfo(
ConfigurationTree artdaqSupervisorNode,
1885 bool getStatusFalseNodes,
1887 size_t maxFragmentSizeBytes,
1888 size_t routingTimeoutMs,
1889 size_t routingRetryCount)
1891 __COUT__ <<
"Checking for Board Readers..." << __E__;
1892 info_.processes[ARTDAQAppType::BoardReader].clear();
1895 artdaqSupervisorNode.
getNode(colARTDAQSupervisor_.colLinkToBoardReaders_);
1898 std::vector<std::pair<std::string, ConfigurationTree>> readers =
1900 __COUT__ <<
"There are " << readers.size() <<
" configured Board Readers."
1903 for(
auto& reader : readers)
1905 const std::string& readerUID = reader.first;
1907 if(getStatusFalseNodes || reader.second.status())
1909 std::string readerHost =
1910 reader.second.getNode(ARTDAQTableBase::ARTDAQ_TYPE_TABLE_HOSTNAME)
1911 .getValueWithDefault(
"localhost");
1912 std::string readerAP =
1914 .getNode(ARTDAQTableBase::ARTDAQ_TYPE_TABLE_ALLOWED_PROCESSORS)
1915 .getValueWithDefault(
"");
1917 int readerSubsystemID = 1;
1919 reader.second.
getNode(ARTDAQ_TYPE_TABLE_SUBSYSTEM_LINK);
1922 readerSubsystemID = getSubsytemId(readerSubsystemLink);
1924 info_.subsystems[readerSubsystemID].id = readerSubsystemID;
1926 const std::string& readerSubsystemName =
1930 info_.subsystems[readerSubsystemID].label = readerSubsystemName;
1932 auto readerSubsystemDestinationLink = readerSubsystemLink.
getNode(
1933 colARTDAQSubsystem_.colLinkToDestination_);
1934 if(readerSubsystemDestinationLink.isDisconnected())
1937 info_.subsystems[readerSubsystemID].destination = 0;
1942 info_.subsystems[readerSubsystemID].destination =
1943 getSubsytemId(readerSubsystemDestinationLink);
1949 if(!info_.subsystems.count(
1950 info_.subsystems[readerSubsystemID].destination) ||
1951 !info_.subsystems[info_.subsystems[readerSubsystemID].destination]
1952 .sources.count(readerSubsystemID))
1954 info_.subsystems[info_.subsystems[readerSubsystemID].destination]
1955 .sources.insert(readerSubsystemID);
1960 __COUT__ <<
"Found Board Reader with UID " << readerUID
1961 <<
", DAQInterface Hostname " << readerHost <<
", and Subsystem "
1962 << readerSubsystemID << __E__;
1963 info_.processes[ARTDAQAppType::BoardReader].emplace_back(
1968 ARTDAQAppType::BoardReader,
1969 reader.second.status());
1973 outputBoardReaderFHICL(reader.second,
1974 maxFragmentSizeBytes,
1978 flattenFHICL(ARTDAQAppType::BoardReader, reader.second.getValue());
1983 __COUT__ <<
"Board Reader " << readerUID <<
" is disabled." << __E__;
1989 __COUT_WARN__ <<
"There should be at least one Board Reader!";
1996 void ARTDAQTableBase::extractEventBuildersInfo(
ConfigurationTree artdaqSupervisorNode,
1997 bool getStatusFalseNodes,
1999 size_t maxFragmentSizeBytes)
2001 __COUT__ <<
"Checking for Event Builders..." << __E__;
2002 info_.processes[ARTDAQAppType::EventBuilder].clear();
2005 artdaqSupervisorNode.
getNode(colARTDAQSupervisor_.colLinkToEventBuilders_);
2008 std::vector<std::pair<std::string, ConfigurationTree>> builders =
2011 std::string lastBuilderFcl[2],
2012 flattenedLastFclParts
2014 for(
auto& builder : builders)
2016 const std::string& builderUID = builder.first;
2017 __COUTV__(builderUID);
2019 if(getStatusFalseNodes || builder.second.status())
2021 std::string builderHost =
2022 builder.second.getNode(ARTDAQTableBase::ARTDAQ_TYPE_TABLE_HOSTNAME)
2023 .getValueWithDefault(
"localhost");
2024 std::string builderAP =
2026 .getNode(ARTDAQTableBase::ARTDAQ_TYPE_TABLE_ALLOWED_PROCESSORS)
2027 .getValueWithDefault(
"");
2029 int builderSubsystemID = 1;
2031 builder.second.
getNode(ARTDAQ_TYPE_TABLE_SUBSYSTEM_LINK);
2034 builderSubsystemID = getSubsytemId(builderSubsystemLink);
2037 info_.subsystems[builderSubsystemID].id = builderSubsystemID;
2039 const std::string& builderSubsystemName =
2043 info_.subsystems[builderSubsystemID].label = builderSubsystemName;
2045 auto builderSubsystemDestinationLink = builderSubsystemLink.
getNode(
2046 colARTDAQSubsystem_.colLinkToDestination_);
2047 if(builderSubsystemDestinationLink.isDisconnected())
2050 info_.subsystems[builderSubsystemID].destination = 0;
2055 info_.subsystems[builderSubsystemID].destination =
2056 getSubsytemId(builderSubsystemDestinationLink);
2062 if(!info_.subsystems.count(
2063 info_.subsystems[builderSubsystemID].destination) ||
2064 !info_.subsystems[info_.subsystems[builderSubsystemID].destination]
2065 .sources.count(builderSubsystemID))
2067 info_.subsystems[info_.subsystems[builderSubsystemID].destination]
2068 .sources.insert(builderSubsystemID);
2073 __COUT__ <<
"Found Event Builder with UID " << builderUID
2074 <<
", on Hostname " << builderHost <<
", in Subsystem "
2075 << builderSubsystemID << __E__;
2076 info_.processes[ARTDAQAppType::EventBuilder].emplace_back(
2081 ARTDAQAppType::EventBuilder,
2082 builder.second.status());
2086 std::string returnFcl, processName;
2087 bool needToFlatten =
true;
2088 bool captureAsLastFcl =
2091 (&builder != &builders.back());
2093 ARTDAQAppType::EventBuilder,
2094 maxFragmentSizeBytes,
2095 DEFAULT_ROUTING_TIMEOUT_MS,
2096 DEFAULT_ROUTING_RETRY_COUNT,
2097 captureAsLastFcl ? &returnFcl :
nullptr);
2104 auto cmi = returnFcl.find(
2105 "# otsdaq-ARTDAQ builder UID:");
2106 if(cmi != std::string::npos)
2107 cmi = returnFcl.find(
'\n', cmi);
2108 if(cmi != std::string::npos)
2110 size_t pnj = std::string::npos;
2112 returnFcl.find(
"\tprocess_name: ", cmi);
2113 if(pni != std::string::npos)
2115 pni += std::string(
"\tprocess_name: ")
2117 pnj = returnFcl.find(
'\n', pni);
2119 if(pnj != std::string::npos)
2121 processName = returnFcl.substr(pni, pnj - pni);
2122 __COUT__ <<
"Found process name = " << processName << __E__;
2124 bool sameFirst =
false;
2126 std::string newPiece = returnFcl.substr(cmi, pni - cmi);
2127 if(flattenedLastFclParts[0].size() &&
2128 lastBuilderFcl[0].size() && lastBuilderFcl[0] == newPiece)
2130 __COUT__ <<
"Same first fcl" << __E__;
2135 __COUTVS__(20, lastBuilderFcl[0]);
2136 __COUTVS__(20, newPiece);
2137 for(
size_t i = 0, j = 0;
2138 i < lastBuilderFcl[0].size() && j < newPiece.size();
2141 if(lastBuilderFcl[0][i] != newPiece[j])
2145 __COUTVS__(20, lastBuilderFcl[0].substr(i, 30));
2146 __COUTVS__(20, newPiece.substr(j, 30));
2151 if(captureAsLastFcl)
2152 lastBuilderFcl[0] = newPiece;
2155 newPiece = returnFcl.substr(pnj);
2156 if(lastBuilderFcl[0].size() && lastBuilderFcl[1] == newPiece)
2158 __COUT__ <<
"Same second fcl" << __E__;
2161 std::chrono::steady_clock::time_point startClock =
2162 std::chrono::steady_clock::now();
2163 __COUT__ <<
"Found fcl match! Reuse for "
2164 << builderUID << __E__;
2167 needToFlatten =
false;
2170 std::string outFile = getFlatFHICLFilename(
2171 ARTDAQAppType::EventBuilder, builderUID);
2172 __COUTVS__(3, outFile);
2173 std::ofstream ofs{outFile};
2176 __SS__ <<
"Failed to open fhicl output file '"
2177 << outFile <<
"!'" << __E__;
2180 ofs << flattenedLastFclParts[0] <<
"process_name: \""
2181 << processName <<
"\""
2182 << flattenedLastFclParts[1];
2184 << builderUID <<
" Flatten Clock time = "
2185 << artdaq::TimeUtils::GetElapsedTime(startClock)
2190 if(captureAsLastFcl)
2191 lastBuilderFcl[1] = newPiece;
2196 ARTDAQTableBase::flattenFHICL(
2197 ARTDAQAppType::EventBuilder,
2199 captureAsLastFcl ? &returnFcl :
nullptr);
2201 __COUT__ <<
"Skipping full flatten for " << builderUID << __E__;
2204 __COUTV__(captureAsLastFcl);
2205 if(captureAsLastFcl)
2207 size_t pnj = std::string::npos;
2208 auto pni = returnFcl.find(
"process_name:");
2209 if(pni != std::string::npos)
2213 (returnFcl[pni - 1] ==
' ' || returnFcl[pni - 1] ==
'\n' ||
2214 returnFcl[pni - 1] ==
'\t'))
2215 pnj = returnFcl.find(
'\n', pni);
2217 if(pnj != std::string::npos)
2220 <<
"Found flattened '"
2221 << returnFcl.substr(pni, pnj - pni) <<
"' at pos " << pni
2222 <<
" of " << returnFcl.size() << __E__;
2223 flattenedLastFclParts[0] = returnFcl.substr(0, pni);
2224 flattenedLastFclParts[1] = returnFcl.substr(pnj);
2228 __COUT_WARN__ <<
"Failed to capture fcl for " << processName
2236 __COUT__ <<
"Event Builder " << builderUID <<
" is disabled." << __E__;
2242 __COUT_WARN__ <<
"There should be at least one Event Builder!";
2249 void ARTDAQTableBase::extractDataLoggersInfo(
ConfigurationTree artdaqSupervisorNode,
2250 bool getStatusFalseNodes,
2252 size_t maxFragmentSizeBytes)
2254 __COUT__ <<
"Checking for Data Loggers..." << __E__;
2255 info_.processes[ARTDAQAppType::DataLogger].clear();
2258 artdaqSupervisorNode.
getNode(colARTDAQSupervisor_.colLinkToDataLoggers_);
2261 std::vector<std::pair<std::string, ConfigurationTree>> dataloggers =
2264 for(
auto& datalogger : dataloggers)
2266 const std::string& loggerUID = datalogger.first;
2268 if(getStatusFalseNodes || datalogger.second.status())
2270 std::string loggerHost =
2271 datalogger.second.getNode(ARTDAQTableBase::ARTDAQ_TYPE_TABLE_HOSTNAME)
2272 .getValueWithDefault(
"localhost");
2273 std::string loggerAP =
2275 .getNode(ARTDAQTableBase::ARTDAQ_TYPE_TABLE_ALLOWED_PROCESSORS)
2276 .getValueWithDefault(
"");
2278 int loggerSubsystemID = 1;
2280 datalogger.second.
getNode(ARTDAQ_TYPE_TABLE_SUBSYSTEM_LINK);
2283 loggerSubsystemID = getSubsytemId(loggerSubsystemLink);
2285 info_.subsystems[loggerSubsystemID].id = loggerSubsystemID;
2287 const std::string& loggerSubsystemName =
2291 info_.subsystems[loggerSubsystemID].label = loggerSubsystemName;
2293 auto loggerSubsystemDestinationLink = loggerSubsystemLink.
getNode(
2294 colARTDAQSubsystem_.colLinkToDestination_);
2295 if(loggerSubsystemDestinationLink.isDisconnected())
2298 info_.subsystems[loggerSubsystemID].destination = 0;
2303 info_.subsystems[loggerSubsystemID].destination =
2304 getSubsytemId(loggerSubsystemDestinationLink);
2310 if(!info_.subsystems.count(
2311 info_.subsystems[loggerSubsystemID].destination) ||
2312 !info_.subsystems[info_.subsystems[loggerSubsystemID].destination]
2313 .sources.count(loggerSubsystemID))
2315 info_.subsystems[info_.subsystems[loggerSubsystemID].destination]
2316 .sources.insert(loggerSubsystemID);
2321 __COUT__ <<
"Found Data Logger with UID " << loggerUID
2322 <<
", DAQInterface Hostname " << loggerHost <<
", and Subsystem "
2323 << loggerSubsystemID << __E__;
2324 info_.processes[ARTDAQAppType::DataLogger].emplace_back(
2329 ARTDAQAppType::DataLogger,
2330 datalogger.second.status());
2335 ARTDAQAppType::DataLogger,
2336 maxFragmentSizeBytes);
2338 flattenFHICL(ARTDAQAppType::DataLogger, datalogger.second.getValue());
2343 __COUT__ <<
"Data Logger " << loggerUID <<
" is disabled." << __E__;
2349 __COUT_WARN__ <<
"There were no Data Loggers found!";
2354 void ARTDAQTableBase::extractDispatchersInfo(
ConfigurationTree artdaqSupervisorNode,
2355 bool getStatusFalseNodes,
2357 size_t maxFragmentSizeBytes)
2359 __COUT__ <<
"Checking for Dispatchers..." << __E__;
2360 info_.processes[ARTDAQAppType::Dispatcher].clear();
2363 artdaqSupervisorNode.
getNode(colARTDAQSupervisor_.colLinkToDispatchers_);
2366 std::vector<std::pair<std::string, ConfigurationTree>> dispatchers =
2369 for(
auto& dispatcher : dispatchers)
2371 const std::string& dispatcherUID = dispatcher.first;
2373 if(getStatusFalseNodes || dispatcher.second.status())
2375 std::string dispatcherHost =
2376 dispatcher.second.getNode(ARTDAQTableBase::ARTDAQ_TYPE_TABLE_HOSTNAME)
2377 .getValueWithDefault(
"localhost");
2378 std::string dispatcherAP =
2380 .getNode(ARTDAQTableBase::ARTDAQ_TYPE_TABLE_ALLOWED_PROCESSORS)
2381 .getValueWithDefault(
"");
2382 int dispatcherPort =
2383 dispatcher.second.getNode(
"DispatcherPort").getValue<
int>();
2385 auto dispatcherSubsystemID = 1;
2387 dispatcher.second.
getNode(ARTDAQ_TYPE_TABLE_SUBSYSTEM_LINK);
2390 dispatcherSubsystemID = getSubsytemId(dispatcherSubsystemLink);
2392 info_.subsystems[dispatcherSubsystemID].id = dispatcherSubsystemID;
2394 const std::string& dispatcherSubsystemName =
2398 info_.subsystems[dispatcherSubsystemID].label =
2399 dispatcherSubsystemName;
2401 auto dispatcherSubsystemDestinationLink =
2402 dispatcherSubsystemLink.
getNode(
2403 colARTDAQSubsystem_.colLinkToDestination_);
2404 if(dispatcherSubsystemDestinationLink.isDisconnected())
2407 info_.subsystems[dispatcherSubsystemID].destination = 0;
2412 info_.subsystems[dispatcherSubsystemID].destination =
2413 getSubsytemId(dispatcherSubsystemDestinationLink);
2419 if(!info_.subsystems.count(
2420 info_.subsystems[dispatcherSubsystemID].destination) ||
2422 .subsystems[info_.subsystems[dispatcherSubsystemID]
2424 .sources.count(dispatcherSubsystemID))
2427 .subsystems[info_.subsystems[dispatcherSubsystemID]
2429 .sources.insert(dispatcherSubsystemID);
2433 __COUT__ <<
"Found Dispatcher with UID " << dispatcherUID
2434 <<
", DAQInterface Hostname " << dispatcherHost
2435 <<
", and Subsystem " << dispatcherSubsystemID << __E__;
2436 info_.processes[ARTDAQAppType::Dispatcher].emplace_back(
2440 dispatcherSubsystemID,
2441 ARTDAQAppType::Dispatcher,
2442 dispatcher.second.status(),
2448 ARTDAQAppType::Dispatcher,
2449 maxFragmentSizeBytes);
2451 flattenFHICL(ARTDAQAppType::Dispatcher, dispatcher.second.getValue());
2456 __COUT__ <<
"Dispatcher " << dispatcherUID <<
" is disabled." << __E__;
2462 __COUT_WARN__ <<
"There were no Dispatchers found!";
2472 for(
auto context : contexts)
2474 if(!context.second.isEnabled())
2477 auto apps = context.second
2478 .getNode(XDAQContextTable::colContext_.colLinkToApplicationTable_)
2480 for(
auto app : apps)
2483 if(app.second.getNode(XDAQContextTable::colApplication_.colClass_)
2484 .getValue() == ARTDAQ_SUPERVISOR_CLASS &&
2485 app.second.isEnabled())
2503 std::map<std::string ,
2504 std::map<std::string , std::vector<std::string /*property*/>>>&
2505 nodeTypeToObjectMap,
2506 std::map<std::string /*subsystemName*/, std::string /*destinationSubsystemName*/>&
2508 std::vector<std::string /*property*/>& artdaqSupervisoInfo)
2510 __COUT__ <<
"getARTDAQSystem()" << __E__;
2512 artdaqSupervisoInfo.clear();
2523 return ARTDAQTableBase::info_;
2525 __COUTV__(artdaqContext->contextUID_);
2526 __COUTV__(artdaqContext->applications_.size());
2529 std::map<std::string , std::set<std::string >> nodeLayoutNames;
2531 const std::string& finalContextGroupName =
2532 cfgMgr->getActiveGroupName(ConfigurationManager::GroupType::CONTEXT_TYPE);
2534 cfgMgr->getActiveGroupKey(ConfigurationManager::GroupType::CONTEXT_TYPE);
2535 const std::string& finalConfigGroupName = cfgMgr->getActiveGroupName(
2536 ConfigurationManager::GroupType::CONFIGURATION_TYPE);
2537 const TableGroupKey& finalConfigGroupKey = cfgMgr->getActiveGroupKey(
2538 ConfigurationManager::GroupType::CONFIGURATION_TYPE);
2543 std::stringstream layoutPath;
2544 layoutPath << ARTDAQTableBase::ARTDAQ_CONFIG_LAYOUTS_PATH
2545 << finalContextGroupName <<
"_" << finalContextGroupKey <<
"."
2546 << finalConfigGroupName <<
"_" << finalConfigGroupKey <<
".dat";
2548 fp = fopen(layoutPath.str().c_str(),
"r");
2551 __COUT__ <<
"Layout file not found for '" << finalContextGroupName <<
"("
2552 << finalContextGroupKey <<
") + " << finalConfigGroupName <<
"("
2553 << finalConfigGroupKey <<
")': " << layoutPath.
str() << __E__;
2557 __COUTV__(layoutPath.str());
2561 std::stringstream layoutPath;
2562 layoutPath << ARTDAQTableBase::ARTDAQ_CONFIG_LAYOUTS_PATH
2563 << finalContextGroupName <<
"_" << finalContextGroupKey <<
".dat";
2564 __COUTV__(layoutPath.str());
2566 fp = fopen(layoutPath.str().c_str(),
"r");
2569 __COUT__ <<
"Layout file not found for '" << finalContextGroupName <<
"("
2570 << finalContextGroupKey <<
")': " << layoutPath.str() << __E__;
2573 __COUTV__(layoutPath.str());
2579 struct dirent* entry;
2584 float bestScore = 0, score;
2585 std::string bestName =
"";
2587 if(!(pDIR = opendir((ARTDAQTableBase::ARTDAQ_CONFIG_LAYOUTS_PATH).c_str())))
2589 __SS__ <<
"Path '" << ARTDAQTableBase::ARTDAQ_CONFIG_LAYOUTS_PATH
2590 <<
"' could not be opened!" << __E__;
2595 while((entry = readdir(pDIR)))
2597 name = std::string(entry->d_name);
2598 type = int(entry->d_type);
2600 __COUTS__(2) << type <<
" " << name <<
"\n" << std::endl;
2602 if(name[0] !=
'.' &&
2612 if(type == 0 || type == 10)
2615 DIR* pTmpDIR = opendir(
2616 (ARTDAQTableBase::ARTDAQ_CONFIG_LAYOUTS_PATH +
"/" + name)
2624 __COUTS__(2) <<
"Unable to open path as directory: "
2625 << (ARTDAQTableBase::ARTDAQ_CONFIG_LAYOUTS_PATH +
2637 __COUTS__(2) <<
"Directory: " << type <<
" " << name << __E__;
2641 __COUTS__(2) <<
"File: " << type <<
" " << name <<
"\n"
2643 if(name.find(
".dat") !=
2647 __COUTS__(2) <<
"Contender: " << name <<
"\n" << std::endl;
2652 if(nameSplit.size() > 1)
2655 auto keyi = nameSplit[1].rfind(
'_');
2656 if(keyi != std::string::npos)
2660 .substr(keyi, nameSplit[1].size() - 4 - keyi)
2664 finalConfigGroupKey.key() -
2670 __COUTVS__(2, tmpscore);
2674 __COUTVS__(2, tmpscore);
2677 std::string nameToCompare = nameSplit[1].substr(0, keyi);
2678 __COUTVS__(2, nameToCompare);
2679 size_t i = 0, j = 0;
2681 for(; i < nameToCompare.size() &&
2682 j < finalConfigGroupName.size();
2685 if(nameToCompare[i] == finalConfigGroupName[j])
2691 __COUTVS__(2, tmpscore);
2693 for(; i < nameToCompare.size() &&
2694 j < finalConfigGroupName.size();
2697 if(nameToCompare[i] == finalConfigGroupName[j])
2703 __COUTVS__(2, tmpscore);
2706 __COUTVS__(2, score);
2708 if(nameSplit.size() > 0)
2711 auto keyi = nameSplit[0].rfind(
'_');
2712 if(keyi != std::string::npos)
2716 .substr(keyi, nameSplit[0].size() - 4 - keyi)
2720 finalContextGroupKey.key() -
2726 __COUTVS__(2, tmpscore);
2730 __COUTVS__(2, tmpscore);
2733 std::string nameToCompare = nameSplit[0].substr(0, keyi);
2734 __COUTVS__(2, nameToCompare);
2735 size_t i = 0, j = 0;
2737 for(; i < nameToCompare.size() &&
2738 j < finalContextGroupName.size();
2741 if(nameToCompare[i] == finalContextGroupName[j])
2747 __COUTVS__(2, tmpscore);
2749 for(; i < nameToCompare.size() &&
2750 j < finalContextGroupName.size();
2753 if(nameToCompare[i] == finalContextGroupName[j])
2759 __COUTVS__(2, tmpscore);
2762 __COUTVS__(2, score);
2765 if(score > bestScore)
2769 __COUTVS__(2, bestName);
2777 __COUT__ <<
"Found closest layout file name: " << bestName <<
".dat"
2779 std::stringstream layoutPath;
2780 layoutPath << ARTDAQTableBase::ARTDAQ_CONFIG_LAYOUTS_PATH << bestName
2782 __COUTV__(layoutPath.str());
2783 fp = fopen(layoutPath.str().c_str(),
"r");
2786 __COUT__ <<
"Closest layout file not found for '" << bestName <<
"'"
2796 __COUT__ <<
"Extract info from layout file.." << __E__;
2802 const size_t maxLineSz = 1000;
2803 char line[maxLineSz];
2804 if(!fgets(line, maxLineSz, fp))
2807 __COUT__ <<
"No layout naming info found." << __E__;
2813 char name[maxLineSz];
2814 char type[maxLineSz];
2816 while(fgets(line, maxLineSz, fp))
2819 sscanf(line,
"%s %s %u %u", type, name, &x, &y);
2820 nodeLayoutNames[type].emplace(name);
2835 for(
auto& artdaqApp : artdaqContext->applications_)
2837 if(artdaqApp.class_ != ARTDAQ_SUPERVISOR_CLASS)
2840 __COUTV__(artdaqApp.applicationUID_);
2841 artdaqSupervisoInfo.push_back(artdaqApp.applicationUID_);
2842 artdaqSupervisoInfo.push_back(
2843 (artdaqContext->status_ && artdaqApp.status_) ?
"1" :
"0");
2844 artdaqSupervisoInfo.push_back(artdaqContext->address_);
2845 artdaqSupervisoInfo.push_back(std::to_string(artdaqContext->port_));
2848 XDAQContextTable::getSupervisorConfigNode(
2850 artdaqContext->contextUID_,
2851 artdaqApp.applicationUID_),
2854 __COUT__ <<
"========== "
2855 <<
"Found " << info.subsystems.size() <<
" subsystems." << __E__;
2858 for(
auto& subsystem : info.subsystems)
2859 subsystemObjectMap.emplace(std::make_pair(
2860 subsystem.second.label, std::to_string(subsystem.second.destination)));
2862 __COUT__ <<
"========== "
2863 <<
"Found " << info.processes.size() <<
" process types." << __E__;
2867 const std::string& typeString = nameTypePair.first;
2868 __COUTV__(typeString);
2870 nodeTypeToObjectMap.emplace(
2871 std::make_pair(typeString,
2872 std::map<std::string ,
2873 std::vector<std::string /*property*/>>()));
2875 auto it = info.processes.find(nameTypePair.second);
2876 if(it == info.processes.end())
2879 <<
"Found 0 " << typeString << __E__;
2883 <<
"Found " << it->second.size() <<
" " << typeString <<
"(s)"
2889 __SS__ <<
"Invalid artdaq node type '" << typeString <<
"' attempted!"
2893 __COUTV__(tableIt->second);
2896 std::stringstream ss;
2897 cfgMgr->getTableByName(tableIt->second)->getView().print(ss);
2898 __COUT_MULTI__(1, ss.str());
2908 const std::set<std::string > skipColumns(
2909 {ARTDAQ_TYPE_TABLE_HOSTNAME,
2910 ARTDAQ_TYPE_TABLE_ALLOWED_PROCESSORS,
2911 ARTDAQ_TYPE_TABLE_SUBSYSTEM_LINK,
2913 .colDaqFragmentIDs_,
2914 TableViewColumnInfo::COL_NAME_COMMENT,
2915 TableViewColumnInfo::COL_NAME_AUTHOR,
2916 TableViewColumnInfo::
2917 COL_NAME_CREATION});
2919 if(TTEST(1) && nodeLayoutNames.find(typeString) != nodeLayoutNames.end())
2925 for(
auto& artdaqNode : it->second)
2928 if(skipSet.find(StringMacros::encodeURIComponent(artdaqNode.label)) !=
2933 <<
"Found '" << artdaqNode.label <<
"' " << typeString << __E__;
2935 std::string nodeName = artdaqNode.label;
2936 bool status = artdaqNode.status;
2937 std::string hostname = artdaqNode.hostname;
2938 std::string subsystemId = std::to_string(artdaqNode.subsystem);
2939 std::string subsystemName =
2940 info.subsystems.at(artdaqNode.subsystem).label;
2951 std::vector<std::string> multiNodeNames, hostnameArray;
2956 StringMacros::encodeURIComponent(nodeName));
2958 __COUTV__(allNodes.size());
2959 for(
auto& otherNode : allNodes)
2961 if(skipSet.find(StringMacros::encodeURIComponent(otherNode.first)) !=
2963 otherNode.second.status() != status)
2970 otherNode.second.getNode(ARTDAQ_TYPE_TABLE_SUBSYSTEM_LINK_UID)
2979 auto otherNodeColumns = otherNode.second.getChildren();
2981 bool isMultiNode =
true;
2982 for(
unsigned int i = 0;
2983 i < thisNodeColumns.size() && i < otherNodeColumns.size();
2987 if(skipColumns.find(thisNodeColumns[i].first) !=
2988 skipColumns.end() ||
2989 thisNodeColumns[i].second.isLinkNode())
3000 if(thisNodeColumns[i].second.getValue() !=
3001 otherNodeColumns[i].second.getValue())
3003 __COUT__ <<
"Mismatch, not multi-node member." << __E__;
3004 isMultiNode =
false;
3011 __COUT__ <<
"Found '" << nodeName
3012 <<
"' multi-node member candidate '"
3013 << otherNode.first <<
"'" << __E__;
3016 if(!multiNodeNames.size())
3018 multiNodeNames.push_back(
3019 StringMacros::encodeURIComponent(nodeName));
3020 hostnameArray.push_back(
3021 StringMacros::encodeURIComponent(hostname));
3023 multiNodeNames.push_back(
3024 StringMacros::encodeURIComponent(otherNode.first));
3025 hostnameArray.push_back(StringMacros::encodeURIComponent(
3026 otherNode.second.getNode(ARTDAQ_TYPE_TABLE_HOSTNAME)
3029 __COUTV__(hostnameArray.back());
3031 StringMacros::encodeURIComponent(otherNode.first));
3036 unsigned int nodeFixedWildcardLength = 0, hostFixedWildcardLength = 0;
3037 std::string multiNodeString =
"", hostArrayString =
"";
3039 __COUTV__(nodeName);
3041 if(multiNodeNames.size() > 1)
3043 __COUT__ <<
"Handling multi-node printer syntax" << __E__;
3050 if(nodeLayoutNames.find(typeString) != nodeLayoutNames.end())
3058 std::string bestNodeLayoutName =
"";
3059 size_t bestNodeLayoutMatchCount =
3060 multiNodeNames.size() + 1;
3062 for(
const auto& layoutNameFull : nodeLayoutNames.at(typeString))
3064 __COUTTV__(layoutNameFull);
3065 size_t statusPos = layoutNameFull.find(
";status=");
3066 std::string layoutName = layoutNameFull.substr(0, statusPos);
3067 bool layoutStatus =
true;
3071 layoutStatus = status;
3073 layoutNameFull.substr(statusPos +
3074 std::string(
";status=").size()))
3075 layoutStatus =
false;
3077 __COUTTV__(layoutStatus);
3079 if(layoutStatus != status)
3081 __COUTT__ <<
"Status mismatch for template" << __E__;
3089 bool exactMatch =
true;
3091 for(
const auto& layoutSeg : layoutSplit)
3092 if((pos = nodeName.find(layoutSeg, pos)) ==
3095 __COUTT__ <<
"Did not find '" << layoutSeg <<
"' in '"
3096 << nodeName <<
"'" << __E__;
3101 __COUTTV__(exactMatch);
3104 size_t nodeLayoutMatchCount = 1;
3106 __COUT__ <<
"Found layout template name match! '"
3107 << layoutName <<
"' for node '" << nodeName
3108 <<
".' Trimming multinode candidates to match..."
3111 for(
unsigned int i = 1; i < multiNodeNames.size(); ++i)
3113 __COUTTV__(multiNodeNames[i]);
3114 std::string multiNodeName =
3117 __COUTTV__(multiNodeName);
3118 bool exactMatch =
true;
3120 for(
const auto& layoutSeg : layoutSplit)
3121 if((pos = multiNodeName.find(layoutSeg, pos)) ==
3124 __COUTT__ <<
"Did not find '" << layoutSeg
3125 <<
"' in '" << multiNodeName <<
"'"
3133 ++nodeLayoutMatchCount;
3134 __COUTT__ <<
"Found '" << layoutName <<
"' in '"
3135 << multiNodeName <<
"'" << __E__;
3140 __COUTTV__(nodeLayoutMatchCount);
3141 if(nodeLayoutMatchCount < bestNodeLayoutMatchCount)
3143 bestNodeLayoutName = layoutNameFull;
3144 bestNodeLayoutMatchCount = nodeLayoutMatchCount;
3145 __COUTTV__(bestNodeLayoutName);
3146 __COUTTV__(bestNodeLayoutMatchCount);
3151 __COUTV__(nodeName);
3157 if(bestNodeLayoutMatchCount > 0)
3159 __COUTV__(bestNodeLayoutName);
3160 std::string layoutNameFull = bestNodeLayoutName;
3161 __COUTTV__(layoutNameFull);
3162 size_t statusPos = layoutNameFull.find(
";status=");
3163 std::string layoutName = layoutNameFull.substr(0, statusPos);
3169 __COUT__ <<
"Found layout template name match! '"
3170 << layoutName <<
"' for node '" << nodeName
3171 <<
".' Trimming multinode candidates to match..."
3174 for(
unsigned int i = 1; i < multiNodeNames.size(); ++i)
3176 __COUTTV__(multiNodeNames[i]);
3177 std::string multiNodeName =
3179 __COUTTV__(multiNodeName);
3180 bool exactMatch =
true;
3182 for(
const auto& layoutSeg : layoutSplit)
3183 if((pos = multiNodeName.find(layoutSeg, pos)) ==
3186 __COUTT__ <<
"Did not find '" << layoutSeg
3187 <<
"' in '" << multiNodeName <<
"'"
3195 __COUT__ <<
"Trimming multinode candidate '"
3196 << multiNodeName <<
"'" << __E__;
3197 skipSet.erase(multiNodeNames[i]);
3198 multiNodeNames.erase(multiNodeNames.begin() + i);
3199 hostnameArray.erase(hostnameArray.begin() + i);
3206 __COUTV__(nodeName);
3213 unsigned int maxScore = 0;
3215 unsigned int minScore = -1;
3216 std::vector<unsigned int> scoreVector;
3217 scoreVector.push_back(-1);
3218 for(
unsigned int i = 1; i < multiNodeNames.size(); ++i)
3222 __COUTS__(3) << multiNodeNames[0] <<
" vs "
3223 << multiNodeNames[i] << __E__;
3226 for(
unsigned int j = 0, k = 0; j < multiNodeNames[0].size() &&
3227 k < multiNodeNames[i].size();
3230 while(j < multiNodeNames[0].size() &&
3231 !(multiNodeNames[0][j] >=
'a' &&
3232 multiNodeNames[0][j] <=
'z') &&
3233 !(multiNodeNames[0][j] >=
'A' &&
3234 multiNodeNames[0][j] <=
'Z'))
3236 while(k < multiNodeNames[i].size() &&
3237 !(multiNodeNames[i][k] >=
'a' &&
3238 multiNodeNames[i][k] <=
'z') &&
3239 !(multiNodeNames[i][k] >=
'A' &&
3240 multiNodeNames[i][k] <=
'Z'))
3243 while(k < multiNodeNames[i].size() &&
3244 multiNodeNames[0][j] != multiNodeNames[i][k])
3248 << j <<
"-" << k <<
" of " << multiNodeNames[0].size()
3249 <<
"-" << multiNodeNames[i].size() << __E__;
3251 if(j < multiNodeNames[0].size() &&
3252 k < multiNodeNames[i].size())
3256 __COUTVS__(3, score);
3259 for(
unsigned int j = multiNodeNames[0].size() - 1,
3260 k = multiNodeNames[i].size() - 1;
3261 j < multiNodeNames[0].size() &&
3262 k < multiNodeNames[i].size();
3265 while(j < multiNodeNames[0].size() &&
3266 !(multiNodeNames[0][j] >=
'a' &&
3267 multiNodeNames[0][j] <=
'z') &&
3268 !(multiNodeNames[0][j] >=
'A' &&
3269 multiNodeNames[0][j] <=
'Z'))
3271 while(k < multiNodeNames[i].size() &&
3272 !(multiNodeNames[i][k] >=
'a' &&
3273 multiNodeNames[i][k] <=
'z') &&
3274 !(multiNodeNames[i][k] >=
'A' &&
3275 multiNodeNames[i][k] <=
'Z'))
3278 while(k < multiNodeNames[i].size() &&
3279 multiNodeNames[0][j] != multiNodeNames[i][k])
3282 __COUTS__(3) <<
"BACK" << j <<
"-" << k <<
" of "
3283 << multiNodeNames[0].size() <<
"-"
3284 << multiNodeNames[i].size() << __E__;
3286 if(j < multiNodeNames[0].size() &&
3287 k < multiNodeNames[i].size())
3291 __COUTVS__(3, score / 2.0);
3293 scoreVector.push_back(score);
3295 if(score > maxScore)
3300 if(score < minScore)
3307 __COUTVS__(2, minScore);
3308 __COUTVS__(2, maxScore);
3310 __COUT__ <<
"Trimming multi-node members with low match score..."
3315 for(
unsigned int i = multiNodeNames.size() - 1;
3316 i > 0 && i < multiNodeNames.size();
3321 if(maxScore > multiNodeNames[0].size() &&
3322 scoreVector[i] >= maxScore)
3326 __COUT__ <<
"Trimming low score match " << multiNodeNames[i]
3327 <<
" for node name " << nodeName << __E__;
3329 skipSet.erase(multiNodeNames[i]);
3330 multiNodeNames.erase(multiNodeNames.begin() + i);
3331 hostnameArray.erase(hostnameArray.begin() + i);
3337 __COUTV__(nodeName);
3344 __COUT__ <<
"Reorganizing multinode '" << nodeName
3345 <<
"' alphabetically..." << __E__;
3347 std::pair<std::string , std::string >>
3349 for(
unsigned int i = 0; i < multiNodeNames.size(); ++i)
3351 std::make_pair(multiNodeNames[i], hostnameArray[i]));
3356 multiNodeNames.clear();
3357 hostnameArray.clear();
3358 for(
const auto& orderedPair : reorderSet)
3360 multiNodeNames.push_back(orderedPair.first);
3361 hostnameArray.push_back(orderedPair.second);
3365 __COUTV__(nodeName);
3371 if(multiNodeNames.size() > 1)
3373 std::vector<std::string> commonChunks;
3374 std::vector<std::string> wildcards;
3378 bool wildcardsNeeded =
3382 nodeFixedWildcardLength);
3384 if(!wildcardsNeeded || wildcards.size() != multiNodeNames.size())
3387 <<
"Impossible extractCommonChunks result! Please notify "
3388 "admins or try to simplify record naming convention."
3398 for(
auto& commonChunk : commonChunks)
3400 nodeName += (!first ?
"*" :
"") + commonChunk;
3404 if(commonChunks.size() == 1)
3407 __COUTV__(nodeName);
3414 bool allIntegers =
true;
3415 for(
auto& wildcard : wildcards)
3418 else if(wildcard.size() == 0)
3420 allIntegers =
false;
3424 for(
unsigned int i = 0; i < wildcard.size(); ++i)
3425 if(!(wildcard[i] >=
'0' && wildcard[i] <=
'9'))
3427 allIntegers =
false;
3431 __COUTV__(allIntegers);
3437 std::vector<unsigned int> intWildcards;
3438 for(
auto& wildcard : wildcards)
3439 intWildcards.push_back(strtol(wildcard.c_str(), 0, 10));
3443 unsigned int hyphenLo = -1;
3444 bool isFirst =
true;
3445 for(
unsigned int i = 0; i < intWildcards.size(); ++i)
3447 if(i + 1 < intWildcards.size() &&
3448 intWildcards[i] + 1 == intWildcards[i + 1])
3460 (isFirst ?
"" :
",") +
3461 std::to_string(intWildcards[i]);
3466 if(intWildcards[hyphenLo] + 1 == intWildcards[i])
3468 (isFirst ?
"" :
",") +
3469 std::to_string(intWildcards[hyphenLo]) +
3470 "," + std::to_string(intWildcards[i]);
3473 (isFirst ?
"" :
",") +
3474 std::to_string(intWildcards[hyphenLo]) +
3475 "-" + std::to_string(intWildcards[i]);
3485 nodeFixedWildcardLength =
3489 __COUTV__(multiNodeString);
3490 __COUTV__(nodeFixedWildcardLength);
3493 if(hostnameArray.size() > 1)
3495 std::vector<std::string> commonChunks;
3496 std::vector<std::string> wildcards;
3500 bool wildcardsNeeded =
3504 hostFixedWildcardLength);
3506 __COUTV__(wildcardsNeeded);
3512 for(
auto& commonChunk : commonChunks)
3514 hostname += (!first ?
"*" :
"") + commonChunk;
3518 if(wildcardsNeeded && commonChunks.size() == 1)
3521 __COUTV__(hostname);
3531 bool allIntegers =
true;
3532 for(
auto& wildcard : wildcards)
3533 for(
unsigned int i = 0; i < wildcard.size(); ++i)
3534 if(!(wildcard[i] >=
'0' && wildcard[i] <=
'9'))
3536 allIntegers =
false;
3540 __COUTV__(allIntegers);
3547 std::vector<unsigned int> intWildcards;
3548 for(
auto& wildcard : wildcards)
3549 intWildcards.push_back(
3550 strtol(wildcard.c_str(), 0, 10));
3554 unsigned int hyphenLo = -1;
3555 bool isFirst =
true;
3556 for(
unsigned int i = 0; i < intWildcards.size(); ++i)
3558 if(i + 1 < intWildcards.size() &&
3559 intWildcards[i] + 1 == intWildcards[i + 1])
3571 (isFirst ?
"" :
",") +
3572 std::to_string(intWildcards[i]);
3577 if(intWildcards[hyphenLo] + 1 ==
3580 (isFirst ?
"" :
",") +
3582 intWildcards[hyphenLo]) +
3583 "," + std::to_string(intWildcards[i]);
3586 (isFirst ?
"" :
",") +
3588 intWildcards[hyphenLo]) +
3589 "-" + std::to_string(intWildcards[i]);
3599 hostFixedWildcardLength =
3603 __COUTV__(hostArrayString);
3604 __COUTV__(hostFixedWildcardLength);
3614 auto result = nodeTypeToObjectMap.at(typeString)
3615 .emplace(std::make_pair(
3616 nodeName, std::vector<std::string /*property*/>()));
3619 __SS__ <<
"Impossible printer syntax handling result! Collision of "
3620 "base names. Please notify "
3621 "admins or try to simplify record naming convention."
3626 nodeTypeToObjectMap.at(typeString)
3628 .push_back(status ?
"1" :
"0");
3630 nodeTypeToObjectMap.at(typeString).at(nodeName).push_back(hostname);
3632 nodeTypeToObjectMap.at(typeString).at(nodeName).push_back(subsystemId);
3633 if(multiNodeNames.size() > 1)
3635 nodeTypeToObjectMap.at(typeString)
3637 .push_back(multiNodeString);
3639 nodeTypeToObjectMap.at(typeString)
3641 .push_back(std::to_string(nodeFixedWildcardLength));
3643 if(hostnameArray.size() > 1)
3645 nodeTypeToObjectMap.at(typeString)
3647 .push_back(hostArrayString);
3649 nodeTypeToObjectMap.at(typeString)
3651 .push_back(std::to_string(hostFixedWildcardLength));
3655 __COUTV__(multiNodeString);
3657 __COUTV__(hostArrayString);
3658 __COUT__ <<
"Done with extraction of node '" << nodeName <<
"'" << __E__;
3664 __COUT__ <<
"Done getting artdaq nodes." << __E__;
3666 return ARTDAQTableBase::info_;
3680 const std::map<std::string ,
3681 std::map<std::string ,
3682 std::vector<std::string /*property*/>>>& nodeTypeToObjectMap,
3683 const std::map<std::string ,
3684 std::string >& subsystemObjectMap)
3686 __COUT__ <<
"setAndActivateARTDAQSystem()" << __E__;
3688 const std::string& author = cfgMgr->
getUsername();
3699 GroupEditStruct configGroupEdit(ConfigurationManager::GroupType::CONFIGURATION_TYPE,
3702 unsigned int artdaqSupervisorRow = TableView::INVALID;
3709 bool needArtdaqSupervisorParents =
true;
3710 bool needArtdaqSupervisorCreation =
false;
3712 __COUTV__(artdaqContext);
3717 const std::string& activeContextGroupName =
3718 cfgMgr->getActiveGroupName(ConfigurationManager::GroupType::CONTEXT_TYPE);
3720 cfgMgr->getActiveGroupKey(ConfigurationManager::GroupType::CONTEXT_TYPE);
3721 const std::string& activeConfigGroupName = cfgMgr->getActiveGroupName(
3722 ConfigurationManager::GroupType::CONFIGURATION_TYPE);
3723 const TableGroupKey& activeConfigGroupKey = cfgMgr->getActiveGroupKey(
3724 ConfigurationManager::GroupType::CONFIGURATION_TYPE);
3726 __COUTV__(activeContextGroupName);
3727 __COUTV__(activeContextGroupKey);
3728 __COUTV__(activeConfigGroupName);
3729 __COUTV__(activeConfigGroupKey);
3730 __COUTV__(cfgMgr->
getNode(ConfigurationManager::XDAQ_CONTEXT_TABLE_NAME)
3731 .
getNode(artdaqContext->contextUID_)
3734 cfgMgr->
getNode(ConfigurationManager::XDAQ_CONTEXT_TABLE_NAME)
3735 .
getNode(artdaqContext->contextUID_)
3736 .
getNode(XDAQContextTable::colContext_.colLinkToApplicationTable_)
3739 cfgMgr->
getNode(ConfigurationManager::XDAQ_CONTEXT_TABLE_NAME)
3740 .
getNode(artdaqContext->contextUID_)
3741 .
getNode(XDAQContextTable::colContext_.colLinkToApplicationTable_)
3742 .
getNode(artdaqContext->applications_[0].applicationUID_)
3744 __COUTV__(artdaqContext->applications_[0].applicationUID_);
3745 __COUTV__(XDAQContextTable::colApplication_.colLinkToSupervisorTable_);
3747 cfgMgr->
getNode(ConfigurationManager::XDAQ_CONTEXT_TABLE_NAME)
3748 .
getNode(artdaqContext->contextUID_)
3749 .
getNode(XDAQContextTable::colContext_.colLinkToApplicationTable_)
3750 .
getNode(artdaqContext->applications_[0].applicationUID_)
3751 .
getNode(XDAQContextTable::colApplication_.colLinkToSupervisorTable_)
3755 cfgMgr->
getNode(ConfigurationManager::XDAQ_CONTEXT_TABLE_NAME)
3756 .
getNode(artdaqContext->contextUID_)
3757 .
getNode(XDAQContextTable::colContext_.colLinkToApplicationTable_)
3758 .
getNode(artdaqContext->applications_[0].applicationUID_)
3759 .
getNode(XDAQContextTable::colApplication_.colLinkToSupervisorTable_);
3764 needArtdaqSupervisorCreation =
true;
3766 artdaqSupervisorRow = artdaqSupervisorNode.
getRow();
3768 needArtdaqSupervisorParents =
false;
3772 needArtdaqSupervisorCreation =
true;
3774 __COUTV__(needArtdaqSupervisorCreation);
3777 if(!artdaqContext || needArtdaqSupervisorCreation)
3779 __COUT__ <<
"No artdaq Supervisor found! Creating..." << __E__;
3780 __COUTV__(needArtdaqSupervisorParents);
3782 std::string artdaqSupervisorUID;
3791 ARTDAQ_SUPERVISOR_TABLE,
true );
3795 std::stringstream ss;
3796 artdaqSupervisorTable.tableView_->print(ss);
3797 __COUT_MULTI__(0, ss.str());
3801 row = artdaqSupervisorTable.tableView_->
addRow(
3802 author,
true ,
"artdaqSupervisor");
3805 artdaqSupervisorUID =
3806 artdaqSupervisorTable.tableView_
3807 ->getDataView()[row][artdaqSupervisorTable.tableView_->
getColUID()];
3808 artdaqSupervisorRow = row;
3810 __COUTV__(artdaqSupervisorRow);
3811 __COUTV__(artdaqSupervisorUID);
3817 artdaqSupervisorTable.tableView_->
findCol(
3818 colARTDAQSupervisor_.colDAQInterfaceDebugLevel_));
3821 "${MRB_BUILDDIR}/../setup_ots.sh",
3823 artdaqSupervisorTable.tableView_->
findCol(
3824 colARTDAQSupervisor_.colDAQSetupScript_));
3828 ARTDAQ_READER_TABLE,
3830 artdaqSupervisorTable.tableView_->
findCol(
3831 colARTDAQSupervisor_.colLinkToBoardReaders_));
3835 artdaqSupervisorTable.tableView_->
findCol(
3836 colARTDAQSupervisor_.colLinkToBoardReadersGroupID_),
3837 artdaqSupervisorUID +
3841 ARTDAQ_BUILDER_TABLE,
3843 artdaqSupervisorTable.tableView_->
findCol(
3844 colARTDAQSupervisor_.colLinkToEventBuilders_));
3847 artdaqSupervisorTable.tableView_->
findCol(
3848 colARTDAQSupervisor_.colLinkToEventBuildersGroupID_),
3849 artdaqSupervisorUID +
3853 ARTDAQ_LOGGER_TABLE,
3855 artdaqSupervisorTable.tableView_->
findCol(
3856 colARTDAQSupervisor_.colLinkToDataLoggers_));
3859 artdaqSupervisorTable.tableView_->
findCol(
3860 colARTDAQSupervisor_.colLinkToDataLoggersGroupID_),
3861 artdaqSupervisorUID +
3865 ARTDAQ_DISPATCHER_TABLE,
3867 artdaqSupervisorTable.tableView_->
findCol(
3868 colARTDAQSupervisor_.colLinkToDispatchers_));
3871 artdaqSupervisorTable.tableView_->
findCol(
3872 colARTDAQSupervisor_.colLinkToDispatchersGroupID_),
3873 artdaqSupervisorUID +
3878 ARTDAQ_ROUTER_TABLE,
3880 artdaqSupervisorTable.tableView_->
findCol(
3881 colARTDAQSupervisor_.colLinkToRoutingManagers_));
3884 artdaqSupervisorTable.tableView_->
findCol(
3885 colARTDAQSupervisor_.colLinkToRoutingManagersGroupID_),
3886 artdaqSupervisorUID +
3891 std::stringstream ss;
3892 artdaqSupervisorTable.tableView_->print(ss);
3893 __COUT_MULTI__(0, ss.str());
3900 ConfigurationManager::GroupType::CONTEXT_TYPE, cfgMgr);
3903 ConfigurationManager::XDAQ_CONTEXT_TABLE_NAME,
true );
3905 ConfigurationManager::XDAQ_APPLICATION_TABLE_NAME,
true );
3907 ConfigurationManager::XDAQ_APP_PROPERTY_TABLE_NAME,
3914 std::string contextUID;
3915 std::string contextAppGroupID;
3917 if(needArtdaqSupervisorParents)
3920 row = contextTable.tableView_->
addRow(
3921 author,
true ,
"artdaqContext");
3927 contextTable.tableView_
3928 ->getDataView()[row][contextTable.tableView_->
getColUID()];
3931 __COUTV__(contextUID);
3935 "http://${HOSTNAME}",
3937 contextTable.tableView_->
findCol(
3938 XDAQContextTable::colContext_.colAddress_));
3941 contextTable.tableView_->
findCol(
3942 XDAQContextTable::colContext_.colPort_),
3948 ConfigurationManager::XDAQ_APPLICATION_TABLE_NAME,
3950 contextTable.tableView_->
findCol(
3951 XDAQContextTable::colContext_.colLinkToApplicationTable_));
3954 contextTable.tableView_->
findCol(
3955 XDAQContextTable::colContext_.colLinkToApplicationGroupID_),
3956 "artdaqContextApps");
3958 __COUTV__(contextAppGroupID);
3962 std::string appPropertiesGroupID;
3968 if(needArtdaqSupervisorParents)
3972 unsigned int c = appTable.tableView_->
findCol(
3973 XDAQContextTable::colApplication_.colClass_);
3974 for(
unsigned int r = 0;
3975 r < appTable.tableView_->getNumberOfRows();
3977 if(appTable.tableView_->getDataView()[r][c] ==
3978 ARTDAQ_SUPERVISOR_CLASS)
3981 <<
"Found partially existing artdaq Supervisor "
3983 << appTable.tableView_->getDataView()
3985 <<
"'... Disabling it." << __E__;
3992 row = appTable.tableView_->
addRow(
3993 author,
true ,
"artdaqSupervisor");
4000 ->getDataView()[row][appTable.tableView_->
getColUID()];
4007 ARTDAQ_SUPERVISOR_CLASS,
4010 XDAQContextTable::colApplication_.colClass_));
4013 "${OTSDAQ_LIB}/libARTDAQSupervisor.so",
4016 XDAQContextTable::colApplication_.colModule_));
4021 appTable.tableView_->
findCol(XDAQContextTable::colApplication_
4022 .colApplicationGroupID_));
4026 ConfigurationManager::XDAQ_APP_PROPERTY_TABLE_NAME,
4028 appTable.tableView_->
findCol(XDAQContextTable::colApplication_
4029 .colLinkToPropertyTable_));
4032 appTable.tableView_->
findCol(XDAQContextTable::colApplication_
4033 .colLinkToPropertyGroupID_),
4034 appUID +
"Properties");
4036 __COUTV__(appPropertiesGroupID);
4040 __COUT__ <<
"Getting row of existing parent supervisor." << __E__;
4044 cfgMgr->
getNode(ConfigurationManager::XDAQ_CONTEXT_TABLE_NAME)
4045 .
getNode(artdaqContext->contextUID_)
4046 .
getNode(XDAQContextTable::colContext_
4047 .colLinkToApplicationTable_)
4048 .
getNode(artdaqContext->applications_[0].applicationUID_)
4057 ARTDAQ_SUPERVISOR_TABLE,
4060 XDAQContextTable::colApplication_.colLinkToSupervisorTable_));
4062 artdaqSupervisorUID,
4065 XDAQContextTable::colApplication_.colLinkToSupervisorUID_));
4070 if(needArtdaqSupervisorParents)
4074 const std::vector<std::string> propertyUIDs = {
"Partition0",
4077 "BoardReaderTimeout",
4078 "EventBuilderTimeout",
4079 "DataLoggerTimeout",
4080 "DispatcherTimeout"};
4081 const std::vector<std::string> propertyNames = {
4083 "productsdir_for_bash_scripts",
4084 "max_fragment_size_bytes",
4085 "boardreader_timeout",
4086 "eventbuilder_timeout",
4087 "datalogger_timeout",
4088 "dispatcher_timeout"
4090 const std::vector<std::string> propertyValues = {
4100 for(
unsigned int i = 0; i < propertyNames.size(); ++i)
4103 row = appPropertyTable.tableView_->
addRow(
4106 appUID + propertyUIDs[i]);
4109 "1", row, appPropertyTable.tableView_->
getColStatus());
4113 "ots::SupervisorProperty",
4115 appPropertyTable.tableView_->
findCol(
4116 XDAQContextTable::colAppProperty_.colPropertyType_));
4121 appPropertyTable.tableView_->
findCol(
4122 XDAQContextTable::colAppProperty_.colPropertyName_));
4127 appPropertyTable.tableView_->
findCol(
4128 XDAQContextTable::colAppProperty_.colPropertyValue_));
4131 appPropertiesGroupID,
4133 appPropertyTable.tableView_->
findCol(
4134 XDAQContextTable::colAppProperty_.colPropertyGroupID_));
4139 std::stringstream ss;
4140 contextTable.tableView_->print(ss);
4141 __COUT_MULTI__(0, ss.str());
4144 std::stringstream ss;
4145 appTable.tableView_->print(ss);
4146 __COUT_MULTI__(0, ss.str());
4149 std::stringstream ss;
4150 appPropertyTable.tableView_->print(ss);
4151 __COUT_MULTI__(0, ss.str());
4154 contextTable.tableView_
4156 appTable.tableView_->
init();
4157 appPropertyTable.tableView_
4163 <<
"Table errors while creating ARTDAQ Supervisor. Erasing all newly "
4164 "created table versions."
4169 __COUT_INFO__ <<
"Edits complete for new artdaq Supervisor! Created '"
4170 << appUID <<
"'" << __E__;
4174 __SS__ <<
"DEBUG blocking artdaq supervisor save!" << __E__;
4178 contextGroupEdit.saveChanges(contextGroupEdit.originalGroupName_,
4190 artdaqSupervisorRow =
4191 cfgMgr->
getNode(ConfigurationManager::XDAQ_CONTEXT_TABLE_NAME)
4192 .
getNode(artdaqContext->contextUID_)
4193 .
getNode(XDAQContextTable::colContext_.colLinkToApplicationTable_)
4194 .
getNode(artdaqContext->applications_[0].applicationUID_)
4195 .
getNode(XDAQContextTable::colApplication_.colLinkToSupervisorTable_)
4199 __COUT__ <<
"------------------------- artdaq nodes to save:" << __E__;
4200 for(
auto& subsystemPair : subsystemObjectMap)
4202 __COUTV__(subsystemPair.first);
4206 for(
auto& nodeTypePair : nodeTypeToObjectMap)
4208 __COUTV__(nodeTypePair.first);
4210 for(
auto& nodePair : nodeTypePair.second)
4212 __COUTV__(nodePair.first);
4216 __COUT__ <<
"------------------------- end artdaq nodes to save." << __E__;
4220 __COUTV__(artdaqSupervisorRow);
4221 if(artdaqSupervisorRow >= TableView::INVALID)
4223 __SS__ <<
"Invalid artdaq Supervisor row " << artdaqSupervisorRow <<
" found!"
4238 ARTDAQ_SUPERVISOR_TABLE,
true );
4242 std::string artdaqSupervisorUID =
4243 artdaqSupervisorTable.tableView_
4244 ->getDataView()[artdaqSupervisorRow]
4245 [artdaqSupervisorTable.tableView_->
getColUID()];
4248 if(artdaqSupervisorTable.tableView_
4249 ->getDataView()[artdaqSupervisorRow]
4250 [artdaqSupervisorTable.tableView_->
findCol(
4251 colARTDAQSupervisor_.colLinkToBoardReaders_)] ==
4252 TableViewColumnInfo::DATATYPE_LINK_DEFAULT)
4254 __COUT__ <<
"Fixing missing link to Readers" << __E__;
4256 ARTDAQ_READER_TABLE,
4257 artdaqSupervisorRow,
4258 artdaqSupervisorTable.tableView_->
findCol(
4259 colARTDAQSupervisor_.colLinkToBoardReaders_));
4261 artdaqSupervisorRow,
4262 artdaqSupervisorTable.tableView_->
findCol(
4263 colARTDAQSupervisor_.colLinkToBoardReadersGroupID_),
4264 artdaqSupervisorUID +
4269 if(artdaqSupervisorTable.tableView_
4270 ->getDataView()[artdaqSupervisorRow]
4271 [artdaqSupervisorTable.tableView_->
findCol(
4272 colARTDAQSupervisor_.colLinkToEventBuilders_)] ==
4273 TableViewColumnInfo::DATATYPE_LINK_DEFAULT)
4275 __COUT__ <<
"Fixing missing link to Builders" << __E__;
4277 ARTDAQ_BUILDER_TABLE,
4278 artdaqSupervisorRow,
4279 artdaqSupervisorTable.tableView_->
findCol(
4280 colARTDAQSupervisor_.colLinkToEventBuilders_));
4282 artdaqSupervisorRow,
4283 artdaqSupervisorTable.tableView_->
findCol(
4284 colARTDAQSupervisor_.colLinkToEventBuildersGroupID_),
4285 artdaqSupervisorUID +
4290 if(artdaqSupervisorTable.tableView_
4291 ->getDataView()[artdaqSupervisorRow]
4292 [artdaqSupervisorTable.tableView_->
findCol(
4293 colARTDAQSupervisor_.colLinkToDataLoggers_)] ==
4294 TableViewColumnInfo::DATATYPE_LINK_DEFAULT)
4296 __COUT__ <<
"Fixing missing link to Loggers" << __E__;
4298 ARTDAQ_LOGGER_TABLE,
4299 artdaqSupervisorRow,
4300 artdaqSupervisorTable.tableView_->
findCol(
4301 colARTDAQSupervisor_.colLinkToDataLoggers_));
4303 artdaqSupervisorRow,
4304 artdaqSupervisorTable.tableView_->
findCol(
4305 colARTDAQSupervisor_.colLinkToDataLoggersGroupID_),
4306 artdaqSupervisorUID +
4311 if(artdaqSupervisorTable.tableView_
4312 ->getDataView()[artdaqSupervisorRow]
4313 [artdaqSupervisorTable.tableView_->
findCol(
4314 colARTDAQSupervisor_.colLinkToDispatchers_)] ==
4315 TableViewColumnInfo::DATATYPE_LINK_DEFAULT)
4317 __COUT__ <<
"Fixing missing link to Dispatchers" << __E__;
4319 ARTDAQ_DISPATCHER_TABLE,
4320 artdaqSupervisorRow,
4321 artdaqSupervisorTable.tableView_->
findCol(
4322 colARTDAQSupervisor_.colLinkToDispatchers_));
4324 artdaqSupervisorRow,
4325 artdaqSupervisorTable.tableView_->
findCol(
4326 colARTDAQSupervisor_.colLinkToDispatchersGroupID_),
4327 artdaqSupervisorUID +
4332 if(artdaqSupervisorTable.tableView_
4333 ->getDataView()[artdaqSupervisorRow]
4334 [artdaqSupervisorTable.tableView_->
findCol(
4335 colARTDAQSupervisor_.colLinkToRoutingManagers_)] ==
4336 TableViewColumnInfo::DATATYPE_LINK_DEFAULT)
4338 __COUT__ <<
"Fixing missing link to Routers" << __E__;
4340 ARTDAQ_ROUTER_TABLE,
4341 artdaqSupervisorRow,
4342 artdaqSupervisorTable.tableView_->
findCol(
4343 colARTDAQSupervisor_.colLinkToRoutingManagers_));
4345 artdaqSupervisorRow,
4346 artdaqSupervisorTable.tableView_->
findCol(
4347 colARTDAQSupervisor_.colLinkToRoutingManagersGroupID_),
4348 artdaqSupervisorUID +
4353 std::stringstream ss;
4354 artdaqSupervisorTable.tableView_->print(ss);
4355 __COUT_MULTI__(0, ss.str());
4361 ARTDAQ_SUBSYSTEM_TABLE,
true );
4364 artdaqSubsystemTable.tableView_->deleteAllRows();
4366 for(
auto& subsystemPair : subsystemObjectMap)
4368 __COUTV__(subsystemPair.first);
4369 __COUTV__(subsystemPair.second);
4372 row = artdaqSubsystemTable.tableView_->
addRow(
4373 author,
true , subsystemPair.first);
4375 if(subsystemPair.second !=
"" &&
4376 subsystemPair.second != TableViewColumnInfo::DATATYPE_STRING_DEFAULT &&
4377 subsystemPair.second != NULL_SUBSYSTEM_DESTINATION_LABEL)
4381 ARTDAQ_SUBSYSTEM_TABLE,
4383 artdaqSubsystemTable.tableView_->
findCol(
4384 colARTDAQSubsystem_.colLinkToDestination_));
4386 subsystemPair.second,
4388 artdaqSubsystemTable.tableView_->
findCol(
4389 colARTDAQSubsystem_.colLinkToDestinationUID_));
4396 for(
auto& nodeTypePair : nodeTypeToObjectMap)
4398 __COUTV__(nodeTypePair.first);
4402 auto it =
processTypes_.mapToTable_.find(nodeTypePair.first);
4405 __SS__ <<
"Invalid artdaq node type '" << nodeTypePair.first
4406 <<
"' attempted!" << __E__;
4409 __COUTV__(it->second);
4419 if(nodeTypePair.second.size())
4422 __COUT__ <<
"Ignoring missing table '" << it->second
4423 <<
"' since there were no user records attempted of type '"
4424 << nodeTypePair.first <<
".'" << __E__;
4431 bool hasArtProcessName =
false;
4432 unsigned int artProcessNameCol = -1;
4436 __COUT__ <<
"Identified non-Reader, no-Router type '"
4437 << nodeTypePair.first
4438 <<
"' that has an art link and thus Process Name, so creating "
4439 "table edit structure to ART table."
4442 ARTDAQTableBase::ARTDAQ_ART_TABLE,
true );
4445 std::stringstream ss;
4446 artTable->tableView_->print(ss);
4447 __COUT_MULTI__(1, ss.str());
4449 artProcessNameCol = artTable->tableView_->
findCol(
4450 ARTDAQTableBase::colARTDAQArt_.colProcessName_);
4451 __COUTTV__(artProcessNameCol);
4453 hasArtProcessName =
true;
4455 __COUTV__(hasArtProcessName);
4457 const unsigned int commentCol =
4458 typeTable.tableView_->
findColByType(TableViewColumnInfo::TYPE_COMMENT);
4459 const unsigned int authorCol =
4460 typeTable.tableView_->
findColByType(TableViewColumnInfo::TYPE_AUTHOR);
4461 const unsigned int timestampCol =
4462 typeTable.tableView_->
findColByType(TableViewColumnInfo::TYPE_TIMESTAMP);
4465 std::map<
unsigned int ,
bool > deleteRecordMap;
4466 unsigned int maxRowToDelete = typeTable.tableView_->getNumberOfRows();
4467 for(
unsigned int r = 0; r < typeTable.tableView_->getNumberOfRows(); ++r)
4468 deleteRecordMap.emplace(std::make_pair(
4471 __COUTTV__(maxRowToDelete);
4477 const unsigned int ORIG_MAP_ART_PROC_NAME_COL = -1;
4478 std::map<std::string ,
4479 std::map<
unsigned int , std::string >>
4480 originalMultinodeValues;
4481 std::map<std::string ,
4482 std::map<
unsigned int ,
4485 originalMultinodeSameSiblingValues;
4488 std::map<
unsigned int ,
4490 std::vector<std::string >>>>
4491 originalMultinodeAllSiblingEmbeddedName;
4494 std::map<
unsigned int ,
4496 std::vector<std::string >>>>
4497 originalMultinodeAllSiblingEmbeddedPrinterIndex;
4500 for(
auto& nodePair : nodeTypePair.second)
4502 __COUTV__(nodePair.first);
4505 std::vector<std::string> nodeIndices, hostnameIndices;
4506 unsigned int hostnameFixedWidth = 0, nodeNameFixedWidth = 0;
4507 std::string hostname;
4514 for(
unsigned int i = 0; i < nodePair.second.size(); ++i)
4516 __COUTV__(nodePair.second[i]);
4520 std::string nodeName;
4526 if(nodePair.second[i][0] ==
':')
4528 __COUT__ <<
"Handling original multi-node." << __E__;
4533 std::string lastOriginalName;
4534 std::vector<std::string> originalParameterArr =
4536 &(nodePair.second[i].c_str()[1]),
4539 if(originalParameterArr.size() != 3)
4541 __SS__ <<
"Illegal original name parameter string '"
4542 << nodePair.second[i] <<
"!'" << __E__;
4548 unsigned int fixedWidth;
4549 sscanf(originalParameterArr[0].c_str(),
"%u", &fixedWidth);
4550 __COUTV__(fixedWidth);
4552 std::vector<std::string> printerSyntaxArr =
4557 std::vector<std::string> originalNodeIndices;
4558 for(
auto& printerSyntaxValue : printerSyntaxArr)
4560 __COUTV__(printerSyntaxValue);
4562 std::vector<std::string> printerSyntaxRange =
4564 printerSyntaxValue, {
'-'} );
4566 if(printerSyntaxRange.size() == 0 ||
4567 printerSyntaxRange.size() > 2)
4569 __SS__ <<
"Illegal multi-node printer syntax string '"
4570 << printerSyntaxValue <<
"!'" << __E__;
4573 else if(printerSyntaxRange.size() == 1)
4575 __COUTV__(printerSyntaxRange[0]);
4576 originalNodeIndices.push_back(printerSyntaxRange[0]);
4580 unsigned int lo, hi;
4581 sscanf(printerSyntaxRange[0].c_str(),
"%u", &lo);
4582 sscanf(printerSyntaxRange[1].c_str(),
"%u", &hi);
4586 sscanf(printerSyntaxRange[0].c_str(),
"%u", &hi);
4588 for(; lo <= hi; ++lo)
4591 originalNodeIndices.push_back(std::to_string(lo));
4596 __COUTTV__(originalParameterArr[2]);
4598 originalParameterArr[2] = originalParameterArr[2].substr(
4599 0, originalParameterArr[2].find(
";status="));
4600 __COUTV__(originalParameterArr[2]);
4601 std::vector<std::string> originalNamePieces =
4606 if(originalNamePieces.size() < 2)
4608 __SS__ <<
"Illegal original multi-node name template - "
4609 "please use * to indicate where the multi-node "
4610 "index should be inserted!"
4617 std::stringstream ss;
4618 typeTable.tableView_->print(ss);
4619 __COUT_MULTI__(1, ss.str());
4624 <<
"originalMultinodeSameSiblingValues init col map for "
4625 << nodePair.first << __E__;
4626 originalMultinodeSameSiblingValues.emplace(std::make_pair(
4632 __COUT__ <<
"originalMultinodeAllSiblingEmbeddedName init "
4634 << nodePair.first << __E__;
4635 originalMultinodeAllSiblingEmbeddedName.emplace(std::make_pair(
4644 __COUT__ <<
"originalMultinodeAllSiblingEmbeddedPrinterIndex "
4646 << nodePair.first << __E__;
4647 originalMultinodeAllSiblingEmbeddedPrinterIndex.emplace(
4660 unsigned int originalRow = TableView::INVALID,
4661 lastOriginalRow = TableView::INVALID,
4662 lastArtProcessRow = TableView::INVALID;
4663 for(
unsigned int i = 0; i < originalNodeIndices.size(); ++i)
4665 std::string originalName = originalNamePieces[0];
4666 std::string nodeNameIndex;
4667 for(
unsigned int p = 1; p < originalNamePieces.size();
4670 nodeNameIndex = originalNodeIndices[i];
4673 if(nodeNameIndex.size() > fixedWidth)
4675 __SS__ <<
"Illegal original node name index '"
4677 <<
"' - length is longer than fixed "
4678 "width requirement of "
4679 << fixedWidth <<
"!" << __E__;
4684 while(nodeNameIndex.size() < fixedWidth)
4685 nodeNameIndex =
"0" + nodeNameIndex;
4688 originalName += nodeNameIndex + originalNamePieces[p];
4690 __COUTTV__(originalName);
4691 originalRow = typeTable.tableView_->
findRow(
4696 __COUTTV__(originalRow);
4700 auto result = originalMultinodeValues.emplace(
4701 std::make_pair(originalName,
4702 std::map<
unsigned int ,
4706 <<
"originalName '" << originalName
4707 <<
"' already in original multinode value cache."
4711 __COUT__ <<
"Saving multinode value " << originalName
4712 <<
"[" << originalRow
4713 <<
"][*] with row count = "
4714 << typeTable.tableView_->getNumberOfRows()
4718 for(
unsigned int col = 0;
4719 col < typeTable.tableView_->getNumberOfColumns();
4722 if(typeTable.tableView_->getColumnInfo(col)
4725 ARTDAQ_TYPE_TABLE_SUBSYSTEM_LINK ||
4726 typeTable.tableView_->getColumnInfo(col)
4729 ARTDAQ_TYPE_TABLE_SUBSYSTEM_LINK_UID ||
4730 typeTable.tableView_->getColumnInfo(col)
4733 ARTDAQ_TYPE_TABLE_HOSTNAME ||
4734 typeTable.tableView_->getColumnInfo(col)
4737 typeTable.tableView_->getColumnInfo(col)
4739 col == timestampCol ||
4746 <<
"Caching node value: " << originalName
4747 <<
"[" << originalRow <<
"][" << col
4749 << typeTable.tableView_
4750 ->getColumnInfo(col)
4753 << typeTable.tableView_
4754 ->getDataView()[originalRow][col]
4756 originalMultinodeValues.at(originalName)
4757 .emplace(std::make_pair(
4759 typeTable.tableView_
4760 ->getDataView()[originalRow]
4765 for(
const auto& pair :
4766 originalMultinodeSameSiblingValues)
4767 __COUTT__ <<
"originalMultinodeSameSiblin"
4769 << pair.first <<
"]" << __E__;
4771 originalMultinodeSameSiblingValues
4773 .emplace(std::make_pair(
4778 typeTable.tableView_
4780 [originalRow][col])));
4782 for(
const auto& pair :
4783 originalMultinodeAllSiblingEmbeddedName)
4784 __COUTT__ <<
"originalMultinodeAllSibling"
4786 << pair.first <<
"]" << __E__;
4787 originalMultinodeAllSiblingEmbeddedName
4789 .emplace(std::make_pair(
4792 typeTable.tableView_
4795 .find(originalName) !=
4798 std::vector<std::string>())));
4800 for(
const auto& pair :
4801 originalMultinodeAllSiblingEmbeddedPrinterIndex)
4802 __COUTT__ <<
"originalMultinodeAllSibling"
4803 "EmbeddedPrinterIndex["
4804 << pair.first <<
"]" << __E__;
4805 originalMultinodeAllSiblingEmbeddedPrinterIndex
4807 .emplace(std::make_pair(
4810 typeTable.tableView_
4813 .find(nodeNameIndex) !=
4816 std::vector<std::string>())));
4822 originalMultinodeSameSiblingValues
4828 originalMultinodeAllSiblingEmbeddedName
4832 if(originalMultinodeAllSiblingEmbeddedName
4838 <<
"Determine string splits for "
4841 const std::string& val =
4842 typeTable.tableView_
4843 ->getDataView()[originalRow]
4845 size_t pos = val.find(originalName);
4846 originalMultinodeAllSiblingEmbeddedName
4850 val.substr(0, pos));
4851 originalMultinodeAllSiblingEmbeddedName
4854 .second.push_back(val.substr(
4855 pos + originalName.size()));
4857 originalMultinodeAllSiblingEmbeddedName
4863 originalMultinodeAllSiblingEmbeddedPrinterIndex
4867 if(originalMultinodeAllSiblingEmbeddedPrinterIndex
4872 __COUTT__ <<
"Determine string "
4873 "splits for embedded "
4874 "printer syntax index: "
4875 << nodeNameIndex << __E__;
4876 const std::string& val =
4877 typeTable.tableView_
4878 ->getDataView()[originalRow]
4880 size_t pos = val.find(nodeNameIndex);
4881 originalMultinodeAllSiblingEmbeddedPrinterIndex
4885 val.substr(0, pos));
4886 originalMultinodeAllSiblingEmbeddedPrinterIndex
4889 .second.push_back(val.substr(
4890 pos + nodeNameIndex.size()));
4892 originalMultinodeAllSiblingEmbeddedPrinterIndex
4900 if(originalMultinodeSameSiblingValues
4905 __COUTT__ <<
"Checking sibling same "
4907 << nodePair.first << __E__;
4908 if(typeTable.tableView_
4909 ->getDataView()[originalRow]
4911 typeTable.tableView_->getDataView()
4912 [lastOriginalRow][col])
4915 <<
"Found different sibling "
4918 << nodePair.first << __E__;
4919 originalMultinodeSameSiblingValues
4925 if(originalMultinodeAllSiblingEmbeddedName
4930 __COUTT__ <<
"Checking sibling "
4931 "embedded name... for "
4932 << nodePair.first <<
":"
4933 << originalName << __E__;
4934 if(typeTable.tableView_
4935 ->getDataView()[originalRow]
4937 .find(originalName) ==
4940 __COUT__ <<
"Found no embedded "
4942 << col <<
" looking for "
4943 << originalName << __E__;
4944 originalMultinodeAllSiblingEmbeddedName
4950 if(originalMultinodeAllSiblingEmbeddedPrinterIndex
4956 <<
"Checking sibling embedded "
4957 "printer syntax index... for "
4958 << nodePair.first <<
":"
4959 << nodeNameIndex << __E__;
4960 if(typeTable.tableView_
4961 ->getDataView()[originalRow]
4963 .find(nodeNameIndex) ==
4966 __COUT__ <<
"Found no embedded "
4969 << col <<
" looking for "
4972 originalMultinodeAllSiblingEmbeddedPrinterIndex
4981 <<
"originalMultinodeSameSiblingValues["
4982 << nodePair.first <<
"][" << col <<
"] = "
4983 << originalMultinodeSameSiblingValues
4989 <<
"originalMultinodeAllSiblingEmbeddedNa"
4991 << nodePair.first <<
"][" << col <<
"] = "
4992 << originalMultinodeAllSiblingEmbeddedName
4998 <<
"originalMultinodeAllSiblingEmbeddedPr"
5000 << nodePair.first <<
"][" << col <<
"] = "
5001 << originalMultinodeAllSiblingEmbeddedPrinterIndex
5007 if(hasArtProcessName && artTable &&
5008 typeTable.tableView_->getColumnInfo(col)
5010 ARTDAQTableBase::colARTDAQNotReader_
5015 <<
"Checking ART Process Name... for "
5017 << originalName <<
"' / "
5018 << typeTable.tableView_
5019 ->getDataView()[originalRow]
5022 unsigned int artRow =
5023 artTable->tableView_->
findRow(
5026 typeTable.tableView_
5027 ->getDataView()[originalRow]
5032 <<
"Found ART Process Name = "
5033 << artTable->tableView_->getDataView()
5034 [artRow][artProcessNameCol]
5038 originalMultinodeValues.at(originalName)
5039 .emplace(std::make_pair(
5040 ORIG_MAP_ART_PROC_NAME_COL,
5041 artTable->tableView_
5044 [artProcessNameCol]));
5046 originalMultinodeValues
5048 .at(ORIG_MAP_ART_PROC_NAME_COL));
5051 originalMultinodeSameSiblingValues
5053 .emplace(std::make_pair(
5054 ORIG_MAP_ART_PROC_NAME_COL,
5058 artTable->tableView_
5061 [artProcessNameCol])));
5062 originalMultinodeAllSiblingEmbeddedName
5064 .emplace(std::make_pair(
5065 ORIG_MAP_ART_PROC_NAME_COL,
5067 artTable->tableView_
5071 .find(originalName) !=
5074 std::vector<std::string>())));
5075 originalMultinodeAllSiblingEmbeddedPrinterIndex
5077 .emplace(std::make_pair(
5078 ORIG_MAP_ART_PROC_NAME_COL,
5080 artTable->tableView_
5088 std::vector<std::string>())));
5094 originalMultinodeSameSiblingValues
5096 .at(ORIG_MAP_ART_PROC_NAME_COL)
5100 originalMultinodeAllSiblingEmbeddedName
5102 .at(ORIG_MAP_ART_PROC_NAME_COL)
5104 if(originalMultinodeAllSiblingEmbeddedName
5106 .at(ORIG_MAP_ART_PROC_NAME_COL)
5110 <<
"Determine string splits "
5113 const std::string& val =
5114 artTable->tableView_
5117 [artProcessNameCol];
5119 val.find(originalName);
5120 originalMultinodeAllSiblingEmbeddedName
5122 .at(ORIG_MAP_ART_PROC_NAME_COL)
5124 val.substr(0, pos));
5125 originalMultinodeAllSiblingEmbeddedName
5127 .at(ORIG_MAP_ART_PROC_NAME_COL)
5128 .second.push_back(val.substr(
5130 originalName.size()));
5132 originalMultinodeAllSiblingEmbeddedName
5134 .at(ORIG_MAP_ART_PROC_NAME_COL)
5138 originalMultinodeAllSiblingEmbeddedPrinterIndex
5140 .at(ORIG_MAP_ART_PROC_NAME_COL)
5142 if(originalMultinodeAllSiblingEmbeddedPrinterIndex
5144 .at(ORIG_MAP_ART_PROC_NAME_COL)
5148 <<
"Determine string splits "
5149 "for embedded printer "
5151 << nodeNameIndex << __E__;
5152 const std::string& val =
5153 artTable->tableView_
5156 [artProcessNameCol];
5158 val.find(nodeNameIndex);
5159 originalMultinodeAllSiblingEmbeddedPrinterIndex
5161 .at(ORIG_MAP_ART_PROC_NAME_COL)
5163 val.substr(0, pos));
5164 originalMultinodeAllSiblingEmbeddedPrinterIndex
5166 .at(ORIG_MAP_ART_PROC_NAME_COL)
5167 .second.push_back(val.substr(
5169 nodeNameIndex.size()));
5171 originalMultinodeAllSiblingEmbeddedPrinterIndex
5173 .at(ORIG_MAP_ART_PROC_NAME_COL)
5179 if(originalMultinodeSameSiblingValues
5181 .at(ORIG_MAP_ART_PROC_NAME_COL)
5184 __COUTT__ <<
"Checking sibling "
5185 "same values... for "
5188 if(artTable->tableView_
5191 [artProcessNameCol] !=
5192 artTable->tableView_
5195 [artProcessNameCol])
5198 <<
"Found different "
5200 "at artProcessNameCol="
5201 << artProcessNameCol
5205 originalMultinodeSameSiblingValues
5207 .at(ORIG_MAP_ART_PROC_NAME_COL)
5211 if(originalMultinodeAllSiblingEmbeddedName
5213 .at(ORIG_MAP_ART_PROC_NAME_COL)
5217 <<
"Checking sibling "
5218 "embedded name... for "
5219 << nodePair.first <<
":"
5220 << originalName << __E__;
5221 if(artTable->tableView_
5225 .find(originalName) ==
5229 <<
"Found no embedded "
5231 "artProcessNameCol="
5232 << artProcessNameCol
5234 << originalName << __E__;
5235 originalMultinodeAllSiblingEmbeddedName
5237 .at(ORIG_MAP_ART_PROC_NAME_COL)
5241 if(originalMultinodeAllSiblingEmbeddedPrinterIndex
5243 .at(ORIG_MAP_ART_PROC_NAME_COL)
5247 <<
"Checking sibling "
5248 "embedded printer syntax "
5250 << nodePair.first <<
":"
5251 << nodeNameIndex << __E__;
5252 if(artTable->tableView_
5256 .find(nodeNameIndex) ==
5260 <<
"Found no embedded "
5261 "printer syntax index "
5262 "at artProcessNameCol="
5263 << artProcessNameCol
5265 << nodeNameIndex << __E__;
5266 originalMultinodeAllSiblingEmbeddedPrinterIndex
5268 .at(ORIG_MAP_ART_PROC_NAME_COL)
5275 <<
"originalMultinodeSameSiblingValue"
5277 << nodePair.first <<
"]["
5278 << ORIG_MAP_ART_PROC_NAME_COL
5280 << originalMultinodeSameSiblingValues
5282 .at(ORIG_MAP_ART_PROC_NAME_COL)
5286 <<
"originalMultinodeAllSiblingEmbedd"
5288 << nodePair.first <<
"]["
5289 << ORIG_MAP_ART_PROC_NAME_COL
5291 << originalMultinodeAllSiblingEmbeddedName
5293 .at(ORIG_MAP_ART_PROC_NAME_COL)
5297 <<
"originalMultinodeAllSiblingEmbedd"
5299 << nodePair.first <<
"]["
5300 << ORIG_MAP_ART_PROC_NAME_COL
5302 << originalMultinodeAllSiblingEmbeddedPrinterIndex
5304 .at(ORIG_MAP_ART_PROC_NAME_COL)
5309 <<
"Checking ART Process Name "
5310 "complete for originalName='"
5311 << originalName <<
"' / "
5312 << typeTable.tableView_
5313 ->getDataView()[originalRow]
5327 lastOriginalRow = originalRow;
5329 __COUTTV__(lastOriginalRow);
5330 lastOriginalName = originalName;
5333 for(
const auto& pair :
5334 originalMultinodeSameSiblingValues.at(nodePair.first))
5335 __COUTT__ <<
"originalMultinodeSameSiblingValues["
5336 << nodePair.first <<
"][" << pair.first
5337 <<
"] = " << pair.second.first << __E__;
5338 for(
const auto& pair :
5339 originalMultinodeAllSiblingEmbeddedName.at(
5341 __COUTT__ <<
"originalMultinodeAllSiblingEmbeddedName["
5342 << nodePair.first <<
"][" << pair.first
5343 <<
"] = " << pair.second.first << __E__;
5344 for(
const auto& pair :
5345 originalMultinodeAllSiblingEmbeddedPrinterIndex.at(
5348 <<
"originalMultinodeAllSiblingEmbeddedPrinterIndex["
5349 << nodePair.first <<
"][" << pair.first
5350 <<
"] = " << pair.second.first << __E__;
5352 __COUTTV__(lastOriginalRow);
5353 row = lastOriginalRow;
5358 std::string originalName = nodePair.second[i].substr(
5359 0, nodePair.second[i].find(
";status="));
5360 __COUTV__(originalName);
5363 row = typeTable.tableView_->
findRow(
5373 nodeName = nodePair.first;
5374 __COUTV__(nodeName);
5376 nodeName = nodeName.substr(0, nodeName.find(
";status="));
5379 std::string tmpNodeName = nodeName;
5381 for(
size_t c = 0; c < tmpNodeName.size(); ++c)
5382 if(tmpNodeName[c] !=
'*')
5383 nodeName += tmpNodeName[c];
5386 __COUTV__(nodeName);
5387 if(row == TableView::INVALID)
5390 row = typeTable.tableView_->
addRow(
5391 author,
true , nodeName);
5396 __COUT__ <<
"Handling new " << nodeTypePair.first
5397 <<
" defaults!" << __E__;
5400 ARTDAQTableBase::ARTDAQ_DAQ_PARAMETER_TABLE,
5405 ARTDAQTableBase::ARTDAQ_DAQ_PARAMETER_TABLE,
5407 typeTable.tableView_->
findCol(
5408 ARTDAQTableBase::colARTDAQReader_
5409 .colLinkToDaqParameters_));
5410 std::string daqParameterGroupID =
5413 typeTable.tableView_->
findCol(
5414 ARTDAQTableBase::colARTDAQReader_
5415 .colLinkToDaqParametersGroupID_),
5416 nodeName +
"DaqParameters");
5419 std::stringstream ss;
5420 typeTable.tableView_->print(ss);
5421 __COUT_MULTI__(1, ss.str());
5425 const std::vector<std::string> parameterUIDs = {
5426 "BoardID",
"FragmentID"};
5428 const std::vector<std::string> parameterNames = {
5432 const std::vector<std::string> parameterValues = {
5437 unsigned int parameterRow;
5438 for(
unsigned int i = 0; i < parameterNames.size(); ++i)
5441 parameterRow = daqParameterTable.tableView_->
addRow(
5444 nodeName + parameterUIDs[i]);
5455 daqParameterTable.tableView_->
findCol(
5456 ARTDAQTableBase::colARTDAQDaqParameter_
5457 .colDaqParameterKey_));
5462 daqParameterTable.tableView_->
findCol(
5463 ARTDAQTableBase::colARTDAQDaqParameter_
5464 .colDaqParameterValue_));
5467 daqParameterGroupID,
5469 daqParameterTable.tableView_->
findCol(
5470 ARTDAQTableBase::colARTDAQDaqParameter_
5471 .colDaqParameterGroupID_));
5475 daqParameterTable.tableView_
5483 __COUT__ <<
"Handling new " << nodeTypePair.first
5484 <<
" defaults!" << __E__;
5489 ARTDAQTableBase::ARTDAQ_DAQ_TABLE,
5492 unsigned int daqRecordRow = daqTable.tableView_->
addRow(
5496 std::string daqRecordUID =
5498 ->getDataView()[daqRecordRow]
5503 ARTDAQTableBase::ARTDAQ_DAQ_TABLE,
5505 typeTable.tableView_->
findCol(
5506 ARTDAQTableBase::colARTDAQNotReader_
5511 typeTable.tableView_->
findCol(
5512 ARTDAQTableBase::colARTDAQNotReader_
5513 .colLinkToDaqUID_));
5517 ARTDAQTableBase::ARTDAQ_DAQ_PARAMETER_TABLE,
5521 ARTDAQTableBase::ARTDAQ_DAQ_PARAMETER_TABLE,
5524 ARTDAQTableBase::colARTDAQDaq_
5525 .colLinkToDaqParameters_));
5526 std::string daqParameterGroupID =
5530 ARTDAQTableBase::colARTDAQDaq_
5531 .colLinkToDaqParametersGroupID_),
5532 nodeName +
"DaqParameters");
5535 const std::vector<std::string> parameterUIDs = {
5536 "BufferCount",
"FragmentsPerEvent"};
5538 const std::vector<std::string> parameterNames = {
5540 "expected_fragments_per_event"
5542 const std::vector<std::string> parameterValues = {
5547 unsigned int parameterRow;
5548 for(
unsigned int i = 0; i < parameterNames.size(); ++i)
5551 parameterRow = daqParameterTable.tableView_->
addRow(
5554 nodeName + parameterUIDs[i]);
5565 daqParameterTable.tableView_->
findCol(
5566 ARTDAQTableBase::colARTDAQDaqParameter_
5567 .colDaqParameterKey_));
5572 daqParameterTable.tableView_->
findCol(
5573 ARTDAQTableBase::colARTDAQDaqParameter_
5574 .colDaqParameterValue_));
5577 daqParameterGroupID,
5579 daqParameterTable.tableView_->
findCol(
5580 ARTDAQTableBase::colARTDAQDaqParameter_
5581 .colDaqParameterGroupID_));
5587 daqParameterTable.tableView_
5595 <<
"Reusing row " << row <<
" current-UID="
5596 << typeTable.tableView_
5597 ->getDataView()[row]
5599 <<
" as (temporarily to basename if multinode) new-UID="
5600 << nodeName << __E__;
5601 typeTable.tableView_
5610 if(row < maxRowToDelete)
5611 deleteRecordMap[row] =
false;
5618 artdaqSupervisorTable.tableView_
5619 ->getDataView()[artdaqSupervisorRow]
5620 [artdaqSupervisorTable.tableView_->
findCol(
5622 .at(nodeTypePair.first))],
5624 typeTable.tableView_->
findCol(
5626 nodeTypePair.first)));
5639 hostname = nodePair.second[i];
5643 typeTable.tableView_->
findCol(ARTDAQ_TYPE_TABLE_HOSTNAME));
5648 if(nodePair.second[i] !=
"" &&
5649 nodePair.second[i] !=
5650 TableViewColumnInfo::DATATYPE_STRING_DEFAULT)
5653 if(subsystemObjectMap.find(nodePair.second[i]) ==
5654 subsystemObjectMap.end())
5656 __SS__ <<
"Illegal subsystem '" << nodePair.second[i]
5657 <<
"' mismatch!" << __E__;
5662 ARTDAQ_SUBSYSTEM_TABLE,
5664 typeTable.tableView_->
findCol(
5665 ARTDAQ_TYPE_TABLE_SUBSYSTEM_LINK));
5669 typeTable.tableView_->
findCol(
5670 ARTDAQ_TYPE_TABLE_SUBSYSTEM_LINK_UID));
5675 TableViewColumnInfo::DATATYPE_LINK_DEFAULT,
5677 typeTable.tableView_->
findCol(
5678 ARTDAQ_TYPE_TABLE_SUBSYSTEM_LINK));
5682 i == 4 || i == 5 || i == 6 ||
5689 __COUT__ <<
"Handling printer syntax i=" << i << __E__;
5691 std::vector<std::string> printerSyntaxArr =
5695 if(printerSyntaxArr.size() == 2)
5697 if(printerSyntaxArr[0] ==
5700 sscanf(printerSyntaxArr[1].c_str(),
5702 &nodeNameFixedWidth);
5703 __COUTV__(nodeNameFixedWidth);
5706 else if(printerSyntaxArr[0] ==
5709 sscanf(printerSyntaxArr[1].c_str(),
5711 &hostnameFixedWidth);
5712 __COUTV__(hostnameFixedWidth);
5718 for(
auto& printerSyntaxValue : printerSyntaxArr)
5720 __COUTV__(printerSyntaxValue);
5722 std::vector<std::string> printerSyntaxRange =
5725 if(printerSyntaxRange.size() == 0 ||
5726 printerSyntaxRange.size() > 2)
5728 __SS__ <<
"Illegal multi-node printer syntax string '"
5729 << printerSyntaxValue <<
"!'" << __E__;
5732 else if(printerSyntaxRange.size() == 1)
5735 __COUTV__(printerSyntaxRange[0]);
5740 nodeIndices.push_back(printerSyntaxRange[0]);
5742 hostnameIndices.push_back(printerSyntaxRange[0]);
5746 unsigned int lo, hi;
5747 sscanf(printerSyntaxRange[0].c_str(),
"%u", &lo);
5748 sscanf(printerSyntaxRange[1].c_str(),
"%u", &hi);
5752 sscanf(printerSyntaxRange[0].c_str(),
"%u", &hi);
5754 for(; lo <= hi; ++lo)
5758 nodeIndices.push_back(std::to_string(lo));
5760 hostnameIndices.push_back(std::to_string(lo));
5767 __SS__ <<
"Unexpected parameter[" << i <<
" '"
5768 << nodePair.second[i] <<
"' for node " << nodePair.first
5774 __COUTV__(nodeIndices.size());
5775 __COUTV__(hostnameIndices.size());
5777 if(hostnameIndices.size())
5779 if(hostnameIndices.size() != nodeIndices.size())
5781 __SS__ <<
"Illegal associated hostname array has count "
5782 << hostnameIndices.size()
5783 <<
" which is not equal to the node count "
5784 << nodeIndices.size() <<
"!" << __E__;
5789 if(nodeIndices.size())
5791 unsigned int hostnameCol =
5792 typeTable.tableView_->
findCol(ARTDAQ_TYPE_TABLE_HOSTNAME);
5797 std::vector<std::string> namePieces =
5799 nodePair.first.substr(0, nodePair.first.find(
";status=")),
5803 if(namePieces.size() < 2)
5806 <<
"Illegal multi-node name template - please use * to "
5807 "indicate where the multi-node index should be inserted!"
5812 std::vector<std::string> hostnamePieces;
5813 if(hostnameIndices.size())
5819 if(hostnamePieces.size() < 2)
5822 <<
"Illegal hostname array template - please use * to "
5823 "indicate where the hostname index should be inserted!"
5829 bool isFirst =
true;
5830 unsigned int lastArtRow = TableView::INVALID;
5831 for(
unsigned int i = 0; i < nodeIndices.size(); ++i)
5833 std::string name = namePieces[0];
5834 std::string nodeNameIndex;
5835 for(
unsigned int p = 1; p < namePieces.size(); ++p)
5837 nodeNameIndex = nodeIndices[i];
5838 if(nodeNameFixedWidth > 1)
5840 if(nodeNameIndex.size() > nodeNameFixedWidth)
5842 __SS__ <<
"Illegal node name index '" << nodeNameIndex
5843 <<
"' - length is longer than fixed width "
5845 << nodeNameFixedWidth <<
"!" << __E__;
5850 while(nodeNameIndex.size() < nodeNameFixedWidth)
5851 nodeNameIndex =
"0" + nodeNameIndex;
5854 name += nodeNameIndex + namePieces[p];
5858 if(hostnamePieces.size())
5860 hostname = hostnamePieces[0];
5861 std::string hostnameIndex;
5862 for(
unsigned int p = 1; p < hostnamePieces.size(); ++p)
5864 hostnameIndex = hostnameIndices[i];
5865 if(hostnameFixedWidth > 1)
5867 if(hostnameIndex.size() > hostnameFixedWidth)
5869 __SS__ <<
"Illegal hostname index '"
5871 <<
"' - length is longer than fixed width "
5873 << hostnameFixedWidth <<
"!" << __E__;
5878 while(hostnameIndex.size() < hostnameFixedWidth)
5879 hostnameIndex =
"0" + hostnameIndex;
5882 hostname += hostnameIndex + hostnamePieces[p];
5884 __COUTV__(hostname);
5891 << author <<
"... Replacing row UID '"
5892 << typeTable.tableView_
5893 ->getDataView()[row]
5895 <<
"' with UID '" << name <<
"'" << __E__;
5898 if(row < maxRowToDelete)
5899 deleteRecordMap[row] =
false;
5904 << author <<
"... Copying row UID '"
5905 << typeTable.tableView_
5906 ->getDataView()[row]
5908 <<
"' to UID '" << name <<
"'" << __E__;
5909 unsigned int copyRow = typeTable.tableView_->
copyRows(
5911 *(typeTable.tableView_),
5918 if(row < maxRowToDelete)
5919 deleteRecordMap[copyRow] =
false;
5924 name, row, typeTable.tableView_->
getColUID());
5926 hostname, row, hostnameCol);
5929 TableViewColumnInfo::DATATYPE_COMMENT_DEFAULT,
5933 typeTable.tableView_->
setValue(time(0), row, timestampCol);
5935 __COUTTV__(typeTable
5937 ->getDataView()[row][commentCol]);
5938 __COUTTV__(typeTable
5940 ->getDataView()[row][authorCol]);
5941 __COUTTV__(typeTable
5943 ->getDataView()[row][timestampCol]);
5953 <<
"Looking for best original node match for row=" << row
5954 <<
" UID='" << name <<
"'" << __E__;
5955 size_t bestScore = 0;
5956 std::string bestOriginalNodeName;
5957 for(
const auto& originalNodePair : originalMultinodeValues)
5959 if(originalNodePair.second.find(
5960 ORIG_MAP_ART_PROC_NAME_COL) !=
5961 originalNodePair.second.end())
5962 __COUTTV__(originalNodePair.second.at(
5963 ORIG_MAP_ART_PROC_NAME_COL));
5965 for(
size_t c = 0, d = 0;
5966 c < originalNodePair.first.size() && d < name.size();
5969 if(name[d] == originalNodePair.first[c])
5971 else if(d + 1 < name.size() &&
5972 name[d + 1] == originalNodePair.first[c])
5974 else if(c + 1 < originalNodePair.first.size() &&
5975 name[d] == originalNodePair.first[c + 1])
5978 if(originalNodePair.first.size() == name.size())
5980 __COUTVS__(2, score);
5981 if(score > bestScore)
5983 bestOriginalNodeName = originalNodePair.first;
5985 __COUTVS__(2, bestOriginalNodeName);
5986 __COUTVS__(2, bestScore);
5990 bool exactMatch = (bestOriginalNodeName == name);
5991 bool needToHandleArtProcessName =
false;
5992 std::string artProcessName;
5995 originalMultinodeValues.find(bestOriginalNodeName) !=
5996 originalMultinodeValues.end())
5998 __COUT__ <<
"Populating original multinode value from '"
5999 << bestOriginalNodeName <<
"' into '" << name
6002 for(
const auto& valuePair :
6003 originalMultinodeValues.at(bestOriginalNodeName))
6006 if(!exactMatch && (valuePair.first == commentCol ||
6007 valuePair.first == authorCol ||
6008 valuePair.first == timestampCol))
6011 <<
"Not exact node name match, so keeping "
6012 "default meta info for node: "
6013 << name <<
"[" << row <<
"]["
6015 <<
"] /= " << valuePair.second <<
" keep= "
6016 << typeTable.tableView_
6017 ->getDataView()[row][valuePair.first]
6022 __COUTT__ <<
"Customizing node: " << name <<
"["
6023 << row <<
"][" << valuePair.first
6024 <<
"] = " << valuePair.second << __E__;
6026 if(valuePair.first == ORIG_MAP_ART_PROC_NAME_COL)
6028 __COUTT__ <<
"NEED Special art Process Name "
6030 << valuePair.second << __E__;
6031 needToHandleArtProcessName =
true;
6032 artProcessName = valuePair.second;
6035 valuePair.second, row, artProcessNameCol);
6039 valuePair.second, row, valuePair.first);
6043 __COUT__ <<
"Did not find '" << name
6044 <<
"' in original value cache. Looking for "
6045 "bestOriginalNodeName="
6046 << bestOriginalNodeName << __E__;
6048 __COUTV__(exactMatch);
6051 if(originalMultinodeSameSiblingValues.find(
6053 originalMultinodeSameSiblingValues.end())
6055 __COUT__ <<
"Applying multinode sibling same value "
6057 << row <<
" UID='" << name <<
"'" << __E__;
6058 for(
const auto& sameValuePair :
6059 originalMultinodeSameSiblingValues.at(
6062 if(!sameValuePair.second.first)
6065 <<
"Found originalMultinodeSameSiblingValues["
6066 << nodePair.first <<
"]["
6067 << sameValuePair.first <<
"] = "
6068 << sameValuePair.second.first <<
" --> "
6069 << sameValuePair.second.second << __E__;
6072 if(sameValuePair.first ==
6073 ORIG_MAP_ART_PROC_NAME_COL)
6075 __COUTT__ <<
"NEED Special art Process Name "
6077 << sameValuePair.second.second
6079 needToHandleArtProcessName =
true;
6080 artProcessName = sameValuePair.second.second;
6083 sameValuePair.second.second,
6089 sameValuePair.second.second,
6091 sameValuePair.first);
6096 if(originalMultinodeAllSiblingEmbeddedPrinterIndex.find(
6098 originalMultinodeAllSiblingEmbeddedPrinterIndex.end())
6100 __COUT__ <<
"Applying multinode sibling embbeded "
6101 "printer syntax index rules for row="
6102 << row <<
" UID='" << name
6103 <<
"' and printer index='" << nodeNameIndex
6105 for(
const auto& embedValuePair :
6106 originalMultinodeAllSiblingEmbeddedPrinterIndex
6107 .at(nodePair.first))
6109 if(!embedValuePair.second.first ||
6110 embedValuePair.second.second.size() < 2)
6114 "originalMultinodeAllSiblingEmbeddedPrinte"
6116 << nodePair.first <<
"]["
6117 << embedValuePair.first <<
"] = "
6118 << embedValuePair.second.first <<
" --> "
6120 embedValuePair.second.second)
6122 std::string embedValue =
6124 embedValuePair.second.second,
6126 __COUTTV__(embedValue);
6129 if(embedValuePair.first ==
6130 ORIG_MAP_ART_PROC_NAME_COL)
6132 __COUTT__ <<
"NEED Special art Process Name "
6134 << embedValue << __E__;
6135 needToHandleArtProcessName =
true;
6136 artProcessName = embedValue;
6139 embedValue, row, artProcessNameCol);
6143 embedValue, row, embedValuePair.first);
6147 if(originalMultinodeAllSiblingEmbeddedName.find(
6149 originalMultinodeAllSiblingEmbeddedName.end())
6151 __COUT__ <<
"Applying multinode sibling embbeded "
6152 "name rules for row="
6153 << row <<
" UID='" << name <<
"'" << __E__;
6154 for(
const auto& embedValuePair :
6155 originalMultinodeAllSiblingEmbeddedName.at(
6158 if(!embedValuePair.second.first ||
6159 embedValuePair.second.second.size() < 2)
6163 "originalMultinodeAllSiblingEmbeddedName["
6164 << nodePair.first <<
"]["
6165 << embedValuePair.first <<
"] = "
6166 << embedValuePair.second.first <<
" --> "
6168 embedValuePair.second.second)
6170 std::string embedValue =
6172 embedValuePair.second.second, name);
6173 __COUTTV__(embedValue);
6176 if(embedValuePair.first ==
6177 ORIG_MAP_ART_PROC_NAME_COL)
6179 __COUTT__ <<
"NEED Special art Process Name "
6181 << embedValue << __E__;
6182 needToHandleArtProcessName =
true;
6183 artProcessName = embedValue;
6186 embedValue, row, artProcessNameCol);
6190 embedValue, row, embedValuePair.first);
6194 __COUTV__(needToHandleArtProcessName);
6195 if(needToHandleArtProcessName)
6197 __COUTT__ <<
"Special art Process Name column value: "
6198 << artProcessName << __E__;
6200 std::string artRecord =
6201 typeTable.tableView_->getDataView()
6202 [row][typeTable.tableView_->
findCol(
6203 ARTDAQTableBase::colARTDAQNotReader_
6204 .colLinkToArtUID_)];
6205 __COUTTV__(artRecord);
6207 const unsigned int artCommentCol =
6209 TableViewColumnInfo::TYPE_COMMENT);
6210 const unsigned int artAuthorCol =
6212 TableViewColumnInfo::TYPE_AUTHOR);
6213 const unsigned int artTimestampCol =
6215 TableViewColumnInfo::TYPE_TIMESTAMP);
6217 unsigned int artRow = artTable->tableView_->
findRow(
6223 if(artRow == TableView::INVALID)
6225 __COUTT__ <<
"Need to make art Process record... "
6227 << artRecord << __E__;
6231 __COUTTV__(bestOriginalNodeName);
6232 const unsigned int bestMatchRow =
6233 typeTable.tableView_->
findRow(
6235 bestOriginalNodeName);
6236 __COUTTV__(bestMatchRow);
6238 std::string bestMatchArtRecord =
6239 typeTable.tableView_->getDataView()
6241 [typeTable.tableView_->
findCol(
6244 .colLinkToArtUID_)];
6245 __COUTTV__(bestMatchArtRecord);
6247 unsigned int bestMatchArtRow =
6248 artTable->tableView_->
findRow(
6253 __COUTTV__(bestMatchArtRow);
6254 if(bestMatchArtRow !=
6259 __COUTTV__(lastArtRow);
6262 if(lastArtRow != TableView::INVALID)
6264 __COUTT__ <<
"Copying art Process record... "
6266 << lastArtRow << __E__;
6267 unsigned int copyRow =
6270 *(artTable->tableView_),
6284 DATATYPE_COMMENT_DEFAULT,
6288 author, artRow, artAuthorCol);
6290 time(0), artRow, artTimestampCol);
6294 __COUTT__ <<
"Creating art Process record... "
6296 << artRecord << __E__;
6298 artRow = artTable->tableView_->
addRow(
6304 <<
"Made art Process record... artRecord="
6305 << artRecord << __E__;
6308 __COUTT__ <<
"Modify art Process record based on "
6309 "sibling rules... artRecord="
6311 <<
" artProcessName=" << artProcessName
6315 artProcessName, artRow, artProcessNameCol);
6316 lastArtRow = artRow;
6320 needToHandleArtProcessName)
6322 std::string artRecord =
6323 typeTable.tableView_->getDataView()
6324 [row][typeTable.tableView_->
findCol(
6325 ARTDAQTableBase::colARTDAQNotReader_
6326 .colLinkToArtUID_)];
6327 __COUTTV__(artRecord);
6328 unsigned int artRow = artTable->tableView_->
findRow(
6336 lastArtRow = artRow;
6339 __COUTTV__(lastArtRow);
6344 if(row < maxRowToDelete)
6345 __COUTTV__(deleteRecordMap[row]);
6347 __COUTTV__(typeTable
6349 ->getDataView()[row][commentCol]);
6350 __COUTTV__(typeTable
6352 ->getDataView()[row][authorCol]);
6353 __COUTTV__(typeTable
6355 ->getDataView()[row][timestampCol]);
6365 __COUT__ <<
"Deleting '" << nodeTypePair.first
6366 <<
"' records not specified..." << __E__;
6369 std::set<unsigned int> orderedRowSet;
6370 for(
auto& deletePair : deleteRecordMap)
6372 if(!deletePair.second)
6374 __COUTT__ <<
"Row keep = " << deletePair.first << __E__;
6378 __COUTT__ <<
"Row delete = " << deletePair.first << __E__;
6379 orderedRowSet.emplace(deletePair.first);
6383 for(std::set<unsigned int>::reverse_iterator rit = orderedRowSet.rbegin();
6384 rit != orderedRowSet.rend();
6390 if(TTEST(1) && artTable)
6392 std::stringstream ss;
6393 artTable->tableView_->print(ss);
6394 __COUT_MULTI__(1, ss.str());
6397 if(hasArtProcessName && artTable)
6398 artTable->tableView_
6403 std::stringstream ss;
6404 typeTable.tableView_->print(ss);
6405 __COUT_MULTI__(1, ss.str());
6408 typeTable.tableView_->
init();
6415 std::stringstream ss;
6416 artdaqSupervisorTable.tableView_->print(ss);
6417 __COUT_MULTI__(1, ss.str());
6420 std::stringstream ss;
6421 artdaqSubsystemTable.tableView_->print(ss);
6422 __COUT_MULTI__(1, ss.str());
6426 artdaqSupervisorTable.tableView_
6428 artdaqSubsystemTable.tableView_
6433 __COUT__ <<
"Table errors while creating ARTDAQ nodes. Erasing all newly "
6434 "created table versions."
6439 __COUT__ <<
"Edits complete for artdaq nodes and subsystems.. now save and activate "
6440 "groups, and update aliases!"
6446 __SS__ <<
"DEBUG blocking save!" << __E__;
6450 std::string localAccumulatedWarnings;
6451 configGroupEdit.saveChanges(configGroupEdit.originalGroupName_,
6452 newConfigurationGroupKey,
6459 &localAccumulatedWarnings);
<virtual so future plugins can inherit from multiple table base classes
static void outputDataReceiverFHICL(const ConfigurationTree &receiverNode, ARTDAQAppType appType, size_t maxFragmentSizeBytes=DEFAULT_MAX_FRAGMENT_SIZE, size_t routingTimeoutMs=DEFAULT_ROUTING_TIMEOUT_MS, size_t routingRetryCount=DEFAULT_ROUTING_RETRY_COUNT, std::string *returnFcl=nullptr)
static std::string insertModuleType(std::ostream &out, std::string &tabStr, std::string &commentStr, ConfigurationTree moduleTypeNode)
static bool isARTDAQEnabled(const ConfigurationManager *cfgMgr)
isARTDAQEnabled
static void setAndActivateARTDAQSystem(ConfigurationManagerRW *cfgMgr, const std::map< std::string, std::map< std::string, std::vector< std::string >>> &nodeTypeToObjectMap, const std::map< std::string, std::string > &subsystemObjectMap)
static struct ots::ARTDAQTableBase::ProcessTypes processTypes_
Note!!!! processTypes_ must be instantiate after the static artdaq table names (to construct map in c...
static void outputOnlineMonitorFHICL(const ConfigurationTree &onlineMonitorNode)
static void insertParameters(std::ostream &out, std::string &tabStr, std::string &commentStr, ConfigurationTree parameterLink, const std::string ¶meterPreamble, bool onlyInsertAtTableParameters=false, bool includeAtTableParameters=false)
static const ARTDAQInfo & getARTDAQSystem(ConfigurationManagerRW *cfgMgr, std::map< std::string, std::map< std::string, std::vector< std::string >>> &nodeTypeToObjectMap, std::map< std::string, std::string > &subsystemObjectMap, std::vector< std::string > &artdaqSupervisoInfo)
static void insertMetricsBlock(std::ostream &out, std::string &tabStr, std::string &commentStr, ConfigurationTree daqNode)
insertMetricsBlock
static void insertArtProcessBlock(std::ostream &out, std::string &tabStr, std::string &commentStr, ConfigurationTree art, ConfigurationTree subsystemLink=ConfigurationTree(), size_t routingTimeoutMs=DEFAULT_ROUTING_TIMEOUT_MS, size_t routingRetryCount=DEFAULT_ROUTING_RETRY_COUNT)
const std::string & getUsername(void) const
Getters.
ConfigurationTree getNode(const std::string &nodeString, bool doNotThrowOnBrokenUIDLinks=false) const
"root/parent/parent/"
const unsigned int & getRow(void) const
getRow
bool isDisconnected(void) const
ConfigurationTree getNode(const std::string &nodeName, bool doNotThrowOnBrokenUIDLinks=false) const
navigating between nodes
T getValueWithDefault(const T &defaultValue) const
const std::string & getValueAsString(bool returnLinkTableValue=false) const
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
const unsigned int & getNodeRow(void) const
getNodeRow
std::string str() const
alternative alias method
bool isUID(void) const
isUID
bool isGroupID(void) const
unsigned int findRow(unsigned int col, const T &value, unsigned int offsetRow=0, bool doNotThrow=false) const
< in included .icc source
void setValueAsString(const std::string &value, unsigned int row, unsigned int col)
unsigned int getColStatus(void) const
unsigned int findColByType(const std::string &type, unsigned int startingCol=0) const
unsigned int copyRows(const std::string &author, const TableView &src, unsigned int srcOffsetRow=0, unsigned int srcRowsToCopy=(unsigned int) -1, unsigned int destOffsetRow=(unsigned int) -1, unsigned char generateUniqueDataColumns=false, const std::string &baseNameAutoUID="")
const std::string & setUniqueColumnValue(unsigned int row, unsigned int col, std::string baseValueAsString="", bool doMathAppendStrategy=false, std::string childLinkIndex="", std::string groupId="")
unsigned int getColUID(void) const
unsigned int findCol(const std::string &name) const
void setValue(const T &value, unsigned int row, unsigned int col)
< in included .icc source
unsigned int addRow(const std::string &author="", unsigned char incrementUniqueData=false, const std::string &baseNameAutoUID="", unsigned int rowToAdd=(unsigned int) -1, std::string childLinkIndex="", std::string groupId="")
const XDAQContext * getTheARTDAQSupervisorContext(void) const
artdaq specific get methods
ARTDAQ DAQ Parameter Column names.
ARTDAQ Builder/Logger/Dispatcher Column names.
ARTDAQ Reader Column names.
ARTDAQ Subsystem Column names.
ARTDAQ Supervisor Column names.
TableEditStruct & getTableEditStruct(const std::string &tableName, bool markModified=false)
Note: if markModified, and table not found in group, this function will try to add it to group.
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 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 extractCommonChunks(const std::vector< std::string > &haystack, std::vector< std::string > &commonChunksToReturn, std::vector< std::string > &wildcardStrings, unsigned int &fixedWildcardLength)
static std::string mapToString(const std::map< std::string, T > &mapToReturn, const std::string &primaryDelimeter=", ", const std::string &secondaryDelimeter=": ")
static std::string decodeURIComponent(const std::string &data)
static std::string stackTrace(void)