Belle II Software  release-06-01-15
btocharm.py
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3 
4 
11 
12 """
13 List of functions to skim events containing :math:`B\\to X_c + h` decays,
14 where :math:`X_c` stays for :math:`D^0`, :math:`D^{\\pm}`, :math:`D^{*0}` and :math:`D^{*\\pm}`,
15 and :math:`h` stays for :math:`\\pi^{\\pm}`, :math:`K^{\\pm}`, :math:`\\rho^{\\pm}` and :math:`a_1^{\\pm}`.
16 """
17 
18 import modularAnalysis as ma
19 from skim.standardlists.charm import (loadD0_hh_loose, loadD0_Kshh_loose,
20  loadD0_Kspi0_loose, loadD0_Kspipipi0,
21  loadKForBtoHadrons, loadPiForBtoHadrons,
22  loadStdD0_Kpi, loadStdD0_Kpipi0,
23  loadStdD0_Kpipipi, loadStdDplus_Kpipi,
24  loadStdDplus_Kspi,
25  loadStdDstar0_D0pi0_Kpi,
26  loadStdDstar0_D0pi0_Kpipi0,
27  loadStdDstar0_D0pi0_Kpipipi,
28  loadStdDstarPlus_D0pi_Kpi,
29  loadStdDstarPlus_D0pi_Kpipi0,
30  loadStdDstarPlus_D0pi_Kpipipi,
31  loadStdDstarPlus_Dpi0_Kpipi,
32  loadCharmlessD0_Kpipi0)
33 from skim.standardlists.lightmesons import (loadStdAllRhoPlus,
34  loadStdPi0ForBToHadrons)
35 from skim.standardlists.charmless import (loadStdPi0ForBToCharmless)
36 from skim.standardlists.charmless import (loadStdVeryLooseTracks)
37 from skim import BaseSkim, fancy_skim_header
38 from stdCharged import stdK, stdPi
39 from stdPi0s import loadStdSkimPi0, stdPi0s
40 from stdV0s import stdKshorts
41 
42 __liaison__ = "Yi Zhang <yi.zhang2@desy.de>"
43 _VALIDATION_SAMPLE = "mdst14.root"
44 
45 
46 @fancy_skim_header
48  """
49  Reconstructed decay modes:
50 
51  * :math:`B^{+}\\to \\overline{D}^{0} (\\to K_{\\rm S}^0 \\pi^0) \\pi^+`,
52  * :math:`B^{+}\\to \\overline{D}^{0} (\\to K_{\\rm S}^0 \\pi^0) K^+`,
53 
54  Cuts applied:
55 
56  * ``1.5 < M_D0 < 2.2``
57  * ``5.2 < Mbc``
58  * ``abs(deltaE) < 0.3``
59 
60  Note:
61  This skim uses `skim.standardlists.charm.loadD0_Kspi0_loose`, where :math:`D^0`
62  channels are defined.
63  """
64  __authors__ = ["Minakshi Nayak"]
65  __description__ = ""
66  __contact__ = __liaison__
67  __category__ = "physics, hadronic B to charm"
68 
69  ApplyHLTHadronCut = True
70  validation_sample = _VALIDATION_SAMPLE
71 
72  def load_standard_lists(self, path):
73  stdK("all", path=path)
74  stdPi("all", path=path)
75  stdKshorts(path=path)
76  loadStdPi0ForBToHadrons(path=path)
77  loadD0_Kspi0_loose(path=path)
78 
79  def build_lists(self, path):
80  Bcuts = "Mbc > 5.2 and abs(deltaE) < 0.3"
81 
82  BsigChannels = ["anti-D0:Kspi0 pi+:all",
83  "anti-D0:Kspi0 K+:all"]
84  BsigList = []
85  for chID, channel in enumerate(BsigChannels):
86  ma.reconstructDecay("B+:BtoD0h_Kspi0" + str(chID) + " -> " + channel, Bcuts, chID, path=path)
87  BsigList.append("B+:BtoD0h_Kspi0" + str(chID))
88 
89  return BsigList
90 
91  def validation_histograms(self, path):
92  loadStdSkimPi0(path=path)
93  stdPi0s(listtype='eff50_May2020Fit', path=path, loadPhotonBeamBackgroundMVA=False)
94 
95  ma.reconstructDecay('D0 -> K_S0:merged pi0:eff50_May2020Fit', '1.84 < M < 1.89', path=path)
96  ma.reconstructDecay('B-:ch3 ->D0 K-:all', '5.24 < Mbc < 5.3 and abs(deltaE) < 0.15', path=path)
97 
98  # the variables that are printed out are: Mbc, deltaE and the daughter particle invariant masses.
99  ma.variablesToHistogram(
100  filename=f'{self}_Validation.root',
101  decayString='B-:ch3',
102  variables=[
103  ('Mbc', 100, 5.2, 5.3),
104  ('deltaE', 100, -1, 1),
105  ('daughter(0, InvM)', 100, 1.8, 1.9)], # D0 invariant mass
106  variables_2d=[
107  ('Mbc', 50, 5.23, 5.31, 'deltaE', 50, -0.7, 0.7)], path=path)
108 
109 
110 @fancy_skim_header
112  """
113  Reconstructed decay modes:
114 
115  * :math:`B^{+}\\to \\overline{D}^{0} (\\to K_{\\rm S}^0 \\pi^+ \\pi^- \\pi^0) \\pi^+`,
116  * :math:`B^{+}\\to \\overline{D}^{0} (\\to K_{\\rm S}^0 \\pi^+ \\pi^- \\pi^0) K^+`,
117 
118  Cuts applied:
119 
120  * ``1.8 < M_D0 < 1.9``
121  * ``5.25 < Mbc``
122  * ``abs(deltaE) < 0.2``
123 
124  Note:
125  This skim uses `skim.standardlists.charm.loadD0_Kspipipi0`, where :math:`D^0`
126  channels are defined.
127  """
128 
129  __authors__ = ["Niharika Rout"]
130  __description__ = ""
131  __contact__ = __liaison__
132  __category__ = "physics, hadronic B to charm"
133 
134  ApplyHLTHadronCut = True
135  produce_on_tau_samples = False # retention is very close to zero on taupair
136  validation_sample = _VALIDATION_SAMPLE
137 
138  def load_standard_lists(self, path):
139  stdK("all", path=path)
140  stdPi("all", path=path)
141  stdPi0s("eff40_May2020Fit", path=path, loadPhotonBeamBackgroundMVA=False)
142  stdKshorts(path=path)
143  loadStdPi0ForBToHadrons(path=path)
144  loadPiForBtoHadrons(path=path)
145  loadD0_Kspipipi0(path=path)
146 
147  def build_lists(self, path):
148  Bcuts = "Mbc > 5.25 and abs(deltaE) < 0.2"
149 
150  BsigChannels = ["anti-D0:Kspipipi0 pi+:all",
151  "anti-D0:Kspipipi0 K+:all"
152  ]
153  BsigList = []
154  for chID, channel in enumerate(BsigChannels):
155  ma.reconstructDecay("B+:BtoD0h_Kspipipi0" + str(chID) + " -> " + channel, Bcuts, chID, path=path)
156  BsigList.append("B+:BtoD0h_Kspipipi0" + str(chID))
157 
158  return BsigList
159 
160  def validation_histograms(self, path):
161  stdPi('all', path=path)
162  stdK('all', path=path)
163  loadStdSkimPi0(path=path)
164  stdKshorts(path=path)
165  stdPi0s(listtype='eff40_May2020Fit', path=path, loadPhotonBeamBackgroundMVA=False)
166 
167  ma.reconstructDecay('D0 -> K_S0:merged pi-:all pi+:all pi0:eff40_May2020Fit', '1.84 < M < 1.89', path=path)
168  ma.reconstructDecay('B-:ch3 ->D0 K-:all', '5.24 < Mbc < 5.3 and abs(deltaE) < 0.15', path=path)
169 
170  # the variables that are printed out are: Mbc, deltaE and the daughter particle invariant masses.
171  ma.variablesToHistogram(
172  filename=f'{self}_Validation.root',
173  decayString='B-:ch3',
174  variables=[
175  ('Mbc', 100, 5.2, 5.3),
176  ('deltaE', 100, -1, 1),
177  ('daughter(0, InvM)', 100, 1.8, 1.9)], # D0 invariant mass
178  variables_2d=[
179  ('Mbc', 50, 5.23, 5.31, 'deltaE', 50, -0.7, 0.7)], path=path)
180 
181 
182 @fancy_skim_header
184  """
185  Reconstructed decay modes:
186 
187  * :math:`B^{0}\\to D^{-} (D^{0} \\to K^+ \\pi^- \\pi^-) \\pi^+`
188 
189  Cuts applied:
190 
191  * ``Mbc > 5.2``
192  * ``abs(deltaE) < 0.3``
193 
194  Note:
195  This skim uses `skim.standardlists.charm.loadStdDplus_Kpipi`, where :math:`D^-`
196  channel is defined.
197  """
198 
199  __authors__ = ["Chiara La Licata"]
200  __description__ = ""
201  __contact__ = __liaison__
202  __category__ = "physics, hadronic B to charm"
203 
204  ApplyHLTHadronCut = True
205 
206  def load_standard_lists(self, path):
207  loadPiForBtoHadrons(path=path)
208  loadKForBtoHadrons(path=path)
209  loadStdDplus_Kpipi(path=path)
210 
211  def build_lists(self, path):
212  Bcuts = "5.2 < Mbc and abs(deltaE) < 0.3"
213  ma.reconstructDecay("B0:Dpi_Kpipi -> D-:Kpipi pi+:GoodTrack", Bcuts, 0, path=path)
214 
215  return ["B0:Dpi_Kpipi"]
216 
217 
218 @fancy_skim_header
220  """
221  Reconstructed decay modes:
222 
223  * :math:`B^{0}\\to D^{-} (\\to K_{\\rm S}^0 \\pi^-) \\pi^+`,
224 
225  Cuts applied:
226 
227  * ``1.8 < M_D < 1.9``
228  * ``Mbc > 5.2``
229  * ``abs(deltaE) < 0.3``
230 
231  Note:
232  This skim uses `stdV0s.stdKshorts` and
233  `skim.standardlists.charm.loadStdDplus_Kpipi`, where :math:`D^0` channels are defined.
234  """
235 
236  __authors__ = ["Fernando Abudinen", "Chiara La Licata"]
237  __description__ = ""
238  __contact__ = __liaison__
239  __category__ = "physics, hadronic B to charm"
240 
241  ApplyHLTHadronCut = True
242  produce_on_tau_samples = False # retention is very close to zero on taupair
243 
244  def load_standard_lists(self, path):
245  stdKshorts(path=path)
246  loadStdPi0ForBToHadrons(path=path)
247  loadPiForBtoHadrons(path=path)
248  loadStdDplus_Kspi(path=path)
249 
250  def build_lists(self, path):
251  Bcuts = "Mbc > 5.2 and abs(deltaE) < 0.3"
252  ma.reconstructDecay("B0:B0toDpi_Kspi -> D-:Kspi pi+:GoodTrack", Bcuts, 1, path=path)
253 
254  return ["B0:B0toDpi_Kspi"]
255 
256 
257 @fancy_skim_header
259  """
260  Reconstructed decay modes:
261 
262  * :math:`B^{0}\\to D^{*-} (D^{0} \\to K^+ \\pi^-) \\pi^+`
263 
264  Cuts applied:
265 
266  * ``Mbc > 5.2``
267  * ``abs(deltaE) < 0.3``
268 
269  Note:
270  This skim uses `skim.standardlists.charm.loadStdDstarPlus_D0pi_Kpi`, where the
271  :math:`D^{*-}` channel is defined.
272  """
273 
274  __authors__ = ["Chiara La Licata"]
275  __description__ = ""
276  __contact__ = __liaison__
277  __category__ = "physics, hadronic B to charm"
278 
279  ApplyHLTHadronCut = True
280  produce_on_tau_samples = False # retention is very close to zero on taupair
281 
282  def load_standard_lists(self, path):
283  loadPiForBtoHadrons(path=path)
284  loadKForBtoHadrons(path=path)
285  loadStdD0_Kpi(path=path)
286  loadStdDstarPlus_D0pi_Kpi(path=path)
287 
288  def build_lists(self, path):
289  Bcuts = "5.2 < Mbc and abs(deltaE) < 0.3"
290  ma.reconstructDecay("B0:Dstarpi_Kpi -> D*-:D0_Kpi pi+:GoodTrack", Bcuts, 0, path=path)
291 
292  return ["B0:Dstarpi_Kpi"]
293 
294 
295 @fancy_skim_header
297  """
298  Reconstructed decay modes:
299 
300  * :math:`B^{0}\\to \\overline{D}^{*-} (\\to \\overline{D}^{0}
301  (\\to K^+ \\pi^- \\pi^- \\pi^+, K^+\\pi^-\\pi^0) \\pi^-) \\pi^+`
302 
303  Cuts applied:
304 
305  * ``Mbc > 5.2``
306  * ``abs(deltaE) < 0.3``
307  """
308 
309  __authors__ = ["Chiara La Licata"]
310  __description__ = ""
311  __contact__ = __liaison__
312  __category__ = "physics, hadronic B to charm"
313 
314  ApplyHLTHadronCut = True
315  produce_on_tau_samples = False # retention is very close to zero on taupair
316 
317  def load_standard_lists(self, path):
318  loadStdPi0ForBToHadrons(path=path)
319  loadPiForBtoHadrons(path=path)
320  loadKForBtoHadrons(path=path)
321  loadStdD0_Kpipi0(path=path)
322  loadStdD0_Kpipipi(path=path)
323  loadStdDstarPlus_D0pi_Kpipi0(path=path)
324  loadStdDstarPlus_D0pi_Kpipipi(path=path)
325 
326  def build_lists(self, path):
327  Bcuts = "5.2 < Mbc and abs(deltaE) < 0.3"
328  BsigChannels = [
329  "D*-:D0_Kpipipi pi+:GoodTrack",
330  "D*-:D0_Kpipi0 pi+:GoodTrack"
331  ]
332 
333  BsigList = []
334  for chID, channel in enumerate(BsigChannels):
335  ma.reconstructDecay("B0:Dstarpi_Kpipipi_Kpipi0" + str(chID) + " -> " + channel, Bcuts, chID, path=path)
336  BsigList.append("B0:Dstarpi_Kpipipi_Kpipi0" + str(chID))
337 
338  return BsigList
339 
340 
341 @fancy_skim_header
343  """
344  Reconstructed decay modes:
345 
346  * :math:`B^{0}\\to D^{-} (\\to K^+ \\pi^- \\pi^-) \\rho^+`,
347 
348  Cuts applied:
349 
350  * ``1.8 < M_D < 1.9``
351  * ``0.47 < M_rho < 1.07``
352  * ``Mbc > 5.2``
353  * ``abs(deltaE) < 0.3``
354 
355  Note:
356  This skim uses `skim.standardlists.charm.loadStdDplus_Kpipi`, where :math:`D^0` channels
357  are defined, and `skim.standardlists.lightmesons.loadStdAllRhoPlus`.
358  """
359 
360  __authors__ = ["Fernando Abudinen"]
361  __description__ = ""
362  __contact__ = __liaison__
363  __category__ = "physics, hadronic B to charm"
364 
365  ApplyHLTHadronCut = True
366 
367  def load_standard_lists(self, path):
368  stdPi("all", path=path)
369  loadPiForBtoHadrons(path=path)
370  loadKForBtoHadrons(path=path)
371  loadStdDplus_Kpipi(path=path)
372  loadStdPi0ForBToHadrons(path=path)
373  loadStdAllRhoPlus(path=path)
374 
375  def build_lists(self, path):
376  Bcuts = "Mbc > 5.2 and abs(deltaE) < 0.3"
377  ma.reconstructDecay("B0:B0toDrho_Kpipi -> D-:Kpipi rho+:all", Bcuts, 1, path=path)
378 
379  return ["B0:B0toDrho_Kpipi"]
380 
381 
382 @fancy_skim_header
384  """
385  Reconstructed decay modes:
386 
387  * :math:`B^{0}\\to D^{-} (\\to K_{\\rm S}^0 \\pi^-) \\rho^+`,
388 
389  Cuts applied:
390 
391  * ``1.8 < M_D < 1.9``
392  * ``0.47 < M_rho < 1.07``
393  * ``Mbc > 5.2``
394  * ``abs(deltaE) < 0.3``
395 
396  Note:
397  This skim uses `stdV0s.stdKshorts` and
398  `skim.standardlists.charm.loadStdDplus_Kspi`, where :math:`D^0` channels are defined, and
399  `skim.standardlists.lightmesons.loadStdAllRhoPlus`.
400  """
401 
402  __authors__ = ["Fernando Abudinen"]
403  __description__ = ""
404  __contact__ = __liaison__
405  __category__ = "physics, hadronic B to charm"
406 
407  ApplyHLTHadronCut = True
408  produce_on_tau_samples = False # retention is very close to zero on taupair
409 
410  def load_standard_lists(self, path):
411  stdPi("all", path=path)
412  stdKshorts(path=path)
413  loadPiForBtoHadrons(path=path)
414  loadStdDplus_Kspi(path=path)
415  loadStdPi0ForBToHadrons(path=path)
416  loadStdAllRhoPlus(path=path)
417 
418  def build_lists(self, path):
419  Bcuts = "Mbc > 5.2 and abs(deltaE) < 0.3"
420 
421  ma.reconstructDecay("B0:B0toDrho_Kspi -> D-:Kspi rho+:all", Bcuts, 1, path=path)
422 
423  return ["B0:B0toDrho_Kspi"]
424 
425 
426 @fancy_skim_header
428  """
429  Reconstructed decay modes:
430 
431  * :math:`B^{0}\\to D^{*-} (\\to \\overline{D}^{0} (\\to K^+ \\pi^-) \\pi^-) \\rho^+`,
432 
433  Cuts applied:
434 
435  * ``1.7 < M_D < 2.0``
436  * ``0.47 < M_rho < 1.07``
437  * ``DM_Dstar_D < 0.16``
438  * ``Mbc > 5.2``
439  * ``abs(deltaE) < 0.3``
440 
441  Note:
442  This skim uses `skim.standardlists.charm.loadStdD0_Kpi` and
443  `skim.standardlists.charm.loadStdDstarPlus_D0pi_Kpi` where :math:`D^0` channels are
444  defined, and `skim.standardlists.lightmesons.loadStdAllRhoPlus`.
445  """
446 
447  __authors__ = ["Fernando Abudinen"]
448  __description__ = ""
449  __contact__ = __liaison__
450  __category__ = "physics, hadronic B to charm"
451 
452  ApplyHLTHadronCut = True
453  produce_on_tau_samples = False # retention is very close to zero on taupair
454 
455  def load_standard_lists(self, path):
456  stdPi("all", path=path)
457  loadStdPi0ForBToHadrons(path=path)
458  loadStdAllRhoPlus(path=path)
459  loadPiForBtoHadrons(path=path)
460  loadKForBtoHadrons(path=path)
461  loadStdD0_Kpi(path=path)
462  loadStdDstarPlus_D0pi_Kpi(path=path)
463 
464  def build_lists(self, path):
465  Bcuts = "Mbc > 5.2 and abs(deltaE) < 0.3"
466  ma.reconstructDecay("B0:BtoDstarRho_D0pi_Kpi -> D*-:D0_Kpi rho+:all", Bcuts, 1, path=path)
467 
468  return ["B0:BtoDstarRho_D0pi_Kpi"]
469 
470 
471 @fancy_skim_header
473  """
474  Reconstructed decay modes:
475 
476  * :math:`B^{0}\\to D^{*-} (\\to \\overline{D}^{0}
477  (\\to K^+2\\pi^-\\pi^+, K^+\\pi^-\\pi^0)\\pi^-) \\rho^+`,
478 
479  Cuts applied:
480 
481  * ``1.7 < M_D < 2.0``
482  * ``0.47 < M_rho < 1.07``
483  * ``DM_Dstar_D < 0.16``
484  * ``Mbc > 5.2``
485  * ``abs(deltaE) < 0.3``
486 
487  Note:
488  This skim uses `skim.standardlists.charm.loadStdD0_Kpipi0`,
489  `skim.standardlists.charm.loadStdD0_Kpipipi`,
490  `skim.standardlists.charm.loadStdDstarPlus_D0pi_Kpipi0` and
491  `skim.standardlists.charm.loadStdDstarPlus_D0pi_Kpipipi` where :math:`D^0`
492  channels are defined, and `skim.standardlists.lightmesons.loadStdAllRhoPlus`.
493  """
494 
495  __authors__ = ["Fernando Abudinen"]
496  __description__ = ""
497  __contact__ = __liaison__
498  __category__ = "physics, hadronic B to charm"
499 
500  ApplyHLTHadronCut = True
501  produce_on_tau_samples = False # retention is very close to zero on taupair
502 
503  def load_standard_lists(self, path):
504  stdPi("all", path=path)
505  loadStdPi0ForBToHadrons(path=path)
506  loadStdAllRhoPlus(path=path)
507  loadPiForBtoHadrons(path=path)
508  loadKForBtoHadrons(path=path)
509  loadStdD0_Kpipi0(path=path)
510  loadStdD0_Kpipipi(path=path)
511  loadStdDstarPlus_D0pi_Kpipi0(path=path)
512  loadStdDstarPlus_D0pi_Kpipipi(path=path)
513 
514  def build_lists(self, path):
515  Bcuts = "Mbc > 5.2 and abs(deltaE) < 0.3"
516 
517  BsigChannels = [
518  "D*-:D0_Kpipipi rho+:all",
519  "D*-:D0_Kpipi0 rho+:all",
520  ]
521  BsigList = []
522  for chID, channel in enumerate(BsigChannels):
523  ma.reconstructDecay("B+:B0toDstarRho" + str(chID) + " -> " + channel, Bcuts, chID, path=path, allowChargeViolation=True)
524  BsigList.append("B+:B0toDstarRho" + str(chID))
525 
526  return BsigList
527 
528 
529 @fancy_skim_header
531  """
532  Skim list definitions for all charged B to charm 2 body decays.
533 
534  Reconstructed decay modes:
535 
536  * :math:`B^{+}\\to \\overline{D}^{0} (\\to K^+ \\pi^-) \\pi^+`,
537  * :math:`B^{+}\\to \\overline{D}^{0} (\\to K^- \\pi^+) \\pi^+`,
538  * :math:`B^{+}\\to \\overline{D}^{0} (\\to \\pi^+ \\pi^-) \\pi^+`,
539  * :math:`B^{+}\\to \\overline{D}^{0} (\\to K^+ K^-) \\pi^+`,
540  * :math:`B^{+}\\to \\overline{D}^{0} (\\to K^+ \\pi^-) K^+`,
541  * :math:`B^{+}\\to \\overline{D}^{0} (\\to K^- \\pi^+) K^+`,
542  * :math:`B^{+}\\to \\overline{D}^{0} (\\to \\pi^+ \\pi^-) K^+`,
543  * :math:`B^{+}\\to \\overline{D}^{0} (\\to K^+ K^-) K^+`,
544 
545  Cuts applied:
546 
547  * ``1.5 < M_D0 < 2.2``
548  * ``5.2 < Mbc``
549  * ``abs(deltaE) < 0.3``
550 
551  Note:
552  This skim uses `skim.standardlists.charm.loadD0_hh_loose`, where :math:`D^0`
553  channels are defined.
554  """
555 
556  __authors__ = ["Hulya Atmacan"]
557  __description__ = ""
558  __contact__ = __liaison__
559  __category__ = "physics, hadronic B to charm"
560 
561  ApplyHLTHadronCut = True
562  validation_sample = _VALIDATION_SAMPLE
563 
564  def load_standard_lists(self, path):
565  loadPiForBtoHadrons(path=path)
566  loadKForBtoHadrons(path=path)
567  loadD0_hh_loose(path=path)
568 
569  def build_lists(self, path):
570  Bcuts = "Mbc > 5.2 and abs(deltaE) < 0.3"
571 
572  BsigChannels = [
573  "anti-D0:hh pi+:GoodTrack",
574  "anti-D0:hh K+:GoodTrack"
575  ]
576  BsigList = []
577  for chID, channel in enumerate(BsigChannels):
578  ma.reconstructDecay("B+:BtoD0h_hh" + str(chID) + " -> " + channel, Bcuts, chID, path=path)
579  BsigList.append("B+:BtoD0h_hh" + str(chID))
580 
581  return BsigList
582 
583  def validation_histograms(self, path):
584  stdPi('all', path=path)
585  stdK('all', path=path)
586 
587  ma.reconstructDecay('D0 -> K-:all pi+:all', '1.84 < M < 1.89', path=path)
588  ma.reconstructDecay('B-:ch3 ->D0 K-:all', '5.24 < Mbc < 5.3 and abs(deltaE) < 0.15', path=path)
589 
590  # the variables that are printed out are: Mbc, deltaE and the daughter particle invariant masses.
591  ma.variablesToHistogram(
592  filename=f'{self}_Validation.root',
593  decayString='B-:ch3',
594  variables=[
595  ('Mbc', 100, 5.2, 5.3),
596  ('deltaE', 100, -1, 1),
597  ('daughter(0, InvM)', 100, 1.8, 1.9)], # D0 invariant mass
598  variables_2d=[
599  ('Mbc', 50, 5.23, 5.31, 'deltaE', 50, -0.7, 0.7)], path=path)
600 
601 
602 @fancy_skim_header
604  """
605  Skim list definitions for all charged B to charm 3 body decays.
606 
607  Reconstructed decay modes:
608 
609  * :math:`B^{+}\\to \\overline{D}^{0} (\\to K^+ \\pi^-) \\pi^+`,
610  * :math:`B^{+}\\to \\overline{D}^{0} (\\to K^+ \\pi^-) K^+`,
611 
612  Cuts applied:
613 
614  * ``1.7 < M_D0 < 2.0``
615  * ``Mbc > 5.2``
616  * ``abs(deltaE) < 0.5``
617 
618  Note:
619  This skim uses `skim.standardlists.charm.loadStdD0_Kpi`, where :math:`D^0`
620  channels are defined.
621  """
622 
623  __authors__ = ["Niharika Rout"]
624  __description__ = ""
625  __contact__ = __liaison__
626  __category__ = "physics, hadronic B to charm"
627 
628  ApplyHLTHadronCut = True
629 
630  def load_standard_lists(self, path):
631  loadPiForBtoHadrons(path=path)
632  loadKForBtoHadrons(path=path)
633  loadStdD0_Kpi(path=path)
634 
635  def build_lists(self, path):
636  Bcuts = "Mbc > 5.2 and abs(deltaE) < 0.5"
637 
638  BsigChannels = ["anti-D0:Kpi pi+:GoodTrack",
639  "anti-D0:Kpi K+:GoodTrack"
640  ]
641  BsigList = []
642  for chID, channel in enumerate(BsigChannels):
643  ma.reconstructDecay("B+:BtoD0h_Kpi" + str(chID) + " -> " + channel, Bcuts, chID, path=path)
644  BsigList.append("B+:BtoD0h_Kpi" + str(chID))
645 
646  return BsigList
647 
648 
649 @fancy_skim_header
651  """
652  Reconstructed decay modes:
653 
654  * :math:`B^{+}\\to \\overline{D}^{0} (\\to K^+ pi^- pi^- pi^+, \\to K^+ pi^- pi^0) \\pi^+`,
655  * :math:`B^{+}\\to \\overline{D}^{0} (\\to K^+ pi^- pi^- pi^+, \\to K^+ pi^- pi^0) K^+`,
656  * :math:`B^{+}\\to \\overline{D}^{*0} (\\to \\overline{D}^{0} (\\to K^+2\\pi^-\\pi^+, K^+\\pi^-\\pi^0)
657  \\pi^0) \\pi^+`
658  * :math:`B^{+}\\to \\overline{D}^{*0} (\\to \\overline{D}^{0} (\\to K^+2\\pi^-\\pi^+, K^+\\pi^-\\pi^0)
659  \\pi^0) \\K^+`
660 
661  Cuts applied:
662 
663  * ``1.7 < M_D0 < 2.0``
664  * ``Mbc > 5.2``
665  * ``abs(deltaE) < 0.3``
666 
667  Note:
668  This skim uses `skim.standardlists.charm.loadStdD0_Kpipipi` and
669  `skim.standardlists.charm.loadStdD0_Kpipi0`, where :math:`D^0` channels are
670  defined.
671  """
672 
673  __authors__ = ["Chiara La Licata"]
674  __description__ = ""
675  __contact__ = __liaison__
676  __category__ = "physics, hadronic B to charm"
677 
678  ApplyHLTHadronCut = True
679 
680  def load_standard_lists(self, path):
681  loadStdPi0ForBToHadrons(path=path)
682  loadPiForBtoHadrons(path=path)
683  loadKForBtoHadrons(path=path)
684  loadStdD0_Kpipi0(path=path)
685  loadStdD0_Kpipipi(path=path)
686  loadStdDstar0_D0pi0_Kpipipi(path=path)
687  loadStdDstar0_D0pi0_Kpipi0(path=path)
688 
689  def build_lists(self, path):
690  Bcuts = "Mbc > 5.2 and abs(deltaE) < 0.3"
691 
692  BsigChannels = ["anti-D0:Kpipipi pi+:GoodTrack",
693  "anti-D0:Kpipipi K+:GoodTrack",
694  "anti-D0:Kpipi0 pi+:GoodTrack",
695  "anti-D0:Kpipi0 K+:GoodTrack",
696  "anti-D*0:D0_Kpipipi pi+:GoodTrack",
697  "anti-D*0:D0_Kpipipi K+:GoodTrack",
698  "anti-D*0:D0_Kpipi0 pi+:GoodTrack",
699  "anti-D*0:D0_Kpipi0 K+:GoodTrack"
700  ]
701  BsigList = []
702  for chID, channel in enumerate(BsigChannels):
703  ma.reconstructDecay("B+:BtoD0h_Khh_Khpi0" + str(chID) + " -> " + channel, Bcuts, chID, path=path)
704  BsigList.append("B+:BtoD0h_Khh_Khpi0" + str(chID))
705 
706  ma.copyLists(outputListName="B+:BtoD0h_merged", inputListNames=BsigList, path=path)
707 
708  # Select only three random candidates
709  ma.rankByHighest(particleList="B+:BtoD0h_merged", variable="cos(mdstIndex)", numBest=3,
710  outputVariable="cosMdstIndex_rank", path=path)
711 
712  return ["B+:BtoD0h_merged"]
713 
714 
715 @fancy_skim_header
717  """
718  Reconstructed decay modes:
719 
720  * :math:`B^{+}\\to \\overline{D}^{0} (\\to K_{\\rm S}^0 K^+ \\pi^-) \\pi^+`,
721  * :math:`B^{+}\\to \\overline{D}^{0} (\\to K_{\\rm S}^0 K^- \\pi^+) \\pi^+`,
722  * :math:`B^{+}\\to \\overline{D}^{0} (\\to K_{\\rm S}^0 \\pi^+ \\pi^-) \\pi^+`,
723  * :math:`B^{+}\\to \\overline{D}^{0} (\\to K_{\\rm S}^0 K^+ K^-) \\pi^+`,
724  * :math:`B^{+}\\to \\overline{D}^{0} (\\to K_{\\rm S}^0 K^+ \\pi^-) K^+`,
725  * :math:`B^{+}\\to \\overline{D}^{0} (\\to K_{\\rm S}^0 K^- \\pi^+) K^+`,
726  * :math:`B^{+}\\to \\overline{D}^{0} (\\to K_{\\rm S}^0 \\pi^+ \\pi^-) K^+`,
727  * :math:`B^{+}\\to \\overline{D}^{0} (\\to K_{\\rm S}^0 K^+ K^-) K^+`,
728 
729  Cuts applied:
730 
731  * ``1.5 < M_D0 < 2.2``
732  * ``5.2 < Mbc``
733  * ``abs(deltaE) < 0.3``
734 
735  Note:
736  This skim uses `skim.standardlists.charm.loadD0_Kshh_loose`, where :math:`D^0`
737  channels are defined.
738  """
739 
740  __authors__ = ["Minakshi Nayak"]
741  __description__ = ""
742  __contact__ = __liaison__
743  __category__ = "physics, hadronic B to charm"
744 
745  ApplyHLTHadronCut = True
746  validation_sample = _VALIDATION_SAMPLE
747 
748  def load_standard_lists(self, path):
749  stdKshorts(path=path)
750  loadPiForBtoHadrons(path=path)
751  loadKForBtoHadrons(path=path)
752  loadD0_Kshh_loose(path=path)
753 
754  def build_lists(self, path):
755  Bcuts = "Mbc > 5.2 and abs(deltaE) < 0.3"
756 
757  BsigChannels = ["anti-D0:Kshh pi+:GoodTrack",
758  "anti-D0:Kshh K+:GoodTrack"
759  ]
760  BsigList = []
761  for chID, channel in enumerate(BsigChannels):
762  ma.reconstructDecay("B+:BtoD0h_Kshh" + str(chID) + " -> " + channel, Bcuts, chID, path=path)
763  BsigList.append("B+:BtoD0h_Kshh" + str(chID))
764 
765  return BsigList
766 
767  def validation_histograms(self, path):
768  stdPi('all', path=path)
769  stdK('all', path=path)
770 
771  ma.reconstructDecay('D0 -> K_S0:merged pi+:all pi-:all', '1.84 < M < 1.89', path=path)
772  ma.reconstructDecay('B-:ch3 ->D0 K-:all', '5.24 < Mbc < 5.3 and abs(deltaE) < 0.15', path=path)
773 
774  # the variables that are printed out are: Mbc, deltaE and the daughter particle invariant masses.
775 
776  ma.variablesToHistogram(
777  filename=f'{self}_Validation.root',
778  decayString='B-:ch3',
779  variables=[
780  ('Mbc', 100, 5.2, 5.3),
781  ('deltaE', 100, -1, 1),
782  ('daughter(0, InvM)', 100, 1.8, 1.9)], # D0 invariant mass
783  variables_2d=[
784  ('Mbc', 50, 5.23, 5.31, 'deltaE', 50, -0.7, 0.7)], path=path)
785 
786 
787 @fancy_skim_header
789  """
790  Reconstructed decay modes:
791 
792  * :math:`B^{+}\\to \\overline{D}^{0} (\\to K^+ \\pi^-) \\rho^+`,
793  * :math:`B^{+}\\to \\overline{D}^{*0} (\\to \\overline{D}^{0} (\\to K^+ \\pi^-) \\pi^0) \\rho^+`,
794 
795  Cuts applied:
796 
797  * ``1.7 < M_D0 < 2.0``
798  * ``0.47 < M_rho < 1.07``
799  * ``DM_Dstar_D < 0.16``
800  * ``Mbc > 5.2``
801  * ``abs(deltaE) < 0.3``
802 
803  Note:
804  This skim uses `skim.standardlists.charm.loadStdD0_Kpi` and
805  `skim.standardlists.charm.loadStdDstar0_D0pi0_Kpi`, where :math:`D^0` channels
806  are defined, and `skim.standardlists.lightmesons.loadStdAllRhoPlus`.
807  """
808 
809  __authors__ = ["Fernando Abudinen"]
810  __description__ = ""
811  __contact__ = __liaison__
812  __category__ = "physics, hadronic B to charm"
813 
814  ApplyHLTHadronCut = True
815 
816  def load_standard_lists(self, path):
817  stdPi("all", path=path)
818  loadStdPi0ForBToHadrons(path=path)
819  loadStdAllRhoPlus(path=path)
820  loadPiForBtoHadrons(path=path)
821  loadKForBtoHadrons(path=path)
822  loadStdD0_Kpi(path=path)
823  loadStdDstar0_D0pi0_Kpi(path=path)
824 
825  def build_lists(self, path):
826  Bcuts = "Mbc > 5.2 and abs(deltaE) < 0.3"
827 
828  BsigChannels = ["anti-D0:Kpi rho+:all",
829  "anti-D*0:D0_Kpi rho+:all"]
830  BsigList = []
831  for chID, channel in enumerate(BsigChannels):
832  ma.reconstructDecay("B+:BtoD0rho_Kpi" + str(chID) + " -> " + channel, Bcuts, chID, path=path)
833  BsigList.append("B+:BtoD0rho_Kpi" + str(chID))
834 
835  return BsigList
836 
837 
838 @fancy_skim_header
840  """
841  Reconstructed decay modes:
842 
843  * :math:`B^{+}\\to \\overline{D}^{0} (\\to K^+2\\pi^-\\pi^+, K^+\\pi^-\\pi^0) \\rho^+`
844  * :math:`B^{+}\\to \\overline{D}^{*0} (\\to \\overline{D}^{0} (\\to K^+2 \\pi^-
845  \\pi^+, K^+\\pi^-\\pi^0) \\pi^0) \\rho^+`
846 
847  Cuts applied:
848 
849  * ``1.7 < M_D0 < 2.0``
850  * ``DM_Dstar_D < 0.16``
851  * ``0.6 < M_rho < 0.9``
852  * ``cosHel_rho < 0.90``
853  * ``Mbc > 5.2``
854  * ``abs(deltaE) < 0.3``
855 
856  Note:
857  This skim uses `skim.standardlists.charm.loadStdD0_Kpipi0`,
858  `skim.standardlists.charm.loadStdD0_Kpipipi`,
859  `skim.standardlists.charm.loadStdDstar0_D0pi0_Kpipi0`, and
860  `skim.standardlists.charm.loadStdDstar0_D0pi0_Kpipipi`, where :math:`D^0`
861  channels are defined, and `skim.standardlists.lightmesons.loadStdAllRhoPlus`.
862 
863  Warning:
864  This skim saves only three randomly-chosen :math:`B^{+}` candidates in a
865  ``B+:BtoD0rho_merged`` list, since the candidate multiplicity of this skim is
866  very high.
867  """
868  __authors__ = ["Fernando Abudinen"]
869  __description__ = ""
870  __contact__ = __liaison__
871  __category__ = "physics, hadronic B to charm"
872 
873  ApplyHLTHadronCut = True
874 
875  def load_standard_lists(self, path):
876  stdPi("all", path=path)
877  loadStdPi0ForBToHadrons(path=path)
878  loadStdAllRhoPlus(path=path)
879  loadPiForBtoHadrons(path=path)
880  loadKForBtoHadrons(path=path)
881  loadStdD0_Kpipi0(path=path)
882  loadStdD0_Kpipipi(path=path)
883  loadStdDstar0_D0pi0_Kpipi0(path=path)
884  loadStdDstar0_D0pi0_Kpipipi(path=path)
885 
886  def build_lists(self, path):
887  Bcuts = "Mbc > 5.2 and abs(deltaE) < 0.3 and cosHelicityAngle(1,0) < 0.9 and 0.6 <= daughter(1,M) <= 0.9"
888 
889  BsigChannels = [
890  "anti-D0:Kpipipi rho+:all",
891  "anti-D0:Kpipi0 rho+:all",
892  "anti-D*0:D0_Kpipipi rho+:all",
893  "anti-D*0:D0_Kpipi0 rho+:all"
894  ]
895  BsigList = []
896  for chID, channel in enumerate(BsigChannels):
897  ma.reconstructDecay("B+:BtoD0rho_merged" + str(chID) + " -> " + channel, Bcuts, chID, path=path)
898  BsigList.append("B+:BtoD0rho_merged" + str(chID))
899 
900  ma.copyLists(outputListName="B+:BtoD0rho_merged", inputListNames=BsigList, path=path)
901 
902  # Select only three random candidates to save them as these channels have high multiplicity.
903  ma.rankByHighest(particleList="B+:BtoD0rho_merged", variable="cos(mdstIndex)", numBest=3,
904  outputVariable="cosMdstIndex_rank", path=path)
905 
906  return ["B+:BtoD0rho_merged"]
907 
908 
909 @fancy_skim_header
911  """
912  Reconstructed decay modes:
913 
914  * :math:`B^{0}\\to D^{+}(\\to K^- \\pi^+ \\pi^+) D^{-}(\\to K^+ \\pi^- \\pi^-)`
915  * :math:`B^{0}\\to D^{+}(\\to K^- \\pi^+ \\pi^+) D^{-}(\\to K_{\\rm S}^0 \\pi^-)`
916  * :math:`B^{0}\\to D^{+}(\\to K_{\\rm S}^0 \\pi^-) D^{-}(\\to K_{\\rm S}^0 \\pi^-)`
917 
918  Cuts applied:
919 
920  * ``Mbc > 5.2``
921  * ``abs(deltaE) < 0.3``
922  * ``1.8 < M_D < 1.9``
923 
924  Note:
925  This skim uses `skim.standardlists.charm.loadStdDplus_Kpipi` and
926  `skim.standardlists.charm.loadStdDplus_Kspi`, where :math:`D^-`
927  channel is defined.
928  """
929 
930  produce_on_tau_samples = False # retention is very close to zero on taupair
931 
932  __authors__ = ["Chiara La Licata"]
933  __description__ = ""
934  __contact__ = __liaison__
935  __category__ = "physics, hadronic B to charm"
936 
937  ApplyHLTHadronCut = True
938 
939  def load_standard_lists(self, path):
940  stdKshorts(path=path)
941  loadPiForBtoHadrons(path=path)
942  loadKForBtoHadrons(path=path)
943  loadStdDplus_Kpipi(path=path)
944  loadStdDplus_Kspi(path=path)
945 
946  def build_lists(self, path):
947  Bcuts = "5.2 < Mbc and abs(deltaE) < 0.3"
948  BsigChannels = [
949  "D+:Kpipi D-:Kpipi",
950  "D+:Kpipi D-:Kspi",
951  "D+:Kspi D-:Kspi"
952  ]
953 
954  BsigList = []
955  for chID, channel in enumerate(BsigChannels):
956  ma.reconstructDecay("B0:B0toDD" + str(chID) + " -> " + channel, Bcuts, chID, path=path)
957  BsigList.append("B0:B0toDD" + str(chID))
958 
959  return BsigList
960 
961 
962 @fancy_skim_header
964  """
965  Reconstructed decay modes:
966 
967  * :math:`B^{0}\\to \\overline{D}^{*-} (\\to \\overline{D}^{0}
968  (\\to K^+ \\pi^-, \\to K^+ \\pi^- \\pi^- \\pi^+, K^+ \\pi^- \\pi^0) \\pi^-) \\D^+(\\to K^- \\pi^+ \\pi^+)`
969  * :math:`B^{0}\\to \\overline{D}^{*-} (\\to D^{-} \\pi^0) \\D^+(\\to K^- \\pi^+ \\pi^+)`
970 
971  Cuts applied:
972 
973  * ``Mbc > 5.2``
974  * ``abs(deltaE) < 0.3``
975  * ``DM_Dstar_D < 0.16``
976  * ``1.8 < M_D < 1.9``
977  """
978 
979  __authors__ = ["Chiara La Licata"]
980  __description__ = ""
981  __contact__ = __liaison__
982  __category__ = "physics, hadronic B to charm"
983 
984  ApplyHLTHadronCut = True
985  produce_on_tau_samples = False # retention is very close to zero on taupair
986 
987  def load_standard_lists(self, path):
988  loadStdPi0ForBToHadrons(path=path)
989  loadPiForBtoHadrons(path=path)
990  loadKForBtoHadrons(path=path)
991  loadStdD0_Kpi(path=path)
992  loadStdD0_Kpipi0(path=path)
993  loadStdD0_Kpipipi(path=path)
994  loadStdDplus_Kpipi(path=path)
995  loadStdDstarPlus_D0pi_Kpi(path=path)
996  loadStdDstarPlus_D0pi_Kpipipi(path=path)
997  loadStdDstarPlus_D0pi_Kpipi0(path=path)
998  loadStdDstarPlus_Dpi0_Kpipi(path=path)
999 
1000  def build_lists(self, path):
1001  Bcuts = "5.2 < Mbc and abs(deltaE) < 0.3"
1002  BsigChannels = [
1003  "D*+:D0_Kpi D-:Kpipi",
1004  "D*+:D0_Kpipipi D-:Kpipi",
1005  "D*+:D0_Kpipi0 D-:Kpipi",
1006  "D*+:Dpi0_Kpipi D-:Kpipi"
1007  ]
1008 
1009  BsigList = []
1010  for chID, channel in enumerate(BsigChannels):
1011  ma.reconstructDecay("B0:B0toDstarD" + str(chID) + " -> " + channel, Bcuts, chID, path=path)
1012  BsigList.append("B0:B0toDstarD" + str(chID))
1013 
1014  return BsigList
1015 
1016 
1017 @fancy_skim_header
1019  """
1020  Reconstructed decay modes:
1021 
1022  * :math:`B^{0}\\to \\bar{D}^{0} (\\to K^+ \\pi^- \\pi^0) \\pi^0`
1023 
1024  Cuts applied:
1025 
1026  * ``Mbc > 5.2``
1027  * ``abs(deltaE) < 0.5``
1028 
1029  Note:
1030  This skim uses `skim.standardlists.charm.loadStdD0_Kpipi0`, where the
1031  :math:`\\bar{D}^{0}` channel is defined.
1032  """
1033 
1034  __authors__ = ["Francis Pham"]
1035  __description__ = ""
1036  __contact__ = __liaison__
1037  __category__ = "physics, hadronic B to charm"
1038 
1039  ApplyHLTHadronCut = True
1040  produce_on_tau_samples = False # retention is very close to zero on taupair
1041 
1042  def load_standard_lists(self, path):
1043  loadStdPi0ForBToCharmless(path=path)
1044  loadStdVeryLooseTracks('K', path=path)
1045  loadStdVeryLooseTracks('pi', path=path)
1046  loadCharmlessD0_Kpipi0(path=path)
1047 
1048  def build_lists(self, path):
1049  Bcuts = "5.2 < Mbc and abs(deltaE) < 0.5"
1050 
1051  ma.reconstructDecay("B0:D0Kpipi0_pi0 -> anti-D0:Kpipi0_loose pi0:charmlessFit", Bcuts, path=path)
1052 
1053  return ["B0:D0Kpipi0_pi0"]
def build_lists(self, path)
Definition: btocharm.py:1048
def load_standard_lists(self, path)
Definition: btocharm.py:1042
def build_lists(self, path)
Definition: btocharm.py:946
def load_standard_lists(self, path)
Definition: btocharm.py:939
def build_lists(self, path)
Definition: btocharm.py:211
def load_standard_lists(self, path)
Definition: btocharm.py:206
def build_lists(self, path)
Definition: btocharm.py:250
def load_standard_lists(self, path)
Definition: btocharm.py:244
def build_lists(self, path)
Definition: btocharm.py:375
def load_standard_lists(self, path)
Definition: btocharm.py:367
def build_lists(self, path)
Definition: btocharm.py:418
def load_standard_lists(self, path)
Definition: btocharm.py:410
def build_lists(self, path)
Definition: btocharm.py:1000
def load_standard_lists(self, path)
Definition: btocharm.py:987
def build_lists(self, path)
Definition: btocharm.py:288
def load_standard_lists(self, path)
Definition: btocharm.py:282
def build_lists(self, path)
Definition: btocharm.py:464
def load_standard_lists(self, path)
Definition: btocharm.py:455
def build_lists(self, path)
Definition: btocharm.py:635
def load_standard_lists(self, path)
Definition: btocharm.py:630
def build_lists(self, path)
Definition: btocharm.py:689
def load_standard_lists(self, path)
Definition: btocharm.py:680
def build_lists(self, path)
Definition: btocharm.py:754
def validation_histograms(self, path)
Definition: btocharm.py:767
def load_standard_lists(self, path)
Definition: btocharm.py:748
def build_lists(self, path)
Definition: btocharm.py:79
def validation_histograms(self, path)
Definition: btocharm.py:91
def load_standard_lists(self, path)
Definition: btocharm.py:72
def build_lists(self, path)
Definition: btocharm.py:147
def validation_histograms(self, path)
Definition: btocharm.py:160
def load_standard_lists(self, path)
Definition: btocharm.py:138
def build_lists(self, path)
Definition: btocharm.py:569
def validation_histograms(self, path)
Definition: btocharm.py:583
def load_standard_lists(self, path)
Definition: btocharm.py:564
def build_lists(self, path)
Definition: btocharm.py:825
def load_standard_lists(self, path)
Definition: btocharm.py:816
def load_standard_lists(self, path)
Definition: btocharm.py:875