%%cpp -d #include "RooRealVar.h" #include "RooDataSet.h" #include "RooGaussian.h" #include "RooGaussModel.h" #include "RooDecay.h" #include "RooLandau.h" #include "RooPlot.h" #include "TCanvas.h" #include "TAxis.h" #include "TH1.h" using namespace RooFit; RooRealVar dt("dt", "dt", -10, 10); RooRealVar dterr("dterr", "per-event error on dt", 0.01, 10); RooRealVar bias("bias", "bias", 0, -10, 10); RooRealVar sigma("sigma", "per-event error scale factor", 1, 0.1, 10); RooGaussModel gm("gm1", "gauss model scaled bt per-event error", dt, bias, sigma, dterr); RooRealVar tau("tau", "tau", 1.548); RooDecay decay_gm("decay_gm", "decay", dt, tau, gm, RooDecay::DoubleSided); RooLandau pdfDtErr("pdfDtErr", "pdfDtErr", dterr, 1.0, 0.25); std::unique_ptr expDataDterr{pdfDtErr.generate(dterr, 10000)}; std::unique_ptr data{decay_gm.generate(dt, ProtoData(*expDataDterr))}; decay_gm.fitTo(*data, ConditionalObservables(dterr), PrintLevel(-1)); TH1 *hh_decay = decay_gm.createHistogram("hh_decay", dt, Binning(50), YVar(dterr, Binning(50))); hh_decay->SetLineColor(kBlue); RooPlot *frame = dt.frame(Title("Slices of decay(dt|dterr) at various dterr")); for (Int_t ibin = 0; ibin < 100; ibin += 20) { dterr.setBin(ibin); decay_gm.plotOn(frame, Normalization(5.)); } RooPlot *frame2 = dt.frame(Title("Projection of decay(dt|dterr) on dt")); data->plotOn(frame2); decay_gm.plotOn(frame2, ProjWData(*expDataDterr, true)); TCanvas *c = new TCanvas("rf306_condpereventerrors", "rf306_condperventerrors", 1200, 400); c->Divide(3); c->cd(1); gPad->SetLeftMargin(0.20); hh_decay->GetZaxis()->SetTitleOffset(2.5); hh_decay->Draw("surf"); c->cd(2); gPad->SetLeftMargin(0.15); frame->GetYaxis()->SetTitleOffset(1.6); frame->Draw(); c->cd(3); gPad->SetLeftMargin(0.15); frame2->GetYaxis()->SetTitleOffset(1.6); frame2->Draw(); gROOT->GetListOfCanvases()->Draw()