Example for fitting signal/background. This example can be executed with:
root > .x FittingDemo.C (using the cling interpreter)
root > .x FittingDemo.C+ (using the native complier via ACLIC)
Author: Rene Brun
This notebook tutorial was automatically generated with ROOTBOOK-izer from the macro found in the ROOT repository on Monday, March 27, 2023 at 09:47 AM.
%%cpp -d
#include "TH1.h"
#include "TMath.h"
#include "TF1.h"
#include "TLegend.h"
#include "TCanvas.h"
Quadratic background function
%%cpp -d
double background(double *x, double *par) {
return par[0] + par[1]*x[0] + par[2]*x[0]*x[0];
}
Lorenzian Peak function
%%cpp -d
double lorentzianPeak(double *x, double *par) {
return (0.5*par[0]*par[1]/TMath::Pi()) /
TMath::Max( 1.e-10,(x[0]-par[2])*(x[0]-par[2])
+ .25*par[1]*par[1]);
}
Sum of background and peak function
%%cpp -d
double fitFunction(double *x, double *par) {
return background(x,par) + lorentzianPeak(x,&par[3]);
}
Bevington Exercise by Peter Malzacher, modified by Rene Brun
const int nBins = 60;
double data[nBins] = { 6, 1,10,12, 6,13,23,22,15,21,
23,26,36,25,27,35,40,44,66,81,
75,57,48,45,46,41,35,36,53,32,
40,37,38,31,36,44,42,37,32,32,
43,44,35,33,33,39,29,41,32,44,
26,39,29,35,32,21,21,15,25,15};
TCanvas *c1 = new TCanvas("c1","Fitting Demo",10,10,700,500);
c1->SetFillColor(33);
c1->SetFrameFillColor(41);
c1->SetGrid();
TH1F *histo = new TH1F("histo",
"Lorentzian Peak on Quadratic Background",60,0,3);
histo->SetMarkerStyle(21);
histo->SetMarkerSize(0.8);
histo->SetStats(0);
for(int i=0; i < nBins; i++) histo->SetBinContent(i+1,data[i]);
input_line_47:4:3: warning: 'data' shadows a declaration with the same name in the 'std' namespace; use '::data' to reference this declaration double data[nBins] = { 6, 1,10,12, 6,13,23,22,15,21, ^
create a TF1 with the range from 0 to 3 and 6 parameters
TF1 *fitFcn = new TF1("fitFcn",fitFunction,0,3,6);
fitFcn->SetNpx(500);
fitFcn->SetLineWidth(4);
fitFcn->SetLineColor(kMagenta);
first try without starting values for the parameters This defaults to 1 for each param. this results in an ok fit for the polynomial function however the non-linear part (lorenzian) does not respond well.
fitFcn->SetParameters(1,1,1,1,1,1);
histo->Fit("fitFcn","0");
FCN=58.9284 FROM MIGRAD STATUS=CONVERGED 618 CALLS 619 TOTAL EDM=1.54329e-09 STRATEGY= 1 ERROR MATRIX UNCERTAINTY 1.2 per cent EXT PARAMETER STEP FIRST NO. NAME VALUE ERROR SIZE DERIVATIVE 1 p0 -8.64715e-01 8.87889e-01 3.02210e-05 -3.15277e-06 2 p1 4.58434e+01 2.64076e+00 6.35729e-04 1.78463e-05 3 p2 -1.33214e+01 9.77307e-01 -1.31737e-04 3.73302e-05 4 p3 1.38074e+01 2.20785e+00 -1.29864e-03 -9.22424e-06 5 p4 1.72308e-01 3.72077e-02 -5.22394e-06 -1.45631e-03 6 p5 9.87281e-01 1.13098e-02 2.92804e-06 -3.44378e-04
second try: set start values for some parameters
fitFcn->SetParameter(4,0.2); // width
fitFcn->SetParameter(5,1); // peak
histo->Fit("fitFcn","V+","ep");
********** ** 10 **SET NOGRAD ********** PARAMETER DEFINITIONS: NO. NAME VALUE STEP SIZE LIMITS 1 p0 -8.64715e-01 8.87889e-01 no limits 2 p1 4.58434e+01 2.64076e+00 no limits 3 p2 -1.33214e+01 9.77307e-01 no limits 4 p3 1.38074e+01 2.20785e+00 no limits 5 p4 2.00000e-01 3.72077e-02 no limits 6 p5 1.00000e+00 1.13098e-02 no limits ********** ** 11 **SET ERR 1 ********** ********** ** 12 **SET PRINT 2 ********** ********** ** 13 **SET STR 1 ********** NOW USING STRATEGY 1: TRY TO BALANCE SPEED AGAINST RELIABILITY ********** ** 14 **MIGRAD 1780 0.01 ********** FIRST CALL TO USER FUNCTION AT NEW START POINT, WITH IFLAG=4. START MIGRAD MINIMIZATION. STRATEGY 1. CONVERGENCE WHEN EDM .LT. 1.00e-05 FCN=60.858 FROM MIGRAD STATUS=INITIATE 22 CALLS 23 TOTAL EDM= unknown STRATEGY= 1 NO ERROR MATRIX EXT PARAMETER CURRENT GUESS STEP FIRST NO. NAME VALUE ERROR SIZE DERIVATIVE 1 p0 -8.64715e-01 8.87889e-01 8.87889e-01 4.29214e-01 2 p1 4.58434e+01 2.64076e+00 2.64076e+00 4.53155e-01 3 p2 -1.33214e+01 9.77307e-01 9.77307e-01 8.11696e-01 4 p3 1.38074e+01 2.20785e+00 2.20785e+00 -6.67494e-01 5 p4 2.00000e-01 3.72077e-02 3.72077e-02 5.35278e+01 6 p5 1.00000e+00 1.13098e-02 1.13098e-02 1.53279e+02 NO ERROR MATRIX FCN=59.0986 FROM MIGRAD STATUS=PROGRESS 39 CALLS 40 TOTAL EDM=0.770568 STRATEGY= 1 NO ERROR MATRIX EXT PARAMETER CURRENT GUESS STEP FIRST NO. NAME VALUE ERROR SIZE DERIVATIVE 1 p0 -9.13550e-01 8.87889e-01 -4.88344e-02 -1.02740e-01 2 p1 4.58158e+01 2.64076e+00 -2.75905e-02 -4.11668e-01 3 p2 -1.33297e+01 9.77307e-01 -8.26649e-03 -1.43164e+00 4 p3 1.43059e+01 2.20785e+00 4.98560e-01 3.34033e-01 5 p4 1.76669e-01 3.72077e-02 -2.33314e-02 -5.66279e+00 6 p5 9.90624e-01 1.13098e-02 -9.37641e-03 5.09250e+01 MIGRAD MINIMIZATION HAS CONVERGED. MIGRAD WILL VERIFY CONVERGENCE AND ERROR MATRIX. START COVARIANCE MATRIX CALCULATION. EIGENVALUES OF SECOND-DERIVATIVE MATRIX: 1.2685e-02 2.6097e-01 6.2144e-01 1.0079e+00 1.5369e+00 2.5601e+00 COVARIANCE MATRIX CALCULATED SUCCESSFULLY FCN=58.9284 FROM HESSE STATUS=OK 40 CALLS 164 TOTAL EDM=2.83537e-05 STRATEGY= 1 ERROR MATRIX ACCURATE EXT PARAMETER STEP FIRST NO. NAME VALUE ERROR SIZE DERIVATIVE 1 p0 -8.62472e-01 8.91793e-01 2.08429e-03 4.68256e-04 2 p1 4.58294e+01 2.64212e+00 1.52471e-03 -1.63791e-03 3 p2 -1.33163e+01 9.76930e-01 6.23584e-04 6.32364e-03 4 p3 1.38135e+01 2.17742e+00 5.05443e-03 -2.23116e-04 5 p4 1.72389e-01 3.58301e-02 9.43447e-05 1.89644e-02 6 p5 9.87280e-01 1.12690e-02 4.24065e-05 -7.70600e-02 PARAMETER CORRELATION COEFFICIENTS NO. GLOBAL 1 2 3 4 5 6 1 0.78593 1.000 -0.512 0.400 -0.082 -0.117 0.042 2 0.98828 -0.512 1.000 -0.978 -0.526 -0.391 -0.061 3 0.98564 0.400 -0.978 1.000 0.545 0.410 0.053 4 0.78922 -0.082 -0.526 0.545 1.000 0.710 0.071 5 0.71738 -0.117 -0.391 0.410 0.710 1.000 0.070 6 0.09369 0.042 -0.061 0.053 0.071 0.070 1.000 FCN=58.9284 FROM MIGRAD STATUS=PROGRESS 176 CALLS 177 TOTAL EDM=6.09404e-13 STRATEGY= 1 ERROR MATRIX ACCURATE EXT PARAMETER STEP FIRST NO. NAME VALUE ERROR SIZE DERIVATIVE 1 p0 -8.64713e-01 8.91793e-01 -2.24105e-03 1.85566e-07 2 p1 4.58434e+01 2.64212e+00 1.39273e-02 -9.90056e-09 3 p2 -1.33214e+01 9.76930e-01 -5.15131e-03 2.02571e-07 4 p3 1.38074e+01 2.17742e+00 -6.03314e-03 7.41648e-07 5 p4 1.72309e-01 3.58301e-02 -7.96940e-05 -2.58628e-05 6 p5 9.87281e-01 1.12690e-02 1.37418e-06 -8.42700e-05 MIGRAD MINIMIZATION HAS CONVERGED. FCN=58.9284 FROM MIGRAD STATUS=CONVERGED 176 CALLS 177 TOTAL EDM=6.09404e-13 STRATEGY= 1 ERROR MATRIX UNCERTAINTY 0.0 per cent EXT PARAMETER STEP FIRST NO. NAME VALUE ERROR SIZE DERIVATIVE 1 p0 -8.64713e-01 8.91794e-01 -2.24105e-03 1.85566e-07 2 p1 4.58434e+01 2.64221e+00 1.39273e-02 -9.90056e-09 3 p2 -1.33214e+01 9.76963e-01 -5.15131e-03 2.02571e-07 4 p3 1.38074e+01 2.17751e+00 -6.03314e-03 7.41648e-07 5 p4 1.72309e-01 3.58302e-02 -7.96940e-05 -2.58628e-05 6 p5 9.87281e-01 1.12690e-02 1.37418e-06 -8.42700e-05 EXTERNAL ERROR MATRIX. NDIM= 25 NPAR= 6 ERR DEF=1 7.953e-01 -1.205e+00 3.484e-01 -1.594e-01 -3.729e-03 4.227e-04 -1.205e+00 6.981e+00 -2.525e+00 -3.027e+00 -3.704e-02 -1.812e-03 3.484e-01 -2.525e+00 9.545e-01 1.159e+00 1.434e-02 5.871e-04 -1.594e-01 -3.027e+00 1.159e+00 4.742e+00 5.537e-02 1.737e-03 -3.729e-03 -3.704e-02 1.434e-02 5.537e-02 1.284e-03 2.833e-05 4.227e-04 -1.812e-03 5.871e-04 1.737e-03 2.833e-05 1.270e-04 PARAMETER CORRELATION COEFFICIENTS NO. GLOBAL 1 2 3 4 5 6 1 0.78593 1.000 -0.512 0.400 -0.082 -0.117 0.042 2 0.98828 -0.512 1.000 -0.978 -0.526 -0.391 -0.061 3 0.98564 0.400 -0.978 1.000 0.545 0.410 0.053 4 0.78924 -0.082 -0.526 0.545 1.000 0.710 0.071 5 0.71738 -0.117 -0.391 0.410 0.710 1.000 0.070 6 0.09364 0.042 -0.061 0.053 0.071 0.070 1.000 EXTERNAL ERROR MATRIX. NDIM= 6 NPAR= 6 ERR DEF=1 7.953e-01 -1.205e+00 3.484e-01 -1.594e-01 -3.729e-03 4.227e-04 -1.205e+00 6.981e+00 -2.525e+00 -3.027e+00 -3.704e-02 -1.812e-03 3.484e-01 -2.525e+00 9.545e-01 1.159e+00 1.434e-02 5.871e-04 -1.594e-01 -3.027e+00 1.159e+00 4.742e+00 5.537e-02 1.737e-03 -3.729e-03 -3.704e-02 1.434e-02 5.537e-02 1.284e-03 2.833e-05 4.227e-04 -1.812e-03 5.871e-04 1.737e-03 2.833e-05 1.270e-04 FCN=58.9284 FROM MIGRAD STATUS=CONVERGED 176 CALLS 177 TOTAL EDM=6.09404e-13 STRATEGY= 1 ERROR MATRIX UNCERTAINTY 0.0 per cent EXT PARAMETER PARABOLIC MINOS ERRORS NO. NAME VALUE ERROR NEGATIVE POSITIVE 1 p0 -8.64713e-01 8.91794e-01 2 p1 4.58434e+01 2.64221e+00 3 p2 -1.33214e+01 9.76963e-01 4 p3 1.38074e+01 2.17751e+00 5 p4 1.72309e-01 3.58302e-02 6 p5 9.87281e-01 1.12690e-02
Info in <TMinuitMinimizer::Minimize>: Finished to run MIGRAD - status 0
improve the picture:
TF1 *backFcn = new TF1("backFcn",background,0,3,3);
backFcn->SetLineColor(kRed);
TF1 *signalFcn = new TF1("signalFcn",lorentzianPeak,0,3,3);
signalFcn->SetLineColor(kBlue);
signalFcn->SetNpx(500);
double par[6];
writes the fit results into the par array
fitFcn->GetParameters(par);
backFcn->SetParameters(par);
backFcn->Draw("same");
signalFcn->SetParameters(&par[3]);
signalFcn->Draw("same");
draw the legend
TLegend *legend=new TLegend(0.6,0.65,0.88,0.85);
legend->SetTextFont(72);
legend->SetTextSize(0.04);
legend->AddEntry(histo,"Data","lpe");
legend->AddEntry(backFcn,"Background fit","l");
legend->AddEntry(signalFcn,"Signal fit","l");
legend->AddEntry(fitFcn,"Global Fit","l");
legend->Draw();
Draw all canvases
%jsroot on
gROOT->GetListOfCanvases()->Draw()