ROOT   Reference Guide
Searching...
No Matches
multifit.C
Go to the documentation of this file.
1/// \file
2/// \ingroup tutorial_fit
3/// \notebook -js
4/// Fitting multiple functions to different ranges of a 1-D histogram
5/// Example showing how to fit in a sub-range of an histogram
6/// A histogram is created and filled with the bin contents and errors
7/// defined in the table below.
8/// Three Gaussians are fitted in sub-ranges of this histogram.
9/// A new function (a sum of 3 Gaussians) is fitted on another subrange
10/// Note that when fitting simple functions, such as Gaussians, the initial
11/// values of parameters are automatically computed by ROOT.
12/// In the more complicated case of the sum of 3 Gaussians, the initial values
13/// of parameters must be given. In this particular case, the initial values
14/// are taken from the result of the individual fits.
15///
16/// \macro_image
17/// \macro_output
18/// \macro_code
19///
20/// \author Rene Brun
21
22#include "TH1.h"
23#include "TF1.h"
24
25void multifit()
26{
27 const int np = 49;
28 float x[np] = {1.913521, 1.953769, 2.347435, 2.883654, 3.493567, 4.047560, 4.337210, 4.364347, 4.563004,
29 5.054247, 5.194183, 5.380521, 5.303213, 5.384578, 5.563983, 5.728500, 5.685752, 5.080029,
30 4.251809, 3.372246, 2.207432, 1.227541, 0.8597788, 0.8220503, 0.8046592, 0.7684097, 0.7469761,
31 0.8019787, 0.8362375, 0.8744895, 0.9143721, 0.9462768, 0.9285364, 0.8954604, 0.8410891, 0.7853871,
32 0.7100883, 0.6938808, 0.7363682, 0.7032954, 0.6029015, 0.5600163, 0.7477068, 1.188785, 1.938228,
33 2.602717, 3.472962, 4.465014, 5.177035};
34
35 // The histogram are filled with bins defined in the array x.
36 TH1F *h = new TH1F("h", "Example of several fits in subranges", np, 85, 134);
37 h->SetMaximum(7);
38
39 for (int i = 0; i < np; i++) {
40 h->SetBinContent(i + 1, x[i]);
41 }
42
43 // Define the parameter array for the total function.
44 double par[9];
45
46 // Three TF1 objects are created, one for each subrange.
47 TF1 *g1 = new TF1("g1", "gaus", 85, 95);
48 TF1 *g2 = new TF1("g2", "gaus", 98, 108);
49 TF1 *g3 = new TF1("g3", "gaus", 110, 121);
50
51 // The total is the sum of the three, each has three parameters.
52 TF1 *total = new TF1("total", "gaus(0)+gaus(3)+gaus(6)", 85, 125);
53 total->SetLineColor(2);
54
55 // Fit each function and add it to the list of functions. By default,
56 // TH1::Fit() fits the function on the defined histogram range. You can
57 // specify the "R" option in the second parameter of TH1::Fit() to restrict
58 // the fit to the range specified in the TF1 constructor. Alternatively, you
59 // can also specify the range in the call to TH1::Fit(), which we demonstrate
60 // here with the 3rd Gaussian. The "+" option needs to be added to the later
61 // fits to not replace existing fitted functions in the histogram.
62 h->Fit(g1, "R");
63 h->Fit(g2, "R+");
64 h->Fit(g3, "+", "", 110, 121);
65
66 // Get the parameters from the fit.
67 g1->GetParameters(&par[0]);
68 g2->GetParameters(&par[3]);
69 g3->GetParameters(&par[6]);
70
71 // Use the parameters on the sum.
72 total->SetParameters(par);
73 h->Fit(total, "R+");
74}
#define h(i)
Definition RSha256.hxx:106
static unsigned int total
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t np
1-Dim function class
Definition TF1.h:214
virtual Double_t * GetParameters() const
Definition TF1.h:526
1-D histogram with a float per channel (see TH1 documentation)}
Definition TH1.h:577
Double_t x[n]
Definition legend1.C:17