%%cpp -d #include "RooRealVar.h" #include "RooDataSet.h" #include "RooGaussian.h" #include "RooConstVar.h" #include "RooFormulaVar.h" #include "RooProdPdf.h" #include "RooEfficiency.h" #include "RooPolynomial.h" #include "RooCategory.h" #include "TCanvas.h" #include "TAxis.h" #include "RooPlot.h" using namespace RooFit; RooRealVar x("x", "x", -10, 10); RooRealVar a("a", "a", 0.4, 0, 1); RooRealVar b("b", "b", 5); RooRealVar c("c", "c", -1, -10, 10); RooFormulaVar effFunc("effFunc", "(1-a)+a*cos((x-c)/b)", RooArgList(a, b, c, x)); RooCategory cut("cut", "cutr", { {"accept", 1}, {"reject", 0} }); RooEfficiency effPdf("effPdf", "effPdf", effFunc, cut, "accept"); RooPolynomial shapePdf("shapePdf", "shapePdf", x, RooConst(-0.095)); RooProdPdf model("model", "model", shapePdf, Conditional(effPdf, cut)); std::unique_ptr data{model.generate({x, cut}, 10000)}; effPdf.fitTo(*data, ConditionalObservables(x), PrintLevel(-1)); RooPlot *frame1 = x.frame(Bins(20), Title("Data (all, accepted)")); data->plotOn(frame1); data->plotOn(frame1, Cut("cut==cut::accept"), MarkerColor(kRed), LineColor(kRed)); RooPlot *frame2 = x.frame(Bins(20), Title("Fitted efficiency")); data->plotOn(frame2, Efficiency(cut)); // needs ROOT version >= 5.21 effFunc.plotOn(frame2, LineColor(kRed)); TCanvas *ca = new TCanvas("rf701_efficiency", "rf701_efficiency", 800, 400); ca->Divide(2); ca->cd(1); gPad->SetLeftMargin(0.15); frame1->GetYaxis()->SetTitleOffset(1.6); frame1->Draw(); ca->cd(2); gPad->SetLeftMargin(0.15); frame2->GetYaxis()->SetTitleOffset(1.4); frame2->Draw(); %jsroot on gROOT->GetListOfCanvases()->Draw()