Belle II Software  release-06-00-14
charm.py
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3 
4 
11 
12 """
13 Skim list building functions for charm analyses.
14 
15 .. Note::
16  The Hp, Hm and Jm in the function name represent arbitrary charged particles with
17  positive or negative charge. The Hp and Jm in `XToD0_D0ToHpJm`, mean a positive particle
18  and a negative particle that could be either conjugate or non-conjugate. The Hp and Hm
19  in `DstToD0Pi_D0ToHpHmPi0`, mean a positive particle and a negative particle that
20  must be conjugate.
21 
22 .. Note::
23  Although reconstructDecay() would automatically include charged conjugate channel, and D0
24  is not distinguishable from anti-D0 in XToD0 skim, both :math:`D^0 \\to f` and :math:`D^0 \\to \\overline{f}`
25  mode should be written explicitly in XToD0 skim, because later in the DstToD0Pi skim, the D0 decay strings
26  in XToD0 skim would be directly combined with pi+. For example, if one only include D0 -> K+ pi- in XToD0_D0ToHpJm
27  skim, then in DstToD0Pi_D0ToHpJm skim, only the D*+ -> [D0 -> K+ pi-] pi+ would be included, and
28  D*+ -> [D0 -> K- pi+] pi+ would not be included.
29 """
30 
31 from functools import lru_cache
32 
33 import modularAnalysis as ma
34 from skim import BaseSkim, fancy_skim_header
35 from stdCharged import stdE, stdK, stdMu, stdPi, stdPr
36 from stdPhotons import loadStdSkimPhoton
37 from stdPi0s import loadStdSkimPi0
38 from stdV0s import stdKshorts
39 
40 
41 __liaison__ = "Guanda Gong <gonggd@mail.ustc.edu.cn>"
42 _VALIDATION_SAMPLE = "mdst14.root"
43 
44 
45 @fancy_skim_header
47  """
48  Skims :math:`D^0`'s reconstructed by `XToD0_D0ToHpJm.D0ToHpJm`.
49  """
50 
51  __authors__ = ["Giulia Casarosa"]
52  __description__ = "Skim list for D0 to two charged FSPs."
53  __contact__ = __liaison__
54  __category__ = "physics, charm"
55 
56  NoisyModules = ["ParticleLoader", "RootOutput"]
57  ApplyHLTHadronCut = True
58 
59  # Cached static method, so that its contents are only executed once for a single path.
60  # Factored out into a separate function here, so it is available to other skims.
61 
62  @staticmethod
63  @lru_cache()
64  def D0ToHpJm(path):
65  """
66  **Decay Modes**:
67  * :math:`D^{0}\\to \\pi^+ \\pi^-`,
68  * :math:`D^{0}\\to K^+ \\pi^-`,
69  * :math:`D^{0}\\to K^- \\pi^+`,
70  * :math:`D^{0}\\to K^+ K^-`,
71 
72  **Selection Criteria**:
73  * Tracks: ``abs(d0) < 1, abs(z0) < 3, 0.296706 < theta < 2.61799``
74  * ``1.66 < M(D0) < 2.06``
75  * ``pcms(D0) > 2.0``
76  * For more details, please check the source code of this skim.
77 
78  **Parameters**:
79  * path (basf2.Path): Skim path to be processed.
80 
81  **Returns**:
82  * List of D0 particle list names.
83 
84  """
85  mySel = "abs(d0) < 1 and abs(z0) < 3"
86  mySel += " and 0.296706 < theta < 2.61799"
87  ma.fillParticleList("pi+:mygood", mySel, path=path)
88  ma.fillParticleList("K+:mygood", mySel, path=path)
89 
90  charmcuts = "1.66 < M < 2.06 and useCMSFrame(p)>2.0"
91  D0_Channels = [
92  "pi+:mygood pi-:mygood",
93  "K+:mygood pi-:mygood",
94  "K-:mygood pi+:mygood",
95  "K+:mygood K-:mygood",
96  ]
97 
98  D0List = []
99 
100  for chID, channel in enumerate(D0_Channels):
101  ma.reconstructDecay("D0:HpJm" + str(chID) + " -> " + channel, charmcuts, chID, path=path)
102  D0List.append("D0:HpJm" + str(chID))
103 
104  return D0List
105 
106  def build_lists(self, path):
107  """Builds :math:`D^0` skim lists defined in `XToD0_D0ToHpJm.D0ToHpJm`."""
108  return self.D0ToHpJmD0ToHpJm(path)
109 
110 
111 @fancy_skim_header
113  """
114  Skims :math:`D^0`'s reconstructed by `XToD0_D0ToNeutrals.D0ToNeutrals`.
115  """
116 
117  __authors__ = ["Giulia Casarosa"]
118  __description__ = "Skim list for D0 to neutral FSPs."
119  __contact__ = __liaison__
120  __category__ = "physics, charm"
121 
122  NoisyModules = ["ParticleLoader", "RootOutput"]
123 
124  def load_standard_lists(self, path):
125  loadStdSkimPi0(path=path)
126  stdKshorts(path=path)
127 
128  # Cached static method, so that its contents are only executed once for a single path
129  # Factored out into a separate function here, so it is available to other skims.
130 
131  @staticmethod
132  @lru_cache()
133  def D0ToNeutrals(path):
134  """
135  **Decay Modes**:
136  * :math:`D^{0}\\to \\pi^{0} \\pi^{0}`
137  * :math:`D^{0}\\to K_{S} \\pi^{0}`
138  * :math:`D^{0}\\to K_{S} K_{S}`
139 
140  **Selection Criteria**:
141  * Use :math:`\\pi^{0}` from `stdPi0s.loadStdSkimPi0`
142  * Use :math:`K_{S}` from `stdV0s.stdKshorts`
143  * ``1.66 < M(D0) < 2.06, pcms(D0) > 2.0``
144  * For more details, please check the source code of this skim.
145  * (Maybe in the future, we can add a loose ECL cluster timing cut
146  to :math:`\\pi^{0}` in this skim.)
147 
148  **Parameters**:
149  * path (basf2.Path): Skim path to be processed.
150 
151  **Returns**:
152  * List of D0 particle list names.
153 
154  """
155  charmcuts = "1.66 < M < 2.06 and useCMSFrame(p)>2.0"
156  D0_Channels = ["pi0:skim pi0:skim",
157  "K_S0:merged pi0:skim",
158  "K_S0:merged K_S0:merged",
159  ]
160 
161  D0List = []
162 
163  for chID, channel in enumerate(D0_Channels):
164  ma.reconstructDecay("D0:2Nbdy" + str(chID) + " -> " + channel, charmcuts, chID, path=path)
165  D0List.append("D0:2Nbdy" + str(chID))
166 
167  return D0List
168 
169  def build_lists(self, path):
170  """Builds :math:`D^0` skim lists defined in `XToD0_D0ToNeutrals.D0ToNeutrals`."""
171  return self.D0ToNeutralsD0ToNeutrals(path)
172 
173 
174 @fancy_skim_header
176  """
177  **Decay Modes**:
178  * :math:`D^{*+}\\to \\pi^+ D^{0}, D^{0}\\to \\gamma \\gamma`,
179  * :math:`D^{*+}\\to \\pi^+ D^{0}, D^{0}\\to ee`,
180  * :math:`D^{*+}\\to \\pi^+ D^{0}, D^{0}\\to e^+ \\mu^-`,
181  * :math:`D^{*+}\\to \\pi^+ D^{0}, D^{0}\\to e^- \\mu^+`,
182  * :math:`D^{*+}\\to \\pi^+ D^{0}, D^{0}\\to \\mu \\mu`,
183  * :math:`D^{*+}\\to \\pi^+ D^{0}, D^{0}\\to \\pi^+ \\pi^-`,
184 
185  **Selection Criteria**:
186  * Use photons from `stdPhotons.loadStdSkimPhoton`
187  * Use electrons, muons and pions from loose lists in `stdCharged`
188  * ``1.66 < M(D0) < 2.06``
189  * No cut on the slow pion
190  * ``0 < Q < 0.02``
191  * ``pcms(D*) > 2.0``
192  * For more details, please check the source code of this skim.
193 
194  """
195 
196  __authors__ = ["Doris Yangsoo Kim", "Jaeyeon Kim"]
197  __description__ = "Skim list for D*+ to pi+ D0, D0 to rare decay."
198  __contact__ = __liaison__
199  __category__ = "physics, charm"
200 
201  NoisyModules = ["ParticleLoader", "RootOutput"]
202 
203  def load_standard_lists(self, path):
204  stdE("loose", path=path)
205  stdMu("loose", path=path)
206  stdPi("loose", path=path)
207  loadStdSkimPhoton(path=path)
208  loadStdSkimPi0(path=path)
209 
210  def build_lists(self, path):
211  charmcuts = "1.66 < M < 2.06"
212  Dstcuts = "0 < Q < 0.02 and 2.0 < useCMSFrame(p)"
213 
214  D0_Channels = ["gamma:skim gamma:skim",
215  "e+:loose e-:loose",
216  "e+:loose mu-:loose",
217  "e-:loose mu+:loose",
218  "mu+:loose mu-:loose",
219  "pi+:loose pi-:loose"]
220  DstList = []
221 
222  for chID, channel in enumerate(D0_Channels):
223  ma.reconstructDecay("D0:Rare" + str(chID) + " -> " + channel, charmcuts, chID, path=path)
224  ma.reconstructDecay("D*+:" + str(chID) + " -> pi+:all D0:Rare" + str(chID),
225  Dstcuts, chID, path=path)
226  DstList.append("D*+:" + str(chID))
227 
228  return DstList
229 
230 
231 @fancy_skim_header
233  """
234  **Decay Modes**:
235  * :math:`D^+_{(S)} \\to K_{S} \\pi^+`,
236  * :math:`D^+_{(S)} \\to K_{S} K^+`,
237 
238  **Selection Criteria**:
239  * Tracks not from :math:`K_{S}`: ``abs(d0) < 1, abs(z0) < 3,
240  0.296706 < theta < 2.61799``
241  * Use :math:`K_{S}` from `stdV0s.stdKshorts` and require
242  ``flightDistance/flightDistanceErr > 2``
243  * ``1.67 < M(D+) < 2.17, pcms(D+) > 2.0``
244  * For more details, please check the source code of this skim.
245 
246  """
247 
248  __authors__ = ["Guanda Gong"]
249  __description__ = "Skim list for D_(s)+ to Ks h+."
250  __contact__ = __liaison__
251  __category__ = "physics, charm"
252 
253  NoisyModules = ["ParticleLoader", "RootOutput"]
254  ApplyHLTHadronCut = True
255 
256  def load_standard_lists(self, path):
257  stdK("all", path=path)
258  stdPi("all", path=path)
259  stdKshorts(path=path)
260 
261  def build_lists(self, path):
262  mySel = "abs(d0) < 1 and abs(z0) < 3"
263  mySel += " and 0.296706 < theta < 2.61799"
264  ma.fillParticleList("pi+:kshp", mySel, path=path)
265  ma.fillParticleList("K+:kshp", mySel, path=path)
266  ma.cutAndCopyList('K_S0:kshp', 'K_S0:merged', 'formula(flightDistance/flightDistanceErr) > 2', path=path)
267 
268  Dpcuts = "1.67 < M < 2.17 and useCMSFrame(p) > 2.0"
269  Dp_Channels = ["K_S0:kshp pi+:kshp",
270  "K_S0:kshp K+:kshp",
271  ]
272 
273  DpList = []
274  for chID, channel in enumerate(Dp_Channels):
275  ma.reconstructDecay("D+:KsHp" + str(chID) + " -> " + channel, Dpcuts, chID, path=path)
276  DpList.append("D+:KsHp" + str(chID))
277 
278  return DpList
279 
280 
281 @fancy_skim_header
283  """
284  **Decay Modes**:
285  * :math:`D^+_{(S)} \\to \\pi^+ \\pi^- \\pi^+`,
286  * :math:`D^+_{(S)} \\to \\pi^+ \\pi^- K^+`,
287  * :math:`D^+_{(S)} \\to \\pi^+ K^- K^+`,
288  * :math:`D^+_{(S)} \\to K^+ K^- K^+`,
289  * For :math:`D^+_{(S)} \\to K_{S} h^+`, which includes a :math:`K_{S}` vertex,
290  please check `XToDp_DpToKsHp`
291 
292  **Selection Criteria**:
293  * Use tracks from the loose lists in `stdCharged`
294  * ``1.67 < M(D+) < 2.17, pcms(D+) > 2.0``
295  * For more details, please check the source code of this skim.
296 
297  """
298 
299  __authors__ = ["Aman Sangal"]
300  __description__ = "Skim list for D_(s)+ to h+ h- j+."
301  __contact__ = __liaison__
302  __category__ = "physics, charm"
303 
304  NoisyModules = ["ParticleLoader", "RootOutput"]
305  ApplyHLTHadronCut = True
306 
307  def load_standard_lists(self, path):
308  stdK("loose", path=path)
309  stdPi("loose", path=path)
310 
311  def build_lists(self, path):
312  Dpcuts = "1.67 < M < 2.17 and useCMSFrame(p) > 2.0"
313 
314  Dp_Channels = ["pi+:loose pi-:loose pi+:loose",
315  "pi+:loose pi-:loose K+:loose",
316  "pi+:loose K-:loose K+:loose",
317  "K+:loose K-:loose pi+:loose",
318  ]
319 
320  DpList = []
321  for chID, channel in enumerate(Dp_Channels):
322  ma.reconstructDecay("D+:HpHmJp" + str(chID) + " -> " + channel, Dpcuts, chID, path=path)
323  DpList.append("D+:HpHmJp" + str(chID))
324 
325  return DpList
326 
327 
328 @fancy_skim_header
330  """
331  **Decay Modes**:
332  * :math:`\\Lambda_c^+ \\to p \\pi^- \\pi^+`
333  * :math:`\\Lambda_c^+ \\to p K^- \\pi^+`
334  * :math:`\\Lambda_c^+ \\to p \\pi^- K^+`
335  * :math:`\\Lambda_c^+ \\to p K^- K^+`
336 
337  **Selection Criteria**:
338  * Use tracks from the loose lists in `stdCharged`
339  * ``2.2 < M(Lambda_c) < 2.4, pcms(Lambda_c) > 2.0``
340  * For more details, please check the source code of this skim.
341 
342  """
343 
344  __authors__ = ["Justin Guilliams"]
345  __description__ = "Skim list for Lambda_c+ -> p K- pi+."
346  __contact__ = __liaison__
347  __category__ = "physics, charm"
348 
349  NoisyModules = ["ParticleLoader", "RootOutput"]
350  ApplyHLTHadronCut = True
351 
352  def load_standard_lists(self, path):
353  stdK("all", path=path)
354  stdPi("all", path=path)
355  stdPr("loose", path=path)
356 
357  def build_lists(self, path):
358 
359  LambdacCuts = "2.2 < M < 2.4 and useCMSFrame(p) > 2.0"
360  LambdacChannels = ["p+:loose pi-:all pi+:all",
361  "p+:loose K-:all pi+:all",
362  "p+:loose pi-:all K+:all",
363  "p+:loose K-:all K+:all",
364  ]
365 
366  LambdacList = []
367  for chID, channel in enumerate(LambdacChannels):
368  ma.reconstructDecay("Lambda_c+:pHpJm" + str(chID) + " -> " + channel, LambdacCuts, chID, path=path)
369  LambdacList.append("Lambda_c+:pHpJm" + str(chID))
370 
371  return LambdacList
372 
373 
374 @fancy_skim_header
376  """
377  **Decay Modes**:
378  * :math:`D^{*+}\\to \\pi^{0} D^{+}, D^+ \\to \\pi^+ \\pi^0`
379 
380  **Selection Criteria**:
381  * Tracks: ``abs(d0) < 1, abs(z0) < 3, 0.296706 < theta < 2.61799``
382  * Use :math:`\\pi^{0}` from `stdPi0s.loadStdSkimPi0`
383  * ``1.67 < M(D+) < 2.07, pcms(D+) > 2.0``
384  * ``0 < Q < 0.018``
385  * For more details, please check the source code of this skim.
386 
387  """
388 
389  __authors__ = ["Johannes Brand"]
390  __description__ = "Skim list for D*+ to D+ pi0, D+ to h+ pi0."
391  __contact__ = __liaison__
392  __category__ = "physics, charm"
393 
394  NoisyModules = ["ParticleLoader", "RootOutput"]
395 
396  def load_standard_lists(self, path):
397  stdPi("all", path=path)
398  loadStdSkimPi0(path=path)
399 
400  def build_lists(self, path):
401  mySel = "abs(d0) < 1 and abs(z0) < 3"
402  mySel += " and 0.296706 < theta < 2.61799"
403  ma.fillParticleList("pi+:hppi0", mySel, path=path)
404 
405  Dpcuts = "1.67 < M < 2.07 and useCMSFrame(p) > 2.0"
406  Dp_Channels = ["pi+:hppi0 pi0:skim",
407  ]
408 
409  DstList = []
410  for chID, channel in enumerate(Dp_Channels):
411  ma.reconstructDecay("D+:HpPi0" + str(chID) + " -> " + channel, Dpcuts, chID, path=path)
412  ma.reconstructDecay("D*+:HpPi0" + str(chID) + " -> D+:HpPi0" + str(chID) + " pi0:skim", "0 < Q < 0.018", path=path)
413  DstList.append("D*+:HpPi0" + str(chID))
414 
415  return DstList
416 
417 
418 @fancy_skim_header
420  """
421  **Decay Modes**:
422  * :math:`D^{*+}\\to D^{0} \\pi^+`, where :math:`D^{0}` is reconstructed by `XToD0_D0ToHpJm.D0ToHpJm`
423 
424  **Selection Criteria**:
425  * Apply the cuts in `XToD0_D0ToHpJm`
426  * No cut on the slow pion
427  * ``0 < Q < 0.018``
428  * For more details, please check the source code of this skim.
429 
430  """
431 
432  __authors__ = "Giulia Casarosa"
433  __description__ = "Same as `XToD0_D0ToHpJm`, but requiring the D0 is from D*+ -> D0 pi+ process."
434  __contact__ = __liaison__
435  __category__ = "physics, charm"
436 
437  NoisyModules = ["ParticleLoader", "RootOutput"]
438  ApplyHLTHadronCut = True
439 
440  def load_standard_lists(self, path):
441  stdK("all", path=path)
442  stdPi("all", path=path)
443 
444  def build_lists(self, path):
445  D0List = self.D0ToHpJmD0ToHpJm(path)
446 
447  Dstcuts = '0 < Q < 0.018'
448 
449  DstList = []
450  for chID, channel in enumerate(D0List):
451  ma.reconstructDecay('D*+:HpJm' + str(chID) + ' -> D0:HpJm' + str(chID) + ' pi+:all', Dstcuts, chID, path=path)
452  DstList.append('D*+:HpJm' + str(chID))
453 
454  return DstList
455 
456 
457 @fancy_skim_header
459  """
460  **Decay Modes**:
461  * :math:`RS: D^{*+}\\to \\pi^+ D^{0}, D^{0}\\to K^- \\pi^+ \\pi^{0}`
462  * :math:`WS: D^{*-}\\to \\pi^- \\overline{D}^{0}, \\overline{D}^{0}\\to K^- \\pi^+ \\pi^{0}`
463 
464  **Selection Criteria**:
465  * Use tracks from the loose lists in `stdCharged` to reconstruct :math:`D^{0}`
466  * Use :math:`\\pi^{0}` from `stdPi0s.loadStdSkimPi0`
467  * ``1.70 < M(D0) < 2.10``
468  * No cut on the slow pion
469  * ``M(D*)-M(D0) < 0.16``
470  * ``pcms(D*) > 2.0``
471  * For more details, please check the source code of this skim.
472 
473  """
474 
475  __authors__ = ["Emma Oxford"]
476  __description__ = (
477  "Skim list for D*+ to pi+ D0, D0 to pi0 and two charged FSPs, where the kinds "
478  "of two charged FSPs are different. The wrong sign(WS) mode, D*- to pi- D0, is "
479  "also included."
480  )
481  __contact__ = __liaison__
482  __category__ = "physics, charm"
483 
484  NoisyModules = ["ParticleLoader", "RootOutput"]
485  ApplyHLTHadronCut = True
486 
487  def load_standard_lists(self, path):
488  stdK("loose", path=path)
489  stdPi("loose", path=path)
490  loadStdSkimPi0(path=path)
491 
492  def build_lists(self, path):
493  Dstcuts = "massDifference(0) < 0.160 and useCMSFrame(p) > 2.0"
494  charmcuts = "1.70 < M < 2.10"
495  ma.cutAndCopyList("pi0:myskim", "pi0:skim", "", path=path) # additional cuts removed 27 Jun 2019 by Emma Oxford
496 
497  DstList = []
498  # NOTE: renamed to avoid particle list name clashes
499  ma.reconstructDecay("D0:HpJmPi0_withPID -> K-:loose pi+:loose pi0:myskim", charmcuts, path=path)
500  ma.reconstructDecay("D*+:HpJmPi0RS_withPID -> D0:HpJmPi0_withPID pi+:all", Dstcuts, path=path)
501  ma.reconstructDecay("D*-:HpJmPi0WS_withPID -> D0:HpJmPi0_withPID pi-:all", Dstcuts, path=path)
502  ma.copyLists("D*+:HpJmPi0_withPID", ["D*+:HpJmPi0RS_withPID", "D*+:HpJmPi0WS_withPID"], path=path)
503  DstList.append("D*+:HpJmPi0_withPID")
504 
505  return DstList
506 
507 
508 @fancy_skim_header
510  """
511  **Decay Modes**:
512  * :math:`D^{*+}\\to \\pi^+ D^{0}, D^{0}\\to \\pi^+ \\pi^- \\pi^{0}`
513  * :math:`D^{*+}\\to \\pi^+ D^{0}, D^{0}\\to K^+ K^- \\pi^{0}`
514 
515  **Selection Criteria**:
516  * Use tracks from the loose lists in `stdCharged` to reconstruct D^{0}
517  * Use :math:`\\pi^{0}` from `stdPi0s.loadStdSkimPi0`
518  * ``1.70 < M(D0) < 2.10``
519  * No cut on the slow pion
520  * ``M(D*)-M(D0) < 0.16``
521  * ``pcms(D*) > 2.0``
522  * For more details, please check the source code of this skim.
523 
524  """
525 
526  __authors__ = ["Emma Oxford"]
527  __description__ = "Skim list for D*+ to pi+ D0, D0 to pi0 and two conjugate charged FSPs."
528  __contact__ = __liaison__
529  __category__ = "physics, charm"
530 
531  NoisyModules = ["ParticleLoader", "RootOutput"]
532  ApplyHLTHadronCut = True
533 
534  def load_standard_lists(self, path):
535  stdK("loose", path=path)
536  stdPi("loose", path=path)
537  loadStdSkimPhoton(path=path)
538  loadStdSkimPi0(path=path)
539 
540  def build_lists(self, path):
541  Dstcuts = "massDifference(0) < 0.160 and useCMSFrame(p) > 2.0"
542  charmcuts = "1.70 < M < 2.10"
543  ma.cutAndCopyList("pi0:myskim", "pi0:skim", "", path=path) # additional cuts removed 27 Jun 2019 by Emma Oxford
544  D0_Channels = [
545  "pi+:loose pi-:loose pi0:myskim",
546  "K+:loose K-:loose pi0:myskim",
547  ]
548 
549  DstList = []
550 
551  for chID, channel in enumerate(D0_Channels):
552  # NOTE: renamed to avoid particle list name clashes
553  ma.reconstructDecay("D0:HpHmPi0" + str(chID) + "_withPID" + " -> " + channel, charmcuts, chID, path=path)
554  ma.reconstructDecay(
555  "D*+:HpHmPi0" + str(chID) + "_withPID" + " -> D0:HpHmPi0" + str(chID) + "_withPID" + " pi+:all",
556  Dstcuts, chID, path=path)
557  DstList.append("D*+:HpHmPi0" + str(chID) + "_withPID")
558 
559  return DstList
560 
561 
562 @fancy_skim_header
564  """
565  **Decay Modes**:
566  * :math:`D^{*+}\\to \\pi^+ D^{0}, D^{0}\\to K_{S} \\pi^+ \\pi^- \\pi^{0}`
567 
568  **Selection Criteria**:
569  * Tracks from :math:`D^{0}`:
570  ``abs(d0) < 1, abs(z0) < 3, 0.296706 < theta < 2.61799``
571  * Use :math:`\\pi^{0}` from `stdPi0s.loadStdSkimPi0`, then require ``0.11 < M(pi0) < 0.15, p(pi0) > 0.25``
572  * ``1.66 < M(D0) < 2.06, pcms(D0) > 2.0``
573  * ``Q < 0.018``
574  * For more details, please check the source code of this skim.
575 
576  """
577 
578  __authors__ = []
579  __description__ = "Skim list for D*+ to pi+ D0, D0 to Ks pi+ pi- pi0."
580  __contact__ = __liaison__
581  __category__ = "physics, charm"
582 
583  NoisyModules = ["ParticleLoader", "RootOutput"]
584  ApplyHLTHadronCut = True
585 
586  def load_standard_lists(self, path):
587  stdPi("all", path=path)
588  loadStdSkimPi0(path=path)
589  stdKshorts(path=path)
590 
591  def build_lists(self, path):
592  mySel = "abs(d0) < 1 and abs(z0) < 3"
593  mySel += " and 0.296706 < theta < 2.61799"
594  ma.fillParticleList("pi+:ksomega", mySel, path=path)
595 
596  ma.cutAndCopyList("pi0:mypi0", "pi0:skim", "0.11 < M < 0.15 and p > 0.25 ", path=path)
597  ma.reconstructDecay("omega:3pi -> pi+:ksomega pi-:ksomega pi0:mypi0", "", path=path)
598 
599  charmcuts = "1.66 < M < 2.06 and useCMSFrame(p) > 2.0"
600  ma.reconstructDecay("D0:KsOmega -> K_S0:merged omega:3pi", charmcuts, path=path)
601 
602  DstList = []
603  ma.reconstructDecay("D*+:KsOmega -> D0:KsOmega pi+:all", "0 < Q < 0.018", path=path)
604  DstList.append("D*+:KsOmega")
605 
606  return DstList
607 
608 
609 @fancy_skim_header
611  """
612  **Decay Modes**:
613  * :math:`D^{*+}\\to \\pi^+ D^{0}, D^{0}\\to \\pi^+ \\pi^- \\pi^+ \\pi^-`
614  * :math:`D^{*+}\\to \\pi^+ D^{0}, D^{0}\\to \\pi^+ \\pi^- \\pi^+ K^-`
615  * :math:`D^{*+}\\to \\pi^+ D^{0}, D^{0}\\to \\pi^+ \\pi^- K^+ K^-`
616  * :math:`D^{*+}\\to \\pi^+ D^{0}, D^{0}\\to \\pi^+ K^- K^+ K^-`
617 
618  **Selection Criteria**:
619  * Tracks from :math:`D^{0}`:
620  ``abs(d0) < 1, abs(z0) < 3, 0.296706 < theta < 2.61799``
621  * ``1.66 < M(D0) < 2.06``
622  * No cut on the slow pion
623  * ``Q < 0.022, pcms(D*+) > 2.0``
624  * For more details, please check the source code of this skim.
625 
626  """
627 
628  __authors__ = ["Kavita Lalwani, Chanchal Sharma"]
629  __description__ = "Skim list for D*+ to K- pi+ pi- pi+."
630  __contact__ = __liaison__
631  __category__ = "physics, charm"
632 
633  NoisyModules = ["ParticleLoader", "RootOutput"]
634  ApplyHLTHadronCut = True
635 
636  def load_standard_lists(self, path):
637  stdPi("all", path=path)
638  stdK("all", path=path)
639 
640  def build_lists(self, path):
641  mySel = "abs(d0) < 1 and abs(z0) < 3"
642  mySel += " and 0.296706 < theta < 2.61799"
643  ma.fillParticleList("pi+:hphmhpjm", mySel, path=path)
644  ma.fillParticleList("K+:hphmhpjm", mySel, path=path)
645 
646  D0_Channels = [
647  "pi+:hphmhpjm pi-:hphmhpjm pi+:hphmhpjm pi-:hphmhpjm",
648  "pi+:hphmhpjm pi-:hphmhpjm pi+:hphmhpjm K-:hphmhpjm",
649  "pi+:hphmhpjm pi-:hphmhpjm K+:hphmhpjm K-:hphmhpjm",
650  "pi+:hphmhpjm K-:hphmhpjm K+:hphmhpjm K-:hphmhpjm",
651  ]
652 
653  D0cuts = "1.66 < M < 2.06"
654  Dstcuts = "0 < Q < 0.022 and useCMSFrame(p) > 2.0"
655 
656  DstList = []
657  for chID, channel in enumerate(D0_Channels):
658  ma.reconstructDecay("D0:HpHmHpJm" + str(chID) + " -> " + channel, D0cuts, chID, path=path)
659 
660  ma.reconstructDecay("D*+:HpHmHpJm" + str(chID) + " -> pi+:all D0:HpHmHpJm" + str(chID), Dstcuts, chID, path=path)
661  DstList.append("D*+:HpHmHpJm" + str(chID))
662 
663  return DstList
664 
665 
666 @fancy_skim_header
668  """
669  **Decay Modes**:
670  * :math:`D^{*+}\\to \\pi^- D^{0}, D^{0}\\to \\pi^+ \\pi^- \\eta, \\eta\\to \\gamma \\gamma`
671  * :math:`RS: D^{*+}\\to \\pi^+ D^{0}, D^{0}\\to K^- \\pi^+ \\eta, \\eta\\to \\gamma \\gamma`
672  * :math:`WS: D^{*+}\\to \\pi^+ D^{0}, D^{0}\\to K^+ \\pi^- \\eta, \\eta\\to \\gamma \\gamma`
673  * :math:`D^{*+}\\to \\pi^- D^{0}, D^{0}\\to K^+ K^- \\eta, \\eta\\to \\gamma \\gamma`
674 
675  **Selection Criteria**:
676  * Use tracks from the loose lists in `stdCharged` to reconstruct D^{0}
677  * ``0.47 < M(eta) < 0.60, p(eta) > 0.24``
678  * ``1.66 < M(D0) < 2.06, pcms(D0) > 2.0``
679  * No cut on the slow pion
680  * ``M(D*)-M(D0) < 0.16``
681  * For more details, please check the source code of this skim.
682 
683  """
684 
685  __authors__ = []
686  __description__ = (
687  "Skim list for D*+ to pi+ D0, D0 to eta and two charged FSPs, where the kinds "
688  "of two charged FSPs are different. The wrong sign(WS) mode, D*- to pi- D0, is "
689  "also included."
690  )
691  __contact__ = __liaison__
692  __category__ = "physics, charm"
693 
694  NoisyModules = ["ParticleLoader", "RootOutput"]
695  ApplyHLTHadronCut = True
696 
697  def load_standard_lists(self, path):
698  stdK("loose", path=path)
699  stdPi("loose", path=path)
700  loadStdSkimPhoton(path=path)
701  stdKshorts(path=path)
702 
703  def build_lists(self, path):
704  Dstcuts = "massDifference(0) < 0.160 and useCMSFrame(p) > 2.0"
705  charmcuts = "1.66 < M < 2.06"
706  ma.reconstructDecay("eta:myskim -> gamma:loose gamma:loose", "0.47 < M < 0.60 and p > 0.24", path=path)
707  D0_Channels = [
708  "pi-:loose pi+:loose eta:myskim",
709  "K-:loose pi+:loose eta:myskim",
710  "pi-:loose K+:loose eta:myskim",
711  "K-:loose K+:loose eta:myskim",
712  ]
713 
714  DstList = []
715 
716  for chID, channel in enumerate(D0_Channels):
717  # NOTE: renamed to avoid particle list name clashes
718  ma.reconstructDecay("D0:HpJmEta" + str(chID) + " -> " + channel, charmcuts, chID, path=path)
719  ma.reconstructDecay(
720  "D*+:HpJmEta" + str(chID) + " -> D0:HpJmEta" + str(chID) + " pi+:all",
721  Dstcuts, chID, path=path)
722  DstList.append("D*+:HpJmEta" + str(chID))
723 
724  return DstList
725 
726 
727 @fancy_skim_header
729  """
730  **Decay Modes**:
731  * :math:`D^{*+}\\to \\pi^+ D^{0}`, where the :math:`D^{0}` is reconstructed
732  by `XToD0_D0ToNeutrals.D0ToNeutrals`.
733 
734  **Selection Criteria**:
735  * Apply the cuts in `XToD0_D0ToNeutrals`
736  * No cut on the slow pion
737  * ``Q < 0.02``
738  * For more details, please check the source code of this skim.
739 
740  """
741 
742  __authors__ = ["Giulia Casarosa", "Emma Oxford"]
743  __description__ = "Same as `XToD0_D0ToNeutrals`, but requiring that the D0 is from D* decay."
744  __contact__ = __liaison__
745  __category__ = "physics, charm"
746 
747  NoisyModules = ["ParticleLoader", "RootOutput"]
748 
749  def load_standard_lists(self, path):
750  stdPi("all", path=path)
751  loadStdSkimPi0(path=path)
752  stdKshorts(path=path)
753 
754  def build_lists(self, path):
755 
756  D0List = self.D0ToNeutralsD0ToNeutrals(path)
757 
758  Dstcuts = "0 < Q < 0.02"
759 
760  DstList = []
761  for chID, channel in enumerate(D0List):
762  ma.reconstructDecay("D*+:2Nbdy" + str(chID) + " -> pi+:all " + channel, Dstcuts, chID, path=path)
763  DstList.append("D*+:2Nbdy" + str(chID))
764 
765  return DstList
766 
767 
768 @fancy_skim_header
770  """
771  **Decay Modes**:
772  * :math:`D^{*+}\\to \\pi^+ D^{0}, D^{0}\\to K_{S} \\pi^+ \\pi^-`
773  * :math:`D^{*+}\\to \\pi^+ D^{0}, D^{0}\\to K_{S} \\pi^+ K^-`
774  * :math:`D^{*+}\\to \\pi^+ D^{0}, D^{0}\\to K_{S} K^+ \\pi^-`
775  * :math:`D^{*+}\\to \\pi^+ D^{0}, D^{0}\\to K_{S} K^+ K^-`
776 
777  **Selection Criteria**:
778  * Tracks from :math:`D^{0}`:
779  ``abs(d0) < 1, abs(z0) < 3, 0.296706 < theta < 2.61799``
780  * Use :math:`K_{S}` from `stdV0s.stdKshorts`
781  * ``1.66 < M(D0) < 2.06``
782  * No cut on the slow pion
783  * ``Q < 0.022``
784  * ``pcms(D*) > 2.0``
785  * For more details, please check the source code of this skim.
786 
787  """
788 
789  __authors__ = ["Yeqi Chen"]
790  __description__ = "Skim list for D*+ to pi+ D0, D0 to Ks and two conjugate charged FSPs."
791  __contact__ = __liaison__
792  __category__ = "physics, charm"
793 
794  NoisyModules = ["ParticleLoader", "RootOutput"]
795  ApplyHLTHadronCut = True
796 
797  def load_standard_lists(self, path):
798  stdKshorts(path=path)
799 
800  def build_lists(self, path):
801  mySel = "abs(d0) < 1 and abs(z0) < 3"
802  mySel += " and 0.296706 < theta < 2.61799"
803  ma.fillParticleList("pi+:hpjmks", mySel, path=path)
804  ma.fillParticleList("K+:hpjmks", mySel, path=path)
805 
806  D0cuts = "1.66 < M < 2.06"
807  Dstcuts = "0 < Q < 0.022 and useCMSFrame(p) > 2.0"
808 
809  D0_Channels = ["pi-:hpjmks pi+:hpjmks K_S0:merged",
810  "K-:hpjmks pi+:hpjmks K_S0:merged",
811  "pi-:hpjmks K+:hpjmks K_S0:merged",
812  "K-:hpjmks K+:hpjmks K_S0:merged",
813  ]
814  DstList = []
815 
816  for chID, channel in enumerate(D0_Channels):
817  ma.reconstructDecay("D0:HpJmKs" + str(chID) + " -> " + channel, D0cuts, chID, path=path)
818 
819  ma.reconstructDecay("D*+:HpJmKs" + str(chID) + " -> pi+:all D0:HpJmKs" + str(chID), Dstcuts, chID, path=path)
820  DstList.append("D*+:HpJmKs" + str(chID))
821 
822  return DstList
823 
824 
825 @fancy_skim_header
827  """
828  Cut criteria are not finally decided, and could be changed. Please check the
829  code in the master branch to get up-to-date information.
830  """
831 
832  __authors__ = []
833  __description__ = "An special version of `DstToD0Pi_D0ToHpJmPi0` to deal with Early Data."
834  __contact__ = __liaison__
835  __category__ = "physics, charm"
836 
837  NoisyModules = ["ParticleLoader", "RootOutput"]
838  ApplyHLTHadronCut = True
839 
840  def load_standard_lists(self, path):
841  loadStdSkimPhoton(path=path)
842  loadStdSkimPi0(path=path)
843 
844  def build_lists(self, path):
845  mySel = "abs(d0) < 0.5 and abs(z0) < 1.0" # IP cut, tighter than previous skims
846  mySel += " and 0.296706 < theta < 2.61799" # CDC acceptance cut
847  ma.fillParticleList("pi+:myhjp0", mySel, path=path)
848  ma.fillParticleList("K+:myhjp0", mySel, path=path)
849 
850  ma.cutAndCopyList("pi0:myhjp0", "pi0:skim", "", path=path) # see analysis/scripts/stdPi0s.py for cuts
851 
852  D0cuts = "1.70 < M < 2.10"
853  Dstcuts = "massDifference(0) < 0.160 and useCMSFrame(p) > 2.0"
854 
855  eventcuts = "nCleanedTracks(abs(d0) < 0.5 and abs(z0) < 1.0) >= 3"
856  path = self.skim_event_cutsskim_event_cuts(eventcuts, path=path)
857 
858  DstList = []
859  ma.reconstructDecay("D0:HpJmPi0 -> K-:myhjp0 pi+:myhjp0 pi0:myhjp0", D0cuts, path=path)
860  ma.reconstructDecay("D*+:HpJmPi0RS -> D0:HpJmPi0 pi+:myhjp0", Dstcuts, path=path)
861  ma.reconstructDecay("D*-:HpJmPi0WS -> D0:HpJmPi0 pi-:myhjp0", Dstcuts, path=path)
862  ma.copyLists("D*+:HpJmPi0", ["D*+:HpJmPi0RS", "D*+:HpJmPi0WS"], path=path)
863  DstList.append("D*+:HpJmPi0")
864 
865  return DstList
866 
867 
868 @fancy_skim_header
870  """
871  Cut criteria are not finally decided, and could be changed. Please check the
872  code in the master branch to get up-to-date information.
873  """
874 
875  __authors__ = []
876  __description__ = "A special version of `DstToD0Pi_D0ToHpHmPi0` to deal with Early Data."
877  __contact__ = __liaison__
878  __category__ = "physics, charm"
879 
880  NoisyModules = ["ParticleLoader", "RootOutput"]
881  ApplyHLTHadronCut = True
882 
883  def load_standard_lists(self, path):
884  loadStdSkimPi0(path=path)
885 
886  def build_lists(self, path):
887  mySel = "abs(d0) < 0.5 and abs(z0) < 1.0" # IP cut, tighter than previous skims
888  mySel += " and 0.296706 < theta < 2.61799" # CDC acceptance cut
889  ma.fillParticleList("pi+:myhhp0", mySel, path=path)
890  ma.fillParticleList("K+:myhhp0", mySel, path=path)
891 
892  ma.cutAndCopyList("pi0:myhhp0", "pi0:skim", "", path=path) # see analysis/scripts/stdPi0s.py for cuts
893 
894  D0cuts = "1.70 < M < 2.10"
895  Dstcuts = "massDifference(0) < 0.160 and useCMSFrame(p) > 2.0"
896 
897  eventcuts = "nCleanedTracks(abs(d0) < 0.5 and abs(z0) < 1.0) >= 3"
898  path = self.skim_event_cutsskim_event_cuts(eventcuts, path=path)
899 
900  D0_Channels = ["pi+:myhhp0 pi-:myhhp0 pi0:myhhp0",
901  "K+:myhhp0 K-:myhhp0 pi0:myhhp0",
902  ]
903 
904  DstList = []
905 
906  for chID, channel in enumerate(D0_Channels):
907  ma.reconstructDecay("D0:HpHmPi0" + str(chID) + " -> " + channel, D0cuts, chID, path=path)
908  ma.reconstructDecay("D*+:HpHmPi0" + str(chID) + " -> D0:HpHmPi0" + str(chID) + " pi+:myhhp0",
909  Dstcuts, chID, path=path)
910  DstList.append("D*+:HpHmPi0" + str(chID))
911 
912  return DstList
def build_lists(self, path)
Definition: charm.py:640
def load_standard_lists(self, path)
Definition: charm.py:636
def build_lists(self, path)
Definition: charm.py:540
def load_standard_lists(self, path)
Definition: charm.py:534
def build_lists(self, path)
Definition: charm.py:703
def load_standard_lists(self, path)
Definition: charm.py:697
def build_lists(self, path)
Definition: charm.py:800
def load_standard_lists(self, path)
Definition: charm.py:797
def build_lists(self, path)
Definition: charm.py:492
def load_standard_lists(self, path)
Definition: charm.py:487
def build_lists(self, path)
Definition: charm.py:444
def load_standard_lists(self, path)
Definition: charm.py:440
def build_lists(self, path)
Definition: charm.py:591
def load_standard_lists(self, path)
Definition: charm.py:586
def build_lists(self, path)
Definition: charm.py:754
def load_standard_lists(self, path)
Definition: charm.py:749
def build_lists(self, path)
Definition: charm.py:210
def load_standard_lists(self, path)
Definition: charm.py:203
def build_lists(self, path)
Definition: charm.py:400
def load_standard_lists(self, path)
Definition: charm.py:396
def load_standard_lists(self, path)
Definition: charm.py:883
def load_standard_lists(self, path)
Definition: charm.py:840
def build_lists(self, path)
Definition: charm.py:357
def load_standard_lists(self, path)
Definition: charm.py:352
def build_lists(self, path)
Definition: charm.py:106
def D0ToHpJm(path)
Definition: charm.py:64
def build_lists(self, path)
Definition: charm.py:169
def D0ToNeutrals(path)
Definition: charm.py:133
def load_standard_lists(self, path)
Definition: charm.py:124
def build_lists(self, path)
Definition: charm.py:311
def load_standard_lists(self, path)
Definition: charm.py:307
def build_lists(self, path)
Definition: charm.py:261
def load_standard_lists(self, path)
Definition: charm.py:256
def skim_event_cuts(self, cut, *path)
Definition: core.py:272