4 ROOT.gSystem.Load(
"libtracking")
5 from ROOT
import Belle2
17 """Module to collect matching information about the found particles and to generate
18 validation plots and figures of merit on the performance of track finding."""
20 """ Expert level behavior:
21 expert_level = default_expert_level: all figures and plots from this module except tree entries
22 expert_level > default_expert_level: everything including tree entries
23 expert_level <= default_expert_level//2: only basic figures
24 default_expert_level//2 < expert_level < default_expert_level: basic figures and basic tree entries
27 default_expert_level = 10
33 output_file_name=None,
34 reco_tracks_name='RecoTracks',
35 mc_reco_tracks_name='MCRecoTracks',
39 output_file_name = output_file_name
or name +
'TrackingValidation.root'
43 output_file_name=output_file_name,
45 expert_level=expert_level)
70 """Initialization signal at the start of the event processing"""
75 """Collect some statistics about the pattern recognition tracks used for comparision to the MC tracks
77 Executed once at the start of each event.
84 found_det_hit_ids = set()
85 matched_det_hit_ids = set()
86 clone_det_hit_ids = set()
87 fake_det_hit_ids = set()
89 for reco_track
in reco_tracks:
90 det_hit_ids = utilities.get_det_hit_ids(reco_track)
92 found_det_hit_ids |= det_hit_ids
94 if track_match_look_up.isMatchedPRRecoTrack(reco_track):
95 matched_det_hit_ids |= det_hit_ids
97 if track_match_look_up.isClonePRRecoTrack(reco_track):
98 clone_det_hit_ids |= det_hit_ids
100 if (track_match_look_up.isGhostPRRecoTrack(reco_track)
or
101 track_match_look_up.isBackgroundPRRecoTrack(reco_track)):
102 fake_det_hit_ids |= det_hit_ids
110 """Pick every MCRecoTrack"""
114 """Looks at the individual Monte Carlo tracks and store information about them"""
119 multiplicity = mc_reco_tracks.getEntries()
121 mc_particle = track_match_look_up.getRelatedMCParticle(mc_reco_track)
122 is_primary = bool(mc_particle.hasStatus(Belle2.MCParticle.c_PrimaryParticle))
124 mc_store_array_crops = peelers.peel_store_array_info(mc_reco_track, key=
"mc_{part_name}")
126 crops = dict(is_primary=is_primary,
127 multiplicity=multiplicity,
128 **mc_to_pr_match_info_crops,
129 **mc_store_array_crops
133 reco_track = track_match_look_up.getRelatedPRRecoTrack(mc_reco_track)
134 mc_particle_crops = peelers.peel_mc_particle(mc_particle)
135 hit_content_crops = peelers.peel_reco_track_hit_content(mc_reco_track)
138 subdetector_hit_efficiency_crops = peelers.peel_subdetector_hit_efficiency(mc_reco_track, reco_track)
144 event_crops = peelers.peel_event_info(event_meta_data)
147 store_array_crops = peelers.peel_store_array_info(reco_track, key=
"pr_{part_name}")
150 pr_purity_information = {
151 "pr_hit_purity": track_match_look_up.getRelatedPurity(reco_track)
if reco_track
else float(
"nan"),
152 **peelers.peel_subdetector_hit_purity(reco_track=reco_track, mc_reco_track=mc_reco_track,
153 key=
"pr_{part_name}")
157 trackfinder_crops = peelers.peel_trackfinder(reco_track)
160 qualityindicator_crops = peelers.peel_quality_indicators(reco_track)
162 crops.update(dict(**hit_content_crops,
164 **subdetector_hit_efficiency_crops,
165 **mc_hit_efficiencies_in_all_pr_tracks_crops,
168 **pr_purity_information,
170 **qualityindicator_crops
176 """Extracts track-match information from the MCMatcherTracksModule results"""
179 is_matched=track_match_look_up.isMatchedMCRecoTrack(mc_reco_track),
180 is_merged=track_match_look_up.isMergedMCRecoTrack(mc_reco_track),
181 is_missing=track_match_look_up.isMissingMCRecoTrack(mc_reco_track),
182 hit_efficiency=track_match_look_up.getRelatedEfficiency(mc_reco_track),
186 """Extracts hit efficiencies"""
187 mc_det_hit_ids = utilities.get_det_hit_ids(mc_reco_track)
189 hit_efficiency_in_all_found = utilities.calc_hit_efficiency(self.
found_det_hit_ids,
192 unfound_hit_efficiency = 1.0 - hit_efficiency_in_all_found
197 hit_efficiency_in_all_fake = utilities.calc_hit_efficiency(self.
fake_det_hit_ids,
200 hit_efficiency_crops = dict(
201 hit_efficiency_in_all_found=hit_efficiency_in_all_found,
202 unfound_hit_efficiency=unfound_hit_efficiency,
203 hit_efficiency_in_all_matched=hit_efficiency_in_all_matched,
204 hit_efficiency_in_all_fake=hit_efficiency_in_all_fake,
206 return hit_efficiency_crops
212 save_tree = refiners.save_tree(name=
"mc_tree", folder_name=
"mc_tree", above_expert_level=default_expert_level)
215 save_tree_basic = refiners.save_tree(name=
"mc_tree", folder_name=
"mc_tree",
216 above_expert_level=default_expert_level // 2, below_expert_level=default_expert_level)
219 save_overview_figures_of_merit = refiners.save_fom(
220 name=
"{module.id}_overview_figures_of_merit",
221 title=
"Overview figures in {module.title}",
222 aggregation=np.nanmean,
224 select={
"is_matched":
"finding efficiency",
"hit_efficiency":
"hit efficiency", },
225 filter_on=
"is_primary",
227 finding efficiency - the ratio of matched primary Monte Carlo tracks to all Monte Carlo tracks
228 hit efficiency - the ratio of hits picked up by the matched pattern recognition track of primary Monte Carlo tracks
236 save_hit_efficiency_histogram = refiners.save_histograms(
237 above_expert_level=default_expert_level - 1,
238 select={
"hit_efficiency":
"hit efficiency"},
239 filter_on=
"is_primary",
240 description=
"Not a serious plot yet.",
244 renaming_select_for_finding_efficiency_profiles = {
245 'is_matched':
'finding efficiency',
248 'multiplicity':
'multiplicity',
249 'phi0_truth':
'#phi',
253 save_finding_efficiency_profiles = refiners.save_profiles(
254 above_expert_level=default_expert_level - 1,
255 select=renaming_select_for_finding_efficiency_profiles,
256 y=
'finding efficiency',
258 filter_on=
"is_primary",
264 save_finding_efficiency_by_tan_lamba_profiles = refiners.save_profiles(
265 above_expert_level=default_expert_level - 1,
267 'is_matched':
'finding efficiency',
268 'tan_lambda_truth':
'tan #lambda'
270 y=
'finding efficiency',
272 filter_on=
"is_primary",
279 save_finding_efficiency_by_tan_lamba_in_pt_groups_profiles = refiners.save_profiles(
280 above_expert_level=default_expert_level - 1,
282 'is_matched':
'finding efficiency',
283 'tan_lambda_truth':
'tan #lambda'
285 y=
'finding efficiency',
287 filter_on=
"is_primary",
288 groupby=[(
"pt_truth", [0.070, 0.250, 0.600])],
296 renaming_select_for_hit_efficiency_profiles = {
297 'hit_efficiency':
'hit efficiency',
300 'multiplicity':
'multiplicity',
301 'phi0_truth':
'#phi',
305 save_hit_efficiency_profiles = refiners.save_profiles(
306 above_expert_level=default_expert_level - 1,
307 select=renaming_select_for_hit_efficiency_profiles,
310 filter_on=
"is_primary",
316 save_hit_efficiency_by_tan_lambda_profiles = refiners.save_profiles(
317 above_expert_level=default_expert_level - 1,
319 'hit_efficiency':
'hit efficiency',
320 'tan_lambda_truth':
'tan #lambda',
324 filter_on=
"is_primary",
333 save_hit_efficiency_in_all_found_hist = refiners.save_histograms(
334 above_expert_level=default_expert_level - 1,
336 select=dict(hit_efficiency_in_all_found=
"total hit efficiency vs. all reconstructed tracks")
342 save_missing_mc_tracks_hit_efficiency_in_all_found_hist = refiners.save_histograms(
343 above_expert_level=default_expert_level - 1,
344 filter_on=
"is_missing",
346 select=dict(hit_efficiency_in_all_found=
"total hit efficiency in all reconstructed tracks for missing mc tracks")