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