Annotation of ttbar/p20_taujets_note/tau_jettrig/tau_trf2D_fit.C, revision 1.1.1.1
1.1 uid12904 1: Double_t fit_ET(Double_t* xar, Double_t* par)
2: {
3: Double_t x = *xar;
4:
5: Double_t p2x = par[2]+x;
6: if (p2x==0) return 0;
7: //return par[0]*x + par[0]*exp(-par[1]*p2x);
8: //return par[0]*exp((x)/(p2x*p2x)) + par[1]*x;
9: return par[0]*exp((x)/(p2x*p2x)) + par[1]*x/(p2x*p2x);
10: //return par[0]*(x-par[1])/p2x ;
11: }
12:
13: Double_t fit_eta(Double_t* xar, Double_t* par)
14: {
15: Double_t x = *xar;
16:
17: Double_t dx = x - 1;
18: if (x<0) dx = x + 1;
19: //x = fabs(x);
20: dx = fabs(dx);
21: Double_t y = par[0] + par[1]*x + par[2]*x*x + par[3]*x*x*x + par[4]*x*x*x*x + par[5]*x*x*x*x*x + par[6]*x*x*x*x*x*x;
22: //if (dx<0.05) y = par[0]*exp(x) + par[1]*x*x + par[2]*x*x*x + par[3]*x*x*x*x;
23: return y;
24: }
25:
26: Double_t fit_eta_ET(Double_t* xar, Double_t* par)
27: {
28: Double_t ET = xar[0];
29: Double_t eta = xar[1];
30:
31: Double_t* par_ET = par+1;
32: Double_t* par_eta = par+4; // offset = 1 + npar_ET
33:
34: return par[0]*fit_ET(&ET,par_ET)*fit_eta(&eta,par_eta);
35: }
36:
37: Double_t sigma_ET(Double_t* xar, Double_t* par)
38: {
39: // given the convariance matrix of parameters, return error
40: Double_t x = *xar;
41:
42: Double_t p2x = par[2]+x;
43: if (p2x==0) return 1e10;
44:
45: Double_t dYdP0 = exp((x)/(p2x*p2x));
46: Double_t dYdP1 = x/(p2x*p2x);
47: Double_t dYdP2 = -2*par[0]*exp((x)/(p2x*p2x))*(x)/(p2x*p2x*p2x) - 2*par[1]*(x)/(p2x*p2x*p2x);
48:
49: // Double_t dYdP0 = exp((x)/p2x);
50: // Double_t dYdP1 = x;
51: // Double_t dYdP2 = -2*par[0]*exp((x)/p2x)*(x)/(p2x*p2x*p2x);
52:
53:
54: Double_t* p = par+3; // offset = npar_ET
55: Double_t s0 = *p++*dYdP0; s0 += *p++*dYdP1; s0 += *p++*dYdP2;
56: Double_t s1 = *p++*dYdP0; s1 += *p++*dYdP1; s1 += *p++*dYdP2;
57: Double_t s2 = *p++*dYdP0; s2 += *p++*dYdP1; s2 += *p++*dYdP2;
58:
59: Double_t sigma_y = dYdP0*s0 + dYdP1*s1 + dYdP2*s2;
60: //cout<<"dYdP0 :"<<dYdP0<<" dYdP1 :"<<dYdP1<<" dYdP2 :"<<dYdP2<<endl;
61: //cout<<"s0 :"<<s0<<" s1 :"<<s1<<" s2 :"<<s2<<endl;
62: //cout<<"sigma_y_ET :"<<sigma_y<<endl;
63: //sigma_y = 0.000005;
64: return sqrt(sigma_y);
65: }
66:
67: Double_t sigma_eta(Double_t* xar, Double_t* par)
68: {
69: // given the convariance matrix of parameters, return error
70: Double_t x = *xar;
71: //x = fabs(x);
72: //Double_t dYdP0 = 0;
73: //if (x!=0) dYdP0 = -par[0]/(x*x);
74: Double_t dYdP0 = 1;
75: Double_t dYdP1 = x*x;
76: Double_t dYdP2 = x*x*x;
77: Double_t dYdP3 = x*x*x*x;
78: Double_t dYdP4 = x*x*x*x*x;
79: Double_t dYdP5 = x*x*x*x*x*x;
80: Double_t dYdP6 = x*x*x*x*x*x*x;
81:
82:
83: Double_t* p = par+7; // offset = npar_eta
84: Double_t s0 = *p++*dYdP0; s0 += *p++*dYdP1; s0 += *p++*dYdP2; s0 += *p++*dYdP3; s0 += *p++*dYdP4; s0 += *p++*dYdP5; s0 += *p++*dYdP6;
85: Double_t s1 = *p++*dYdP0; s1 += *p++*dYdP1; s1 += *p++*dYdP2; s1 += *p++*dYdP3; s1 += *p++*dYdP4; s1 += *p++*dYdP5; s1 += *p++*dYdP6;
86: Double_t s2 = *p++*dYdP0; s2 += *p++*dYdP1; s2 += *p++*dYdP2; s2 += *p++*dYdP3; s2 += *p++*dYdP4; s2 += *p++*dYdP5; s2 += *p++*dYdP6;
87: Double_t s3 = *p++*dYdP0; s3 += *p++*dYdP1; s3 += *p++*dYdP2; s3 += *p++*dYdP3; s3 += *p++*dYdP4; s3 += *p++*dYdP5; s3 += *p++*dYdP6;
88: Double_t s4 = *p++*dYdP0; s4 += *p++*dYdP1; s4 += *p++*dYdP2; s4 += *p++*dYdP3; s4 += *p++*dYdP4; s4 += *p++*dYdP5; s4 += *p++*dYdP6;
89: Double_t s5 = *p++*dYdP0; s5 += *p++*dYdP1; s5 += *p++*dYdP2; s5 += *p++*dYdP3; s5 += *p++*dYdP4; s5 += *p++*dYdP5; s5 += *p++*dYdP6;
90: Double_t s6 = *p++*dYdP0; s6 += *p++*dYdP1; s6 += *p++*dYdP2; s6 += *p++*dYdP3; s6 += *p++*dYdP4; s6 += *p++*dYdP5; s6 += *p++*dYdP6;
91:
92: Double_t sigma_y = dYdP0*s0 + dYdP1*s1 + dYdP2*s2 + dYdP3*s3 + dYdP4*s4 + dYdP5*s5 + dYdP6*s6; //cout<<"sigma_y_eta :"<<sigma_y<<endl;
93: return sqrt(sigma_y);
94: }
95:
96: Double_t sigma_eta_ET(Double_t* xar, Double_t* par)
97: {
98: Double_t ET = xar[0];
99: Double_t eta = xar[1];
100:
101: Double_t* par_ET = par+1;
102: Double_t* par_eta = par+13; // offset = 1 + npar_ET + npar_ET*npar_ET
103:
104: Double_t val_ET = fit_ET(&ET,par_ET);
105: Double_t err_ET = sigma_ET(&ET,par_ET);
106: Double_t val_eta = fit_eta(&eta,par_eta);
107: Double_t err_eta = sigma_eta(&eta,par_eta);
108:
109: return par[0]*sqrt(val_ET*val_ET*err_eta*err_eta +
110: err_ET*err_ET*val_eta*val_eta);
111: }
112:
113: Double_t fit_ET_p(Double_t* xar, Double_t* par)
114: {
115: return fit_ET(xar,par) + sigma_ET(xar,par);
116: }
117:
118: Double_t fit_ET_m(Double_t* xar, Double_t* par)
119: {
120: return fit_ET(xar,par) - sigma_ET(xar,par);
121: }
122:
123: Double_t fit_eta_p(Double_t* xar, Double_t* par)
124: {
125: return fit_eta(xar,par) + sigma_eta(xar,par);
126: }
127:
128: Double_t fit_eta_m(Double_t* xar, Double_t* par)
129: {
130: return fit_eta(xar,par) - sigma_eta(xar,par);
131: }
132:
133: Char_t* next_name(Char_t* ch)
134: {
135: if (ch[3]!='9') { ch[3]+=1; return ch; }
136: ch[3] = '0';
137: if (ch[2]!='9') { ch[2]+=1; return ch; }
138: ch[2] = '0';
139: if (ch[1]!='9') { ch[1]+=1; return ch; }
140: ch[1] = '0';
141: return ch;
142: }
143:
144: void tau_trf2D_fit()
145: {
146: gROOT->SetStyle("Plain");
147: gStyle->SetOptStat(0);
148: gStyle->SetOptTitle(0);
149:
150: Int_t icol[4] = {1,2,4,3};
151:
152: Char_t ch_name[] = "t000";
153:
154: const Int_t nf = 1;
155:
156: TFile* parametr_file = new TFile("tautrf2D_highmetl_nobtag_2.root");
157:
158: Double_t hh_min[2] = {0.0, 0.0};
159: Double_t hh_max[2] = {1.05, 1.05};
160:
161: TH1F* hh_allj[2];
162: TH1F* hh_btag[2];
163: TH1F* hh_eff[2];
164: TF1* fitfun[2];
165: TF1* fitfun_p[2];
166: TF1* fitfun_m[2];
167:
168: TH2F* hh_allj_2d[nf];
169: TH2F* hh_btag_2d[nf];
170: TH2F* hh_allj_2d_tag[nf];
171: TH2F* hh_btag_2d_tag[nf];
172: TF2* fitfun_2d[nf];
173: TF2* fitfun_2d_err[nf];
174:
175:
176:
177: TH2F* TauTRFtau = new TH2F("TauJET_tau","Taus #eta vs pT", 18,20, 200, 40,-2, 2);
178: TH2F* TauTRFjet = new TH2F("TauJET_jet","Taus #eta vs pT", 18,20, 200, 40,-2, 2);
179:
180: // parameterize taggability on EMqcd, the nj=1 bin
181:
182: parametr_file->cd();
183: hh_allj[0] = (TH1F*)gROOT->FindObject("TauTRFjetPt")->Clone();
184: hh_allj[1] = (TH1F*)gROOT->FindObject("TauTRFjetEta")->Clone();
185: hh_btag[0] = (TH1F*)gROOT->FindObject("TauTRFtauPt")->Clone();
186: hh_btag[1] = (TH1F*)gROOT->FindObject("TauTRFtauEta")->Clone();
187:
188: hh_allj_2d[0] = (TH2F*)gROOT->FindObject("TauTRFjetEtaPt")->Clone();
189: hh_btag_2d[0] = (TH2F*)gROOT->FindObject("TauTRFtauEtaPt")->Clone();
190:
191: hh_allj_2d_tag[0] = (TH2F*)gROOT->FindObject("TauTRFjetEtaPtTAG")->Clone();
192: hh_btag_2d_tag[0] = (TH2F*)gROOT->FindObject("TauTRFtauEtaPtTAG")->Clone();
193:
194:
195: Char_t* xtit[2] = {"ET, GeV", "#eta"};
196:
197: const Int_t npar_ET = 3, npar_eta = 7;
198:
199: const Int_t npar_ET_pm = npar_ET + npar_ET*npar_ET;
200: const Int_t npar_eta_pm = npar_eta + npar_eta*npar_eta;
201:
202: TCanvas* c1 = new TCanvas("c1","c1",700,760);
203: c1->Divide(1,2);
204: for (Int_t k=0; k<2; ++k) {
205: c1->cd(k+1);
206: gPad->SetBottomMargin(0.15);
207: gPad->SetGridx();
208: gPad->SetGridy();
209:
210: Int_t n = hh_allj[k]->GetNbinsX();
211: Double_t xmin = hh_allj[k]->GetXaxis()->GetXmin();
212: Double_t xmax = hh_allj[k]->GetXaxis()->GetXmax();
213: hh_eff[k] = new TH1F(next_name(ch_name),"eff",n,xmin,xmax);
214: for (Int_t i=0; i<n; ++i) {
215: Double_t a = hh_allj[k]->GetBinContent(i+1);
216: Double_t b = hh_btag[k]->GetBinContent(i+1);
217: Double_t y = 0, e = 0;
218: if (a>0) {
219: y = b/a;
220: e = sqrt(b*(a-b)/a)/a;
221: }
222: hh_eff[k]->SetBinContent(i+1,y);
223: hh_eff[k]->SetBinError(i+1,e);
224: }
225: hh_eff[k]->SetMarkerStyle(20);
226: hh_eff[k]->SetMarkerSize(1.4);
227: hh_eff[k]->SetMarkerColor(2);
228: hh_eff[k]->SetMinimum(hh_min[k]);
229: hh_eff[k]->SetMaximum(hh_max[k]);
230: hh_eff[k]->GetXaxis()->SetTitle(xtit[k]);
231: hh_eff[k]->GetXaxis()->SetTitleSize(0.06);
232: hh_eff[k]->GetXaxis()->SetLabelSize(0.06);
233: hh_eff[k]->GetXaxis()->SetNdivisions(505);
234: hh_eff[k]->GetYaxis()->SetLabelSize(0.06);
235: hh_eff[k]->GetYaxis()->SetNdivisions(505);
236: hh_eff[k]->Draw("pe0");
237:
238: TMatrixD matrix_ET(npar_ET,npar_ET);
239: TMatrixD matrix_eta(npar_eta,npar_eta);
240: if (k==0) { // ET
241: fitfun[k] = new TF1(next_name(ch_name),fit_ET,xmin,xmax,npar_ET);
242: fitfun[k]->SetParameter(0,0.9);
243: fitfun[k]->SetParameter(1,0);
244: fitfun[k]->SetParameter(2,10);
245: hh_eff[k]->Fit(fitfun[k],"0");
246: cout<<"ET chi squared (per degree of freedom) :"<<fitfun[k]->GetChisquare()/24<<endl;
247: gMinuit->mnemat(matrix_ET.GetMatrixArray(),npar_ET);
248: } else { // eta
249: fitfun[k] = new TF1(next_name(ch_name),fit_eta,xmin,xmax,npar_eta);
250: fitfun[k]->SetParameter(0,0.9);
251: fitfun[k]->SetParameter(1,2e-03);
252: fitfun[k]->SetParameter(2,1.0e-03);
253: fitfun[k]->SetParameter(3,1.0e-03);
254: fitfun[k]->SetParameter(4,1.0e-03);
255: fitfun[k]->SetParameter(5,1.0e-03);
256: fitfun[k]->SetParameter(6,1.0e-03);
257: hh_eff[k]->Fit(fitfun[k],"0");
258: cout<<"Eta chi squared (per degree of freedom) :"<<fitfun[k]->GetChisquare()/46<<endl;
259: gMinuit->mnemat(matrix_eta.GetMatrixArray(),npar_eta);
260: }
261: fitfun[k]->SetLineColor(4);
262: fitfun[k]->SetLineWidth(1);
263: fitfun[k]->Draw("same");
264:
265: // draw error bands
266: Int_t np = 0;
267: TMatrixD* tm;
268: if (k==0) { // ET
269: np = npar_ET;
270: tm = &matrix_ET;
271: fitfun_p[k] = new TF1(next_name(ch_name),fit_ET_p,xmin,xmax,npar_ET_pm);
272: fitfun_m[k] = new TF1(next_name(ch_name),fit_ET_m,xmin,xmax,npar_ET_pm);
273: } else { // eta
274: np = npar_eta;
275: tm = &matrix_eta;
276: fitfun_p[k] = new TF1(next_name(ch_name),fit_eta_p,xmin,xmax,npar_eta_pm);
277: fitfun_m[k] = new TF1(next_name(ch_name),fit_eta_m,xmin,xmax,npar_eta_pm);
278: }
279: for (Int_t i = 0; i<np; ++i) {
280: fitfun_p[k]->SetParameter(i,fitfun[k]->GetParameter(i));
281: fitfun_m[k]->SetParameter(i,fitfun[k]->GetParameter(i));
282: }
283: Int_t ip = np;
284: for (Int_t i = 0; i<np; ++i) {
285: for (Int_t j = 0; j<np; ++j) {
286: Double_t covij = (*tm)(i,j);
287: fitfun_p[k]->SetParameter(ip,covij);
288: fitfun_m[k]->SetParameter(ip,covij);
289: ++ip;
290: }
291: }
292: fitfun_p[k]->SetLineColor(4);
293: fitfun_p[k]->SetLineWidth(1);
294: fitfun_p[k]->Draw("same");
295: fitfun_m[k]->SetLineColor(4);
296: fitfun_m[k]->SetLineWidth(1);
297: fitfun_m[k]->Draw("same");
298: }
299: c1->Modified();
300:
301: // 2d parameterization
302: TFile* ff_f2d = new TFile("f2d_tau.root","RECREATE");
303:
304: for (Int_t kf = 0; kf<nf; ++kf) {
305: Double_t sa = 0, sb = 0;
306: // fetch histogram parameters
307: Int_t nx = hh_allj_2d[kf]->GetNbinsX();
308: Double_t xmin = hh_allj_2d[kf]->GetXaxis()->GetXmin();
309: Double_t xmax = hh_allj_2d[kf]->GetXaxis()->GetXmax();
310: Int_t ny = hh_allj_2d[kf]->GetNbinsY();
311: Double_t ymin = hh_allj_2d[kf]->GetYaxis()->GetXmin();
312: Double_t ymax = hh_allj_2d[kf]->GetYaxis()->GetXmax();
313: // construct 2d function
314: Char_t f2d_name[256];
315: strcpy(f2d_name,"f2d_tau_");
316: //strcat(f2d_name,ss_name[kf]);
317: const Int_t npar = npar_ET+npar_eta+1;
318: Double_t pars[npar] = {1};
319: fitfun[0]->GetParameters(pars+1);
320: fitfun[1]->GetParameters(pars+npar_ET+1);
321: fitfun_2d[kf] = new TF2(f2d_name,fit_eta_ET,xmin,xmax,ymin,ymax,npar);
322: fitfun_2d[kf]->SetParameters(pars);
323: for (Int_t ix = 1; ix<=nx; ++ix) {
324: for (Int_t iy = 1; iy<=ny; ++iy) {
325: // Double_t a = hh_allj_2d[kf]->GetBinContent(ix,iy);
326: // Double_t b = hh_btag_2d[kf]->GetBinContent(ix,iy);
327: // Double_t xi = hh_allj_2d[kf]->GetXaxis()->GetBinCenter(ix);
328: // Double_t yi = hh_allj_2d[kf]->GetYaxis()->GetBinCenter(iy);
329: Double_t a = hh_allj_2d[kf]->GetBinContent(ix,iy);
330: Double_t b = hh_btag_2d[kf]->GetBinContent(ix,iy);
331: Double_t xi = hh_allj_2d[kf]->GetXaxis()->GetBinCenter(ix);
332: Double_t yi = hh_allj_2d[kf]->GetYaxis()->GetBinCenter(iy);
333: Double_t fi = fit_ET(&xi,pars+1)*fit_eta(&yi,pars+npar_ET+1);
334: TauTRFtau->Fill(xi,yi,fi);
335: if (a==0) TauTRFjet->Fill(xi,yi,0); else TauTRFjet->Fill(xi,yi,b/a);
336: //if (a!=0) cout<<"b/a :"<<b/a<<endl;
337: //cout<<"fi :"<<fi<<" a: "<<a<<" sa: "<<sa<<endl;
338: //cout<<"xi: "<<xi<<" yi: "<<yi<<endl;
339: sa += a*fi;
340: sb += b;
341: }
342: }
343: Double_t sf = 0;
344: cout << "sb[" << kf << "] = " << sb << endl;
345: cout << "sa[" << kf << "] = " << sa << endl;
346: if (sa>0) sf = (sb/sa);
347: //sf = 9.6;
348: cout << "sf[" << kf << "] = " << sf << endl;
349: fitfun_2d[kf]->SetParameter(0,sf);
350: fitfun_2d[kf]->Write();
351: // construct 2d function for error
352: strcat(f2d_name,"_err");
353: const Int_t npar1 = 1+npar_ET_pm+npar_eta_pm;
354: Double_t pars1[npar1];
355: pars1[0] = sf;
356: fitfun_p[0]->GetParameters(pars1+1);
357: fitfun_p[1]->GetParameters(pars1+npar_ET_pm+1);
358: fitfun_2d_err[kf] = new TF2(f2d_name,sigma_eta_ET,xmin,xmax,ymin,ymax,npar1);
359: fitfun_2d_err[kf]->SetParameters(pars1);
360: TauTRFjet->Write();TauTRFtau->Scale(sf); TauTRFtau->Write();
361: fitfun_2d_err[kf]->Write();
362: }
363: ff_f2d->Close();
364: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>