Belle II Software  release-05-01-25
testbeam_utils.py
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3 
4 # Geometry helpers for VXD testbeam 2017
5 
6 from basf2 import *
7 from ROOT import Belle2
8 from testbeam.utils import add_vxdtf_v2
9 
10 
11 def add_geometry(
12  path,
13  magnet=True,
14  field_override=None,
15  target=None,
16  geometry_xml='testbeam/vxd/2017_geometry.xml',
17  excluded_components=[],
18  geometry_version=1):
19 
20  additonal_components = []
21 
22  if geometry_version == 0:
23  print('WARNING: overriding the setting of parameter geometry_xml! Old value: ' + geometry_xml)
24  geometry_xml = 'testbeam/vxd/2017_geometry.xml'
25  print('New value: ' + geometry_xml)
26 
27  if geometry_version == 1:
28  print('WARNING: overriding the setting of parameter geometry_xml! Old value: ' + geometry_xml)
29  geometry_xml = 'testbeam/vxd/2017_geometry_1.xml'
30  print('New value: ' + geometry_xml)
31 
32  if target is not None:
33  additonal_components += [target]
34 
35  if not magnet:
36  excluded_components += ['MagneticField']
37 
38  if field_override is not None:
39  excluded_components += ['MagneticField']
40  additonal_components += ['MagneticFieldConstant']
41 
42  # Add gearbox, additonally override field value if set
43  if field_override is not None:
44  path.add_module('Gearbox',
45  fileName=geometry_xml,
46  override=[("/DetectorComponent[@name='MagneticFieldConstant']//Z",
47  str(field_override),
48  "")])
49  else:
50  path.add_module('Gearbox', fileName=geometry_xml)
51 
52  # Add geometry with additional/removed components
53  path.add_module('Geometry', excludedComponents=excluded_components, additionalComponents=additonal_components)
54 
55 
56 def add_simulation(path, momentum=5., positrons=False, momentum_spread=0.05):
57  # momentum = 6.0 # GeV/c
58  # momentum_spread = 0.05 # %
59  theta = 90.0 # degrees
60  theta_spread = 0.005 # degrees (sigma of gaussian)
61  phi = 0.0 # degrees
62  phi_spread = 0.005 # degrees (sigma of gaussian)
63  gun_x_position = -100. # cm ... 100cm ... outside magnet + plastic shielding + Al scatterer (air equiv.)
64  # gun_x_position = -40. # cm ... 40cm ... inside magnet
65  beamspot_size_y = 0.3 # cm (sigma of gaussian)
66  beamspot_size_z = 0.3 # cm (sigma of gaussian)
67  # ParticleGun
68  particlegun = register_module('ParticleGun')
69  # number of primaries per event
70  particlegun.param('nTracks', 1)
71  # DESY electrons/positrons:
72  if not positrons:
73  particlegun.param('pdgCodes', [11])
74  else:
75  particlegun.param('pdgCodes', [-11])
76 
77  # momentum magnitude 2 GeV/c or something above or around.
78  # At DESY we can have up to 6 GeV/c(+-5%) electron beam.
79  # Beam divergence and spot size is adjusted similar to reality
80  # See studies of Benjamin Schwenker
81  particlegun.param('momentumGeneration', 'normal')
82  particlegun.param('momentumParams', [momentum, momentum * momentum_spread])
83  # momentum direction must be around theta=90, phi=180
84  particlegun.param('thetaGeneration', 'normal')
85  particlegun.param('thetaParams', [theta, theta_spread])
86  particlegun.param('phiGeneration', 'normal')
87  particlegun.param('phiParams', [phi, phi_spread])
88  particlegun.param('vertexGeneration', 'normal')
89  particlegun.param('xVertexParams', [gun_x_position, 0.])
90  particlegun.param('yVertexParams', [0., beamspot_size_y])
91  particlegun.param('zVertexParams', [0., beamspot_size_z])
92  particlegun.param('independentVertices', True)
93 
94  path.add_module(particlegun)
95 
96  path.add_module('FullSim', StoreAllSecondaries=True)
97  path.add_module('SVDDigitizer')
98 
99 
100 def add_reconstruction(
101  path,
102  magnet=True,
103  momentum=5.,
104  vxdtf2=False,
105  mc=False,
106  geometry_version=1
107 ):
108 
109  useThisGeometry = 'TB2017newGeo'
110  if geometry_version == 0:
111  useThisGeometry = 'TB2017'
112 
113  path.add_module('SetupGenfitExtrapolation')
114  if mc:
115  path.add_module('TrackFinderMCTruthRecoTracks')
116  else:
117  if(vxdtf2):
118  add_vxdtf_v2(path,
119  magnet_on=magnet,
120  filter_overlapping=True,
121  use_segment_network_filters=True,
122  observerType=0,
123  log_level=LogLevel.ERROR,
124  debug_level=1,
125  usedGeometry=useThisGeometry
126  )
127  else:
128  print("VXDTF1 not supported")
129  daf = register_module('DAFRecoFitter')
130  daf.param('initializeCDCTranslators', False)
131  daf.logging.log_level = LogLevel.ERROR
132  path.add_module(daf)
133  track_creator = register_module('TrackCreator')
134  track_creator.param('beamSpot', [0., 0., 0.])
135  track_creator.param('pdgCodes', [11])
136  track_creator.logging.log_level = LogLevel.ERROR
137  path.add_module(track_creator)