8 from .constants
import EventCode, EventCode_CrossSection, EventCodes
10 from basf2
import B2FATAL, Module
11 from generators
import add_aafh_generator, add_koralw_generator, add_treps_generator
14 def add_low_multiplicity_generator(path, event_code):
16 Add dedicated generator based on EventCode.
17 Module name is also changed to avoid conflicts
20 path (basf2.Path): path where generators should be added
21 event_code (EventCode): EventCode integer to identify a channel
24 if event_code
not in EventCodes:
25 B2FATAL(f
'The event code {event_code} is unknown.')
26 if event_code
is EventCode.eetautau:
27 add_aafh_generator(path,
'e+e-tau+tau-', enableTauDecays=
False)
28 rename_module_in_path(path,
'AafhInput',
'AAFH_eetautau')
29 elif event_code
is EventCode.mumumumu:
30 add_aafh_generator(path,
'mu+mu-mu+mu-')
31 rename_module_in_path(path,
'AafhInput',
'AAFH_mumumumu')
32 elif event_code
is EventCode.mumutautau:
33 add_aafh_generator(path,
'mu+mu-tau+tau-', enableTauDecays=
False)
34 rename_module_in_path(path,
'AafhInput',
'AAFH_mumutautau')
35 elif event_code
is EventCode.tautautautau:
36 add_koralw_generator(path,
'tau+tau-tau+tau-', enableTauDecays=
False)
37 rename_module_in_path(path,
'KoralWInput',
'KoralW_tautautautau')
38 elif event_code
is EventCode.eepipi:
39 add_treps_generator(path,
'e+e-pi+pi-')
40 rename_module_in_path(path,
'TrepsInput',
'TREPS_eepipi')
41 elif event_code
is EventCode.eeKK:
42 add_treps_generator(path,
'e+e-K+K-')
43 rename_module_in_path(path,
'TrepsInput',
'TREPS_eeKK')
44 elif event_code
is EventCode.eepp:
45 add_treps_generator(path,
'e+e-ppbar')
46 rename_module_in_path(path,
'TrepsInput',
'TREPS_eepp')
47 elif event_code
is EventCode.pipiISR:
48 m = path.add_module(
'PhokharaInput', FinalState=1, LO=0, NLO=1, QED=0, MinInvMassHadrons=0.)
49 m.set_name(
'PHOKHARA_pipiISR')
50 elif event_code
is EventCode.pipipi0ISR:
51 m = path.add_module(
'PhokharaInput', FinalState=8, LO=0, NLO=1, QED=0, MinInvMassHadrons=0.)
52 m.set_name(
'PHOKHARA_pipipi0ISR')
53 elif event_code
is EventCode.pipipipiISR:
54 m = path.add_module(
'PhokharaInput', FinalState=3, LO=0, NLO=1, QED=0, MinInvMassHadrons=0.)
55 m.set_name(
'PHOKHARA_pipipipiISR')
56 elif event_code
is EventCode.pipipi0pi0ISR:
57 m = path.add_module(
'PhokharaInput', FinalState=2, LO=0, NLO=1, QED=0, MinInvMassHadrons=0.)
58 m.set_name(
'PHOKHARA_pipipi0pi0ISR')
59 elif event_code
is EventCode.etapipiISR:
60 m = path.add_module(
'PhokharaInput', FinalState=10, LO=0, NLO=1, QED=0, MinInvMassHadrons=0.)
61 m.set_name(
'PHOKHARA_etapipiISR')
62 elif event_code
is EventCode.KKISR:
63 m = path.add_module(
'PhokharaInput', FinalState=6, LO=0, NLO=1, QED=0, MinInvMassHadrons=0.)
64 m.set_name(
'PHOKHARA_KKISR')
65 elif event_code
is EventCode.K0K0barISR:
66 m = path.add_module(
'PhokharaInput', FinalState=7, LO=0, NLO=1, QED=0, MinInvMassHadrons=0.)
67 m.set_name(
'PHOKHARA_K0K0barISR')
68 elif event_code
is EventCode.ppbarISR:
69 m = path.add_module(
'PhokharaInput', FinalState=4, LO=0, NLO=1, QED=0, MinInvMassHadrons=0.)
70 m.set_name(
'PHOKHARA_ppbarISR')
73 def get_event_ranges(events, event_codes=None):
75 Get event range for channels to be generated. The number of events of each channel is determined by:
76 channel cross-section / total cross-section of all channels assigned to the same basf2 job.
79 events (int): Total number of events
80 event_codes (Iterable): tuple or list of EventCode.
82 a dictionary with EvenCode as the key and tuple of event range as value.
84 total_cross_section = sum(EventCode_CrossSection[e]
for e
in event_codes)
85 lower_range_delimiter = 0
88 weight = EventCode_CrossSection[e] / total_cross_section
90 if e == event_codes[len(event_codes) - 1]:
91 return_dict[e] = (lower_range_delimiter, events + 1)
93 events_in_range = round(events * weight)
94 return_dict[e] = (lower_range_delimiter, lower_range_delimiter + events_in_range)
95 lower_range_delimiter += events_in_range
98 def rename_module_in_path(path, module_type, new_module_name):
100 Helper function to rename a module named with its type.
102 path (basf2.Path): path where a module to be renamed
103 module_type (str): default module name which is also module.type()
104 new_module_name (str): new module name
106 for module
in path.modules():
107 if module.type() == module_type:
108 module.set_name(new_module_name)
113 Module to set ``eventExtraInfo(EventCode)`` according to event range
117 event_codes (Iterable): tuple or list of EventCode.
124 event_codes (Iterable): tuple or list of EventCode.
127 super(EventRangePathSplitter, self).
__init__()
139 Initialize module before any events are processed
142 self.
event_rangesevent_ranges = get_event_ranges(ROOT.Belle2.Environment.Instance().getNumberOfEvents(), self.
event_codesevent_codes)
146 """Begin run method of the module"""
150 """Event method of the module"""
155 B2FATAL(
'The EventExtraInfo object has already an EventCode field registered.')
156 for event_code, event_range
in self.
event_rangesevent_ranges.items():
157 if (event_range[0] <= self.
event_numberevent_number < event_range[1]):
158 self.
event_extra_infoevent_extra_info.setExtraInfo(
'EventCode', event_code.value)
159 self.return_value(event_code.value)
167 Helper module to return True if the value from ``eventExtraInfo(EventCode)``
168 is included in the event_codes parameter.
171 event_codes (Iterable): tuple or list of EventCode.
178 event_codes (Iterable): tuple or list of EventCode.
181 super(ExtraInfoPathSplitter, self).
__init__()
189 Initialize module before any events are processed
194 """Event method of the module"""
196 B2FATAL(
'The EventExtraInfo object has no EventCode field registered.')
event_codes
tuple or list of event codes
event_ranges
Dictionary to get number of events for each event code.
def __init__(self, event_codes)
event_extra_info
PyStoreObj off EventExtraInfo.
event_number
Event number.