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

# User Rev Content
1 benhoob 1.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 benhoob 1.2
36 benhoob 1.1 void fitMVA(){
37    
38 benhoob 1.2 //-------------------------------
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 benhoob 1.1
46     //---------------------------------------
47     // name of MVA branch in ntuple
48     //---------------------------------------
49    
50 benhoob 1.2 //const char* mvaname = "nn_hww160_ww";
51     const char* mvaname = "bdt_hww160_ww";
52 benhoob 1.1
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 benhoob 1.2 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 benhoob 1.1
69 benhoob 1.2 TCut sel = jet + mll100 + OS + pt2010 + pmet;
70     TCut weight = "0.5 * scale1fb";
71 benhoob 1.1 TCut selweight = sel*weight;
72    
73     //--------------------------------------------------
74 benhoob 1.2 // get sig and bkg samples
75 benhoob 1.1 //--------------------------------------------------
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 benhoob 1.2 //------------------------------------
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 benhoob 1.1 //------------------------
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 benhoob 1.2 ctemp->cd();
131 benhoob 1.1 sig->Draw(Form("%s >> mva_sig",mvaname),selweight);
132     bkg->Draw(Form("%s >> mva_bkg",mvaname),selweight);
133 benhoob 1.2 delete ctemp;
134 benhoob 1.1
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 benhoob 1.2 //-------------------------------------------------
154     // perform fit (nTrials iterations)
155     //-------------------------------------------------
156    
157 benhoob 1.1 float nsigfit[nTrials];
158     float nbkgfit[nTrials];
159     float nsigerrfit[nTrials];
160     float nbkgerrfit[nTrials];
161     float significance[nTrials];
162 benhoob 1.2 TCanvas *can[nTrials];
163 benhoob 1.1
164     TH1F* hsig = new TH1F("hsig","Sig Yield",100,0,100);
165 benhoob 1.2 TH1F* hbkg = new TH1F("hbkg","Bkg Yield",100,0,200);
166 benhoob 1.1 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 benhoob 1.2 for( int i = 0 ; i < nTrials ; ++i ){
171 benhoob 1.1
172     nsig.setVal( nsigtrue );
173     nbkg.setVal( nbkgtrue );
174    
175 benhoob 1.2 //-------------------------------------
176     // generate pseudo-dataset from PDF
177     //-------------------------------------
178    
179 benhoob 1.1 RooDataSet *gendata = datapdf.generate(RooArgList(mva),nsigtrue+nbkgtrue,Extended(kTRUE));
180    
181 benhoob 1.2 //-------------------------------------
182     // perform fit with nsig fixed to 0
183     //-------------------------------------
184    
185 benhoob 1.1 nsig.setVal(0);
186 benhoob 1.2 nbkg.setVal(gendata->sumEntries());
187 benhoob 1.1 nsig.setConstant();
188 benhoob 1.2
189     RooAbsReal* mynll_bkg = bkgpdf.createNLL( *gendata );
190     RooAbsReal* mynll_tot = datapdf.createNLL( *gendata );
191 benhoob 1.1
192 benhoob 1.2 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 benhoob 1.1 RooFitResult *bkg_result = datapdf.fitTo( *gendata , Save() , Extended(kTRUE) );
202 benhoob 1.2
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 benhoob 1.1
220 benhoob 1.2 //nsig.setVal(50);
221 benhoob 1.1 nsig.setConstant(kFALSE);
222 benhoob 1.2
223     cout << endl;
224     cout << "----------------------------------------" << endl;
225     cout << "Performing fit with signal yield floated" << endl;
226     cout << "----------------------------------------" << endl;
227     cout << endl;
228    
229 benhoob 1.1 RooFitResult *result = datapdf.fitTo( *gendata , Save() , Extended(kTRUE) );
230    
231 benhoob 1.2 if( display ){
232    
233     can[i] = new TCanvas(Form("can_%i",i),Form("can_%i",i),600,600);
234     can[i]->cd();
235 benhoob 1.1
236 benhoob 1.2 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 benhoob 1.1 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 benhoob 1.2 gStyle->SetOptFit(0111);
283 benhoob 1.1
284 benhoob 1.2 TCanvas *c1 = new TCanvas("c1","",1200,800);
285     c1->Divide(3,2);
286 benhoob 1.1
287 benhoob 1.2 c1->cd(1);
288 benhoob 1.1 hsig->GetXaxis()->SetTitle("Sig Yield");
289     hsig->Draw();
290     hsig->Fit("gaus");
291    
292 benhoob 1.2 c1->cd(2);
293 benhoob 1.1 hsigpull->GetXaxis()->SetTitle("Sig Pull");
294     hsigpull->Draw();
295     hsigpull->Fit("gaus");
296    
297 benhoob 1.2 c1->cd(4);
298 benhoob 1.1 hbkg->GetXaxis()->SetTitle("Bkg Yield");
299     hbkg->Draw();
300     hbkg->Fit("gaus");
301    
302 benhoob 1.2 c1->cd(5);
303 benhoob 1.1 hbkgpull->GetXaxis()->SetTitle("Bkg Pull");
304     hbkgpull->Draw();
305     hbkgpull->Fit("gaus");
306    
307 benhoob 1.2 c1->cd(3);
308 benhoob 1.1 hsignificance->GetXaxis()->SetTitle("Significance");
309     hsignificance->Draw();
310     hsignificance->Fit("gaus");
311    
312 benhoob 1.2 if( printgif ) c1->Print(Form("plots/%s_fitval.gif",mvaname));
313 benhoob 1.1
314    
315     }