Multidimensional models: full pdf with per-event errors
Author: Wouter Verkerke
This notebook tutorial was automatically generated with ROOTBOOK-izer from the macro found in the ROOT repository on Tuesday, March 19, 2024 at 07:15 PM.
%%cpp -d
#include "RooRealVar.h"
#include "RooDataSet.h"
#include "RooGaussian.h"
#include "RooGaussModel.h"
#include "RooDecay.h"
#include "RooLandau.h"
#include "RooProdPdf.h"
#include "RooHistPdf.h"
#include "RooPlot.h"
#include "TCanvas.h"
#include "TAxis.h"
#include "TH1.h"
using namespace RooFit;
Observables
RooRealVar dt("dt", "dt", -10, 10);
RooRealVar dterr("dterr", "per-event error on dt", 0.01, 10);
Build a gaussian resolution model scaled by the per-event error = gauss(dt,bias,sigma*dterr)
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);
Construct decay(dt) (x) gauss1(dt|dterr)
RooRealVar tau("tau", "tau", 1.548);
RooDecay decay_gm("decay_gm", "decay", dt, tau, gm, RooDecay::DoubleSided);
Use landau pdf to get empirical distribution with long tail
RooLandau pdfDtErr("pdfDtErr", "pdfDtErr", dterr, 1.0, 0.25);
std::unique_ptr<RooDataSet> expDataDterr{pdfDtErr.generate(dterr, 10000)};
Construct a histogram pdf to describe the shape of the dtErr distribution
std::unique_ptr<RooDataHist> expHistDterr{expDataDterr->binnedClone()};
RooHistPdf pdfErr("pdfErr", "pdfErr", dterr, *expHistDterr);
Construct conditional product decay_dm(dt|dterr)*pdf(dter r )
Construct production of conditional decay_dm(dt|dterr) with empirical pdfErr(dterr)
RooProdPdf model("model", "model", pdfErr, Conditional(decay_gm, dt));
(Alternatively you could also use the landau shape pdfDtErr) RooProdPdf model("model","model",pdfDtErr,Conditional(decay_gm,dt)) ;
Specify external dataset with dterr values to use model_dm as conditional pdf
std::unique_ptr<RooDataSet> data{model.generate({dt, dterr}, 10000)};
input_line_57:2:2: warning: 'data' shadows a declaration with the same name in the 'std' namespace; use '::data' to reference this declaration std::unique_ptr<RooDataSet> data{model.generate({dt, dterr}, 10000)}; ^
Specify dterr as conditional observable
model.fitTo(*data, PrintLevel(-1));
input_line_61:2:15: error: reference to 'data' is ambiguous model.fitTo(*data, PrintLevel(-1)); ^ input_line_57:2:30: note: candidate found by name lookup is 'data' std::unique_ptr<RooDataSet> data{model.generate({dt, dterr}, 10000)}; ^ /usr/include/c++/9/bits/range_access.h:318:5: note: candidate found by name lookup is 'std::data' data(initializer_list<_Tp> __il) noexcept ^ /usr/include/c++/9/bits/range_access.h:289:5: note: candidate found by name lookup is 'std::data' data(_Container& __cont) noexcept(noexcept(__cont.data())) ^ /usr/include/c++/9/bits/range_access.h:299:5: note: candidate found by name lookup is 'std::data' data(const _Container& __cont) noexcept(noexcept(__cont.data())) ^ /usr/include/c++/9/bits/range_access.h:309:5: note: candidate found by name lookup is 'std::data' data(_Tp (&__array)[_Nm]) noexcept ^
Make two-dimensional plot of conditional pdf in (dt,dterr)
TH1 *hh_model = model.createHistogram("hh_model", dt, Binning(50), YVar(dterr, Binning(50)));
hh_model->SetLineColor(kBlue);
Make projection of data an dt
RooPlot *frame = dt.frame(Title("Projection of model(dt|dterr) on dt"));
data->plotOn(frame);
model.plotOn(frame);
input_line_63:3:1: error: reference to 'data' is ambiguous data->plotOn(frame); ^ input_line_57:2:30: note: candidate found by name lookup is 'data' std::unique_ptr<RooDataSet> data{model.generate({dt, dterr}, 10000)}; ^ /usr/include/c++/9/bits/range_access.h:318:5: note: candidate found by name lookup is 'std::data' data(initializer_list<_Tp> __il) noexcept ^ /usr/include/c++/9/bits/range_access.h:289:5: note: candidate found by name lookup is 'std::data' data(_Container& __cont) noexcept(noexcept(__cont.data())) ^ /usr/include/c++/9/bits/range_access.h:299:5: note: candidate found by name lookup is 'std::data' data(const _Container& __cont) noexcept(noexcept(__cont.data())) ^ /usr/include/c++/9/bits/range_access.h:309:5: note: candidate found by name lookup is 'std::data' data(_Tp (&__array)[_Nm]) noexcept ^
Draw all frames on canvas
TCanvas *c = new TCanvas("rf307_fullpereventerrors", "rf307_fullperventerrors", 800, 400);
c->Divide(2);
c->cd(1);
gPad->SetLeftMargin(0.20);
hh_model->GetZaxis()->SetTitleOffset(2.5);
hh_model->Draw("surf");
c->cd(2);
gPad->SetLeftMargin(0.15);
frame->GetYaxis()->SetTitleOffset(1.6);
frame->Draw();
input_line_65:2:3: error: use of undeclared identifier 'frame' (frame->GetYaxis()->SetTitleOffset(1.6000000000000001)) ^ Error in <HandleInterpreterException>: Error evaluating expression (frame->GetYaxis()->SetTitleOffset(1.6000000000000001)) Execution of your code was aborted.
Draw all canvases
gROOT->GetListOfCanvases()->Draw()