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