20 from background
import add_output
57 print(
' basf2', argvs[0],
'generator equivTime_us num [sampleType phase outdir]')
59 print(
' generator one of: bbbrem, bhwide, bhwide_largeangle')
60 print(
' equivTime_us equivalent SuperKEKB running time in micro-seconds')
61 print(
' num output file number')
62 print(
' sampleType one of: study, usual, PXD, ECL')
63 print(
' phase 2, 31 (= early phase 3) or 3')
64 print(
' outdir output directory path')
69 if generator ==
'bbbrem':
72 elif generator ==
'bhwide':
75 elif generator ==
'bhwide_largeangle':
76 bgType =
'BHWideLargeAngle'
79 print(
'unknown generator: ', generator)
89 print(
'phase ', phase,
'not supported')
92 realTime = float(equivTime) * 1000
93 numEvents = int(crossect * lumi * realTime * 1e-9)
94 fname = bgType +
'_' + sampleType +
'-phase' + str(phase) +
'-' + num
95 outputFile = outdir +
'/' + fname +
'.root'
98 B2ERROR(
'number of events is 0 -> increase equivTime_us')
103 if not os.path.exists(outdir):
108 B2RESULT(
'Events to be generated: ' + str(numEvents) +
' - corresponds to ' + equivTime +
109 ' us of running at ' + str(lumi) +
' /nb/s (phase ' + str(phase) +
')')
110 B2RESULT(
'Output file: ' + outputFile)
114 set_log_level(LogLevel.RESULT)
121 def add_cut(name, minParticles, maxParticles, minTheta, maxTheta=None):
122 """Add a generator level cut and kill the event if the cut is not passed. In
123 this case the cut is on the min/max charged particles which have a
124 center-of-mass theta angle between minTheta and maxTheta. If maxTheta is not
125 given assume it to be 180-minTheta for a symmetric window"""
129 maxTheta = 180 - minTheta
130 selection = main.add_module(
'GeneratorPreselection')
131 selection.param(
'applyInCMS',
True)
132 selection.param(
'nChargedMin', minParticles)
133 selection.param(
'nChargedMax', maxParticles)
134 selection.param(
'MinChargedTheta', minTheta)
135 selection.param(
'MaxChargedTheta', maxTheta)
136 selection.param(
'MinChargedP', 0.)
137 selection.param(
'MinChargedPt', 0.)
138 selection.if_value(
"!=11", kill)
139 selection.set_name(
"generator cut: " + name)
143 eventinfosetter = register_module(
'EventInfoSetter')
144 eventinfosetter.param(
'evtNumList', [numEvents])
145 main.add_module(eventinfosetter)
148 gearbox = register_module(
'Gearbox')
150 gearbox.param(
'fileName',
'geometry/Beast2_phase2.xml')
152 gearbox.param(
'fileName',
'geometry/Belle2_earlyPhase3.xml')
153 if sampleType ==
'study':
154 gearbox.param(
'override', [
155 (
"/DetectorComponent[@name='PXD']//ActiveChips",
'true',
''),
156 (
"/DetectorComponent[@name='PXD']//SeeNeutrons",
'true',
''),
157 (
"/DetectorComponent[@name='SVD']//ActiveChips",
'true',
''),
158 (
"/DetectorComponent[@name='SVD']//SeeNeutrons",
'true',
''),
159 (
"/DetectorComponent[@name='TOP']//BeamBackgroundStudy",
'1',
''),
160 (
"/DetectorComponent[@name='ARICH']//BeamBackgroundStudy",
'1',
''),
161 (
"/DetectorComponent[@name='ECL']//BeamBackgroundStudy",
'1',
''),
162 (
"/DetectorComponent[@name='KLM']//BeamBackgroundStudy",
'1',
''),
164 main.add_module(gearbox)
167 if generator ==
"bbbrem":
168 main.add_module(
"BBBremInput", MinPhotonEnergyFraction=0.000001, Unweighted=
True,
169 MaxWeight=1.57001e+07)
171 add_cut(
"at least one track below 0.5 degree", 0, 1, 0.5)
172 elif generator ==
"bhwide":
173 main.add_module(
"BHWideInput", ScatteringAngleRangeElectron=[0.5, 179.5],
174 ScatteringAngleRangePositron=[0.5, 179.5])
175 add_cut(
"both tracks at least 0.5 degree", 2, 2, 0.5)
178 add_cut(
"max one track in 1-170", 0, 1, 1, 170)
179 add_cut(
"max one track in 10-179", 0, 1, 10, 179)
180 elif generator ==
"bhwide_largeangle":
181 main.add_module(
"BHWideInput", ScatteringAngleRangeElectron=[0.5, 179.5],
182 ScatteringAngleRangePositron=[0.5, 179.5])
183 add_cut(
"both tracks at least 1 degree", 2, 2, 1)
184 add_cut(
"at least one 10 degree", 1, 2, 10)
186 print(
"unknown generation setting: {}".format(generator))
189 geometry = register_module(
'Geometry')
190 geometry.param(
'useDB',
False)
191 addComp = [
"MagneticField3dQuadBeamline"]
193 if phase == 31
and sampleType ==
'study':
194 addComp.extend([
"BEAMABORT",
"MICROTPC",
"CLAWS",
"HE3TUBE"])
196 geometry.param({
"excludedComponents": [
"MagneticField"],
197 "additionalComponents": addComp})
198 main.add_module(geometry)
201 fullsim = register_module(
'FullSim')
202 if sampleType ==
'study':
203 fullsim.param(
'PhysicsList',
'FTFP_BERT_HP')
204 fullsim.param(
'UICommandsAtIdle', [
'/process/inactivate nKiller'])
205 fullsim.param(
'StoreAllSecondaries',
True)
206 fullsim.param(
'SecondariesEnergyCut', 0.000001)
207 main.add_module(fullsim)
210 progress = register_module(
'Progress')
211 main.add_module(progress)
216 add_output(main, bgType, realTime, sampleType, phase, fileName=outputFile)