ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/benhoob/HWW/fitMVA.C
Revision: 1.2
Committed: Thu Apr 7 16:13:54 2011 UTC (14 years, 1 month ago) by benhoob
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 1.1: +122 -180 lines
Log Message:
Random updates

File Contents

# Content
1 #include <cstdlib>
2 #include <vector>
3 #include <iostream>
4 #include <map>
5 #include <string>
6
7 #include "TFile.h"
8 #include "TH1.h"
9 #include "TTree.h"
10 #include "TString.h"
11 #include "TSystem.h"
12 #include "TROOT.h"
13 #include "TStopwatch.h"
14 #include "TChain.h"
15 #include "TMath.h"
16 #include "TChainElement.h"
17 #include "TCanvas.h"
18 #include "TCut.h"
19 #include "TStyle.h"
20 #include "TLegend.h"
21 #include "RooGaussian.h"
22 #include "RooNumConvPdf.h"
23 #include "RooGenericPdf.h"
24 #include "RooRealVar.h"
25 #include "RooPlot.h"
26 #include "RooDataHist.h"
27 #include "RooFitResult.h"
28 #include "RooHistPdf.h"
29 #include "RooAddPdf.h"
30 #include "RooDataSet.h"
31
32 using namespace std;
33 using namespace RooFit;
34
35
36 void fitMVA(){
37
38 //-------------------------------
39 // user parameters
40 //-------------------------------
41
42 const int nTrials = 1000; // number of trials in fit validation
43 const bool display = false; // display fit? Set to false for large nTrials
44 const bool printgif = true; // print canvases to gif files?
45
46 //---------------------------------------
47 // name of MVA branch in ntuple
48 //---------------------------------------
49
50 //const char* mvaname = "nn_hww160_ww";
51 const char* mvaname = "bdt_hww160_ww";
52
53 //-----------------------------------------
54 // selection to apply to sig, bkg samples
55 //-----------------------------------------
56
57 TCut jet("njets == 0");
58 TCut mll100("dilep->mass() < 100");
59 TCut OS("lq1*lq2 < 0");
60 TCut pt2010("lep1->pt() >= 20 && lep2->pt() >= 10");
61 TCut pmet1("pmet >= 20 && (type == 1 || type == 2)");
62 TCut pmet2("pmet >= 35 && (type == 0 || type == 3)");
63 TCut pmet = pmet1 || pmet2;
64 TCut lid("lid3 == 0");
65 TCut lowptb("jetLowBtag <= 2.1");
66 TCut softmu("nSoftMuons == 0");
67 TCut sel160("lep1.pt()>30 && lep2.pt()>25 && dilep.mass()<50 && dPhi<1.05");
68
69 TCut sel = jet + mll100 + OS + pt2010 + pmet;
70 TCut weight = "0.5 * scale1fb";
71 TCut selweight = sel*weight;
72
73 //--------------------------------------------------
74 // get sig and bkg samples
75 //--------------------------------------------------
76
77 char* babyPath = "/smurf/benhoob/MVA/SmurfTraining/hww160_ww/output";
78
79 TChain* sig = new TChain("tree");
80 sig->Add(Form("%s/hww160.root",babyPath));
81
82 TChain* bkg = new TChain("tree");
83 bkg->Add(Form("%s/ww.root",babyPath));
84
85 //------------------------------------
86 // set binning
87 //------------------------------------
88
89 int nbins = 0;
90 float xmin = 0.;
91 float xmax = 0.;
92
93 if( strcmp( mvaname , "nn_hww160_ww" ) == 0 ){
94 nbins = 20;
95 xmin = -0.5;
96 xmax = 1.5;
97 }
98 else if( strcmp( mvaname , "bdt_hww160_ww" ) == 0 ){
99 nbins = 30;
100 xmin = -1.0;
101 xmax = 0.5;
102 }else{
103 cout << "Unrecognized MVA " << mvaname << ", quitting" << endl;
104 exit(0);
105 }
106
107 //------------------------
108 // declare variables
109 //------------------------
110
111 RooRealVar nsig ("nsig" , "Signal Yield" , 50 , 0 , 1000 );
112 RooRealVar nbkg ("nbkg" , "Background Yield" , 300 , 0 , 1000 );
113 RooRealVar mva ("mva" , "MVA Output" , xmin , xmax );
114
115 nsig.setVal(50);
116 nbkg.setVal(300);
117 mva.setBins(nbins);
118
119 //---------------------------------------------------
120 // get MVA output distributions from sig, bkg samp
121 //---------------------------------------------------
122
123 TH1F* mva_sig = new TH1F("mva_sig","MVA Output for Signal" , nbins , xmin , xmax );
124 TH1F* mva_bkg = new TH1F("mva_bkg","MVA Output for Background" , nbins , xmin , xmax );
125
126 mva_sig->Sumw2();
127 mva_bkg->Sumw2();
128
129 TCanvas *ctemp = new TCanvas();
130 ctemp->cd();
131 sig->Draw(Form("%s >> mva_sig",mvaname),selweight);
132 bkg->Draw(Form("%s >> mva_bkg",mvaname),selweight);
133 delete ctemp;
134
135 float nsigtrue = mva_sig->Integral();
136 float nbkgtrue = mva_bkg->Integral();
137
138 //---------------------------------------------------
139 // convert MVA distributions to RooHistPdf objects
140 //---------------------------------------------------
141
142 RooDataHist sigpdfhist("sigpdfhist","Signal PDF Hist" , RooArgSet(mva),mva_sig);
143 RooDataHist bkgpdfhist("bkgpdfhist","Background PDF Hist" , RooArgSet(mva),mva_bkg);
144
145 RooHistPdf sigpdf("sigpdf", "Signal PDF" , RooArgSet(mva), sigpdfhist);
146 RooHistPdf bkgpdf("bkgpdf", "Background PDF" , RooArgSet(mva), bkgpdfhist);
147
148 nsig.setVal( nsigtrue );
149 nbkg.setVal( nbkgtrue );
150
151 RooAddPdf datapdf("datapdf", "Data PDF", RooArgList(sigpdf,bkgpdf), RooArgList(nsig,nbkg));
152
153 //-------------------------------------------------
154 // perform fit (nTrials iterations)
155 //-------------------------------------------------
156
157 float nsigfit[nTrials];
158 float nbkgfit[nTrials];
159 float nsigerrfit[nTrials];
160 float nbkgerrfit[nTrials];
161 float significance[nTrials];
162 TCanvas *can[nTrials];
163
164 TH1F* hsig = new TH1F("hsig","Sig Yield",100,0,100);
165 TH1F* hbkg = new TH1F("hbkg","Bkg Yield",100,0,200);
166 TH1F* hsigpull = new TH1F("hsigpull","Sig Pull",100,-5,5);
167 TH1F* hbkgpull = new TH1F("hbkgpull","Bkg Pull",100,-5,5);
168 TH1F* hsignificance = new TH1F("hsignificance","Significance",100,0,10);
169
170 for( int i = 0 ; i < nTrials ; ++i ){
171
172 nsig.setVal( nsigtrue );
173 nbkg.setVal( nbkgtrue );
174
175 //-------------------------------------
176 // generate pseudo-dataset from PDF
177 //-------------------------------------
178
179 RooDataSet *gendata = datapdf.generate(RooArgList(mva),nsigtrue+nbkgtrue,Extended(kTRUE));
180
181 //-------------------------------------
182 // perform fit with nsig fixed to 0
183 //-------------------------------------
184
185 nsig.setVal(0);
186 nbkg.setVal(gendata->sumEntries());
187 nsig.setConstant();
188
189 RooAbsReal* mynll_bkg = bkgpdf.createNLL( *gendata );
190 RooAbsReal* mynll_tot = datapdf.createNLL( *gendata );
191
192 cout << "nll_bkg " << mynll_bkg->getVal() << endl;
193 cout << "nll_tot " << mynll_tot->getVal() << endl;
194
195 cout << endl;
196 cout << "-------------------------------------------" << endl;
197 cout << "Performing fit with signal yield fixed to 0" << endl;
198 cout << "-------------------------------------------" << endl;
199 cout << endl;
200
201 RooFitResult *bkg_result = datapdf.fitTo( *gendata , Save() , Extended(kTRUE) );
202
203 /*
204 TCanvas *bkgcan = new TCanvas("bkgcan","bkgcan",600,600);
205 bkgcan->cd();
206
207 RooPlot* bkgframe = mva.frame();
208 bkgframe->SetXTitle(mvaname);
209 gendata->plotOn(bkgframe);
210 datapdf.plotOn(bkgframe,Components(sigpdf));
211 datapdf.plotOn(bkgframe,Components(bkgpdf),LineColor(kRed));
212 datapdf.plotOn(bkgframe,LineColor(kOrange));
213 bkgframe->Draw();
214 */
215
216 //-------------------------------------
217 // perform fit with nsig floated in fit
218 //-------------------------------------
219
220 //nsig.setVal(50);
221 nsig.setConstant(kFALSE);
222
223 cout << endl;
224 cout << "----------------------------------------" << endl;
225 cout << "Performing fit with signal yield floated" << endl;
226 cout << "----------------------------------------" << endl;
227 cout << endl;
228
229 RooFitResult *result = datapdf.fitTo( *gendata , Save() , Extended(kTRUE) );
230
231 if( display ){
232
233 can[i] = new TCanvas(Form("can_%i",i),Form("can_%i",i),600,600);
234 can[i]->cd();
235
236 RooPlot* frame = mva.frame();
237 frame->SetXTitle(mvaname);
238 gendata->plotOn(frame);
239 datapdf.plotOn(frame,Components(sigpdf));
240 datapdf.plotOn(frame,Components(bkgpdf),LineColor(kRed));
241 datapdf.plotOn(frame,LineColor(kOrange));
242 frame->Draw();
243
244 if( printgif ) can[i]->Print(Form("plots/%s_%i.gif",mvaname,i));
245 }
246
247 //---------------------------------------------
248 // print output to screen
249 //---------------------------------------------
250
251 float nll = result->minNll();
252 float bkg_nll = bkg_result->minNll();
253 float signif = sqrt( -2 * ( nll - bkg_nll ) );
254
255 cout << endl << endl;
256 cout << "Fit Results-------------------------------------------" << endl;
257 cout << "gen events = " << gendata->sumEntries() << endl;
258 cout << "nll (BKG) = " << bkg_nll << endl;
259 cout << "nll = " << nll << endl;
260 cout << "sig = " << signif << endl;
261 cout << "nsig = " << nsig.getVal() << " +/- " << nsig.getError() << endl;
262 cout << "nsig(true) = " << nsigtrue << endl;
263 cout << "nbkg = " << nbkg.getVal() << " +/- " << nbkg.getError() << endl;
264 cout << "nbkg(true) = " << nbkgtrue << endl;
265 cout << "------------------------------------------------------" << endl;
266 cout << endl << endl;
267
268
269 nsigfit[i] = nsig.getVal();
270 nsigerrfit[i] = nsig.getError();
271 nbkgfit[i] = nbkg.getVal();
272 nbkgerrfit[i] = nbkg.getError();
273 significance[i] = signif;
274
275 hsig->Fill( nsigfit[i] );
276 hsigpull->Fill( ( nsigfit[i] - nsigtrue ) / nsigerrfit[i] );
277 hbkg->Fill( nbkgfit[i] );
278 hbkgpull->Fill( ( nbkgfit[i] - nbkgtrue ) / nbkgerrfit[i] );
279 hsignificance->Fill( significance[i] );
280 }
281
282 gStyle->SetOptFit(0111);
283
284 TCanvas *c1 = new TCanvas("c1","",1200,800);
285 c1->Divide(3,2);
286
287 c1->cd(1);
288 hsig->GetXaxis()->SetTitle("Sig Yield");
289 hsig->Draw();
290 hsig->Fit("gaus");
291
292 c1->cd(2);
293 hsigpull->GetXaxis()->SetTitle("Sig Pull");
294 hsigpull->Draw();
295 hsigpull->Fit("gaus");
296
297 c1->cd(4);
298 hbkg->GetXaxis()->SetTitle("Bkg Yield");
299 hbkg->Draw();
300 hbkg->Fit("gaus");
301
302 c1->cd(5);
303 hbkgpull->GetXaxis()->SetTitle("Bkg Pull");
304 hbkgpull->Draw();
305 hbkgpull->Fit("gaus");
306
307 c1->cd(3);
308 hsignificance->GetXaxis()->SetTitle("Significance");
309 hsignificance->Draw();
310 hsignificance->Fit("gaus");
311
312 if( printgif ) c1->Print(Form("plots/%s_fitval.gif",mvaname));
313
314
315 }