Belle II Software  release-06-00-14
BhabhaMC.py
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3 
4 
11 
12 import basf2 as b2
13 import os
14 from simulation import add_simulation
15 from optparse import OptionParser
16 from L1trigger import add_trigger_simulation
17 from reconstruction import add_cdst_output, add_reconstruction
18 import glob
19 
20 background_files = glob.glob('/group/belle2/BGFile/OfficialBKG/phase2/pseudorandom/BGOverlay.physics.0003.*.root')
21 # --------------------------------------------------------------------
22 # Example of using ARICH reconstruction
23 # needs reconstructed tracks (Tracks), extrapolated to ARICH (ExtHits)
24 # --------------------------------------------------------------------
25 parser = OptionParser()
26 parser.add_option('-n', '--nevents', dest='nevents', default=200000,
27  help='Number of events to process')
28 parser.add_option('-f', '--file', dest='filename',
29  default='Bhabha_Prod5_MC.root')
30 parser.add_option('-o', '--output', dest='cdstname',
31  default='Bhabha_Prod5_MC_cdst.root')
32 (options, args) = parser.parse_args()
33 
34 home = os.environ['BELLE2_LOCAL_DIR']
35 
36 # Suppress messages and warnings during processing:
37 b2.set_log_level(b2.LogLevel.ERROR)
38 
39 # reset_database()
40 b2.use_database_chain()
41 b2.use_central_database("data_reprocessing_prod5", b2.LogLevel.WARNING)
42 
43 # Create path
44 main = b2.create_path()
45 empty = b2.create_path()
46 
47 # Set number of events to generate
48 eventinfosetter = b2.register_module('EventInfoSetter')
49 eventinfosetter.param({'evtNumList': [int(options.nevents)], 'runList': [1]})
50 main.add_module(eventinfosetter)
51 
52 # Histogram manager immediately after master module
53 histo = b2.register_module('HistoManager')
54 histo.param('histoFileName', 'DQMhistograms.root') # File to save histograms
55 main.add_module(histo)
56 
57 # Gearbox: access to database (xml files)
58 gearbox = b2.register_module('Gearbox', fileName="geometry/Beast2_phase2.xml")
59 main.add_module(gearbox)
60 
61 # Geometry
62 geometry = b2.register_module('Geometry')
63 # geometry.param('components', [
64 # 'MagneticField',
65 # 'BeamPipe',
66 # 'PXD',
67 # 'SVD',
68 # 'CDC',
69 # 'ARICH'])
70 main.add_module(geometry)
71 
72 # to run the framework the used modules need to be registered
73 generator = b2.register_module('BabayagaNLOInput')
74 generator.param('FinalState', 'ee')
75 generator.param('MaxAcollinearity', 180.0)
76 generator.param('ScatteringAngleRange', [15., 165.])
77 generator.param('FMax', 75000)
78 generator.param('MinEnergy', 0.01)
79 generator.param('Order', 'exp')
80 generator.param('DebugEnergySpread', 0.01)
81 generator.param('Epsilon', 0.00005)
82 generatorpreselection = b2.register_module('GeneratorPreselection')
83 generatorpreselection.param('nChargedMin', 1)
84 generatorpreselection.param('nChargedMax', 999)
85 generatorpreselection.param('MinChargedP', 4.)
86 # generatorpreselection.param('MinChargedTheta', 20.)
87 generatorpreselection.param('MinChargedTheta', 17.)
88 generatorpreselection.param('MaxChargedTheta', 36.)
89 generatorpreselection.param('applyInCMS', False)
90 main.add_module(generator)
91 main.add_module(generatorpreselection)
92 generatorpreselection.if_value('!=11', empty)
93 
94 # components = ['PXD', 'SVD', 'CDC']
95 
96 
97 # detector simulation (still use background mixing)
98 # add_simulation(main, components=components, bkgfiles=background_files, bkgOverlay=True)
99 # add_simulation(main, components=components)
100 
101 # add simulation but remove L1 trigger simulation
102 allowed_components = ['PXD', 'SVD', 'CDC', 'ECL', 'TOP', 'ARICH', 'KLM']
103 add_simulation(main, components=allowed_components, bkgfiles=background_files, bkgOverlay=True)
104 
105 # ARICH digitization
106 arich_digitizer = b2.register_module('ARICHDigitizer')
107 arich_digitizer.param('MagneticFieldDistorsion', 1)
108 main.add_module(arich_digitizer)
109 
110 # L1 trigger simulation
111 add_trigger_simulation(main, shortTracks=True, Belle2Phase="Phase2")
112 
113 # tracking
114 # add_tracking_reconstruction(main)
115 add_reconstruction(main)
116 
117 # convert ARICHDigits to ARICHHits
118 arichHits = b2.register_module('ARICHFillHits')
119 arichHits.param('MagFieldCorrection', 1)
120 main.add_module(arichHits)
121 
122 # ARICH reconstruction
123 # calculate PID likelihoods for all tracks
124 arichreco = b2.register_module('ARICHReconstructor')
125 # store cherenkov angle information
126 arichreco.param('storePhotons', 1)
127 arichreco.param('useAlignment', 0)
128 main.add_module(arichreco)
129 
130 # ARICH Ntuple
131 # create flat ntuple for performance analysis
132 arichNtuple = b2.register_module('ARICHNtuple')
133 arichNtuple.param('outputFile', options.filename)
134 main.add_module(arichNtuple)
135 
136 # ARICH DQM
137 # create DQM occupancy plots
138 arichdqm = b2.register_module('ARICHDQM')
139 main.add_module(arichdqm)
140 
141 add_cdst_output(main, True, '/ghi/fs01/belle2/bdata/users/sachit/' + options.cdstname)
142 
143 # Uncomment to store DataStore content to root file
144 # output = register_module('RootOutput')
145 # output.param('outputFileName', 'DataStore.root')
146 # main.add_module(output)
147 
148 # Uncomment to show event display
149 # display = register_module('Display')
150 # display.param('showARICHHits', True)
151 # display.param('fullGeometry', True)
152 # main.add_module(display)
153 
154 # Show progress of processing
155 progress = b2.register_module('Progress')
156 main.add_module(progress)
157 # main.add_module("PrintMCParticles", logLevel=LogLevel.INFO, onlyPrimaries=False)
158 # Process events
159 b2.process(main)
160 
161 # Print call statistics
162 print(b2.statistics)
163 
164 # Make basic performance plots
165 # com = 'root -l ' + options.filename + ' ' + home + '/arich/utility/scripts/plotEfficiency.C'
166 # os.system(com)