CMS 3D CMS Logo

DQMHistEffProducer.cc
Go to the documentation of this file.
2 
4 
5 // framework & common header files
8 
9 //DQM services
12 
13 
14 #include <TH1.h>
15 #include <TCanvas.h>
16 
17 #include <iostream>
18 
20 {
21  //std::cout << "<cfgEntryPlot::cfgEntryPlot>:" << std::endl;
22 
23  numerator_ = cfg.getParameter<std::string>("numerator");
24  //std::cout << " numerator = " << numerator_ << std::endl;
25 
26  denominator_ = cfg.getParameter<std::string>("denominator");
27  //std::cout << " denominator = " << denominator_ << std::endl;
28 
29  efficiency_ = cfg.getParameter<std::string>("efficiency");
30  //std::cout << " efficiency = " << efficiency_ << std::endl;
31 }
32 
34  : numerator_(numerator), denominator_(denominator), efficiency_(efficiency)
35 {
36  //std::cout << "<cfgEntryPlot::cfgEntryPlot>:" << std::endl;
37  //std::cout << " numerator = " << numerator_ << std::endl;
38  //std::cout << " denominator = " << denominator_ << std::endl;
39  //std::cout << " efficiency = " << efficiency_ << std::endl;
40 }
41 
42 //
43 //-----------------------------------------------------------------------------------------------------------------------
44 //
45 
47 {
48  //std::cout << "<TauDQMHistEffProducer::TauDQMHistEffProducer>:" << std::endl;
49 
51  std::vector<std::string> plotNames = plots.getParameterNamesForType<edm::ParameterSet>();
52  for ( std::vector<std::string>::const_iterator plotName = plotNames.begin(); plotName != plotNames.end(); ++plotName ) {
53  edm::ParameterSet plotConfig = plots.getParameter<edm::ParameterSet>(*plotName);
54 
55  typedef std::vector<std::string> vstring;
56  vstring plotParameter = plotConfig.getParameter<vstring>("parameter");
57  if ( plotParameter.empty() ) {
58  cfgEntryPlot_.push_back(cfgEntryPlot(plotConfig));
59  } else {
60  std::string numerator = plotConfig.getParameter<std::string>("numerator");
61  std::string denominator = plotConfig.getParameter<std::string>("denominator");
62  std::string efficiency = plotConfig.getParameter<std::string>("efficiency");
63  for ( vstring::const_iterator parameter = plotParameter.begin(); parameter != plotParameter.end(); ++parameter ) {
64  int errorFlag = 0;
65  std::string modNumerator = replace_string(numerator, parKeyword, *parameter, 1, 1, errorFlag);
66  std::string modDenominator = replace_string(denominator, parKeyword, *parameter, 1, 1, errorFlag);
67  std::string modEfficiency = replace_string(efficiency, parKeyword, *parameter, 1, 1, errorFlag);
68 
69  if ( !errorFlag ) {
70  cfgEntryPlot_.push_back(cfgEntryPlot(modNumerator, modDenominator, modEfficiency));
71  } else {
72  edm::LogError("TauDQMHistEffProducer") << " Failed to decode histogram names for plotName = " << (*plotName)
73  << " --> skipping !!";
74  }
75  }
76  }
77  }
78 }
79 
81 {
82 //--- nothing to be done yet
83 }
84 
86 {
87  //std::cout << "<TauDQMHistEffProducer::endJob>:" << std::endl;
88 
89  for ( std::vector<cfgEntryPlot>::const_iterator plot = cfgEntryPlot_.begin(); plot != cfgEntryPlot_.end(); ++plot ) {
90  //std::cout << "plot->numerator_ = " << plot->numerator_ << std::endl;
91  std::string numeratorHistogramName, numeratorHistogramDirectory;
92  separateHistogramFromDirectoryName(plot->numerator_, numeratorHistogramName, numeratorHistogramDirectory);
93  //std::cout << "numeratorHistogramName = " << numeratorHistogramName << std::endl;
94  //std::cout << "numeratorHistogramDirectory = " << numeratorHistogramDirectory << std::endl;
95  MonitorElement* meNumerator = iget.get(std::string(numeratorHistogramDirectory).append(dqmSeparator).append(numeratorHistogramName));
96  //std::cout << "meNumerator = " << meNumerator << std::endl;
97  TH1* histoNumerator = ( meNumerator != nullptr ) ? meNumerator->getTH1() : nullptr;
98 
99  //std::cout << "plot->denominator_ = " << plot->denominator_ << std::endl;
100  std::string denominatorHistogramName, denominatorHistogramDirectory;
101  separateHistogramFromDirectoryName(plot->denominator_, denominatorHistogramName, denominatorHistogramDirectory);
102  //std::cout << "denominatorHistogramName = " << denominatorHistogramName << std::endl;
103  //std::cout << "denominatorHistogramDirectory = " << denominatorHistogramDirectory << std::endl;
104  MonitorElement* meDenominator = iget.get(std::string(denominatorHistogramDirectory).append(dqmSeparator).append(denominatorHistogramName));
105  //std::cout << "meDenominator = " << meDenominator << std::endl;
106  TH1* histoDenominator = ( meDenominator != nullptr ) ? meDenominator->getTH1() : nullptr;
107 
108  if ( histoNumerator != nullptr && histoDenominator != nullptr ) {
109  if ( !histoNumerator->GetSumw2N() ) histoNumerator->Sumw2();
110  //std::cout << " histoNumerator->GetName = " << histoNumerator->GetName() << std::endl;
111 
112  if ( !histoDenominator->GetSumw2N() ) histoDenominator->Sumw2();
113  //std::cout << " histoDenominator->GetName = " << histoNumerator->GetName() << std::endl;
114 
115  std::string effHistogramName, effHistogramDirectory, dummy;
116  separateHistogramFromDirectoryName(plot->efficiency_, effHistogramName, effHistogramDirectory);
117  //if ( effHistogramDirectory == "" ) separateHistogramFromDirectoryName(numeratorHistogramName, dummy, effHistogramDirectory);
118  if ( !effHistogramDirectory.empty() )
119  {
120  if(iget.dirExists(effHistogramDirectory))
121  ibook.setCurrentFolder(effHistogramDirectory);
122  else
123  std::cout<<"TauDQMHistEffProducer:: Directory: "<<effHistogramDirectory<<" does not exist!"<<std::endl;
124  }
125 
126  MonitorElement* histoEfficiency = ibook.book1D(effHistogramName, effHistogramName,
127  histoNumerator->GetNbinsX(), histoNumerator->GetXaxis()->GetXmin(), histoNumerator->GetXaxis()->GetXmax());
128 
129  histoEfficiency->getTH1F()->Divide(histoNumerator, histoDenominator, 1., 1., "B");
130 
131  //to avoid the pointer to go out of scope:
132  histoEfficiencyVector_.push_back(histoEfficiency);
133 
134  /* std::vector<std::string> mes = dqmStore.getMEs();
135  std::cout<<dqmStore.pwd()<<std::endl;
136  for(unsigned int i =0; i<mes.size(); i++)
137  std::cout<<mes[i]<<std::endl;
138  */
139  } else {
140  edm::LogError("endRun") << " Failed to produce efficiency histogram = " << plot->efficiency_ << " !!";
141  if ( histoNumerator == nullptr ) edm::LogError("endRun") << " numerator = " << plot->numerator_ << " does not exist.";
142  if ( histoDenominator == nullptr ) edm::LogError("endRun") << " denominator = " << plot->denominator_ << " does not exist.";
143  }
144  }
145 }
146 
148 
T getParameter(std::string const &) const
vector< string > vstring
Definition: ExoticaDQM.cc:8
TH1F * getTH1F() const
MonitorElement * get(const std::string &path)
Definition: DQMStore.cc:302
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
TH1 * getTH1() const
std::string replace_string(const std::string &src, const std::string &keyword, const std::string &parameter, unsigned minReplacements, unsigned maxReplacements, int &errorFlag)
#define nullptr
std::vector< std::string > getParameterNamesForType(bool trackiness=true) const
Definition: ParameterSet.h:194
TauDQMHistEffProducer(const edm::ParameterSet &)
std::vector< cfgEntryPlot > cfgEntryPlot_
MonitorElement * book1D(Args &&...args)
Definition: DQMStore.h:118
void separateHistogramFromDirectoryName(const std::string &histogramAndDirectoryName, std::string &histogramName, std::string &directoryName)
const std::string parKeyword
bool dirExists(const std::string &path)
Definition: DQMStore.cc:332
void setCurrentFolder(const std::string &fullpath)
Definition: DQMStore.cc:274
std::vector< MonitorElement * > histoEfficiencyVector_
void dqmEndJob(DQMStore::IBooker &ibook, DQMStore::IGetter &iget) override
const std::string dqmSeparator
Definition: EwkTauDQM.cc:8
cfgEntryPlot(const edm::ParameterSet &)