void draw_data_mgg(TString folderName,bool blind=true,float min=103,float max=160) { TFile inputFile(folderName+"/data.root"); const int nCat = 5; TString cats[5] = {"HighPt","Hbb","Zbb","HighRes","LowRes"}; TCanvas cv; for(int iCat=0; iCat < nCat; iCat++) { RooWorkspace *ws = (RooWorkspace*)inputFile.Get(cats[iCat]+"_mgg_workspace"); RooFitResult* res = (RooFitResult*)ws->obj("fitresult_pdf_data"); RooRealVar * mass = ws->var("mgg"); mass->setRange("all",min,max); mass->setRange("blind",121,130); mass->setRange("low",106,121); mass->setRange("high",130,160); mass->setUnit("GeV"); mass->SetTitle("m_{#gamma#gamma}"); RooAbsPdf * pdf = ws->pdf("pdf"); RooPlot *plot = mass->frame(min,max,max-min); plot->SetTitle(""); RooAbsData* data = ws->data("data")->reduce(Form("mgg > %f && mgg < %f",min,max)); double nTot = data->sumEntries(); if(blind) data = data->reduce("mgg < 121 || mgg>130"); double nBlind = data->sumEntries(); double norm = nTot/nBlind; //normalization for the plot data->plotOn(plot); pdf->plotOn(plot,RooFit::NormRange( "low,high" ),RooFit::Range("Full"),RooFit::LineWidth(0.1) ); plot->Print(); //add the fix error band RooCurve* c = plot->getCurve("pdf_Norm[mgg]_Range[Full]_NormRange[Full]"); const int Nc = c->GetN(); //TGraphErrors errfix(Nc); //TGraphErrors errfix2(Nc); TGraphAsymmErrors errfix(Nc); TGraphAsymmErrors errfix2(Nc); Double_t *x = c->GetX(); Double_t *y = c->GetY(); double NtotalFit = ws->var("Nbkg1")->getVal()*ws->var("Nbkg1")->getVal() + ws->var("Nbkg2")->getVal()*ws->var("Nbkg2")->getVal(); for( int i = 0; i < Nc; i++ ) { errfix.SetPoint(i,x[i],y[i]); errfix2.SetPoint(i,x[i],y[i]); mass->setVal(x[i]); double shapeErr = pdf->getPropagatedError(*res)*NtotalFit; //double totalErr = TMath::Sqrt( shapeErr*shapeErr + y[i] ); //total normalization error double totalErr = TMath::Sqrt( shapeErr*shapeErr + y[i]*y[i]/NtotalFit ); if ( y[i] - totalErr > .0 ) { errfix.SetPointError(i, 0, 0, totalErr, totalErr ); } else { errfix.SetPointError(i, 0, 0, y[i] - 0.01, totalErr ); } //2sigma if ( y[i] - 2.*totalErr > .0 ) { errfix2.SetPointError(i, 0, 0, 2.*totalErr, 2.*totalErr ); } else { errfix2.SetPointError(i, 0, 0, y[i] - 0.01, 2.*totalErr ); } /* std::cout << x[i] << " " << y[i] << " " << " ,pdf get Val: " << pdf->getVal() << " ,pdf get Prop Err: " << pdf->getPropagatedError(*res)*NtotalFit << " stat uncertainty: " << TMath::Sqrt(y[i]) << " Ntot: " << NtotalFit << std::endl; */ } errfix.SetFillColor(kYellow); errfix2.SetFillColor(kGreen); //pdf->plotOn(plot,RooFit::NormRange( "low,high" ),RooFit::FillColor(kGreen),RooFit::Range("Full"), RooFit::VisualizeError(*res,2.0,kFALSE)); //pdf->plotOn(plot,RooFit::NormRange( "low,high" ),RooFit::FillColor(kYellow),RooFit::Range("Full"), RooFit::VisualizeError(*res,1.0,kFALSE)); //pdf->plotOn(plot,RooFit::NormRange( "low,high" ),RooFit::FillColor(kGreen),RooFit::Range("Full"), RooFit::VisualizeError(*res,2.0,kTRUE)); //pdf->plotOn(plot,RooFit::NormRange( "low,high" ),RooFit::FillColor(kYellow),RooFit::Range("Full"), RooFit::VisualizeError(*res,1.0,kTRUE)); plot->addObject(&errfix,"4"); plot->addObject(&errfix2,"4"); plot->addObject(&errfix,"4"); data->plotOn(plot); TBox blindBox(121,plot->GetMinimum()-(plot->GetMaximum()-plot->GetMinimum())*0.015,130,plot->GetMaximum()); blindBox.SetFillColor(kGray); if(blind) { plot->addObject(&blindBox); pdf->plotOn(plot,RooFit::NormRange( "low,high" ),RooFit::FillColor(kGreen),RooFit::Range("Full"), RooFit::VisualizeError(*res,2.0,kTRUE)); pdf->plotOn(plot,RooFit::NormRange( "low,high" ),RooFit::FillColor(kYellow),RooFit::Range("Full"), RooFit::VisualizeError(*res,1.0,kTRUE)); } //plot->addObject(&errfix,"4"); //data->plotOn(plot); //pdf->plotOn(plot,RooFit::Normalization( norm ) ); //pdf->plotOn(plot,RooFit::NormRange( "low,high" ),RooFit::Range("Full"),RooFit::LineWidth(1.5) ); pdf->plotOn(plot,RooFit::NormRange( "low,high" ),RooFit::Range("Full"), RooFit::LineWidth(1)); data->plotOn(plot); /* pdf->plotOn(plot,RooFit::Normalization(norm),RooFit::Range("all"),RooFit::LineWidth(0.8) ); //pdf->plotOn(plot,RooFit::Normalization(norm),RooFit::FillColor(kGreen),RooFit::Range("all"), RooFit::VisualizeError(*res,2.0,kFALSE)); //pdf->plotOn(plot,RooFit::Normalization(norm),RooFit::FillColor(kYellow),RooFit::Range("all"), RooFit::VisualizeError(*res,1.0,kFALSE)); pdf->plotOn(plot,RooFit::Normalization(norm),RooFit::FillColor(kGreen),RooFit::Range("all"), RooFit::VisualizeError(*res,2.0,kTRUE)); pdf->plotOn(plot,RooFit::Normalization(norm),RooFit::FillColor(kYellow),RooFit::Range("all"), RooFit::VisualizeError(*res,1.0,kTRUE)); data->plotOn(plot); pdf->plotOn(plot,RooFit::Normalization(norm),RooFit::Range("all"),RooFit::LineWidth(0.8) ); */ TLatex lbl0(0.1,0.96,"CMS Preliminary"); lbl0.SetNDC(); lbl0.SetTextSize(0.042); plot->addObject(&lbl0); TLatex lbl(0.4,0.96,Form("%s Box",cats[iCat].Data())); lbl.SetNDC(); lbl.SetTextSize(0.042); plot->addObject(&lbl); TLatex lbl2(0.6,0.96,"#sqrt{s}=8 TeV L = 19.78 fb^{-1}"); lbl2.SetNDC(); lbl2.SetTextSize(0.042); plot->addObject(&lbl2); int iObj=-1; TNamed *obj; while( (obj = (TNamed*)plot->getObject(++iObj)) ) { obj->SetName(Form("Object_%d",iObj)); } plot->Draw(); TString tag = (blind ? "_BLIND" : ""); cv.SaveAs(folderName+"/figs/mgg_data_"+cats[iCat]+tag+TString(Form("_%0.0f_%0.0f",min,max))+".png"); cv.SaveAs(folderName+"/figs/mgg_data_"+cats[iCat]+tag+TString(Form("_%0.0f_%0.0f",min,max))+".pdf"); cv.SaveAs(folderName+"/figs/mgg_data_"+cats[iCat]+tag+TString(Form("_%0.0f_%0.0f",min,max))+".C"); } }
void RooFitMacro() { gROOT->Reset(); gSystem->Load("libRooFit"); gROOT->LoadMacro("RooCMSShape.cc+"); //gStyle->SetOptStat(111111); //gROOT->ProcessLine(".x ~/rootlogon.C"); TFile f("TagAndProbeResults_Marco.root"); TH1F * Z_mass = new TH1F("Z","Z" , 200, 0, 200); //TH1D *results = new TH1D("results", "results", 200, 0, 200); //results->Sumw2(); // We need to include NJetCut because there is depedence w.r.t. jet multiplicity Z_mass = (TH1F*)f.Get("Zmass_Inclusive_NoElectronVeto_Numerator;1"); //Z_mass = (TH1F*)f.Get("Zmass_Inclusive_NoElectronVeto_Denominator;1"); //float bincontent = Z_mass->GetBinContent(60); //cout << "60.bin content : " << bincontent << endl; double hmin = 60; double hmax = 120; double r = .25; double sl = 1. / ( 1. - r ); // Declare observable x RooRealVar x("x","x",hmin,hmax) ; RooDataHist dh("dh","dh",x,Import(*Z_mass)) ; // Breit-Wigner Lineshape // Parameters for Breit-Wigner Distribution RooRealVar M("M_{Z^{0}}", "Z0 Resonance Mass", 91.18, 85.0, 95.0, "GeV/c^{2}"); RooRealVar gamma("#Gamma", "#Gamma", 2.4952, 2.0, 3.0, "GeV/c^{2}"); M.setConstant(); //gamma.setConstant(); RooBreitWigner bw("bw", "A Breit-Wigner Distribution", x, M, gamma); // Mass resolution model - Crystal Ball Lineshape // Parameters for Crystal Ball Lineshape RooRealVar M_CB("#Delta m_{0}", "Bias", -2.0, -10.0, 10.0, "GeV/c^{2}"); RooRealVar sigma("#sigma_{CB}", "Width", 1.6, 0.1, 15.0, "GeV/c^{2}"); // RooRealVar sigma("#sigma_{CB}", "Width", 2.5, 0.1, 15.0, "GeV/c^{2}"); RooRealVar alpha("#alpha", "Cut", 1.5, 0.1, 15.0); RooRealVar n("n", "Power", 1.8, 0.5, 5.0); RooCBShape cb("resCBF", "A Crystal Ball Lineshape", x, M_CB, sigma, alpha, n); // background p.d.f RooRealVar cms_alpha("alpha", "alpha", 60, 50, 70); RooRealVar cms_beta("beta", "beta", 0.01, 0.001, 0.05); RooRealVar cms_gamma("gamma", "gamma", 0.05, 0.005, 0.5); RooRealVar peak("peak", "peak", 60, 50, 70); RooCMSShape bag("bag", "RooCMSShape", x, cms_alpha, cms_beta, cms_gamma, peak); RooRealVar frac("frac", "f", 0.01, 0, 1.0); RooFFTConvPdf signal("signal", "Convolution", x, bw, cb); RooRealVar signal_yield("signal_yield", "signal_yield", 100, 0, Z_mass->Integral()); RooRealVar bag_yield("bag_yield", "bag_yield", 0, 0, Z_mass->Integral()); RooArgList shapes; RooArgList yields; shapes.add(signal); shapes.add(bag); yields.add(signal_yield); yields.add(bag_yield); RooRealVar fsig("fsig", "fsig", 0, 0, 1.); //RooAddPdf model("model","model",shapes,yields); // model = fsig x signal + (1-fsig) x bag RooAddPdf model("model","model",shapes,fsig,kTRUE); // Signal p.d.f. //RooFFTConvPdf sum("sum", "Convolution", x, bw, cb); //RooAddPdf sum("sum","sum",bw,cb,frac); //RooAddPdf model("model","model",RooArgList(sum, bag),frac); //RooFFTConvPdf model("model","model",x,sum,bag); //RooFitResult* filters = sum.fitTo(dh,Range(0,200),"qr"); //filters->Print("v"); //RooFitResult* filters = model.fitTo(dh,Range(0,200),"qr"); RooFitResult* filters = model.fitTo(dh, RooFit::Minimizer("Minuit", "migradimproved"), RooFit::NumCPU(4), RooFit::Save(true), RooFit::Extended(false), RooFit::PrintLevel(-1)); //RooFitResult* filters = model.fitTo(dh, RooFit::Extended(true), RooFit::PrintLevel(-1)); //RooFitResult* filters = model.fitTo(dh, "mhe"); //RooFitResult* filters = cb.fitTo(dh,Range(0,200),"qr"); //RooFitResult* filters = bw.fitTo(dh,Range(0,100),"qr"); //RooFitResult* filters = bag.fitTo(dh,"qr"); TCanvas* canvas = new TCanvas("ZmassHisto","ZmassHisto",0, 0, 1000,700) ; canvas->cd() ; //gPad->SetLeftMargin(0.15); //gPad->SetLogy(); RooPlot* frame = x.frame(Title("e #gamma invariant mass fit")) ; dh.plotOn(frame,MarkerSize(0.5),Name("data_hist")); //this will show histogram data points on canvas dh.statOn(frame,Layout(0.15,0.37,0.85),What("N")) ; //dh.statOn(frame); //this will display hist stat on canvas //sum.plotOn(frame,LineColor(4));//this will show fit overlay on canvas //sum.paramOn(frame); //this will display the fit parameters on canvas //bag.plotOn(frame,LineColor(2));//this will show fit overlay on canvas //bag.paramOn(frame); //this will display the fit parameters on canvas model.plotOn(frame,Components(bag),LineColor(2));//this will show fit overlay on canvas model.plotOn(frame,Components(signal),LineColor(3));//this will show fit overlay on canvas model.plotOn(frame,LineColor(kBlue),Name("main_curve"));//this will show fit overlay on canvas // model.paramOn(frame); //this will display the fit parameters on canvas model.paramOn(frame, Layout(0.6, 0.95, 0.92)); //this will display the fit parameters on canvas //model.paramOn(frame, Layout(0.6, 0.99, 0.75)); // model.plotOn(frame,LineColor(4));//this will show fit overlay on canvas // model.paramOn(frame); //this will display the fit parameters on canvas RooHist* histogram = frame->getHist("data_hist"); RooCurve* curve = frame->getCurve("main_curve"); TH1D* hresidual = residualHist(histogram,curve); hresidual->Sumw2(); canvas->Divide( 1, 2, .1, .1 ); TPad* padHisto = (TPad*) canvas->cd(1); TPad* padResid = (TPad*) canvas->cd(2); double small = 0.1; padHisto->SetPad( 0., r , 1., 1. ); padHisto->SetBottomMargin( small ); padResid->SetPad( 0., 0., 1., r ); padResid->SetBottomMargin( 0.3 ); padResid->SetTopMargin ( small ); padHisto->cd(); //float fitvalue = frame.GetX()[60]; //Double_t nX = x.getVal(); //cout << "nX : " << nX << endl; //results->SetBinContent(results->GetXaxis()->FindBin(60), nX); //float fitvalue = results->GetBinContent(59); //cout << "59.5daki fit value : " << fitvalue << endl; //cb.plotOn(frame,LineColor(2));//this will show fit overlay on canvas //cb.paramOn(frame); //this will display the fit parameters on canvas //bw.plotOn(frame,LineColor(4));//this will show fit overlay on canvas //bw.paramOn(frame); //this will display the fit parameters on canvas //gPad->SetLogy(); cout << "chisquare : " << frame->chiSquare() << endl ; //cout << "Total Number of events: " << Z_mass->Integral() << endl; //cout << "Number of signal events: " << fsig.getVal() * Z_mass->Integral() << endl; //cout << "Number of background events: " << (1 - fsig.getVal()) * Z_mass->Integral() << endl; //Draw all frames on a canvas //TPaveLabel *label1 = new TPaveLabel(1,500,15,700,"Chisquare:"); frame->GetXaxis()->SetTitle("Invariant mass w/ NoElectronVeto photon (in GeV/c^{2})"); //frame->GetXaxis()->SetTitle("Invariant mass w/ TIGHT photon (in GeV/c^{2})"); //frame->GetXaxis()->SetTitleOffset(1.2); frame->Draw(); //float binsize = Z_mass->GetBinWidth(1); //char Bsize[50]; //sprintf(Bsize,"Events per %2.2f",binsize); //frame->GetYaxis()->SetTitle(Bsize); //frame->GetYaxis()->SetTitleOffset(1.2); //results->Sumw2(); padResid->cd(); hresidual->Draw(); Lines( hresidual ); hresidual->Draw( "SAME" ); //frame->Draw(); //results->Draw(); //canvas->Update(); //title->Draw("same"); //hresidual->Draw(); canvas->SaveAs("pdf_TagAndProbe/ResidualNumerator_binned_negligible_errorfit.pdf"); //canvas->SaveAs("pdf_TagAndProbe/ResidualDenominator_binned_negligible_errorfit.pdf"); }