File indexing completed on 2024-04-06 12:06:55
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018 #include "CSCDQM_Collection.h"
0019 #include "Utilities/Xerces/interface/Xerces.h"
0020 #include <cstdio>
0021 #include <string>
0022 #include <xercesc/util/XMLString.hpp>
0023 #include <xercesc/util/TransService.hpp>
0024
0025 namespace cscdqm {
0026
0027
0028
0029
0030
0031 Collection::Collection(Configuration* const p_config) { config = p_config; }
0032
0033
0034
0035
0036
0037 void Collection::load() {
0038 LOG_INFO << "Reading histograms from " << config->getBOOKING_XML_FILE();
0039
0040 if (config->getBOOKING_XML_FILE().empty()) {
0041 return;
0042 }
0043
0044 try {
0045 cms::concurrency::xercesInitialize();
0046 {
0047 XercesDOMParser parser;
0048
0049 parser.setValidationScheme(XercesDOMParser::Val_Always);
0050 parser.setDoNamespaces(true);
0051 parser.setDoSchema(true);
0052 parser.setExitOnFirstFatalError(true);
0053 parser.setValidationConstraintFatal(true);
0054 XMLFileErrorHandler eh;
0055 parser.setErrorHandler(&eh);
0056 parser.parse(config->getBOOKING_XML_FILE().c_str());
0057
0058 DOMDocument* doc = parser.getDocument();
0059 DOMElement* docNode = doc->getDocumentElement();
0060 DOMNodeList* itemList = docNode->getChildNodes();
0061
0062 CoHisto definitions;
0063 for (XMLSize_t i = 0; i < itemList->getLength(); i++) {
0064 DOMNode* node = itemList->item(i);
0065 if (node->getNodeType() != DOMNode::ELEMENT_NODE) {
0066 continue;
0067 }
0068
0069 std::string nodeName = XMLString::transcode(node->getNodeName());
0070
0071
0072
0073
0074 if (nodeName == XML_BOOK_DEFINITION) {
0075 CoHistoProps dp;
0076 getNodeProperties(node, dp);
0077
0078 DOMElement* el = dynamic_cast<DOMElement*>(node);
0079 std::string id(XMLString::transcode(el->getAttribute(XMLString::transcode(XML_BOOK_DEFINITION_ID))));
0080 definitions.insert(make_pair(id, dp));
0081
0082 } else
0083
0084
0085
0086
0087 if (nodeName == XML_BOOK_HISTOGRAM) {
0088 CoHistoProps hp;
0089
0090 DOMElement* el = dynamic_cast<DOMElement*>(node);
0091 if (el->hasAttribute(XMLString::transcode(XML_BOOK_DEFINITION_REF))) {
0092 std::string id(XMLString::transcode(el->getAttribute(XMLString::transcode(XML_BOOK_DEFINITION_REF))));
0093
0094 CoHistoProps d = definitions[id];
0095 for (CoHistoProps::iterator it = d.begin(); it != d.end(); it++) {
0096 hp[it->first] = it->second;
0097 }
0098 }
0099
0100 getNodeProperties(node, hp);
0101
0102 std::string name = hp[XML_BOOK_HISTO_NAME];
0103 std::string prefix = hp[XML_BOOK_HISTO_PREFIX];
0104
0105
0106 hp[XML_BOOK_ONDEMAND] =
0107 (Utility::regexMatch(REGEXP_ONDEMAND, name) ? XML_BOOK_ONDEMAND_TRUE : XML_BOOK_ONDEMAND_FALSE);
0108
0109 LOG_DEBUG << "[Collection::load] loading " << prefix << "::" << name
0110 << " XML_BOOK_ONDEMAND = " << hp[XML_BOOK_ONDEMAND];
0111
0112 CoHistoMap::iterator it = collection.find(prefix);
0113 if (it == collection.end()) {
0114 CoHisto h;
0115 h[name] = hp;
0116 collection[prefix] = h;
0117 } else {
0118 it->second.insert(make_pair(name, hp));
0119 }
0120 }
0121 }
0122 }
0123
0124 cms::concurrency::xercesTerminate();
0125
0126 } catch (XMLException& e) {
0127 char* message = XMLString::transcode(e.getMessage());
0128 throw Exception(message);
0129 }
0130
0131 for (CoHistoMap::const_iterator i = collection.begin(); i != collection.end(); i++) {
0132 LOG_INFO << i->second.size() << " " << i->first << " histograms defined";
0133 }
0134 }
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144 void Collection::getNodeProperties(DOMNode*& node, CoHistoProps& p) {
0145 DOMNodeList* props = node->getChildNodes();
0146
0147 for (XMLSize_t j = 0; j < props->getLength(); j++) {
0148 DOMNode* node = props->item(j);
0149 if (node->getNodeType() != DOMNode::ELEMENT_NODE) {
0150 continue;
0151 }
0152 DOMElement* element = dynamic_cast<DOMElement*>(node);
0153 std::string name = XMLString::transcode(element->getNodeName());
0154
0155 const XMLCh* content = element->getTextContent();
0156 XERCES_CPP_NAMESPACE_QUALIFIER TranscodeToStr tc(content, "UTF-8");
0157 std::istringstream buffer((const char*)tc.str());
0158 std::string value = buffer.str();
0159
0160 DOMNamedNodeMap* attributes = node->getAttributes();
0161 if (attributes) {
0162 for (XMLSize_t i = 0; i < attributes->getLength(); i++) {
0163 DOMNode* attribute = attributes->item(i);
0164 std::string aname = XMLString::transcode(attribute->getNodeName());
0165 std::string avalue = XMLString::transcode(attribute->getNodeValue());
0166 p[name + "_" + aname] = avalue;
0167 }
0168 }
0169 p[name] = value;
0170 }
0171 }
0172
0173
0174
0175
0176
0177
0178
0179
0180 const bool Collection::checkHistoValue(const CoHistoProps& h, const std::string& name, std::string& value) {
0181 CoHistoProps::const_iterator i = h.find(name);
0182 if (i == h.end()) {
0183 return false;
0184 }
0185 value = i->second;
0186 return true;
0187 }
0188
0189
0190
0191
0192
0193
0194
0195
0196 const bool Collection::checkHistoValue(const CoHistoProps& h, const std::string& name, int& value) {
0197 CoHistoProps::const_iterator i = h.find(name);
0198 if (i == h.end()) {
0199 return false;
0200 }
0201 if (EOF == std::sscanf(i->second.c_str(), "%d", &value)) {
0202 return false;
0203 }
0204 return true;
0205 }
0206
0207
0208
0209
0210
0211
0212
0213
0214
0215 const bool Collection::checkHistoValue(const CoHistoProps& h, const std::string name, double& value) {
0216 CoHistoProps::const_iterator i = h.find(name);
0217 if (i == h.end()) {
0218 return false;
0219 }
0220 if (EOF == std::sscanf(i->second.c_str(), "%lf", &value)) {
0221 return false;
0222 }
0223 return true;
0224 }
0225
0226
0227
0228
0229
0230
0231
0232
0233
0234 std::string& Collection::getHistoValue(const CoHistoProps& h,
0235 const std::string& name,
0236 std::string& value,
0237 const std::string& def_value) {
0238 if (!checkHistoValue(h, name, value)) {
0239 value = def_value;
0240 }
0241 return value;
0242 }
0243
0244
0245
0246
0247
0248
0249
0250
0251
0252 int& Collection::getHistoValue(const CoHistoProps& h, const std::string& name, int& value, const int& def_value) {
0253 if (!checkHistoValue(h, name, value)) {
0254 value = def_value;
0255 }
0256 return value;
0257 }
0258
0259
0260
0261
0262
0263
0264
0265
0266
0267 double& Collection::getHistoValue(const CoHistoProps& h, const std::string name, double& value, const int def_value) {
0268 if (!checkHistoValue(h, name, value)) {
0269 value = def_value;
0270 }
0271 return value;
0272 }
0273
0274
0275
0276
0277
0278
0279
0280 const int Collection::ParseAxisLabels(const std::string& s, std::map<int, std::string>& labels) {
0281 std::string tmp = s;
0282 std::string::size_type pos = tmp.find('|');
0283 char* stopstring = nullptr;
0284
0285 while (pos != std::string::npos) {
0286 std::string label_pair = tmp.substr(0, pos);
0287 tmp.replace(0, pos + 1, "");
0288 if (label_pair.find('=') != std::string::npos) {
0289 int nbin = strtol(label_pair.substr(0, label_pair.find('=')).c_str(), &stopstring, 10);
0290 std::string label = label_pair.substr(label_pair.find('=') + 1, label_pair.length());
0291 while (label.find('\'') != std::string::npos) {
0292 label.erase(label.find('\''), 1);
0293 }
0294 labels[nbin] = label;
0295 }
0296 pos = tmp.find('|');
0297 }
0298 return labels.size();
0299 }
0300
0301
0302
0303
0304
0305 void Collection::bookEMUHistos() const {
0306 CoHistoMap::const_iterator i = collection.find("EMU");
0307 if (i != collection.end()) {
0308 const CoHisto hs = i->second;
0309 for (CoHisto::const_iterator j = hs.begin(); j != hs.end(); j++) {
0310 std::string s = "";
0311 if (getHistoValue(j->second, XML_BOOK_ONDEMAND, s, XML_BOOK_ONDEMAND_FALSE) == XML_BOOK_ONDEMAND_FALSE) {
0312 HistoId hid = 0;
0313 if (HistoDef::getHistoIdByName(j->first, hid)) {
0314 EMUHistoDef hdef(hid);
0315 book(hdef, j->second, config->getFOLDER_EMU());
0316 }
0317 }
0318 }
0319 }
0320 }
0321
0322
0323
0324
0325
0326
0327 void Collection::bookFEDHistos(const HwId fedId) const {
0328 CoHistoMap::const_iterator i = collection.find("FED");
0329 if (i != collection.end()) {
0330 const CoHisto hs = i->second;
0331 for (CoHisto::const_iterator j = hs.begin(); j != hs.end(); j++) {
0332 std::string s = "";
0333 if (getHistoValue(j->second, XML_BOOK_ONDEMAND, s, XML_BOOK_ONDEMAND_FALSE) == XML_BOOK_ONDEMAND_FALSE) {
0334 HistoId hid = 0;
0335 if (HistoDef::getHistoIdByName(j->first, hid)) {
0336 FEDHistoDef hdef(hid, fedId);
0337 book(hdef, j->second, config->getFOLDER_FED());
0338 }
0339 }
0340 }
0341 }
0342 }
0343
0344
0345
0346
0347
0348
0349 void Collection::bookDDUHistos(const HwId dduId) const {
0350 CoHistoMap::const_iterator i = collection.find("DDU");
0351 if (i != collection.end()) {
0352 const CoHisto hs = i->second;
0353 for (CoHisto::const_iterator j = hs.begin(); j != hs.end(); j++) {
0354 std::string s = "";
0355 if (getHistoValue(j->second, XML_BOOK_ONDEMAND, s, XML_BOOK_ONDEMAND_FALSE) == XML_BOOK_ONDEMAND_FALSE) {
0356 HistoId hid = 0;
0357 if (HistoDef::getHistoIdByName(j->first, hid)) {
0358 DDUHistoDef hdef(hid, dduId);
0359 book(hdef, j->second, config->getFOLDER_DDU());
0360 }
0361 }
0362 }
0363 }
0364 }
0365
0366
0367
0368
0369
0370
0371
0372 void Collection::bookCSCHistos(const HwId crateId, const HwId dmbId) const {
0373 CoHistoMap::const_iterator i = collection.find("CSC");
0374 if (i != collection.end()) {
0375 const CoHisto hs = i->second;
0376 for (CoHisto::const_iterator j = hs.begin(); j != hs.end(); j++) {
0377 std::string s = "";
0378 HistoId hid = 0;
0379 if (HistoDef::getHistoIdByName(j->first, hid)) {
0380 if (getHistoValue(j->second, XML_BOOK_ONDEMAND, s, XML_BOOK_ONDEMAND_FALSE) == XML_BOOK_ONDEMAND_FALSE) {
0381 CSCHistoDef hdef(hid, crateId, dmbId);
0382 book(hdef, j->second, config->getFOLDER_CSC());
0383 } else {
0384 int from = 0, to = 0;
0385 if (checkHistoValue(j->second, XML_BOOK_NAME_FROM, from) &&
0386 checkHistoValue(j->second, XML_BOOK_NAME_TO, to)) {
0387 for (int k = from; k <= to; k++) {
0388 CSCHistoDef hdef(hid, crateId, dmbId, k);
0389 book(hdef, j->second, config->getFOLDER_CSC());
0390 }
0391 }
0392 }
0393 }
0394 }
0395 }
0396 }
0397
0398
0399
0400
0401
0402
0403
0404
0405
0406 void Collection::bookCSCHistos(const HistoId hid, const HwId crateId, const HwId dmbId, const HwId addId) const {
0407 CoHistoMap::const_iterator i = collection.find("CSC");
0408 if (i != collection.end()) {
0409 CoHisto::const_iterator j = i->second.find(h::names[hid]);
0410 if (j != i->second.end()) {
0411 CSCHistoDef hdef(hid, crateId, dmbId, addId);
0412 book(hdef, j->second, config->getFOLDER_CSC());
0413 }
0414 }
0415 }
0416
0417
0418
0419
0420
0421
0422
0423
0424 void Collection::book(const HistoDef& h, const CoHistoProps& p, const std::string& folder) const {
0425 MonitorObject* me = nullptr;
0426 std::string name = h.getName(), type, title, s;
0427
0428
0429 if (!config->needBookMO(h.getFullPath())) {
0430 LOG_INFO << "MOFilter excluded " << name << " from booking";
0431 config->fnPutHisto(h, me);
0432 return;
0433 }
0434
0435 int i1, i2, i3;
0436 double d1, d2, d3, d4, d5, d6;
0437 bool ondemand =
0438 (getHistoValue(p, XML_BOOK_ONDEMAND, s, XML_BOOK_ONDEMAND_FALSE) == XML_BOOK_ONDEMAND_TRUE ? true : false);
0439
0440 if (!checkHistoValue(p, XML_BOOK_HISTO_TYPE, type)) {
0441 throw Exception("Histogram does not have type!");
0442 }
0443 checkHistoValue(p, XML_BOOK_HISTO_TITLE, title);
0444
0445 if (ondemand) {
0446 title = h.processTitle(title);
0447 }
0448
0449 if (type == "h1") {
0450 me = config->fnBook(HistoBookRequest(h,
0451 H1D,
0452 type,
0453 folder,
0454 title,
0455 getHistoValue(p, "XBins", i1, 1),
0456 getHistoValue(p, "XMin", d1, 0),
0457 getHistoValue(p, "XMax", d2, 1)));
0458 } else if (type == "h2") {
0459 me = config->fnBook(HistoBookRequest(h,
0460 H2D,
0461 type,
0462 folder,
0463 title,
0464 getHistoValue(p, "XBins", i1, 1),
0465 getHistoValue(p, "XMin", d1, 0),
0466 getHistoValue(p, "XMax", d2, 1),
0467 getHistoValue(p, "YBins", i2, 1),
0468 getHistoValue(p, "YMin", d3, 0),
0469 getHistoValue(p, "YMax", d4, 1)));
0470 } else if (type == "h3") {
0471 me = config->fnBook(HistoBookRequest(h,
0472 H3D,
0473 type,
0474 folder,
0475 title,
0476 getHistoValue(p, "XBins", i1, 1),
0477 getHistoValue(p, "XMin", d1, 0),
0478 getHistoValue(p, "XMax", d2, 1),
0479 getHistoValue(p, "YBins", i2, 1),
0480 getHistoValue(p, "YMin", d3, 0),
0481 getHistoValue(p, "YMax", d4, 1),
0482 getHistoValue(p, "ZBins", i3, 1),
0483 getHistoValue(p, "ZMin", d5, 0),
0484 getHistoValue(p, "ZMax", d6, 1)));
0485 } else if (type == "hp") {
0486 me = config->fnBook(HistoBookRequest(h,
0487 PROFILE,
0488 type,
0489 folder,
0490 title,
0491 getHistoValue(p, "XBins", i1, 1),
0492 getHistoValue(p, "XMin", d1, 0),
0493 getHistoValue(p, "XMax", d2, 1)));
0494
0495
0496
0497
0498
0499
0500
0501
0502
0503 } else if (type == "hp2") {
0504 me = config->fnBook(HistoBookRequest(h,
0505 PROFILE2D,
0506 type,
0507 folder,
0508 title,
0509 getHistoValue(p, "XBins", i1, 1),
0510 getHistoValue(p, "XMin", d1, 0),
0511 getHistoValue(p, "XMax", d2, 1),
0512 getHistoValue(p, "YBins", i2, 1),
0513 getHistoValue(p, "YMin", d3, 0),
0514 getHistoValue(p, "YMax", d4, 1),
0515 getHistoValue(p, "ZBins", i3, 1),
0516 getHistoValue(p, "ZMin", d5, 0),
0517 getHistoValue(p, "ZMax", d6, 1)));
0518 } else {
0519 throw Exception("Can not book histogram with type: " + type);
0520 }
0521
0522 if (me != nullptr) {
0523 LockType lock(me->mutex);
0524 TH1* th = me->getTH1Lock();
0525
0526 if (checkHistoValue(p, "XTitle", s)) {
0527 if (ondemand) {
0528 s = h.processTitle(s);
0529 }
0530 me->setAxisTitle(s, 1);
0531 }
0532
0533 if (checkHistoValue(p, "YTitle", s)) {
0534 if (ondemand) {
0535 s = h.processTitle(s);
0536 }
0537 me->setAxisTitle(s, 2);
0538 }
0539
0540 if (checkHistoValue(p, "ZTitle", s)) {
0541 if (ondemand) {
0542 s = h.processTitle(s);
0543 }
0544 me->setAxisTitle(s, 3);
0545 }
0546
0547 if (checkHistoValue(p, "SetOption", s))
0548 th->SetOption(s.c_str());
0549 if (checkHistoValue(p, "SetStats", i1))
0550 th->SetStats(i1);
0551 th->SetFillColor(getHistoValue(p, "SetFillColor", i1, DEF_HISTO_COLOR));
0552 if (checkHistoValue(p, "SetXLabels", s)) {
0553 std::map<int, std::string> labels;
0554 ParseAxisLabels(s, labels);
0555 th->GetXaxis()->SetNoAlphanumeric();
0556 for (std::map<int, std::string>::iterator l_itr = labels.begin(); l_itr != labels.end(); ++l_itr) {
0557 th->GetXaxis()->SetBinLabel(l_itr->first, l_itr->second.c_str());
0558 }
0559 }
0560 if (checkHistoValue(p, "SetYLabels", s)) {
0561 std::map<int, std::string> labels;
0562 ParseAxisLabels(s, labels);
0563 th->GetYaxis()->SetNoAlphanumeric();
0564 for (std::map<int, std::string>::iterator l_itr = labels.begin(); l_itr != labels.end(); ++l_itr) {
0565 th->GetYaxis()->SetBinLabel(l_itr->first, l_itr->second.c_str());
0566 }
0567 }
0568 if (checkHistoValue(p, "LabelOption", s)) {
0569 std::vector<std::string> v;
0570 if (2 == Utility::tokenize(s, v, ",")) {
0571 th->LabelsOption(v[0].c_str(), v[1].c_str());
0572 }
0573 }
0574 if (checkHistoValue(p, "SetLabelSize", s)) {
0575 std::vector<std::string> v;
0576 if (2 == Utility::tokenize(s, v, ",")) {
0577 th->SetLabelSize((double)atof(v[0].c_str()), v[1].c_str());
0578 }
0579 }
0580 if (checkHistoValue(p, "SetTitleOffset", s)) {
0581 std::vector<std::string> v;
0582 if (2 == Utility::tokenize(s, v, ",")) {
0583 th->SetTitleOffset((double)atof(v[0].c_str()), v[1].c_str());
0584 }
0585 }
0586 if (checkHistoValue(p, "SetMinimum", d1))
0587 th->SetMinimum(d1);
0588 if (checkHistoValue(p, "SetMaximum", d1))
0589 me->SetMaximum(d1);
0590 if (checkHistoValue(p, "SetNdivisionsX", i1)) {
0591 th->SetNdivisions(i1, "X");
0592 th->GetXaxis()->CenterLabels(true);
0593 }
0594 if (checkHistoValue(p, "SetNdivisionsY", i1)) {
0595 th->SetNdivisions(i1, "Y");
0596 th->GetYaxis()->CenterLabels(true);
0597 }
0598 if (checkHistoValue(p, "SetTickLengthX", d1))
0599 th->SetTickLength(d1, "X");
0600 if (checkHistoValue(p, "SetTickLengthY", d1))
0601 th->SetTickLength(d1, "Y");
0602 if (checkHistoValue(p, "SetLabelSizeX", d1))
0603 th->SetLabelSize(d1, "X");
0604 if (checkHistoValue(p, "SetLabelSizeY", d1))
0605 th->SetLabelSize(d1, "Y");
0606 if (checkHistoValue(p, "SetLabelSizeZ", d1))
0607 th->SetLabelSize(d1, "Z");
0608 if (checkHistoValue(p, "SetErrorOption", s))
0609 reinterpret_cast<TProfile*>(th)->SetErrorOption(s.c_str());
0610
0611 lock.unlock();
0612 }
0613
0614 LOG_DEBUG << "[Collection::book] booked " << h.getFullPath() << " (" << me << ")";
0615
0616
0617 config->fnPutHisto(h, me);
0618 }
0619
0620
0621
0622
0623
0624
0625 const bool Collection::isOnDemand(const HistoName& name) const {
0626 CoHistoMap::const_iterator i = collection.find("CSC");
0627 if (i != collection.end()) {
0628 CoHisto hs = i->second;
0629 CoHisto::const_iterator j = hs.find(name);
0630 if (j != hs.end()) {
0631 std::string s;
0632 return (getHistoValue(j->second, XML_BOOK_ONDEMAND, s, XML_BOOK_ONDEMAND_FALSE) == XML_BOOK_ONDEMAND_TRUE);
0633 }
0634 }
0635 return false;
0636 }
0637
0638
0639
0640
0641
0642 void Collection::printCollection() const {
0643 std::ostringstream buffer;
0644 for (CoHistoMap::const_iterator hdmi = collection.begin(); hdmi != collection.end(); hdmi++) {
0645 buffer << hdmi->first << " [" << std::endl;
0646 for (CoHisto::const_iterator hdi = hdmi->second.begin(); hdi != hdmi->second.end(); hdi++) {
0647 buffer << " " << hdi->first << " [" << std::endl;
0648 for (CoHistoProps::const_iterator hi = hdi->second.begin(); hi != hdi->second.end(); hi++) {
0649 buffer << " " << hi->first << " = " << hi->second << std::endl;
0650 }
0651 buffer << " ]" << std::endl;
0652 }
0653 buffer << " ]" << std::endl;
0654 }
0655 LOG_INFO << buffer.str();
0656 }
0657
0658 }