1 #include "otsdaq-core/ConfigurationPluginDataFormats/XDAQContextConfiguration.h"
2 #include "otsdaq-core/Macros/ConfigurationPluginMacros.h"
3 #include "otsdaq-core/ConfigurationInterface/ConfigurationManager.h"
12 #define XDAQ_RUN_FILE std::string(getenv("XDAQ_CONFIGURATION_DATA_PATH")) + "/"+ std::string(getenv("XDAQ_CONFIGURATION_XML")) + ".xml"
17 XDAQContextConfiguration::XDAQContextConfiguration(
void)
44 XDAQContextConfiguration::~XDAQContextConfiguration(
void)
50 extractContexts(configManager);
55 fs.open(XDAQ_RUN_FILE, std::fstream::out | std::fstream::trunc);
58 __SS__ <<
"Failed to open XDAQ run file: " << XDAQ_RUN_FILE << std::endl;
59 throw std::runtime_error(ss.str());
61 outputXDAQXML((std::ostream &)fs);
89 bool XDAQContextConfiguration::isARTDAQContext(
const std::string &contextUID)
91 return (contextUID.find(
"ART") == 0 ||
92 contextUID.find(
"ARTDAQ") == 0);
102 unsigned int XDAQContextConfiguration::getARTDAQAppRank(
const std::string &contextUID)
const
107 unsigned int rank = 0;
109 for(
auto &i : artdaqBoardReaders_)
111 if(contexts_[i].contextUID_ == contextUID)
115 for(
auto &i : artdaqEventBuilders_)
117 if(contexts_[i].contextUID_ == contextUID)
121 for(
auto &i : artdaqAggregators_)
123 if(contexts_[i].contextUID_ == contextUID)
128 if(contextUID ==
"X")
131 __SS__ <<
"ARTDAQ rank could not be found for context UID '" <<
132 contextUID <<
"' - there were " << rank
133 <<
" active ARTDAQ context UID(s) checked." << std::endl;
134 __MOUT_ERR__ <<
"\n" << ss.str();
135 throw std::runtime_error(ss.str());
140 std::vector<const XDAQContextConfiguration::XDAQContext *> XDAQContextConfiguration::getBoardReaderContexts()
const
142 std::vector<const XDAQContext *> retVec;
143 for(
auto &i : artdaqBoardReaders_)
144 retVec.push_back(&contexts_[i]);
148 std::vector<const XDAQContextConfiguration::XDAQContext *> XDAQContextConfiguration::getEventBuilderContexts()
const
150 std::vector<const XDAQContext *> retVec;
151 for(
auto &i : artdaqEventBuilders_)
152 retVec.push_back(&contexts_[i]);
157 std::vector<const XDAQContextConfiguration::XDAQContext *> XDAQContextConfiguration::getAggregatorContexts()
const
159 std::vector<const XDAQContext *> retVec;
160 for(
auto &i : artdaqAggregators_)
161 retVec.push_back(&contexts_[i]);
167 const std::string &contextUID,
const std::string &appUID)
const
169 return configManager->__SELF_NODE__.getNode(
171 colContext_.colLinkToApplicationConfiguration_ +
"/" +
173 colApplication_.colLinkToSupervisorConfiguration_);
203 __MOUT__ <<
"*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*" << std::endl;
204 __MOUT__ << configManager->__SELF_NODE__ << std::endl;
209 auto children = configManager->__SELF_NODE__.getChildren();
212 artdaqContexts_.clear();
214 artdaqBoardReaders_.clear();
215 artdaqEventBuilders_.clear();
216 artdaqAggregators_.clear();
218 for(
auto &child:children)
220 contexts_.push_back(XDAQContext());
224 contexts_.back().contextUID_ = child.first;
226 contexts_.back().sourceConfig_ = child.second.getConfigurationName() +
"_v" +
227 child.second.getConfigurationVersion().toString() +
" @ " +
228 std::to_string(child.second.getConfigurationCreationTime());
229 child.second.getNode(colContext_.colContextUID_ ).getValue(contexts_.back().contextUID_);
230 child.second.getNode(colContext_.colStatus_ ).getValue(contexts_.back().status_);
231 child.second.getNode(colContext_.colId_ ).getValue(contexts_.back().id_);
232 child.second.getNode(colContext_.colAddress_ ).getValue(contexts_.back().address_);
233 child.second.getNode(colContext_.colPort_ ).getValue(contexts_.back().port_);
236 auto appLink = child.second.getNode(colContext_.colLinkToApplicationConfiguration_);
237 if(appLink.isDisconnected())
239 __SS__ <<
"Application link is disconnected!" << std::endl;
240 throw std::runtime_error(ss.str());
244 auto appChildren = appLink.getChildren();
245 for(
auto appChild:appChildren)
249 contexts_.back().applications_.push_back(XDAQApplication());
251 contexts_.back().applications_.back().applicationGroupID_ = child.first;
252 contexts_.back().applications_.back().sourceConfig_ = appChild.second.getConfigurationName() +
"_v" +
253 appChild.second.getConfigurationVersion().toString() +
" @ " +
254 std::to_string(appChild.second.getConfigurationCreationTime());
256 appChild.second.getNode(colApplication_.colApplicationUID_ ).getValue(contexts_.back().applications_.back().applicationUID_);
257 appChild.second.getNode(colApplication_.colStatus_ ).getValue(contexts_.back().applications_.back().status_);
258 appChild.second.getNode(colApplication_.colClass_ ).getValue(contexts_.back().applications_.back().class_);
259 appChild.second.getNode(colApplication_.colId_ ).getValue(contexts_.back().applications_.back().id_);
262 if(appChild.second.getNode(colApplication_.colInstance_ ).isDefaultValue())
263 contexts_.back().applications_.back().instance_ = 1;
265 appChild.second.getNode(colApplication_.colInstance_ ).getValue(contexts_.back().applications_.back().instance_);
267 if(appChild.second.getNode(colApplication_.colNetwork_ ).isDefaultValue())
268 contexts_.back().applications_.back().network_ =
"local";
270 appChild.second.getNode(colApplication_.colNetwork_ ).getValue(contexts_.back().applications_.back().network_);
272 if(appChild.second.getNode(colApplication_.colGroup_ ).isDefaultValue())
273 contexts_.back().applications_.back().group_ =
"daq";
275 appChild.second.getNode(colApplication_.colGroup_ ).getValue(contexts_.back().applications_.back().group_);
277 appChild.second.getNode(colApplication_.colModule_ ).getValue(contexts_.back().applications_.back().module_);
281 if(isARTDAQContext(contexts_.back().contextUID_))
283 artdaqContexts_.push_back(contexts_.size()-1);
285 if(contexts_.back().applications_.size() != 1)
287 __SS__ <<
"ARTDAQ Context '" << contexts_.back().contextUID_ <<
288 "' must have one Application! " <<
289 contexts_.back().applications_.size() <<
" were found. " << std::endl;
290 throw std::runtime_error(ss.str());
293 if(!contexts_.back().status_)
continue;
295 if(contexts_.back().applications_[0].class_ ==
296 "ots::ARTDAQDataManagerSupervisor")
297 artdaqBoardReaders_.push_back(contexts_.size()-1);
298 else if(contexts_.back().applications_[0].class_ ==
299 "ots::EventBuilderApp")
300 artdaqEventBuilders_.push_back(contexts_.size()-1);
301 else if(contexts_.back().applications_[0].class_ ==
302 "ots::AggregatorApp")
303 artdaqAggregators_.push_back(contexts_.size()-1);
306 __SS__ <<
"ARTDAQ Context must be have Application of an allowed class type:\n " <<
307 "\tots::ARTDAQDataManagerSupervisor\n" <<
308 "\tots::EventBuilderApp\n" <<
309 "\tots::AggregatorApp\n" <<
"\nClass found was " <<
310 contexts_.back().applications_[0].class_ << std::endl;
311 throw std::runtime_error(ss.str());
519 void XDAQContextConfiguration::outputXDAQXML(std::ostream &out)
528 out <<
"<?xml version='1.0'?>\n" <<
529 "<xc:Partition \txmlns:xsi\t= \"http://www.w3.org/2001/XMLSchema-instance\"\n" <<
530 "\t\txmlns:soapenc\t= \"http://schemas.xmlsoap.org/soap/encoding/\"\n" <<
531 "\t\txmlns:xc\t= \"http://xdaq.web.cern.ch/xdaq/xsd/2004/XMLConfiguration-30\">\n\n";
543 for(XDAQContext &context:contexts_)
548 sprintf(tmp,
"\t<!-- ContextUID='%s' sourceConfig='%s' -->",
549 context.contextUID_.c_str(), context.sourceConfig_.c_str());
555 sprintf(tmp,
"\t<xc:Context id=\"%u\" url=\"%s:%u\">", context.id_, context.address_.c_str(), context.port_);
556 out << tmp <<
"\n\n";
558 for(XDAQApplication &app:context.applications_)
565 sprintf(tmp,
"\t\t<!-- Application GroupID = '%s' UID='%s' sourceConfig='%s' -->",
566 app.applicationGroupID_.c_str(), app.applicationUID_.c_str(), app.sourceConfig_.c_str());
573 sprintf(tmp,
"\t\t<xc:Application class=\"%s\" id=\"%u\" instance=\"%u\" network=\"%s\" group=\"%s\"/>\n",
574 app.class_.c_str(), app.id_, app.instance_, app.network_.c_str(), app.group_.c_str());
577 sprintf(tmp,
"\t\t<xc:Module>%s</xc:Module>\n", app.module_.c_str());
580 if(context.status_ && !app.status_)
585 out <<
"\t</xc:Context>\n";
591 out <<
"</xc:Partition>\n\n\n";
596 std::string XDAQContextConfiguration::getContextUID(
const std::string &url)
const
598 for(
auto context: contexts_)
600 if(!context.status_)
continue;
602 if(url == context.address_ +
":" + std::to_string(context.port_))
603 return context.contextUID_;
609 std::string XDAQContextConfiguration::getApplicationUID(
const std::string &url,
unsigned int id)
const
611 for(
auto context: contexts_)
613 if(!context.status_)
continue;
615 if(url == context.address_ +
":" + std::to_string(context.port_))
616 for(
auto application: context.applications_)
618 if(!application.status_)
continue;
620 if(application.id_ ==
id)
622 return application.applicationUID_;