tdaq-develop-2025-02-12
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  static const std::string ARTDAQ_FCL_PATH;
27  static const std::string ARTDAQ_SUPERVISOR_CLASS, ARTDAQ_SUPERVISOR_TABLE;
28  static const std::string ARTDAQ_READER_TABLE, ARTDAQ_BUILDER_TABLE, ARTDAQ_LOGGER_TABLE, ARTDAQ_DISPATCHER_TABLE, ARTDAQ_MONITOR_TABLE, ARTDAQ_ROUTER_TABLE;
29  static const std::string ARTDAQ_SUBSYSTEM_TABLE, ARTDAQ_DAQ_TABLE, ARTDAQ_DAQ_PARAMETER_TABLE;
30  static const std::string ARTDAQ_TYPE_TABLE_HOSTNAME, ARTDAQ_TYPE_TABLE_ALLOWED_PROCESSORS, ARTDAQ_TYPE_TABLE_SUBSYSTEM_LINK, ARTDAQ_TYPE_TABLE_SUBSYSTEM_LINK_UID;
31 
32  enum class ARTDAQAppType
33  {
34  BoardReader,
35  EventBuilder,
36  DataLogger,
37  Dispatcher,
38  Monitor,
39  RoutingManager
40  };
41 
42  enum
43  {
44  DEFAULT_MAX_FRAGMENT_SIZE = 1048576,
45  DEFAULT_ROUTING_TIMEOUT_MS = 1000,
46  DEFAULT_ROUTING_RETRY_COUNT = 5,
47  };
48 
49  static const int NULL_SUBSYSTEM_DESTINATION;
50  static const std::string NULL_SUBSYSTEM_DESTINATION_LABEL;
51 
52  struct ProcessInfo
53  {
54  std::string label;
55  std::string hostname;
56  int subsystem;
57  int port;
58  bool status;
59  std::string allowed_processors;
60 
61  ProcessInfo(std::string l, std::string h, std::string procs, int s, ARTDAQAppType /*t*/, bool onOff, int p = -1)
62  : label(l), hostname(h), subsystem(s), port(p), status(onOff), allowed_processors(procs) {}
63  };
64 
66  {
67  int id;
68  std::string label;
69 
70  std::set<int> sources;
72 
73  bool eventMode;
74  bool hasRoutingManager;
75  std::string routingManagerHost;
76 
77  SubsystemInfo() : sources(), destination(0),eventMode(false), hasRoutingManager(false), routingManagerHost("") {}
78  };
79 
80  struct ARTDAQInfo
81  {
82  std::map<int /*subsystem ID*/, ARTDAQTableBase::SubsystemInfo> subsystems;
83  std::map<ARTDAQAppType, std::list<ProcessInfo>> processes;
84  };
85 
86  static const std::string& getTypeString (ARTDAQAppType type);
87  static std::string getFHICLFilename (ARTDAQAppType type, const std::string& name);
88  static std::string getFlatFHICLFilename (ARTDAQAppType type, const std::string& name);
89  static void flattenFHICL (ARTDAQAppType type, const std::string& name);
90 
91  static void insertParameters (std::ostream& out,
92  std::string& tabStr,
93  std::string& commentStr,
94  ConfigurationTree parameterLink,
95  const std::string& parameterPreamble,
96  bool onlyInsertAtTableParameters = false,
97  bool includeAtTableParameters = false);
98  static std::string insertModuleType (std::ostream& out, std::string& tabStr, std::string& commentStr, ConfigurationTree moduleTypeNode);
99  static void insertMetricsBlock (std::ostream& out, std::string& tabStr, std::string& commentStr, ConfigurationTree daqNode);
100  static void insertArtProcessBlock(std::ostream& out, std::string& tabStr, std::string& commentStr, ConfigurationTree art,
101  ConfigurationTree subsystemLink = ConfigurationTree(),
102  size_t routingTimeoutMs = DEFAULT_ROUTING_TIMEOUT_MS,
103  size_t routingRetryCount = DEFAULT_ROUTING_RETRY_COUNT );
104 
105  static void outputBoardReaderFHICL (const ConfigurationTree& boardReaderNode,
106  size_t maxFragmentSizeBytes = DEFAULT_MAX_FRAGMENT_SIZE,
107  size_t routingTimeoutMs = DEFAULT_ROUTING_TIMEOUT_MS,
108  size_t routingRetryCount = DEFAULT_ROUTING_RETRY_COUNT);
109 
110  static void outputDataReceiverFHICL (const ConfigurationTree& receiverNode,
111  ARTDAQAppType appType,
112  size_t maxFragmentSizeBytes = DEFAULT_MAX_FRAGMENT_SIZE,
113  size_t routingTimeoutMs = DEFAULT_ROUTING_TIMEOUT_MS,
114  size_t routingRetryCount = DEFAULT_ROUTING_RETRY_COUNT);
115 
116  static void outputRoutingManagerFHICL (const ConfigurationTree& routingManagerNode,
117  size_t routingTimeoutMs = DEFAULT_ROUTING_TIMEOUT_MS,
118  size_t routingRetryCount = DEFAULT_ROUTING_RETRY_COUNT);
119 
120  static void outputOnlineMonitorFHICL (const ConfigurationTree& onlineMonitorNode);
121 
122  static bool isARTDAQEnabled (const ConfigurationManager* cfgMgr);
123  static const ARTDAQInfo& extractARTDAQInfo (ConfigurationTree artdaqSupervisorNode,
124  bool getStatusFalseNodes = false,
125  bool doWriteFHiCL = false,
126  size_t maxFragmentSizeBytes = DEFAULT_MAX_FRAGMENT_SIZE,
127  size_t routingTimeoutMs = DEFAULT_ROUTING_TIMEOUT_MS,
128  size_t routingRetryCount = DEFAULT_ROUTING_RETRY_COUNT,
129  ProgressBar* progressBar = 0);
130 
131  static const ARTDAQInfo& getARTDAQSystem (ConfigurationManagerRW* cfgMgr,
132  std::map<std::string /*type*/,
133  std::map<std::string /*record*/,
134  std::vector<std::string /*property*/>>>& nodeTypeToObjectMap,
135  std::map<std::string /*subsystemName*/,
136  std::string /*destinationSubsystemName*/>& subsystemObjectMap,
137  std::vector<std::string /*property*/>& artdaqSupervisoInfo);
138 
140  const std::map<std::string /*type*/,
141  std::map<std::string /*record*/,
142  std::vector<std::string /*property*/>>>& nodeTypeToObjectMap,
143  const std::map<std::string /*subsystemName*/,
144  std::string /*destinationSubsystemName*/>& subsystemObjectMap);
145 
146  private:
147  static int getSubsytemId (ConfigurationTree subsystemNode);
148  static void extractRoutingManagersInfo (ConfigurationTree artdaqSupervisorNode, bool getStatusFalseNodes, bool doWriteFHiCL, size_t routingTimeoutMs, size_t routingRetryCount);
149  static void extractBoardReadersInfo (ConfigurationTree artdaqSupervisorNode, bool getStatusFalseNodes, bool doWriteFHiCL, size_t maxFragmentSizeBytes, size_t routingTimeoutMs, size_t routingRetryCount);
150  static void extractEventBuildersInfo (ConfigurationTree artdaqSupervisorNode, bool getStatusFalseNodes, bool doWriteFHiCL, size_t maxFragmentSizeBytes);
151  static void extractDataLoggersInfo (ConfigurationTree artdaqSupervisorNode, bool getStatusFalseNodes, bool doWriteFHiCL, size_t maxFragmentSizeBytes);
152  static void extractDispatchersInfo (ConfigurationTree artdaqSupervisorNode, bool getStatusFalseNodes, bool doWriteFHiCL, size_t maxFragmentSizeBytes);
153 
154  static ARTDAQInfo info_;
155 
156  public:
157  static struct ProcessTypes
158  {
159  std::string const READER = "reader";
160  std::string const BUILDER = "builder";
161  std::string const LOGGER = "logger";
162  std::string const DISPATCHER = "dispatcher";
163  std::string const MONITOR = "monitor";
164  std::string const ROUTER = "router";
165 
166  ProcessTypes()
167  : mapToType_({
168  std::make_pair(READER, ARTDAQTableBase::ARTDAQAppType::BoardReader),
169  std::make_pair(BUILDER, ARTDAQTableBase::ARTDAQAppType::EventBuilder),
170  std::make_pair(LOGGER, ARTDAQTableBase::ARTDAQAppType::DataLogger),
171  std::make_pair(DISPATCHER, ARTDAQTableBase::ARTDAQAppType::Dispatcher),
172  std::make_pair(MONITOR, ARTDAQTableBase::ARTDAQAppType::Monitor),
173  std::make_pair(ROUTER, ARTDAQTableBase::ARTDAQAppType::RoutingManager)})
174  , mapToTable_({
175  std::make_pair(READER, ARTDAQTableBase::ARTDAQ_READER_TABLE),
176  std::make_pair(BUILDER, ARTDAQTableBase::ARTDAQ_BUILDER_TABLE),
177  std::make_pair(LOGGER, ARTDAQTableBase::ARTDAQ_LOGGER_TABLE),
178  std::make_pair(DISPATCHER, ARTDAQTableBase::ARTDAQ_DISPATCHER_TABLE),
179  std::make_pair(MONITOR, ARTDAQTableBase::ARTDAQ_MONITOR_TABLE),
180  std::make_pair(ROUTER, ARTDAQTableBase::ARTDAQ_ROUTER_TABLE)})
181  , mapToGroupIDAppend_({
182  std::make_pair(READER, "BoardReaders"),
183  std::make_pair(BUILDER, "EventBuilders"),
184  std::make_pair(LOGGER, "DataLoggers"),
185  std::make_pair(DISPATCHER, "Dispatchers"),
186  std::make_pair(MONITOR, "Monitors"),
187  std::make_pair(ROUTER, "RoutingManagers")})
188  , mapToLinkGroupIDColumn_({
189  std::make_pair(READER, ARTDAQTableBase::colARTDAQSupervisor_.colLinkToBoardReadersGroupID_),
190  std::make_pair(BUILDER, ARTDAQTableBase::colARTDAQSupervisor_.colLinkToEventBuildersGroupID_),
191  std::make_pair(LOGGER, ARTDAQTableBase::colARTDAQSupervisor_.colLinkToDataLoggersGroupID_),
192  std::make_pair(DISPATCHER, ARTDAQTableBase::colARTDAQSupervisor_.colLinkToDispatchersGroupID_),
193  std::make_pair(ROUTER, ARTDAQTableBase::colARTDAQSupervisor_.colLinkToRoutingManagersGroupID_)})
194  , mapToGroupIDColumn_({
195  std::make_pair(READER, "BoardReaderGroupID"),
196  std::make_pair(BUILDER, "EventBuilderGroupID"),
197  std::make_pair(LOGGER, "DataLoggerGroupID"),
198  std::make_pair(DISPATCHER, "DispatcherGroupID"),
199  std::make_pair(MONITOR, "MonitorGroupID"),
200  std::make_pair(ROUTER, "RoutingManagerGroupID")})
201  {}
202 
203  const std::map<std::string /*processType*/, ARTDAQTableBase::ARTDAQAppType> mapToType_;
204  const std::map<std::string /*processType*/, std::string /*typeTable*/> mapToTable_, mapToGroupIDAppend_, mapToLinkGroupIDColumn_, mapToGroupIDColumn_;
205  } processTypes_;
206 
208  static struct ColARTDAQSupervisor
209  {
210  std::string const colDAQInterfaceDebugLevel_ = "DAQInterfaceDebugLevel";
211  std::string const colDAQSetupScript_ = "DAQSetupScript";
212 
213  std::string const colLinkToBoardReaders_ = "BoardReadersLink";
214  std::string const colLinkToBoardReadersGroupID_ = "BoardReadersLinkGroupID";
215  std::string const colLinkToEventBuilders_ = "EventBuildersLink";
216  std::string const colLinkToEventBuildersGroupID_ = "EventBuildersLinkGroupID";
217  std::string const colLinkToDataLoggers_ = "DataLoggersLink";
218  std::string const colLinkToDataLoggersGroupID_ = "DataLoggersLinkGroupID";
219  std::string const colLinkToDispatchers_ = "DispatchersLink";
220  std::string const colLinkToDispatchersGroupID_ = "DispatchersLinkGroupID";
221  std::string const colLinkToRoutingManagers_ = "RoutingManagersLink";
222  std::string const colLinkToRoutingManagersGroupID_ = "RoutingManagersLinkGroupID";
223  } colARTDAQSupervisor_;
224 
226  static struct ColARTDAQSubsystem
227  {
228  std::string const colLinkToDestination_ = "SubsystemDestinationLink";
229  std::string const colLinkToDestinationUID_ = "SubsystemDestinationUID";
230  } colARTDAQSubsystem_;
231 
233  static struct ColARTDAQReader
234  {
235  std::string const colLinkToDaqParameters_ = "daqParametersLink";
236  std::string const colLinkToDaqParametersGroupID_ = "daqParametersLinkGroupID";
237  } colARTDAQReader_;
238 
240  static struct ColARTDAQNotReader
241  {
242  std::string const colLinkToDaq_ = "daqLink";
243  std::string const colLinkToDaqUID_ = "daqLinkUID";
244  } colARTDAQNotReader_;
245 
247  static struct ColARTDAQDaq
248  {
249  std::string const colLinkToDaqParameters_ = "daqParametersLink";
250  std::string const colLinkToDaqParametersGroupID_ = "daqParametersLinkGroupID";
251  } colARTDAQDaq_;
252 
254  static struct ColARTDAQDaqParameter
255  {
256  std::string const colDaqParameterKey_ = "daqParameterKey";
257  std::string const colDaqParameterValue_ = "daqParameterValue";
258  std::string const colDaqParameterGroupID_ = "daqParameterGroupID";
259  } colARTDAQDaqParameter_;
260 };
261 // clang-format on
262 } // namespace ots
263 
264 #endif
<virtual so future plugins can inherit from multiple table base classes
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 &parameterPreamble, 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)
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)
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