Belle II Software  release-06-02-00
vxdCdcMergerValidationGenerateSample.py
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3 
4 
11 
12 """
13 <header>
14  <contact>software-tracking@belle2.org</contact>
15  <output>VxdCdcValidationHarvested.root</output>
16  <input>EvtGenSimNoBkg.root</input>
17  <description>This module generates events for the V0 validation.</description>
18 </header>
19 """
20 
21 import basf2
22 from ROOT import Belle2
23 from tracking import add_tracking_reconstruction
24 from tracking.harvest.harvesting import HarvestingModule
25 from tracking.harvest import refiners
26 
27 
28 def run():
29  """
30  Generate and reconstruct Generic BBar
31  and evaluate the merger performance
32  """
33  basf2.set_random_seed(1337)
34  path = basf2.create_path()
35 
36  rootinput = basf2.register_module('RootInput')
37  rootinput.param('inputFileName', "../EvtGenSimNoBkg.root")
38  path.add_module(rootinput)
39  path.add_module('Gearbox')
40 
41  add_tracking_reconstruction(path, components=["CDC", "SVD"], pruneTracks=False, prune_temporary_tracks=False)
42 
43  # add additional matching for vxd and cdc only tracks here
44 
45  # for VXD only track
46  mctrackmatcher_vxd = basf2.register_module('MCRecoTracksMatcher')
47  mctrackmatcher_vxd.param('mcRecoTracksStoreArrayName', 'MCRecoTracks')
48  mctrackmatcher_vxd.param('prRecoTracksStoreArrayName', 'SVDRecoTracks')
49  mctrackmatcher_vxd.param('UseCDCHits', False)
50  path.add_module(mctrackmatcher_vxd)
51 
52  # for CDC only tracks
53  mctrackmatcher_cdc = basf2.register_module('MCRecoTracksMatcher')
54  mctrackmatcher_cdc.param('mcRecoTracksStoreArrayName', 'MCRecoTracks')
55  mctrackmatcher_cdc.param('prRecoTracksStoreArrayName', 'CDCRecoTracks')
56  mctrackmatcher_cdc.param('UsePXDHits', False)
57  mctrackmatcher_cdc.param('UseSVDHits', False)
58  path.add_module(mctrackmatcher_cdc)
59 
60  path.add_module(VxdCdcMergerHarvester())
61 
62  basf2.process(path)
63  print(basf2.statistics)
64 
65 
67  """
68  Harvester module to extract useful information from VXD-CDC track merging.
69  """
70 
71  def __init__(self):
72  """
73  Init harvester
74  """
75  HarvestingModule.__init__(self, foreach="MCParticles", output_file_name="../VxdCdcValidationHarvested.root")
76 
77 
78  self.mc_track_matchermc_track_matcher = Belle2.TrackMatchLookUp("MCRecoTracks")
79 
80  self.mc_track_matcher_cdcmc_track_matcher_cdc = Belle2.TrackMatchLookUp("MCRecoTracks", "CDCRecoTracks")
81 
82  self.mc_track_matcher_vxdmc_track_matcher_vxd = Belle2.TrackMatchLookUp("MCRecoTracks", "SVDRecoTracks")
83 
84  def pick(self, mc_particle):
85  """Select the MCParticle if it is related to an MCRecoTrack"""
86  # mc_track = mc_particle.getRelated("MCRecoTracks")
87  # return mc_track is not None
88  mc_track = mc_particle.getRelatedFrom("MCRecoTracks")
89  if mc_track:
90  return True
91  else:
92  return False
93 
94  def peel(self, mc_particle):
95  """
96  Extract the information.
97  """
98 
99  # mc is a genfit::TrackCand
100 
101  mc_track = mc_particle.getRelatedFrom("MCRecoTracks")
102 
103  mc_nhits = mc_track.getNumberOfTotalHits()
104  mc_pt = mc_particle.getMomentum().Pt()
105  mc_theta = mc_particle.getMomentum().Theta()
106 
107  # reco_tracks = Belle2.PyStoreArray('RecoTracks')
108 
109  this_best_track_cdc = self.mc_track_matcher_cdcmc_track_matcher_cdc.getRelatedPRRecoTrack(mc_track)
110  this_best_track_vxd = self.mc_track_matcher_vxdmc_track_matcher_vxd.getRelatedPRRecoTrack(mc_track)
111 
112  # here we know, the above tracks should have been merged because they stem
113  # from the same MC Track. Have they?
114 
115  this_best_track_merged = self.mc_track_matchermc_track_matcher.getRelatedPRRecoTrack(mc_track)
116 
117  good_merge = False
118  vxd_hits = 0
119  cdc_hits = 0
120 
121  merged_hits = 0
122 
123  if this_best_track_merged:
124  if this_best_track_cdc:
125  cdc_hits = this_best_track_cdc.getNumberOfTotalHits()
126  if this_best_track_vxd:
127  vxd_hits = this_best_track_vxd.getNumberOfTotalHits()
128 
129  merged_hits = vxd_hits + cdc_hits
130  good_merge = merged_hits == this_best_track_merged.getNumberOfTotalHits()
131 
132  return {
133  "MC_PT": mc_pt,
134  "MC_THETA": mc_theta,
135  "MC_NHITS": mc_nhits,
136  "PR_NHITS": merged_hits,
137  "PR_CDC_NHITS": cdc_hits,
138  "PR_VXD_NHITS": vxd_hits,
139  "GOOD_MERGE": good_merge
140  }
141 
142 
144  save_tree = refiners.SaveTreeRefiner()
145 
146 
147 if __name__ == '__main__':
148  run()
Class to provide convenient methods to look up matching information between pattern recognition and M...