13 <contact>software-tracking@belle2.org</contact>
14 <output>ROIFindingValidation.root</output>
16 This module validates the ROI Finding module.
22from tracking
import add_tracking_for_PXDDataReduction_simulation
24from ROOT
import Belle2
28from svd
import add_svd_reconstruction
29from simulation
import add_simulation
31CONTACT =
'software-tracking@belle2.org'
34OUTPUT_FILE =
'ROIFindingTrackingValidation.root'
42 Create EvtGen input sample and run a simple ROI validation.
44 class ROIFindingTrackingValidationPlots(basf2.Module):
46 """Module to collect information about the ROIs (PXDIntercepts & ROIs) and to
47 generate validation plots on the performance of the ROIFinding module."""
53 output_file_name=None,
59 ## name of this validation output
60 self.validation_name = NAME
62 self.contact = CONTACT
63 ## ## name of the output ROOT file
64 self.output_file_name = OUTPUT_FILE
66 ## count the number of ROIs
68 ## count the number of PXDDigits
70 ## count the number of PXDDigits inside the ROIs
73 # default binning used for resolution plots over pt
74 # self.resolution_pt_binning = [0.05, 0.1, 0.25, 0.4, 0.6, 1., 1.5, 2., 3., 4.]
77 """Receive signal at the start of event processing"""
79 ## list of the number of ROIs in PXD layer 1
80 self.nROIs_L1 = collections.deque()
81 ## list of the number of ROIs in PXD layer 2
82 self.nROIs_L2 = collections.deque()
84 ## list of the ratios of filter to all PXD hits
85 self.drf = collections.deque()
87 ## list of the u-coordinate sigma in PXD layer 1
88 self.statU_L1 = collections.deque()
89 ## list of the v-coordinate sigma in PXD layer 1
90 self.statV_L1 = collections.deque()
91 ## list of the u-coordinate sigma in PXD layer 2
92 self.statU_L2 = collections.deque()
93 ## list of the v-coordinate sigma in PXD layer 2
94 self.statV_L2 = collections.deque()
96 ## list of the hit angular information in PXD layer 1
97 self.theta_phi_L1 = collections.deque()
100 ''' ROIs quantities'''
101 rois = Belle2.PyStoreArray('ROIs')
106 sensor = roi.getSensorID()
107 if (sensor.getLayerNumber() == 1):
108 nL1_ROI = nL1_ROI + 1
110 nL2_ROI = nL2_ROI + 1
112 self.nROIs_L1.append(nL1_ROI)
113 self.nROIs_L2.append(nL2_ROI)
115 self.nROIs = self.nROIs + rois.getEntries()
117 '''Data Reduction Factor '''
118 tot_pxd = Belle2.PyStoreArray('PXDDigits')
119 in_pxd = Belle2.PyStoreArray('filteredPXDDigits')
122 self.drf.append(len(in_pxd) / len(tot_pxd))
124 ''' PXDIntercepts Statistical Error '''
125 inters = Belle2.PyStoreArray('PXDIntercepts')
127 sensor = Belle2.VxdID(inter.getSensorID())
128 if (sensor.getLayerNumber() == 1):
129 self.statU_L1.append(inter.getSigmaU())
130 self.statV_L1.append(inter.getSigmaV())
132 self.statU_L2.append(inter.getSigmaU())
133 self.statV_L2.append(inter.getSigmaV())
136 """Receive signal at the end of event processing"""
138 contact = self.contact
139 basf2.B2RESULT(f"total nROIs = {self.nROIs}")
143 output_tfile = ROOT.TFile(self.output_file_name, 'recreate')
145 h_nROIs_L1 = ValidationPlot('h_nROIs_L1')
146 h_nROIs_L1.hist(self.nROIs_L1, bins=100, lower_bound=0, upper_bound=100)
147 h_nROIs_L1.contact = contact
148 h_nROIs_L1.check = 'average of 25 +/- 10 is expected'
149 h_nROIs_L1.description = 'ROIs on L1'
150 h_nROIs_L1.title = 'ROIs on L1'
151 h_nROIs_L1.xlabel = 'number of ROIs'
152 h_nROIs_L1.ylabel = ''
153 h_nROIs_L1.write(output_tfile)
155 h_nROIs_L2 = ValidationPlot('h_nROIs_L2')
156 h_nROIs_L2.hist(self.nROIs_L2, bins=100, lower_bound=0, upper_bound=100)
157 h_nROIs_L2.contact = contact
158 h_nROIs_L2.check = 'average of 25 +/- 10 is expected'
159 h_nROIs_L2.description = 'ROIs on L2'
160 h_nROIs_L2.title = 'ROIs on L2'
161 h_nROIs_L2.xlabel = 'number of ROIs'
162 h_nROIs_L2.ylabel = ''
163 h_nROIs_L2.write(output_tfile)
165 h_drf = ValidationPlot('h_drf')
166 h_drf.hist(self.drf, bins=100, lower_bound=0, upper_bound=1)
167 h_drf.contact = contact
168 h_drf.check = 'with no bkg, the average should be around 70%'
169 h_drf.description = 'Fraction of PXDDDigits inside ROIs'
170 h_drf.title = 'Fraction of PXDDDigits inside ROIs'
173 h_drf.write(output_tfile)
175 h_statU_L1 = ValidationPlot('h_statU_L1')
176 h_statU_L1.hist(self.statU_L1, bins=100, lower_bound=0, upper_bound=0.2)
177 h_statU_L1.contact = contact
178 h_statU_L1.check = 'average should be around 0.021 cm'
179 h_statU_L1.description = 'Statistical Error of the Intercept on L1 planes, along U'
180 h_statU_L1.title = 'L1 Intercept Statistical Uncertainty along U'
181 h_statU_L1.xlabel = 'U stat uncertainty'
182 h_statU_L1.ylabel = ''
183 h_statU_L1.write(output_tfile)
185 h_statV_L1 = ValidationPlot('h_statV_L1')
186 h_statV_L1.hist(self.statV_L1, bins=100, lower_bound=0, upper_bound=0.2)
187 h_statV_L1.contact = contact
188 h_statV_L1.check = 'average should be around 0.021 cm'
189 h_statV_L1.description = 'Statistical Error of the Intercept on L1 planes, along V'
190 h_statV_L1.title = 'L1 Intercept Statistical Uncertainty along V'
191 h_statV_L1.xlabel = 'V stat uncertainty (cm)'
192 h_statV_L1.ylabel = ''
193 h_statV_L1.write(output_tfile)
195 h_statU_L2 = ValidationPlot('h_statU_L2')
196 h_statU_L2.hist(self.statU_L2, bins=100, lower_bound=0, upper_bound=0.2)
197 h_statU_L2.contact = contact
198 h_statU_L2.check = 'average should be around 0.015 cm'
199 h_statU_L2.description = 'Statistical Error of the Intercept on L2 planes, along U'
200 h_statU_L2.title = 'L2 Intercept Statistical Uncertainty along U'
201 h_statU_L2.xlabel = 'U stat uncertainty (cm)'
202 h_statU_L2.ylabel = ''
203 h_statU_L2.write(output_tfile)
205 h_statV_L2 = ValidationPlot('h_statV_L2')
206 h_statV_L2.hist(self.statV_L2, bins=100, lower_bound=0, upper_bound=0.2)
207 h_statV_L2.contact = contact
208 h_statV_L2.check = 'average should be around 0.016 cm'
209 h_statV_L2.description = 'Statistical Error of the Intercept on L2 planes, along V'
210 h_statV_L2.title = 'L2 Intercept Statistical Uncertainty along V'
211 h_statV_L2.xlabel = 'V stat uncertainty (cm)'
212 h_statV_L2.ylabel = ''
213 h_statV_L2.write(output_tfile)
219 basf2.set_random_seed(1509)
221 path = basf2.create_path()
223 path.add_module('EventInfoSetter', evtNumList=N_EVENTS)
224 path.add_module('EvtGenInput')
225 add_simulation(path, forceSetPXDDataReduction=True, usePXDDataReduction=False)
226 add_svd_reconstruction(path, isROIsimulation=True)
228 # path.add_module('RootInput', inputFileName=INPUT_FILE, entrySequences=["0:{}".format(N_EVENTS-1)])
229 # path.add_module('Gearbox')
230 # path.add_module('Geometry')
232 pxd_unfiltered_digits = 'PXDDigits'
233 pxd_filtered_digits = 'filteredPXDDigits'
236 svd_reco_tracks = '__ROIsvdRecoTracks'
237 add_tracking_for_PXDDataReduction_simulation(path, ['SVD', 'CDC'], '__ROIsvdClusters') # CDC is not used at the moment!
240 pxdDataRed = basf2.register_module('PXDROIFinder')
242 'recoTrackListName': svd_reco_tracks,
243 'PXDInterceptListName': 'PXDIntercepts',
244 'ROIListName': 'ROIs',
246 pxdDataRed.param(param_pxdDataRed)
247 path.add_module(pxdDataRed)
249 # Filtering of PXDDigits
250 pxd_digifilter = basf2.register_module('PXDdigiFilter')
251 pxd_digifilter.param('ROIidsName', 'ROIs')
252 pxd_digifilter.param('PXDDigitsName', pxd_unfiltered_digits)
253 pxd_digifilter.param('PXDDigitsInsideROIName', pxd_filtered_digits)
254 pxd_digifilter.param('PXDDigitsOutsideROIName', 'PXDDigitsOutside')
255 path.add_module(pxd_digifilter)
257 ROIValidationPlots = ROIFindingTrackingValidationPlots()
258 path.add_module(ROIValidationPlots)
260 path.add_module('Progress')
266if __name__ == '__main__':
270 print("This validation deactivated and thus basf2 is not executed.\n"
271 "If you want to run this validation, please set the 'ACTIVE' flag above to 'True'.\n"