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