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