/* double residual_error( double error_data, double pdf ) { double chi2 = 0.; if ( pdf > 0 ) chi2 += 2. * ( pdf - error_data ); if ( error_data > 0 && pdf > 0 ) chi2=(error_data/pdf); //chi2 += 2. * error_data * log( error_data / error_pdf ); // return ( ( error_data >= pdf ) ? sqrt( chi2 ) : -sqrt( chi2 ) ); // return ( ( error_data >= pdf ) ? chi2 : chi2 ); return ( chi2 ); } */ TH1D* residualHist( const RooHist* rhist, const RooCurve* curve ) { double r = 0.2; double sr = 1. / r; // Grab info from the histogram. int n = rhist->GetN(); double* x = rhist->GetX(); double* y = rhist->GetY(); //rhist->Sumw2(); // double e; // Create residual histogram. double xMin = x[ 0 ]; double xMax = x[ n - 1 ]; TH1D* residuals_temp = new TH1D( "r", "", n, xMin, xMax ); double datum = 0.; double pdf = 0.; double error_data = 0.; // Fill the histogram. if ( curve ) for ( int bin = 0; bin < n; bin++ ) { datum = y[ bin ]; pdf = curve->Eval( x[ bin ] ); error_data = rhist->GetErrorY(bin); // error_pdf = curve->Eval( x[ bin ] ); residuals_temp->SetBinContent( bin + 1, residual( datum, pdf ) ); // residuals_temp->SetBinError ( bin + 1, residual_error( error_data, pdf ) ); residuals_temp->SetBinError ( bin + 1, error_data / pdf ); } residuals_temp->SetMinimum ( -2. ); residuals_temp->SetMaximum ( 2. ); residuals_temp->SetStats ( false ); residuals_temp->SetMarkerStyle( 8 ); residuals_temp->SetMarkerSize ( .8 ); TAxis* xAxis = residuals_temp->GetXaxis(); xAxis->SetTickLength ( sr * xAxis->GetTickLength() ); xAxis->SetLabelSize ( sr * xAxis->GetLabelSize() ); xAxis->SetTitleSize ( sr * xAxis->GetTitleSize() ); xAxis->SetLabelOffset( sr * xAxis->GetLabelOffset() ); TAxis* yAxis = residuals_temp->GetYaxis(); //yAxis->SetNdivisions ( 500 ); //yAxis->SetLabelSize ( 10*sr * yAxis->GetLabelSize() ); yAxis->SetLabelSize ( 2.5 * yAxis->GetLabelSize() ); yAxis->SetTitle(" (DATA - FIT) / FIT"); yAxis->SetTitleSize ( 0.09 ); yAxis->SetTitleOffset( 0.35 ); return residuals_temp; }
void plot_Comb(void) { gROOT->ProcessLine(".L ../tools/plottools.C"); gStyle->SetPadGridX(kFALSE); gStyle->SetPadGridY(kFALSE); //SET UP FINE THEORY ifstream in_xsec_massNNLO4("../style/DY/root/Plain/NNLO/8TeV_CTEQ12NNLO_41.txt",ios::in); const int nbins4 = 339+179+25; double mass_xbin4[nbins4] = {0.}; double initial = 14.0; for( int i = 0; i < nbins4; i++ ) { if( i >= 0 && i < 11 ) { initial += 1.0; } else if( i >= 11 && i < 18 ) { initial += 5.0; } else if( i >= 18 && i < 118 ) { initial += 1.0; } else if( i >= 118 && i < 338 ) { initial += 2.0; } else if (i >= 338 && i < 542-24) { initial += 5.0; } else { initial += 20.0; } mass_xbin4[i] = initial; } TH1D* h_theory4 = new TH1D("xsec4_NNLO","xsec4_NNLO",nbins4-1,mass_xbin4); TH1D* h_theory4_band = new TH1D("xsec4_bandNNLO","xsec4_bandNNLO",nbins4-1,mass_xbin4); double xsec_mass4[nbins4-1]; double xsec_err_mass4[nbins4-1]; for( int i = 0; i < nbins4-1; i++ ) { double dm_ = mass_xbin4[i+1]-mass_xbin4[i]; //NNLO in_xsec_massNNLO4 >> xsec_mass4[i] >> xsec_err_mass4[i] ; //FIXME fix the kink at high mass, artificially xsec_mass4[i] *= weightProducer(mass_xbin4[i+1]); double peak = 1137.2; if (IS_RSHAPE) { h_theory4_band->SetBinContent(i+1,xsec_mass4[i]/dm_/peak); //controls error band h_theory4_band->SetBinError(i+1,0.1*h_theory4_band->GetBinContent(i+1));///peak); h_theory4->SetBinContent(i+1,xsec_mass4[i]/dm_/peak); h_theory4->SetBinError(i+1,0.0);//sqrt(pow(xsec_mass4[i]*10./peak_val_theory/peak_val_theory,2))); } else { h_theory4_band->SetBinContent(i+1,xsec_mass4[i]/dm_); h_theory4_band->SetBinError(i+1,0.1*h_theory4_band->GetBinContent(i+1)); h_theory4->SetBinContent(i+1,xsec_mass4[i]/dm_); h_theory4->SetBinError(i+1,0.0);//sqrt(pow(xsec_mass4[i]*10./peak_val_theory/peak_val_theory,2))); } } average(h_theory4_band); average(h_theory4); //ACCESS VALUES TFile* f; if (IS_7TEV) f = new TFile("../Inputs/Theory/1Dabsxsec_NNLO_CTEQ12NNLO_7TeV.root"); else f = new TFile("../Inputs/Theory/1Dabsxsec_NNLO_CTEQ12NNLO"+has41+".root"); f->cd(); TH1D* theory = (TH1D*)gDirectory->Get("invm_FEWZ"+has41); double peak_th = theory->Integral(10,22); for (int i = 0; i < 41; i++) { theory->SetBinContent(i+1,theory->GetBinContent(i+1)/theory->GetBinWidth(i+1)); } TH1D* rshape_theory = (TH1D*)theory->Clone(); for (int i = 0; i < 41; i++) { rshape_theory->SetBinContent(i+1,theory->GetBinContent(i+1)/peak_th); rshape_theory->SetBinError(i+1,theory->GetBinError(i+1)/peak_th); } if (IS_RSHAPE) theory = rshape_theory; TFile* g; if (!IS_RSHAPE) { if (IS_7TEV) g = new TFile("/group/cms/users/asvyatko/CMSSW_4_2_8/src/DYPackage/Outputs/absex_full2011.root"); else g = new TFile("../Outputs/absex_full_comb_PI_Bayesian.root"); } else { if (IS_7TEV) g = new TFile("/group/cms/users/asvyatko/CMSSW_4_2_8/src/DYPackage/Outputs/rshape_full_mumuCurrentMarch.root"); else g = new TFile("../Outputs/absex_full_comb_PI_Bayesian.root"); } g->cd(); TH1D* data = (TH1D*)hxsec->Clone(); double peak = 0; double peak_err = 0.01; //1% approx, for the plot only for (int i = 9; i < 22; i++) { peak += data->GetBinContent(i+1)*data->GetBinWidth(i+1); } cout << "Peak comb data: " << peak<< endl; TH1D* rshape_data = (TH1D*)hxsec->Clone(); for (int i = 0; i < 41; i++) { //Note: it is already pre-divided by the bin width rshape_data->SetBinContent(i+1,data->GetBinContent(i+1)/peak); rshape_data->SetBinError(i+1,sqrt(pow(data->GetBinError(i+1)/peak,2)+pow(peak_err*rshape_data->GetBinContent(i+1),2))); } if (IS_RSHAPE && !IS_7TEV) data = rshape_data; TGraphAsymmErrors* gdata = new TGraphAsymmErrors(nbin-1); for( size_t ii=0; ii<nbin; ii++ ) { double x_ = fake_par[ii]; double y_ = data->GetBinContent(ii+1); double exl_ = fake_par[ii]-mass_xbin[ii]; double exh_ = mass_xbin[ii+1]-fake_par[ii]; double eyl_ = data->GetBinError(ii+1); double eyh_ = eyl_; gdata->SetPoint(ii,x_,y_); gdata->SetPointError(ii,exl_,exh_,eyl_,eyh_); } //FIXME need ratio plots TCanvas *c1 = new TCanvas("CrossSect1D","CrossSect1D",600,600); c1->Draw(); c1->cd(); TPad *p1 = new TPad("p1", "",0.0,0.25,1.0,0.98,0,0,0); p1->Draw(); p1->cd(); //p1->SetTickx(kFALSE); //TAxis *xaxis = h_theory4->GetXaxis(); //xaxis->SetMoreLogLabels(); //xaxis->SetNoExponent(); TAxis *axis = h_theory4->GetYaxis(); axis->SetTickLength(axis->GetTickLength()/1.35); //axis->SetNdivisions(506); p1->SetRightMargin(0.055); p1->SetBottomMargin(0.01); p1->SetTopMargin(0.1); p1->SetLogy(); p1->SetLogx(); h_theory4->GetXaxis()->SetMoreLogLabels(); if (IS_RSHAPE) h_theory4->GetYaxis()->SetTitle("1/#sigma_{Z}d#sigma/dm [GeV^{-1}]"); else h_theory4->GetYaxis()->SetTitle("d#sigma/dm [pb/GeV]"); h_theory4->GetXaxis()->SetTitle("m_{#mu#mu} [GeV]"); h_theory4->SetLineColor(kBlue); h_theory4->SetLineWidth(0.1); h_theory4->SetMarkerSize(0); //h_theory4->SetMaximum(h_theory4->GetMaximum()*100.); h_theory4->GetYaxis()->SetRangeUser(h_theory4->GetMinimum()/10.,h_theory4->GetMaximum()*10.); h_theory4->SetMinimum(1.5*10E-9); h_theory4->Draw("L"); TH1D* h_theory4_clone = (TH1D*)h_theory4->Clone(); h_theory4_clone->SetLineWidth(1.5); //h_theory4_clone->GetXaxis()->SetRangeUser(40,180); h_theory4_clone->Draw("Lsame"); h_theory4_band->SetLineColor(kBlue); h_theory4_band->SetLineWidth(3); h_theory4_band->SetMarkerSize(0); h_theory4_band->SetFillColor(kBlue); h_theory4_band->Draw("E3same"); //data->Draw("Psame"); gdata->SetMarkerStyle(20); gdata->SetMarkerSize(0.7); gdata->Draw("Psame"); double yminl_ = h_theory4->GetMinimum(); double ymaxl_ = h_theory4->GetMaximum(); //draw_bin_grid2( yminl_, 1.7*yminl_ ); //draw_bin_grid( yminl_, 1.2*yminl_ ); //draw_bin_grid2( ymaxl_/1.7, ymaxl_ ); //draw_bin_grid( ymaxl_/1.2, ymaxl_ ); // text2 size_t ntxt = 3; TString txt[3]; float txtSize[3]; float txtX[3]; float txtY[3]; int txtAlign[3]; int txtFont[3]; txt[0] = "CMS"; // Preliminary"; txtSize[0] = 0.072; txtX[0] = 0.27; txtY[0] = 0.82; txtAlign[0] = 21; txtFont[0] = 61; //txt[1] = "19.7 fb^{-1} at #sqrt{s} = 8 TeV"; txt[1] = "19.7 fb^{-1} ee and #mu#mu (8 TeV)"; txtSize[1] = 0.042; txtX[1] = 0.79; txtY[1] = 0.91; txtAlign[1] = 21; txtFont[1] = 42; txt[2] = "#gamma*/Z #rightarrow e^{+}e^{-}, #mu^{+}#mu^{-}"; //txt[2] = "#gamma*/Z #rightarrow #font[11]{l#lower[-0.72]{^{#font[122]{+}}}l^{#font[122]{-}}}"); txtSize[2] = 0.05; txtX[2] = 0.80; txtY[2] = 0.82; txtAlign[2] = 21; txtFont[2] = 42; TLatex latex; latex.SetNDC(); for( size_t ii=0; ii<ntxt; ii++ ) { latex.SetTextFont(txtFont[ii]); latex.SetTextSize(txtSize[ii]); latex.SetTextAlign(txtAlign[ii]); latex.DrawLatex(txtX[ii],txtY[ii],txt[ii]); } TLegend *leg= new TLegend(0.21,0.10,0.51,0.30); leg->SetTextFont(42); leg->SetTextSize(0.055); //leg->SetTextAlign(31); leg->SetBorderSize(0); leg->SetFillColor(0); leg->AddEntry(gdata,"data","lp"); leg->AddEntry(h_theory4_band,"FEWZ, NNLO CT10","f"); leg->Draw("same"); TH1D* ratio = (TH1D*)theory->Clone(); ratio->Divide(data,theory); //cout << "XX " << ratio->GetNbinsX() << " " << theory->GetNbinsX() << endl; //for (int i = 0; i < ratio->GetNbinsX(); i++) { // cout << i+1 << ratio->GetBinContent(i+1) << endl; //} //ratio should be a graph TGraphAsymmErrors* gratio = new TGraphAsymmErrors(nbin-1); for( size_t ii=0; ii<nbin; ii++ ) { double x_ = fake_par[ii]; double y_ = ratio->GetBinContent(ii+1); double exl_ = fake_par[ii]-mass_xbin[ii]; double exh_ = mass_xbin[ii+1]-fake_par[ii]; double eyl_ = ratio->GetBinError(ii+1); double eyh_ = eyl_; gratio->SetPoint(ii,x_,y_); gratio->SetPointError(ii,exl_,exh_,eyl_,eyh_); } gStyle->SetOptTitle(0); TPad *p2 = new TPad("p2", "",0.0,0.01,1.0,0.249,0,0,0); c1->cd(); p2->Draw(); p2->cd(); p2->SetLogx(); p2->SetTopMargin(0.007); p2->SetBottomMargin(0.32); p2->SetRightMargin(0.055); //p2->SetTickx(kFALSE); TAxis* ay_ = ratio->GetYaxis(); //ax_->SetNdivisions(0); //ax_->SetTitleOffset(1.15); //ax_->SetLabelOffset(99); //ay_->SetTitle(ytitle); // ay_->CenterTitle(); ay_->SetNdivisions(506); //506); ay_->SetLabelOffset(0.019); ratio->GetYaxis()->SetTitle("Data/theory"); ratio->GetXaxis()->SetTitle("m [GeV]"); ratio->SetStats(kFALSE); ratio->GetYaxis()->SetTitleOffset(0.41); ratio->GetXaxis()->SetMoreLogLabels(); ratio->GetYaxis()->SetTitleSize(0.15); ratio->GetXaxis()->SetTitleSize(0.155); ratio->GetYaxis()->SetLabelSize(0.15); ratio->GetXaxis()->SetLabelSize(0);//0.15); ratio->GetXaxis()->SetTickLength(0.08); ratio->GetXaxis()->SetNoExponent(kTRUE); ratio->SetMarkerSize(0); ratio->SetMaximum(1.7); //1.48); //1.75); //1.52); ratio->SetMinimum(0.3); ////0.52); //0.25);//0.4); ratio->SetLineColor(kBlack); ratio->Draw("hist"); //draw_bin_grid(ratio->GetMinimum(),ratio->GetMaximum()); yminl_ = ratio->GetMinimum(); ymaxl_ = ratio->GetMaximum(); //draw_bin_grid2( yminl_, 1.5*yminl_ ); //draw_bin_grid( yminl_, 1.2*yminl_ ); //draw_bin_grid2( ymaxl_/1.07, ymaxl_ ); //draw_bin_grid( ymaxl_/1.03, ymaxl_ ); float r0_ = 1.; float dr_ = 0.75; //draw_axis_labels(r0_-1.09*dr_,0.15); draw_axis_labels(r0_-1.0*dr_,0.15); gratio->SetMarkerColor(kViolet); gratio->SetMarkerSize(0.9); gratio->SetLineColor(kBlack); gratio->SetMarkerStyle(20); gratio->Draw("epsame"); p2->Update(); TLine *line=new TLine(); line->SetLineColor(kBlue); line->SetLineWidth(2); line->DrawLine(15,1,2000,1); //c1->SaveAs(etaclass+run+".pdf"); //_DR53X_HCP2012.png"); double chisquared = 0.; for (int i =0; i < data->GetNbinsX(); i++) { chisquared+=pow((data->GetBinContent(i+1)-theory->GetBinContent(i+1)),2)/(data->GetBinError(i+1)*data->GetBinError(i+1)); //std::cout << data->GetBinError(i+1) << " " << theory->GetBinError(i+1) << std::endl; //chisquared+=(ee8->GetBinContent(i+1)-mumu8->GetBinContent(i+1))/sqrt(ee8->GetBinError(i+1)*mumu8->GetBinError(i+1)); } cout << "Full chi2 " << chisquared/double(data->GetNbinsX()) << " " << TMath::Prob(chisquared,data->GetNbinsX())<< endl; }