Belle II Software  release-06-00-14
tdcpv.py
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3 
4 
11 
12 import modularAnalysis as ma
13 from skim.standardlists.dileptons import (loadStdJpsiToee_noTOP, loadStdJpsiTomumu,
14  loadStdPsi2s2lepton)
15 from skim.standardlists.lightmesons import (loadStdSkimHighEffTracks,
16  loadStdSkimHighEffPhi, loadStdSkimHighEffEtaPrime,
17  loadStdSkimHighEffEta, loadStdSkimHighEffKstar0,
18  loadStdSkimHighEffRho0, loadStdSkimHighEffOmega,
19  loadStdSkimHighEffF_0)
20 
21 from skim import BaseSkim, fancy_skim_header
22 from stdCharged import stdE, stdK, stdMu, stdPi
23 from stdPhotons import stdPhotons
24 from stdPi0s import loadStdSkimPi0, stdPi0s, loadStdSkimHighEffPi0
25 from stdV0s import stdKshorts
26 from variables import variables as vm
27 from stdKlongs import stdKlongs
28 
29 __authors__ = [
30  "Chiara La Licata <chiara.lalicata@ts.infn.it>",
31  "Stefano Lacaprara <stefano.lacaprara@pd.infn.it>"
32 ]
33 
34 # __liaison__ = "Chiara La Licata <chiara.lalicata@ts.infn.it>"
35 __liaison__ = "Yoshiyuki ONUKI <onuki@hep.phys.s.u-tokyo.ac.jp>"
36 _VALIDATION_SAMPLE = "mdst14.root"
37 
38 
39 @fancy_skim_header
41  """
42  **Physics channels**: bd/u → qqs
43 
44  **Decay Channels**:
45 
46  * ``B0 -> phi K_S0``
47  * ``B0 -> eta K_S0``
48  * ``B0 -> eta' K_S0``
49  * ``B0 -> eta K*``
50  * ``B0 -> eta' K*``
51  * ``B0 -> K_S0 K_S0 K_S0``
52  * ``B0 -> pi0 K_S0``
53  * ``B0 -> rho0 K_S0``
54  * ``B0 -> omega K_S0``
55  * ``B0 -> f_0 K_S0``
56  * ``B0 -> pi0 pi0 K_S0``
57  * ``B0 -> phi K_S0 pi0``
58  * ``B0 -> pi+ pi- K_S0``
59  * ``B0 -> pi+ pi- K_S0 gamma``
60  * ``B0 -> pi0 K_S0 gamma``
61  * ``B0 -> pi0 pi0 K_S0``
62  * ``B0 -> phi K_S0 pi0``
63  * ``B0 -> pi+ pi- K_S0``
64  * ``B0 -> pi+ pi- K_S0 gamma``
65  * ``B0 -> pi0 K_S0 gamma``
66  * ``B+ -> eta' K+``
67  * ``B+ -> phi K+``
68 
69  **Particle lists used**:
70 
71  * ``phi:SkimHighEff``
72  * ``eta':SkimHighEff``
73  * ``eta:SkimHighEff``
74  * ``pi0:eff40_May2020``
75  * ``pi0:skim``
76  * ``pi0:SkimHighEff``
77  * ``rho0:SkimHighEff``
78  * ``omega:SkimHighEff``
79  * ``f_0:SkimHighEff``
80  * ``pi+:SkimHighEff``
81  * ``K+:SkimHighEff``
82  * ``omega:SkimHighEff``
83  * ``K*0:SkimHighEff``
84  * ``gamma:E15 , cut : 1.4 < E < 4``
85  * ``gamma:ECMS16 , cut : 1.6 < useCMSFrame(E)``
86  * ``K_S0:merged``
87  * ``K+:1%``
88 
89  **Cuts used**:
90 
91  * ``SkimHighEff tracks thetaInCDCAcceptance AND chiProb > 0 AND abs(dr) < 0.5 AND abs(dz) < 3 and PID>0.01``
92  * ``5.2 < Mbc < 5.29``
93  * ``abs(deltaE) < 0.5``
94  * ``nCleanedECLClusters(0.296706 < theta < 2.61799 and E>0.2)>1``,
95  * ``E_ECL_TDCPV<9``
96  """
97 
98  __authors__ = ["Reem Rasheed", "Chiara La Licata", "Stefano Lacaprara"]
99  __description__ = "Skim for time-dependent CP violation analysis b->qqs decays"
100  __contact__ = __liaison__
101  __category__ = "physics, TDCPV"
102 
103  ApplyHLTHadronCut = True
104  validation_sample = _VALIDATION_SAMPLE
105 
106  def load_standard_lists(self, path):
107  stdK("all", path=path)
108  stdPi("all", path=path)
109  stdPhotons("all", path=path, loadPhotonBeamBackgroundMVA=False)
110  loadStdSkimHighEffTracks('pi', path=path)
111  loadStdSkimHighEffTracks('K', path=path)
112  loadStdSkimPi0(path=path)
113  loadStdSkimHighEffPi0(path=path)
114  stdKshorts(path=path)
115  stdPi0s("eff40_May2020", path=path, loadPhotonBeamBackgroundMVA=False)
116 
117  loadStdSkimHighEffPhi(path=path)
118  loadStdSkimHighEffEta(path=path)
119  loadStdSkimHighEffEtaPrime(path=path)
120  loadStdSkimHighEffKstar0(path=path)
121  loadStdSkimHighEffRho0(path=path)
122  loadStdSkimHighEffOmega(path=path)
123  loadStdSkimHighEffF_0(path=path)
124 
125  def additional_setup(self, path):
126  ma.cutAndCopyList('gamma:E15', 'gamma:all', '1.4<E<4', path=path)
127  ma.cutAndCopyList('gamma:ECMS16', 'gamma:all', '1.6<useCMSFrame(E)', path=path)
128 
129  def build_lists(self, path):
130  vm.addAlias('E_ECL_pi_TDCPV', 'totalECLEnergyOfParticlesInList(pi+:TDCPV_eventshape)')
131  vm.addAlias('E_ECL_gamma_TDCPV', 'totalECLEnergyOfParticlesInList(gamma:TDCPV_eventshape)')
132  vm.addAlias('E_ECL_TDCPV', 'formula(E_ECL_pi_TDCPV+E_ECL_gamma_TDCPV)')
133 
134  btotcpvcuts = '5.2 < Mbc < 5.29 and abs(deltaE) < 0.5'
135 
136  bd_qqs_Channels = [
137  'phi:SkimHighEff K_S0:merged',
138  'eta\':SkimHighEff K_S0:merged',
139  'eta:SkimHighEff K_S0:merged',
140  'eta\':SkimHighEff K*0:SkimHighEff',
141  'eta:SkimHighEff K*0:SkimHighEff',
142  'K_S0:merged K_S0:merged K_S0:merged',
143  'pi0:skim K_S0:merged',
144  'rho0:SkimHighEff K_S0:merged',
145  'omega:SkimHighEff K_S0:merged',
146  'f_0:SkimHighEff K_S0:merged',
147  'pi0:skim pi0:skim K_S0:merged',
148  'phi:SkimHighEff K_S0:merged pi0:skim',
149  'pi+:SkimHighEff pi-:SkimHighEff K_S0:merged',
150  'pi+:SkimHighEff pi-:SkimHighEff K_S0:merged gamma:E15',
151  'pi0:skim K_S0:merged gamma:E15',
152  'pi0:SkimHighEff K_S0:merged gamma:ECMS16',
153  ]
154 
155  bu_qqs_Channels = [
156  'eta\':SkimHighEff K+:SkimHighEff',
157  'phi:SkimHighEff K+:SkimHighEff',
158  ]
159 
160  bd_qqs_List = []
161  for chID, channel in enumerate(bd_qqs_Channels):
162  ma.reconstructDecay('B0:TDCPV_qqs' + str(chID) + ' -> ' + channel, btotcpvcuts, chID, path=path)
163  ma.applyCuts('B0:TDCPV_qqs' + str(chID), 'nTracks>4', path=path)
164  bd_qqs_List.append('B0:TDCPV_qqs' + str(chID))
165 
166  bu_qqs_List = []
167  for chID, channel in enumerate(bu_qqs_Channels):
168  ma.reconstructDecay('B+:TDCPV_qqs' + str(chID) + ' -> ' + channel, btotcpvcuts, chID, path=path)
169  ma.applyCuts('B+:TDCPV_qqs' + str(chID), 'nTracks>4', path=path)
170  bu_qqs_List.append('B+:TDCPV_qqs' + str(chID))
171 
172  ma.fillParticleList(decayString='pi+:TDCPV_eventshape',
173  cut='pt > 0.1 and abs(dr)<0.5 and abs(dz)<2 and nCDCHits>20', path=path)
174  ma.fillParticleList(decayString='gamma:TDCPV_eventshape',
175  cut='E > 0.1 and 0.296706 < theta < 2.61799', path=path)
176 
177  ma.buildEventShape(inputListNames=['pi+:TDCPV_eventshape', 'gamma:TDCPV_eventshape'],
178  allMoments=False,
179  foxWolfram=True,
180  harmonicMoments=False,
181  cleoCones=False,
182  thrust=False,
183  collisionAxis=False,
184  jets=False,
185  sphericity=False,
186  checkForDuplicates=False,
187  path=path)
188 
189  ma.buildEventKinematics(inputListNames=['pi+:TDCPV_eventshape', 'gamma:TDCPV_eventshape'], path=path)
190 
191  EventCuts = [
192  "nCleanedECLClusters(0.296706 < theta < 2.61799 and E>0.2)>1",
193  "E_ECL_TDCPV<9"
194  ]
195  path = self.skim_event_cutsskim_event_cuts(" and ".join(EventCuts), path=path)
196 
197  return bd_qqs_List + bu_qqs_List
198 
199  def validation_histograms(self, path):
200  ma.reconstructDecay("B0:etap -> eta':SkimHighEff K_S0:merged", '5.20 < Mbc < 5.3 and abs(deltaE) < 0.3', path=path)
201 
202  Kres = 'K_10'
203  ma.applyCuts('gamma:E15', '1.4 < E < 4', path=path)
204 
205  ma.reconstructDecay(Kres + ":all -> K_S0:merged pi+:all pi-:all ", "", path=path)
206  ma.reconstructDecay("B0:Kspipig -> " + Kres + ":all gamma:E15",
207  "Mbc > 5.2 and deltaE < 0.5 and deltaE > -0.5", path=path)
208 
209  variableshisto = [('deltaE', 100, -0.5, 0.5), ('Mbc', 100, 5.2, 5.3)]
210  filename = f'{self}_Validation.root'
211  ma.variablesToHistogram('B0:etap', variableshisto, filename=filename, path=path, directory="etap")
212  ma.variablesToHistogram('B0:Kspipig', variableshisto, filename=filename, path=path, directory="Kspipig")
213 
214 
215 @fancy_skim_header
217  """
218  **Physics channels**: bd → ccs
219 
220  **Decay Channels**:
221 
222  * ``B0 -> J/psi (ee/mm) K_S0``
223  * ``B0 -> psi(2s) (ee/mm) K_S0``
224  * ``B0 -> J/psi (ee/mm) K*``
225  * ``B+ -> J/psi (ee/mm) K+``
226  * ``B0 -> J/psi (ee/mm) KL``
227 
228  **Particle lists used**:
229 
230  * ``k_S0:merged``
231  * ``pi+:all``
232  * ``J/psi:ee``
233  * ``J/psi:mumu``
234  * ``psi(2S):ee``
235  * ``psi(2S):mumu``
236  * ``K*0:SkimHighEff``
237  * ``K+:SkimHighEff``
238  * ``K_L0:all``
239 
240  **Cuts used**:
241 
242  * ``SkimHighEff tracks thetaInCDCAcceptance AND chiProb > 0 AND abs(dr) < 0.5 AND abs(dz) < 3 and PID>0.01``
243  * ``5.2 < Mbc < 5.29 for Ks/K*``
244  * ``5.05 < Mbc < 5.29 for KL``
245  * ``abs(deltaE) < 0.5``
246  * ``nCleanedTracks(abs(dz) < 2.0 and abs(dr) < 0.5 and nCDCHits>20)>=3``
247  * ``nCleanedECLClusters(0.296706 < theta < 2.61799 and E>0.2)>1``,
248  * ``visibleEnergyOfEventCMS>4"``,
249  * ``E_ECL_TDCPV<9``
250  """
251 
252  __authors__ = ["Reem Rasheed", "Chiara La Licata", "Stefano Lacaprara"]
253  __description__ = "Skim for time-dependent CP violation analysis."
254  __contact__ = __liaison__
255  __category__ = "physics, TDCPV"
256 
257  ApplyHLTHadronCut = True
258  validation_sample = _VALIDATION_SAMPLE
259 
260  def load_standard_lists(self, path):
261  stdE("all", path=path)
262  stdK("all", path=path)
263  stdMu("all", path=path)
264  stdPi("all", path=path)
265  stdPhotons("all", path=path, loadPhotonBeamBackgroundMVA=False)
266 
267  loadStdSkimHighEffTracks('pi', path=path)
268  loadStdSkimHighEffTracks('K', path=path)
269 
270  loadStdSkimPi0(path=path)
271  stdKshorts(path=path)
272  stdPi0s("eff40_May2020", path=path, loadPhotonBeamBackgroundMVA=False)
273  loadStdSkimHighEffKstar0(path=path)
274 
275  loadStdJpsiToee_noTOP(path=path)
276  loadStdJpsiTomumu(path=path)
277  loadStdPsi2s2lepton(path=path)
278  stdKlongs(listtype='allklm', path=path)
279  stdKlongs(listtype='allecl', path=path)
280 
281  def additional_setup(self, path):
282  ma.cutAndCopyList('K_L0:alleclEcut', 'K_L0:allecl', 'E>0.15', path=path)
283  ma.copyLists('K_L0:all_klmecl', ['K_L0:allklm', 'K_L0:allecl'], writeOut=True, path=path)
284 
285  def build_lists(self, path):
286  vm.addAlias('E_ECL_pi_TDCPV', 'totalECLEnergyOfParticlesInList(pi+:TDCPV_eventshape)')
287  vm.addAlias('E_ECL_gamma_TDCPV', 'totalECLEnergyOfParticlesInList(gamma:TDCPV_eventshape)')
288  vm.addAlias('E_ECL_TDCPV', 'formula(E_ECL_pi_TDCPV+E_ECL_gamma_TDCPV)')
289 
290  btotcpvcuts = '5.2 < Mbc < 5.29 and abs(deltaE) < 0.5'
291  btotcpvcuts_KL = '5.05 < Mbc < 5.29 and abs(deltaE) < 0.5'
292 
293  bd_ccs_Channels = ['J/psi:ee K_S0:merged',
294  'J/psi:mumu K_S0:merged',
295  'psi(2S):ll K_S0:merged',
296  'J/psi:ee K*0:SkimHighEff',
297  'J/psi:mumu K*0:SkimHighEff']
298 
299  bPlustoJPsiK_Channel = ['J/psi:mumu K+:SkimHighEff',
300  'J/psi:ee K+:SkimHighEff']
301 
302  bd_ccs_KL_Channels = ['J/psi:mumu K_L0:all_klmecl',
303  'J/psi:ee K_L0:all_klmecl']
304 
305  bd_ccs_List = []
306  for chID, channel in enumerate(bd_ccs_Channels):
307  ma.reconstructDecay('B0:TDCPV_ccs' + str(chID) + ' -> ' + channel, btotcpvcuts, chID, path=path)
308  ma.applyCuts('B0:TDCPV_ccs' + str(chID), 'nTracks>4', path=path)
309  bd_ccs_List.append('B0:TDCPV_ccs' + str(chID))
310 
311  bPlustoJPsiK_List = []
312 
313  for chID, channel in enumerate(bPlustoJPsiK_Channel):
314  ma.reconstructDecay('B+:TDCPV_JPsiK' + str(chID) + ' -> ' + channel, btotcpvcuts, chID, path=path)
315  bPlustoJPsiK_List.append('B+:TDCPV_JPsiK' + str(chID))
316 
317  b0toJPsiKL_List = []
318  for chID, channel in enumerate(bd_ccs_KL_Channels):
319  ma.reconstructDecay('B0:TDCPV_JPsiKL' + str(chID) + ' -> ' + channel, btotcpvcuts_KL, chID, path=path)
320  b0toJPsiKL_List.append('B0:TDCPV_JPsiKL' + str(chID))
321 
322  ma.fillParticleList(decayString='pi+:TDCPV_eventshape',
323  cut='pt > 0.1 and abs(dr)<0.5 and abs(dz)<2 and nCDCHits>20', path=path)
324  ma.fillParticleList(decayString='gamma:TDCPV_eventshape',
325  cut='E > 0.1 and 0.296706 < theta < 2.61799', path=path)
326 
327  ma.buildEventShape(inputListNames=['pi+:TDCPV_eventshape', 'gamma:TDCPV_eventshape'],
328  allMoments=False,
329  foxWolfram=True,
330  harmonicMoments=False,
331  cleoCones=False,
332  thrust=False,
333  collisionAxis=False,
334  jets=False,
335  sphericity=False,
336  checkForDuplicates=False,
337  path=path)
338 
339  ma.buildEventKinematics(inputListNames=['pi+:TDCPV_eventshape', 'gamma:TDCPV_eventshape'], path=path)
340 
341  EventCuts = [
342  "nCleanedTracks(abs(dz) < 2.0 and abs(dr) < 0.5 and nCDCHits>20)>=3",
343  "nCleanedECLClusters(0.296706 < theta < 2.61799 and E>0.2)>1",
344  "visibleEnergyOfEventCMS>4",
345  "E_ECL_TDCPV<9"
346  ]
347  path = self.skim_event_cutsskim_event_cuts(" and ".join(EventCuts), path=path)
348 
349  return bd_ccs_List + bPlustoJPsiK_List + b0toJPsiKL_List
350 
351  def validation_histograms(self, path):
352  ma.reconstructDecay('B0:jpsiee -> J/psi:ee K_S0:merged', '5.24 < Mbc < 5.3 and abs(deltaE) < 0.15', path=path)
353  ma.reconstructDecay('B0:jpsimumu -> J/psi:mumu K_S0:merged', '5.24 < Mbc < 5.3 and abs(deltaE) < 0.15', path=path)
354 
355  filename = f'{self}_Validation.root'
356  variableshisto = [('deltaE', 100, -0.5, 0.5), ('Mbc', 100, 5.2, 5.3)]
357  ma.variablesToHistogram('B0:jpsiee', variableshisto, filename=filename, path=path, directory="jpsiee")
358  ma.variablesToHistogram(
359  'B0:jpsimumu',
360  variableshisto,
361  filename=filename,
362  path=path,
363  directory="jpsimumu")
def skim_event_cuts(self, cut, *path)
Definition: core.py:272
def additional_setup(self, path)
Definition: tdcpv.py:281
def build_lists(self, path)
Definition: tdcpv.py:285
def validation_histograms(self, path)
Definition: tdcpv.py:351
def load_standard_lists(self, path)
Definition: tdcpv.py:260
def additional_setup(self, path)
Definition: tdcpv.py:125
def build_lists(self, path)
Definition: tdcpv.py:129
def validation_histograms(self, path)
Definition: tdcpv.py:199
def load_standard_lists(self, path)
Definition: tdcpv.py:106