15def execute(SmearedHits, TaggerHits, withNTaggerHits, withDist2Wire, debug=0):
17 Main function of track pattern recognition.
22 Smeared hits. SmearedHits = [{'digiHit': key,
23 'xtop': xtop, 'ytop': ytop, 'z': ztop,
24 'xbot': xbot, 'ybot': ybot,
25 'dist': dist2wire, 'detID': detID}, {...}, ...]
35 if len(SmearedHits) > 100:
36 print(
"Too large hits in the event!")
43 SmearedHits_y12, SmearedHits_stereo12, SmearedHits_34 =
hits_split(SmearedHits)
47 short_tracks_y12 =
pat_rec_y_views(SmearedHits_y12, min_hits, max_shared_hits)
55 short_tracks_34 =
pat_rec_y_views(SmearedHits_34, min_hits, max_shared_hits)
68 for i_track
in range(len(track_combinations)):
70 atrack = track_combinations[i_track]
72 hits_y12 = atrack[
'hits_y12']
73 hits_stereo12 = atrack[
'hits_stereo12']
74 hits_34 = atrack[
'hits_y34']
77 [k, b] = np.polyfit(atrack[
'z_y12'], atrack[
'x_y12'], deg=1)
78 x_in_magnet = k * z_center + b
80 [k, b] = np.polyfit(atrack[
'z_stereo12'], atrack[
'y_stereo12'], deg=1)
81 y_in_magnet = k * z_center + b
83 if len(hits_y12) >= min_hits
and len(hits_stereo12) >= min_hits
and len(hits_34) >= min_hits:
90 'x_in_magnet': x_in_magnet,
91 'y_in_magnet': y_in_magnet}
92 track_hits[i_track] = atrack
96 print(
"Recognized tracks:")
97 for i_track
in track_hits.keys():
98 atrack = track_hits[i_track]
99 print(
"Track ", i_track)
100 print(
"Z_y12", [str(np.around(hit[
'z'], 2))
for hit
in atrack[
'y12']])
101 print(
"X_y12", [str(np.around(hit[
'xtop'], 2))
for hit
in atrack[
'y12']])
102 print(
"Z_stereo12", [str(np.around(hit[
'z'], 2))
for hit
in atrack[
'stereo12']])
103 print(
"X_stereo12", [str(np.around(hit[
'xtop'], 2))
for hit
in atrack[
'stereo12']])
104 print(
"Z_34", [str(np.around(hit[
'z'], 2))
for hit
in atrack[
'34']])
105 print(
"X_34", [str(np.around(hit[
'xtop'], 2))
for hit
in atrack[
'34']])
119 SmearedHits_12stereo = []
121 for i_hit
in range(len(SmearedHits)):
122 ahit = SmearedHits[i_hit]
123 detID = ahit[
'detID']
125 is_y12 = (statnb == 1) * (vnb == 0) + (statnb == 2) * (vnb == 1)
126 is_stereo12 = (statnb == 1) * (vnb == 1) + (statnb == 2) * (vnb == 0)
127 is_34 = (statnb == 3) + (statnb == 4)
129 SmearedHits_12y.append(ahit)
131 SmearedHits_12stereo.append(ahit)
133 SmearedHits_34.append(ahit)
135 return SmearedHits_12y, SmearedHits_12stereo, SmearedHits_34
143 for ahit1
in SmearedHits:
144 for ahit2
in SmearedHits:
146 if ahit1[
'z'] >= ahit2[
'z']:
148 if ahit1[
'detID'] == ahit2[
'detID']:
155 layer1 = ahit1[
'detID'] // 10000
156 layer2 = ahit2[
'detID'] // 10000
158 k_bin = 1. * (x2 - x1) / (z2 - z1)
159 b_bin = x1 - k_bin * z1
165 atrack[
'hits_y'] = [ahit1, ahit2]
166 atrack[
'x_y'] = [x1, x2]
167 atrack[
'z_y'] = [z1, z2]
168 atrack[
'layer'] = [layer1, layer2]
171 for ahit3
in SmearedHits:
173 if ahit3[
'detID'] == ahit1[
'detID']
or ahit3[
'detID'] == ahit2[
'detID']:
178 layer3 = ahit3[
'detID'] // 10000
180 if layer3
in atrack[
'layer']:
183 in_bin =
hit_in_window(z3, x3, k_bin, b_bin, window_width=3.0)
185 atrack[
'hits_y'].append(ahit3)
186 atrack[
'z_y'].append(z3)
187 atrack[
'x_y'].append(x3)
188 atrack[
'layer'].append(layer3)
190 if len(atrack[
'hits_y']) >= min_hits:
191 long_tracks.append(atrack)
194 short_tracks =
reduce_clones(long_tracks, min_hits, max_shared_hits)
197 for atrack
in short_tracks:
198 [atrack[
'k_y'], atrack[
'b_y']] = np.polyfit(atrack[
'z_y'], atrack[
'x_y'], deg=1)
206 long_tracks_stereo = []
207 short_tracks_stereo = []
211 for i_track_y
in range(len(short_tracks_y)):
213 atrack_y = short_tracks_y[i_track_y]
214 k_y = atrack_y[
'k_y']
215 b_y = atrack_y[
'b_y']
218 for ahit
in SmearedHits_stereo:
219 y_center =
get_zy_projection(ahit[
'z'], ahit[
'xtop'], ahit[
'ytop'], ahit[
'xbot'], ahit[
'ybot'], k_y, b_y)
220 ahit[
'zy_projection'] = y_center
223 temp_tracks_stereo = []
225 for ahit1
in SmearedHits_stereo:
226 for ahit2
in SmearedHits_stereo:
228 if ahit1[
'z'] >= ahit2[
'z']:
230 if ahit1[
'detID'] == ahit2[
'detID']:
232 if ahit1[
'digiHit']
in used_hits:
234 if ahit2[
'digiHit']
in used_hits:
237 y1_center = ahit1[
'zy_projection']
238 y2_center = ahit2[
'zy_projection']
240 if abs(y1_center ) > 70
or abs(y2_center ) > 70:
247 layer1 = ahit1[
'detID'] // 10000
248 layer2 = ahit2[
'detID'] // 10000
250 k_bin = 1. * (y2 - y1) / (z2 - z1)
251 b_bin = y1 - k_bin * z1
254 atrack[
'hits_stereo'] = [ahit1, ahit2]
255 atrack[
'y_stereo'] = [y1, y2]
256 atrack[
'z_stereo'] = [z1, z2]
257 atrack[
'layer'] = [layer1, layer2]
259 for ahit3
in SmearedHits_stereo:
261 if ahit3[
'digiHit'] == ahit1[
'digiHit']
or ahit3[
'digiHit'] == ahit2[
'digiHit']:
263 if ahit3[
'digiHit']
in used_hits:
266 y3_center = ahit3[
'zy_projection']
268 layer3 = ahit3[
'detID'] // 10000
270 if abs(y3_center) > 70:
273 if layer3
in atrack[
'layer']:
276 in_bin =
hit_in_window(z3, y3_center, k_bin, b_bin, window_width=10.0)
278 atrack[
'hits_stereo'].append(ahit3)
279 atrack[
'z_stereo'].append(z3)
280 atrack[
'y_stereo'].append(y3_center)
281 atrack[
'layer'].append(layer3)
283 if len(atrack[
'hits_stereo']) >= min_hits:
284 temp_tracks_stereo.append(atrack)
285 long_tracks_stereo.append(atrack)
291 for atrack
in temp_tracks_stereo:
292 if len(atrack[
'hits_stereo']) > max_n_hits:
294 max_n_hits = len(atrack[
'hits_stereo'])
296 if max_track
is not None:
298 atrack[
'hits_y'] = atrack_y[
'hits_y']
299 atrack[
'z_y'] = atrack_y[
'z_y']
300 atrack[
'x_y'] = atrack_y[
'x_y']
301 atrack[
'k_y'] = atrack_y[
'k_y']
302 atrack[
'b_y'] = atrack_y[
'b_y']
303 atrack[
'hits_stereo'] = max_track[
'hits_stereo']
304 atrack[
'z_stereo'] = max_track[
'z_stereo']
305 atrack[
'y_stereo'] = max_track[
'y_stereo']
307 short_tracks_stereo.append(atrack)
308 for ahit
in max_track[
'hits_stereo']:
312 return short_tracks_stereo
322 for i_12
in range(len(short_tracks_12)):
323 atrack_12 = short_tracks_12[i_12]
324 y_center_12 = atrack_12[
'k_y'] * z_center + atrack_12[
'b_y']
325 alpha_12 = np.arctan(atrack_12[
'k_y'])
326 for i_34
in range(len(short_tracks_34)):
327 atrack_34 = short_tracks_34[i_34]
328 y_center_34 = atrack_34[
'k_y'] * z_center + atrack_34[
'b_y']
329 alpha_34 = np.arctan(atrack_34[
'k_y'])
330 i_track_12.append(i_12)
331 i_track_34.append(i_34)
332 deltas_y.append(abs(y_center_12 - y_center_34))
333 momentums.append(1.03 / (alpha_12 - alpha_34))
338 track_combinations = []
339 for i
in np.argsort(deltas_y):
345 if i_12
not in used_12:
346 if i_34
not in used_34:
348 for key
in short_tracks_12[i_12].keys():
349 atrack[key+
'12'] = short_tracks_12[i_12][key]
350 for key
in short_tracks_34[i_34].keys():
351 atrack[key+
'34'] = short_tracks_34[i_34][key]
352 atrack[
'p'] = abs(mom)
353 track_combinations.append(atrack)
357 return track_combinations
365 n_hits = [len(atrack[
'hits_y'])
for atrack
in long_tracks]
367 for i_track
in np.argsort(n_hits)[::-1]:
369 atrack = long_tracks[i_track]
372 for i_hit
in range(len(atrack[
'hits_y'])):
373 ahit = atrack[
'hits_y'][i_hit]
374 if ahit[
'digiHit']
in used_hits:
377 if len(atrack[
'hits_y']) >= min_hits
and n_shared_hits <= max_shared_hits:
378 short_tracks.append(atrack)
379 for ahit
in atrack[
'hits_y']:
380 used_hits.append(ahit[
'digiHit'])
394 detID : int or array-like
399 statnb : int or array-like
401 vnb : int or array-like
403 pnb : int or array-like
405 lnb : int or array-like
407 snb : int or array-like
411 statnb = detID // 10000000
412 vnb = (detID - statnb * 10000000) // 1000000
413 pnb = (detID - statnb * 10000000 - vnb * 1000000) // 100000
414 lnb = (detID - statnb * 10000000 - vnb * 1000000 - pnb * 100000) // 10000
415 snb = detID - statnb * 10000000 - vnb * 1000000 - pnb * 100000 - lnb * 10000 - 2000
417 return statnb, vnb, pnb, lnb, snb
422 Counts hits in a bin of track parameter space (b, k).
427 Array of x coordinates of hits.
429 Array of x coordinates of hits.
431 Track parameter: y = k_bin * x + b_bin
433 Track parameter: y = k_bin * x + b_bin
437 track_inds : array-like
438 Hit indexes of a track: [ind1, ind2, ...]
442 b_left = y - (k_bin - 0.5 * k_size) * x
443 b_right = y - (k_bin + 0.5 * k_size) * x
445 sel = (b_left >= b_bin - 0.5 * b_size) * (b_right <= b_bin + 0.5 * b_size) + \
446 (b_left <= b_bin + 0.5 * b_size) * (b_right >= b_bin - 0.5 * b_size)
452 Counts hits in a bin of track parameter space (b, k).
457 Array of x coordinates of hits.
459 Array of x coordinates of hits.
461 Track parameter: y = k_bin * x + b_bin
463 Track parameter: y = k_bin * x + b_bin
467 track_inds : array-like
468 Hit indexes of a track: [ind1, ind2, ...]
472 y_approx = k_bin * x + b_bin
475 if np.abs(y_approx - y) <= window_width: