# rf109_chi2residpull¶

Basic functionality: Calculating chi^2 from histograms and curves in RooPlots, making histogram of residual and pull distributions

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:06 AM.

In [ ]:
%%cpp -d
#include "RooRealVar.h"
#include "RooDataSet.h"
#include "RooGaussian.h"
#include "RooConstVar.h"
#include "TCanvas.h"
#include "TAxis.h"
#include "RooPlot.h"
#include "RooHist.h"
using namespace RooFit;


## Setup model¶

Create observables

In [ ]:
RooRealVar x("x", "x", -10, 10);


Create Gaussian

In [ ]:
RooRealVar sigma("sigma", "sigma", 3, 0.1, 10);
RooRealVar mean("mean", "mean", 0, -10, 10);
RooGaussian gauss("gauss", "gauss", x, RooConst(0), sigma);


Generate a sample of 1000 events with sigma=3

In [ ]:
RooDataSet *data = gauss.generate(x, 10000);


Change sigma to 3.15

In [ ]:
sigma.setVal(3.15);


## Plot data and slightly distorted model¶

Overlay projection of gauss with sigma=3.15 on data with sigma=3.0

In [ ]:
RooPlot *frame1 = x.frame(Title("Data with distorted Gaussian pdf"), Bins(40));
data->plotOn(frame1, DataError(RooAbsData::SumW2));
gauss.plotOn(frame1);


## Calculate chi^2¶

Show the chi^2 of the curve w.r.t. the histogram If multiple curves or datasets live in the frame you can specify the name of the relevant curve and/or dataset in chiSquare()

In [ ]:
cout << "chi^2 = " << frame1->chiSquare() << endl;


## Show residual and pull dists¶

Construct a histogram with the residuals of the data w.r.t. the curve

In [ ]:
RooHist *hresid = frame1->residHist();


Construct a histogram with the pulls of the data w.r.t the curve

In [ ]:
RooHist *hpull = frame1->pullHist();


Create a new frame to draw the residual distribution and add the distribution to the frame

In [ ]:
RooPlot *frame2 = x.frame(Title("Residual Distribution"));


Create a new frame to draw the pull distribution and add the distribution to the frame

In [ ]:
RooPlot *frame3 = x.frame(Title("Pull Distribution"));

TCanvas *c = new TCanvas("rf109_chi2residpull", "rf109_chi2residpull", 900, 300);
c->Divide(3);
c->cd(1);
frame1->GetYaxis()->SetTitleOffset(1.6);
frame1->Draw();
c->cd(2);
frame2->GetYaxis()->SetTitleOffset(1.6);
frame2->Draw();
c->cd(3);

%jsroot on