Belle II Software  release-05-01-25
roiFindingTrackingValidation.py
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3 
4 """
5 <header>
6  <contact>software-tracking@belle2.org</contact>
7  <output>ROIFindingValidation.root</output>
8  <description>
9  This module validates the ROI Finding module.
10  </description>
11 </header>
12 """
13 # <input>EvtGenSimNoBkg.root</input>
14 
15 NAME = 'ROIFinding' # not used?
16 CONTACT = 'software-tracking@belle2.org'
17 # INPUT_FILE = '../EvtGenSimNoBkg.root' #can't use it because PXDDataReduction in simulated
18 # INPUT_FILE = 'simRootOutput.root' # for debugging purposes
19 OUTPUT_FILE = 'ROIFindingTrackingValidation.root'
20 N_EVENTS = 1000
21 
22 ACTIVE = True
23 
24 from simulation import add_simulation
25 from svd import add_svd_reconstruction
26 
27 import basf2
28 import ROOT
29 import collections
30 import math
31 from ROOT import Belle2
32 
33 from tracking.validation.plot import ValidationPlot
34 
35 
36 basf2.set_random_seed(1509)
37 
38 from tracking import add_tracking_for_PXDDataReduction_simulation
39 
40 
42 
43  """Module to collect information about the ROIs (PXDIntercepts & ROIs) and to
44  generate validation plots on the performance of the ROIFinding module."""
45 
46  def __init__(
47  self,
48  name='',
49  contact='',
50  output_file_name=None,
51  nROIs=0
52  ):
53  """Constructor"""
54 
55  super().__init__()
56 
57  self.validation_name = NAME
58 
59  self.contact = CONTACT
60 
61  self.output_file_name = OUTPUT_FILE
62 
63 
64  self.nROIs = 0
65 
66  self.nPXDDigits = 0
67 
68  self.nPXDDigitsIN = 0
69 
70  # default binning used for resolution plots over pt
71  # self.resolution_pt_binning = [0.05, 0.1, 0.25, 0.4, 0.6, 1., 1.5, 2., 3., 4.]
72 
73  def initialize(self):
74  """Receive signal at the start of event processing"""
75 
76 
77  self.nROIs_L1 = collections.deque()
78 
79  self.nROIs_L2 = collections.deque()
80 
81 
82  self.drf = collections.deque()
83 
84 
85  self.statU_L1 = collections.deque()
86 
87  self.statV_L1 = collections.deque()
88 
89  self.statU_L2 = collections.deque()
90 
91  self.statV_L2 = collections.deque()
92 
93 
94  self.theta_phi_L1 = collections.deque()
95 
96  def event(self):
97  ''' ROIs quantities'''
98  rois = Belle2.PyStoreArray('ROIs')
99 
100  nL1_ROI = 0
101  nL2_ROI = 0
102  for roi in rois:
103  sensor = roi.getSensorID()
104  if(sensor.getLayerNumber() == 1):
105  nL1_ROI = nL1_ROI + 1
106  else:
107  nL2_ROI = nL2_ROI + 1
108 
109  self.nROIs_L1.append(nL1_ROI)
110  self.nROIs_L2.append(nL2_ROI)
111 
112  self.nROIs = self.nROIs + rois.getEntries()
113 
114  '''Data Reduction Factor '''
115  tot_pxd = Belle2.PyStoreArray('PXDDigits')
116  in_pxd = Belle2.PyStoreArray('filteredPXDDigits')
117 
118  if len(tot_pxd) > 0:
119  self.drf.append(len(in_pxd) / len(tot_pxd))
120 
121  ''' PXDIntercepts Statistical Error '''
122  inters = Belle2.PyStoreArray('PXDIntercepts')
123  for inter in inters:
124  sensor = Belle2.VxdID(inter.getSensorID())
125  if(sensor.getLayerNumber() == 1):
126  self.statU_L1.append(inter.getSigmaU())
127  self.statV_L1.append(inter.getSigmaV())
128  else:
129  self.statU_L2.append(inter.getSigmaU())
130  self.statV_L2.append(inter.getSigmaV())
131 
132  def terminate(self):
133  """Receive signal at the end of event processing"""
134 
135  name = self.validation_name
136  contact = self.contact
137  basf2.B2RESULT("total nROIs = {}".format(self.nROIs))
138 
139  ''' Saving'''
140 
141  output_tfile = ROOT.TFile(self.output_file_name, 'recreate')
142 
143  h_nROIs_L1 = ValidationPlot('h_nROIs_L1')
144  h_nROIs_L1.hist(self.nROIs_L1, bins=100, lower_bound=0, upper_bound=100)
145  h_nROIs_L1.contact = contact
146  h_nROIs_L1.check = 'average of 25 +/- 10 is expected'
147  h_nROIs_L1.description = 'ROIs on L1'
148  h_nROIs_L1.title = 'ROIs on L1'
149  h_nROIs_L1.xlabel = 'number of ROIs'
150  h_nROIs_L1.ylabel = ''
151  h_nROIs_L1.write(output_tfile)
152 
153  h_nROIs_L2 = ValidationPlot('h_nROIs_L2')
154  h_nROIs_L2.hist(self.nROIs_L2, bins=100, lower_bound=0, upper_bound=100)
155  h_nROIs_L2.contact = contact
156  h_nROIs_L2.check = 'average of 25 +/- 10 is expected'
157  h_nROIs_L2.description = 'ROIs on L2'
158  h_nROIs_L2.title = 'ROIs on L2'
159  h_nROIs_L2.xlabel = 'number of ROIs'
160  h_nROIs_L2.ylabel = ''
161  h_nROIs_L2.write(output_tfile)
162 
163  h_drf = ValidationPlot('h_drf')
164  h_drf.hist(self.drf, bins=100, lower_bound=0, upper_bound=1)
165  h_drf.contact = contact
166  h_drf.check = 'with no bkg, the average should be around 70%'
167  h_drf.description = 'Fraction of PXDDDigits inside ROIs'
168  h_drf.title = 'Fraction of PXDDDigits inside ROIs'
169  h_drf.xlabel = 'DRF'
170  h_drf.ylabel = ''
171  h_drf.write(output_tfile)
172 
173  h_statU_L1 = ValidationPlot('h_statU_L1')
174  h_statU_L1.hist(self.statU_L1, bins=100, lower_bound=0, upper_bound=0.2)
175  h_statU_L1.contact = contact
176  h_statU_L1.check = 'average should be around 0.021 cm'
177  h_statU_L1.description = 'Statistical Error of the Intercept on L1 planes, along U'
178  h_statU_L1.title = 'L1 Intercept Statistical Uncertainity along U'
179  h_statU_L1.xlabel = 'U stat uncertainity'
180  h_statU_L1.ylabel = ''
181  h_statU_L1.write(output_tfile)
182 
183  h_statV_L1 = ValidationPlot('h_statV_L1')
184  h_statV_L1.hist(self.statV_L1, bins=100, lower_bound=0, upper_bound=0.2)
185  h_statV_L1.contact = contact
186  h_statV_L1.check = 'average should be around 0.021 cm'
187  h_statV_L1.description = 'Statistical Error of the Intercept on L1 planes, along V'
188  h_statV_L1.title = 'L1 Intercept Statistical Uncertainity along V'
189  h_statV_L1.xlabel = 'V stat uncertainity (cm)'
190  h_statV_L1.ylabel = ''
191  h_statV_L1.write(output_tfile)
192 
193  h_statU_L2 = ValidationPlot('h_statU_L2')
194  h_statU_L2.hist(self.statU_L2, bins=100, lower_bound=0, upper_bound=0.2)
195  h_statU_L2.contact = contact
196  h_statU_L2.check = 'average should be around 0.015 cm'
197  h_statU_L2.description = 'Statistical Error of the Intercept on L2 planes, along U'
198  h_statU_L2.title = 'L2 Intercept Statistical Uncertainity along U'
199  h_statU_L2.xlabel = 'U stat uncertainity (cm)'
200  h_statU_L2.ylabel = ''
201  h_statU_L2.write(output_tfile)
202 
203  h_statV_L2 = ValidationPlot('h_statV_L2')
204  h_statV_L2.hist(self.statV_L2, bins=100, lower_bound=0, upper_bound=0.2)
205  h_statV_L2.contact = contact
206  h_statV_L2.check = 'average should be around 0.016 cm'
207  h_statV_L2.description = 'Statistical Error of the Intercept on L2 planes, along V'
208  h_statV_L2.title = 'L2 Intercept Statistical Uncertainity along V'
209  h_statV_L2.xlabel = 'V stat uncertainity (cm)'
210  h_statV_L2.ylabel = ''
211  h_statV_L2.write(output_tfile)
212 
213  output_tfile.Close()
214 
215 
216 """ Steering """
217 
218 path = basf2.create_path()
219 
220 path.add_module('EventInfoSetter', evtNumList=N_EVENTS)
221 path.add_module('EvtGenInput')
222 add_simulation(path, forceSetPXDDataReduction=True, usePXDDataReduction=False)
223 add_svd_reconstruction(path, isROIsimulation=True)
224 
225 # path.add_module('RootInput', inputFileName=INPUT_FILE, entrySequences=["0:{}".format(N_EVENTS-1)])
226 # path.add_module('Gearbox')
227 # path.add_module('Geometry')
228 
229 pxd_unfiltered_digits = 'PXDDigits'
230 pxd_filtered_digits = 'filteredPXDDigits'
231 
232 # SVD tracking
233 svd_reco_tracks = '__ROIsvdRecoTracks'
234 add_tracking_for_PXDDataReduction_simulation(path, ['SVD', 'CDC'], '__ROIsvdClusters') # CDC is not used at the moment!
235 
236 # ROI Finding
237 pxdDataRed = basf2.register_module('PXDROIFinder')
238 param_pxdDataRed = {
239  'recoTrackListName': svd_reco_tracks,
240  'PXDInterceptListName': 'PXDIntercepts',
241  'ROIListName': 'ROIs',
242  'tolerancePhi': 0.15,
243  'toleranceZ': 0.5,
244  'sigmaSystU': 0.02,
245  'sigmaSystV': 0.02,
246  'numSigmaTotU': 10,
247  'numSigmaTotV': 10,
248  'maxWidthU': 0.5,
249  'maxWidthV': 0.5,
250 }
251 pxdDataRed.param(param_pxdDataRed)
252 path.add_module(pxdDataRed)
253 
254 # Filtering of PXDDigits
255 pxd_digifilter = basf2.register_module('PXDdigiFilter')
256 pxd_digifilter.param('ROIidsName', 'ROIs')
257 pxd_digifilter.param('PXDDigitsName', pxd_unfiltered_digits)
258 pxd_digifilter.param('PXDDigitsInsideROIName', pxd_filtered_digits)
259 pxd_digifilter.param('PXDDigitsOutsideROIName', 'PXDDigitsOutside')
260 path.add_module(pxd_digifilter)
261 
262 ROIValidationPlots = ROIFindingTrackingValidationPlots()
263 path.add_module(ROIValidationPlots)
264 
265 path.add_module('Progress')
266 
267 if ACTIVE:
268  basf2.process(path)
269 
270  print(path)
roiFindingTrackingValidation.ROIFindingTrackingValidationPlots.nPXDDigits
nPXDDigits
count the number of PXDDigits
Definition: roiFindingTrackingValidation.py:60
roiFindingTrackingValidation.ROIFindingTrackingValidationPlots.__init__
def __init__(self, name='', contact='', output_file_name=None, nROIs=0)
Definition: roiFindingTrackingValidation.py:46
Belle2::VxdID
Class to uniquely identify a any structure of the PXD and SVD.
Definition: VxdID.h:43
roiFindingTrackingValidation.ROIFindingTrackingValidationPlots
Definition: roiFindingTrackingValidation.py:41
roiFindingTrackingValidation.ROIFindingTrackingValidationPlots.nPXDDigitsIN
nPXDDigitsIN
count the number of PXDDigits inside the ROIs
Definition: roiFindingTrackingValidation.py:62
roiFindingTrackingValidation.ROIFindingTrackingValidationPlots.output_file_name
output_file_name
Definition: roiFindingTrackingValidation.py:55
roiFindingTrackingValidation.ROIFindingTrackingValidationPlots.statV_L1
statV_L1
list of the v-coordinate sigma in PXD layer 1
Definition: roiFindingTrackingValidation.py:87
roiFindingTrackingValidation.ROIFindingTrackingValidationPlots.validation_name
validation_name
name of this validation output
Definition: roiFindingTrackingValidation.py:51
roiFindingTrackingValidation.ROIFindingTrackingValidationPlots.terminate
def terminate(self)
Definition: roiFindingTrackingValidation.py:132
basf2.process
def process(path, max_event=0)
Definition: __init__.py:25
roiFindingTrackingValidation.ROIFindingTrackingValidationPlots.statU_L2
statU_L2
list of the u-coordinate sigma in PXD layer 2
Definition: roiFindingTrackingValidation.py:89
roiFindingTrackingValidation.ROIFindingTrackingValidationPlots.event
def event(self)
Definition: roiFindingTrackingValidation.py:96
roiFindingTrackingValidation.ROIFindingTrackingValidationPlots.nROIs
nROIs
count the number of ROIs
Definition: roiFindingTrackingValidation.py:58
roiFindingTrackingValidation.ROIFindingTrackingValidationPlots.initialize
def initialize(self)
Definition: roiFindingTrackingValidation.py:73
roiFindingTrackingValidation.ROIFindingTrackingValidationPlots.nROIs_L2
nROIs_L2
list of the number of ROIs in PXD layer 2
Definition: roiFindingTrackingValidation.py:79
roiFindingTrackingValidation.ROIFindingTrackingValidationPlots.drf
drf
list of the ratios of filter to all PXD hits
Definition: roiFindingTrackingValidation.py:82
roiFindingTrackingValidation.ROIFindingTrackingValidationPlots.nROIs_L1
nROIs_L1
list of the number of ROIs in PXD layer 1
Definition: roiFindingTrackingValidation.py:77
roiFindingTrackingValidation.ROIFindingTrackingValidationPlots.statU_L1
statU_L1
list of the u-coordinate sigma in PXD layer 1
Definition: roiFindingTrackingValidation.py:85
roiFindingTrackingValidation.ROIFindingTrackingValidationPlots.contact
contact
contact person
Definition: roiFindingTrackingValidation.py:53
Belle2::PyStoreArray
a (simplified) python wrapper for StoreArray.
Definition: PyStoreArray.h:58
tracking.validation.plot.ValidationPlot
Definition: plot.py:152
tracking.validation.plot
Definition: plot.py:1
roiFindingTrackingValidation.ROIFindingTrackingValidationPlots.theta_phi_L1
theta_phi_L1
list of the hit angular information in PXD layer 1
Definition: roiFindingTrackingValidation.py:94
roiFindingTrackingValidation.ROIFindingTrackingValidationPlots.statV_L2
statV_L2
list of the v-coordinate sigma in PXD layer 2
Definition: roiFindingTrackingValidation.py:91