28 from background
import add_output
65 print(
' basf2', argvs[0],
'generator equivTime_us num [sampleType phase outdir]')
67 print(
' generator one of: bbbrem, bhwide, bhwide_largeangle')
68 print(
' equivTime_us equivalent SuperKEKB running time in micro-seconds')
69 print(
' num output file number')
70 print(
' sampleType one of: study, usual, PXD, ECL')
71 print(
' phase 2, 31 (= early phase 3) or 3')
72 print(
' outdir output directory path')
77 if generator ==
'bbbrem':
80 elif generator ==
'bhwide':
83 elif generator ==
'bhwide_largeangle':
84 bgType =
'BHWideLargeAngle'
87 print(
'unknown generator: ', generator)
97 print(
'phase ', phase,
'not supported')
100 realTime = float(equivTime) * 1000
101 numEvents = int(crossect * lumi * realTime * 1e-9)
102 fname = bgType +
'_' + sampleType +
'-phase' + str(phase) +
'-' + num
103 outputFile = outdir +
'/' + fname +
'.root'
106 b2.B2ERROR(
'number of events is 0 -> increase equivTime_us')
111 if not os.path.exists(outdir):
116 b2.B2RESULT(
'Events to be generated: ' + str(numEvents) +
' - corresponds to ' + equivTime +
117 ' us of running at ' + str(lumi) +
' /nb/s (phase ' + str(phase) +
')')
118 b2.B2RESULT(
'Output file: ' + outputFile)
122 b2.set_log_level(b2.LogLevel.RESULT)
125 main = b2.create_path()
126 kill = b2.create_path()
129 def add_cut(name, minParticles, maxParticles, minTheta, maxTheta=None):
130 """Add a generator level cut and kill the event if the cut is not passed. In
131 this case the cut is on the min/max charged particles which have a
132 center-of-mass theta angle between minTheta and maxTheta. If maxTheta is not
133 given assume it to be 180-minTheta for a symmetric window"""
137 maxTheta = 180 - minTheta
138 selection = main.add_module(
'GeneratorPreselection')
139 selection.param(
'applyInCMS',
True)
140 selection.param(
'nChargedMin', minParticles)
141 selection.param(
'nChargedMax', maxParticles)
142 selection.param(
'MinChargedTheta', minTheta)
143 selection.param(
'MaxChargedTheta', maxTheta)
144 selection.param(
'MinChargedP', 0.)
145 selection.param(
'MinChargedPt', 0.)
146 selection.if_value(
"!=11", kill)
147 selection.set_name(
"generator cut: " + name)
151 eventinfosetter = b2.register_module(
'EventInfoSetter')
152 eventinfosetter.param(
'evtNumList', [numEvents])
153 main.add_module(eventinfosetter)
156 gearbox = b2.register_module(
'Gearbox')
158 gearbox.param(
'fileName',
'geometry/Beast2_phase2.xml')
160 gearbox.param(
'fileName',
'geometry/Belle2_earlyPhase3.xml')
161 if sampleType ==
'study':
162 gearbox.param(
'override', [
163 (
"/DetectorComponent[@name='PXD']//ActiveChips",
'true',
''),
164 (
"/DetectorComponent[@name='PXD']//SeeNeutrons",
'true',
''),
165 (
"/DetectorComponent[@name='SVD']//ActiveChips",
'true',
''),
166 (
"/DetectorComponent[@name='SVD']//SeeNeutrons",
'true',
''),
167 (
"/DetectorComponent[@name='TOP']//BeamBackgroundStudy",
'1',
''),
168 (
"/DetectorComponent[@name='ARICH']//BeamBackgroundStudy",
'1',
''),
169 (
"/DetectorComponent[@name='ECL']//BeamBackgroundStudy",
'1',
''),
170 (
"/DetectorComponent[@name='KLM']//BeamBackgroundStudy",
'1',
''),
172 main.add_module(gearbox)
175 if generator ==
"bbbrem":
176 main.add_module(
"BBBremInput", MinPhotonEnergyFraction=0.000001, Unweighted=
True,
177 MaxWeight=1.57001e+07)
179 add_cut(
"at least one track below 0.5 degree", 0, 1, 0.5)
180 elif generator ==
"bhwide":
181 main.add_module(
"BHWideInput", ScatteringAngleRangeElectron=[0.5, 179.5],
182 ScatteringAngleRangePositron=[0.5, 179.5])
183 add_cut(
"both tracks at least 0.5 degree", 2, 2, 0.5)
186 add_cut(
"max one track in 1-170", 0, 1, 1, 170)
187 add_cut(
"max one track in 10-179", 0, 1, 10, 179)
188 elif generator ==
"bhwide_largeangle":
189 main.add_module(
"BHWideInput", ScatteringAngleRangeElectron=[0.5, 179.5],
190 ScatteringAngleRangePositron=[0.5, 179.5])
191 add_cut(
"both tracks at least 1 degree", 2, 2, 1)
192 add_cut(
"at least one 10 degree", 1, 2, 10)
194 print(
"unknown generation setting: {}".format(generator))
197 geometry = b2.register_module(
'Geometry')
198 geometry.param(
'useDB',
False)
199 addComp = [
"MagneticField3dQuadBeamline"]
201 if phase == 31
and sampleType ==
'study':
202 addComp.extend([
"BEAMABORT",
"MICROTPC",
"CLAWS",
"HE3TUBE"])
204 geometry.param({
"excludedComponents": [
"MagneticField"],
205 "additionalComponents": addComp})
206 main.add_module(geometry)
209 fullsim = b2.register_module(
'FullSim')
210 if sampleType ==
'study':
211 fullsim.param(
'PhysicsList',
'FTFP_BERT_HP')
212 fullsim.param(
'UICommandsAtIdle', [
'/process/inactivate nKiller'])
213 fullsim.param(
'StoreAllSecondaries',
True)
214 fullsim.param(
'SecondariesEnergyCut', 0.000001)
215 main.add_module(fullsim)
218 progress = b2.register_module(
'Progress')
219 main.add_module(progress)
224 add_output(main, bgType, realTime, sampleType, phase, fileName=outputFile)