Belle II Software  release-05-01-25
validation.py
1 from tracking.harvest import peelers, refiners
2 from tracking.harvest.harvesting import HarvestingModule
3 
4 from ROOT import Belle2
5 
6 from tracking.harvest.peelers import format_crop_keys
7 
8 
10  """Gather the MC VXD-CDC-merger results into ROOT file"""
11 
12  def __init__(self, output_file_name):
13  """
14  Init harvester
15  Arguments:
16  output_file_name (str): name of the output ROOT file
17  """
18  HarvestingModule.__init__(self, foreach="MCParticles", output_file_name=output_file_name)
19 
20 
21  self.mc_track_matcher_cdc = Belle2.TrackMatchLookUp("MCRecoTracks", "CDCRecoTracks")
22 
23  self.mc_track_matcher_vxd = Belle2.TrackMatchLookUp("MCRecoTracks", "SVDRecoTracks")
24 
25  def pick(self, mc_particle):
26  """Return true if the MCParticle has a related MCRecoTrack"""
27  # mc_track = mc_particle.getRelated("MCRecoTracks")
28  # return mc_track != None
29  mc_track = mc_particle.getRelatedFrom("MCRecoTracks")
30  if mc_track:
31  return True
32  else:
33  return False
34 
35  def peel(self, mc_particle):
36  """Collect information related to the MCParticle into a dictionary"""
37  mc_track = mc_particle.getRelatedFrom("MCRecoTracks")
38 
39  event_info = Belle2.PyStoreObj("EventMetaData")
40 
41  result = peelers.peel_mc_particle(mc_particle)
42  result.update(peelers.peel_reco_track_hit_content(mc_track))
43  result.update(peelers.peel_event_info(event_info))
44 
45  result["mc_store_array_number"] = mc_track.getArrayIndex()
46 
47  this_best_track_cdc = self.mc_track_matcher_cdc.getMatchedPRRecoTrack(mc_track)
48  this_best_track_vxd = self.mc_track_matcher_vxd.getMatchedPRRecoTrack(mc_track)
49 
50  result.update(peelers.peel_reco_track_hit_content(this_best_track_cdc, key="cdc_{part_name}"))
51  result.update(peelers.peel_reco_track_seed(this_best_track_cdc, key="cdc_{part_name}"))
52  if this_best_track_cdc:
53  result["cdc_store_array_number"] = this_best_track_cdc.getArrayIndex()
54  result["cdc_was_fitted"] = this_best_track_cdc.wasFitSuccessful()
55  else:
56  result["cdc_store_array_number"] = -1
57  result["cdc_was_fitted"] = -1
58 
59  result.update(peelers.peel_reco_track_hit_content(this_best_track_vxd, key="vxd_{part_name}"))
60  result.update(peelers.peel_reco_track_seed(this_best_track_vxd, key="vxd_{part_name}"))
61  if this_best_track_vxd:
62  result["vxd_store_array_number"] = this_best_track_vxd.getArrayIndex()
63  result["vxd_was_fitted"] = this_best_track_vxd.wasFitSuccessful()
64  else:
65  result["vxd_store_array_number"] = -1
66  result["vxd_was_fitted"] = -1
67 
68  if this_best_track_cdc:
69  merged_vxd_track = this_best_track_cdc.getRelated("SVDRecoTracks")
70  else:
71  merged_vxd_track = None
72  if this_best_track_vxd:
73  merged_cdc_track = this_best_track_vxd.getRelated("CDCRecoTracks")
74  else:
75  merged_cdc_track = None
76 
77  flag_incorrect_not_merged = False
78  flag_correct_merged = False
79  flag_not_found = False
80  flag_correct_not_merged_cdcmissing = False
81  flag_incorrect_merged_cdcwrong_although_not_there = False
82  flag_correct_not_merged_vxdmissing = False
83  flag_incorrect_merged_vxdwrong_although_not_there = False
84 
85  flag_incorrect_merged = False
86 
87  # Separate out *all* different cases!
88 
89  # No tracks exists at all --> Problem of Trackfinder
90  if not this_best_track_cdc and not this_best_track_vxd:
91  # Case 7
92  flag_not_found = True
93 
94  # CDC track not existing
95  elif not this_best_track_cdc:
96  # Cross-check: merged track == best track !!
97  if not merged_cdc_track:
98  # Case 4
99  flag_correct_not_merged_cdcmissing = True
100  # If merged track is not empty, merger made a mistake
101  else:
102  # Case 2 !!
103  flag_incorrect_merged_cdcwrong_although_not_there = True
104 
105  # VXD track not existing
106  elif not this_best_track_vxd:
107  # Cross check> merged track == best track!!
108  if not merged_vxd_track:
109  # Case 5
110  flag_correct_not_merged_vxdmissing = True
111  # If merged track i is not emtpy, merger made a mistake
112  else:
113  # Case 3 !!
114  flag_incorrect_merged_vxdwrong_although_not_there = True
115 
116  # Both tracks exists but have not been merged, although they should have
117  elif not merged_vxd_track and not merged_cdc_track:
118  # Case 6
119  flag_incorrect_not_merged = True
120 
121  # Tracks are merged correctly
122  elif this_best_track_cdc == merged_cdc_track and this_best_track_vxd == merged_vxd_track:
123  # Case 1
124  flag_correct_merged = True
125 
126  # If all operations above have failed than the merger failed
127  else:
128  # Case 2 + 3 !!
129  if merged_cdc_track != this_best_track_cdc:
130  flag_incorrect_merged = True
131  # The other combinations must then also be false
132 
133  # We miss the unmatched cdc/vxd reco tracks which are fakes!!!
134 
135  result.update({
136  "flag_correct_not_merged_cdcmissing": flag_correct_not_merged_cdcmissing,
137  "flag_correct_not_merged_vxdmissing": flag_correct_not_merged_vxdmissing,
138  "flag_correct_merged": flag_correct_merged,
139  "flag_incorrect_not_merged": flag_incorrect_not_merged,
140  "flag_incorrect_merged": flag_incorrect_merged,
141  "flag_incorrect_merged_cdcwrong_although_not_there": flag_incorrect_merged_cdcwrong_although_not_there,
142  "flag_incorrect_merged_vxdwrong_although_not_there": flag_incorrect_merged_vxdwrong_although_not_there,
143  "flag_not_found": flag_not_found,
144  })
145 
146  return result
147 
148 
149  save_tree = refiners.SaveTreeRefiner()
150 
151 
152 @format_crop_keys
153 def peel_matching_information(pr_track_and_mc_track_matcher, key="{part_name}"):
154  pr_track, mc_track_matcher = pr_track_and_mc_track_matcher
155  if pr_track:
156  is_matched = mc_track_matcher.isMatchedPRRecoTrack(pr_track)
157  is_clone = mc_track_matcher.isClonePRRecoTrack(pr_track)
158  is_background = mc_track_matcher.isBackgroundPRRecoTrack(pr_track)
159  is_ghost = mc_track_matcher.isGhostPRRecoTrack(pr_track)
160 
161  return dict(
162  is_matched=is_matched,
163  is_clone=is_clone,
164  is_background=is_background,
165  is_ghost=is_ghost,
166  is_clone_or_match=(is_matched or is_clone),
167  is_fake=not (is_matched or is_clone),
168  hit_purity=mc_track_matcher.getRelatedPurity(pr_track),
169  )
170  else:
171  nan = float("nan")
172  return dict(
173  is_matched=nan,
174  is_clone=nan,
175  is_background=nan,
176  is_ghost=nan,
177  is_clone_or_match=nan,
178  is_fake=nan,
179  hit_purity=nan,
180  )
181 
182 
184  """Gather the reconstructed VXD-CDC-merger results into ROOT file"""
185  def __init__(self, foreach, others, output_file_name):
186  """
187  Init harvester
188  Arguments:
189  others (str): name of other-tracks collection related to the reconstructed tracks
190  output_file_name (str): name of the output ROOT file
191  """
192  super().__init__(foreach, output_file_name)
193 
194 
195  self.others = others
196 
197 
198  self.mc_track_matcher = Belle2.TrackMatchLookUp("MCRecoTracks", foreach)
199 
200  self.mc_track_matcher_other = Belle2.TrackMatchLookUp("MCRecoTracks", others)
201 
202  def peel(self, pr_track):
203  """Collect information related to the reconstructed track into a dictionary"""
204  event_info = Belle2.PyStoreObj("EventMetaData")
205 
206  result = peelers.peel_reco_track_hit_content(pr_track)
207  result.update(peelers.peel_reco_track_seed(pr_track))
208  result.update(peelers.peel_event_info(event_info))
209 
210  result["store_array_number"] = pr_track.getArrayIndex()
211 
212  mc_track = self.mc_track_matcher.getMatchedMCRecoTrack(pr_track)
213 
214  if mc_track:
215  result["mc_store_array_number"] = mc_track.getArrayIndex()
216  else:
217  result["mc_store_array_number"] = -1
218 
219  result.update(peel_matching_information((pr_track, self.mc_track_matcher)))
220 
221  matched_track = pr_track.getRelated(self.others)
222 
223  result.update(peel_matching_information((matched_track, self.mc_track_matcher_other), key="other_{part_name}"))
224 
225  if matched_track:
226  result["matched_store_array_number"] = matched_track.getArrayIndex()
227  else:
228  result["matched_store_array_number"] = -1
229 
230  result["number_of_matches"] = pr_track.getRelationsWith(self.others).size()
231 
232  return result
233 
234 
235  save_tree = refiners.SaveTreeRefiner()
ckf.validation.VxdCdcMergerHarvesterPRSide.others
others
cached copy of the 'others' argument
Definition: validation.py:195
ckf.validation.VxdCdcMergerHarvesterMCSide.peel
def peel(self, mc_particle)
Definition: validation.py:35
ckf.validation.VxdCdcMergerHarvesterMCSide.mc_track_matcher_cdc
mc_track_matcher_cdc
matcher used for the MCTracks from the CDC
Definition: validation.py:21
tracking.harvest
Definition: __init__.py:1
Belle2::PyStoreObj
a (simplified) python wrapper for StoreObjPtr.
Definition: PyStoreObj.h:69
Belle2::TrackMatchLookUp
Class to provide convenient methods to look up matching information between pattern recognition and M...
Definition: TrackMatchLookUp.h:43
tracking.harvest.harvesting
Definition: harvesting.py:1
ckf.validation.VxdCdcMergerHarvesterMCSide.__init__
def __init__(self, output_file_name)
Definition: validation.py:12
ckf.validation.VxdCdcMergerHarvesterPRSide.peel
def peel(self, pr_track)
Definition: validation.py:202
tracking.harvest.peelers
Definition: peelers.py:1
ckf.validation.VxdCdcMergerHarvesterMCSide.mc_track_matcher_vxd
mc_track_matcher_vxd
matcher used for the MCTracks from the VXD
Definition: validation.py:23
ckf.validation.VxdCdcMergerHarvesterPRSide.mc_track_matcher
mc_track_matcher
function to find the MCRecoTrack related to a reconstructed track
Definition: validation.py:198
ckf.validation.VxdCdcMergerHarvesterPRSide.__init__
def __init__(self, foreach, others, output_file_name)
Definition: validation.py:185
ckf.validation.VxdCdcMergerHarvesterMCSide
Definition: validation.py:9
ckf.validation.VxdCdcMergerHarvesterPRSide.mc_track_matcher_other
mc_track_matcher_other
function to find the MCRecoTrack related to an other-tracks entry
Definition: validation.py:200
ckf.validation.VxdCdcMergerHarvesterMCSide.pick
def pick(self, mc_particle)
Definition: validation.py:25
tracking.harvest.harvesting.HarvestingModule
Definition: harvesting.py:86
ckf.validation.VxdCdcMergerHarvesterPRSide
Definition: validation.py:183