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>