Belle II Software  release-05-01-25
harvester.py
1 from tracking.harvest.harvesting import HarvestingModule
2 from tracking.harvest import refiners
3 
4 from ROOT import Belle2
5 
6 import numpy as np
7 
8 
10 
11  """ Harvester module to check for the reconstructed positions """
12 
13  def __init__(self, output_file_name, tracks_store_vector_name="CDCTrackVector"):
14  """ Initiialize with the output file name of the root file and the store obj with the
15  CDCTrack vector to use. MC track cands are needed. """
16  super(
17  ReconstructionPositionHarvester,
18  self).__init__(
19  foreach=tracks_store_vector_name,
20  output_file_name=output_file_name)
21 
22 
24 
25  def peel(self, track_cand):
26  """ Extract the information """
27  mc_hit_lookup = self.mc_hit_lookup
28  mc_hit_lookup.fill()
29 
30  sum_of_difference_norms_stereo = 0
31  num_norms_stereo = 0
32  sum_of_difference_norms_axial = 0
33  num_norms_axial = 0
34 
35  number_of_wrong_rl_infos = 0
36 
37  for reco_hit3D in list(track_cand.items()):
38  underlaying_cdc_hit = reco_hit3D.getWireHit().getHit()
39  hit_difference = mc_hit_lookup.getRecoPos3D(underlaying_cdc_hit) - reco_hit3D.getRecoPos3D()
40  sum_of_difference_norms_axial += hit_difference.xy().norm()
41  num_norms_axial += 1
42 
43  if reco_hit3D.getStereoType() != 0: # AXIAL
44  sum_of_difference_norms_stereo += abs(hit_difference.z())
45  num_norms_stereo += 1
46 
47  correct_rl_info = mc_hit_lookup.getRLInfo(underlaying_cdc_hit)
48 
49  if correct_rl_info != reco_hit3D.getRLInfo():
50  number_of_wrong_rl_infos += 1
51 
52  return dict(sum_of_difference_norms_axial=sum_of_difference_norms_axial,
53  num_norms_axial=num_norms_axial,
54  mean_of_difference_norms_axial=np.true_divide(sum_of_difference_norms_axial, num_norms_axial),
55  sum_of_difference_norms_stereo=sum_of_difference_norms_stereo,
56  num_norms_stereo=num_norms_stereo,
57  mean_of_difference_norms_stereo=np.true_divide(sum_of_difference_norms_stereo, num_norms_stereo),
58  number_of_wrong_rl_infos=number_of_wrong_rl_infos,
59  mean_wrong_rl_infos=np.true_divide(number_of_wrong_rl_infos, num_norms_stereo))
60 
61 
63  save_tree = refiners.save_tree(folder_name="tree")
64 
65 
67 
68  """
69  Harvester module to check for the correct reconstructed orientation.
70  """
71 
72  def __init__(self, output_file_name, tracks_store_vector_name="TrackCands"):
73  """
74  Initialize with the root output file name and the store array name of the track cands to use.
75  """
76  HarvestingModule.__init__(self,
77  foreach=tracks_store_vector_name,
78  output_file_name=output_file_name)
79 
80 
82 
83  def peel(self, track_cand):
84  """ Extract the information. """
85  cdc_hits = Belle2.PyStoreArray("CDCHits")
86 
87  mc_hit_lookup = self.mc_hit_lookup
88  mc_hit_lookup.fill()
89 
90  number_of_wrong_rl_infos = 0
91  number_of_wrong_rl_infos_stereo_only = 0
92 
93  number_of_hits = 0
94  number_of_stereo = 0
95 
96  for hitID in range(track_cand.getNHits()):
97  hit = track_cand.getHit(hitID)
98  if not hit.__class__.__name__ == "genfit::WireTrackCandHit":
99  continue
100 
101  underlaying_cdc_hit = cdc_hits[hit.getHitId()]
102 
103  correct_rl_info = mc_hit_lookup.getRLInfo(underlaying_cdc_hit)
104 
105  number_of_hits += 1
106 
107  if underlaying_cdc_hit.getISuperLayer() % 2 != 0:
108  number_of_stereo += 1
109 
110  if correct_rl_info != hit.getLeftRightResolution():
111  if underlaying_cdc_hit.getISuperLayer() % 2 != 0:
112  number_of_wrong_rl_infos_stereo_only += 1
113  number_of_wrong_rl_infos += 1
114 
115  return dict(number_of_wrong_rl_infos=number_of_wrong_rl_infos,
116  number_of_wrong_rl_infos_stereo_only=number_of_wrong_rl_infos_stereo_only,
117  number_of_hits=number_of_hits,
118  number_of_stereo=number_of_stereo,
119  mean_wrong_rl=np.true_divide(number_of_wrong_rl_infos, number_of_hits),
120  mean_wrong_rl_stereo=np.true_divide(number_of_wrong_rl_infos_stereo_only, number_of_stereo))
121 
122 
124  save_tree = refiners.save_tree(folder_name="tree")
125 
126 
128 
129  """
130  Harvesting module to check for basic matching information of the found segments.
131  If you want to have matching information, please use the MC matcher module to make all possible
132  combinations between legendre, local and MC track candidates.
133  Also, the Segments must be transformed into GF track cands.
134  """
135 
136  def __init__(
137  self,
138  output_file_name,
139  local_track_cands_store_array_name="LocalTrackCands",
140  mc_track_cands_store_array_name="MCTrackCands",
141  legendre_track_cand_store_array_name="LegendreTrackCands"):
142  """
143  Initialize the harvesting module with
144  Arguments
145  ---------
146  output_file_name Name of the root file
147  local_track_cands_store_array_name Name of the StoreArray for local track cands
148  mc_track_cands_store_array_name Name of the StoreArray for MC track cands
149  legendre_track_cand_store_array_name Name of the StoreArray for legendre track cands
150  """
151  super(
152  SegmentFakeRatesModule,
153  self).__init__(
154  foreach=local_track_cands_store_array_name,
155  output_file_name=output_file_name)
156 
157 
158  self.mc_track_cands_store_array_name = mc_track_cands_store_array_name
159 
160  self.legendre_track_cand_store_array_name = legendre_track_cand_store_array_name
161 
162 
164 
167  legendre_track_cand_store_array_name)
168 
169  def prepare(self):
170  """ Prepare the CDC lookup. """
171 
172  self.cdcHits = Belle2.PyStoreArray("CDCHits")
173  return HarvestingModule.prepare(self)
174 
175  def peel(self, local_track_cand):
176  """ Extract the information from the segments. """
177  mc_track_matcher_local = self.mc_track_matcher_local
178  mc_track_matcher_legendre = self.mc_track_matcher_legendre
179 
180  cdc_hits = self.cdcHits
181 
182  is_background = mc_track_matcher_local.isBackgroundPRRecoTrack(local_track_cand)
183  is_ghost = mc_track_matcher_local.isGhostPRRecoTrack(local_track_cand)
184  is_matched = mc_track_matcher_local.isMatchedPRRecoTrack(local_track_cand)
185  is_clone = mc_track_matcher_local.isClonePRRecoTrack(local_track_cand)
186  is_clone_or_matched = is_matched or is_clone
187  hit_purity = abs(mc_track_matcher_local.getRelatedPurity(local_track_cand))
188 
189  # Stereo Track?
190  first_cdc_hit_id = local_track_cand.getHitIDs(Belle2.Const.CDC)[0]
191  first_cdc_hit = cdc_hits[first_cdc_hit_id]
192  is_stereo = first_cdc_hit.getISuperLayer() % 2 == 1
193  superlayer_of_segment = first_cdc_hit.getISuperLayer()
194 
195  has_partner = np.NaN
196  hit_purity_of_partner = np.NaN
197  hit_efficiency_of_partner = np.NaN
198  mc_track_pt = np.NaN
199  mc_track_dist = np.NaN
200  number_of_new_hits = local_track_cand.getNHits()
201  number_of_hits = local_track_cand.getNHits()
202  number_of_hits_in_same_superlayer = np.NaN
203  partner_has_stereo_information = np.NaN
204 
205  if is_clone_or_matched:
206  related_mc_track_cand = mc_track_matcher_local.getRelatedMCRecoTrack(local_track_cand)
207  has_partner = (mc_track_matcher_legendre.isMatchedMCRecoTrack(related_mc_track_cand) or
208  mc_track_matcher_legendre.isMergedMCRecoTrack(related_mc_track_cand))
209  mc_track_pt = related_mc_track_cand.getMomSeed().Pt()
210  mc_track_dist = related_mc_track_cand.getPosSeed().Mag()
211  if has_partner:
212  partner_legendre_track_cand = mc_track_matcher_legendre.getRelatedPRRecoTrack(related_mc_track_cand)
213  hit_purity_of_partner = abs(mc_track_matcher_legendre.getRelatedPurity(partner_legendre_track_cand))
214  hit_efficiency_of_partner = abs(mc_track_matcher_legendre.getRelatedEfficiency(related_mc_track_cand))
215 
216  # Count number of new hits
217  legendre_hits = set(list(partner_legendre_track_cand.getHitIDs()))
218  local_hits = set(list(local_track_cand.getHitIDs()))
219 
220  local_hits_new = local_hits - legendre_hits
221  number_of_new_hits = len(local_hits_new)
222 
223  # Count number of hits in this superlayer
224  partner_has_stereo_information = 0
225  number_of_hits_in_same_superlayer = 0
226  for cdc_hit_ID in legendre_hits:
227  cdc_hit = cdc_hits[cdc_hit_ID]
228  if cdc_hit.getISuperLayer() == superlayer_of_segment:
229  number_of_hits_in_same_superlayer += 1
230 
231  if cdc_hit.getISuperLayer() % 2 == 1:
232  partner_has_stereo_information = 1
233 
234  return dict(superlayer_of_segment=superlayer_of_segment,
235  mc_track_dist=mc_track_dist,
236  is_background=is_background,
237  is_ghost=is_ghost,
238  is_matched=is_matched,
239  is_clone=is_clone,
240  is_clone_or_matched=is_clone_or_matched,
241  is_stereo=is_stereo,
242  mc_track_pt=mc_track_pt,
243  hit_purity=hit_purity,
244  has_partner=has_partner,
245  hit_purity_of_partner=hit_purity_of_partner,
246  hit_efficiency_of_partner=hit_efficiency_of_partner,
247  number_of_new_hits=number_of_new_hits,
248  number_of_hits=number_of_hits,
249  number_of_hits_in_same_superlayer=number_of_hits_in_same_superlayer,
250  partner_has_stereo_information=partner_has_stereo_information)
251 
252 
254  save_tree = refiners.save_tree(folder_name="tree")
255 
256 
258 
259  """
260  Harvester module to extract momentum and position information from the found segments and tracks.
261  You need the apply MC track matcher module.
262  """
263 
264  def __init__(self, local_track_cands_store_array_name, mc_track_cands_store_array_name, output_file_name):
265  """ Init the harvester with the local track candidates StoreArray name and the one for MC track cands
266  and the output file name for the result root file.
267  """
268  super(
269  SegmentFinderParameterExtractorModule,
270  self).__init__(
271  foreach=local_track_cands_store_array_name,
272  output_file_name=output_file_name)
273 
274 
275  self.mc_track_cands_store_array_name = mc_track_cands_store_array_name
276 
277 
279  self.foreach)
280 
281  def peel(self, local_track_cand):
282  """ Extract the information from the local track candidate. """
283  mc_track_matcher = self.mc_track_matcher
284 
285  is_matched = mc_track_matcher.isMatchedPRRecoTrack(local_track_cand)
286  is_background = mc_track_matcher.isBackgroundPRRecoTrack(local_track_cand)
287  is_ghost = mc_track_matcher.isGhostPRRecoTrack(local_track_cand)
288 
289  related_mc_track_cand = mc_track_matcher.getRelatedMCRecoTrack(local_track_cand)
290 
291  track_momentum = np.NaN
292  track_position = np.NaN
293  track_pt = np.NaN
294  track_phi = np.NaN
295 
296  segment_momentum = np.NaN
297  segment_position = np.NaN
298  segment_pt = np.NaN
299  segment_phi = np.NaN
300 
301  if is_matched:
302  track_momentum = related_mc_track_cand.getPosSeed()
303  track_position = related_mc_track_cand.getPosSeed()
304  track_pt = track_momentum.Pt()
305  track_phi = track_momentum.Phi()
306  trajectory_track = \
308  Belle2.TrackFindingCDC.Vector3D(track_momentum),
309  related_mc_track_cand.getChargeSeed())
310 
311  segment_momentum = local_track_cand.getMomSeed()
312  segment_position = local_track_cand.getPosSeed()
313  segment_pt = segment_momentum.Pt()
314  segment_phi = segment_momentum.Phi()
315  trajectory_segment = \
317  Belle2.TrackFindingCDC.Vector3D(segment_momentum),
318  local_track_cand.getChargeSeed())
319 
320  return dict(is_matched=is_matched,
321  is_background=is_background,
322  is_ghost=is_ghost,
323  segment_pt=segment_pt,
324  track_pt=track_pt,
325  difference_pt=segment_pt - track_pt,
326  segment_phi=segment_phi,
327  track_phi=track_phi,
328  difference_phi=segment_phi - track_phi)
329 
330 
332  save_tree = refiners.save_tree(folder_name="tree")
333 
334 
336 
337  """
338  Extract the momentum seeds of the first and the last hit of the track candidates (when use_vxd_hits is true),
339  the helx and the mc momentum.
340  """
341 
342  def __init__(self, output_file_name, track_cands, use_vxd_hits=True):
343  """
344  Init with the root output file name and the name of the store array of the track cands to use.
345  """
346  HarvestingModule.__init__(self, foreach=track_cands, output_file_name=output_file_name)
347 
348 
349  self.use_vxd_hits = use_vxd_hits
350 
351  def peel(self, legendre_track_cand):
352  """
353  Extract the information.
354  """
355  if legendre_track_cand.getChargeSeed() > 0:
356  helix = Belle2.Helix(legendre_track_cand.getPosSeed(), legendre_track_cand.getMomSeed(), 1, 1.5)
357  if legendre_track_cand.getChargeSeed() < 0:
358  helix = Belle2.Helix(legendre_track_cand.getPosSeed(), legendre_track_cand.getMomSeed(), -1, 1.5)
359 
360  matcher = Belle2.TrackMatchLookUp("MCTrackCands", self.foreach)
361  mc_track_cand = matcher.getMatchedMCRecoTrack(legendre_track_cand)
362 
363  pxd_clusters = Belle2.PyStoreArray("PXDClusters")
364  svd_clusters = Belle2.PyStoreArray("SVDClusters")
365 
366  if mc_track_cand:
367  mc_x = mc_track_cand.getPosSeed().X()
368  mc_y = mc_track_cand.getPosSeed().Y()
369  mc_z = mc_track_cand.getPosSeed().Z()
370  mc_mom_x = mc_track_cand.getMomSeed().X()
371  mc_mom_y = mc_track_cand.getMomSeed().Y()
372  mc_mom_z = mc_track_cand.getMomSeed().Z()
373  else:
374  mc_x = np.NaN
375  mc_y = np.NaN
376  mc_z = np.NaN
377  mc_mom_x = np.NaN
378  mc_mom_y = np.NaN
379  mc_mom_z = np.NaN
380 
381  return_dict = dict(
382  helix_z=helix.getZ0(),
383  helix_x=helix.getPerigeeX(),
384  helix_y=helix.getPerigeeY(),
385  helix_mom_z=helix.getMomentumZ(1.5),
386  helix_mom_x=helix.getMomentumX(1.5),
387  helix_mom_y=helix.getMomentumY(1.5),
388  mc_x=mc_x,
389  mc_y=mc_y,
390  mc_z=mc_z,
391  mc_mom_x=mc_mom_x,
392  mc_mom_y=mc_mom_y,
393  mc_mom_z=mc_mom_z)
394 
395  if self.use_vxd_hits:
396  first_hit = legendre_track_cand.getHit(0)
397  if first_hit.getDetId() == Belle2.Const.PXD:
398  first_cluster = pxd_clusters[first_hit.getHitId()]
399  first_true_hit = first_cluster.getRelated("PXDTrueHits")
400  elif first_hit.getDetId() == Belle2.Const.SVD:
401  first_cluster = svd_clusters[first_hit.getHitId()]
402  first_true_hit = first_cluster.getRelated("SVDTrueHits")
403 
404  vxdID = first_cluster.getSensorID()
405  sensorInfoBase = Belle2.VXD.GeoCache.getInstance().getSensorInfo(vxdID)
406  first_momentum = sensorInfoBase.vectorToGlobal(first_true_hit.getMomentum(), True)
407 
408  last_hit = legendre_track_cand.getHit(-1)
409  if last_hit.getDetId() == Belle2.Const.PXD:
410  last_cluster = pxd_clusters[last_hit.getHitId()]
411  last_true_hit = last_cluster.getRelated("PXDTrueHits")
412  elif last_hit.getDetId() == Belle2.Const.SVD:
413  last_cluster = svd_clusters[last_hit.getHitId()]
414  last_true_hit = last_cluster.getRelated("SVDTrueHits")
415 
416  vxdID = first_cluster.getSensorID()
417  sensorInfoBase = Belle2.VXD.GeoCache.getInstance().getSensorInfo(vxdID)
418  last_momentum = sensorInfoBase.vectorToGlobal(last_true_hit.getMomentum(), True)
419 
420  return_dict.update(dict(first_hit_mom_x=first_momentum.X(),
421  first_hit_mom_y=first_momentum.Y(),
422  first_hit_mom_z=first_momentum.Z(),
423  last_hit_mom_x=last_momentum.X(),
424  last_hit_mom_y=last_momentum.Y(),
425  last_hit_mom_z=last_momentum.Z()))
426 
427  return return_dict
428 
429 
431  save_tree = refiners.SaveTreeRefiner()
harvester.SegmentFinderParameterExtractorModule.peel
def peel(self, local_track_cand)
Definition: harvester.py:281
harvester.SeedsAnalyser
Definition: harvester.py:335
harvester.SeedsAnalyser.__init__
def __init__(self, output_file_name, track_cands, use_vxd_hits=True)
Definition: harvester.py:342
harvester.ReconstructionPositionHarvester.mc_hit_lookup
mc_hit_lookup
function to look up CDC MC hits
Definition: harvester.py:23
tracking.harvest.harvesting.HarvestingModule.foreach
foreach
Name of the StoreArray or iterable StoreObjPtr that contains the objects to be harvested.
Definition: harvesting.py:182
harvester.SegmentFakeRatesModule.prepare
def prepare(self)
Definition: harvester.py:169
harvester.SegmentFakeRatesModule.__init__
def __init__(self, output_file_name, local_track_cands_store_array_name="LocalTrackCands", mc_track_cands_store_array_name="MCTrackCands", legendre_track_cand_store_array_name="LegendreTrackCands")
Definition: harvester.py:136
harvester.SeedsAnalyser.use_vxd_hits
use_vxd_hits
cached flag to use VXD hits
Definition: harvester.py:349
harvester.SegmentFakeRatesModule.mc_track_matcher_legendre
mc_track_matcher_legendre
function to match Legendre tracks to MC tracks
Definition: harvester.py:160
tracking.harvest
Definition: __init__.py:1
Belle2::TrackMatchLookUp
Class to provide convenient methods to look up matching information between pattern recognition and M...
Definition: TrackMatchLookUp.h:43
tracking.harvest.harvesting
Definition: harvesting.py:1
harvester.WrongRLInfoCounter.peel
def peel(self, track_cand)
Definition: harvester.py:83
harvester.SegmentFakeRatesModule.mc_track_matcher_local
mc_track_matcher_local
function to match local tracks to MC tracks
Definition: harvester.py:158
harvester.SegmentFakeRatesModule.cdcHits
cdcHits
cached CDCHits StoreArray
Definition: harvester.py:172
harvester.WrongRLInfoCounter
Definition: harvester.py:66
harvester.SegmentFinderParameterExtractorModule
Definition: harvester.py:257
harvester.WrongRLInfoCounter.__init__
def __init__(self, output_file_name, tracks_store_vector_name="TrackCands")
Definition: harvester.py:72
harvester.WrongRLInfoCounter.mc_hit_lookup
mc_hit_lookup
function to look up CDC MC hits
Definition: harvester.py:81
Belle2::VXD::GeoCache::getInstance
static GeoCache & getInstance()
Return a reference to the singleton instance.
Definition: GeoCache.cc:215
Belle2::TrackFindingCDC::CDCMCHitLookUp
Interface class to the Monte Carlo information for individual hits.
Definition: CDCMCHitLookUp.h:41
harvester.SeedsAnalyser.peel
def peel(self, legendre_track_cand)
Definition: harvester.py:351
Belle2::TrackFindingCDC::Vector3D
A three dimensional vector.
Definition: Vector3D.h:34
harvester.SegmentFakeRatesModule.mc_track_cands_store_array_name
mc_track_cands_store_array_name
cached name of the TrackCands StoreArray
Definition: harvester.py:153
harvester.ReconstructionPositionHarvester
Definition: harvester.py:9
harvester.SegmentFakeRatesModule
Definition: harvester.py:127
harvester.SegmentFakeRatesModule.peel
def peel(self, local_track_cand)
Definition: harvester.py:175
Belle2::CDC::Helix
Helix parameter class.
Definition: Helix.h:51
harvester.ReconstructionPositionHarvester.__init__
def __init__(self, output_file_name, tracks_store_vector_name="CDCTrackVector")
Definition: harvester.py:13
harvester.SegmentFakeRatesModule.legendre_track_cand_store_array_name
legendre_track_cand_store_array_name
cached name of the Legendre TrackCands StoreArray
Definition: harvester.py:155
harvester.SegmentFinderParameterExtractorModule.mc_track_matcher
mc_track_matcher
function to match tracks to MC tracks
Definition: harvester.py:278
Belle2::PyStoreArray
a (simplified) python wrapper for StoreArray.
Definition: PyStoreArray.h:58
harvester.ReconstructionPositionHarvester.peel
def peel(self, track_cand)
Definition: harvester.py:25
harvester.SegmentFinderParameterExtractorModule.__init__
def __init__(self, local_track_cands_store_array_name, mc_track_cands_store_array_name, output_file_name)
Definition: harvester.py:264
tracking.harvest.harvesting.HarvestingModule
Definition: harvesting.py:86
harvester.SegmentFinderParameterExtractorModule.mc_track_cands_store_array_name
mc_track_cands_store_array_name
cached name of the TrackCands StoreArray
Definition: harvester.py:275
Belle2::TrackFindingCDC::CDCTrajectory3D
Particle full three dimensional trajectory.
Definition: CDCTrajectory3D.h:47