4 from ROOT
import Belle2
11 """ Harvester module to check for the reconstructed positions """
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. """
17 ReconstructionPositionHarvester,
19 foreach=tracks_store_vector_name,
20 output_file_name=output_file_name)
25 def peel(self, track_cand):
26 """ Extract the information """
30 sum_of_difference_norms_stereo = 0
32 sum_of_difference_norms_axial = 0
35 number_of_wrong_rl_infos = 0
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()
43 if reco_hit3D.getStereoType() != 0:
44 sum_of_difference_norms_stereo += abs(hit_difference.z())
47 correct_rl_info = mc_hit_lookup.getRLInfo(underlaying_cdc_hit)
49 if correct_rl_info != reco_hit3D.getRLInfo():
50 number_of_wrong_rl_infos += 1
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))
63 save_tree = refiners.save_tree(folder_name=
"tree")
69 Harvester module to check for the correct reconstructed orientation.
72 def __init__(self, output_file_name, tracks_store_vector_name="TrackCands"):
74 Initialize with the root output file name and the store array name of the track cands to use.
76 HarvestingModule.__init__(self,
77 foreach=tracks_store_vector_name,
78 output_file_name=output_file_name)
83 def peel(self, track_cand):
84 """ Extract the information. """
90 number_of_wrong_rl_infos = 0
91 number_of_wrong_rl_infos_stereo_only = 0
96 for hitID
in range(track_cand.getNHits()):
97 hit = track_cand.getHit(hitID)
98 if not hit.__class__.__name__ ==
"genfit::WireTrackCandHit":
101 underlaying_cdc_hit = cdc_hits[hit.getHitId()]
103 correct_rl_info = mc_hit_lookup.getRLInfo(underlaying_cdc_hit)
107 if underlaying_cdc_hit.getISuperLayer() % 2 != 0:
108 number_of_stereo += 1
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
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))
124 save_tree = refiners.save_tree(folder_name=
"tree")
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.
139 local_track_cands_store_array_name="LocalTrackCands",
140 mc_track_cands_store_array_name="MCTrackCands",
141 legendre_track_cand_store_array_name="LegendreTrackCands"):
143 Initialize the harvesting module with
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
152 SegmentFakeRatesModule,
154 foreach=local_track_cands_store_array_name,
155 output_file_name=output_file_name)
167 legendre_track_cand_store_array_name)
170 """ Prepare the CDC lookup. """
173 return HarvestingModule.prepare(self)
175 def peel(self, local_track_cand):
176 """ Extract the information from the segments. """
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))
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()
196 hit_purity_of_partner = np.NaN
197 hit_efficiency_of_partner = 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
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()
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))
217 legendre_hits = set(list(partner_legendre_track_cand.getHitIDs()))
218 local_hits = set(list(local_track_cand.getHitIDs()))
220 local_hits_new = local_hits - legendre_hits
221 number_of_new_hits = len(local_hits_new)
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
231 if cdc_hit.getISuperLayer() % 2 == 1:
232 partner_has_stereo_information = 1
234 return dict(superlayer_of_segment=superlayer_of_segment,
235 mc_track_dist=mc_track_dist,
236 is_background=is_background,
238 is_matched=is_matched,
240 is_clone_or_matched=is_clone_or_matched,
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)
254 save_tree = refiners.save_tree(folder_name=
"tree")
260 Harvester module to extract momentum and position information from the found segments and tracks.
261 You need the apply MC track matcher module.
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.
269 SegmentFinderParameterExtractorModule,
271 foreach=local_track_cands_store_array_name,
272 output_file_name=output_file_name)
281 def peel(self, local_track_cand):
282 """ Extract the information from the local track candidate. """
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)
289 related_mc_track_cand = mc_track_matcher.getRelatedMCRecoTrack(local_track_cand)
291 track_momentum = np.NaN
292 track_position = np.NaN
296 segment_momentum = np.NaN
297 segment_position = np.NaN
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()
309 related_mc_track_cand.getChargeSeed())
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 = \
318 local_track_cand.getChargeSeed())
320 return dict(is_matched=is_matched,
321 is_background=is_background,
323 segment_pt=segment_pt,
325 difference_pt=segment_pt - track_pt,
326 segment_phi=segment_phi,
328 difference_phi=segment_phi - track_phi)
332 save_tree = refiners.save_tree(folder_name=
"tree")
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.
342 def __init__(self, output_file_name, track_cands, use_vxd_hits=True):
344 Init with the root output file name and the name of the store array of the track cands to use.
346 HarvestingModule.__init__(self, foreach=track_cands, output_file_name=output_file_name)
351 def peel(self, legendre_track_cand):
353 Extract the information.
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)
361 mc_track_cand = matcher.getMatchedMCRecoTrack(legendre_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()
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),
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")
404 vxdID = first_cluster.getSensorID()
406 first_momentum = sensorInfoBase.vectorToGlobal(first_true_hit.getMomentum(),
True)
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")
416 vxdID = first_cluster.getSensorID()
418 last_momentum = sensorInfoBase.vectorToGlobal(last_true_hit.getMomentum(),
True)
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()))
431 save_tree = refiners.SaveTreeRefiner()