Belle II Software  release-06-02-00
generateSADBg.py
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3 
4 
11 
12 # ------------------------------------------------------------------------------------
13 # BG simulation using SAD input files
14 #
15 # uses phase2 SAD files from /group/belle2/BGcampaigns/SAD/forG4/
16 #
17 # usage:
18 # basf2 generateSADBg.py bgType accRing equivTime_us num [sampleType phase outdir]
19 # arguments:
20 # bgType Coulomb, Touschek or Brems
21 # accRing LER or HER
22 # equivTime_us equivalent SuperKEKB running time in micro-seconds
23 # num output file number
24 # sampleType one of: study, usual, PXD, ECL
25 # phase 2, 31 (= early phase 3) or 3
26 # sad SAD file name from /home/belle/luka/public/SAD without bg type and ".root"
27 # outdir output directory path
28 # -------------------------------------------------------------------------------------
29 
30 import basf2 as b2
31 import sys
32 import os
33 from background import add_output
34 
35 # read parameters
36 
37 argvs = sys.argv
38 argc = len(argvs)
39 
40 if argc == 5:
41  bgType = argvs[1] # Coulomb, Touschek, Brems
42  accRing = argvs[2] # LER or HER
43  equivTime = argvs[3] # equivalent SuperKEKB running time in micro-seconds
44  num = argvs[4] # output file number
45  sampleType = 'usual' # study, usual, PXD, ECL
46  phase = 3 # 2 or 3
47  sad = 'phase2.1.4_collimators_1'
48  outdir = 'output' # output directory path
49 elif argc == 6:
50  bgType = argvs[1]
51  accRing = argvs[2]
52  equivTime = argvs[3]
53  num = argvs[4]
54  sampleType = argvs[5]
55  phase = 3
56  sad = 'phase2.1.4_collimators_1'
57  outdir = 'output'
58 elif argc == 7:
59  bgType = argvs[1]
60  accRing = argvs[2]
61  equivTime = argvs[3]
62  num = argvs[4]
63  sampleType = argvs[5]
64  phase = int(argvs[6])
65  sad = 'phase2.1.4_collimators_1'
66  outdir = 'output'
67 elif argc == 8:
68  bgType = argvs[1]
69  accRing = argvs[2]
70  equivTime = argvs[3]
71  num = argvs[4]
72  sampleType = argvs[5]
73  phase = int(argvs[6])
74  sad = argvs[7]
75  outdir = 'output'
76 elif argc == 9:
77  bgType = argvs[1]
78  accRing = argvs[2]
79  equivTime = argvs[3]
80  num = argvs[4]
81  sampleType = argvs[5]
82  phase = int(argvs[6])
83  sad = argvs[7]
84  outdir = argvs[8]
85 else:
86  print('usage:')
87  print('basf2', argvs[0],
88  '(Touschek,Coulomb,Brems) (HER,LER) equivTime_us num [(study,usual,ECL,PXD) phase outdir]')
89  sys.exit()
90 
91 
92 inputSAD = "/group/belle2/BGcampaigns/SAD/forG4/"
93 bgType = bgType + '_' + accRing
94 sadFile = inputSAD + bgType + '_' + sad + '.root'
95 realTime = float(equivTime) * 1000
96 fname = bgType + '_' + sampleType + '-phase' + str(phase) + '-' + num
97 outputFile = outdir + '/' + fname + '.root'
98 
99 # check for the existance of a SAD file
100 
101 if not os.path.exists(sadFile):
102  b2.B2ERROR('SAD file ' + sadFile + ' not found')
103  sys.exit()
104 
105 # make output directory if it doesn't exist
106 
107 if not os.path.exists(outdir):
108  os.makedirs(outdir)
109 
110 # log message
111 b2.B2RESULT('Output file: ' + outputFile)
112 b2.B2RESULT('Corresponds to ' + equivTime + ' us of running phase ' + str(phase))
113 
114 # Suppress messages and warnings during processing:
115 b2.set_log_level(b2.LogLevel.RESULT)
116 
117 # Create path
118 main = b2.create_path()
119 
120 # Event info setter
121 # Set some large number of events - processing will be stopped by BG generator
122 eventinfosetter = b2.register_module('EventInfoSetter')
123 eventinfosetter.param('evtNumList', [10000000])
124 main.add_module(eventinfosetter)
125 
126 # Gearbox
127 gearbox = b2.register_module('Gearbox')
128 if phase == 2:
129  gearbox.param('fileName', 'geometry/Beast2_phase2.xml')
130 elif phase == 31:
131  gearbox.param('fileName', 'geometry/Belle2_earlyPhase3.xml')
132 if sampleType == 'study':
133  gearbox.param('override', [
134  ("/DetectorComponent[@name='PXD']//ActiveChips", 'true', ''),
135  ("/DetectorComponent[@name='PXD']//SeeNeutrons", 'true', ''),
136  ("/DetectorComponent[@name='SVD']//ActiveChips", 'true', ''),
137  ("/DetectorComponent[@name='SVD']//SeeNeutrons", 'true', ''),
138  ("/DetectorComponent[@name='TOP']//BeamBackgroundStudy", '1', ''),
139  ("/DetectorComponent[@name='ARICH']//BeamBackgroundStudy", '1', ''),
140  ("/DetectorComponent[@name='ECL']//BeamBackgroundStudy", '1', ''),
141  ("/DetectorComponent[@name='KLM']//BeamBackgroundStudy", '1', ''),
142  ])
143 main.add_module(gearbox)
144 
145 # BG generator
146 generator = b2.register_module('BeamBkgGenerator')
147 generator.param('fileName', sadFile)
148 generator.param('ringName', accRing)
149 generator.param('realTime', realTime)
150 main.add_module(generator)
151 
152 # Geant geometry
153 geometry = b2.register_module('Geometry')
154 geometry.param('useDB', False)
155 if phase == 31:
156  geometry.param('additionalComponents', ['BEAMABORT', 'MICROTPC', 'CLAWS', 'HE3TUBE'])
157 main.add_module(geometry)
158 
159 # Geant simulation
160 fullsim = b2.register_module('FullSim')
161 if sampleType == 'study':
162  fullsim.param('PhysicsList', 'FTFP_BERT_HP')
163  fullsim.param('UICommandsAtIdle', ['/process/inactivate nKiller'])
164  fullsim.param('StoreAllSecondaries', True)
165  fullsim.param('SecondariesEnergyCut', 0.000001) # [MeV] need for CDC EB neutron flux
166 main.add_module(fullsim)
167 
168 # Show progress of processing
169 progress = b2.register_module('Progress')
170 main.add_module(progress)
171 
172 # Output
173 if phase == 31:
174  phase = 3
175 
176 # to not store MCParticles use this, if you want MCParticles comment these two lines and uncomment the line after
177 excludeBranch = ['MCParticles']
178 add_output(main, bgType, realTime, sampleType, phase, fileName=outputFile, excludeBranches=excludeBranch)
179 
180 
181 # Process events
182 b2.process(main)
183 
184 # Print call statistics
185 print(b2.statistics)