rf307_fullpereventerrors

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 Sunday, November 27, 2022 at 11:07 AM.

In [1]:
%%cpp -d
#include "RooRealVar.h"
#include "RooDataSet.h"
#include "RooGaussian.h"
#include "RooGaussModel.h"
#include "RooConstVar.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;

B-physics pdf with per-event Gaussian resolution

Observables

In [2]:
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)

In [3]:
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)

In [4]:
RooRealVar tau("tau", "tau", 1.548);
RooDecay decay_gm("decay_gm", "decay", dt, tau, gm, RooDecay::DoubleSided);

Construct empirical pdf for per-event error

Use landau pdf to get empirical distribution with long tail

In [5]:
RooLandau pdfDtErr("pdfDtErr", "pdfDtErr", dterr, RooConst(1), RooConst(0.25));
RooDataSet *expDataDterr = pdfDtErr.generate(dterr, 10000);

Construct a histogram pdf to describe the shape of the dtErr distribution

In [6]:
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)

In [7]:
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)) ;

Sample, fit and plot product model

Specify external dataset with dterr values to use model_dm as conditional pdf

In [8]:
RooDataSet *data = model.generate(RooArgSet(dt, dterr), 10000);
input_line_59:2:2: warning: 'data' shadows a declaration with the same name in the 'std' namespace; use '::data' to reference this declaration
 RooDataSet *data = model.generate(RooArgSet(dt, dterr), 10000);
 ^

Fit conditional decay_dm(dt|dterr)

Specify dterr as conditional observable

In [9]:
model.fitTo(*data);
input_line_60:2:15: error: reference to 'data' is ambiguous
 model.fitTo(*data);
              ^
input_line_59:2:14: note: candidate found by name lookup is '__cling_N527::data'
 RooDataSet *data = model.generate(RooArgSet(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
    ^

Plot conditional decay_dm(dt|dterr)

Make two-dimensional plot of conditional pdf in (dt,dterr)

In [10]:
TH1 *hh_model = model.createHistogram("hh_model", dt, Binning(50), YVar(dterr, Binning(50)));
hh_model->SetLineColor(kBlue);

Make projection of data an dt

In [11]:
RooPlot *frame = dt.frame(Title("Projection of model(dt|dterr) on dt"));
data->plotOn(frame);
model.plotOn(frame);
input_line_62:3:1: error: reference to 'data' is ambiguous
data->plotOn(frame);
^
input_line_59:2:14: note: candidate found by name lookup is '__cling_N527::data'
 RooDataSet *data = model.generate(RooArgSet(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

In [12]:
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_64: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

In [13]:
gROOT->GetListOfCanvases()->Draw()