otsdaq  3.11.00
ARTDAQTableBase.h
1 #ifndef _ots_ARTDAQTableBase_h_
2 #define _ots_ARTDAQTableBase_h_
3 
4 #include "otsdaq/ConfigurationInterface/ConfigurationManager.h"
5 #include "otsdaq/ConfigurationInterface/ConfigurationManagerRW.h"
6 #include "otsdaq/TableCore/TableBase.h"
7 
9 #define OUT out << tabStr << commentStr
10 #define PUSHTAB tabStr += "\t"
11 #define POPTAB tabStr.resize(tabStr.size() - 1)
12 #define PUSHCOMMENT commentStr += "# "
13 #define POPCOMMENT commentStr.resize(commentStr.size() - 2)
14 
15 namespace ots
16 {
17 // clang-format off
18 class ARTDAQTableBase : virtual public TableBase
19 {
20  public:
22  ARTDAQTableBase(std::string tableName, std::string* accumulatedExceptions = 0);
23 
24  virtual ~ARTDAQTableBase(void);
25 
26  bool doGenFiles (ConfigurationManager* configManager);
27  virtual std::string getStructureAsJSON (const ConfigurationManager* /* configManager */) override;
28  virtual void genFlatFHiCL (void) { __SS__ << "genFlatFHiCL() Not defined!"; __SS_THROW__; };
29 
30 
31  static const std::string ARTDAQ_FCL_PATH;
32  static const std::string ARTDAQ_CONFIG_LAYOUTS_PATH;
33  static const bool ARTDAQ_DONOTWRITE_FCL;
34  static const std::string ARTDAQ_SUPERVISOR_CLASS, ARTDAQ_SUPERVISOR_TABLE;
35  static const std::string ARTDAQ_READER_TABLE, ARTDAQ_BUILDER_TABLE, ARTDAQ_LOGGER_TABLE, ARTDAQ_DISPATCHER_TABLE, ARTDAQ_MONITOR_TABLE, ARTDAQ_ROUTER_TABLE;
36  static const std::string ARTDAQ_SUBSYSTEM_TABLE, ARTDAQ_DAQ_TABLE, ARTDAQ_DAQ_PARAMETER_TABLE, ARTDAQ_ART_TABLE;
37  static const std::string ARTDAQ_TYPE_TABLE_HOSTNAME, ARTDAQ_TYPE_TABLE_ALLOWED_PROCESSORS, ARTDAQ_TYPE_TABLE_SUBSYSTEM_LINK, ARTDAQ_TYPE_TABLE_SUBSYSTEM_LINK_UID;
38 
39  enum class ARTDAQAppType
40  {
41  BoardReader,
42  EventBuilder,
43  DataLogger,
44  Dispatcher,
45  Monitor,
46  RoutingManager
47  };
48 
49  enum
50  {
51  DEFAULT_MAX_FRAGMENT_SIZE = 1048576,
52  DEFAULT_ROUTING_TIMEOUT_MS = 1000,
53  DEFAULT_ROUTING_RETRY_COUNT = 5,
54  };
55 
56  static const int NULL_SUBSYSTEM_DESTINATION;
57  static const std::string NULL_SUBSYSTEM_DESTINATION_LABEL;
58 
59  struct ProcessInfo
60  {
61  std::string label;
62  std::string hostname;
63  int subsystem;
64  int port;
65  bool status;
66  std::string allowed_processors;
67 
68  ProcessInfo(std::string l, std::string h, std::string procs, int s, ARTDAQAppType /*t*/, bool onOff, int p = -1)
69  : label(l), hostname(h), subsystem(s), port(p), status(onOff), allowed_processors(procs) {}
70  };
71 
73  {
74  int id;
75  std::string label;
76 
77  std::set<int> sources;
79 
80  bool eventMode;
81  bool hasRoutingManager;
82  std::string routingManagerHost;
83 
84  SubsystemInfo() : sources(), destination(0),eventMode(false), hasRoutingManager(false), routingManagerHost("") {}
85  };
86 
87  struct ARTDAQInfo
88  {
89  std::map<int /*subsystem ID*/, ARTDAQTableBase::SubsystemInfo> subsystems;
90  std::map<ARTDAQAppType, std::list<ProcessInfo>> processes;
91  };
92 
93  std::string getBootFileContent (ConfigurationTree artdaqSupervisorNode,
94  size_t maxFragmentSizeBytes = DEFAULT_MAX_FRAGMENT_SIZE,
95  size_t routingTimeoutMs = DEFAULT_ROUTING_TIMEOUT_MS,
96  size_t routingRetryCount = DEFAULT_ROUTING_RETRY_COUNT,
97  ProgressBar* progressBar = 0);
98  static std::string getBootFileContentFromInfo (const ARTDAQInfo& info, const std::string& setupScript, int debugLevel);
99  static const std::string& getTypeString (ARTDAQAppType type);
100  static std::string getFHICLFilename (ARTDAQAppType type, const std::string& name);
101  static std::string getFlatFHICLFilename (ARTDAQAppType type, const std::string& name);
102  static void flattenFHICL (ARTDAQAppType type, const std::string& name, std::string* returnFcl = nullptr);
103  static void flattenFHICLInParallel (ARTDAQAppType type, const std::vector<std::pair<std::string, std::string*>>& namesAndReturnFcls);
104 
105  static void insertParameters (std::ostream& out,
106  std::string& tabStr,
107  std::string& commentStr,
108  const std::string& parentPath,
109  ConfigurationTree parameterLink,
110  const std::string& parameterPreamble,
111  bool onlyInsertAtTableParameters = false,
112  bool includeAtTableParameters = false);
113  static std::string insertModuleType (std::ostream& out, std::string& tabStr, std::string& commentStr, const std::string& parentPath, ConfigurationTree moduleTypeNode);
114  static void insertMetricsBlock (std::ostream& out, std::string& tabStr, std::string& commentStr, const std::string& parentPath, ConfigurationTree daqNode);
115  static void insertArtProcessBlock (std::ostream& out, std::string& tabStr, std::string& commentStr, const std::string& parentPath, ConfigurationTree art,
116  ConfigurationTree subsystemLink = ConfigurationTree(),
117  size_t routingTimeoutMs = DEFAULT_ROUTING_TIMEOUT_MS,
118  size_t routingRetryCount = DEFAULT_ROUTING_RETRY_COUNT );
119 
120  static void outputBoardReaderFHICL (const ConfigurationTree& boardReaderNode,
121  size_t maxFragmentSizeBytes = DEFAULT_MAX_FRAGMENT_SIZE,
122  size_t routingTimeoutMs = DEFAULT_ROUTING_TIMEOUT_MS,
123  size_t routingRetryCount = DEFAULT_ROUTING_RETRY_COUNT);
124 
125  static void outputDataReceiverFHICL (const ConfigurationTree& receiverNode,
126  ARTDAQAppType appType,
127  size_t maxFragmentSizeBytes = DEFAULT_MAX_FRAGMENT_SIZE,
128  size_t routingTimeoutMs = DEFAULT_ROUTING_TIMEOUT_MS,
129  size_t routingRetryCount = DEFAULT_ROUTING_RETRY_COUNT,
130  std::string* returnFcl = nullptr);
131 
132  static void outputRoutingManagerFHICL (const ConfigurationTree& routingManagerNode,
133  size_t routingTimeoutMs = DEFAULT_ROUTING_TIMEOUT_MS,
134  size_t routingRetryCount = DEFAULT_ROUTING_RETRY_COUNT);
135 
136  static void outputOnlineMonitorFHICL (const ConfigurationTree& onlineMonitorNode);
137 
138  static bool isARTDAQEnabled (const ConfigurationManager* cfgMgr);
139  static const ARTDAQInfo& extractARTDAQInfo (ConfigurationTree artdaqSupervisorNode,
140  bool getStatusFalseNodes = false,
141  bool doWriteFHiCL = false,
142  size_t maxFragmentSizeBytes = DEFAULT_MAX_FRAGMENT_SIZE,
143  size_t routingTimeoutMs = DEFAULT_ROUTING_TIMEOUT_MS,
144  size_t routingRetryCount = DEFAULT_ROUTING_RETRY_COUNT,
145  ProgressBar* progressBar = 0);
146 
147  static const ARTDAQInfo& getARTDAQSystem (ConfigurationManagerRW* cfgMgr,
148  std::map<std::string /*type*/,
149  std::map<std::string /*record*/,
150  std::vector<std::string /*property*/>>>& nodeTypeToObjectMap,
151  std::map<std::string /*subsystemName*/,
152  std::string /*destinationSubsystemName*/>& subsystemObjectMap,
153  std::vector<std::string /*property*/>& artdaqSupervisoInfo,
154  bool suppressMultiNode = false);
155 
157  const std::map<std::string /*type*/,
158  std::map<std::string /*record*/,
159  std::vector<std::string /*property*/>>>& nodeTypeToObjectMap,
160  const std::map<std::string /*subsystemName*/,
161  std::string /*destinationSubsystemName*/>& subsystemObjectMap);
162 
163  private:
164  static int getSubsytemId (ConfigurationTree subsystemNode);
165  static void extractRoutingManagersInfo (ConfigurationTree artdaqSupervisorNode, bool getStatusFalseNodes, bool doWriteFHiCL, size_t routingTimeoutMs, size_t routingRetryCount);
166  static void extractBoardReadersInfo (ConfigurationTree artdaqSupervisorNode, bool getStatusFalseNodes, bool doWriteFHiCL, size_t maxFragmentSizeBytes, size_t routingTimeoutMs, size_t routingRetryCount);
167  static void extractEventBuildersInfo (ConfigurationTree artdaqSupervisorNode, bool getStatusFalseNodes, bool doWriteFHiCL, size_t maxFragmentSizeBytes);
168  static void extractDataLoggersInfo (ConfigurationTree artdaqSupervisorNode, bool getStatusFalseNodes, bool doWriteFHiCL, size_t maxFragmentSizeBytes);
169  static void extractDispatchersInfo (ConfigurationTree artdaqSupervisorNode, bool getStatusFalseNodes, bool doWriteFHiCL, size_t maxFragmentSizeBytes);
170  static void addCommentWhitespace (std::ostream& os, size_t lineLength);
171 
172  static ARTDAQInfo info_;
173 
174  protected:
175  std::map<ARTDAQAppType, std::map<std::string /*name*/, std::string /*fcl*/>> fclMap_; //cache for configure blob
176 
177  public:
178  static struct ProcessTypes
179  {
180  std::string const READER = "reader";
181  std::string const BUILDER = "builder";
182  std::string const LOGGER = "logger";
183  std::string const DISPATCHER = "dispatcher";
184  std::string const MONITOR = "monitor";
185  std::string const ROUTER = "router";
186 
187  ProcessTypes()
188  : mapToType_({
189  std::make_pair(READER, ARTDAQTableBase::ARTDAQAppType::BoardReader),
190  std::make_pair(BUILDER, ARTDAQTableBase::ARTDAQAppType::EventBuilder),
191  std::make_pair(LOGGER, ARTDAQTableBase::ARTDAQAppType::DataLogger),
192  std::make_pair(DISPATCHER, ARTDAQTableBase::ARTDAQAppType::Dispatcher),
193  std::make_pair(MONITOR, ARTDAQTableBase::ARTDAQAppType::Monitor),
194  std::make_pair(ROUTER, ARTDAQTableBase::ARTDAQAppType::RoutingManager)})
195  , mapToTable_({
196  std::make_pair(READER, ARTDAQTableBase::ARTDAQ_READER_TABLE),
197  std::make_pair(BUILDER, ARTDAQTableBase::ARTDAQ_BUILDER_TABLE),
198  std::make_pair(LOGGER, ARTDAQTableBase::ARTDAQ_LOGGER_TABLE),
199  std::make_pair(DISPATCHER, ARTDAQTableBase::ARTDAQ_DISPATCHER_TABLE),
200  std::make_pair(MONITOR, ARTDAQTableBase::ARTDAQ_MONITOR_TABLE),
201  std::make_pair(ROUTER, ARTDAQTableBase::ARTDAQ_ROUTER_TABLE)})
202  , mapToGroupIDAppend_({
203  std::make_pair(READER, "BoardReaders"),
204  std::make_pair(BUILDER, "EventBuilders"),
205  std::make_pair(LOGGER, "DataLoggers"),
206  std::make_pair(DISPATCHER, "Dispatchers"),
207  std::make_pair(MONITOR, "Monitors"),
208  std::make_pair(ROUTER, "RoutingManagers")})
209  , mapToLinkGroupIDColumn_({
210  std::make_pair(READER, ARTDAQTableBase::colARTDAQSupervisor_.colLinkToBoardReadersGroupID_),
211  std::make_pair(BUILDER, ARTDAQTableBase::colARTDAQSupervisor_.colLinkToEventBuildersGroupID_),
212  std::make_pair(LOGGER, ARTDAQTableBase::colARTDAQSupervisor_.colLinkToDataLoggersGroupID_),
213  std::make_pair(DISPATCHER, ARTDAQTableBase::colARTDAQSupervisor_.colLinkToDispatchersGroupID_),
214  std::make_pair(ROUTER, ARTDAQTableBase::colARTDAQSupervisor_.colLinkToRoutingManagersGroupID_)})
215  , mapToGroupIDColumn_({
216  std::make_pair(READER, "BoardReaderGroupID"),
217  std::make_pair(BUILDER, "EventBuilderGroupID"),
218  std::make_pair(LOGGER, "DataLoggerGroupID"),
219  std::make_pair(DISPATCHER, "DispatcherGroupID"),
220  std::make_pair(MONITOR, "MonitorGroupID"),
221  std::make_pair(ROUTER, "RoutingManagerGroupID")})
222  {}
223 
224  const std::map<std::string /*processType*/, ARTDAQTableBase::ARTDAQAppType> mapToType_;
225  const std::map<std::string /*processType*/, std::string /*typeTable*/> mapToTable_, mapToGroupIDAppend_, mapToLinkGroupIDColumn_, mapToGroupIDColumn_;
226  } processTypes_;
227 
229  static struct ColARTDAQSupervisor
230  {
231  std::string const colDAQInterfaceDebugLevel_ = "DAQInterfaceDebugLevel";
232  std::string const colDAQSetupScript_ = "DAQSetupScript";
233 
234  std::string const colLinkToBoardReaders_ = "BoardReadersLink";
235  std::string const colLinkToBoardReadersGroupID_ = "BoardReadersLinkGroupID";
236  std::string const colLinkToEventBuilders_ = "EventBuildersLink";
237  std::string const colLinkToEventBuildersGroupID_ = "EventBuildersLinkGroupID";
238  std::string const colLinkToDataLoggers_ = "DataLoggersLink";
239  std::string const colLinkToDataLoggersGroupID_ = "DataLoggersLinkGroupID";
240  std::string const colLinkToDispatchers_ = "DispatchersLink";
241  std::string const colLinkToDispatchersGroupID_ = "DispatchersLinkGroupID";
242  std::string const colLinkToRoutingManagers_ = "RoutingManagersLink";
243  std::string const colLinkToRoutingManagersGroupID_ = "RoutingManagersLinkGroupID";
244  } colARTDAQSupervisor_;
245 
247  static struct ColARTDAQSubsystem
248  {
249  std::string const colLinkToDestination_ = "SubsystemDestinationLink";
250  std::string const colLinkToDestinationUID_ = "SubsystemDestinationUID";
251  } colARTDAQSubsystem_;
252 
254  static struct ColARTDAQReader
255  {
256  std::string const colDaqFragmentIDs_ = "daqFragmentIDs";
257  std::string const colLinkToDaqParameters_ = "daqParametersLink";
258  std::string const colLinkToDaqParametersGroupID_ = "daqParametersLinkGroupID";
259  } colARTDAQReader_;
260 
262  static struct ColARTDAQNotReader
263  {
264  std::string const colLinkToDaq_ = "daqLink";
265  std::string const colLinkToDaqUID_ = "daqLinkUID";
266  std::string const colLinkToArt_ = "artLink";
267  std::string const colLinkToArtUID_ = "artLinkUID";
268  } colARTDAQNotReader_;
269 
271  static struct ColARTDAQDaq
272  {
273  std::string const colLinkToDaqParameters_ = "daqParametersLink";
274  std::string const colLinkToDaqParametersGroupID_ = "daqParametersLinkGroupID";
275  } colARTDAQDaq_;
276 
278  static struct ColARTDAQDaqParameter
279  {
280  std::string const colDaqParameterKey_ = "daqParameterKey";
281  std::string const colDaqParameterValue_ = "daqParameterValue";
282  std::string const colDaqParameterGroupID_ = "daqParameterGroupID";
283  } colARTDAQDaqParameter_;
284 
286  static struct ColARTDAQArt
287  {
288  std::string const colProcessName_ = "ProcessName";
289  } colARTDAQArt_;
290 };
291 // clang-format on
292 } // namespace ots
293 
294 #endif
<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 void insertArtProcessBlock(std::ostream &out, std::string &tabStr, std::string &commentStr, const std::string &parentPath, ConfigurationTree art, ConfigurationTree subsystemLink=ConfigurationTree(), size_t routingTimeoutMs=DEFAULT_ROUTING_TIMEOUT_MS, size_t routingRetryCount=DEFAULT_ROUTING_RETRY_COUNT)
static const std::string ARTDAQ_FCL_PATH
Tree-path rule is, if the last link in the path is a group link with a specified group ID,...
static std::string insertModuleType(std::ostream &out, std::string &tabStr, std::string &commentStr, const std::string &parentPath, ConfigurationTree moduleTypeNode)
static std::string getBootFileContentFromInfo(const ARTDAQInfo &info, const std::string &setupScript, int debugLevel)
static bool isARTDAQEnabled(const ConfigurationManager *cfgMgr)
isARTDAQEnabled
static void insertParameters(std::ostream &out, std::string &tabStr, std::string &commentStr, const std::string &parentPath, ConfigurationTree parameterLink, const std::string &parameterPreamble, bool onlyInsertAtTableParameters=false, bool includeAtTableParameters=false)
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)
std::string getBootFileContent(ConfigurationTree artdaqSupervisorNode, size_t maxFragmentSizeBytes=DEFAULT_MAX_FRAGMENT_SIZE, size_t routingTimeoutMs=DEFAULT_ROUTING_TIMEOUT_MS, size_t routingRetryCount=DEFAULT_ROUTING_RETRY_COUNT, ProgressBar *progressBar=0)
static void insertMetricsBlock(std::ostream &out, std::string &tabStr, std::string &commentStr, const std::string &parentPath, ConfigurationTree daqNode)
insertMetricsBlock
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, bool suppressMultiNode=false)
when true, skip multi-node "printer syntax" wildcard compression and emit one concrete record per nod...
defines used also by OtsConfigurationWizardSupervisor
ARTDAQ DAQ Parameter Column names.
ARTDAQ Builder/Logger/Dispatcher Column names.
ARTDAQ Reader Column names.
ARTDAQ Subsystem Column names.
ARTDAQ Supervisor Column names.
bool eventMode
Whether art sends events or Fragments.
int destination
destination subsystem id, 0 := no destination
std::set< int > sources
by subsystem id