Logo ROOT   6.14/05
Reference Guide
FittingDemo.C
Go to the documentation of this file.
1 /// \file
2 /// \ingroup tutorial_fit
3 /// \notebook -js
4 /// Example for fitting signal/background.
5 /// This example can be executed with:
6 ///
7 /// ~~~{.cpp}
8 /// root > .x FittingDemo.C (using the CINT interpreter)
9 /// root > .x FittingDemo.C+ (using the native complier via ACLIC)
10 /// ~~~
11 ///
12 /// \macro_image
13 /// \macro_output
14 /// \macro_code
15 ///
16 /// \author Rene Brun
17 
18 #include "TH1.h"
19 #include "TMath.h"
20 #include "TF1.h"
21 #include "TLegend.h"
22 #include "TCanvas.h"
23 
24 // Quadratic background function
26  return par[0] + par[1]*x[0] + par[2]*x[0]*x[0];
27 }
28 
29 
30 // Lorenzian Peak function
31 Double_t lorentzianPeak(Double_t *x, Double_t *par) {
32  return (0.5*par[0]*par[1]/TMath::Pi()) /
33  TMath::Max( 1.e-10,(x[0]-par[2])*(x[0]-par[2])
34  + .25*par[1]*par[1]);
35 }
36 
37 // Sum of background and peak function
38 Double_t fitFunction(Double_t *x, Double_t *par) {
39  return background(x,par) + lorentzianPeak(x,&par[3]);
40 }
41 
42 void FittingDemo() {
43  //Bevington Exercise by Peter Malzacher, modified by Rene Brun
44 
45  const int nBins = 60;
46 
47  Double_t data[nBins] = { 6, 1,10,12, 6,13,23,22,15,21,
48  23,26,36,25,27,35,40,44,66,81,
49  75,57,48,45,46,41,35,36,53,32,
50  40,37,38,31,36,44,42,37,32,32,
51  43,44,35,33,33,39,29,41,32,44,
52  26,39,29,35,32,21,21,15,25,15};
53  TCanvas *c1 = new TCanvas("c1","Fitting Demo",10,10,700,500);
54  c1->SetFillColor(33);
55  c1->SetFrameFillColor(41);
56  c1->SetGrid();
57 
58  TH1F *histo = new TH1F("histo",
59  "Lorentzian Peak on Quadratic Background",60,0,3);
60  histo->SetMarkerStyle(21);
61  histo->SetMarkerSize(0.8);
62  histo->SetStats(0);
63 
64  for(int i=0; i < nBins; i++) histo->SetBinContent(i+1,data[i]);
65 
66  // create a TF1 with the range from 0 to 3 and 6 parameters
67  TF1 *fitFcn = new TF1("fitFcn",fitFunction,0,3,6);
68  fitFcn->SetNpx(500);
69  fitFcn->SetLineWidth(4);
70  fitFcn->SetLineColor(kMagenta);
71 
72  // first try without starting values for the parameters
73  // This defaults to 1 for each param.
74  // this results in an ok fit for the polynomial function
75  // however the non-linear part (lorenzian) does not
76  // respond well.
77  fitFcn->SetParameters(1,1,1,1,1,1);
78  histo->Fit("fitFcn","0");
79 
80  // second try: set start values for some parameters
81  fitFcn->SetParameter(4,0.2); // width
82  fitFcn->SetParameter(5,1); // peak
83 
84  histo->Fit("fitFcn","V+","ep");
85 
86  // improve the picture:
87  TF1 *backFcn = new TF1("backFcn",background,0,3,3);
88  backFcn->SetLineColor(kRed);
89  TF1 *signalFcn = new TF1("signalFcn",lorentzianPeak,0,3,3);
90  signalFcn->SetLineColor(kBlue);
91  signalFcn->SetNpx(500);
92  Double_t par[6];
93 
94  // writes the fit results into the par array
95  fitFcn->GetParameters(par);
96 
97  backFcn->SetParameters(par);
98  backFcn->Draw("same");
99 
100  signalFcn->SetParameters(&par[3]);
101  signalFcn->Draw("same");
102 
103  // draw the legend
104  TLegend *legend=new TLegend(0.6,0.65,0.88,0.85);
105  legend->SetTextFont(72);
106  legend->SetTextSize(0.04);
107  legend->AddEntry(histo,"Data","lpe");
108  legend->AddEntry(backFcn,"Background fit","l");
109  legend->AddEntry(signalFcn,"Signal fit","l");
110  legend->AddEntry(fitFcn,"Global Fit","l");
111  legend->Draw();
112 
113 }
virtual void SetLineWidth(Width_t lwidth)
Set the line width.
Definition: TAttLine.h:43
virtual void SetParameters(const Double_t *params)
Definition: TF1.h:628
virtual void SetNpx(Int_t npx=100)
Set the number of points used to draw the function.
Definition: TF1.cxx:3339
This class displays a legend box (TPaveText) containing several legend entries.
Definition: TLegend.h:23
return c1
Definition: legend1.C:41
Definition: Rtypes.h:59
virtual void Draw(Option_t *option="")
Draw this legend with its current attributes.
Definition: TLegend.cxx:423
THist< 1, float, THistStatContent, THistStatUncertainty > TH1F
Definition: THist.hxx:285
1-D histogram with a float per channel (see TH1 documentation)}
Definition: TH1.h:567
virtual void Draw(Option_t *option="")
Draw this function with its current attributes.
Definition: TF1.cxx:1224
virtual void SetTextFont(Font_t tfont=62)
Set the text font.
Definition: TAttText.h:45
Double_t x[n]
Definition: legend1.C:17
virtual void SetGrid(Int_t valuex=1, Int_t valuey=1)
Definition: TPad.h:327
constexpr Double_t Pi()
Definition: TMath.h:38
virtual void SetLineColor(Color_t lcolor)
Set the line color.
Definition: TAttLine.h:40
virtual void SetFillColor(Color_t fcolor)
Set the fill area color.
Definition: TAttFill.h:37
virtual void SetBinContent(Int_t bin, Double_t content)
Set bin content see convention for numbering bins in TH1::GetBin In case the bin number is greater th...
Definition: TH1.cxx:8514
virtual void SetMarkerStyle(Style_t mstyle=1)
Set the marker style.
Definition: TAttMarker.h:40
virtual void SetMarkerSize(Size_t msize=1)
Set the marker size.
Definition: TAttMarker.h:41
The Canvas class.
Definition: TCanvas.h:31
double Double_t
Definition: RtypesCore.h:55
TLegendEntry * AddEntry(const TObject *obj, const char *label="", Option_t *option="lpf")
Add a new entry to this legend.
Definition: TLegend.cxx:330
you should not use this method at all Int_t Int_t Double_t Double_t Double_t e
Definition: TRolke.cxx:630
Short_t Max(Short_t a, Short_t b)
Definition: TMathBase.h:200
1-Dim function class
Definition: TF1.h:211
virtual Double_t * GetParameters() const
Definition: TF1.h:504
Definition: Rtypes.h:59
void SetFrameFillColor(Color_t color=1)
Definition: TAttPad.h:73
virtual void SetParameter(Int_t param, Double_t value)
Definition: TF1.h:618
virtual void SetTextSize(Float_t tsize=1)
Set the text size.
Definition: TAttText.h:46
virtual TFitResultPtr Fit(const char *formula, Option_t *option="", Option_t *goption="", Double_t xmin=0, Double_t xmax=0)
Fit histogram with function fname.
Definition: TH1.cxx:3695
virtual void SetStats(Bool_t stats=kTRUE)
Set statistics option on/off.
Definition: TH1.cxx:8284