CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
HLTBTagHarvestingAnalyzer.cc
Go to the documentation of this file.
2 
4 {
5  //getParameter
6  hltPathNames_ = iConfig.getParameter< std::vector<std::string> > ("HLTPathNames");
7  edm::ParameterSet mc = iConfig.getParameter<edm::ParameterSet>("mcFlavours");
8  m_mcLabels = mc.getParameterNamesForType<std::vector<unsigned int> >();
9  m_histoName = iConfig.getParameter<std::vector<std::string> >("histoName");
10  m_minTag = iConfig.getParameter<double>("minTag");
11 }
12 
14 {
15 }
16 
17 // ------------ method called once each job just after ending the event loop ------------
18  void
20 {
21  using namespace edm;
23  std::string dqmFolder_hist;
24 
25  //for each hltPath and for each flavour, do the "b-tag efficiency vs jet pt" and "b-tag efficiency vs mistag rate" plots
26  for (unsigned int ind=0; ind<hltPathNames_.size();ind++)
27  {
28  dqmFolder_hist = Form("HLT/BTag/Discriminator/%s",hltPathNames_[ind].c_str());
29  std::string effDir = Form("HLT/BTag/Discriminator/%s/efficiency",hltPathNames_[ind].c_str());
30  ibooker.setCurrentFolder(effDir);
31  TH1 *den =NULL;
32  TH1 *num =NULL;
33  std::map<TString,TH1F> effics;
34  std::map<TString,bool> efficsOK;
35  for (unsigned int i = 0; i < m_mcLabels.size(); ++i)
36  {
37  bool isOK=false;
38  TString label= m_histoName.at(ind) + std::string("__"); //"JetTag__";
39  TString flavour= m_mcLabels[i].c_str();
40  label+=flavour;
41  isOK=GetNumDenumerators(ibooker,igetter,(TString(dqmFolder_hist)+"/"+label).Data(),(TString(dqmFolder_hist)+"/"+label).Data(),num,den,0);
42  if (isOK){
43 
44  //do the 'b-tag efficiency vs discr' plot
45  effics[flavour]=calculateEfficiency1D(ibooker,igetter,*num,*den,(label+"_efficiency_vs_disc").Data());
46  efficsOK[flavour]=isOK;
47  }
48  label= m_histoName.at(ind)+std::string("___");
49  label+=flavour+TString("_disc_pT");
50  isOK=GetNumDenumerators (ibooker,igetter,(TString(dqmFolder_hist)+"/"+label).Data(),(TString(dqmFolder_hist)+"/"+label).Data(),num,den,1);
51  if (isOK) {
52 
53  //do the 'b-tag efficiency vs pT' plot
54  TH1F eff=calculateEfficiency1D(ibooker,igetter,*num,*den,(label+"_efficiency_vs_pT").Data());
55  }
56  }
57 
59  if (efficsOK["b"] && efficsOK["c"]) mistagrate(ibooker,igetter,&effics["b"], &effics["c"], m_histoName.at(ind)+"_b_c_mistagrate" );
60  if (efficsOK["b"] && efficsOK["light"]) mistagrate(ibooker,igetter,&effics["b"], &effics["light"], m_histoName.at(ind)+"_b_light_mistagrate" );
61  if (efficsOK["b"] && efficsOK["g"]) mistagrate(ibooker,igetter,&effics["b"], &effics["g"], m_histoName.at(ind)+"_b_g_mistagrate" );
62  }
63 }
64 
66 {
67  using namespace edm;
68 /*
69  possible types:
70  type =0 for eff_vs_discriminator
71  type =1 for eff_vs_pT ot eff_vs_Eta
72  */
73  MonitorElement *denME = NULL;
74  MonitorElement *numME = NULL;
75  denME = igetter.get(den);
76  numME = igetter.get(num);
78 
79  if ( denME == NULL || numME == NULL )
80  {
81  excp << "Plots not found:\n";
82  if(denME == NULL) excp << den << "\n";
83  if(numME == NULL) excp << num << "\n";
84  excp.raise();
85  }
86 
87  if (type==0) //efficiency_vs_discr: fill "ptrnum" with the cumulative function of the DQM plots contained in "num" and "ptrden" with a flat function
88  {
89  TH1* numH1 = numME->getTH1();
90  TH1* denH1 = denME->getTH1();
91  ptrden=(TH1*)denH1->Clone("denominator");
92  ptrnum=(TH1*)numH1->Clone("numerator");
93 
94  ptrnum->SetBinContent(1,numH1->Integral());
95  ptrden->SetBinContent(1,numH1->Integral());
96  for (int j=2;j<=numH1->GetNbinsX();j++) {
97  ptrnum->SetBinContent(j,numH1->Integral()-numH1->Integral(1,j-1));
98  ptrden->SetBinContent(j,numH1->Integral());
99  }
100  }
101 
102  if (type==1) //efficiency_vs_pT: fill "ptrden" with projection of the plots contained in "den" and fill "ptrnum" with projection of the plots contained in "num", having btag>m_minTag
103  {
104  TH2F* numH2 = numME->getTH2F();
105  TH2F* denH2 = denME->getTH2F();
106 
108  TCutG * cutg_num= new TCutG("cutg_num",4);
109  cutg_num->SetPoint(0,m_minTag,0);
110  cutg_num->SetPoint(1,m_minTag,9999);
111  cutg_num->SetPoint(2,1.1,9999);
112  cutg_num->SetPoint(3,1.1,0);
113  ptrnum = numH2->ProjectionY("numerator",0,-1,"[cutg_num]");
114 
116  TCutG * cutg_den= new TCutG("cutg_den",4);
117  cutg_den->SetPoint(0,-10.1,0);
118  cutg_den->SetPoint(1,-10.1,9999);
119  cutg_den->SetPoint(2,1.1,9999);
120  cutg_den->SetPoint(3,1.1,0);
121  ptrden = denH2->ProjectionY("denumerator",0,-1,"[cutg_den]");
122  delete cutg_num;
123  delete cutg_den;
124  }
125  return true;
126 }
127 
128 
129 void HLTBTagHarvestingAnalyzer::mistagrate(DQMStore::IBooker& ibooker, DQMStore::IGetter& igetter, TH1F* num, TH1F* den, std::string effName ){
130  //do the efficiency_vs_mistag_rate plot
131  TH1F* eff;
132  eff = new TH1F(effName.c_str(),effName.c_str(),100,0,1);
133  eff->SetTitle(effName.c_str());
134  eff->SetXTitle("b-effficiency");
135  eff->SetYTitle("mistag rate");
136  eff->SetOption("E");
137  eff->SetLineColor(2);
138  eff->SetLineWidth(2);
139  eff->SetMarkerStyle(20);
140  eff->SetMarkerSize(0.8);
141  eff->GetYaxis()->SetRangeUser(0.001,1.001);
142  eff->GetXaxis()->SetRangeUser(-0.001,1.001);
143  eff->SetStats(kFALSE);
144 
145  //for each bin in the discr -> find efficiency and mistagrate -> put them in a plot
146  for(int i=1;i<=num->GetNbinsX();i++){
147  double beff=num->GetBinContent(i);
148  double miseff=den->GetBinContent(i);
149  double miseffErr= den->GetBinError(i);
150  int binX = eff->GetXaxis()->FindBin(beff);
151  if (eff->GetBinContent(binX)!=0) continue;
152  eff->SetBinContent(binX,miseff);
153  eff->SetBinError(binX,miseffErr);
154  }
155  MonitorElement *me;
156  me = ibooker.book1D(effName.c_str(),eff);
157  me->setEfficiencyFlag();
158 
159  delete eff;
160  return;
161 }
162 
164  //calculate the efficiency as num/den ratio
165  TH1F eff;
166  if(num.GetXaxis()->GetXbins()->GetSize()==0){
167  eff = TH1F(effName.c_str(),effName.c_str(),num.GetXaxis()->GetNbins(),num.GetXaxis()->GetXmin(),num.GetXaxis()->GetXmax());
168  }else{
169  eff = TH1F(effName.c_str(),effName.c_str(),num.GetXaxis()->GetNbins(),num.GetXaxis()->GetXbins()->GetArray());
170  }
171  eff.SetTitle(effName.c_str());
172  eff.SetXTitle( num.GetXaxis()->GetTitle() );
173  eff.SetYTitle("Efficiency");
174  eff.SetOption("PE");
175  eff.SetLineColor(2);
176  eff.SetLineWidth(2);
177  eff.SetMarkerStyle(20);
178  eff.SetMarkerSize(0.8);
179  eff.GetYaxis()->SetRangeUser(-0.001,1.001);
180  for(int i=1;i<=num.GetNbinsX();i++){
181  double d, n,err;
182  d= den.GetBinContent(i);
183  n= num.GetBinContent(i);
184  double e;
185  if(d!=0){
186  e=n/d;
187  err = sqrt(e*(1-e)/d); //from binomial standard deviation
188  }
189  else{
190  e=0;
191  err=0;
192  }
193  eff.SetBinContent( i, e );
194  eff.SetBinError( i, err );
195  }
196 
197  MonitorElement *me;
198  me = ibooker.book1D(effName,&eff);
199  me->setEfficiencyFlag();
200 
201  return eff;
202 }
203 
204 //define this as a plug-in
type
Definition: HCALResponse.h:21
T getParameter(std::string const &) const
int i
Definition: DBlmapReader.cc:9
MonitorElement * get(const std::string &path)
Definition: DQMStore.cc:302
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
void raise()
Definition: Exception.h:105
#define NULL
Definition: scimark2.h:8
HLTBTagHarvestingAnalyzer(const edm::ParameterSet &)
tuple d
Definition: ztail.py:151
TH1F calculateEfficiency1D(DQMStore::IBooker &ibooker, DQMStore::IGetter &igetter, TH1 &num, TH1 &den, std::string name)
virtual void dqmEndJob(DQMStore::IBooker &ibooker, DQMStore::IGetter &igetter)
std::vector< std::string > m_mcLabels
T sqrt(T t)
Definition: SSEVec.h:48
MonitorElement * book1D(Args &&...args)
Definition: DQMStore.h:115
int j
Definition: DBlmapReader.cc:9
std::vector< std::string > m_histoName
bool GetNumDenumerators(DQMStore::IBooker &ibooker, DQMStore::IGetter &igetter, std::string num, std::string den, TH1 *&ptrnum, TH1 *&ptrden, int type)
void setCurrentFolder(const std::string &fullpath)
Definition: DQMStore.cc:274
std::vector< std::string > hltPathNames_
void setEfficiencyFlag(void)
int flavour(const Candidate &part)
Definition: pdgIdUtils.h:31
void mistagrate(DQMStore::IBooker &ibooker, DQMStore::IGetter &igetter, TH1F *num, TH1F *den, std::string effName)