Logo ROOT   6.16/01
Reference Guide
rf708_bphysics.py
Go to the documentation of this file.
1## \file
2## \ingroup tutorial_roofit
3## \notebook
4##
5## 'SPECIAL PDFS' RooFit tutorial macro #708
6##
7## Special decay pdf for B physics with mixing and/or CP violation
8##
9## \macro_code
10##
11## \date February 2018
12## \author Clemens Lange
13
14
15import ROOT
16
17
18# B-decay with mixing
19# -------------------------
20
21# Construct pdf
22# -------------------------
23
24# Observable
25dt = ROOT.RooRealVar("dt", "dt", -10, 10)
26dt.setBins(40)
27
28# Parameters
29dm = ROOT.RooRealVar("dm", "delta m(B0)", 0.472)
30tau = ROOT.RooRealVar("tau", "tau (B0)", 1.547)
31w = ROOT.RooRealVar("w", "flavour mistag rate", 0.1)
32dw = ROOT.RooRealVar("dw", "delta mistag rate for B0/B0bar", 0.1)
33
34mixState = ROOT.RooCategory("mixState", "B0/B0bar mixing state")
35mixState.defineType("mixed", -1)
36mixState.defineType("unmixed", 1)
37
38tagFlav = ROOT.RooCategory("tagFlav", "Flavour of the tagged B0")
39tagFlav.defineType("B0", 1)
40tagFlav.defineType("B0bar", -1)
41
42# Use delta function resolution model
43tm = ROOT.RooTruthModel("tm", "truth model", dt)
44
45# Construct Bdecay with mixing
46bmix = ROOT.RooBMixDecay("bmix", "decay", dt, mixState,
47 tagFlav, tau, dm, w, dw, tm, ROOT.RooBMixDecay.DoubleSided)
48
49# Plot pdf in various slices
50# ---------------------------------------------------
51
52# Generate some data
53data = bmix.generate(ROOT.RooArgSet(dt, mixState, tagFlav), 10000)
54
55# Plot B0 and B0bar tagged data separately
56# For all plots below B0 and B0 tagged data will look somewhat differently
57# if the flavor tagging mistag rate for B0 and B0 is different (i.e. dw!=0)
58frame1 = dt.frame(ROOT.RooFit.Title(
59 "B decay distribution with mixing (B0/B0bar)"))
60
61data.plotOn(frame1, ROOT.RooFit.Cut("tagFlav==tagFlav::B0"))
62bmix.plotOn(frame1, ROOT.RooFit.Slice(tagFlav, "B0"))
63
64data.plotOn(frame1, ROOT.RooFit.Cut("tagFlav==tagFlav::B0bar"),
65 ROOT.RooFit.MarkerColor(ROOT.kCyan))
66bmix.plotOn(frame1, ROOT.RooFit.Slice(tagFlav, "B0bar"),
67 ROOT.RooFit.LineColor(ROOT.kCyan))
68
69# Plot mixed slice for B0 and B0bar tagged data separately
70frame2 = dt.frame(ROOT.RooFit.Title(
71 "B decay distribution of mixed events (B0/B0bar)"))
72
73data.plotOn(frame2, ROOT.RooFit.Cut(
74 "mixState==mixState::mixed&&tagFlav==tagFlav::B0"))
75bmix.plotOn(frame2, ROOT.RooFit.Slice(tagFlav, "B0"),
76 ROOT.RooFit.Slice(mixState, "mixed"))
77
78data.plotOn(frame2, ROOT.RooFit.Cut(
79 "mixState==mixState::mixed&&tagFlav==tagFlav::B0bar"), ROOT.RooFit.MarkerColor(ROOT.kCyan))
80bmix.plotOn(frame2, ROOT.RooFit.Slice(tagFlav, "B0bar"), ROOT.RooFit.Slice(
81 mixState, "mixed"), ROOT.RooFit.LineColor(ROOT.kCyan))
82
83# Plot unmixed slice for B0 and B0bar tagged data separately
84frame3 = dt.frame(ROOT.RooFit.Title(
85 "B decay distribution of unmixed events (B0/B0bar)"))
86
87data.plotOn(frame3, ROOT.RooFit.Cut(
88 "mixState==mixState::unmixed&&tagFlav==tagFlav::B0"))
89bmix.plotOn(frame3, ROOT.RooFit.Slice(tagFlav, "B0"),
90 ROOT.RooFit.Slice(mixState, "unmixed"))
91
92data.plotOn(frame3, ROOT.RooFit.Cut(
93 "mixState==mixState::unmixed&&tagFlav==tagFlav::B0bar"), ROOT.RooFit.MarkerColor(ROOT.kCyan))
94bmix.plotOn(frame3, ROOT.RooFit.Slice(tagFlav, "B0bar"), ROOT.RooFit.Slice(
95 mixState, "unmixed"), ROOT.RooFit.LineColor(ROOT.kCyan))
96
97# B-decay with CP violation
98# -------------------------
99
100# Construct pdf
101# -------------------------
102
103# Additional parameters needed for B decay with CPV
104CPeigen = ROOT.RooRealVar("CPeigen", "CP eigen value", -1)
105absLambda = ROOT.RooRealVar("absLambda", "|lambda|", 1, 0, 2)
106argLambda = ROOT.RooRealVar("absLambda", "|lambda|", 0.7, -1, 1)
107effR = ROOT.RooRealVar("effR", "B0/B0bar reco efficiency ratio", 1)
108
109# Construct Bdecay with CP violation
110bcp = ROOT.RooBCPEffDecay("bcp", "bcp", dt, tagFlav, tau, dm, w, CPeigen,
111 absLambda, argLambda, effR, dw, tm, ROOT.RooBCPEffDecay.DoubleSided)
112
113# Plot scenario 1 - sin(2b)=0.7, |l|=1
114# ---------------------------------------------------------------------------
115
116# Generate some data
117data2 = bcp.generate(ROOT.RooArgSet(dt, tagFlav), 10000)
118
119# Plot B0 and B0bar tagged data separately
120frame4 = dt.frame(ROOT.RooFit.Title(
121 "B decay distribution with CPV(|l|=1,Im(l)=0.7) (B0/B0bar)"))
122
123data2.plotOn(frame4, ROOT.RooFit.Cut("tagFlav==tagFlav::B0"))
124bcp.plotOn(frame4, ROOT.RooFit.Slice(tagFlav, "B0"))
125
126data2.plotOn(frame4, ROOT.RooFit.Cut("tagFlav==tagFlav::B0bar"),
127 ROOT.RooFit.MarkerColor(ROOT.kCyan))
128bcp.plotOn(frame4, ROOT.RooFit.Slice(tagFlav, "B0bar"),
129 ROOT.RooFit.LineColor(ROOT.kCyan))
130
131# # Plot scenario 2 - sin(2b)=0.7, |l|=0.7
132# -------------------------------------------------------------------------------
133
134absLambda.setVal(0.7)
135
136# Generate some data
137data3 = bcp.generate(ROOT.RooArgSet(dt, tagFlav), 10000)
138
139# Plot B0 and B0bar tagged data separately (sin2b = 0.7 plus direct CPV
140# |l|=0.5)
141frame5 = dt.frame(ROOT.RooFit.Title(
142 "B decay distribution with CPV(|l|=0.7,Im(l)=0.7) (B0/B0bar)"))
143
144data3.plotOn(frame5, ROOT.RooFit.Cut("tagFlav==tagFlav::B0"))
145bcp.plotOn(frame5, ROOT.RooFit.Slice(tagFlav, "B0"))
146
147data3.plotOn(frame5, ROOT.RooFit.Cut("tagFlav==tagFlav::B0bar"),
148 ROOT.RooFit.MarkerColor(ROOT.kCyan))
149bcp.plotOn(frame5, ROOT.RooFit.Slice(tagFlav, "B0bar"),
150 ROOT.RooFit.LineColor(ROOT.kCyan))
151
152
153# Generic B-decay with user coefficients
154# -------------------------
155
156# Construct pdf
157# -------------------------
158
159# Model parameters
160DGbG = ROOT.RooRealVar("DGbG", "DGamma/GammaAvg", 0.5, -1, 1)
161Adir = ROOT.RooRealVar("Adir", "-[1-abs(l)**2]/[1+abs(l)**2]", 0)
162Amix = ROOT.RooRealVar("Amix", "2Im(l)/[1+abs(l)**2]", 0.7)
163Adel = ROOT.RooRealVar("Adel", "2Re(l)/[1+abs(l)**2]", 0.7)
164
165# Derived input parameters for pdf
166DG = ROOT.RooFormulaVar("DG", "Delta Gamma", "@1/@0",
167 ROOT.RooArgList(tau, DGbG))
168
169# Construct coefficient functions for sin,cos, modulations of decay
170# distribution
171fsin = ROOT.RooFormulaVar(
172 "fsin", "fsin", "@0*@1*(1-2*@2)", ROOT.RooArgList(Amix, tagFlav, w))
173fcos = ROOT.RooFormulaVar(
174 "fcos", "fcos", "@0*@1*(1-2*@2)", ROOT.RooArgList(Adir, tagFlav, w))
175fsinh = ROOT.RooFormulaVar("fsinh", "fsinh", "@0", ROOT.RooArgList(Adel))
176
177# Construct generic B decay pdf using above user coefficients
178bcpg = ROOT.RooBDecay("bcpg", "bcpg", dt, tau, DG, ROOT.RooFit.RooConst(
179 1), fsinh, fcos, fsin, dm, tm, ROOT.RooBDecay.DoubleSided)
180
181# Plot - Im(l)=0.7, e(l)=0.7 |l|=1, G/G=0.5
182# -------------------------------------------------------------------------------------
183
184# Generate some data
185data4 = bcpg.generate(ROOT.RooArgSet(dt, tagFlav), 10000)
186
187# Plot B0 and B0bar tagged data separately
188frame6 = dt.frame(ROOT.RooFit.Title(
189 "B decay distribution with CPV(Im(l)=0.7,Re(l)=0.7,|l|=1,dG/G=0.5) (B0/B0bar)"))
190
191data4.plotOn(frame6, ROOT.RooFit.Cut("tagFlav==tagFlav::B0"))
192bcpg.plotOn(frame6, ROOT.RooFit.Slice(tagFlav, "B0"))
193
194data4.plotOn(frame6, ROOT.RooFit.Cut("tagFlav==tagFlav::B0bar"),
195 ROOT.RooFit.MarkerColor(ROOT.kCyan))
196bcpg.plotOn(frame6, ROOT.RooFit.Slice(tagFlav, "B0bar"),
197 ROOT.RooFit.LineColor(ROOT.kCyan))
198
199c = ROOT.TCanvas("rf708_bphysics", "rf708_bphysics", 1200, 800)
200c.Divide(3, 2)
201c.cd(1)
202ROOT.gPad.SetLeftMargin(0.15)
203frame1.GetYaxis().SetTitleOffset(1.6)
204frame1.Draw()
205c.cd(2)
206ROOT.gPad.SetLeftMargin(0.15)
207frame2.GetYaxis().SetTitleOffset(1.6)
208frame2.Draw()
209c.cd(3)
210ROOT.gPad.SetLeftMargin(0.15)
211frame3.GetYaxis().SetTitleOffset(1.6)
212frame3.Draw()
213c.cd(4)
214ROOT.gPad.SetLeftMargin(0.15)
215frame4.GetYaxis().SetTitleOffset(1.6)
216frame4.Draw()
217c.cd(5)
218ROOT.gPad.SetLeftMargin(0.15)
219frame5.GetYaxis().SetTitleOffset(1.6)
220frame5.Draw()
221c.cd(6)
222ROOT.gPad.SetLeftMargin(0.15)
223frame6.GetYaxis().SetTitleOffset(1.6)
224frame6.Draw()
225
226c.SaveAs("rf708_bphysics.png")