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