%%cpp -d #include "RooRealVar.h" #include "RooDataSet.h" #include "RooDataHist.h" #include "RooGaussian.h" #include "RooPolyVar.h" #include "RooProdPdf.h" #include "RooPlot.h" #include "TRandom.h" #include "TCanvas.h" #include "TAxis.h" #include "TH1.h" using namespace RooFit; RooDataSet *makeFakeDataXY(); %%cpp -d RooDataSet *makeFakeDataXY() { RooRealVar x("x", "x", -10, 10); RooRealVar y("y", "y", -10, 10); RooArgSet coord(x, y); RooDataSet *d = new RooDataSet("d", "d", RooArgSet(x, y)); for (int i = 0; i < 10000; i++) { double tmpy = gRandom->Gaus(0, 10); double tmpx = gRandom->Gaus(0.5 * tmpy, 1); if (fabs(tmpy) < 10 && fabs(tmpx) < 10) { x.setVal(tmpx); y.setVal(tmpy); d->add(coord); } } return d; } RooRealVar x("x", "x", -10, 10); RooRealVar y("y", "y", -10, 10); RooRealVar a0("a0", "a0", -0.5, -5, 5); RooRealVar a1("a1", "a1", -0.5, -1, 1); RooPolyVar fy("fy", "fy", y, RooArgSet(a0, a1)); RooRealVar sigma("sigma", "width of gaussian", 0.5, 0.1, 2.0); RooGaussian model("model", "Gaussian with shifting mean", x, fy, sigma); RooDataSet *expDataXY = makeFakeDataXY(); std::unique_ptr expAbsDataY{expDataXY->reduce(y)}; RooDataSet *expDataY = static_cast(expAbsDataY.get()); std::unique_ptr data{model.generate(x, ProtoData(*expDataY))}; data->Print(); model.fitTo(*expDataXY, ConditionalObservables(y), PrintLevel(-1)); RooPlot *xframe = x.frame(); expDataXY->plotOn(xframe); model.plotOn(xframe, ProjWData(*expDataY)); std::unique_ptr binnedDataY{expDataY->binnedClone()}; model.plotOn(xframe, ProjWData(*binnedDataY), LineColor(kCyan), LineStyle(kDotted)); ((RooRealVar *)expDataY->get()->find("y"))->setBins(5); std::unique_ptr binnedDataY2{expDataY->binnedClone()}; model.plotOn(xframe, ProjWData(*binnedDataY2), LineColor(kRed)); new TCanvas("rf303_conditional", "rf303_conditional", 600, 460); gPad->SetLeftMargin(0.15); xframe->GetYaxis()->SetTitleOffset(1.2); xframe->Draw(); %jsroot on gROOT->GetListOfCanvases()->Draw()