Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
fitNormSum.py
Go to the documentation of this file.
1## \file
2## \ingroup tutorial_fit
3## \notebook
4## Tutorial for normalized sum of two functions
5## Here: a background exponential and a crystalball function
6## Parameters can be set:
7## 1. with the TF1 object before adding the function (for 3) and 4))
8## 2. with the TF1NormSum object (first two are the coefficients, then the non constant parameters)
9## 3. with the TF1 object after adding the function
10##
11## Sum can be constructed by:
12## 1. by a string containing the names of the functions and/or the coefficient in front
13## 2. by a string containg formulas like expo, gaus...
14## 3. by the list of functions and coefficients (which are 1 by default)
15## 4. by a std::vector for functions and coefficients
16##
17## \macro_image
18## \macro_output
19## \macro_code
20##
21## \author Jonas Rembser, Lorenzo Moneta (C++ version)
22
23import ROOT
24
25nsig = 50000
26nbkg = 1000000
27nEvents = nsig + nbkg
28nBins = 1000
29
30signal_mean = 3.0
31f_cb = ROOT.TF1("MyCrystalBall", "crystalball", -5.0, 5.0)
32f_exp = ROOT.TF1("MyExponential", "expo", -5.0, 5.0)
33
34# I.:
35f_exp.SetParameters(1.0, -0.3)
36f_cb.SetParameters(1, signal_mean, 0.3, 2, 1.5)
37
38# CONSTRUCTION OF THE TF1NORMSUM OBJECT ........................................
39# 1) :
40fnorm_exp_cb = ROOT.TF1NormSum(f_cb, f_exp, nsig, nbkg)
41# 4) :
42
43f_sum = ROOT.TF1("fsum", fnorm_exp_cb, -5.0, 5.0, fnorm_exp_cb.GetNpar())
44
45# III.:
46parameter_values = fnorm_exp_cb.GetParameters()
47f_sum.SetParameters(parameter_values.data())
48# Note: in the C++ tutorial, the parameter value sync is done in one line with:
49# ```C++
50# f_sum->SetParameters(fnorm_exp_cb->GetParameters().data());
51# ```
52# However, TF1NormSum::GetParameters() returns an std::vector by value, which
53# doesn't survive long enough in Python. That's why we have to explicitly
54# assign it to a variable first and can't use a temporary.
55
56f_sum.SetParName(1, "NBackground")
57f_sum.SetParName(0, "NSignal")
58for i in range(2, f_sum.GetNpar()):
59 f_sum.SetParName(i, fnorm_exp_cb.GetParName(i))
60
61# GENERATE HISTOGRAM TO FIT ..............................................................
62w = ROOT.TStopwatch()
63w.Start()
64h_sum = ROOT.TH1D("h_ExpCB", "Exponential Bkg + CrystalBall function", nBins, -5.0, 5.0)
65h_sum.FillRandom("fsum", nEvents)
66print("Time to generate {0} events: ".format(nEvents))
67w.Print()
68
69# need to scale histogram with width since we are fitting a density
70h_sum.Sumw2()
71h_sum.Scale(1.0, "width")
72
73# fit - use Minuit2 if available
75c1 = ROOT.TCanvas("Fit", "Fit", 800, 1000)
76# do a least-square fit of the spectrum
77result = h_sum.Fit("fsum", "SQ")
78result.Print()
79h_sum.Draw()
80print("Time to fit using ROOT TF1Normsum: ")
81w.Print()
82
83# test if parameters are fine
84for i, pref in enumerate([nsig, nbkg, signal_mean]):
85 if not ROOT.TMath.AreEqualAbs(pref, f_sum.GetParameter(i), f_sum.GetParError(i) * 10.0):
86 ROOT.Error(
87 "testFitNormSum",
88 "Difference found in fitted {0} - difference is {1:.2f} sigma".format(
89 f_sum.GetParName(i), (f_sum.GetParameter(i) - pref) / f_sum.GetParError(i)
90 ),
91 )
92
93ROOT.gStyle.SetOptStat(0)
94# add parameters
95t1 = ROOT.TLatex(-2.5, 300000, "NSignal = {0:g} #pm {1:g}".format(f_sum.GetParameter(0), f_sum.GetParError(0)))
96t2 = ROOT.TLatex(-2.5, 270000, "Nbackgr = {0:g} #pm {1:g}".format(f_sum.GetParameter(1), f_sum.GetParError(1)))
97t1.Draw()
98t2.Draw()
99
100c1.SaveAs("fitNormSum.png")
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 winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t format
static void SetDefaultMinimizer(const char *type, const char *algo=nullptr)
Set the default Minimizer type and corresponding algorithms.