Belle II Software  release-06-02-00
leptonic.py
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3 
4 
11 
12 """(Semi-)Leptonic Working Group Skims for leptonic analyses.
13 """
14 
15 import modularAnalysis as ma
16 from skim import BaseSkim, fancy_skim_header
17 from stdCharged import stdE, stdMu
18 from variables import variables as vm
19 
20 __liaison__ = "Shanette De La Motte <shanette.delamotte@adelaide.edu.au>"
21 _VALIDATION_SAMPLE = "mdst14.root"
22 
23 
24 @fancy_skim_header
26  """
27  Reconstructed decays
28  * :math:`B^- \\to e^-`
29  * :math:`B^- \\to \\mu^-`
30 
31  Cuts applied
32  * :math:`p_{\\ell}^{*} > 2\\,\\text{GeV}` in CMS Frame
33  * :math:`\\text{electronID_noTOP} > 0.5`
34  * :math:`\\text{muonID} > 0.5`
35  * :math:`n_{\\text{tracks}} \\geq 3`
36  """
37 
38  __authors__ = ["Phillip Urquijo"]
39  __contact__ = __liaison__
40  __description__ = (
41  "Skim for leptonic analyses, "
42  ":math:`B_{\\text{sig}}^-\\to\\ell\\nu`, where :math:`\\ell=e,\\mu`"
43  )
44  __category__ = "physics, leptonic"
45 
46  validation_sample = _VALIDATION_SAMPLE
47 
48  def load_standard_lists(self, path):
49  stdE("all", path=path)
50  stdMu("all", path=path)
51 
52  def build_lists(self, path):
53  ma.cutAndCopyList(
54  "e-:LeptonicUntagged",
55  "e-:all",
56  "useCMSFrame(p) > 2.0 and electronID_noTOP > 0.5",
57  True,
58  path=path,
59  )
60  ma.cutAndCopyList(
61  "mu-:LeptonicUntagged",
62  "mu-:all",
63  "useCMSFrame(p) > 2.0 and muonID > 0.5",
64  True,
65  path=path,
66  )
67  ma.reconstructDecay("B-:LeptonicUntagged_0 -> e-:LeptonicUntagged", "", 1, path=path)
68  ma.reconstructDecay("B-:LeptonicUntagged_1 -> mu-:LeptonicUntagged", "", 2, path=path)
69  ma.applyCuts("B-:LeptonicUntagged_0", "nTracks>=3", path=path)
70  ma.applyCuts("B-:LeptonicUntagged_1", "nTracks>=3", path=path)
71  return ["B-:LeptonicUntagged_0", "B-:LeptonicUntagged_1"]
72 
73  def validation_histograms(self, path):
74  # NOTE: the validation package is not part of the light releases, so this import
75  # must be made here rather than at the top of the file.
76  from validation_tools.metadata import create_validation_histograms
77 
78  ma.cutAndCopyLists("B-:LeptonicUntagged", ["B-:LeptonicUntagged_0", "B-:LeptonicUntagged_1"], "", path=path)
79 
80  ma.buildRestOfEvent("B-:LeptonicUntagged", path=path)
81  ma.appendROEMask(
82  "B-:LeptonicUntagged",
83  "basic",
84  "pt>0.05 and -2<dr<2 and -4.0<dz<4.0",
85  "E>0.05",
86  path=path,
87  )
88  vm.addAlias("d0_p", "daughter(0,p)")
89  vm.addAlias("d0_electronID_noTOP", "daughter(0,electronID_noTOP)")
90  vm.addAlias("d0_muonID", "daughter(0,muonID)")
91  vm.addAlias("MissP", "weMissP(basic,0)")
92 
93  histogramFilename = f"{self}_Validation.root"
94  contact = __liaison__
95 
96  create_validation_histograms(
97  rootfile=histogramFilename,
98  particlelist="B-:LeptonicUntagged",
99  variables_1d=[
100  ("Mbc", 100, 4.0, 5.3, "Mbc", contact, "", ""),
101  ("d0_p", 100, 0, 5.2, "Signal-side lepton momentum", contact, "", ""),
102  ("d0_electronID_noTOP", 100, 0, 1, "electronID_noTOP of signal-side lepton",
103  contact, "", ""),
104  ("d0_muonID", 100, 0, 1, "electronID_noTOP of signal-side lepton", contact,
105  "", ""),
106  ("R2", 100, 0, 1, "R2", contact, "", ""),
107  ("MissP", 100, 0, 5.3, "Missing momentum of event (CMS frame)", contact,
108  "", ""),
109  ],
110  variables_2d=[
111  ("deltaE", 100, -5, 5, "Mbc", 100, 4.0, 5.3, "Mbc vs deltaE", contact,
112  "", "")
113  ],
114  path=path,
115  )
116 
117 
118 @fancy_skim_header
120  """
121  Reconstructed decays
122  * :math:`B\\overline{B} \\to l^+l^-`
123  * :math:`B\\overline{B} \\to l^+l^+`
124  * :math:`B\\overline{B} \\to l^-l^-`
125  """
126  __authors__ = ["Alessandro Gaz, Chiara La Licata"]
127  __contact__ = __liaison__
128  __description__ = (
129  "Inclusive dilepton skim"
130  )
131  __category__ = "physics, leptonic"
132 
133  NoisyModules = ["EventShapeCalculator"]
134 
135  def load_standard_lists(self, path):
136  stdE("all", path=path)
137  stdMu("all", path=path)
138 
139  def build_lists(self, path):
140  ma.cutAndCopyList(
141  "e+:pid",
142  "e+:all",
143  "abs(d0) < 1 and abs(z0) < 4 and p > 1.2 and electronID_noTOP > 0.5",
144  True,
145  path=path,
146  )
147  ma.cutAndCopyList(
148  "mu+:pid",
149  "mu+:all",
150  "abs(d0) < 1 and abs(z0) < 4 and p > 1.2 and muonID > 0.5",
151  True,
152  path=path,
153  )
154 
155  ma.buildEventShape(
156  inputListNames=[],
157  default_cleanup=True,
158  allMoments=False,
159  cleoCones=True,
160  collisionAxis=True,
161  foxWolfram=True,
162  harmonicMoments=True,
163  jets=True,
164  sphericity=True,
165  thrust=True,
166  checkForDuplicates=False,
167  path=path)
168 
169  path = self.skim_event_cutsskim_event_cuts('sphericity > 0.18 and nTracks > 3', path=path)
170 
171  ma.reconstructDecay('Upsilon(4S):ee -> e+:pid e-:pid', 'M < 15', path=path)
172  ma.reconstructDecay('Upsilon(4S):emu -> e+:pid mu-:pid', 'M < 15', path=path)
173  ma.reconstructDecay('Upsilon(4S):mumu -> mu+:pid mu-:pid', 'M < 15', path=path)
174 
175  ma.reconstructDecay('Delta++:ee -> e+:pid e+:pid', 'M < 15', path=path)
176  ma.reconstructDecay('Delta++:emu -> e+:pid mu+:pid', 'M < 15', path=path)
177  ma.reconstructDecay('Delta++:mumu -> mu+:pid mu+:pid', 'M < 15', path=path)
178 
179  ma.copyLists(outputListName='Upsilon(4S):ll',
180  inputListNames=['Upsilon(4S):ee', 'Upsilon(4S):emu', 'Upsilon(4S):mumu'],
181  path=path)
182 
183  ma.copyLists(outputListName='Delta++:ll',
184  inputListNames=['Delta++:ee', 'Delta++:emu', 'Delta++:mumu'],
185  path=path)
186 
187  return ["Upsilon(4S):ll", "Delta++:ll"]
def build_lists(self, path)
Definition: leptonic.py:52
def validation_histograms(self, path)
Definition: leptonic.py:73
def load_standard_lists(self, path)
Definition: leptonic.py:48
def build_lists(self, path)
Definition: leptonic.py:139
def load_standard_lists(self, path)
Definition: leptonic.py:135
def skim_event_cuts(self, cut, *path)
Definition: core.py:272