CMS 3D CMS Logo

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 dqm::legacy::DQMStore DQMStore
 
typedef dqm::legacy::MonitorElement MonitorElement
 
typedef std::map< GeometryInterface::Values, AbstractHistogramTable
 

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::Valuessignificantvalues
 
std::vector< SummationSpecificationspecs
 
std::vector< Tabletables
 

Detailed Description

Definition at line 31 of file HistogramManager.h.

Member Typedef Documentation

Definition at line 33 of file HistogramManager.h.

Definition at line 34 of file HistogramManager.h.

Definition at line 59 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().

20  : iConfig(iconfig),
21  geometryInterface(geo),
22  enabled(iconfig.getParameter<bool>("enabled")),
23  perLumiHarvesting(iconfig.getParameter<bool>("perLumiHarvesting")),
24  bookUndefined(iconfig.getParameter<bool>("bookUndefined")),
25  top_folder_name(iconfig.getParameter<std::string>("topFolderName")),
26  name(iconfig.getParameter<std::string>("name")),
27  title(iconfig.getParameter<std::string>("title")),
28  xlabel(iconfig.getParameter<std::string>("xlabel")),
29  ylabel(iconfig.getParameter<std::string>("ylabel")),
30  dimensions(iconfig.getParameter<int>("dimensions")),
31  range_x_nbins(iconfig.getParameter<int>("range_nbins")),
32  range_x_min(iconfig.getParameter<double>("range_min")),
33  range_x_max(iconfig.getParameter<double>("range_max")),
34  range_y_nbins(iconfig.getParameter<int>("range_y_nbins")),
35  range_y_min(iconfig.getParameter<double>("range_y_min")),
36  range_y_max(iconfig.getParameter<double>("range_y_max")) {
37  auto spec_configs = iconfig.getParameter<edm::VParameterSet>("specs");
38  for (auto spec : spec_configs) {
39  // this would fit better in SummationSpecification(...), but it has to
40  // happen here.
41  auto conf = spec.getParameter<edm::ParameterSet>("conf");
42  if (!conf.getParameter<bool>("enabled"))
43  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 277 of file HistogramManager.cc.

References GeometryInterface::allModules(), GeometryInterface::binWidth(), dqm::dqmstoreimpl::DQMStore::IBooker::book1D(), dqm::dqmstoreimpl::DQMStore::IBooker::book2D(), dqm::dqmstoreimpl::DQMStore::IBooker::bookProfile(), dqm::dqmstoreimpl::DQMStore::IBooker::bookProfile2D(), bookUndefined, HltBtagPostValidation_cff::c, hgcaltilesconstants::ceil(), cuy::col, counters, dimensions, MillePedeFileConverter_cfg::e, enabled, SummationStep::EXTEND_X, SummationStep::EXTEND_Y, GeometryInterface::extract(), GeometryInterface::extractColumns(), geometryInterface, dqm::legacy::MonitorElement::getTH1(), SummationStep::GROUPBY, h, timingPdfMaker::histo, mps_fire::i, createfilelist::int, iq, GeometryInterface::load(), GeometryInterface::loaded(), makePathName(), SiStripPI::max, GeometryInterface::maxValue(), AbstractHistogram::me, min(), GeometryInterface::minValue(), name, convertSQLiteXML::ok, GeometryInterface::pretty(), SummationStep::PROFILE, FastTimerService_cff::range, range_x_max, range_x_min, range_x_nbins, range_y_max, range_y_min, range_y_nbins, alignCSCRings::s, SET_AXIS, dqm::dqmstoreimpl::DQMStore::IBooker::setCurrentFolder(), significantvalues, specs, SummationStep::STAGE2, AlCaHLTBitMon_QueryRunRegistry::string, OrderedSet::t, tables, AbstractHistogram::th1, title, GeometryInterface::UNDEFINED, SummationStep::USE_X, SummationStep::USE_Y, SummationStep::USE_Z, heppy_batch::val, x, xlabel, y, ylabel, and z.

277  {
278  if (!geometryInterface.loaded()) {
279  geometryInterface.load(iSetup);
280  }
281  if (!enabled)
282  return;
283 
284  struct MEInfo {
285  int dimensions = 1;
286  double range_x_min = 1e12;
287  double range_x_max = -1e12;
288  double range_y_min = 1e12;
289  double range_y_max = -1e12;
290  double range_z_min = 1e12; // z range carried around but unused
291  double range_z_max = -1e12;
292  int range_x_nbins = 0;
293  int range_y_nbins = 0;
294  int range_z_nbins = 0;
295  GeometryInterface::Value binwidth_x = 0; // override nbins for geom-things
296  GeometryInterface::Value binwidth_y = 0;
297  std::string title, xlabel, ylabel, zlabel;
298  bool do_profile = false;
299  };
300  std::map<GeometryInterface::Values, MEInfo> toBeBooked;
301 
302  for (unsigned int i = 0; i < specs.size(); i++) {
303  auto& s = specs[i];
304  auto& t = tables[i];
305  auto& c = counters[i];
306  toBeBooked.clear();
307  bool bookCounters = false;
308 
309  auto firststep = s.steps.begin();
310  int n_parameters = this->dimensions;
311 
312  if (firststep->type != SummationStep::GROUPBY) {
313  ++firststep;
314  n_parameters = 1;
315  bookCounters = true;
316  }
317 
318  auto laststep = std::find_if(
319  s.steps.begin(), s.steps.end(), [](SummationStep const& step) { return step.stage == SummationStep::STAGE2; });
320 
322 
323  for (auto iq : geometryInterface.allModules()) {
324  if (bookCounters) {
325  // add an entry for the counting step if present
326  geometryInterface.extractColumns(s.steps[0].columns, iq, significantvalues);
327  c[significantvalues].iq_sample = iq;
328  }
329 
330  geometryInterface.extractColumns(firststep->columns, iq, significantvalues);
331  if (!bookUndefined) {
332  // skip if any column is UNDEFINED
333  bool ok = true;
334  for (auto e : significantvalues)
335  if (e.second == GeometryInterface::UNDEFINED)
336  ok = false;
337  if (!ok)
338  continue;
339  }
340 
341  auto histo = toBeBooked.find(significantvalues);
342  if (histo == toBeBooked.end()) {
343  // create new histo
344  MEInfo& mei = toBeBooked[significantvalues];
345  mei.title = this->title;
346  if (bookCounters)
347  mei.title =
348  "Number of " + mei.title + " per Event and " + geometryInterface.pretty(*(s.steps[0].columns.end() - 1));
349  std::string xlabel = bookCounters ? "#" + this->xlabel : this->xlabel;
350 
351  // refer to fillInternal() for the actual execution
352  // compute labels, title, type, user-set ranges here
353  int tot_parameters = n_parameters;
354 
355 #define SET_AXIS(to, from) \
356  mei.to##label = from##label; \
357  mei.range_##to##_min = ((it->nbins == -1) ? this->range_##from##_min : it->xmin); \
358  mei.range_##to##_max = ((it->nbins == -1) ? this->range_##from##_max : it->xmax); \
359  mei.range_##to##_nbins = ((it->nbins == -1) ? this->range_##from##_nbins : it->nbins)
360 
361  for (auto it = firststep + 1; it != laststep; ++it) {
362  switch (it->type) {
364  if (it->arg[0] == '1' && n_parameters >= 1) {
365  SET_AXIS(x, x);
366  } // TODO: make use of current nbins, xmin, xmax if set
367  if (it->arg[0] == '2' && n_parameters >= 2) {
368  SET_AXIS(x, y);
369  }
370  break;
372  if (it->arg[0] == '1' && n_parameters >= 1) {
373  SET_AXIS(y, x);
374  }
375  if (it->arg[0] == '2' && n_parameters >= 2) {
376  SET_AXIS(y, y);
377  }
378  break;
380  if (it->arg[0] == '1' && n_parameters >= 1) {
381  SET_AXIS(z, x);
382  }
383  if (it->arg[0] == '2' && n_parameters >= 2) {
384  SET_AXIS(z, y);
385  }
386  break;
388  assert(mei.range_x_nbins == 0);
389  auto col = it->columns[0];
390  mei.xlabel = geometryInterface.pretty(col);
391  mei.title = mei.title + " by " + mei.xlabel;
393  mei.range_x_min = geometryInterface.minValue(col);
395  mei.range_x_max = geometryInterface.maxValue(col);
396  mei.binwidth_x = geometryInterface.binWidth(col);
397  tot_parameters++;
398  } break;
400  auto col = it->columns[0];
401  mei.ylabel = geometryInterface.pretty(col);
402  mei.title = mei.title + " by " + mei.ylabel;
404  mei.range_y_min = geometryInterface.minValue(col);
406  mei.range_y_max = geometryInterface.maxValue(col);
407  mei.binwidth_y = geometryInterface.binWidth(col);
408  tot_parameters++;
409  } break;
411  mei.do_profile = true;
412  break;
413  default:
414  assert(!"illegal step in STAGE1! (booking)");
415  }
416  }
417  mei.dimensions = tot_parameters;
418  if (mei.do_profile)
419  mei.title = "Profile of " + mei.title;
420  if (!mei.zlabel.empty())
421  mei.title = mei.title + " (Z: " + mei.zlabel + ")";
422  }
423  // only update range
424  MEInfo& mei = toBeBooked[significantvalues];
425  double val;
426 
427  for (auto it = firststep + 1; it != laststep; ++it) {
428  switch (it->type) {
430  val = geometryInterface.extract(it->columns[0], iq).second;
431  if (val == GeometryInterface::UNDEFINED)
432  break;
433  mei.range_x_min = std::min(mei.range_x_min, val);
434  mei.range_x_max = std::max(mei.range_x_max, val);
435  break;
437  val = geometryInterface.extract(it->columns[0], iq).second;
438  if (val == GeometryInterface::UNDEFINED)
439  break;
440  mei.range_y_min = std::min(mei.range_y_min, val);
441  mei.range_y_max = std::max(mei.range_y_max, val);
442  break;
443  default: // ignore the rest, code above will catch bugs
444  break;
445  }
446  }
447  }
448 
449  // Now do the actual booking.
450  for (auto& e : toBeBooked) {
451  AbstractHistogram& h = t[e.first];
452  MEInfo& mei = e.second;
453  auto name = makePathName(s, e.first, &(*laststep));
454  iBooker.setCurrentFolder(name.first);
455 
456  // determine nbins for geometry derived quantities
457  // due to how we counted above, we need to include lower and upper bound
458  // For Coord-values, which are not precisely aligned with the bins, we force
459  // alignment.
460  if (mei.binwidth_x != 0) {
461  double range = (mei.range_x_max - mei.range_x_min) / mei.binwidth_x;
462  if ((range - int(range)) == 0.0) {
463  mei.range_x_min -= mei.binwidth_x / 2;
464  mei.range_x_max += mei.binwidth_x / 2;
465  } else {
466  mei.range_x_min = std::floor(mei.range_x_min / mei.binwidth_x) * mei.binwidth_x;
467  mei.range_x_max = std::ceil(mei.range_x_max / mei.binwidth_x) * mei.binwidth_x;
468  }
469  mei.range_x_nbins = int((mei.range_x_max - mei.range_x_min) / mei.binwidth_x);
470  }
471  if (mei.binwidth_y != 0) {
472  double range = (mei.range_y_max - mei.range_y_min) / mei.binwidth_y;
473  if ((range - int(range)) == 0.0) {
474  mei.range_y_min -= mei.binwidth_y / 2;
475  mei.range_y_max += mei.binwidth_y / 2;
476  } else {
477  mei.range_y_min = std::floor(mei.range_y_min / mei.binwidth_y) * mei.binwidth_y;
478  mei.range_y_max = std::ceil(mei.range_y_max / mei.binwidth_y) * mei.binwidth_y;
479  }
480  mei.range_y_nbins = int((mei.range_y_max - mei.range_y_min) / mei.binwidth_y);
481  }
482 
483  if (mei.dimensions == 1) {
484  h.me = iBooker.book1D(
485  name.second, (mei.title + ";" + mei.xlabel).c_str(), mei.range_x_nbins, mei.range_x_min, mei.range_x_max);
486  } else if (mei.dimensions == 2 && !mei.do_profile) {
487  h.me = iBooker.book2D(name.second,
488  (mei.title + ";" + mei.xlabel + ";" + mei.ylabel).c_str(),
489  mei.range_x_nbins,
490  mei.range_x_min,
491  mei.range_x_max,
492  mei.range_y_nbins,
493  mei.range_y_min,
494  mei.range_y_max);
495  } else if (mei.dimensions == 2 && mei.do_profile) {
496  h.me = iBooker.bookProfile(name.second,
497  (mei.title + ";" + mei.xlabel + ";" + mei.ylabel).c_str(),
498  mei.range_x_nbins,
499  mei.range_x_min,
500  mei.range_x_max,
501  0.0,
502  0.0,
503  "");
504  } else if (mei.dimensions == 3 && mei.do_profile) {
505  h.me = iBooker.bookProfile2D(name.second,
506  (mei.title + ";" + mei.xlabel + ";" + mei.ylabel).c_str(),
507  mei.range_x_nbins,
508  mei.range_x_min,
509  mei.range_x_max,
510  mei.range_y_nbins,
511  mei.range_y_min,
512  mei.range_y_max,
513  0.0,
514  0.0); // Z range is ignored if min==max
515  } else {
516  edm::LogError("HistogramManager") << "Illegal Histogram!\n"
517  << "name " << name.second << "\n"
518  << "dim " << mei.dimensions << " profile " << mei.do_profile << "\n";
519  assert(!"Illegal Histogram kind.");
520  }
521  h.th1 = h.me->getTH1();
522  }
523  }
524 }
#define SET_AXIS(to, from)
FWCore Framework interface EventSetupRecordImplementation h
Helper function to determine trigger accepts.
std::string pretty(Column col)
std::vector< SummationSpecification > specs
Value binWidth(ID id)
std::pair< std::string, std::string > makePathName(SummationSpecification const &s, GeometryInterface::Values const &, SummationStep const *upto)
constexpr int32_t ceil(float num)
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)
T min(T a, T b)
Definition: MathUtil.h:58
static const Value UNDEFINED
std::string ylabel
std::vector< std::pair< Column, Value > > Values
std::vector< GeometryInterface::Values > significantvalues
std::vector< Table > tables
Value minValue(ID id)
std::pair< Column, Value > extract(Column const &col, InterestingQuantities const &iq)
col
Definition: cuy.py:1010
std::vector< Table > counters
dqm::legacy::MonitorElement * me
std::vector< InterestingQuantities > const & allModules()
step
Definition: StallMonitor.cc:94
GeometryInterface::InterestingQuantities iq
virtual TH1 * getTH1() const
GeometryInterface & geometryInterface
void HistogramManager::executeExtend ( SummationStep const &  step,
Table t,
std::string const &  reduction,
DQMStore::IBooker iBooker,
SummationSpecification const &  s 
)
private

Definition at line 608 of file HistogramManager.cc.

References trigObjTnPSource_cfi::bins, dqm::dqmstoreimpl::DQMStore::IBooker::book1D(), SummationStep::columns, AbstractHistogram::count, MillePedeFileConverter_cfg::e, GeometryInterface::extractColumns(), dqmdumpme::first, geometryInterface, dqm::legacy::MonitorElement::getTH1(), mps_fire::i, AbstractHistogram::iq_sample, makePathName(), AbstractHistogram::me, dqmiodumpmetadata::n, name, LaserClient_cfi::nbins, MillePedeFileConverter_cfg::out, GeometryInterface::pretty(), mps_merge::separator, dqm::dqmstoreimpl::DQMStore::IBooker::setCurrentFolder(), significantvalues, AlCaHLTBitMon_QueryRunRegistry::string, AbstractHistogram::th1, and title.

Referenced by executeHarvesting().

612  {
613  // For the moment only X.
614  // first pass determines the range.
615  std::map<GeometryInterface::Values, int> nbins;
616  // separators collects meta info for the render plugin about the boundaries.
617  // for each EXTEND, this is added to the axis label. In total this is not
618  // fully correct since we have to assume the the substructure of each sub-
619  // histogram is the same, which is e.g. not true for layers. It still works
620  // since layers only contain leaves (ladders).
621  std::map<GeometryInterface::Values, std::string> separators;
622 
624 
625  for (auto& e : t) {
626  geometryInterface.extractColumns(step.columns, e.second.iq_sample, significantvalues);
627  int& n = nbins[significantvalues];
628  assert(e.second.th1 || !"invalid histogram");
629  // if we reduce, every histogram only needs one bin
630  int bins = !reduce_type.empty() ? 1 : e.second.th1->GetXaxis()->GetNbins();
631  if (bins > 1)
632  separators[significantvalues] += std::to_string(n) + ",";
633  n += bins;
634  }
635  for (auto& e : separators)
636  e.second = "(" + e.second + ")/";
637 
638  Table out;
639  for (auto& e : t) {
640  geometryInterface.extractColumns(step.columns, e.second.iq_sample, significantvalues);
641  TH1* th1 = e.second.th1;
642  assert(th1);
643 
644  AbstractHistogram& new_histo = out[significantvalues];
645  if (!new_histo.me) {
646  // we put the name of the actual, last column of a input histo there.
647  std::string colname = geometryInterface.pretty((e.first.end() - 1)->first);
648 
649  auto separator = separators[significantvalues];
650 
651  auto name = makePathName(s, significantvalues, &step);
652  auto title =
653  std::string("") + th1->GetTitle() + " per " + colname + ";" + colname + separator +
654  (!reduce_type.empty() ? th1->GetYaxis()->GetTitle() : th1->GetXaxis()->GetTitle()) + ";" +
655  (!reduce_type.empty() ? reduce_type + " of " + th1->GetXaxis()->GetTitle() : th1->GetYaxis()->GetTitle());
656  iBooker.setCurrentFolder(name.first);
657 
658  if (th1->GetDimension() == 1) {
659  new_histo.me =
660  iBooker.book1D(name.second, title, nbins[significantvalues], 0.5, nbins[significantvalues] + 0.5);
661  } else {
662  assert(!"2D extend not implemented in harvesting.");
663  }
664  new_histo.th1 = new_histo.me->getTH1();
665  new_histo.iq_sample = e.second.iq_sample;
666  new_histo.count = 1; // used as a fill pointer. Assumes histograms are
667  // ordered correctly (map should provide that)
668  }
669 
670  // now add data.
671  if (new_histo.th1->GetDimension() == 1) {
672  if (reduce_type.empty()) { // no reduction, concatenate
673  for (int i = 1; i <= th1->GetXaxis()->GetNbins(); i++) {
674  new_histo.th1->SetBinContent(new_histo.count, th1->GetBinContent(i));
675  new_histo.th1->SetBinError(new_histo.count, th1->GetBinError(i));
676  new_histo.count += 1;
677  }
678  } else if (reduce_type == "MEAN") {
679  new_histo.th1->SetBinContent(new_histo.count, th1->GetMean());
680  new_histo.th1->SetBinError(new_histo.count, th1->GetMeanError());
681  new_histo.count += 1;
682  } else {
683  assert(!"Reduction type not supported");
684  }
685  } else {
686  assert(!"2D extend not implemented in harvesting.");
687  }
688  }
689  t.swap(out);
690 }
string separator
Definition: mps_merge.py:79
GeometryInterface::InterestingQuantities iq_sample
std::string pretty(Column col)
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)
std::vector< std::pair< Column, Value > > Values
std::vector< GeometryInterface::Values > significantvalues
dqm::legacy::MonitorElement * me
step
Definition: StallMonitor.cc:94
virtual TH1 * getTH1() const
GeometryInterface & geometryInterface
void HistogramManager::executeGroupBy ( SummationStep const &  step,
Table t,
DQMStore::IBooker iBooker,
SummationSpecification const &  s 
)
private

Definition at line 575 of file HistogramManager.cc.

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

Referenced by executeHarvesting().

578  {
579  // Simple regrouping, sum histos if they end up in the same place.
580  Table out;
582  for (auto& e : t) {
583  TH1* th1 = e.second.th1;
584  geometryInterface.extractColumns(step.columns, e.second.iq_sample, significantvalues);
585  AbstractHistogram& new_histo = out[significantvalues];
586  if (!new_histo.me) {
587  auto name = makePathName(s, significantvalues, &step);
588  iBooker.setCurrentFolder(name.first);
589  if (dynamic_cast<TH1F*>(th1))
590  new_histo.me = iBooker.book1D(name.second, (TH1F*)th1);
591  else if (dynamic_cast<TH2F*>(th1))
592  new_histo.me = iBooker.book2D(name.second, (TH2F*)th1);
593  else if (dynamic_cast<TProfile*>(th1))
594  new_histo.me = iBooker.bookProfile(name.second, (TProfile*)th1);
595  else if (dynamic_cast<TProfile2D*>(th1))
596  new_histo.me = iBooker.bookProfile2D(name.second, (TProfile2D*)th1);
597  else
598  assert(!"No idea how to book this.");
599  new_histo.th1 = new_histo.me->getTH1();
600  new_histo.iq_sample = e.second.iq_sample;
601  } else {
602  new_histo.th1->Add(th1);
603  }
604  }
605  t.swap(out);
606 }
GeometryInterface::InterestingQuantities iq_sample
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)
std::vector< std::pair< Column, Value > > Values
std::vector< GeometryInterface::Values > significantvalues
dqm::legacy::MonitorElement * me
step
Definition: StallMonitor.cc:94
virtual TH1 * getTH1() const
GeometryInterface & geometryInterface
void HistogramManager::executeHarvesting ( DQMStore::IBooker iBooker,
DQMStore::IGetter iGetter 
)

Definition at line 692 of file HistogramManager.cc.

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

Referenced by executePerLumiHarvesting().

692  {
693  if (!enabled)
694  return;
695  // Debug output
696  for (auto& s : specs) {
697  edm::LogInfo log("HistogramManager");
698  log << "Specs for " << name << " ";
699  s.dump(log, geometryInterface);
700  }
701 
702  for (unsigned int i = 0; i < specs.size(); i++) {
703  auto& s = specs[i];
704  auto& t = tables[i];
705  loadFromDQMStore(s, t, iGetter);
706 
707  std::string reduce_type = "";
708 
709  // now execute step2.
710  for (SummationStep const& step : s.steps) {
711  if (step.stage == SummationStep::STAGE2) {
712  switch (step.type) {
713  case SummationStep::SAVE:
714  // no explicit implementation atm.
715  break;
717  executeGroupBy(step, t, iBooker, s);
718  break;
720  // reduction is done in the following EXTEND
721  reduce_type = step.arg;
722  break;
724  executeExtend(step, t, reduce_type, iBooker, s);
725  reduce_type = "";
726  break;
728  assert(!"EXTEND_Y currently not supported in harvesting.");
729  break;
730  default:
731  assert(!"Operation not supported in harvesting.");
732  }
733  }
734  }
735  }
736 }
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
Definition: StallMonitor.cc:94
GeometryInterface & geometryInterface
void HistogramManager::executePerEventHarvesting ( edm::Event const *  ev)

Definition at line 190 of file HistogramManager.cc.

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

190  {
191  if (!enabled)
192  return;
193  for (unsigned int i = 0; i < specs.size(); i++) {
194  auto& s = specs[i];
195  auto& t = tables[i];
196  auto& c = counters[i];
197  if (s.steps[0].type != SummationStep::COUNT)
198  continue; // no counting, done
199  assert((s.steps.size() >= 2 && s.steps[1].type == SummationStep::GROUPBY) ||
200  !"Incomplete spec (but this cannot be caught in Python)");
201  for (auto& e : c) {
202  // the iq on the counter can only be a _sample_, since many modules
203  // could be grouped on one counter. Even worse, the sourceEvent ptr
204  // could be dangling if the counter was not touched in this event, so
205  // we replace it. row/col are most likely useless as well.
206  auto iq = e.second.iq_sample;
207  iq.sourceEvent = sourceEvent;
208 
209  significantvalues[i].clear();
211  auto histo = t.find(significantvalues[i]);
212  if (histo == t.end()) {
213  if (!bookUndefined)
214  continue;
215  edm::LogError("HistogramManager") << "Histogram Missing!\n"
216  << "name " << t.begin()->second.th1->GetName() << "\n"
217  << "ctr "
218  << " detid " << iq.sourceModule << "\n";
219  assert(!"Histogram not booked! (per-event) Probably inconsistent geometry description.");
220  }
221  fillInternal(e.second.count, 0, 1, iq, s.steps.begin() + 2, s.steps.end(), histo->second);
222  e.second.count = 0;
223  }
224  }
225 }
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 526 of file HistogramManager.cc.

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

529  {
530  if (!enabled)
531  return;
532  // this should also give us the GeometryInterface for offline, though it is a
533  // bit dirty and might explode.
534  if (!geometryInterface.loaded()) {
535  geometryInterface.load(iSetup);
536  }
537  if (perLumiHarvesting) {
538  this->lumisection = &lumiBlock; // "custom" steps can use this
539  executeHarvesting(iBooker, iGetter);
540  this->lumisection = nullptr;
541  }
542 }
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 117 of file HistogramManager.cc.

References dimensions.

Referenced by fill().

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

Definition at line 113 of file HistogramManager.cc.

References dimensions, and fill().

113  {
114  assert(this->dimensions == 1);
115  fill(x, 0.0, sourceModule, sourceEvent, col, row);
116 }
void fill(DetId sourceModule, const edm::Event *sourceEvent=0, int col=0, int row=0)
col
Definition: cuy.py:1010
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 bookUndefined, SummationStep::COUNT, counters, dimensions, enabled, GeometryInterface::extractColumns(), fastpath, fillInternal(), geometryInterface, timingPdfMaker::histo, mps_fire::i, iq, alignCSCRings::s, significantvalues, GeometryInterface::InterestingQuantities::sourceModule, specs, OrderedSet::t, and tables.

65  {
66  if (!enabled)
67  return;
68 
69  // We only need to check the module here, since the fastpath is only used to
70  // determine which plot is filled (not which bin inside) and fillInternal
71  // re-extracts whatever it needs for the axis.
72  // Since do not support booking based on ROC or time, the plot can only depend
73  // on the module.
74  // The sourceEvent check is not really effective (pointer is always the same)
75  // but needed for initialisation.
76  // NOTE that this might change if we want to support per-ROC booking
77  // NOTE that we could even cache the bin to fill if iq and spec are identical,
78  // also across HistogramManagers.
79  bool cached = false;
80  if (sourceModule == this->iq.sourceModule && sourceEvent == this->iq.sourceEvent) {
81  cached = true;
82  }
83  iq = GeometryInterface::InterestingQuantities{sourceEvent, sourceModule, int16_t(col), int16_t(row)};
84  for (unsigned int i = 0; i < specs.size(); i++) {
85  auto& s = specs[i];
86  auto& t = s.steps[0].type == SummationStep::COUNT ? counters[i] : tables[i];
87  if (!cached) { // recompute ME to fill (aka fastpath)
88  significantvalues[i].clear();
90  auto histo = t.find(significantvalues[i]);
91  if (histo == t.end()) {
92  if (bookUndefined) {
93  edm::LogError("HistogramManager") << "Missing Histogram!\n"
94  << "name " << tables[i].begin()->second.th1->GetName() << "\n";
95  assert(!"Histogram not booked! Probably inconsistent geometry description.");
96  }
97  fastpath[i] = nullptr;
98  } else {
99  fastpath[i] = &(histo->second);
100  }
101  }
102  // A fastpath of nullptr means there is no ME for this iq, which can be
103  // a valid cached result.
104  if (fastpath[i]) {
105  if (s.steps[0].type == SummationStep::COUNT) {
106  fastpath[i]->count++;
107  } else {
108  fillInternal(x, y, this->dimensions, iq, s.steps.begin() + 1, s.steps.end(), *(fastpath[i]));
109  }
110  }
111  }
112 }
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< AbstractHistogram * > fastpath
std::vector< GeometryInterface::Values > significantvalues
std::vector< Table > tables
col
Definition: cuy.py:1010
std::vector< Table > counters
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 122 of file HistogramManager.cc.

References SummationStep::EXTEND_X, SummationStep::EXTEND_Y, GeometryInterface::extract(), dqm::impl::MonitorElement::Fill(), multPhiCorr_741_25nsDY_cfi::fx, multPhiCorr_741_25nsDY_cfi::fy, geometryInterface, dqmdumpme::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().

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

Definition at line 544 of file HistogramManager.cc.

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

Referenced by executeHarvesting().

544  {
545  t.clear();
547  auto firststep = s.steps.begin();
548  if (firststep->type != SummationStep::GROUPBY)
549  ++firststep;
550  auto laststep = std::find_if(
551  s.steps.begin(), s.steps.end(), [](SummationStep const& step) { return step.stage == SummationStep::STAGE2; });
552 
553  for (auto iq : geometryInterface.allModules()) {
554  geometryInterface.extractColumns(firststep->columns, iq, significantvalues);
555 
556  auto histo = t.find(significantvalues);
557  if (histo == t.end()) {
558  auto name = makePathName(s, significantvalues, &(*laststep));
559  std::string path = name.first + name.second;
560  MonitorElement* me = iGetter.get(path);
561  if (!me) {
562  if (bookUndefined)
563  edm::LogError("HistogramManager") << "ME " << path << " not found\n";
564  // else this will happen quite often
565  } else {
567  histo.me = me;
568  histo.th1 = histo.me->getTH1();
569  histo.iq_sample = iq;
570  }
571  }
572  }
573 }
GeometryInterface::InterestingQuantities iq_sample
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)
std::vector< std::pair< Column, Value > > Values
std::vector< GeometryInterface::Values > significantvalues
dqm::legacy::MonitorElement * me
std::vector< InterestingQuantities > const & allModules()
step
Definition: StallMonitor.cc:94
GeometryInterface::InterestingQuantities iq
virtual TH1 * getTH1() const
GeometryInterface & geometryInterface
std::pair< std::string, std::string > HistogramManager::makePathName ( SummationSpecification const &  s,
GeometryInterface::Values const &  significantvalues,
SummationStep const *  upto 
)
private

Definition at line 227 of file HistogramManager.cc.

References SummationStep::arg, SummationStep::columns, SummationStep::COUNT, DeadROC_duringRun::dir, MillePedeFileConverter_cfg::e, SummationStep::EXTEND_X, SummationStep::EXTEND_Y, GeometryInterface::formatValue(), geometryInterface, name, GeometryInterface::pretty(), electronCompare::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().

229  {
230  std::ostringstream dir("");
231  std::string suffix = "";
232 
233  // we omit the last value here, to get all disks next to each other etc.
234  if (!significantvalues.empty()) {
235  for (auto it = significantvalues.begin(); it != (significantvalues.end() - 1); ++it) {
236  auto name = geometryInterface.formatValue(it->first, it->second);
237  if (name.empty())
238  continue;
239  dir << name << "/";
240  }
241  auto e = significantvalues[significantvalues.size() - 1];
242  suffix = "_" + geometryInterface.formatValue(e.first, e.second);
243  }
244 
245  // PERF: this is actually independent of significantvalues and iq
246  std::string name = this->name;
247  for (SummationStep const& step : s.steps) {
248  if (&step == upto)
249  break;
250  switch (step.type) {
252  name = "num_" + name;
253  break;
256  if (step.stage != SummationStep::STAGE1)
257  break;
258  GeometryInterface::Column col0 = step.columns[0];
259  std::string colname = geometryInterface.pretty(col0);
260  name = name + "_per_" + colname;
261  break;
262  }
263  case SummationStep::REDUCE: {
264  auto red = step.arg;
265  boost::algorithm::to_lower(red);
266  name = red + "_" + name;
267  break;
268  }
269  default:
270  // Maybe PROFILE is worth showing.
271  break; // not visible in name
272  }
273  }
274  return std::make_pair(top_folder_name + "/" + dir.str(), name + suffix);
275 }
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
Definition: StallMonitor.cc:94
GeometryInterface & geometryInterface

Member Data Documentation

bool HistogramManager::bookUndefined

Definition at line 92 of file HistogramManager.h.

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

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

Definition at line 99 of file HistogramManager.h.

Referenced by book(), and fill().

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

Definition at line 120 of file HistogramManager.h.

Referenced by addSpec(), and fill().

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

Definition at line 62 of file HistogramManager.h.

GeometryInterface::InterestingQuantities HistogramManager::iq
private

Definition at line 116 of file HistogramManager.h.

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

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

Definition at line 108 of file HistogramManager.h.

Referenced by executePerLumiHarvesting().

std::string HistogramManager::name

Definition at line 95 of file HistogramManager.h.

Referenced by ElectronMVAID.ElectronMVAID::__call__(), FWLite.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(), 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__(), FWLite.WorkingPoints::_reformat_cut_definitions(), 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 91 of file HistogramManager.h.

Referenced by executePerLumiHarvesting().

double HistogramManager::range_x_max

Definition at line 102 of file HistogramManager.h.

Referenced by book().

double HistogramManager::range_x_min

Definition at line 101 of file HistogramManager.h.

Referenced by book().

int HistogramManager::range_x_nbins

Definition at line 100 of file HistogramManager.h.

Referenced by book().

double HistogramManager::range_y_max

Definition at line 105 of file HistogramManager.h.

Referenced by book().

double HistogramManager::range_y_min

Definition at line 104 of file HistogramManager.h.

Referenced by book().

int HistogramManager::range_y_nbins

Definition at line 103 of file HistogramManager.h.

Referenced by book().

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

Definition at line 65 of file HistogramManager.h.

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

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

Definition at line 66 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 93 of file HistogramManager.h.

Referenced by makePathName().

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