%%cpp -d #include "RooRealVar.h" #include "RooDataSet.h" #include "RooGaussian.h" #include "RooChebychev.h" #include "RooAddPdf.h" #include "RooExtendPdf.h" #include "RooFitResult.h" #include "TCanvas.h" #include "TAxis.h" #include "RooPlot.h" using namespace RooFit ; RooRealVar x("x","x",0,11) ; RooRealVar mean("mean","mean of gaussians",5) ; RooRealVar sigma1("sigma1","width of gaussians",0.5) ; RooRealVar sigma2("sigma2","width of gaussians",1) ; RooGaussian sig1("sig1","Signal component 1",x,mean,sigma1) ; RooGaussian sig2("sig2","Signal component 2",x,mean,sigma2) ; RooRealVar a0("a0","a0",0.5,0.,1.) ; RooRealVar a1("a1","a1",0.2,0.,1.) ; RooChebychev bkg("bkg","Background",x,RooArgSet(a0,a1)) ; RooRealVar sig1frac("sig1frac","fraction of component 1 in signal",0.8,0.,1.) ; RooAddPdf sig("sig","Signal",RooArgList(sig1,sig2),sig1frac) ; x.setRange("signalRange",4,6) ; RooRealVar nsig("nsig","number of signal events in signalRange",500,0.,10000) ; RooRealVar nbkg("nbkg","number of background events in signalRange",500,0,10000) ; RooAddPdf model("model","(g1+g2)+a", RooArgList(bkg,sig), RooArgList(nbkg,nsig)) ; std::unique_ptr data{model.generate(x,1000)}; auto canv = new TCanvas("Canvas", "Canvas", 1500, 600); canv->Divide(3,1); canv->cd(1); RooAddPdf model1(model); std::unique_ptr r{model1.fitTo(*data,Save(), PrintLevel(-1))}; r->Print() ; RooPlot * frame = x.frame(Title("Full range fitted")); data->plotOn(frame); model1.plotOn(frame, VisualizeError(*r)); model1.plotOn(frame); model1.paramOn(frame); frame->Draw(); canv->cd(2); x.setRange("left", 0., 4.); x.setRange("right", 6., 10.); RooAddPdf model2(model); std::unique_ptr r2{model2.fitTo(*data, Range("left,right"), Save(), PrintLevel(-1))}; r2->Print(); RooPlot * frame2 = x.frame(Title("Fit in left/right sideband")); data->plotOn(frame2); model2.plotOn(frame2, VisualizeError(*r2)); model2.plotOn(frame2); model2.paramOn(frame2); frame2->Draw(); canv->cd(3); x.setRange("leftToMiddle", 0., 5.); RooAddPdf model3(model); std::unique_ptr r3{model3.fitTo(*data, Range("leftToMiddle"), Save(), PrintLevel(-1))}; r3->Print(); RooPlot * frame3 = x.frame(Title("Fit from left to middle")); data->plotOn(frame3); model3.plotOn(frame3, VisualizeError(*r3)); model3.plotOn(frame3); model3.paramOn(frame3); frame3->Draw(); canv->Draw(); %jsroot on gROOT->GetListOfCanvases()->Draw()