Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
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 
11 import ROOT
12 
13 # Set up composite pdf
14 # --------------------------------------
15 
16 # Declare observable x
17 x = 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
21 mean = ROOT.RooRealVar("mean", "mean of gaussians", 5)
22 sigma1 = ROOT.RooRealVar("sigma1", "width of gaussians", 0.5)
23 sigma2 = ROOT.RooRealVar("sigma2", "width of gaussians", 1)
24 sig1 = ROOT.RooGaussian("sig1", "Signal component 1", x, mean, sigma1)
25 sig2 = ROOT.RooGaussian("sig2", "Signal component 2", x, mean, sigma2)
26 
27 # Sum the signal components into a composite signal p.d.f.
28 sig1frac = ROOT.RooRealVar(
29  "sig1frac", "fraction of component 1 in signal", 0.8, 0., 1.)
30 sig = ROOT.RooAddPdf(
31  "sig", "Signal", ROOT.RooArgList(sig1, sig2), ROOT.RooArgList(sig1frac))
32 
33 # Build Chebychev polynomial p.d.f.
34 a0 = ROOT.RooRealVar("a0", "a0", 0.5, 0., 1.)
35 a1 = ROOT.RooRealVar("a1", "a1", -0.2, 0., 1.)
36 bkg1 = ROOT.RooChebychev("bkg1", "Background 1",
37  x, ROOT.RooArgList(a0, a1))
38 
39 # Build expontential pdf
40 alpha = ROOT.RooRealVar("alpha", "alpha", -1)
41 bkg2 = ROOT.RooExponential("bkg2", "Background 2", x, alpha)
42 
43 # Sum the background components into a composite background p.d.f.
44 bkg1frac = ROOT.RooRealVar(
45  "sig1frac", "fraction of component 1 in background", 0.2, 0., 1.)
46 bkg = ROOT.RooAddPdf(
47  "bkg", "Signal", ROOT.RooArgList(bkg1, bkg2), ROOT.RooArgList(sig1frac))
48 
49 # Sum the composite signal and background
50 bkgfrac = ROOT.RooRealVar("bkgfrac", "fraction of background", 0.5, 0., 1.)
51 model = 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
58 data = model.generate(ROOT.RooArgSet(x), 1000)
59 
60 # Plot data and complete PDF overlaid
61 xframe = x.frame(ROOT.RooFit.Title(
62  "Component plotting of pdf=(sig1+sig2)+(bkg1+bkg2)"))
63 data.plotOn(xframe)
64 model.plotOn(xframe)
65 
66 # Clone xframe for use below
67 xframe2 = xframe.Clone("xframe2")
68 
69 # Make component by object reference
70 # --------------------------------------------------------------------
71 
72 # Plot single background component specified by object reference
73 ras_bkg = ROOT.RooArgSet(bkg)
74 model.plotOn(xframe, ROOT.RooFit.Components(
75  ras_bkg), ROOT.RooFit.LineColor(ROOT.kRed))
76 
77 # Plot single background component specified by object reference
78 ras_bkg2 = ROOT.RooArgSet(bkg2)
79 model.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')
85 ras_bkg_sig2 = ROOT.RooArgSet(bkg, sig2)
86 model.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
93 model.plotOn(xframe2, ROOT.RooFit.Components(
94  "bkg"), ROOT.RooFit.LineColor(ROOT.kCyan))
95 
96 # Plot multiple background components specified by name
97 model.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
107 model.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
117 model.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
127 c = ROOT.TCanvas("rf205_compplot", "rf205_compplot", 800, 400)
128 c.Divide(2)
129 c.cd(1)
130 ROOT.gPad.SetLeftMargin(0.15)
131 xframe.GetYaxis().SetTitleOffset(1.4)
132 xframe.Draw()
133 c.cd(2)
134 ROOT.gPad.SetLeftMargin(0.15)
135 xframe2.GetYaxis().SetTitleOffset(1.4)
136 xframe2.Draw()
137 
138 c.SaveAs("rf205_compplot.png")