CMS 3D CMS Logo

CSCDQM_Collection.cc
Go to the documentation of this file.
1 /* =====================================================================================
2  *
3  * Filename: CSCDQM_Collection.cc
4  *
5  * Description: Histogram booking code
6  *
7  * Version: 1.0
8  * Created: 04/18/2008 03:39:49 PM
9  * Revision: none
10  * Compiler: gcc
11  *
12  * Author: Valdas Rapsevicius (VR), Valdas.Rapsevicius@cern.ch
13  * Company: CERN, CH
14  *
15  * =====================================================================================
16  */
17 
18 #include "CSCDQM_Collection.h"
20 #include <cstdio>
21 #include <string>
22 #include <xercesc/util/XMLString.hpp>
23 #include <xercesc/util/TransService.hpp>
24 
25 namespace cscdqm {
26 
32  config = p_config;
33  }
34 
35 
41  LOG_INFO << "Reading histograms from " << config->getBOOKING_XML_FILE();
42 
43  if (config->getBOOKING_XML_FILE().empty()) {
44  return;
45  }
46 
47  try {
48 
50  {
52 
53  parser.setValidationScheme(XercesDOMParser::Val_Always);
54  parser.setDoNamespaces(true);
55  parser.setDoSchema(true);
56  parser.setExitOnFirstFatalError(true);
57  parser.setValidationConstraintFatal(true);
59  parser.setErrorHandler(&eh);
60  parser.parse(config->getBOOKING_XML_FILE().c_str());
61 
62  DOMDocument *doc = parser.getDocument();
63  DOMElement *docNode = doc->getDocumentElement();
64  DOMNodeList *itemList = docNode->getChildNodes();
65 
67  for (XMLSize_t i = 0; i < itemList->getLength(); i++) {
68 
69  DOMNode* node = itemList->item(i);
70  if (node->getNodeType() != DOMNode::ELEMENT_NODE) { continue; }
71 
72  std::string nodeName = XMLString::transcode(node->getNodeName());
73 
77  if (nodeName == XML_BOOK_DEFINITION) {
78 
80  getNodeProperties(node, dp);
81 
82  DOMElement* el = dynamic_cast<DOMElement*>(node);
83  std::string id(XMLString::transcode(el->getAttribute(XMLString::transcode(XML_BOOK_DEFINITION_ID))));
84  definitions.insert(make_pair(id, dp));
85 
86  } else
87 
91  if (nodeName == XML_BOOK_HISTOGRAM) {
92 
94 
95  DOMElement* el = dynamic_cast<DOMElement*>(node);
96  if (el->hasAttribute(XMLString::transcode(XML_BOOK_DEFINITION_REF))) {
97  std::string id(XMLString::transcode(el->getAttribute(XMLString::transcode(XML_BOOK_DEFINITION_REF))));
98 
99  CoHistoProps d = definitions[id];
100  for (CoHistoProps::iterator it = d.begin(); it != d.end(); it++) {
101  hp[it->first] = it->second;
102  }
103  }
104 
105  getNodeProperties(node, hp);
106 
109 
110  // Check if this histogram is an ON DEMAND histogram?
112 
113  LOG_DEBUG << "[Collection::load] loading " << prefix << "::" << name << " XML_BOOK_ONDEMAND = " << hp[XML_BOOK_ONDEMAND];
114 
115  CoHistoMap::iterator it = collection.find(prefix);
116  if (it == collection.end()) {
117  CoHisto h;
118  h[name] = hp;
119  collection[prefix] = h;
120  } else {
121  it->second.insert(make_pair(name, hp));
122  }
123  }
124  }
125  }
126 
128 
129  } catch (XMLException& e) {
130  char* message = XMLString::transcode(e.getMessage());
131  throw Exception(message);
132  }
133 
134  for (CoHistoMap::const_iterator i = collection.begin(); i != collection.end(); i++) {
135  LOG_INFO << i->second.size() << " " << i->first << " histograms defined";
136  }
137  }
138 
148  DOMNodeList *props = node->getChildNodes();
149 
150  for(XMLSize_t j = 0; j < props->getLength(); j++) {
151  DOMNode* node = props->item(j);
152  if (node->getNodeType() != DOMNode::ELEMENT_NODE) { continue; }
153  DOMElement* element = dynamic_cast<DOMElement*>(node);
154  std::string name = XMLString::transcode(element->getNodeName());
155 
156  const XMLCh *content = element->getTextContent();
157  XERCES_CPP_NAMESPACE_QUALIFIER TranscodeToStr tc(content, "UTF-8");
158  std::istringstream buffer((const char*)tc.str());
159  std::string value = buffer.str();
160 
161  DOMNamedNodeMap* attributes = node->getAttributes();
162  if (attributes) {
163  for (XMLSize_t i = 0; i < attributes->getLength(); i++) {
164  DOMNode* attribute = attributes->item(i);
165  std::string aname = XMLString::transcode(attribute->getNodeName());
166  std::string avalue = XMLString::transcode(attribute->getNodeValue());
167  p[name + "_" + aname] = avalue;
168  }
169  }
170  p[name] = value;
171  }
172  }
173 
182  CoHistoProps::const_iterator i = h.find(name);
183  if(i == h.end()) {
184  return false;
185  }
186  value = i->second;
187  return true;
188  }
189 
197  const bool Collection::checkHistoValue(const CoHistoProps& h, const std::string& name, int& value) {
198  CoHistoProps::const_iterator i = h.find(name);
199  if(i == h.end()) {
200  return false;
201  }
202  if(EOF == std::sscanf(i->second.c_str(), "%d", &value)) {
203  return false;
204  }
205  return true;
206  }
207 
216  const bool Collection::checkHistoValue(const CoHistoProps& h, const std::string name, double& value) {
217  CoHistoProps::const_iterator i = h.find(name);
218  if(i == h.end()) {
219  return false;
220  }
221  if(EOF == std::sscanf(i->second.c_str(), "%lf", &value)) {
222  return false;
223  }
224  return true;
225  }
226 
236  if (!checkHistoValue(h, name, value)) {
237  value = def_value;
238  }
239  return value;
240  }
241 
250  int& Collection::getHistoValue(const CoHistoProps& h, const std::string& name, int& value, const int& def_value) {
251  if (!checkHistoValue(h, name, value)) {
252  value = def_value;
253  }
254  return value;
255  }
256 
265  double& Collection::getHistoValue(const CoHistoProps& h, const std::string name, double& value, const int def_value) {
266  if (!checkHistoValue(h, name, value)) {
267  value = def_value;
268  }
269  return value;
270  }
271 
278  const int Collection::ParseAxisLabels(const std::string& s, std::map<int, std::string>& labels) {
279  std::string tmp = s;
280  std::string::size_type pos = tmp.find("|");
281  char* stopstring = nullptr;
282 
283  while (pos != std::string::npos) {
284  std::string label_pair = tmp.substr(0, pos);
285  tmp.replace(0, pos + 1, "");
286  if (label_pair.find("=") != std::string::npos) {
287  int nbin = strtol(label_pair.substr(0, label_pair.find("=")).c_str(), &stopstring, 10);
288  std::string label = label_pair.substr(label_pair.find("=") + 1, label_pair.length());
289  while (label.find("\'") != std::string::npos) {
290  label.erase(label.find("\'"), 1);
291  }
292  labels[nbin] = label;
293  }
294  pos = tmp.find("|");
295  }
296  return labels.size();
297  }
298 
304  CoHistoMap::const_iterator i = collection.find("EMU");
305  if (i != collection.end()) {
306  const CoHisto hs = i->second;
307  for (CoHisto::const_iterator j = hs.begin(); j != hs.end(); j++) {
308  std::string s = "";
310  HistoId hid = 0;
311  if (HistoDef::getHistoIdByName(j->first, hid)) {
312  EMUHistoDef hdef(hid);
313  book(hdef, j->second, config->getFOLDER_EMU());
314  }
315  }
316  }
317  }
318  }
319 
326  CoHistoMap::const_iterator i = collection.find("FED");
327  if (i != collection.end()) {
328  const CoHisto hs = i->second;
329  for (CoHisto::const_iterator j = hs.begin(); j != hs.end(); j++) {
330  std::string s = "";
332  HistoId hid = 0;
333  if (HistoDef::getHistoIdByName(j->first, hid)) {
334  FEDHistoDef hdef(hid, fedId);
335  book(hdef, j->second, config->getFOLDER_FED());
336  }
337  }
338  }
339  }
340  }
341 
347  void Collection::bookDDUHistos(const HwId dduId) const {
348  CoHistoMap::const_iterator i = collection.find("DDU");
349  if (i != collection.end()) {
350  const CoHisto hs = i->second;
351  for (CoHisto::const_iterator j = hs.begin(); j != hs.end(); j++) {
352  std::string s = "";
354  HistoId hid = 0;
355  if (HistoDef::getHistoIdByName(j->first, hid)) {
356  DDUHistoDef hdef(hid, dduId);
357  book(hdef, j->second, config->getFOLDER_DDU());
358  }
359  }
360  }
361  }
362  }
363 
370  void Collection::bookCSCHistos(const HwId crateId, const HwId dmbId) const {
371  CoHistoMap::const_iterator i = collection.find("CSC");
372  if (i != collection.end()) {
373  const CoHisto hs = i->second;
374  for (CoHisto::const_iterator j = hs.begin(); j != hs.end(); j++) {
375  std::string s = "";
376  HistoId hid = 0;
377  if (HistoDef::getHistoIdByName(j->first, hid)) {
379  CSCHistoDef hdef(hid, crateId, dmbId);
380  book(hdef, j->second, config->getFOLDER_CSC());
381  } else {
382  int from = 0, to = 0;
383  if (checkHistoValue(j->second, XML_BOOK_NAME_FROM, from) && checkHistoValue(j->second, XML_BOOK_NAME_TO, to)) {
384  for (int k = from; k <= to; k++) {
385  CSCHistoDef hdef(hid, crateId, dmbId, k);
386  book(hdef, j->second, config->getFOLDER_CSC());
387  }
388  }
389  }
390  }
391  }
392  }
393  }
394 
395 
396 
405  void Collection::bookCSCHistos(const HistoId hid, const HwId crateId, const HwId dmbId, const HwId addId) const {
406  CoHistoMap::const_iterator i = collection.find("CSC");
407  if (i != collection.end()) {
408  CoHisto::const_iterator j = i->second.find(h::names[hid]);
409  if (j != i->second.end()) {
410  CSCHistoDef hdef(hid, crateId, dmbId, addId);
411  book(hdef, j->second, config->getFOLDER_CSC());
412  }
413  }
414  }
415 
423  void Collection::book(const HistoDef& h, const CoHistoProps& p, const std::string& folder) const {
424 
425  MonitorObject* me = nullptr;
426  std::string name = h.getName(), type, title, s;
427 
429  if (!config->needBookMO(h.getFullPath())) {
430  LOG_INFO << "MOFilter excluded " << name << " from booking";
431  config->fnPutHisto(h, me);
432  return;
433  }
434 
435  int i1, i2, i3;
436  double d1, d2, d3, d4, d5, d6;
437  bool ondemand = (getHistoValue(p, XML_BOOK_ONDEMAND, s, XML_BOOK_ONDEMAND_FALSE) == XML_BOOK_ONDEMAND_TRUE ? true : false);
438 
439  if (!checkHistoValue(p, XML_BOOK_HISTO_TYPE, type)) { throw Exception("Histogram does not have type!"); }
441 
442  if (ondemand) {
443  title = h.processTitle(title);
444  }
445 
446  if (type == "h1") {
447  me = config->fnBook(
448  HistoBookRequest(h, H1D, type, folder, title,
449  getHistoValue(p, "XBins", i1, 1),
450  getHistoValue(p, "XMin", d1, 0),
451  getHistoValue(p, "XMax", d2, 1)));
452  } else
453  if(type == "h2") {
454  me = config->fnBook(
455  HistoBookRequest(h, H2D, type, folder, title,
456  getHistoValue(p, "XBins", i1, 1),
457  getHistoValue(p, "XMin", d1, 0),
458  getHistoValue(p, "XMax", d2, 1),
459  getHistoValue(p, "YBins", i2, 1),
460  getHistoValue(p, "YMin", d3, 0),
461  getHistoValue(p, "YMax", d4, 1)));
462  } else
463  if(type == "h3") {
464  me = config->fnBook(
465  HistoBookRequest(h, H3D, type, folder, title,
466  getHistoValue(p, "XBins", i1, 1),
467  getHistoValue(p, "XMin", d1, 0),
468  getHistoValue(p, "XMax", d2, 1),
469  getHistoValue(p, "YBins", i2, 1),
470  getHistoValue(p, "YMin", d3, 0),
471  getHistoValue(p, "YMax", d4, 1),
472  getHistoValue(p, "ZBins", i3, 1),
473  getHistoValue(p, "ZMin", d5, 0),
474  getHistoValue(p, "ZMax", d6, 1)));
475  } else
476  if(type == "hp") {
477  me = config->fnBook(
478  HistoBookRequest(h, PROFILE, type, folder, title,
479  getHistoValue(p, "XBins", i1, 1),
480  getHistoValue(p, "XMin", d1, 0),
481  getHistoValue(p, "XMax", d2, 1)));
482  /*
483  HistoBookRequest(h, PROFILE, type, folder, title,
484  getHistoValue(p, "XBins", i1, 1),
485  getHistoValue(p, "XMin", d1, 0),
486  getHistoValue(p, "XMax", d2, 1),
487  getHistoValue(p, "YBins", i2, 1),
488  getHistoValue(p, "YMin", d3, 0),
489  getHistoValue(p, "YMax", d4, 1)));
490  */
491  } else
492  if(type == "hp2") {
493  me = config->fnBook(
494  HistoBookRequest(h, PROFILE2D, type, folder, title,
495  getHistoValue(p, "XBins", i1, 1),
496  getHistoValue(p, "XMin", d1, 0),
497  getHistoValue(p, "XMax", d2, 1),
498  getHistoValue(p, "YBins", i2, 1),
499  getHistoValue(p, "YMin", d3, 0),
500  getHistoValue(p, "YMax", d4, 1),
501  getHistoValue(p, "ZBins", i3, 1),
502  getHistoValue(p, "ZMin", d5, 0),
503  getHistoValue(p, "ZMax", d6, 1)));
504  } else {
505  throw Exception("Can not book histogram with type: " + type);
506  }
507 
508  if(me != nullptr) {
509 
510  LockType lock(me->mutex);
511  TH1 *th = me->getTH1Lock();
512 
513  if(checkHistoValue(p, "XTitle", s)) {
514  if (ondemand) {
515  s = h.processTitle(s);
516  }
517  me->setAxisTitle(s, 1);
518  }
519 
520  if(checkHistoValue(p, "YTitle", s)) {
521  if (ondemand) {
522  s = h.processTitle(s);
523  }
524  me->setAxisTitle(s, 2);
525  }
526 
527  if(checkHistoValue(p, "ZTitle", s)) {
528  if (ondemand) {
529  s = h.processTitle(s);
530  }
531  me->setAxisTitle(s, 3);
532  }
533 
534  if(checkHistoValue(p, "SetOption", s)) th->SetOption(s.c_str());
535  if(checkHistoValue(p, "SetStats", i1)) th->SetStats(i1);
536  th->SetFillColor(getHistoValue(p, "SetFillColor", i1, DEF_HISTO_COLOR));
537  if(checkHistoValue(p, "SetXLabels", s)) {
538  std::map<int, std::string> labels;
539  ParseAxisLabels(s, labels);
540  th->GetXaxis()->SetNoAlphanumeric(); // For ROOT6 to prevent getting zero means values
541  for (std::map<int, std::string>::iterator l_itr = labels.begin(); l_itr != labels.end(); ++l_itr) {
542  th->GetXaxis()->SetBinLabel(l_itr->first, l_itr->second.c_str());
543  }
544  }
545  if(checkHistoValue(p, "SetYLabels", s)) {
546  std::map<int, std::string> labels;
547  ParseAxisLabels(s, labels);
548  th->GetYaxis()->SetNoAlphanumeric(); // For ROOT6 to prevent getting zero means values
549  for (std::map<int, std::string>::iterator l_itr = labels.begin(); l_itr != labels.end(); ++l_itr) {
550  th->GetYaxis()->SetBinLabel(l_itr->first, l_itr->second.c_str());
551  }
552  }
553  if(checkHistoValue(p, "LabelOption", s)) {
554  std::vector<std::string> v;
555  if(2 == Utility::tokenize(s, v, ",")) {
556  th->LabelsOption(v[0].c_str(), v[1].c_str());
557  }
558  }
559  if(checkHistoValue(p, "SetLabelSize", s)) {
560  std::vector<std::string> v;
561  if(2 == Utility::tokenize(s, v, ",")) {
562  th->SetLabelSize((double) atof(v[0].c_str()), v[1].c_str());
563  }
564  }
565  if(checkHistoValue(p, "SetTitleOffset", s)) {
566  std::vector<std::string> v;
567  if(2 == Utility::tokenize(s, v, ",")) {
568  th->SetTitleOffset((double) atof(v[0].c_str()), v[1].c_str());
569  }
570  }
571  if(checkHistoValue(p, "SetMinimum", d1)) th->SetMinimum(d1);
572  if(checkHistoValue(p, "SetMaximum", d1)) me->SetMaximum(d1);
573  if(checkHistoValue(p, "SetNdivisionsX", i1)) {
574  th->SetNdivisions(i1, "X");
575  th->GetXaxis()->CenterLabels(true);
576  }
577  if(checkHistoValue(p, "SetNdivisionsY", i1)) {
578  th->SetNdivisions(i1, "Y");
579  th->GetYaxis()->CenterLabels(true);
580  }
581  if(checkHistoValue(p, "SetTickLengthX", d1)) th->SetTickLength(d1, "X");
582  if(checkHistoValue(p, "SetTickLengthY", d1)) th->SetTickLength(d1, "Y");
583  if(checkHistoValue(p, "SetLabelSizeX", d1)) th->SetLabelSize(d1, "X");
584  if(checkHistoValue(p, "SetLabelSizeY", d1)) th->SetLabelSize(d1, "Y");
585  if(checkHistoValue(p, "SetLabelSizeZ", d1)) th->SetLabelSize(d1, "Z");
586  if(checkHistoValue(p, "SetErrorOption", s)) reinterpret_cast<TProfile*>(th)->SetErrorOption(s.c_str());
587 
588  lock.unlock();
589 
590  }
591 
592  LOG_DEBUG << "[Collection::book] booked " << h.getFullPath() << " (" << me << ")";
593 
595  config->fnPutHisto(h, me);
596 
597  }
598 
604  const bool Collection::isOnDemand(const HistoName& name) const {
605  CoHistoMap::const_iterator i = collection.find("CSC");
606  if (i != collection.end()) {
607  CoHisto hs = i->second;
608  CoHisto::const_iterator j = hs.find(name);
609  if (j != hs.end()) {
610  std::string s;
612  }
613  }
614  return false;
615  }
616 
622 
623  std::ostringstream buffer;
624  for(CoHistoMap::const_iterator hdmi = collection.begin(); hdmi != collection.end(); hdmi++) {
625  buffer << hdmi->first << " [" << std::endl;
626  for(CoHisto::const_iterator hdi = hdmi->second.begin(); hdi != hdmi->second.end(); hdi++) {
627  buffer << " " << hdi->first << " [" << std::endl;
628  for(CoHistoProps::const_iterator hi = hdi->second.begin(); hi != hdi->second.end(); hi++) {
629  buffer << " " << hi->first << " = " << hi->second << std::endl;
630  }
631  buffer << " ]" << std::endl;
632  }
633  buffer << " ]" << std::endl;
634  }
635  LOG_INFO << buffer.str();
636  }
637 
638 }
type
Definition: HCALResponse.h:21
static const bool getHistoIdByName(const std::string &p_name, HistoId &p_id)
Get Histogram ID by name.
static const char XML_BOOK_DEFINITION_ID[]
static const char XML_BOOK_ONDEMAND_FALSE[]
unsigned int HwId
static const char XML_BOOK_HISTO_TYPE[]
static const char XML_BOOK_NAME_FROM[]
static const HistoName names[]
FWCore Framework interface EventSetupRecordImplementation h
Helper function to determine trigger accepts.
virtual const std::string processTitle(const std::string &p_title) const
Process Title by Adding appropriate ID.
#define LOG_INFO
Definition: CSCDQM_Logger.h:43
void bookEMUHistos() const
Book EMU histograms.
Monitoring Object interface used to cover Root object and provide common interface to EventProcessor ...
void xercesTerminate()
Definition: Xerces.cc:23
Abstract Base Histogram Definition.
static const char XML_BOOK_NAME_TO[]
static const char XML_BOOK_ONDEMAND[]
static const char XML_BOOK_DEFINITION_REF[]
static const char XML_BOOK_HISTOGRAM[]
xercesc::DOMDocument DOMDocument
const bool isOnDemand(const HistoName &name) const
Check if the histogram is on demand (by histogram name)
Definition: config.py:1
static bool regexMatch(const std::string &expression, const std::string &message)
Match RegExp expression string against string message and return result.
#define XERCES_CPP_NAMESPACE_QUALIFIER
Definition: LHERunInfo.h:16
void xercesInitialize()
Definition: Xerces.cc:18
CSC Level Histogram Type.
Collection(Configuration *const p_config)
Constructor.
uint16_t size_type
CSCDQM Framework Global Configuration.
unsigned int HistoId
static const char XML_BOOK_HISTO_PREFIX[]
virtual TH1 * getTH1Lock(void)=0
susybsm::HSCParticleRefProd hp
Definition: classes.h:27
static void getNodeProperties(DOMNode *&node, CoHistoProps &hp)
Extract and write single histogram properties from XML node to map.
xercesc::DOMNode DOMNode
static std::string & getHistoValue(const CoHistoProps &h, const std::string &name, std::string &value, const std::string &def_value="")
Find string histogram value in map.
xercesc::DOMElement DOMElement
EMU Level Histogram Definition.
void load()
Load XML file and fill definition map(s)
static const bool checkHistoValue(const CoHistoProps &h, const std::string &name, std::string &value)
Find string histogram value in map.
Definition: value.py:1
xercesc::DOMNodeList DOMNodeList
DDU Level Histogram Definition.
static const char XML_BOOK_ONDEMAND_TRUE[]
int k[5][pyjets_maxn]
xercesc::XercesDOMParser XercesDOMParser
void bookFEDHistos(const HwId fedId) const
Book FED histograms.
std::map< std::string, CoHistoProps > CoHisto
auto dp
Definition: deltaR.h:22
static const int DEF_HISTO_COLOR
static const char XML_BOOK_DEFINITION[]
void bookDDUHistos(const HwId dduId) const
Book DDU histograms.
void book(const HistoDef &h, const CoHistoProps &p, const std::string &folder) const
Book histogram.
FED Level Histogram Definition.
xercesc::DOMNamedNodeMap DOMNamedNodeMap
std::string HistoName
std::vector< std::vector< double > > tmp
Definition: MVATrainer.cc:100
const std::string getFullPath() const
Get full path of the histogram. It is being constructed by appending path and histogam name...
virtual const std::string getName() const
Get processed histogram name. It can include additional parameter in formated name. This Name is being constructed from raw name and additional parameter.
void bookCSCHistos(const HwId crateId, const HwId dmbId) const
Book Chamber Histograms.
static const TPRegexp REGEXP_ONDEMAND("^.*%d.*$")
Takes care of errors and warnings while parsing XML files file in XML format.
static const char XML_BOOK_HISTO_NAME[]
void printCollection() const
Print collection of available histograms and their parameters.
static const char XML_BOOK_HISTO_TITLE[]
virtual void SetMaximum(const double d)=0
static const int ParseAxisLabels(const std::string &s, std::map< int, std::string > &labels)
Parse Axis label string and return values in vector.
std::map< std::string, std::string > CoHistoProps
static int tokenize(const std::string &str, std::vector< std::string > &tokens, const std::string &delimiters=" ")
Break string into tokens.
virtual void setAxisTitle(const std::string title, const int axisN)=0
xercesc::XMLException XMLException