using namespace RooFit ; void ex8() { // A likelihood fit for efficiency RooWorkspace w("w",kTRUE) ; // Given an efficiency function w.factory("expr::effFunc('offset+0.5*emax*(1+TMath::Erf((x-mean)/sigma))',x[0,100],offset[0.02,0,1],emax[0.78,0,1],mean[60,0,100],sigma[20,1,100])") ; w.var("x")->setBins(20) ; // Generate a mock data set (also needs a choice of distribution in x Int_t N(1000) ; w.factory("cut[reject,accept]") ; w.factory("Exponential::shape(x,-0.01)") ; w.factory("EffProd::genacc(shape,effFunc)") ; w.factory("EffProd::genrej(shape,expr('1-@0',effFunc))") ; RooDataSet* data_acc = w.pdf("genacc")->generate(*w.var("x"), N*0.256) ; RooDataSet* data_rej = w.pdf("genrej")->generate(*w.var("x"), N*0.744) ; // Make a 1D histogram of efficiency TH1* hacc = data_acc->createHistogram("x",20) ; TH1* htot = data_rej->createHistogram("x",20) ; htot->Add(hacc) ; hacc->Divide(hacc,htot,1,1,"B") ; // Draw efficiency histogram TCanvas* c = new TCanvas("c","c",900,300) ; c->Divide(3) ; c->cd(1) ; // Chi^2 fit of efficiency function to histogram with symmetric Binomial errors TF1* fitfunc = new TF1("fitfunc","[0]+[1]*0.5*(1+TMath::Erf((x-[2])/[3]))",0,100) ; fitfunc->SetParameters(0.05,0.78,60,20) ; hacc->Fit(fitfunc) ; // BLOCK 1 // // Likelihood fit for efficiency // // Make a 2D unbinned dataset (x,cut) ; // RooDataSet data("data","data",*w.var("x"),Index(*w.cat("cut")),Import("accept",*data_acc),Import("reject",*data_rej)) ; // RooPlot* frame2 = w.var("x")->frame() ; // data->plotOn(frame2) ; // data->plotOn(frame2,Cut("cut==cut::accept"),MarkerColor(kRed),LineColor(kRed)) ; // // // Make unbinned ML fit of efficiency to 2D dataset // w.factory("Efficiency::fitmodel(effFunc,cut,'accept')") ; // RooFitResult* r = w.pdf("fitmodel")->fitTo(data,ConditionalObservables(*w.var("x")),Save()) ; // // // Make corresponding plot // RooPlot* frame3 = w.var("x")->frame() ; // data->plotOn(frame3,Efficiency(*w.cat("cut"))) ; // w.function("effFunc")->plotOn(frame3,LineColor(kRed)) ; // w.function("effFunc")->plotOn(frame3,LineColor(kRed),VisualizeError(*r),FillColor(kOrange),MoveToBack()) ; // // c->cd(2) ; frame2->Draw() ; // c->cd(3) ; frame3->Draw() ; }