Belle II Software  release-06-00-14
peelers.py
1 
8 
9 """
10 A set of common purose translators from complex framework objects to flat dictionaries
11 """
12 
13 import functools
14 
15 import math
16 import numpy as np
17 
18 import ROOT
19 
20 from ROOT import Belle2
21 
22 import basf2
23 from tracking.validation.tolerate_missing_key_formatter import TolerateMissingKeyFormatter
24 
25 from tracking.validation.utilities import getObjectList
26 
27 Belle2.RecoTrack.getRightLeftInformation["Belle2::CDCHit"]
28 ROOT.gSystem.Load("libtracking")
29 
30 formatter = TolerateMissingKeyFormatter()
31 
32 
33 
34 
35 def format_crop_keys(peel_func):
36  @functools.wraps(peel_func)
37  def peel_func_formatted_keys(*args, key="{part_name}", **kwargs):
38  crops = peel_func(*args, **kwargs, key=key)
39  if key and hasattr(crops, 'items'):
40  crops_with_formatted_keys = dict()
41  for part_name, value in list(crops.items()):
42  formatted_key = formatter.format(key, part_name=part_name)
43  crops_with_formatted_keys[formatted_key] = value
44  return crops_with_formatted_keys
45 
46  else:
47  return crops
48 
49  return peel_func_formatted_keys
50 
51 
52 
53 
54 @format_crop_keys
55 def peel_mc_particle(mc_particle, key="{part_name}"):
56  if mc_particle:
57  helix = get_helix_from_mc_particle(mc_particle)
58  momentum = mc_particle.getMomentum()
59  vertex = mc_particle.getVertex()
60  charge = mc_particle.getCharge()
61  pdg_code = mc_particle.getPDG()
62  is_primary = bool(mc_particle.hasStatus(Belle2.MCParticle.c_PrimaryParticle))
63 
64  decay_vertex = mc_particle.getDecayVertex()
65  number_of_daughters = mc_particle.getNDaughters()
66  status = mc_particle.getStatus()
67 
68  return dict(
69  # At origin assuming perfect magnetic field
70  d0_truth=helix.getD0(),
71  phi0_truth=helix.getPhi0() % (2.0 * math.pi),
72  omega_truth=helix.getOmega(),
73  z0_truth=helix.getZ0(),
74  tan_lambda_truth=helix.getTanLambda(),
75 
76  # At the vertex position
77  pt_truth=momentum.Perp(),
78  px_truth=momentum.X(),
79  py_truth=momentum.Y(),
80  pz_truth=momentum.Z(),
81  x_truth=vertex.X(),
82  y_truth=vertex.Y(),
83  z_truth=vertex.Z(),
84 
85  decay_vertex_radius_truth=decay_vertex.Mag(),
86  decay_vertex_x_truth=decay_vertex.X(),
87  decay_vertex_y_truth=decay_vertex.Y(),
88  decay_vertex_z_truth=decay_vertex.Z(),
89  number_of_daughters_truth=number_of_daughters,
90  status_truth=status,
91 
92  # MC Particle information
93  charge_truth=charge,
94  pdg_code_truth=pdg_code,
95  is_primary=is_primary,
96  )
97 
98  else:
99  nan = float('nan')
100  return dict(
101  # At origin assuming perfect magnetic field
102  d0_truth=nan,
103  phi0_truth=nan,
104  omega_truth=nan,
105  z0_truth=nan,
106  tan_lambda_truth=nan,
107 
108  # At the vertex position
109  pt_truth=nan,
110  px_truth=nan,
111  py_truth=nan,
112  pz_truth=nan,
113  x_truth=nan,
114  y_truth=nan,
115  z_truth=nan,
116 
117  decay_vertex_radius_truth=nan,
118  decay_vertex_x_truth=nan,
119  decay_vertex_y_truth=nan,
120  decay_vertex_z_truth=nan,
121  number_of_daughters_truth=nan,
122  status_truth=nan,
123 
124 
125  # MC Particle information
126  charge_truth=nan,
127  pdg_code_truth=0,
128  is_primary=False,
129  )
130 
131 
132 
133 
134 @format_crop_keys
135 def peel_reco_track_hit_content(reco_track, key="{part_name}"):
136  nan = float('nan')
137 
138  first_pxd_layer = nan
139  last_pxd_layer = nan
140  first_svd_layer = nan
141  last_svd_layer = nan
142  first_cdc_layer = nan
143  last_cdc_layer = nan
144  sum_of_weights = nan
145  last_fit_layer = nan
146 
147  if reco_track:
148  sum_of_weights = 0
149  last_fit_layer = 0
150 
151  n_cdc_hits = reco_track.getNumberOfCDCHits()
152  n_svd_hits = reco_track.getNumberOfSVDHits()
153  n_pxd_hits = reco_track.getNumberOfPXDHits()
154  ndf = 2 * n_pxd_hits + n_svd_hits + n_cdc_hits
155 
156  pxd_hits = [hit.getSensorID().getLayerNumber() for hit in getObjectList(reco_track.getPXDHitList())]
157  if pxd_hits:
158  first_pxd_layer = min(pxd_hits)
159  last_pxd_layer = max(pxd_hits)
160  svd_hits = [hit.getSensorID().getLayerNumber() for hit in getObjectList(reco_track.getSVDHitList())]
161  if svd_hits:
162  first_svd_layer = min(svd_hits)
163  last_svd_layer = max(svd_hits)
164  cdc_hits = [hit.getICLayer() for hit in getObjectList(reco_track.getCDCHitList())]
165  if cdc_hits:
166  first_cdc_layer = min(cdc_hits)
167  last_cdc_layer = max(cdc_hits)
168  for hit_info in getObjectList(reco_track.getRelationsWith("RecoHitInformations")):
169  track_point = reco_track.getCreatedTrackPoint(hit_info)
170  if track_point:
171  fitted_state = track_point.getFitterInfo()
172  if fitted_state:
173  W = max(fitted_state.getWeights())
174  sum_of_weights += W
175  if W > 0.5 and hit_info.getTrackingDetector() == Belle2.RecoHitInformation.c_CDC:
176  layer = hit_info.getRelated("CDCHits").getICLayer()
177  if layer > last_fit_layer:
178  last_fit_layer = layer
179  return dict(
180  n_pxd_hits=n_pxd_hits,
181  n_svd_hits=n_svd_hits,
182  n_cdc_hits=n_cdc_hits,
183  n_hits=n_pxd_hits + n_svd_hits + n_cdc_hits,
184  ndf_hits=ndf,
185  first_pxd_layer=first_pxd_layer,
186  last_pxd_layer=last_pxd_layer,
187  first_svd_layer=first_svd_layer,
188  last_svd_layer=last_svd_layer,
189  first_cdc_layer=first_cdc_layer,
190  last_cdc_layer=last_cdc_layer,
191  sum_of_weights=sum_of_weights,
192  last_fit_layer=last_fit_layer
193  )
194  else:
195  return dict(
196  n_pxd_hits=nan,
197  n_svd_hits=nan,
198  n_cdc_hits=nan,
199  n_hits=nan,
200  ndf_hits=nan,
201  first_pxd_layer=first_pxd_layer,
202  last_pxd_layer=last_pxd_layer,
203  first_svd_layer=first_svd_layer,
204  last_svd_layer=last_svd_layer,
205  first_cdc_layer=first_cdc_layer,
206  last_cdc_layer=last_cdc_layer,
207  sum_of_weights=sum_of_weights,
208  last_fit_layer=last_fit_layer
209  )
210 
211 
212 
213 
214 @format_crop_keys
215 def peel_reco_track_seed(reco_track, key="{part_name}"):
216  if reco_track:
217  seed_fit_result = get_seed_track_fit_result(reco_track)
218  return peel_track_fit_result(seed_fit_result, key="seed_{part_name}")
219 
220  else:
221  return peel_track_fit_result(None, key="seed_{part_name}")
222 
223 
224 
225 
226 @format_crop_keys
227 def peel_event_info(event_meta_data, key="{part_name}"):
228  return dict(
229  event_number=event_meta_data.getEvent(),
230  run_number=event_meta_data.getRun(),
231  experiment_number=event_meta_data.getExperiment(),
232  )
233 
234 
235 
236 
237 @format_crop_keys
238 def peel_store_array_info(item, key="{part_name}"):
239  if item:
240  return dict(
241  store_array_number=item.getArrayIndex()
242  )
243  else:
244  return dict(
245  store_array_number=float("nan")
246  )
247 
248 
249 
250 
251 @format_crop_keys
252 def peel_store_array_size(array_name, key="{part_name}"):
253  array = Belle2.PyStoreArray(array_name)
254  return {str(array_name) + "_size": array.getEntries() if array else 0}
255 
256 
257 
258 
259 @format_crop_keys
260 def peel_event_level_tracking_info(event_level_tracking_info, key="{part_name}"):
261  if not event_level_tracking_info:
262  return dict(
263  has_vxdtf2_failure_flag=False,
264  has_svdckf_failure_flag=False,
265  has_pxdckf_failure_flag=False,
266  has_unspecified_trackfinding_failure=False,
267  )
268  return dict(has_vxdtf2_failure_flag=event_level_tracking_info.hasVXDTF2AbortionFlag(),
269  has_svdckf_failure_flag=event_level_tracking_info.hasSVDCKFAbortionFlag(),
270  has_pxdckf_failure_flag=event_level_tracking_info.hasPXDCKFAbortionFlag(),
271  has_unspecified_trackfinding_failure=event_level_tracking_info.hasUnspecifiedTrackFindingFailure(),
272  )
273 
274 
275 
276 
277 @format_crop_keys
278 def peel_quality_indicators(reco_track, key="{part_name}"):
279  nan = float("nan")
280 
281  svd_qi = nan
282  cdc_qi = nan
283  qi = nan
284 
285  if reco_track:
286  qi = reco_track.getQualityIndicator()
287  space_point_track_cand = reco_track.getRelated('SPTrackCands')
288 
289  # adjust relations if SVD->CDC CKF enabled
290  if not space_point_track_cand:
291  svd_track_cand = reco_track.getRelated('SVDRecoTracks')
292  if not svd_track_cand:
293  svd_cdc_track_cand = reco_track.getRelated('SVDCDCRecoTracks')
294  if svd_cdc_track_cand:
295  svd_track_cand = svd_cdc_track_cand.getRelated('SVDRecoTracks')
296  if not svd_track_cand:
297  temp_svd_track_cand = svd_cdc_track_cand.getRelated('SVDPlusCDCStandaloneRecoTracks')
298  if temp_svd_track_cand:
299  svd_track_cand = temp_svd_track_cand.getRelated('SVDRecoTracks')
300  if svd_track_cand:
301  space_point_track_cand = svd_track_cand.getRelated('SPTrackCands')
302 
303  if space_point_track_cand:
304  svd_qi = space_point_track_cand.getQualityIndicator()
305 
306  cdc_track_cand = reco_track.getRelated('CDCRecoTracks')
307  if not cdc_track_cand:
308  svd_cdc_track_cand = reco_track.getRelated('SVDCDCRecoTracks')
309  if svd_cdc_track_cand:
310  cdc_track_cand = svd_cdc_track_cand.getRelated('CDCRecoTracks')
311  if not cdc_track_cand:
312  cdc_track_cand = svd_cdc_track_cand.getRelated('CKFCDCRecoTracks')
313  if not cdc_track_cand:
314  temp_cdc_track_cand = svd_cdc_track_cand.getRelated('SVDPlusCDCStandaloneRecoTracks')
315  if temp_cdc_track_cand:
316  cdc_track_cand = temp_cdc_track_cand.getRelated('CDCRecoTracks')
317 
318  if cdc_track_cand:
319  cdc_qi = cdc_track_cand.getQualityIndicator()
320 
321  crops = dict(
322  quality_indicator=qi,
323  svd_quality_indicator=svd_qi,
324  cdc_qualityindicator=cdc_qi,
325  )
326 
327  return crops
328 
329 
330 
331 
332 @format_crop_keys
333 def peel_trackfinder(reco_track, key="{part_name}"):
334  used_CDCTrackFinder = False
335  used_VXDTrackFinder = False
336  used_SVDtoCDCCKF = False
337  used_ECLtoCDCCKF = False
338  used_CDCtoSVDCKF = False
339 
340  if reco_track:
341  if reco_track.getNumberOfSVDHits() > 0:
342  info = get_reco_hit_information(reco_track, reco_track.getSVDHitList()[0])
343  svd_tf = info.getFoundByTrackFinder()
344  used_VXDTrackFinder = svd_tf == Belle2.RecoHitInformation.c_VXDTrackFinder
345  used_CDCtoSVDCKF = svd_tf == Belle2.RecoHitInformation.c_CDCtoSVDCKF
346 
347  if reco_track.getNumberOfCDCHits() > 0:
348  info = get_reco_hit_information(reco_track, reco_track.getCDCHitList()[0])
349  cdc_tf = info.getFoundByTrackFinder()
350  used_CDCTrackFinder = cdc_tf == Belle2.RecoHitInformation.c_CDCTrackFinder
351  used_SVDtoCDCCKF = cdc_tf == Belle2.RecoHitInformation.c_SVDtoCDCCKF
352  used_ECLtoCDCCKF = cdc_tf == Belle2.RecoHitInformation.c_ECLtoCDCCKF
353 
354  crops = dict(
355  foundby_CDCTrackFinder=used_CDCTrackFinder,
356  foundby_VXDTrackFinder=used_VXDTrackFinder,
357  foundby_SVDtoCDCCKF=used_SVDtoCDCCKF,
358  foundby_CDCtoSVDCKF=used_CDCtoSVDCKF,
359  foundby_ECLtoCDCCKF=used_ECLtoCDCCKF,
360  )
361 
362  return crops
363 
364 
365 
366 
367 @format_crop_keys
368 def peel_fit_status(reco_track, key="{part_name}"):
369  nan = float("nan")
370 
371  crops = dict(
372  is_fitted=nan,
373  fit_pion_ok=nan,
374  ndf_pion=nan,
375  fit_muon_ok=nan,
376  ndf_muon=nan,
377  fit_electron_ok=nan,
378  ndf_electron=nan,
379  fit_proton_ok=nan,
380  ndf_proton=nan,
381  fit_kaon_ok=nan,
382  ndf_kaon=nan,
383  )
384 
385  if reco_track:
386  crops["is_fitted"] = reco_track.wasFitSuccessful()
387 
388  for rep in getObjectList(reco_track.getRepresentations()):
389  was_successful = reco_track.wasFitSuccessful(rep)
390  pdg_code = rep.getPDG()
391 
392  for crop in crops.keys():
393  if crop.startswith("fit_"):
394  particle_name = crop.split("_")[1]
395  if abs(getattr(Belle2.Const, particle_name).getPDGCode()) == abs(pdg_code):
396  crops[crop] = was_successful
397 
398  if was_successful:
399  crops[f"ndf_{particle_name}"] = reco_track.getTrackFitStatus(rep).getNdf()
400 
401  return crops
402 
403 
404 
405 
406 @format_crop_keys
407 def peel_track_fit_result(track_fit_result, key="{part_name}"):
408  nan = float("nan")
409  if track_fit_result:
410  cov6 = track_fit_result.getCovariance6()
411  mom = track_fit_result.getMomentum()
412  pos = track_fit_result.getPosition()
413 
414  pt_estimate = mom.Perp()
415 
416  pt_variance = np.divide(
417  mom.X() ** 2 * cov6(3, 3) + mom.Y() ** 2 * cov6(4, 4) - 2 * mom.X() * mom.Y() * cov6(3, 4),
418  mom.Perp2()
419  )
420 
421  pt_resolution = np.divide(pt_variance, pt_estimate)
422 
423  fit_crops = dict(
424  has_trackFitResult=True,
425  d0_estimate=track_fit_result.getD0(),
426  d0_variance=track_fit_result.getCov()[0],
427  phi0_estimate=track_fit_result.getPhi() % (2.0 * math.pi),
428  phi0_variance=track_fit_result.getCov()[5],
429  omega_estimate=track_fit_result.getOmega(),
430  omega_variance=track_fit_result.getCov()[9],
431  z0_estimate=track_fit_result.getZ0(),
432  z0_variance=track_fit_result.getCov()[12],
433  tan_lambda_estimate=track_fit_result.getCotTheta(),
434  tan_lambda_variance=track_fit_result.getCov()[14],
435 
436  x_estimate=pos.X(),
437  x_variance=cov6(0, 0),
438  y_estimate=pos.Y(),
439  y_variance=cov6(1, 1),
440  z_estimate=pos.Z(),
441  z_variance=cov6(2, 2),
442 
443  pt_estimate=pt_estimate,
444  pt_variance=pt_variance,
445  pt_resolution=pt_resolution,
446 
447  track_charge=track_fit_result.getChargeSign(),
448  b_field=Belle2.BFieldManager.getField(pos).Z(),
449 
450  px_estimate=mom.X(),
451  px_variance=cov6(3, 3),
452  py_estimate=mom.Y(),
453  py_variance=cov6(4, 4),
454  pz_estimate=mom.Z(),
455  pz_variance=cov6(5, 5),
456 
457  p_value=track_fit_result.getPValue(),
458  )
459 
460  else:
461  fit_crops = dict(
462  has_trackFitResult=False,
463  d0_estimate=nan,
464  d0_variance=nan,
465  phi0_estimate=nan,
466  phi0_variance=nan,
467  omega_estimate=nan,
468  omega_variance=nan,
469  z0_estimate=nan,
470  z0_variance=nan,
471  tan_lambda_estimate=nan,
472  tan_lambda_variance=nan,
473 
474  x_estimate=nan,
475  x_variance=nan,
476  y_estimate=nan,
477  y_variance=nan,
478  z_estimate=nan,
479  z_variance=nan,
480 
481  pt_estimate=nan,
482  pt_variance=nan,
483  pt_resolution=nan,
484 
485  track_charge=nan,
486  b_field=nan,
487 
488  px_estimate=nan,
489  px_variance=nan,
490  py_estimate=nan,
491  py_variance=nan,
492  pz_estimate=nan,
493  pz_variance=nan,
494 
495  p_value=nan,
496  )
497 
498  return fit_crops
499 
500 
501 
502 
503 def get_reco_hit_information(reco_track, hit):
504  """Helper function for getting the correct reco hit info"""
505  for info in getObjectList(hit.getRelationsFrom("RecoHitInformations")):
506  if info.getRelatedFrom(reco_track.getArrayName()) == reco_track:
507  return info
508 
509 
510 
511 @format_crop_keys
512 def peel_subdetector_hit_efficiency(mc_reco_track, reco_track, key="{part_name}"):
513  def get_efficiency(detector_string):
514  if not reco_track or not mc_reco_track:
515  hit_efficiency = float("nan")
516  else:
517  mc_reco_hits = getObjectList(getattr(mc_reco_track, "get{}HitList".format(detector_string.upper()))())
518  if len(mc_reco_hits) == 0:
519  hit_efficiency = float('nan')
520  else:
521  mc_reco_hit_size = 0
522  hit_efficiency = 0.
523  for mc_reco_hit in mc_reco_hits:
524  info = get_reco_hit_information(mc_reco_track, mc_reco_hit)
525 
526  if info.getFoundByTrackFinder() == Belle2.RecoHitInformation.c_MCTrackFinderAuxiliaryHit:
527  continue
528 
529  mc_reco_hit_size += 1
530 
531  for reco_hit in getObjectList(getattr(reco_track, "get{}HitList".format(detector_string.upper()))()):
532  if mc_reco_hit.getArrayIndex() == reco_hit.getArrayIndex():
533  hit_efficiency += 1
534  break
535 
536  if not mc_reco_hit_size:
537  hit_efficiency = float('nan')
538  else:
539  hit_efficiency /= mc_reco_hit_size
540 
541  return {"{}_hit_efficiency".format(detector_string.lower()): hit_efficiency}
542 
543  return dict(**get_efficiency("CDC"), **get_efficiency("SVD"), **get_efficiency("PXD"))
544 
545 
546 
547 @format_crop_keys
548 def peel_subdetector_hit_purity(reco_track, mc_reco_track, key="{part_name}"):
549  def get_efficiency(detector_string):
550  if not reco_track or not mc_reco_track:
551  hit_purity = float("nan")
552  else:
553  reco_hits = getObjectList(getattr(reco_track, "get{}HitList".format(detector_string.upper()))())
554  reco_hit_size = len(reco_hits)
555 
556  if reco_hit_size == 0:
557  hit_purity = float('nan')
558  else:
559  hit_purity = 0.
560  for reco_hit in reco_hits:
561  for mc_reco_hit in getObjectList(getattr(mc_reco_track, "get{}HitList".format(detector_string.upper()))()):
562  if mc_reco_hit.getArrayIndex() == reco_hit.getArrayIndex():
563  hit_purity += 1
564  break
565 
566  hit_purity /= reco_hit_size
567 
568  return {"{}_hit_purity".format(detector_string.lower()): hit_purity}
569 
570  return dict(**get_efficiency("CDC"), **get_efficiency("SVD"), **get_efficiency("PXD"))
571 
572 
573 
574 @format_crop_keys
575 def peel_hit_information(hit_info, reco_track, key="{part_name}"):
576  nan = np.float("nan")
577 
578  crops = dict(residual=nan,
579  residual_x=nan,
580  residual_y=nan,
581  residuals=nan,
582  weight=nan,
583  tracking_detector=hit_info.getTrackingDetector(),
584  use_in_fit=hit_info.useInFit(),
585  hit_time=nan,
586  layer_number=nan,
587  )
588 
589  if hit_info.useInFit() and reco_track.hasTrackFitStatus():
590  track_point = reco_track.getCreatedTrackPoint(hit_info)
591  fitted_state = track_point.getFitterInfo()
592  if fitted_state:
593  try:
594  res_state = fitted_state.getResidual().getState()
595  crops["residual"] = np.sqrt(res_state.Norm2Sqr())
596  if res_state.GetNoElements() == 2:
597  crops["residual_x"] = res_state[0]
598  crops["residual_y"] = res_state[1]
599  weights = fitted_state.getWeights()
600  crops['weight'] = max(weights)
601  except BaseException:
602  pass
603 
604  if hit_info.getTrackingDetector() == Belle2.RecoHitInformation.c_SVD:
605  hit = hit_info.getRelated("SVDClusters")
606  crops["hit_time"] = hit.getClsTime()
607  crops["layer_number"] = hit.getSensorID().getLayerNumber()
608  if hit_info.getTrackingDetector() == Belle2.RecoHitInformation.c_PXD:
609  hit = hit_info.getRelated("PXDClusters")
610  crops["layer_number"] = hit.getSensorID().getLayerNumber()
611  if hit_info.getTrackingDetector() == Belle2.RecoHitInformation.c_CDC:
612  hit = hit_info.getRelated("CDCHits")
613  crops["layer_number"] = hit.getICLayer()
614 
615  return crops
616 
617 
618 
619 @format_crop_keys
620 def peel_module_statistics(modules=None, key="{part_name}"):
621  if modules is None:
622  modules = []
623  module_stats = dict()
624 
625  for module in basf2.statistics.modules:
626  if module.name in modules:
627  module_stats[str(module.name) + "_mem"] = module.memory_sum(basf2.statistics.EVENT)
628  module_stats[str(module.name) + "_time"] = module.time_sum(basf2.statistics.EVENT)
629  module_stats[str(module.name) + "_calls"] = module.calls(basf2.statistics.EVENT)
630 
631  return module_stats
632 
633 
634 
635 
636 def get_helix_from_mc_particle(mc_particle):
637  position = mc_particle.getVertex()
638  momentum = mc_particle.getMomentum()
639  charge_sign = (-1 if mc_particle.getCharge() < 0 else 1)
640  b_field = Belle2.BFieldManager.getField(position).Z() / Belle2.Unit.T
641 
642  seed_helix = Belle2.Helix(position, momentum, charge_sign, b_field)
643  return seed_helix
644 
645 
646 
647 
648 def get_seed_track_fit_result(reco_track):
649  position = reco_track.getPositionSeed()
650  momentum = reco_track.getMomentumSeed()
651  cartesian_covariance = reco_track.getSeedCovariance()
652  charge_sign = (-1 if reco_track.getChargeSeed() < 0 else 1)
653  # It does not matter, which particle we put in here, so we just use a pion
654  particle_type = Belle2.Const.pion
655  p_value = float('nan')
656  b_field = Belle2.BFieldManager.getField(position).Z() / Belle2.Unit.T
657  cdc_hit_pattern = 0
658  svd_hit_pattern = 0
659  # the value 0xFFFF will cause the TrackFitResult::getNDF() to return -1
660  ndf = 0xFFFF
661 
662  track_fit_result = Belle2.TrackFitResult(
663  position,
664  momentum,
665  cartesian_covariance,
666  charge_sign,
667  particle_type,
668  p_value,
669  b_field,
670  cdc_hit_pattern,
671  svd_hit_pattern,
672  ndf,
673  )
674 
675  return track_fit_result
676 
677 
678 
679 
680 def is_correct_rl_information(cdc_hit, reco_track, hit_lookup):
681  rl_info = reco_track.getRightLeftInformation["const Belle2::CDCHit"](cdc_hit)
682  truth_rl_info = hit_lookup.getRLInfo(cdc_hit)
683 
684  if rl_info == Belle2.RecoHitInformation.c_right and truth_rl_info == 1:
685  return True
686  if rl_info == Belle2.RecoHitInformation.c_left and truth_rl_info == 65535: # -1 as short
687  return True
688 
689  return False
Helix parameter class.
Definition: Helix.h:48
This class provides a set of constants for the framework.
Definition: Const.h:34
a (simplified) python wrapper for StoreArray.
Definition: PyStoreArray.h:56
Values of the result of a track fit with a given particle hypothesis.
static void getField(const double *pos, double *field)
return the magnetic field at a given position.