Belle II Software  release-06-01-15
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  bd_qqs_List.append('B0:TDCPV_qqs' + str(chID))
164 
165  bu_qqs_List = []
166  for chID, channel in enumerate(bu_qqs_Channels):
167  ma.reconstructDecay('B+:TDCPV_qqs' + str(chID) + ' -> ' + channel, btotcpvcuts, chID, path=path)
168  bu_qqs_List.append('B+:TDCPV_qqs' + str(chID))
169 
170  ma.fillParticleList(decayString='pi+:TDCPV_eventshape',
171  cut='pt > 0.1 and abs(dr)<0.5 and abs(dz)<2 and nCDCHits>20', path=path)
172  ma.fillParticleList(decayString='gamma:TDCPV_eventshape',
173  cut='E > 0.1 and 0.296706 < theta < 2.61799', path=path)
174 
175  ma.buildEventShape(inputListNames=['pi+:TDCPV_eventshape', 'gamma:TDCPV_eventshape'],
176  allMoments=False,
177  foxWolfram=True,
178  harmonicMoments=False,
179  cleoCones=False,
180  thrust=False,
181  collisionAxis=False,
182  jets=False,
183  sphericity=False,
184  checkForDuplicates=False,
185  path=path)
186 
187  ma.buildEventKinematics(inputListNames=['pi+:TDCPV_eventshape', 'gamma:TDCPV_eventshape'], path=path)
188 
189  EventCuts = [
190  "nCleanedECLClusters(0.296706 < theta < 2.61799 and E>0.2)>1",
191  "E_ECL_TDCPV<9"
192  ]
193  path = self.skim_event_cutsskim_event_cuts(" and ".join(EventCuts), path=path)
194 
195  return bd_qqs_List + bu_qqs_List
196 
197  def validation_histograms(self, path):
198  ma.reconstructDecay("B0:etap -> eta':SkimHighEff K_S0:merged", '5.20 < Mbc < 5.3 and abs(deltaE) < 0.3', path=path)
199 
200  Kres = 'K_10'
201  ma.applyCuts('gamma:E15', '1.4 < E < 4', path=path)
202 
203  ma.reconstructDecay(Kres + ":all -> K_S0:merged pi+:all pi-:all ", "", path=path)
204  ma.reconstructDecay("B0:Kspipig -> " + Kres + ":all gamma:E15",
205  "Mbc > 5.2 and deltaE < 0.5 and deltaE > -0.5", path=path)
206 
207  variableshisto = [('deltaE', 100, -0.5, 0.5), ('Mbc', 100, 5.2, 5.3)]
208  filename = f'{self}_Validation.root'
209  ma.variablesToHistogram('B0:etap', variableshisto, filename=filename, path=path, directory="etap")
210  ma.variablesToHistogram('B0:Kspipig', variableshisto, filename=filename, path=path, directory="Kspipig")
211 
212 
213 @fancy_skim_header
215  """
216  **Physics channels**: bd → ccs
217 
218  **Decay Channels**:
219 
220  * ``B0 -> J/psi (ee/mm) K_S0``
221  * ``B0 -> psi(2s) (ee/mm) K_S0``
222  * ``B0 -> J/psi (ee/mm) K*``
223  * ``B+ -> J/psi (ee/mm) K+``
224  * ``B0 -> J/psi (ee/mm) KL``
225 
226  **Particle lists used**:
227 
228  * ``k_S0:merged``
229  * ``pi+:all``
230  * ``J/psi:ee``
231  * ``J/psi:mumu``
232  * ``psi(2S):ee``
233  * ``psi(2S):mumu``
234  * ``K*0:SkimHighEff``
235  * ``K+:SkimHighEff``
236  * ``K_L0:all``
237 
238  **Cuts used**:
239 
240  * ``SkimHighEff tracks thetaInCDCAcceptance AND chiProb > 0 AND abs(dr) < 0.5 AND abs(dz) < 3 and PID>0.01``
241  * ``5.2 < Mbc < 5.29 for Ks/K*``
242  * ``5.05 < Mbc < 5.29 for KL``
243  * ``abs(deltaE) < 0.5``
244  * ``nCleanedTracks(abs(dz) < 2.0 and abs(dr) < 0.5 and nCDCHits>20)>=3``
245  * ``nCleanedECLClusters(0.296706 < theta < 2.61799 and E>0.2)>1``,
246  * ``visibleEnergyOfEventCMS>4"``,
247  * ``E_ECL_TDCPV<9``
248  """
249 
250  __authors__ = ["Reem Rasheed", "Chiara La Licata", "Stefano Lacaprara"]
251  __description__ = "Skim for time-dependent CP violation analysis."
252  __contact__ = __liaison__
253  __category__ = "physics, TDCPV"
254 
255  ApplyHLTHadronCut = True
256  validation_sample = _VALIDATION_SAMPLE
257 
258  def load_standard_lists(self, path):
259  stdE("all", path=path)
260  stdK("all", path=path)
261  stdMu("all", path=path)
262  stdPi("all", path=path)
263  stdPhotons("all", path=path, loadPhotonBeamBackgroundMVA=False)
264 
265  loadStdSkimHighEffTracks('pi', path=path)
266  loadStdSkimHighEffTracks('K', path=path)
267 
268  loadStdSkimPi0(path=path)
269  stdKshorts(path=path)
270  stdPi0s("eff40_May2020", path=path, loadPhotonBeamBackgroundMVA=False)
271  loadStdSkimHighEffKstar0(path=path)
272 
273  loadStdJpsiToee_noTOP(path=path)
274  loadStdJpsiTomumu(path=path)
275  loadStdPsi2s2lepton(path=path)
276  stdKlongs(listtype='allklm', path=path)
277  stdKlongs(listtype='allecl', path=path)
278 
279  def additional_setup(self, path):
280  ma.cutAndCopyList('K_L0:alleclEcut', 'K_L0:allecl', 'E>0.15', path=path)
281  ma.copyLists('K_L0:all_klmecl', ['K_L0:allklm', 'K_L0:allecl'], writeOut=True, path=path)
282 
283  def build_lists(self, path):
284  vm.addAlias('E_ECL_pi_TDCPV', 'totalECLEnergyOfParticlesInList(pi+:TDCPV_eventshape)')
285  vm.addAlias('E_ECL_gamma_TDCPV', 'totalECLEnergyOfParticlesInList(gamma:TDCPV_eventshape)')
286  vm.addAlias('E_ECL_TDCPV', 'formula(E_ECL_pi_TDCPV+E_ECL_gamma_TDCPV)')
287 
288  btotcpvcuts = '5.2 < Mbc < 5.29 and abs(deltaE) < 0.5'
289  btotcpvcuts_KL = '5.05 < Mbc < 5.29 and abs(deltaE) < 0.5'
290 
291  bd_ccs_Channels = ['J/psi:ee K_S0:merged',
292  'J/psi:mumu K_S0:merged',
293  'psi(2S):ll K_S0:merged',
294  'J/psi:ee K*0:SkimHighEff',
295  'J/psi:mumu K*0:SkimHighEff']
296 
297  bPlustoJPsiK_Channel = ['J/psi:mumu K+:SkimHighEff',
298  'J/psi:ee K+:SkimHighEff']
299 
300  bd_ccs_KL_Channels = ['J/psi:mumu K_L0:all_klmecl',
301  'J/psi:ee K_L0:all_klmecl']
302 
303  bd_ccs_List = []
304  for chID, channel in enumerate(bd_ccs_Channels):
305  ma.reconstructDecay('B0:TDCPV_ccs' + str(chID) + ' -> ' + channel, btotcpvcuts, chID, path=path)
306  ma.applyCuts('B0:TDCPV_ccs' + str(chID), 'nTracks>4', path=path)
307  bd_ccs_List.append('B0:TDCPV_ccs' + str(chID))
308 
309  bPlustoJPsiK_List = []
310 
311  for chID, channel in enumerate(bPlustoJPsiK_Channel):
312  ma.reconstructDecay('B+:TDCPV_JPsiK' + str(chID) + ' -> ' + channel, btotcpvcuts, chID, path=path)
313  bPlustoJPsiK_List.append('B+:TDCPV_JPsiK' + str(chID))
314 
315  b0toJPsiKL_List = []
316  for chID, channel in enumerate(bd_ccs_KL_Channels):
317  ma.reconstructDecay('B0:TDCPV_JPsiKL' + str(chID) + ' -> ' + channel, btotcpvcuts_KL, chID, path=path)
318  b0toJPsiKL_List.append('B0:TDCPV_JPsiKL' + str(chID))
319 
320  ma.fillParticleList(decayString='pi+:TDCPV_eventshape',
321  cut='pt > 0.1 and abs(dr)<0.5 and abs(dz)<2 and nCDCHits>20', path=path)
322  ma.fillParticleList(decayString='gamma:TDCPV_eventshape',
323  cut='E > 0.1 and 0.296706 < theta < 2.61799', path=path)
324 
325  ma.buildEventShape(inputListNames=['pi+:TDCPV_eventshape', 'gamma:TDCPV_eventshape'],
326  allMoments=False,
327  foxWolfram=True,
328  harmonicMoments=False,
329  cleoCones=False,
330  thrust=False,
331  collisionAxis=False,
332  jets=False,
333  sphericity=False,
334  checkForDuplicates=False,
335  path=path)
336 
337  ma.buildEventKinematics(inputListNames=['pi+:TDCPV_eventshape', 'gamma:TDCPV_eventshape'], path=path)
338 
339  EventCuts = [
340  "nCleanedTracks(abs(dz) < 2.0 and abs(dr) < 0.5 and nCDCHits>20)>=3",
341  "nCleanedECLClusters(0.296706 < theta < 2.61799 and E>0.2)>1",
342  "visibleEnergyOfEventCMS>4",
343  "E_ECL_TDCPV<9"
344  ]
345  path = self.skim_event_cutsskim_event_cuts(" and ".join(EventCuts), path=path)
346 
347  return bd_ccs_List + bPlustoJPsiK_List + b0toJPsiKL_List
348 
349  def validation_histograms(self, path):
350  ma.reconstructDecay('B0:jpsiee -> J/psi:ee K_S0:merged', '5.24 < Mbc < 5.3 and abs(deltaE) < 0.15', path=path)
351  ma.reconstructDecay('B0:jpsimumu -> J/psi:mumu K_S0:merged', '5.24 < Mbc < 5.3 and abs(deltaE) < 0.15', path=path)
352 
353  filename = f'{self}_Validation.root'
354  variableshisto = [('deltaE', 100, -0.5, 0.5), ('Mbc', 100, 5.2, 5.3)]
355  ma.variablesToHistogram('B0:jpsiee', variableshisto, filename=filename, path=path, directory="jpsiee")
356  ma.variablesToHistogram(
357  'B0:jpsimumu',
358  variableshisto,
359  filename=filename,
360  path=path,
361  directory="jpsimumu")
def skim_event_cuts(self, cut, *path)
Definition: core.py:272
def additional_setup(self, path)
Definition: tdcpv.py:279
def build_lists(self, path)
Definition: tdcpv.py:283
def validation_histograms(self, path)
Definition: tdcpv.py:349
def load_standard_lists(self, path)
Definition: tdcpv.py:258
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:197
def load_standard_lists(self, path)
Definition: tdcpv.py:106