99def pat_rec_plane(TaggerHits, coord='x', min_hits=3, max_shared_hits=2):
100
101 long_tracks = []
102
103
104 for ahit1 in TaggerHits:
105 for ahit2 in TaggerHits:
106
107 if ahit1['z'] >= ahit2['z']:
108 continue
109 if ahit1['detID'] == ahit2['detID']:
110 continue
111
112 x1 = 0.5 * (ahit1[coord+'top'] + ahit1[coord+'bot'])
113 x2 = 0.5 * (ahit2[coord+'top'] + ahit2[coord+'bot'])
114 z1 = ahit1['z']
115 z2 = ahit2['z']
116 layer1 = ahit1['detID'] // 10000
117 layer2 = ahit2['detID'] // 10000
118
119 k_bin = 1. * (x2 - x1) / (z2 - z1)
120 b_bin = x1 - k_bin * z1
121
122 if abs(k_bin) > 1:
123 continue
124
125 atrack = {}
126 atrack['hits_'+coord] = [ahit1, ahit2]
127 atrack[coord+'_'+coord] = [x1, x2]
128 atrack['z_'+coord] = [z1, z2]
129 atrack['layer'] = [layer1, layer2]
130
131
132 for ahit3 in TaggerHits:
133
134 if ahit3['detID'] == ahit1['detID'] or ahit3['detID'] == ahit2['detID']:
135 continue
136
137 x3 = 0.5 * (ahit3[coord+'top'] + ahit3[coord+'bot'])
138 z3 = ahit3['z']
139 layer3 = ahit3['detID'] // 10000
140
141 if layer3 in atrack['layer']:
142 continue
143
144
145 in_bin = hit_in_window(z3, x3, k_bin, b_bin, window_width=5.0)
146 if in_bin:
147 atrack['hits_'+coord].append(ahit3)
148 atrack['z_'+coord].append(z3)
149 atrack[coord+'_'+coord].append(x3)
150 atrack['layer'].append(layer3)
151
152 if len(atrack['hits_'+coord]) >= min_hits:
153 long_tracks.append(atrack)
154
155
156 short_tracks = reduce_clones(long_tracks, coord, min_hits, max_shared_hits)
157
158
159 for atrack in short_tracks:
160 [atrack['k_'+coord], atrack['b_'+coord]] = np.polyfit(atrack['z_'+coord], atrack[coord+'_'+coord], deg=1)
161
162 return short_tracks
163
164