Logo ROOT  
Reference Guide
rf205_compplot.py
Go to the documentation of this file.
1## \file
2## \ingroup tutorial_roofit
3## \notebook
4## Addition and convolution: options for plotting components of composite p.d.f.s.
5##
6## \macro_code
7##
8## \date February 2018
9## \author Clemens Lange, Wouter Verkerke (C++ version)
10
11import ROOT
12
13# Set up composite pdf
14# --------------------------------------
15
16# Declare observable x
17x = ROOT.RooRealVar("x", "x", 0, 10)
18
19# Create two Gaussian PDFs g1(x,mean1,sigma) anf g2(x,mean2,sigma) and
20# their parameters
21mean = ROOT.RooRealVar("mean", "mean of gaussians", 5)
22sigma1 = ROOT.RooRealVar("sigma1", "width of gaussians", 0.5)
23sigma2 = ROOT.RooRealVar("sigma2", "width of gaussians", 1)
24sig1 = ROOT.RooGaussian("sig1", "Signal component 1", x, mean, sigma1)
25sig2 = ROOT.RooGaussian("sig2", "Signal component 2", x, mean, sigma2)
26
27# Sum the signal components into a composite signal p.d.f.
28sig1frac = ROOT.RooRealVar(
29 "sig1frac", "fraction of component 1 in signal", 0.8, 0., 1.)
30sig = ROOT.RooAddPdf(
31 "sig", "Signal", ROOT.RooArgList(sig1, sig2), ROOT.RooArgList(sig1frac))
32
33# Build Chebychev polynomial p.d.f.
34a0 = ROOT.RooRealVar("a0", "a0", 0.5, 0., 1.)
35a1 = ROOT.RooRealVar("a1", "a1", -0.2, 0., 1.)
36bkg1 = ROOT.RooChebychev("bkg1", "Background 1",
37 x, ROOT.RooArgList(a0, a1))
38
39# Build expontential pdf
40alpha = ROOT.RooRealVar("alpha", "alpha", -1)
41bkg2 = ROOT.RooExponential("bkg2", "Background 2", x, alpha)
42
43# Sum the background components into a composite background p.d.f.
44bkg1frac = ROOT.RooRealVar(
45 "sig1frac", "fraction of component 1 in background", 0.2, 0., 1.)
46bkg = ROOT.RooAddPdf(
47 "bkg", "Signal", ROOT.RooArgList(bkg1, bkg2), ROOT.RooArgList(sig1frac))
48
49# Sum the composite signal and background
50bkgfrac = ROOT.RooRealVar("bkgfrac", "fraction of background", 0.5, 0., 1.)
51model = ROOT.RooAddPdf(
52 "model", "g1+g2+a", ROOT.RooArgList(bkg, sig), ROOT.RooArgList(bkgfrac))
53
54# Set up basic plot with data and full pdf
55# ------------------------------------------------------------------------------
56
57# Generate a data sample of 1000 events in x from model
58data = model.generate(ROOT.RooArgSet(x), 1000)
59
60# Plot data and complete PDF overlaid
61xframe = x.frame(ROOT.RooFit.Title(
62 "Component plotting of pdf=(sig1+sig2)+(bkg1+bkg2)"))
63data.plotOn(xframe)
64model.plotOn(xframe)
65
66# Clone xframe for use below
67xframe2 = xframe.Clone("xframe2")
68
69# Make component by object reference
70# --------------------------------------------------------------------
71
72# Plot single background component specified by object reference
73ras_bkg = ROOT.RooArgSet(bkg)
74model.plotOn(xframe, ROOT.RooFit.Components(
75 ras_bkg), ROOT.RooFit.LineColor(ROOT.kRed))
76
77# Plot single background component specified by object reference
78ras_bkg2 = ROOT.RooArgSet(bkg2)
79model.plotOn(xframe, ROOT.RooFit.Components(ras_bkg2), ROOT.RooFit.LineStyle(
80 ROOT.kDashed), ROOT.RooFit.LineColor(ROOT.kRed))
81
82# Plot multiple background components specified by object reference
83# Note that specified components may occur at any level in object tree
84# (e.g bkg is component of 'model' and 'sig2' is component 'sig')
85ras_bkg_sig2 = ROOT.RooArgSet(bkg, sig2)
86model.plotOn(xframe, ROOT.RooFit.Components(ras_bkg_sig2),
87 ROOT.RooFit.LineStyle(ROOT.kDotted))
88
89# Make component by name/regexp
90# ------------------------------------------------------------
91
92# Plot single background component specified by name
93model.plotOn(xframe2, ROOT.RooFit.Components(
94 "bkg"), ROOT.RooFit.LineColor(ROOT.kCyan))
95
96# Plot multiple background components specified by name
97model.plotOn(
98 xframe2,
99 ROOT.RooFit.Components("bkg1,sig2"),
100 ROOT.RooFit.LineStyle(
101 ROOT.kDotted),
102 ROOT.RooFit.LineColor(
103 ROOT.kCyan))
104
105# Plot multiple background components specified by regular expression on
106# name
107model.plotOn(
108 xframe2,
109 ROOT.RooFit.Components("sig*"),
110 ROOT.RooFit.LineStyle(
111 ROOT.kDashed),
112 ROOT.RooFit.LineColor(
113 ROOT.kCyan))
114
115# Plot multiple background components specified by multiple regular
116# expressions on name
117model.plotOn(
118 xframe2,
119 ROOT.RooFit.Components("bkg1,sig*"),
120 ROOT.RooFit.LineStyle(
121 ROOT.kDashed),
122 ROOT.RooFit.LineColor(
123 ROOT.kYellow),
124 ROOT.RooFit.Invisible())
125
126# Draw the frame on the canvas
127c = ROOT.TCanvas("rf205_compplot", "rf205_compplot", 800, 400)
128c.Divide(2)
129c.cd(1)
130ROOT.gPad.SetLeftMargin(0.15)
131xframe.GetYaxis().SetTitleOffset(1.4)
132xframe.Draw()
133c.cd(2)
134ROOT.gPad.SetLeftMargin(0.15)
135xframe2.GetYaxis().SetTitleOffset(1.4)
136xframe2.Draw()
137
138c.SaveAs("rf205_compplot.png")