ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/Jeng/scripts/fitNewRelIso.C
Revision: 1.3
Committed: Fri Oct 30 17:55:46 2009 UTC (15 years, 6 months ago) by jengbou
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 1.2: +95 -43 lines
Error occurred while calculating annotation data.
Log Message:
update

File Contents

# Content
1 //////////////////////////////////////////////////////////////////////////
2 //Geng-yuan Jeng/UC Riverside
3 //2009/04/20 14:41:01
4 /////////////////////////////////////////////////////////////////////////
5
6 #ifndef __CINT__
7 #include "RooGlobalFunc.h"
8 #endif
9 #include "RooRealVar.h"
10 #include "RooDataSet.h"
11 #include "RooGaussian.h"
12 #include "TCanvas.h"
13 #include "RooPlot.h"
14 #include "TH1D.h"
15 #include "TTree.h"
16 using namespace RooFit;
17 // .493/.2114 j1
18 //.773/.3257 j2
19 // .863/.353 j3
20 //.808/.294 j4
21 void fitNewRelIso()
22 {
23 // TString fileName = "skimmed/QCDbinall_NewRelIso.root";
24 // TString fileName = "skimmed/QCDbin4_NewRelIso_CD30_rebin2.root";
25 // TString fileName = "skimmed/QCDbin3_NewRelIso_CD.root";
26 // TString fileName = "skimmed/QCDbin4_rebin.root";
27 // TString fileName = "skimmed/QCDbin4_NewRelIso_FastSim.root";
28 // TString fileName = "skimmed226/QCDbin4_005.root";
29 // TString fileName = "skimmed226/QCDbin4_005.root";
30 TString fileName = "skimmed226/QCDbin123_NewRelIso_FastSim_005.root";
31
32 // Dynamic(true) or static(false) range
33 bool dynamic = true;
34 int np = 100;
35 double epslon = 1.e-5;
36 double epslon1 = 1.e-6;
37 // Dynamic fit region weight
38 double itune1 = .25; // 0.15 for 1-3; 0.25 for 4
39 double itune2 = 1.65; //1.65
40 double itune3 = 1.25; //1.1 full 1.25 fast to limit upper fit range
41 double wxmin = 0.; // 1.81 1.7 (1.85 for fastsim 1.825 for full
42 double wxmax = 0.; // 0.9 .95 (/1.65 fast /2. full)
43 // Select fitting function:
44 // TString s0 = "landau";
45 // Select New or Old reliso:
46 // TString isoname = "New";
47
48 Double_t ax0=0.;
49 Double_t axf=0.05;
50 Double_t axF=0.1;
51 Double_t bx0=0.2; // 0.4 for 4 0.2 for 123
52 Double_t bxf=2.; // 2.0 for 4 1.0 for 123
53 int niter = 1;
54 int nsiter = 0;
55 Double_t temp = 0.;
56 Double_t tempb = 0.;
57 Double_t para[3] = {0.,0.,0.};
58 Double_t bound[3] = {10e6.,0.,0.};
59 int bmin;
60 int bmax;
61 int ndof;
62
63 gStyle->SetOptStat(1);
64 gStyle->SetPalette(1);
65 // Import histos
66
67 TFile *file = TFile::Open(fileName);
68 TTree *tree = (TTree*)file->Get("myTree");
69 TH1D *h0 = (TH1D*)file->Get("histos/h_RelIso_all");
70 TH1D *h1 = (TH1D*)file->Get("histos/h_RelIso_qcd");
71 Int_t jbin;
72 Double_t na;
73 tree->SetBranchAddress("jbin",&jbin);
74 tree->SetBranchAddress("na",&na);
75 tree->GetEntry(0);
76 // if(jbin != 0)
77 // itune1 *= jbin;
78
79 TH1D *h_all = (TH1D*)h0->Clone();
80 TH1D *h_qcd = (TH1D*)h1->Clone();
81 Int_t nbxMax = h_all->GetXaxis()->FindBin(2.0);
82 h_all->GetXaxis()->SetRange(2,h_all->GetXaxis()->FindBin(bxf));
83 Int_t nbMax = h_all->GetMaximumBin();
84 cout << "=========> Bin number at peak= " << nbMax << endl;
85 h_all->GetXaxis()->SetRange(1,nbxMax);
86 TAxis *axis0 = h_all->GetXaxis();
87 double bwidth = axis0->GetBinWidth(nbMax);
88 cout << "=========> bwidth = " << bwidth << endl;
89
90 cout << "\n>>>>> Iteration step: "<< niter << endl;
91
92 RooRealVar x("x","x",0.,2.);
93 RooRealVar y("y","y",0.,2.);
94 RooDataHist *dh0 = new RooDataHist("dh0","dh0",x,Import(*h0));
95 RooDataHist *dh1 = new RooDataHist("dh1","dh1",x,Import(*h1));
96 RooDataHist *dhy0 = new RooDataHist("dhy0","dhy0",y,Import(*h0));
97 RooDataHist *dhy1 = new RooDataHist("dhy1","dhy1",y,Import(*h1));
98 // Choose signal region:
99 x.setRange("signalregion",ax0,axf);
100 // x.setRange("signalregion",ax0,axF);
101 x.setRange("ctrlregion",bx0,bxf);
102
103 // S e t u p m o d e l
104 // ---------------------
105
106 // Declare variables x,mean,sigma with associated name, title, initial value and allowed range
107 // Exponential parameters
108 RooRealVar lamda("lamda","decay constant of exponential",1,-100.,100.);
109 // Gaussian parameters
110 RooRealVar mean("mean","mean of gaussian",1.5,0.,2.);
111 RooRealVar sigma("sigma","width of gaussian",1,0.,100.);
112 // Landau parameters
113 RooRealVar MPV("MPV","mean of landau",1,0,2);
114 RooRealVar Sig("Sig","sigma of landau",1,0,2);
115 // Build gaussian p.d.f in terms of x,mean and sigma
116 RooExponential expo("expo","exponential PDF",x,lamda);
117 RooGaussian gauss("gauss","gaussian PDF",x,mean,sigma);
118 RooLandau landau("landau","landau PDF",x,MPV,Sig);
119 // Build model
120 // RooRealVar elfrac("elfrac","fraction of Exponential and Landau",0.05,0.,1.);
121 // RooRealVar glfrac("glfrac","fraction of Gaussian and Landau",0.,0.,1.);
122 // RooAddPdf model("model","g+l",RooArgList(gauss,landau),glfrac);
123
124 // Construct plot frame in 'x'
125 RooPlot* xframe = x.frame(Title("Landau p.d.f. with data"));
126 RooPlot* yframe = y.frame(Title("Landau p.d.f. with data"));
127
128 // P l o t m o d e l a n d c h a n g e p a r a m e t e r v a l u e s
129 // ---------------------------------------------------------------------------
130 // Change the value of Parameters
131 // sigma.setVal(2.);
132 // MPV.setVal(0.8412);
133 // Sig.setVal(0.314);
134 // Plot gauss in frame (i.e. in x) and draw frame on canvas
135 // gauss.plotOn(xframe);
136 // landau.plotOn(xframe,LineColor(kRed));
137
138 // Make a second plot frame in x and draw both the
139 // data and the p.d.f in the frame
140 dh0->plotOn(xframe,MarkerStyle(23),MarkerColor(2),LineColor(2),XErrorSize(0));
141 dh1->plotOn(xframe,MarkerStyle(22),MarkerColor(9),LineColor(9),XErrorSize(0));
142 dhy0->plotOn(yframe,MarkerStyle(23),MarkerColor(2),LineColor(2),XErrorSize(0));
143 dhy1->plotOn(yframe,MarkerStyle(22),MarkerColor(9),LineColor(9),XErrorSize(0));
144
145 // F i t m o d e l t o d a t a
146 // -----------------------------
147
148 // Fit pdf to data
149 RooFitResult*rest = landau.fitTo(*dh0,Range("ctrlregion"),PrintLevel(-1),Save());
150 rest->Print("v");
151 niter++;
152 RooAbsReal* nQCDsigw = landau.createIntegral(x,NormSet(x),Range("signalregion"));
153 RooAbsReal* nQCDbkgw = landau.createIntegral(x,NormSet(x),Range("ctrlregion"));
154 nQCDsigw->Print();
155 nQCDbkgw->Print();
156 // Draw all frames on a canvas
157 Double_t xb0 = bx0;
158 Double_t xbf = bxf;
159 wxmin = (MPV.getVal() - itune1)/Sig.getVal();
160 wxmax = wxmin/itune2;
161
162 TAxis *axis = h0->GetXaxis();
163 if (dynamic) {
164 TCanvas* c = new TCanvas("fitNewRelIso","fitNewRelIso",1000,600);
165 c->Divide(2,1);
166 c->cd(1);
167
168 xb0 = MPV.getVal()-wxmin*Sig.getVal();
169 xbf = MPV.getVal()+wxmax*Sig.getVal();
170 if (xb0 < 2.*axf )
171 xb0 = 2.*axf;
172 if (xbf > itune3)
173 xbf = itune3;
174
175 for (;niter <= np && nsiter < 2; niter++){
176 xb0 = MPV.getVal()-wxmin*Sig.getVal();
177 xbf = MPV.getVal()+wxmax*Sig.getVal();
178 if (xb0 < 2.*axf )
179 xb0 = 2.*axf;
180 if (xbf > itune3)
181 xbf = itune3;
182
183 bmin = axis->FindBin(xb0);
184 bmax = axis->FindBin(xbf);
185 // number of bins of non-empty entries (>5) - (num params. of Landau+1)
186 ndof = bmax-bmin+1-4;
187
188 cout << "\n>>>>> Iteration step: "<< niter << endl;
189 cout << "=========> xb0, xbf = " << xb0 << ", " << xbf << endl;
190 // x.setRange("ctrlregion",xb0.getVal(),xbf.getVal());
191 x.setRange("ctrlregion",xb0,xbf);
192 x.setRange("intregion",0.,xbf);
193 x.setRange("centregion",axf,xb0);
194
195 // Construct a chi^2 of the data and the model,
196 // which is the input probability density scaled
197 // by the number of events in the dataset
198 // RooChi2Var chi2("chi2","chi2",landau,*dh0,Range(xb0.getVal(),xbf.getVal()));
199 RooChi2Var chi2("chi2","chi2",landau,*dh0,Range("ctrlregion"));
200 // Use RooMinuit interface to minimize chi^2
201 RooMinuit m(chi2);
202 m.migrad();
203 m.hesse();
204
205 if ((fabs(chi2.getVal()/ndof - bound[0]) <= epslon) ||
206 (fabs(chi2.getVal()/ndof - temp) <= epslon) ||
207 (fabs(xb0 - tempb) < = epslon1 )
208 ){
209 nsiter++;
210 cout << "=========> Conditions converge for " << nsiter << " time(s)" << endl;
211 }
212 if (chi2.getVal()/ndof < bound[0]){
213 bound[0] = chi2.getVal()/ndof;
214 bound[1] = xb0;
215 bound[2] = xbf;
216 para[1] = MPV.getVal();
217 para[2] = Sig.getVal();
218 nQCDsigw = landau.createIntegral(x,NormSet(x),Range("signalregion"));
219 nQCDbkgw = landau.createIntegral(x,NormSet(x),Range("ctrlregion"));
220 cout << "=========> New Min Norm. chi2 = " << chi2.getVal()/ndof <<endl;
221 cout << "=========> Fitting range = " << bound[1] << " to " << bound[2] << endl;
222 landau.plotOn(xframe,NormRange("intregion"),Range("ctrlregion"),LineColor(niter+1));
223 landau.paramOn(xframe,Layout(0.28,0.75,0.42));
224 landau.plotOn(xframe,NormRange("intregion"),Range("signalregion"),LineColor(niter+1));
225 landau.plotOn(xframe,NormRange("intregion"),Range("centregion"),
226 LineColor(niter+1),LineStyle(4));
227 xframe->Draw();
228 nQCDsigw->Print();
229 nQCDbkgw->Print();
230 }
231 temp = chi2.getVal()/ndof;
232 tempb = xb0;
233 }
234 cout << "=========> Norm. chi2 of the last iteration = " << chi2.getVal()/ndof << endl;
235 cout << "=========> Fit range of the last iteration = " << xb0 << " to " << xbf << endl;
236 cout << "=========> MPV = " << MPV.getVal() << "; Sig = " << Sig.getVal() << endl;
237 cout << "================================================================" << endl;
238
239 // plot
240 Double_t mpv1 = para[1];
241 Double_t sig1 = para[2];
242 RooRealVar MPV1("MPV1","MPV1",mpv1);
243 RooRealVar Sig1("Sig1","Sig1",sig1);
244 RooLandau landau1("landau1","landau1",y,MPV1,Sig1);
245 cout << "=========> Minimum Norm. chi2 = " << bound[0] << endl;
246 cout << "=========> Final fit range = " << bound[1] << " to " << bound[2] << endl;
247 cout << "=========> Calculate nQCDsigw and nQCDbkgw: " << endl;
248 cout << "=========> Final MPV = para[1] = " << para[1] << endl;
249 cout << "=========> Final SIG = para[2] = " << para[2] << endl;
250
251 y.setRange("signalregion",ax0,axf);
252 y.setRange("centralregion",axf,bound[1]);
253 y.setRange("ctrlregion",bound[1],bound[2]);
254 nQCDsigw = landau1.createIntegral(y,NormSet(y),Range("signalregion"));
255 nQCDbkgw = landau1.createIntegral(y,NormSet(y),Range("ctrlregion"));
256 nQCDsigw->Print();
257 nQCDbkgw->Print();
258
259 landau1.plotOn(yframe,NormRange("ctrlregion"),Range("ctrlregion"));
260 landau1.plotOn(yframe,NormRange("ctrlregion"),Range("centralregion"),
261 LineColor(3),LineStyle(kDashed));
262 landau1.plotOn(yframe,NormRange("ctrlregion"),Range("signalregion"),LineColor(2));
263 c->cd(2);
264 yframe->Draw();
265
266 }
267 else { // Fixed range
268
269 TCanvas* c = new TCanvas("fitNewRelIso","fitNewRelIso",800,600);
270 para[1] = MPV.getVal();
271 para[2] = Sig.getVal();
272 bound[1] = bx0;
273 bound[2] = bxf;
274 bmin = axis->FindBin(bound[1]);
275 bmax = axis->FindBin(bound[2]);
276 // number of bins of non-empty entries (>5) - (num params. of Landau+1)
277 bound[0] = rest->minNll();
278 cout << "=========> Final fit range = " << bound[1] << " to " << bound[2] << endl;
279 // Print values of mean and sigma (that now reflect fitted values and errors)
280 cout << "=========> Final MPV = para[1] = " << para[1] << endl;
281 cout << "=========> Final SIG = para[2] = " << para[2] << endl;
282
283 x.setRange("signalregion",ax0,axf);
284 x.setRange("centralregion",axf,bound[1]);
285 x.setRange("ctrlregion",bound[1],bound[2]);
286
287 landau.plotOn(xframe,NormRange("ctrlregion"),Range("ctrlregion"));
288 landau.plotOn(xframe,NormRange("ctrlregion"),Range("centralregion"),
289 LineColor(3),LineStyle(kDashed));
290 landau.plotOn(xframe,NormRange("ctrlregion"),Range("signalregion"),LineColor(2));
291 xframe->Draw();
292
293 }
294 // h0->SetLineColor(9);
295 // h0->SetLineStyle(2);
296 // h0->SetLineWidth(2);
297 h0->Draw("same");
298 // h1->SetLineStyle(3);
299 // h1->SetLineWidth(2);
300 h1->SetLineColor(9); //40
301 // h1->SetFillStyle(3020); // 3018
302 // h1->SetFillColor(41); //38
303 h1->Draw("same");
304
305 // Get number of events within fitted region ==> cross check
306 TAxis *axis = h0->GetXaxis();
307 bmin = axis->FindBin(xb0);
308 bmax = axis->FindBin(xbf);
309 if ( !dynamic )
310 cout << "=========> Minimized FCN = " << bound[0] << endl;
311 double nfac = h0->Integral(bmin,bmax);
312 nfac -= (h0->GetBinContent(bmin))*(xb0-axis->GetBinLowEdge(bmin))/axis->GetBinWidth(bmin);
313 nfac -= (h0->GetBinContent(bmax))*(axis->GetBinUpEdge(bmax)-xbf)/axis->GetBinWidth(bmax);
314 cout << "=========> Final Nfac = " << nfac << endl;
315 // nQCDsigw->Print();
316 // nQCDbkgw->Print();
317 Double_t nQCDsig = nfac * nQCDsigw->getVal()/nQCDbkgw->getVal();
318 cout << "=========> Number of observed QCD evts = " << nQCDsig << endl;
319 // Print results
320 cout << "\n";
321 cout << ">>>>> Jet bin " << jbin << ":" << endl;
322 if ( dynamic ){
323 cout << ">>>>> itune1 = " << itune1 << "; ";
324 cout << "itune2 = " << itune2 << endl;
325 cout << ">>>>> wxmin = " << wxmin << "; ";
326 cout << "wxmax = " << wxmax << endl;
327 }
328 cout << ">>>>> Observed Ns = " << nQCDsig << endl;
329 cout << ">>>>> Expected Na = " << na << endl;
330 cout << "Deviation = " << (nQCDsig-na)/na*100.0 << " %" <<endl;
331
332 }