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.size() == 0 ) {
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 //--- nothing to be done yet
88 }
89 
91 {
92  //std::cout << "<TauDQMHistEffProducer::endJob>:" << std::endl;
93 
94 //--- check that DQMStore service is available
95  if ( !edm::Service<DQMStore>().isAvailable() ) {
96  edm::LogError ("endJob") << " Failed to access dqmStore --> histograms will NOT be plotted !!";
97  return;
98  }
99 
100  DQMStore& dqmStore = (*edm::Service<DQMStore>());
101 
102  for ( std::vector<cfgEntryPlot>::const_iterator plot = cfgEntryPlot_.begin(); plot != cfgEntryPlot_.end(); ++plot ) {
103  //std::cout << "plot->numerator_ = " << plot->numerator_ << std::endl;
104  std::string numeratorHistogramName, numeratorHistogramDirectory;
105  separateHistogramFromDirectoryName(plot->numerator_, numeratorHistogramName, numeratorHistogramDirectory);
106  //std::cout << "numeratorHistogramName = " << numeratorHistogramName << std::endl;
107  //std::cout << "numeratorHistogramDirectory = " << numeratorHistogramDirectory << std::endl;
108  MonitorElement* meNumerator = dqmStore.get(std::string(numeratorHistogramDirectory).append(dqmSeparator).append(numeratorHistogramName));
109  //std::cout << "meNumerator = " << meNumerator << std::endl;
110  TH1* histoNumerator = ( meNumerator != NULL ) ? meNumerator->getTH1() : NULL;
111 
112  //std::cout << "plot->denominator_ = " << plot->denominator_ << std::endl;
113  std::string denominatorHistogramName, denominatorHistogramDirectory;
114  separateHistogramFromDirectoryName(plot->denominator_, denominatorHistogramName, denominatorHistogramDirectory);
115  //std::cout << "denominatorHistogramName = " << denominatorHistogramName << std::endl;
116  //std::cout << "denominatorHistogramDirectory = " << denominatorHistogramDirectory << std::endl;
117  MonitorElement* meDenominator = dqmStore.get(std::string(denominatorHistogramDirectory).append(dqmSeparator).append(denominatorHistogramName));
118  //std::cout << "meDenominator = " << meDenominator << std::endl;
119  TH1* histoDenominator = ( meDenominator != NULL ) ? meDenominator->getTH1() : NULL;
120 
121  if ( histoNumerator != NULL && histoDenominator != NULL ) {
122  if ( !histoNumerator->GetSumw2N() ) histoNumerator->Sumw2();
123  //std::cout << " histoNumerator->GetName = " << histoNumerator->GetName() << std::endl;
124 
125  if ( !histoDenominator->GetSumw2N() ) histoDenominator->Sumw2();
126  //std::cout << " histoDenominator->GetName = " << histoNumerator->GetName() << std::endl;
127 
128  std::string effHistogramName, effHistogramDirectory, dummy;
129  separateHistogramFromDirectoryName(plot->efficiency_, effHistogramName, effHistogramDirectory);
130  //if ( effHistogramDirectory == "" ) separateHistogramFromDirectoryName(numeratorHistogramName, dummy, effHistogramDirectory);
131  if ( effHistogramDirectory != "" )
132  {
133  if(dqmStore.dirExists(effHistogramDirectory))
134  dqmStore.setCurrentFolder(effHistogramDirectory);
135  else
136  std::cout<<"TauDQMHistEffProducer:: Directory: "<<effHistogramDirectory<<" does not exist!"<<std::endl;
137  }
138 
139  MonitorElement* histoEfficiency = dqmStore.book1D(effHistogramName, effHistogramName,
140  histoNumerator->GetNbinsX(), histoNumerator->GetXaxis()->GetXmin(), histoNumerator->GetXaxis()->GetXmax());
141 
142  histoEfficiency->getTH1F()->Divide(histoNumerator, histoDenominator, 1., 1., "B");
143 
144  //to avoid the pointer to go out of scope:
145  histoEfficiencyVector_.push_back(histoEfficiency);
146 
147  /* std::vector<std::string> mes = dqmStore.getMEs();
148  std::cout<<dqmStore.pwd()<<std::endl;
149  for(unsigned int i =0; i<mes.size(); i++)
150  std::cout<<mes[i]<<std::endl;
151  */
152  } else {
153  edm::LogError("endRun") << " Failed to produce efficiency histogram = " << plot->efficiency_ << " !!";
154  if ( histoNumerator == NULL ) edm::LogError("endRun") << " numerator = " << plot->numerator_ << " does not exist.";
155  if ( histoDenominator == NULL ) edm::LogError("endRun") << " denominator = " << plot->denominator_ << " does not exist.";
156  }
157  }
158 }
159 
161 
T getParameter(std::string const &) const
MonitorElement * book1D(const char *name, const char *title, int nchX, double lowX, double highX)
Book 1D histogram.
Definition: DQMStore.cc:1035
vector< string > vstring
Definition: ExoticaDQM.cc:8
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
std::string replace_string(const std::string &src, const std::string &keyword, const std::string &parameter, unsigned minReplacements, unsigned maxReplacements, int &errorFlag)
#define NULL
Definition: scimark2.h:8
std::vector< std::string > getParameterNamesForType(bool trackiness=true) const
Definition: ParameterSet.h:194
TauDQMHistEffProducer(const edm::ParameterSet &)
virtual void analyze(const edm::Event &, const edm::EventSetup &)
std::vector< cfgEntryPlot > cfgEntryPlot_
TH1 * getTH1(void) const
void separateHistogramFromDirectoryName(const std::string &histogramAndDirectoryName, std::string &histogramName, std::string &directoryName)
MonitorElement * get(const std::string &path) const
get ME from full pathname (e.g. "my/long/dir/my_histo")
Definition: DQMStore.cc:1807
const std::string parKeyword
bool dirExists(const std::string &path) const
true if directory exists
Definition: DQMStore.cc:806
TH1F * getTH1F(void) const
virtual void endRun(const edm::Run &r, const edm::EventSetup &c)
std::vector< MonitorElement * > histoEfficiencyVector_
const std::string dqmSeparator
Definition: EwkTauDQM.cc:8
cfgEntryPlot(const edm::ParameterSet &)
void setCurrentFolder(const std::string &fullpath)
Definition: DQMStore.cc:741
Definition: Run.h:43