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