CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Types | Public Member Functions | Public Attributes | Private Member Functions | Private Attributes
HistogramManager Class Reference

#include <HistogramManager.h>

Public Types

typedef std::map
< GeometryInterface::Values,
AbstractHistogram
Table
 

Public Member Functions

void addSpec (SummationSpecification spec)
 
void book (DQMStore::IBooker &iBooker, edm::EventSetup const &iSetup)
 
void executeHarvesting (DQMStore::IBooker &iBooker, DQMStore::IGetter &iGetter)
 
void executePerEventHarvesting (edm::Event const *ev)
 
void executePerLumiHarvesting (DQMStore::IBooker &iBooker, DQMStore::IGetter &iGetter, edm::LuminosityBlock const &lumiBlock, edm::EventSetup const &iSetup)
 
void fill (DetId sourceModule, const edm::Event *sourceEvent=0, int col=0, int row=0)
 
void fill (double value, DetId sourceModule, const edm::Event *sourceEvent=0, int col=0, int row=0)
 
void fill (double x, double y, DetId sourceModule, const edm::Event *sourceEvent=0, int col=0, int row=0)
 
 HistogramManager (const edm::ParameterSet &iConfig, GeometryInterface &geo)
 

Public Attributes

bool bookUndefined
 
int dimensions
 
bool enabled
 
edm::LuminosityBlock const * lumisection = 0
 
std::string name
 
bool perLumiHarvesting
 
double range_x_max
 
double range_x_min
 
int range_x_nbins
 
double range_y_max
 
double range_y_min
 
int range_y_nbins
 
std::string title
 
std::string top_folder_name
 
std::string xlabel
 
std::string ylabel
 

Private Member Functions

void executeExtend (SummationStep const &step, Table &t, std::string const &reduction, DQMStore::IBooker &iBooker, SummationSpecification const &s)
 
void executeGroupBy (SummationStep const &step, Table &t, DQMStore::IBooker &iBooker, SummationSpecification const &s)
 
void fillInternal (double x, double y, int n_parameters, GeometryInterface::InterestingQuantities const &iq, std::vector< SummationStep >::iterator first, std::vector< SummationStep >::iterator last, AbstractHistogram &dest)
 
void loadFromDQMStore (SummationSpecification &s, Table &t, DQMStore::IGetter &iGetter)
 
std::pair< std::string,
std::string > 
makePathName (SummationSpecification const &s, GeometryInterface::Values const &, SummationStep const *upto)
 

Private Attributes

std::vector< Tablecounters
 
std::vector< AbstractHistogram * > fastpath
 
GeometryInterfacegeometryInterface
 
const edm::ParameterSetiConfig
 
GeometryInterface::InterestingQuantities iq
 
std::vector
< GeometryInterface::Values
significantvalues
 
std::vector
< SummationSpecification
specs
 
std::vector< Tabletables
 

Detailed Description

Definition at line 31 of file HistogramManager.h.

Member Typedef Documentation

Definition at line 54 of file HistogramManager.h.

Constructor & Destructor Documentation

HistogramManager::HistogramManager ( const edm::ParameterSet iConfig,
GeometryInterface geo 
)
explicit

Definition at line 19 of file HistogramManager.cc.

References addSpec(), geometryInterface, and edm::ParameterSet::getParameter().

21  : iConfig(iconfig),
22  geometryInterface(geo),
23  enabled(iconfig.getParameter<bool>("enabled")),
24  perLumiHarvesting(iconfig.getParameter<bool>("perLumiHarvesting")),
25  bookUndefined(iconfig.getParameter<bool>("bookUndefined")),
26  top_folder_name(iconfig.getParameter<std::string>("topFolderName")),
27  name(iconfig.getParameter<std::string>("name")),
28  title(iconfig.getParameter<std::string>("title")),
29  xlabel(iconfig.getParameter<std::string>("xlabel")),
30  ylabel(iconfig.getParameter<std::string>("ylabel")),
31  dimensions(iconfig.getParameter<int>("dimensions")),
32  range_x_nbins(iconfig.getParameter<int>("range_nbins")),
33  range_x_min(iconfig.getParameter<double>("range_min")),
34  range_x_max(iconfig.getParameter<double>("range_max")),
35  range_y_nbins(iconfig.getParameter<int>("range_y_nbins")),
36  range_y_min(iconfig.getParameter<double>("range_y_min")),
37  range_y_max(iconfig.getParameter<double>("range_y_max")) {
38  auto spec_configs = iconfig.getParameter<edm::VParameterSet>("specs");
39  for (auto spec : spec_configs) {
40  // this would fit better in SummationSpecification(...), but it has to
41  // happen here.
42  auto conf = spec.getParameter<edm::ParameterSet>("conf");
43  if (!conf.getParameter<bool>("enabled")) continue;
45  }
46 }
void addSpec(SummationSpecification spec)
std::vector< ParameterSet > VParameterSet
Definition: ParameterSet.h:33
std::string top_folder_name
std::string xlabel
std::string ylabel
const edm::ParameterSet & iConfig
GeometryInterface & geometryInterface

Member Function Documentation

void HistogramManager::addSpec ( SummationSpecification  spec)

Definition at line 48 of file HistogramManager.cc.

References counters, fastpath, significantvalues, specs, and tables.

Referenced by HistogramManager().

48  {
49  specs.push_back(spec);
50  tables.push_back(Table());
51  counters.push_back(Table());
53  fastpath.push_back(nullptr);
54 }
std::vector< SummationSpecification > specs
std::vector< std::pair< Column, Value > > Values
std::vector< AbstractHistogram * > fastpath
std::vector< GeometryInterface::Values > significantvalues
std::map< GeometryInterface::Values, AbstractHistogram > Table
std::vector< Table > tables
std::vector< Table > counters
void HistogramManager::book ( DQMStore::IBooker iBooker,
edm::EventSetup const &  iSetup 
)

Definition at line 264 of file HistogramManager.cc.

References GeometryInterface::allModules(), assert(), GeometryInterface::binWidth(), DQMStore::IBooker::book1D(), DQMStore::IBooker::book2D(), DQMStore::IBooker::bookProfile(), DQMStore::IBooker::bookProfile2D(), bookUndefined, EnergyCorrector::c, cuy::col, counters, dimensions, alignCSCRings::e, enabled, SummationStep::EXTEND_X, SummationStep::EXTEND_Y, GeometryInterface::extract(), GeometryInterface::extractColumns(), geometryInterface, MonitorElement::getTH1(), SummationStep::GROUPBY, h, timingPdfMaker::histo, i, reco::if(), iq, GeometryInterface::load(), GeometryInterface::loaded(), makePathName(), bookConverter::max, GeometryInterface::maxValue(), AbstractHistogram::me, min(), GeometryInterface::minValue(), name, convertSQLiteXML::ok, GeometryInterface::pretty(), SummationStep::PROFILE, range_x_max, range_x_min, range_x_nbins, range_y_max, range_y_min, range_y_nbins, alignCSCRings::s, SET_AXIS, DQMStore::IBooker::setCurrentFolder(), significantvalues, specs, SummationStep::STAGE2, AlCaHLTBitMon_QueryRunRegistry::string, t, tables, AbstractHistogram::th1, title, GeometryInterface::UNDEFINED, SummationStep::USE_X, SummationStep::USE_Y, SummationStep::USE_Z, SpecificationBuilder_cfi::val(), x, xlabel, y, ylabel, and z.

265  {
266  if (!geometryInterface.loaded()) {
267  geometryInterface.load(iSetup);
268  }
269  if (!enabled) return;
270 
271  struct MEInfo {
272  int dimensions = 1;
273  double range_x_min = 1e12;
274  double range_x_max = -1e12;
275  double range_y_min = 1e12;
276  double range_y_max = -1e12;
277  double range_z_min = 1e12; // z range carried around but unused
278  double range_z_max = -1e12;
279  int range_x_nbins = 0;
280  int range_y_nbins = 0;
281  int range_z_nbins = 0;
282  GeometryInterface::Value binwidth_x = 0; // override nbins for geom-things
283  GeometryInterface::Value binwidth_y = 0;
284  std::string title, xlabel, ylabel, zlabel;
285  bool do_profile = false;
286  };
287  std::map<GeometryInterface::Values, MEInfo> toBeBooked;
288 
289  for (unsigned int i = 0; i < specs.size(); i++) {
290  auto& s = specs[i];
291  auto& t = tables[i];
292  auto& c = counters[i];
293  toBeBooked.clear();
294  bool bookCounters = false;
295 
296  auto firststep = s.steps.begin();
297  int n_parameters = this->dimensions;
298 
299  if (firststep->type != SummationStep::GROUPBY) {
300  ++firststep;
301  n_parameters = 1;
302  bookCounters = true;
303  }
304 
305  auto laststep = std::find_if(s.steps.begin(), s.steps.end(),
306  [](SummationStep const& step) { return step.stage == SummationStep::STAGE2; });
307 
309 
310  for (auto iq : geometryInterface.allModules()) {
311 
312  if (bookCounters) {
313  // add an entry for the counting step if present
314  geometryInterface.extractColumns(s.steps[0].columns, iq,
315  significantvalues);
316  c[significantvalues].iq_sample = iq;
317  }
318 
319  geometryInterface.extractColumns(firststep->columns, iq,
320  significantvalues);
321  if (!bookUndefined) {
322  // skip if any column is UNDEFINED
323  bool ok = true;
324  for (auto e : significantvalues)
325  if (e.second == GeometryInterface::UNDEFINED) ok = false;
326  if (!ok) continue;
327  }
328 
329  auto histo = toBeBooked.find(significantvalues);
330  if (histo == toBeBooked.end()) {
331  // create new histo
332  MEInfo& mei = toBeBooked[significantvalues];
333  mei.title = this->title;
334  if (bookCounters)
335  mei.title = "Number of " + mei.title + " per Event and "
336  + geometryInterface.pretty(*(s.steps[0].columns.end()-1));
337  std::string xlabel = bookCounters ? "#" + this->xlabel : this->xlabel;
338 
339  // refer to fillInternal() for the actual execution
340  // compute labels, title, type, user-set ranges here
341  int tot_parameters = n_parameters;
342 #define SET_AXIS(to, from) \
343  mei.to##label = from##label; \
344  mei.range_##to##_min = this->range_##from##_min; \
345  mei.range_##to##_max = this->range_##from##_max; \
346  mei.range_##to##_nbins = this->range_##from##_nbins
347  for (auto it = firststep+1; it != laststep; ++it) {
348  switch (it->type) {
350  if (it->arg[0] == '1' && n_parameters >= 1) { SET_AXIS(x, x); }
351  if (it->arg[0] == '2' && n_parameters >= 2) { SET_AXIS(x, y); }
352  break;
354  if (it->arg[0] == '1' && n_parameters >= 1) { SET_AXIS(y, x); }
355  if (it->arg[0] == '2' && n_parameters >= 2) { SET_AXIS(y, y); }
356  break;
358  if (it->arg[0] == '1' && n_parameters >= 1) { SET_AXIS(z, x); }
359  if (it->arg[0] == '2' && n_parameters >= 2) { SET_AXIS(z, y); }
360  break;
362  assert(mei.range_x_nbins == 0);
363  auto col = it->columns[0];
364  mei.xlabel = geometryInterface.pretty(col);
365  mei.title = mei.title + " by " + mei.xlabel;
367  mei.range_x_min = geometryInterface.minValue(col);
369  mei.range_x_max = geometryInterface.maxValue(col);
370  mei.binwidth_x = geometryInterface.binWidth(col);
371  tot_parameters++; }
372  break;
374  auto col = it->columns[0];
375  mei.ylabel = geometryInterface.pretty(col);
376  mei.title = mei.title + " by " + mei.ylabel;
378  mei.range_y_min = geometryInterface.minValue(col);
380  mei.range_y_max = geometryInterface.maxValue(col);
381  mei.binwidth_y = geometryInterface.binWidth(col);
382  tot_parameters++; }
383  break;
385  mei.do_profile = true;
386  break;
387  default:
388  assert(!"illegal step in STAGE1! (booking)");
389  }
390  }
391  mei.dimensions = tot_parameters;
392  if (mei.do_profile) mei.title = "Profile of " + mei.title;
393  if (mei.zlabel.size() > 0) mei.title = mei.title + " (Z: " + mei.zlabel + ")";
394  }
395  // only update range
396  MEInfo& mei = toBeBooked[significantvalues];
397  double val;
398 
399  for (auto it = firststep+1; it != laststep; ++it) {
400  switch (it->type) {
402  val = geometryInterface.extract(it->columns[0], iq).second;
403  if (val == GeometryInterface::UNDEFINED) break;
404  mei.range_x_min = std::min(mei.range_x_min, val);
405  mei.range_x_max = std::max(mei.range_x_max, val);
406  break;
408  val = geometryInterface.extract(it->columns[0], iq).second;
409  if (val == GeometryInterface::UNDEFINED) break;
410  mei.range_y_min = std::min(mei.range_y_min, val);
411  mei.range_y_max = std::max(mei.range_y_max, val);
412  break;
413  default: // ignore the rest, code above will catch bugs
414  break;
415  }
416  }
417  }
418 
419  // Now do the actual booking.
420  for (auto& e : toBeBooked) {
421  AbstractHistogram& h = t[e.first];
422  MEInfo& mei = e.second;
423  auto name = makePathName(s, e.first, &(*laststep));
424  iBooker.setCurrentFolder(name.first);
425 
426  // determine nbins for geometry derived quantities
427  // due to how we counted above, we need to include lower and upper bound
428  // For Coord-values, which are not precisely aligned with the bins, we force
429  // alignment.
430  if (mei.binwidth_x != 0) {
431  double range = (mei.range_x_max - mei.range_x_min)/mei.binwidth_x;
432  if ((range - int(range)) == 0.0) {
433  mei.range_x_min -= mei.binwidth_x/2;
434  mei.range_x_max += mei.binwidth_x/2;
435  } else {
436  mei.range_x_min = std::floor(mei.range_x_min/mei.binwidth_x)*mei.binwidth_x;
437  mei.range_x_max = std::ceil(mei.range_x_max/mei.binwidth_x)*mei.binwidth_x;
438  }
439  mei.range_x_nbins = int((mei.range_x_max - mei.range_x_min)/mei.binwidth_x);
440  }
441  if (mei.binwidth_y != 0) {
442  double range = (mei.range_y_max - mei.range_y_min)/mei.binwidth_y;
443  if ((range - int(range)) == 0.0) {
444  mei.range_y_min -= mei.binwidth_y/2;
445  mei.range_y_max += mei.binwidth_y/2;
446  } else {
447  mei.range_y_min = std::floor(mei.range_y_min/mei.binwidth_y)*mei.binwidth_y;
448  mei.range_y_max = std::ceil(mei.range_y_max/mei.binwidth_y)*mei.binwidth_y;
449  }
450  mei.range_y_nbins = int((mei.range_y_max - mei.range_y_min)/mei.binwidth_y);
451  }
452 
453  if (mei.dimensions == 1) {
454  h.me = iBooker.book1D(name.second, (mei.title + ";" + mei.xlabel).c_str(),
455  mei.range_x_nbins, mei.range_x_min, mei.range_x_max);
456  } else if (mei.dimensions == 2 && !mei.do_profile) {
457  h.me = iBooker.book2D(name.second, (mei.title + ";" + mei.xlabel + ";" + mei.ylabel).c_str(),
458  mei.range_x_nbins, mei.range_x_min, mei.range_x_max,
459  mei.range_y_nbins, mei.range_y_min, mei.range_y_max);
460  } else if (mei.dimensions == 2 && mei.do_profile) {
461  h.me = iBooker.bookProfile(name.second, (mei.title + ";" + mei.xlabel + ";" + mei.ylabel).c_str(),
462  mei.range_x_nbins, mei.range_x_min, mei.range_x_max, 0.0, 0.0);
463  } else if (mei.dimensions == 3 && mei.do_profile) {
464  h.me = iBooker.bookProfile2D(name.second, (mei.title + ";" + mei.xlabel + ";" + mei.ylabel).c_str(),
465  mei.range_x_nbins, mei.range_x_min, mei.range_x_max,
466  mei.range_y_nbins, mei.range_y_min, mei.range_y_max,
467  0.0, 0.0); // Z range is ignored if min==max
468  } else {
469  edm::LogError("HistogramManager") << "Illegal Histogram!\n"
470  << "name " << name.second << "\n"
471  << "dim " << mei.dimensions << " profile " << mei.do_profile << "\n";
472  assert(!"Illegal Histogram kind.");
473  }
474  h.th1 = h.me->getTH1();
475  }
476  }
477 }
int i
Definition: DBlmapReader.cc:9
MonitorElement * me
FWCore Framework interface EventSetupRecordImplementation h
Helper function to determine trigger accepts.
MonitorElement * bookProfile(Args &&...args)
Definition: DQMStore.h:157
std::string pretty(Column col)
assert(m_qm.get())
std::vector< SummationSpecification > specs
std::pair< std::string, std::string > makePathName(SummationSpecification const &s, GeometryInterface::Values const &, SummationStep const *upto)
std::string xlabel
Value maxValue(ID id)
void load(edm::EventSetup const &iSetup)
void extractColumns(std::vector< Column > const &names, InterestingQuantities const &iq, Values &out)
MonitorElement * bookProfile2D(Args &&...args)
Definition: DQMStore.h:163
MonitorElement * book1D(Args &&...args)
Definition: DQMStore.h:115
TH1 * getTH1(void) const
T min(T a, T b)
Definition: MathUtil.h:58
static const Value UNDEFINED
std::string ylabel
std::vector< std::pair< Column, Value > > Values
void setCurrentFolder(const std::string &fullpath)
Definition: DQMStore.cc:277
std::vector< GeometryInterface::Values > significantvalues
MonitorElement * book2D(Args &&...args)
Definition: DQMStore.h:133
std::vector< Table > tables
Value minValue(ID id)
if(dp >Float(M_PI)) dp-
std::pair< Column, Value > extract(Column const &col, InterestingQuantities const &iq)
std::vector< Table > counters
std::vector< InterestingQuantities > const & allModules()
step
int col
Definition: cuy.py:1008
GeometryInterface::InterestingQuantities iq
#define SET_AXIS(to, from)
GeometryInterface & geometryInterface
void HistogramManager::executeExtend ( SummationStep const &  step,
Table t,
std::string const &  reduction,
DQMStore::IBooker iBooker,
SummationSpecification const &  s 
)
private

Definition at line 558 of file HistogramManager.cc.

References assert(), DQMStore::IBooker::book1D(), SummationStep::columns, AbstractHistogram::count, alignCSCRings::e, GeometryInterface::extractColumns(), plotBeamSpotDB::first, geometryInterface, MonitorElement::getTH1(), i, AbstractHistogram::iq_sample, makePathName(), AbstractHistogram::me, gen::n, name, hlt_dqm_clientPB-live_cfg::nbins, fileinputsource_cfi::out, GeometryInterface::pretty(), edm::separator(), DQMStore::IBooker::setCurrentFolder(), significantvalues, AlCaHLTBitMon_QueryRunRegistry::string, AbstractHistogram::th1, and title.

Referenced by executeHarvesting().

559  {
560  // For the moment only X.
561  // first pass determines the range.
562  std::map<GeometryInterface::Values, int> nbins;
563  // separators collects meta info for the render plugin about the boundaries.
564  // for each EXTEND, this is added to the axis label. In total this is not
565  // fully correct since we have to assume the the substructure of each sub-
566  // histogram is the same, which is e.g. not true for layers. It still works
567  // since layers only contain leaves (ladders).
568  std::map<GeometryInterface::Values, std::string> separators;
569 
571 
572  for (auto& e : t) {
573  geometryInterface.extractColumns(step.columns, e.second.iq_sample,
574  significantvalues);
575  int& n = nbins[significantvalues];
576  assert(e.second.th1 || !"invalid histogram");
577  // if we reduce, every histogram only needs one bin
578  int bins = reduce_type != "" ? 1 : e.second.th1->GetXaxis()->GetNbins();
579  if (bins > 1) separators[significantvalues] += std::to_string(n) + ",";
580  n += bins;
581  }
582  for (auto& e : separators) e.second = "(" + e.second + ")/";
583 
584  Table out;
585  for (auto& e : t) {
586  geometryInterface.extractColumns(step.columns, e.second.iq_sample,
587  significantvalues);
588  TH1* th1 = e.second.th1;
589  assert(th1);
590 
591  AbstractHistogram& new_histo = out[significantvalues];
592  if (!new_histo.me) {
593  // we put the name of the actual, last column of a input histo there.
594  std::string colname = geometryInterface.pretty((e.first.end()-1)->first);
595 
596  auto separator = separators[significantvalues];
597 
598  auto name = makePathName(s, significantvalues, &step);
599  auto title = std::string("") + th1->GetTitle() + " per " + colname + ";" +
600  colname + separator +
601  (reduce_type != "" ? th1->GetYaxis()->GetTitle() : th1->GetXaxis()->GetTitle()) + ";" +
602  (reduce_type != "" ? reduce_type + " of " + th1->GetXaxis()->GetTitle() : th1->GetYaxis()->GetTitle());
603  iBooker.setCurrentFolder(name.first);
604 
605  if (th1->GetDimension() == 1) {
606  new_histo.me = iBooker.book1D(name.second, title,
607  nbins[significantvalues], 0.5, nbins[significantvalues] + 0.5);
608  } else {
609  assert(!"2D extend not implemented in harvesting.");
610  }
611  new_histo.th1 = new_histo.me->getTH1();
612  new_histo.iq_sample = e.second.iq_sample;
613  new_histo.count = 1; // used as a fill pointer. Assumes histograms are
614  // ordered correctly (map should provide that)
615  }
616 
617  // now add data.
618  if (new_histo.th1->GetDimension() == 1) {
619  if (reduce_type == "") { // no reduction, concatenate
620  for (int i = 1; i <= th1->GetXaxis()->GetNbins(); i++) {
621  new_histo.th1->SetBinContent(new_histo.count, th1->GetBinContent(i));
622  new_histo.th1->SetBinError(new_histo.count, th1->GetBinError(i));
623  new_histo.count += 1;
624  }
625  } else if (reduce_type == "MEAN") {
626  new_histo.th1->SetBinContent(new_histo.count, th1->GetMean());
627  new_histo.th1->SetBinError(new_histo.count, th1->GetMeanError());
628  new_histo.count += 1;
629  } else {
630  assert(!"Reduction type not supported");
631  }
632  } else {
633  assert(!"2D extend not implemented in harvesting.");
634  }
635  }
636  t.swap(out);
637 }
int i
Definition: DBlmapReader.cc:9
MonitorElement * me
GeometryInterface::InterestingQuantities iq_sample
std::string pretty(Column col)
assert(m_qm.get())
std::pair< std::string, std::string > makePathName(SummationSpecification const &s, GeometryInterface::Values const &, SummationStep const *upto)
void extractColumns(std::vector< Column > const &names, InterestingQuantities const &iq, Values &out)
MonitorElement * book1D(Args &&...args)
Definition: DQMStore.h:115
TH1 * getTH1(void) const
std::vector< std::pair< Column, Value > > Values
void setCurrentFolder(const std::string &fullpath)
Definition: DQMStore.cc:277
std::vector< GeometryInterface::Values > significantvalues
std::map< GeometryInterface::Values, AbstractHistogram > Table
static std::string const separator(":")
step
GeometryInterface & geometryInterface
void HistogramManager::executeGroupBy ( SummationStep const &  step,
Table t,
DQMStore::IBooker iBooker,
SummationSpecification const &  s 
)
private

Definition at line 531 of file HistogramManager.cc.

References assert(), DQMStore::IBooker::book1D(), DQMStore::IBooker::book2D(), DQMStore::IBooker::bookProfile(), DQMStore::IBooker::bookProfile2D(), SummationStep::columns, alignCSCRings::e, GeometryInterface::extractColumns(), geometryInterface, MonitorElement::getTH1(), AbstractHistogram::iq_sample, makePathName(), AbstractHistogram::me, name, fileinputsource_cfi::out, DQMStore::IBooker::setCurrentFolder(), significantvalues, and AbstractHistogram::th1.

Referenced by executeHarvesting().

532  {
533  // Simple regrouping, sum histos if they end up in the same place.
534  Table out;
536  for (auto& e : t) {
537  TH1* th1 = e.second.th1;
538  geometryInterface.extractColumns(step.columns, e.second.iq_sample,
539  significantvalues);
540  AbstractHistogram& new_histo = out[significantvalues];
541  if (!new_histo.me) {
542  auto name = makePathName(s, significantvalues, &step);
543  iBooker.setCurrentFolder(name.first);
544  if (dynamic_cast<TH1F*>(th1)) new_histo.me = iBooker.book1D(name.second, (TH1F*) th1);
545  else if (dynamic_cast<TH2F*>(th1)) new_histo.me = iBooker.book2D(name.second, (TH2F*) th1);
546  else if (dynamic_cast<TProfile*>(th1)) new_histo.me = iBooker.bookProfile(name.second, (TProfile*) th1);
547  else if (dynamic_cast<TProfile2D*>(th1)) new_histo.me = iBooker.bookProfile2D(name.second, (TProfile2D*) th1);
548  else assert(!"No idea how to book this.");
549  new_histo.th1 = new_histo.me->getTH1();
550  new_histo.iq_sample = e.second.iq_sample;
551  } else {
552  new_histo.th1->Add(th1);
553  }
554  }
555  t.swap(out);
556 }
MonitorElement * me
GeometryInterface::InterestingQuantities iq_sample
MonitorElement * bookProfile(Args &&...args)
Definition: DQMStore.h:157
assert(m_qm.get())
std::pair< std::string, std::string > makePathName(SummationSpecification const &s, GeometryInterface::Values const &, SummationStep const *upto)
void extractColumns(std::vector< Column > const &names, InterestingQuantities const &iq, Values &out)
MonitorElement * bookProfile2D(Args &&...args)
Definition: DQMStore.h:163
MonitorElement * book1D(Args &&...args)
Definition: DQMStore.h:115
TH1 * getTH1(void) const
std::vector< std::pair< Column, Value > > Values
void setCurrentFolder(const std::string &fullpath)
Definition: DQMStore.cc:277
std::vector< GeometryInterface::Values > significantvalues
MonitorElement * book2D(Args &&...args)
Definition: DQMStore.h:133
std::map< GeometryInterface::Values, AbstractHistogram > Table
step
GeometryInterface & geometryInterface
void HistogramManager::executeHarvesting ( DQMStore::IBooker iBooker,
DQMStore::IGetter iGetter 
)

Definition at line 639 of file HistogramManager.cc.

References SummationStep::arg, assert(), enabled, executeExtend(), executeGroupBy(), SummationStep::EXTEND_X, SummationStep::EXTEND_Y, geometryInterface, SummationStep::GROUPBY, i, loadFromDQMStore(), dqm-mbProfile::log, name, SummationStep::REDUCE, alignCSCRings::s, SummationStep::SAVE, specs, SummationStep::stage, SummationStep::STAGE2, AlCaHLTBitMon_QueryRunRegistry::string, t, tables, and SummationStep::type.

Referenced by executePerLumiHarvesting().

640  {
641  if (!enabled) return;
642  // Debug output
643  for (auto& s : specs) {
644  edm::LogInfo log("HistogramManager");
645  log << "Specs for " << name << " ";
646  s.dump(log, geometryInterface);
647  }
648 
649  for (unsigned int i = 0; i < specs.size(); i++) {
650  auto& s = specs[i];
651  auto& t = tables[i];
652  loadFromDQMStore(s, t, iGetter);
653 
654  std::string reduce_type = "";
655 
656  // now execute step2.
657  for (SummationStep const& step : s.steps) {
658  if (step.stage == SummationStep::STAGE2) {
659  switch (step.type) {
660  case SummationStep::SAVE:
661  // no explicit implementation atm.
662  break;
664  executeGroupBy(step, t, iBooker, s);
665  break;
667  // reduction is done in the following EXTEND
668  reduce_type = step.arg;
669  break;
671  executeExtend(step, t, reduce_type, iBooker, s);
672  reduce_type = "";
673  break;
675  assert(!"EXTEND_Y currently not supported in harvesting.");
676  break;
677  default:
678  assert(!"Operation not supported in harvesting.");
679  }
680  }
681  }
682  }
683 }
int i
Definition: DBlmapReader.cc:9
assert(m_qm.get())
void executeGroupBy(SummationStep const &step, Table &t, DQMStore::IBooker &iBooker, SummationSpecification const &s)
std::vector< SummationSpecification > specs
void executeExtend(SummationStep const &step, Table &t, std::string const &reduction, DQMStore::IBooker &iBooker, SummationSpecification const &s)
void loadFromDQMStore(SummationSpecification &s, Table &t, DQMStore::IGetter &iGetter)
std::vector< Table > tables
step
GeometryInterface & geometryInterface
void HistogramManager::executePerEventHarvesting ( edm::Event const *  ev)

Definition at line 182 of file HistogramManager.cc.

References assert(), bookUndefined, EnergyCorrector::c, SummationStep::COUNT, counters, alignCSCRings::e, enabled, GeometryInterface::extractColumns(), fillInternal(), geometryInterface, SummationStep::GROUPBY, timingPdfMaker::histo, i, iq, alignCSCRings::s, significantvalues, GeometryInterface::InterestingQuantities::sourceEvent, GeometryInterface::InterestingQuantities::sourceModule, specs, t, and tables.

182  {
183  if (!enabled) return;
184  for (unsigned int i = 0; i < specs.size(); i++) {
185  auto& s = specs[i];
186  auto& t = tables[i];
187  auto& c = counters[i];
188  if (s.steps[0].type != SummationStep::COUNT) continue; // no counting, done
189  assert((s.steps.size() >= 2 && s.steps[1].type == SummationStep::GROUPBY)
190  || !"Incomplete spec (but this cannot be caught in Python)");
191  for (auto& e : c) {
192  // the iq on the counter can only be a _sample_, since many modules
193  // could be grouped on one counter. Even worse, the sourceEvent ptr
194  // could be dangling if the counter was not touched in this event, so
195  // we replace it. row/col are most likely useless as well.
196  auto iq = e.second.iq_sample;
197  iq.sourceEvent = sourceEvent;
198 
199  significantvalues[i].clear();
200  geometryInterface.extractColumns(s.steps[1].columns, iq,
202  auto histo = t.find(significantvalues[i]);
203  if (histo == t.end()) {
204  if (!bookUndefined) continue;
205  edm::LogError("HistogramManager") << "Histogram Missing!\n"
206  << "name " << t.begin()->second.th1->GetName() << "\n"
207  << "ctr " << " detid " << iq.sourceModule << "\n";
208  assert(!"Histogram not booked! (per-event) Probably inconsistent geometry description.");
209  }
210  fillInternal(e.second.count, 0, 1, iq, s.steps.begin()+2, s.steps.end(), histo->second);
211  e.second.count = 0;
212  }
213  }
214 }
int i
Definition: DBlmapReader.cc:9
assert(m_qm.get())
std::vector< SummationSpecification > specs
void fillInternal(double x, double y, int n_parameters, GeometryInterface::InterestingQuantities const &iq, std::vector< SummationStep >::iterator first, std::vector< SummationStep >::iterator last, AbstractHistogram &dest)
void extractColumns(std::vector< Column > const &names, InterestingQuantities const &iq, Values &out)
std::vector< GeometryInterface::Values > significantvalues
std::vector< Table > tables
std::vector< Table > counters
GeometryInterface::InterestingQuantities iq
GeometryInterface & geometryInterface
void HistogramManager::executePerLumiHarvesting ( DQMStore::IBooker iBooker,
DQMStore::IGetter iGetter,
edm::LuminosityBlock const &  lumiBlock,
edm::EventSetup const &  iSetup 
)

Definition at line 481 of file HistogramManager.cc.

References enabled, executeHarvesting(), geometryInterface, GeometryInterface::load(), GeometryInterface::loaded(), lumisection, and perLumiHarvesting.

484  {
485  if (!enabled) return;
486  // this should also give us the GeometryInterface for offline, though it is a
487  // bit dirty and might explode.
488  if (!geometryInterface.loaded()) {
489  geometryInterface.load(iSetup);
490  }
491  if (perLumiHarvesting) {
492  this->lumisection = &lumiBlock; // "custom" steps can use this
493  executeHarvesting(iBooker, iGetter);
494  this->lumisection = nullptr;
495  }
496 }
void executeHarvesting(DQMStore::IBooker &iBooker, DQMStore::IGetter &iGetter)
void load(edm::EventSetup const &iSetup)
edm::LuminosityBlock const * lumisection
GeometryInterface & geometryInterface
void HistogramManager::fill ( DetId  sourceModule,
const edm::Event sourceEvent = 0,
int  col = 0,
int  row = 0 
)

Definition at line 115 of file HistogramManager.cc.

References assert(), and dimensions.

Referenced by fill().

116  {
117  assert(this->dimensions == 0);
118  fill(0.0, 0.0, sourceModule, sourceEvent, col, row);
119 }
assert(m_qm.get())
void fill(DetId sourceModule, const edm::Event *sourceEvent=0, int col=0, int row=0)
int col
Definition: cuy.py:1008
void HistogramManager::fill ( double  value,
DetId  sourceModule,
const edm::Event sourceEvent = 0,
int  col = 0,
int  row = 0 
)

Definition at line 110 of file HistogramManager.cc.

References assert(), dimensions, and fill().

111  {
112  assert(this->dimensions == 1);
113  fill(x, 0.0, sourceModule, sourceEvent, col, row);
114 }
assert(m_qm.get())
void fill(DetId sourceModule, const edm::Event *sourceEvent=0, int col=0, int row=0)
int col
Definition: cuy.py:1008
void HistogramManager::fill ( double  x,
double  y,
DetId  sourceModule,
const edm::Event sourceEvent = 0,
int  col = 0,
int  row = 0 
)

Definition at line 65 of file HistogramManager.cc.

References assert(), bookUndefined, GeometryInterface::InterestingQuantities::col, SummationStep::COUNT, counters, dimensions, enabled, GeometryInterface::extractColumns(), fastpath, fillInternal(), geometryInterface, timingPdfMaker::histo, i, iq, alignCSCRings::s, significantvalues, specs, t, and tables.

66  {
67  if (!enabled) return;
68  bool cached = true;
69  // We could be smarter on row/col and only check if they appear in the spec
70  // but that just asks for bugs.
71  if (col != this->iq.col || row != this->iq.row ||
72  sourceModule != this->iq.sourceModule ||
73  sourceEvent != this->iq.sourceEvent ||
74  sourceModule == 0xFFFFFFFF ||
75  sourceModule == DetId(0) // Hack for eventrate-like things, since the
76  // sourceEvent ptr might not change.
77  ) {
78  cached = false;
79  iq = GeometryInterface::InterestingQuantities{sourceEvent, sourceModule,
80  int16_t(col), int16_t(row)};
81  }
82  for (unsigned int i = 0; i < specs.size(); i++) {
83  auto& s = specs[i];
84  auto& t = s.steps[0].type == SummationStep::COUNT ? counters[i] : tables[i];
85  if (!cached) {
86  significantvalues[i].clear();
87  geometryInterface.extractColumns(s.steps[0].columns, iq,
89  fastpath[i] = nullptr;
90  }
91 
92  if (!fastpath[i]) {
93  auto histo = t.find(significantvalues[i]);
94  if (histo == t.end()) {
95  if (!bookUndefined) continue;
96  edm::LogError("HistogramManager") << "Missing Histogram!\n"
97  << "name " << tables[i].begin()->second.th1->GetName() << "\n";
98  assert(!"Histogram not booked! Probably inconsistent geometry description.");
99  }
100 
101  fastpath[i] = &(histo->second);
102  }
103  if (s.steps[0].type == SummationStep::COUNT) {
104  fastpath[i]->count++;
105  } else {
106  fillInternal(x, y, this->dimensions, iq, s.steps.begin()+1, s.steps.end(), *(fastpath[i]));
107  }
108  }
109 }
int i
Definition: DBlmapReader.cc:9
assert(m_qm.get())
std::vector< SummationSpecification > specs
void fillInternal(double x, double y, int n_parameters, GeometryInterface::InterestingQuantities const &iq, std::vector< SummationStep >::iterator first, std::vector< SummationStep >::iterator last, AbstractHistogram &dest)
void extractColumns(std::vector< Column > const &names, InterestingQuantities const &iq, Values &out)
Definition: DetId.h:18
std::vector< AbstractHistogram * > fastpath
std::vector< GeometryInterface::Values > significantvalues
std::vector< Table > tables
std::vector< Table > counters
int col
Definition: cuy.py:1008
GeometryInterface::InterestingQuantities iq
GeometryInterface & geometryInterface
void HistogramManager::fillInternal ( double  x,
double  y,
int  n_parameters,
GeometryInterface::InterestingQuantities const &  iq,
std::vector< SummationStep >::iterator  first,
std::vector< SummationStep >::iterator  last,
AbstractHistogram dest 
)
private

Definition at line 121 of file HistogramManager.cc.

References assert(), SummationStep::EXTEND_X, SummationStep::EXTEND_Y, GeometryInterface::extract(), MonitorElement::Fill(), geometryInterface, plotBeamSpotDB::last, AbstractHistogram::me, SummationStep::PROFILE, SummationStep::STAGE1, AbstractHistogram::th1, SummationStep::USE_X, SummationStep::USE_Y, SummationStep::USE_Z, x, and y.

Referenced by executePerEventHarvesting(), and fill().

125  {
126 
127  double fx = 0, fy = 0, fz = 0;
128  int tot_parameters = n_parameters;
129  for (auto it = first; it != last; ++it) {
130  if (it->stage != SummationStep::STAGE1) break;
131  // The specification builder precomputes where x and y go, this loop will
132  // always do 3 iterations to set x, y, z. The builder does not know how
133  // many parameters we have, so we have to check that and count the total.
134  switch (it->type) {
136  if (it->arg[0] == '1' && n_parameters >= 1) fx = x;
137  if (it->arg[0] == '2' && n_parameters >= 2) fx = y;
138  break;
140  if (it->arg[0] == '1' && n_parameters >= 1) fy = x;
141  if (it->arg[0] == '2' && n_parameters >= 2) fy = y;
142  break;
144  if (it->arg[0] == '1' && n_parameters >= 1) fz = x;
145  if (it->arg[0] == '2' && n_parameters >= 2) fz = y;
146  break;
148  fx = geometryInterface.extract(it->columns[0], iq).second;
149  tot_parameters++;
150  break;
152  fy = geometryInterface.extract(it->columns[0], iq).second;
153  tot_parameters++;
154  break;
156  break; // profile does not make a difference here, only in booking
157  default:
158  assert(!"illegal step in STAGE1!");
159  }
160  }
161 
162  switch(tot_parameters) {
163  case 1:
164  dest.me->Fill(fx);
165  break;
166  case 2:
167  dest.me->Fill(fx, fy);
168  break;
169  case 3:
170  dest.me->Fill(fx, fy, fz);
171  break;
172  default:
173  edm::LogError("HistogramManager") << "got " << tot_parameters << " dimensions\n"
174  << "name " << dest.th1->GetName() << "\n";
175  assert(!"More than 3 dimensions should never occur.");
176  }
177 }
MonitorElement * me
assert(m_qm.get())
void Fill(long long x)
std::pair< Column, Value > extract(Column const &col, InterestingQuantities const &iq)
GeometryInterface::InterestingQuantities iq
GeometryInterface & geometryInterface
void HistogramManager::loadFromDQMStore ( SummationSpecification s,
Table t,
DQMStore::IGetter iGetter 
)
private

Definition at line 498 of file HistogramManager.cc.

References GeometryInterface::allModules(), bookUndefined, GeometryInterface::extractColumns(), geometryInterface, DQMStore::IGetter::get(), MonitorElement::getTH1(), SummationStep::GROUPBY, timingPdfMaker::histo, iq, AbstractHistogram::iq_sample, makePathName(), AbstractHistogram::me, hlt_dqm_clientPB-live_cfg::me, name, fed_dqm_sourceclient-live_cfg::path, significantvalues, SummationStep::STAGE2, SummationSpecification::steps, AlCaHLTBitMon_QueryRunRegistry::string, and AbstractHistogram::th1.

Referenced by executeHarvesting().

499  {
500  t.clear();
502  auto firststep = s.steps.begin();
503  if (firststep->type != SummationStep::GROUPBY) ++firststep;
504  auto laststep = std::find_if(s.steps.begin(), s.steps.end(),
505  [](SummationStep const& step) { return step.stage == SummationStep::STAGE2; });
506 
507  for (auto iq : geometryInterface.allModules()) {
508 
509  geometryInterface.extractColumns(firststep->columns, iq,
510  significantvalues);
511 
512  auto histo = t.find(significantvalues);
513  if (histo == t.end()) {
514  auto name = makePathName(s, significantvalues, &(*laststep));
515  std::string path = name.first + name.second;
516  MonitorElement* me = iGetter.get(path);
517  if (!me) {
518  if (bookUndefined)
519  edm::LogError("HistogramManager") << "ME " << path << " not found\n";
520  // else this will happen quite often
521  } else {
523  histo.me = me;
524  histo.th1 = histo.me->getTH1();
525  histo.iq_sample = iq;
526  }
527  }
528  }
529 }
MonitorElement * me
GeometryInterface::InterestingQuantities iq_sample
MonitorElement * get(const std::string &path)
Definition: DQMStore.cc:305
std::pair< std::string, std::string > makePathName(SummationSpecification const &s, GeometryInterface::Values const &, SummationStep const *upto)
std::vector< SummationStep > steps
void extractColumns(std::vector< Column > const &names, InterestingQuantities const &iq, Values &out)
TH1 * getTH1(void) const
std::vector< std::pair< Column, Value > > Values
std::vector< GeometryInterface::Values > significantvalues
std::vector< InterestingQuantities > const & allModules()
step
GeometryInterface::InterestingQuantities iq
GeometryInterface & geometryInterface
std::pair< std::string, std::string > HistogramManager::makePathName ( SummationSpecification const &  s,
GeometryInterface::Values const &  significantvalues,
SummationStep const *  upto 
)
private

Definition at line 217 of file HistogramManager.cc.

References SummationStep::arg, SummationStep::columns, SummationStep::COUNT, dir, alignCSCRings::e, SummationStep::EXTEND_X, SummationStep::EXTEND_Y, GeometryInterface::formatValue(), geometryInterface, name, GeometryInterface::pretty(), cmsRelvalreport::red(), SummationStep::REDUCE, SummationStep::stage, SummationStep::STAGE1, SummationSpecification::steps, AlCaHLTBitMon_QueryRunRegistry::string, createPayload::suffix, top_folder_name, and SummationStep::type.

Referenced by book(), executeExtend(), executeGroupBy(), and loadFromDQMStore().

219  {
220  std::ostringstream dir("");
221  std::string suffix = "";
222 
223  // we omit the last value here, to get all disks next to each other etc.
224  if (significantvalues.size() > 0) {
225  for (auto it = significantvalues.begin();
226  it != (significantvalues.end()-1); ++it) {
227  auto name = geometryInterface.formatValue(it->first, it->second);
228  if (name == "") continue;
229  dir << name << "/";
230  }
231  auto e = significantvalues[significantvalues.size()-1];
232  suffix = "_" + geometryInterface.formatValue(e.first, e.second);
233  }
234 
235  // PERF: this is actually independent of significantvalues and iq
236  std::string name = this->name;
237  for (SummationStep const& step : s.steps) {
238  if (&step == upto) break;
239  switch (step.type) {
241  name = "num_" + name;
242  break;
245  if (step.stage != SummationStep::STAGE1) break;
246  GeometryInterface::Column col0 = step.columns[0];
247  std::string colname = geometryInterface.pretty(col0);
248  name = name + "_per_" + colname;
249  break;}
250  case SummationStep::REDUCE: {
251  auto red = step.arg;
252  boost::algorithm::to_lower(red);
253  name = red + "_" + name;
254  break;}
255  default:
256  // Maybe PROFILE is worth showing.
257  break; // not visible in name
258  }
259  }
260  return std::make_pair(top_folder_name + "/" + dir.str(), name + suffix);
261 }
std::vector< GeometryInterface::Column > columns
std::string pretty(Column col)
std::string formatValue(Column, Value)
std::string top_folder_name
std::vector< GeometryInterface::Values > significantvalues
step
dbl *** dir
Definition: mlp_gen.cc:35
GeometryInterface & geometryInterface

Member Data Documentation

bool HistogramManager::bookUndefined

Definition at line 82 of file HistogramManager.h.

Referenced by book(), executePerEventHarvesting(), fill(), and loadFromDQMStore().

std::vector<Table> HistogramManager::counters
private
int HistogramManager::dimensions

Definition at line 89 of file HistogramManager.h.

Referenced by book(), and fill().

bool HistogramManager::enabled
std::vector<AbstractHistogram*> HistogramManager::fastpath
private

Definition at line 110 of file HistogramManager.h.

Referenced by addSpec(), and fill().

GeometryInterface& HistogramManager::geometryInterface
private
const edm::ParameterSet& HistogramManager::iConfig
private

Definition at line 57 of file HistogramManager.h.

GeometryInterface::InterestingQuantities HistogramManager::iq
private

Definition at line 106 of file HistogramManager.h.

Referenced by book(), executePerEventHarvesting(), fill(), and loadFromDQMStore().

edm::LuminosityBlock const* HistogramManager::lumisection = 0

Definition at line 98 of file HistogramManager.h.

Referenced by executePerLumiHarvesting().

std::string HistogramManager::name

Definition at line 85 of file HistogramManager.h.

Referenced by ElectronMVAID.ElectronMVAID::__call__(), dirstructure.Directory::__create_pie_image(), DisplayManager.DisplayManager::__del__(), dqm_interfaces.DirID::__eq__(), dirstructure.Directory::__get_full_path(), dirstructure.Comparison::__get_img_name(), dataset.Dataset::__getDataType(), dataset.Dataset::__getFileInfoList(), cuy.divideElement::__init__(), cuy.plotElement::__init__(), cuy.additionElement::__init__(), cuy.superimposeElement::__init__(), cuy.graphElement::__init__(), dirstructure.Comparison::__make_image(), core.autovars.NTupleVariable::__repr__(), core.autovars.NTupleObjectType::__repr__(), core.autovars.NTupleObject::__repr__(), core.autovars.NTupleCollection::__repr__(), dirstructure.Directory::__repr__(), dqm_interfaces.DirID::__repr__(), dirstructure.Comparison::__repr__(), config.Service::__setattr__(), config.CFG::__str__(), counter.Counter::__str__(), average.Average::__str__(), core.autovars.NTupleObjectType::addSubObjects(), core.autovars.NTupleObjectType::addVariables(), core.autovars.NTupleObjectType::allVars(), book(), dirstructure.Directory::calcStats(), validation.Sample::digest(), python.rootplot.utilities.Hist::divide(), python.rootplot.utilities.Hist::divide_wilson(), DisplayManager.DisplayManager::Draw(), TreeCrawler.Package::dump(), executeExtend(), executeGroupBy(), executeHarvesting(), core.autovars.NTupleVariable::fillBranch(), core.autovars.NTupleObject::fillBranches(), core.autovars.NTupleCollection::fillBranchesScalar(), core.autovars.NTupleCollection::fillBranchesVector(), core.autovars.NTupleCollection::get_cpp_declaration(), core.autovars.NTupleCollection::get_cpp_wrapper_class(), core.autovars.NTupleCollection::get_py_wrapper_class(), utils.StatisticalTest::get_status(), production_tasks.Task::getname(), dataset.CMSDataset::getPrimaryDatasetEntries(), dataset.PrivateDataset::getPrimaryDatasetEntries(), VIDSelectorBase.VIDSelectorBase::initialize(), loadFromDQMStore(), personalPlayback.Applet::log(), core.autovars.NTupleVariable::makeBranch(), core.autovars.NTupleObject::makeBranches(), core.autovars.NTupleCollection::makeBranchesScalar(), core.autovars.NTupleCollection::makeBranchesVector(), makePathName(), dirstructure.Directory::print_report(), dataset.BaseDataset::printInfo(), dataset.Dataset::printInfo(), production_tasks.MonitorJobs::run(), python.rootplot.utilities.Hist::TGraph(), python.rootplot.utilities.Hist::TH1F(), Vispa.Views.PropertyView.Property::valueChanged(), counter.Counter::write(), and average.Average::write().

bool HistogramManager::perLumiHarvesting

Definition at line 81 of file HistogramManager.h.

Referenced by executePerLumiHarvesting().

double HistogramManager::range_x_max

Definition at line 92 of file HistogramManager.h.

Referenced by book().

double HistogramManager::range_x_min

Definition at line 91 of file HistogramManager.h.

Referenced by book().

int HistogramManager::range_x_nbins

Definition at line 90 of file HistogramManager.h.

Referenced by book().

double HistogramManager::range_y_max

Definition at line 95 of file HistogramManager.h.

Referenced by book().

double HistogramManager::range_y_min

Definition at line 94 of file HistogramManager.h.

Referenced by book().

int HistogramManager::range_y_nbins

Definition at line 93 of file HistogramManager.h.

Referenced by book().

std::vector<GeometryInterface::Values> HistogramManager::significantvalues
private
std::vector<SummationSpecification> HistogramManager::specs
private

Definition at line 60 of file HistogramManager.h.

Referenced by addSpec(), book(), executeHarvesting(), executePerEventHarvesting(), and fill().

std::vector<Table> HistogramManager::tables
private

Definition at line 61 of file HistogramManager.h.

Referenced by addSpec(), book(), executeHarvesting(), executePerEventHarvesting(), and fill().

std::string HistogramManager::title
std::string HistogramManager::top_folder_name

Definition at line 83 of file HistogramManager.h.

Referenced by makePathName().

std::string HistogramManager::xlabel
std::string HistogramManager::ylabel