Belle II Software  release-05-01-25
quarkonium.py
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3 
4 """ Skim list building functions for quarkonium analyses: bottomonium, charmonium, resonance """
5 
6 __authors__ = [
7  "Stefano Spataro"
8  "Sen Jia"
9  "..."
10 ]
11 
12 import modularAnalysis as ma
13 from skimExpertFunctions import BaseSkim, fancy_skim_header
14 from stdCharged import stdE, stdMu, stdPi
15 from stdPhotons import stdPhotons
16 from stdV0s import stdLambdas
17 from variables import variables as v
18 
19 __liaison__ = "Sen Jia <jiasen@buaa.edu.cn>"
20 
21 
22 @fancy_skim_header
24  """
25  Reconstructed decay modes:
26 
27  * ``eta_b -> gamma gamma``
28 
29  Selection criteria:
30 
31  * ``2 std photon with E > 3.5 GeV``
32  * ``7 < M(eta_b) < 10 GeV/c^2``
33  * ``foxWolframR2 < 0.995``
34  """
35 
36  __authors__ = ["Stefano Spataro", "Sen Jia"]
37  __description__ = ""
38  __contact__ = __liaison__
39  __category__ = "physics, quarkonium"
40 
41  def load_standard_lists(self, path):
42  stdPhotons("loose", path=path)
43 
44  def build_lists(self, path):
45  # create and fill hard photon
46  ma.fillParticleList(decayString="pi+:BottomoniumEtab_eventshape", cut="pt > 0.1", path=path)
47  ma.fillParticleList(decayString="gamma:BottomoniumEtab_eventshape", cut="E > 0.1", path=path)
48 
49  ma.buildEventShape(inputListNames=["pi+:BottomoniumEtab_eventshape", "gamma:BottomoniumEtab_eventshape"],
50  allMoments=False,
51  foxWolfram=True,
52  harmonicMoments=False,
53  cleoCones=False,
54  thrust=False,
55  collisionAxis=False,
56  jets=False,
57  sphericity=False,
58  checkForDuplicates=False,
59  path=path)
60 
61  ma.cutAndCopyList("gamma:hard", "gamma:loose", "E>3.5", path=path)
62  ma.applyCuts("gamma:hard", "foxWolframR2 < 0.995", path=path)
63 
64  # the requirement of 7 < M(eta_b) < 10 GeV/c2
65  Etabcuts = "M > 7 and M < 10"
66 
67  # eta_b candidates are reconstructed
68  Etab_Channels = ["gamma:hard gamma:hard"]
69 
70  # define the eta_b decay list
71  EtabList = []
72 
73  # reconstruct the decay eta_b -> gamma gamma
74  for chID, channel in enumerate(Etab_Channels):
75  ma.reconstructDecay("eta_b:all" + str(chID) + " -> " + channel, Etabcuts, chID, path=path)
76  EtabList.append("eta_b:all" + str(chID))
77 
78  self.SkimLists = EtabList
79 
80 
81 @fancy_skim_header
83  """
84  Reconstructed decay modes:
85 
86  * Y(1S,2S) -> l^+ l^{-} (l = e or mu)
87 
88  Selection criteria:
89 
90  * 2 tracks with momentum ranging between ``3.5 < p < 15``
91  * At least 1 track ``p < 1.5`` or 1 std photon with ``E > 150 MeV``
92  * ``M(Y(1S,2S)) > 8 GeV/c^2``
93  * ``foxWolframR2 < 0.995``
94  """
95  __authors__ = ["Stefano Spataro", "Sen Jia"]
96  __description__ = ""
97  __contact__ = __liaison__
98  __category__ = "physics, quarkonium"
99 
100  def load_standard_lists(self, path):
101  stdPhotons("loose", path=path)
102 
103  def build_lists(self, path):
104  Ycuts = ""
105  # create and fill e/mu/pi/photon ParticleLists
106  ma.fillParticleList("mu+:BottomoniumUpsilon", "p<15 and p>3.5", path=path)
107  ma.fillParticleList("e+:BottomoniumUpsilon", "p<15 and p>3.5", path=path)
108  ma.fillParticleList("pi+:BottomoniumUpsilon", "p<1.5 and pt>0.05", path=path)
109  ma.cutAndCopyList("gamma:soft", "gamma:loose", "E>0.15", path=path)
110 
111  # Y(1S,2S) are reconstructed with e^+ e^- or mu^+ mu^-
112  ma.reconstructDecay("Upsilon:ee -> e+:BottomoniumUpsilon e-:BottomoniumUpsilon", "M > 8", path=path)
113  ma.reconstructDecay("Upsilon:mumu -> mu+:BottomoniumUpsilon mu-:BottomoniumUpsilon", "M > 8", path=path)
114  ma.copyLists("Upsilon:all", ["Upsilon:ee", "Upsilon:mumu"], path=path)
115 
116  # require foxWolframR2 < 0.995
117  ma.fillParticleList(decayString="pi+:BottomoniumUpsilon_eventshape", cut="pt > 0.1", path=path)
118  ma.fillParticleList(decayString="gamma:BottomoniumUpsilon_eventshape", cut="E > 0.1", path=path)
119 
120  ma.buildEventShape(inputListNames=["pi+:BottomoniumUpsilon_eventshape", "gamma:BottomoniumUpsilon_eventshape"],
121  allMoments=False,
122  foxWolfram=True,
123  harmonicMoments=False,
124  cleoCones=False,
125  thrust=False,
126  collisionAxis=False,
127  jets=False,
128  sphericity=False,
129  checkForDuplicates=False,
130  path=path)
131 
132  ma.applyCuts("Upsilon:all", "foxWolframR2 < 0.995", path=path)
133 
134  # Y(1S,2S) with pi+ or photon are reconstructed
135  Upsilon_Channels = ["Upsilon:all pi+:BottomoniumUpsilon",
136  "Upsilon:all gamma:soft"]
137 
138  # define the Y(1S,2S) decay channel list
139  UpsilonList = []
140 
141  # reconstruct the decay channel
142  for chID, channel in enumerate(Upsilon_Channels):
143  ma.reconstructDecay("junction:all" + str(chID) + " -> " + channel, Ycuts, chID, path=path, allowChargeViolation=True)
144  UpsilonList.append("junction:all" + str(chID))
145 
146  # reture the list
147  self.SkimLists = UpsilonList
148 
149  # *two* sets of validation scripts defined.
150 
151 
152 @fancy_skim_header
154  """
155  Reconstructed decay modes:
156 
157  * J/psi -> l^+ l^- (l = e or mu)
158  * psi(2S) -> l^+ l^- (l = e or mu)
159 
160  Selection criteria:
161 
162  * 2 tracks with electronID > 0.1 or muonID > 0.1 and 2.7 < M < 4.
163  Track-quality requirements are not applied.
164  """
165  __authors__ = ["Kirill Chilikin"]
166  __description__ = "Selection of J/psi and psi(2S) via leptonic decays."
167  __contact__ = __liaison__
168  __category__ = "physics, quarkonium"
169 
170  def load_standard_lists(self, path):
171  stdMu('loosepid', path=path)
172  stdPhotons('all', path=path)
173 
174  def build_lists(self, path):
175 
176  # Electron list. Exclude TOP for release 5.
177  ma.fillParticleList('e+:loosepid', 'electronID_noTOP > 0.1', path=path)
178 
179  # Mass cuts.
180  jpsi_mass_cut = '2.85 < M < 3.3'
181  psi2s_mass_cut = '3.45 < M < 3.9'
182 
183  # Electrons with bremsstrahlung correction.
184  # Use both correction algorithms as well as uncorrected electrons
185  # to allow for algorithm comparison in analysis.
186  # The recommeneded list for further reconstruction is J/psi:eebrems.
187  # The estimated ratio of efficiencies in B decays in release 5.1.5 is
188  # 1.00 (J/psi:eebrems) : 0.95 (J/psi:eebrems2) : 0.82 (J/psi:ee).
189  ma.correctBremsBelle('e+:brems', 'e+:loosepid', 'gamma:all',
190  minimumEnergy=0.001, angleThreshold=0.05,
191  path=path)
192  ma.correctBrems('e+:brems2', 'e+:loosepid', 'gamma:all', path=path)
193 
194  # Reconstruct J/psi or psi(2S).
195  ma.reconstructDecay('J/psi:ee -> e+:loosepid e-:loosepid',
196  jpsi_mass_cut, path=path)
197  ma.reconstructDecay('psi(2S):ee -> e+:loosepid e-:loosepid',
198  psi2s_mass_cut, path=path)
199 
200  ma.reconstructDecay('J/psi:eebrems -> e+:brems e-:brems',
201  jpsi_mass_cut, path=path)
202  ma.reconstructDecay('psi(2S):eebrems -> e+:brems e-:brems',
203  psi2s_mass_cut, path=path)
204 
205  ma.reconstructDecay('J/psi:eebrems2 -> e+:brems2 e-:brems2',
206  jpsi_mass_cut, path=path)
207  ma.reconstructDecay('psi(2S):eebrems2 -> e+:brems2 e-:brems2',
208  psi2s_mass_cut, path=path)
209 
210  ma.reconstructDecay('J/psi:mumu -> mu+:loosepid mu-:loosepid',
211  jpsi_mass_cut, path=path)
212  ma.reconstructDecay('psi(2S):mumu -> mu+:loosepid mu-:loosepid',
213  psi2s_mass_cut, path=path)
214 
215  # Return the lists.
216  self.SkimLists = ['J/psi:ee', 'psi(2S):ee',
217  'J/psi:eebrems', 'psi(2S):eebrems',
218  'J/psi:eebrems2', 'psi(2S):eebrems2',
219  'J/psi:mumu', 'psi(2S):mumu']
220 
221 
222 @fancy_skim_header
224  """
225  Reconstructed decay
226  * :math:`\\Lambda \\to p \\pi^-` (and charge conjugate)
227 
228  Selection criteria:
229  * proton
230  ``protonID > 0.1``
231  * Lambda:
232  ``cosAngleBetweenMomentumAndVertexVector > 0.99``
233  ``flightDistance/flightDistanceErr > 3.``
234  * ``0.6 < p,proton/p,Lambda < 1.0 GeV/c``
235 
236  """
237  __authors__ = ["Bianca Scavino"]
238  __description__ = "Inclusive Lambda skim"
239  __contact__ = __liaison__
240  __category__ = "physics, quarkonium"
241 
242  def load_standard_lists(self, path):
243  stdLambdas(path=path)
244 
245  def build_lists(self, path):
246 
247  # Add useful alias
248  v.addAlias("protonID_proton", "daughter(0, protonID)")
249  v.addAlias("momRatio_protonLambda", "formula(daughter(0, p)/p)")
250  v.addAlias('flightSignificance', 'formula(flightDistance/flightDistanceErr)')
251 
252  # Apply selection to Lambdas
253  ma.applyCuts("Lambda0:merged", "cosAngleBetweenMomentumAndVertexVector > 0.99", path=path)
254  ma.applyCuts("Lambda0:merged", "0.6 < momRatio_protonLambda < 1.", path=path)
255  ma.applyCuts("Lambda0:merged", "flightSignificance > 3.", path=path)
256  ma.applyCuts("Lambda0:merged", "protonID_proton > 0.1", path=path)
257 
258  # Return the lists.
259  self.SkimLists = ["Lambda0:merged"]
skim.quarkonium.CharmoniumPsi
Definition: quarkonium.py:153
skim.quarkonium.BottomoniumUpsilon.build_lists
def build_lists(self, path)
Definition: quarkonium.py:103
stdPhotons
Definition: stdPhotons.py:1
skim.quarkonium.BottomoniumEtabExclusive
Definition: quarkonium.py:23
skim.quarkonium.BottomoniumEtabExclusive.load_standard_lists
def load_standard_lists(self, path)
Definition: quarkonium.py:41
skim.quarkonium.BottomoniumEtabExclusive.SkimLists
SkimLists
Definition: quarkonium.py:78
skim.quarkonium.CharmoniumPsi.SkimLists
SkimLists
Definition: quarkonium.py:216
skim.quarkonium.BottomoniumUpsilon.SkimLists
SkimLists
Definition: quarkonium.py:147
skim.quarkonium.InclusiveLambda.load_standard_lists
def load_standard_lists(self, path)
Definition: quarkonium.py:242
skimExpertFunctions.BaseSkim
Definition: skimExpertFunctions.py:504
skim.quarkonium.BottomoniumUpsilon
Definition: quarkonium.py:82
skim.quarkonium.CharmoniumPsi.build_lists
def build_lists(self, path)
Definition: quarkonium.py:174
skim.quarkonium.InclusiveLambda
Definition: quarkonium.py:223
skim.quarkonium.InclusiveLambda.build_lists
def build_lists(self, path)
Definition: quarkonium.py:245
skim.quarkonium.BottomoniumUpsilon.load_standard_lists
def load_standard_lists(self, path)
Definition: quarkonium.py:100
skim.quarkonium.CharmoniumPsi.load_standard_lists
def load_standard_lists(self, path)
Definition: quarkonium.py:170
skim.quarkonium.BottomoniumEtabExclusive.build_lists
def build_lists(self, path)
Definition: quarkonium.py:44
skim.quarkonium.InclusiveLambda.SkimLists
SkimLists
Definition: quarkonium.py:259