2 A set of common purose translators from complex framework objects to flat dictionaries
12 ROOT.gSystem.Load(
"libtracking")
13 from ROOT
import Belle2
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
39 return peel_func_formatted_keys
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))
54 decay_vertex = mc_particle.getDecayVertex()
55 number_of_daughters = mc_particle.getNDaughters()
56 status = mc_particle.getStatus()
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(),
67 pt_truth=momentum.Perp(),
68 px_truth=momentum.X(),
69 py_truth=momentum.Y(),
70 pz_truth=momentum.Z(),
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,
84 pdg_code_truth=pdg_code,
85 is_primary=is_primary,
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,
128 first_pxd_layer = nan
130 first_svd_layer = nan
132 first_cdc_layer = nan
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
146 pxd_hits = [hit.getSensorID().getLayerNumber()
for hit
in reco_track.getPXDHitList()]
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()]
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()]
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)
161 fitted_state = track_point.getFitterInfo()
163 W = max(fitted_state.getWeights())
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
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,
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
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
219 event_number=event_meta_data.getEvent(),
220 run_number=event_meta_data.getRun(),
221 experiment_number=event_meta_data.getExperiment(),
231 store_array_number=item.getArrayIndex()
235 store_array_number=float(
"nan")
244 return {str(array_name) +
"_size": array.getEntries()
if array
else 0}
251 if not event_level_tracking_info:
253 has_vxdtf2_failure_flag=
False,
254 has_svdckf_failure_flag=
False,
255 has_pxdckf_failure_flag=
False,
256 has_unspecified_trackfinding_failure=
False,
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(),
276 qi = reco_track.getQualityIndicator()
277 space_point_track_cand = reco_track.getRelated(
'SPTrackCands')
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')
291 space_point_track_cand = svd_track_cand.getRelated(
'SPTrackCands')
293 if space_point_track_cand:
294 svd_qi = space_point_track_cand.getQualityIndicator()
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')
309 cdc_qi = cdc_track_cand.getQualityIndicator()
312 quality_indicator=qi,
313 svd_quality_indicator=svd_qi,
314 cdc_qualityindicator=cdc_qi,
324 used_CDCTrackFinder =
False
325 used_VXDTrackFinder =
False
326 used_SVDtoCDCCKF =
False
327 used_ECLtoCDCCKF =
False
328 used_CDCtoSVDCKF =
False
331 if reco_track.getNumberOfSVDHits() > 0:
333 svd_tf = info.getFoundByTrackFinder()
334 used_VXDTrackFinder = svd_tf == Belle2.RecoHitInformation.c_VXDTrackFinder
335 used_CDCtoSVDCKF = svd_tf == Belle2.RecoHitInformation.c_CDCtoSVDCKF
337 if reco_track.getNumberOfCDCHits() > 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
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,
376 crops[
"is_fitted"] = reco_track.wasFitSuccessful()
378 for rep
in reco_track.getRepresentations():
379 was_successful = reco_track.wasFitSuccessful(rep)
380 pdg_code = rep.getPDG()
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
389 crops[f
"ndf_{particle_name}"] = reco_track.getTrackFitStatus(rep).getNdf()
400 cov6 = track_fit_result.getCovariance6()
401 mom = track_fit_result.getMomentum()
402 pos = track_fit_result.getPosition()
404 pt_estimate = mom.Perp()
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),
411 pt_resolution = np.divide(pt_variance, pt_estimate)
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],
426 x_variance=cov6(0, 0),
428 y_variance=cov6(1, 1),
430 z_variance=cov6(2, 2),
432 pt_estimate=pt_estimate,
433 pt_variance=pt_variance,
434 pt_resolution=pt_resolution,
439 px_variance=cov6(3, 3),
441 py_variance=cov6(4, 4),
443 pz_variance=cov6(5, 5),
445 p_value=track_fit_result.getPValue(),
458 tan_lambda_estimate=nan,
459 tan_lambda_variance=nan,
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:
499 def get_efficiency(detector_string):
500 if not reco_track
or not mc_reco_track:
501 hit_efficiency = float(
"nan")
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')
509 for mc_reco_hit
in mc_reco_hits:
512 if info.getFoundByTrackFinder() == Belle2.RecoHitInformation.c_MCTrackFinderAuxiliaryHit:
515 mc_reco_hit_size += 1
517 for reco_hit
in getattr(reco_track,
"get{}HitList".format(detector_string.upper()))():
518 if mc_reco_hit.getArrayIndex() == reco_hit.getArrayIndex():
522 if not mc_reco_hit_size:
523 hit_efficiency = float(
'nan')
525 hit_efficiency /= mc_reco_hit_size
527 return {
"{}_hit_efficiency".format(detector_string.lower()): hit_efficiency}
529 return dict(**get_efficiency(
"CDC"), **get_efficiency(
"SVD"), **get_efficiency(
"PXD"))
535 def get_efficiency(detector_string):
536 if not reco_track
or not mc_reco_track:
537 hit_purity = float(
"nan")
539 reco_hits = getattr(reco_track,
"get{}HitList".format(detector_string.upper()))()
540 reco_hit_size = reco_hits.size()
542 if reco_hit_size == 0:
543 hit_purity = float(
'nan')
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():
552 hit_purity /= reco_hit_size
554 return {
"{}_hit_purity".format(detector_string.lower()): hit_purity}
556 return dict(**get_efficiency(
"CDC"), **get_efficiency(
"SVD"), **get_efficiency(
"PXD"))
562 nan = np.float(
"nan")
564 crops = dict(residual=nan,
569 tracking_detector=hit_info.getTrackingDetector(),
570 use_in_fit=hit_info.useInFit(),
575 if hit_info.useInFit()
and reco_track.hasTrackFitStatus():
576 track_point = reco_track.getCreatedTrackPoint(hit_info)
577 fitted_state = track_point.getFitterInfo()
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:
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()
607 module_stats = dict()
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)
621 position = mc_particle.getVertex()
622 momentum = mc_particle.getMomentum()
623 charge_sign = (-1
if mc_particle.getCharge() < 0
else 1)
626 seed_helix =
Belle2.Helix(position, momentum, charge_sign, b_field)
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)
638 particle_type = Belle2.Const.pion
639 p_value = float(
'nan')
649 cartesian_covariance,
659 return track_fit_result
665 rl_info = reco_track.getRightLeftInformation(
"const Belle2::CDCHit")(cdc_hit)
666 truth_rl_info = hit_lookup.getRLInfo(cdc_hit)
668 if rl_info == Belle2.RecoHitInformation.c_right
and truth_rl_info == 1:
670 if rl_info == Belle2.RecoHitInformation.c_left
and truth_rl_info == 65535: