void test_RooKeys(bool useRooKeys=true, double rho = 10){ using namespace RooFit; Int_t to_gen = 1e5; //1e6; RooRealVar m("m","m",5000,5500); RooRealVar mean("mean", "mean", 5279); RooRealVar cc("cc", "cc", 0.1); RooRealVar pp("pp", "pp", 1.); RooArgusBG* gen_pdf = new RooArgusBG("argus", "argus", m, mean, cc, pp); RooDataSet* ds = (RooDataSet*) gen_pdf->generate(RooArgSet(m), to_gen); // use TKDE std::vector xdata(to_gen); auto h1 = new TH1D("h1","h1",200,5000,5500); for (size_t i = 0; i < xdata.size(); i++) { xdata[i] = ds->get(i)->getRealValue("m"); h1->Fill(xdata[i]); } auto tkde = new TKDE(to_gen, xdata.data(), m.getMin(), m.getMax(),"KernelType:Gaussian;Iteration:Adaptive;Mirror:MirrorLeft;Binning:RelaxedBinning", rho); std::cout << "create tkde" << std::endl; auto f1 = tkde->GetFunction(100); h1->Scale(1/h1->Integral(),"width"); h1->Draw(); f1->Draw("same"); gPad->Update(); ROOT::Math::Functor1D functor([&](double x) { return (*tkde)(x);}); auto kpdf = new RooFunctor1DPdfBinding ("rookeys2", "rookeys2", functor, m); RooAbsPdf * rookeys = nullptr; if (useRooKeys) { cout << "now fitting with RooKeys" << endl; rookeys = new RooKeysPdf("rookeys", "rookeys", m, *ds, RooKeysPdf::MirrorBoth, 0.8); } cout << "validation plot" << endl; RooPlot* myframe=m.frame(Bins(50),Name("M"),Title("M")); ds->plotOn(myframe,MarkerSize(0.9)); kpdf->plotOn(myframe, LineColor(kRed)); if (rookeys) rookeys->plotOn(myframe, LineColor(kBlue)); TCanvas* mycanvas = new TCanvas ("mycanvas","Fit", 800, 550); myframe->Draw(); }