Reconstructed decay modes:
* :math:`B^0 \\to \\pi^- e^+`
* :math:`B^0 \\to \\pi^- \\mu^+`
Event-level cuts:
* :math:`\\text{foxWolframR2} < 0.5` constructed using tracks with
:math:`p_T>0.1\\,\\text{GeV}` and clusters with :math:`E>0.1\\,\\text{GeV}`.
* :math:`n_{\\text{tracks}} > 4`
Cuts on electrons:
* :math:`\\text{electronID_noTOP} > 0.5`
* :math:`p > 1.5\\,\\text{GeV}` in CMS frame
Cuts on muons:
* :math:`\\text{muonID} > 0.5`
* :math:`p > 1.5\\,\\text{GeV}` in CMS frame
Cuts on pions:
* :math:`\\text{pionID}>0.5`
* :math:`\\text{muonID}<0.2`
* :math:`0.060\\,\\text{GeV}<p<0.220\\,\\text{GeV}` in CMS frame
Cuts on partially reconstructed :math:`B` mesons:
* :math:`\\cos\\theta_{\\ell,\\,\\pi}<0` in CMS frame.
Definition at line 36 of file semileptonic.py.
def additional_setup |
( |
|
self, |
|
|
|
path |
|
) |
| |
|
inherited |
def build_lists |
( |
|
self, |
|
|
|
path |
|
) |
| |
Create the skim lists to be saved in the output uDST. This function is where
the main skim cuts should be applied. This function should return a list of
particle list names.
Parameters:
path (basf2.Path): Skim path to be processed.
.. versionchanged:: release-06-00-00
Previously, this function was expected to set the attribute
`BaseSkim.SkimLists`. Now this is handled by `BaseSkim`, and this function is
expected to return the list of particle list names.
Reimplemented from BaseSkim.
Definition at line 82 of file semileptonic.py.
82 def build_lists(self, path):
83 ma.fillParticleList(decayString=
"pi+:PRSL_eventshape",
84 cut=
"pt> 0.1", path=path)
85 ma.fillParticleList(decayString=
"gamma:PRSL_eventshape",
86 cut=
"E > 0.1", path=path, loadPhotonBeamBackgroundMVA=
False)
88 ma.buildEventShape(inputListNames=[
"pi+:PRSL_eventshape",
"gamma:PRSL_eventshape"],
91 harmonicMoments=
False,
97 checkForDuplicates=
False,
100 path = self.skim_event_cuts(
"foxWolframR2<0.5 and nTracks>4", path=path)
102 ma.cutAndCopyList(
"e+:PRSemileptonic_1",
"e+:all",
103 "useCMSFrame(p) > 1.50 and electronID_noTOP > 0.5", path=path)
104 ma.cutAndCopyList(
"mu+:PRSemileptonic_1",
"mu+:all",
105 "useCMSFrame(p) > 1.50 and muonID > 0.5", path=path)
106 ma.cutAndCopyList(
"pi-:PRSemileptonic_1",
"pi-:all",
107 "pionID>0.5 and muonID<0.2 and 0.060<useCMSFrame(p)<0.220", path=path)
109 ma.cutAndCopyList(
"e+:PRSemileptonic_2",
"e+:all",
110 "0.600 < useCMSFrame(p) <= 1.50 and electronID_noTOP > 0.5", path=path)
111 ma.cutAndCopyList(
"mu+:PRSemileptonic_2",
"mu+:all",
112 "0.350 < useCMSFrame(p) <= 1.50 and muonID > 0.5", path=path)
113 ma.cutAndCopyList(
"pi-:PRSemileptonic_2",
"pi-:all",
114 "pionID>0.5 and muonID<0.2 and 0.060<useCMSFrame(p)<0.160", path=path)
116 ma.reconstructDecay(
"B0:PRSemileptonic_1 -> pi-:PRSemileptonic_1 e+:PRSemileptonic_1",
117 "useCMSFrame(cos(daughterAngle(0,1)))<0.00", 1, path=path)
118 ma.reconstructDecay(
"B0:PRSemileptonic_2 -> pi-:PRSemileptonic_1 mu+:PRSemileptonic_1",
119 "useCMSFrame(cos(daughterAngle(0,1)))<0.00", 2, path=path)
120 ma.reconstructDecay(
"B0:PRSemileptonic_3 -> pi-:PRSemileptonic_2 e+:PRSemileptonic_2",
121 "useCMSFrame(cos(daughterAngle(0,1)))<1.00", 3, path=path)
122 ma.reconstructDecay(
"B0:PRSemileptonic_4 -> pi-:PRSemileptonic_2 mu+:PRSemileptonic_2",
123 "useCMSFrame(cos(daughterAngle(0,1)))<1.00", 4, path=path)
125 return [
"B0:PRSemileptonic_1",
"B0:PRSemileptonic_2"]
def skim_event_cuts |
( |
|
self, |
|
|
|
cut, |
|
|
* |
path |
|
) |
| |
|
inherited |
Apply event-level cuts in a skim-safe way.
Parameters:
cut (str): Event-level cut to be applied.
path (basf2.Path): Skim path to be processed.
Returns:
Path on which the rest of this skim should be processed.
On this path, only events which passed the event-level cut will
be processed further.
.. Tip::
If running this function in `BaseSkim.additional_setup` or
`BaseSkim.build_lists`, redefine the ``path`` to the path returned by
`BaseSkim.skim_event_cuts`, *e.g.*
.. code-block:: python
def build_lists(self, path):
path = self.skim_event_cuts("nTracks>4", path=path)
# rest of skim list building...
.. Note::
The motivation for using this function over `applyEventCuts` is that
`applyEventCuts` completely removes events from processing. If we combine
multiple skims in a single steering file (which is done in production), and
the first has a set of event-level cuts, then all the remaining skims will
never even see those events.
Internally, this function creates a new path, which is only processed for
events passing the event-level cut. To avoid issues around particles not
being available on the main path (leading to noisy error logs), we need to
add the rest of the skim to this path. So this new path is assigned to the
attribute ``BaseSkim._ConditionalPath``, and ``BaseSkim.__call__`` will run
all remaining methods on this path.
Definition at line 272 of file core.py.
Location of test MDST sample. To modify this, set the property
`BaseSkim.TestSampleProcess`, and this function will find an appropriate test
sample from the list in
``/group/belle2/dataprod/MC/SkimTraining/SampleLists/TestFiles.yaml``
If no sample can be found, an empty list is returned.
Reimplemented in CombinedSkim.
Definition at line 324 of file core.py.
def update_skim_flag |
( |
|
self, |
|
|
|
path |
|
) |
| |
|
inherited |
Add the module `skim.utils.flags.UpdateSkimFlag` to the path, which
updates flag for this skim.
.. Warning::
If a conditional path has been created before this, then this function
*must* run on the conditional path, since the skim lists are not guaranteed
to exist for all events on the main path.
Reimplemented in CombinedSkim.
Definition at line 362 of file core.py.