1from __future__
import print_function
2from __future__
import division
3__author__ =
'Mikhail Hushchyn'
9ReconstructibleMCTracks = []
12r_scale = global_variables.ShipGeo.strawtubes.InnerStrawDiameter / 1.975
18def execute(smeared_hits, ship_geo, method=''):
20 Main function of track pattern recognition.
25 Smeared hits. SmearedHits = [{'digiHit': key,
26 'xtop': xtop, 'ytop': ytop, 'z': ztop,
27 'xbot': xbot, 'ybot': ybot,
28 'dist': dist2wire, 'detID': detID}, {...}, ...]
31 recognized_tracks = {}
33 if method ==
"TemplateMatching":
40 hits_y12, hits_stereo12, hits_y34, hits_stereo34 =
hits_split(smeared_hits)
41 atrack = {
'y12': hits_y12,
'stereo12': hits_stereo12,
'y34': hits_y34,
'stereo34': hits_stereo34}
42 recognized_tracks[0] = atrack
46 return recognized_tracks
60 Main function of track pattern recognition.
65 Smeared hits. SmearedHits = [{'digiHit': key,
66 'xtop': xtop, 'ytop': ytop, 'z': ztop,
67 'xbot': xbot, 'ybot': ybot,
68 'dist': dist2wire, 'detID': detID}, {...}, ...]
71 recognized_tracks = {}
73 if len(SmearedHits) > 500:
74 print(
"Too large hits in the event!")
75 return recognized_tracks
80 SmearedHits_12y, SmearedHits_12stereo, SmearedHits_34y, SmearedHits_34stereo =
hits_split(SmearedHits)
83 recognized_tracks_y12 =
pat_rec_view(SmearedHits_12y, min_hits)
87 recognized_tracks_12 =
pat_rec_stereo_views(SmearedHits_12stereo, recognized_tracks_y12, min_hits)
91 recognized_tracks_y34 =
pat_rec_view(SmearedHits_34y, min_hits)
95 recognized_tracks_34 =
pat_rec_stereo_views(SmearedHits_34stereo, recognized_tracks_y34, min_hits)
104 recognized_tracks = {}
106 for atrack_combo
in recognized_tracks_combo:
108 hits_y12 = atrack_combo[
'hits_y12']
109 hits_stereo12 = atrack_combo[
'hits_stereo12']
110 hits_y34 = atrack_combo[
'hits_y34']
111 hits_stereo34 = atrack_combo[
'hits_stereo34']
114 if len(hits_y12) >= min_hits
and len(hits_stereo12) >= min_hits
and len(hits_y34) >= min_hits
and len(hits_stereo34) >= min_hits:
115 atrack = {
'y12': hits_y12,
'stereo12': hits_stereo12,
'y34': hits_y34,
'stereo34': hits_stereo34}
116 recognized_tracks[i_track] = atrack
121 return recognized_tracks
126 Main function of track pattern recognition.
131 Smeared hits. SmearedHits = [{'digiHit': key,
132 'xtop': xtop, 'ytop': ytop, 'z': ztop,
133 'xbot': xbot, 'ybot': ybot,
134 'dist': dist2wire, 'detID': detID}, {...}, ...]
137 long_recognized_tracks = []
140 for ahit1
in SmearedHits:
141 for ahit2
in SmearedHits:
143 if ahit1[
'z'] >= ahit2[
'z']:
145 if ahit1[
'detID'] == ahit2[
'detID']:
148 k_seed = 1. * (ahit2[
'ytop'] - ahit1[
'ytop']) / (ahit2[
'z'] - ahit1[
'z'])
149 b_seed = ahit1[
'ytop'] - k_seed * ahit1[
'z']
155 atrack[
'hits_y'] = [ahit1, ahit2]
156 atrack_layers = [ahit1[
'detID'] // 10000, ahit2[
'detID'] // 10000]
159 for ahit3
in SmearedHits:
161 if ahit3[
'detID'] == ahit1[
'detID']
or ahit3[
'detID'] == ahit2[
'detID']:
164 layer3 = ahit3[
'detID'] // 10000
165 if layer3
in atrack_layers:
168 in_bin =
hit_in_window(ahit3[
'z'], ahit3[
'ytop'], k_seed, b_seed, window_width=1.4 * r_scale)
170 atrack[
'hits_y'].append(ahit3)
171 atrack_layers.append(layer3)
173 if len(atrack[
'hits_y']) >= min_hits:
174 long_recognized_tracks.append(atrack)
180 for atrack
in recognized_tracks:
181 z_coords = [ahit[
'z']
for ahit
in atrack[
'hits_y']]
182 y_coords = [ahit[
'ytop']
for ahit
in atrack[
'hits_y']]
183 [atrack[
'k_y'], atrack[
'b_y']] = np.polyfit(z_coords, y_coords, deg=1)
185 return recognized_tracks
196 Main function of track pattern recognition.
201 Smeared hits. SmearedHits = [{'digiHit': key,
202 'xtop': xtop, 'ytop': ytop, 'z': ztop,
203 'xbot': xbot, 'ybot': ybot,
204 'dist': dist2wire, 'detID': detID}, {...}, ...]
207 recognized_tracks = {}
209 if len(SmearedHits) > 500:
210 print(
"Too large hits in the event!")
211 return recognized_tracks
216 SmearedHits_12y, SmearedHits_12stereo, SmearedHits_34y, SmearedHits_34stereo =
hits_split(SmearedHits)
242 recognized_tracks = {}
244 for atrack_combo
in recognized_tracks_combo:
246 hits_y12 = atrack_combo[
'hits_y12']
247 hits_stereo12 = atrack_combo[
'hits_stereo12']
248 hits_y34 = atrack_combo[
'hits_y34']
249 hits_stereo34 = atrack_combo[
'hits_stereo34']
252 if len(hits_y12) >= min_hits
and len(hits_stereo12) >= min_hits
and len(hits_y34) >= min_hits
and len(hits_stereo34) >= min_hits:
253 atrack = {
'y12': hits_y12,
'stereo12': hits_stereo12,
'y34': hits_y34,
'stereo34': hits_stereo34}
254 recognized_tracks[i_track] = atrack
259 return recognized_tracks
264 Main function of track pattern recognition.
269 Smeared hits. SmearedHits = [{'digiHit': key,
270 'xtop': xtop, 'ytop': ytop, 'z': ztop,
271 'xbot': xbot, 'ybot': ybot,
272 'dist': dist2wire, 'detID': detID}, {...}, ...]
275 long_recognized_tracks = []
278 for ahit1
in SmearedHits:
279 for ahit2
in SmearedHits:
281 if ahit1[
'z'] >= ahit2[
'z']:
283 if ahit1[
'detID'] == ahit2[
'detID']:
286 k_seed = 1. * (ahit2[
'ytop'] - ahit1[
'ytop']) / (ahit2[
'z'] - ahit1[
'z'])
287 b_seed = ahit1[
'ytop'] - k_seed * ahit1[
'z']
293 atrack[
'hits_y'] = [ahit1, ahit2]
294 atrack_layers = [ahit1[
'detID'] // 10000, ahit2[
'detID'] // 10000]
297 for ahit3
in SmearedHits:
299 if ahit3[
'detID'] == ahit1[
'detID']
or ahit3[
'detID'] == ahit2[
'detID']:
302 layer3 = ahit3[
'detID'] // 10000
303 if layer3
in atrack_layers:
306 in_bin =
hit_in_bin(ahit3[
'z'], ahit3[
'ytop'], k_seed, b_seed, k_size=0.7/2000 * r_scale, b_size=1700./1000 * r_scale)
308 atrack[
'hits_y'].append(ahit3)
309 atrack_layers.append(layer3)
311 if len(atrack[
'hits_y']) >= min_hits:
312 long_recognized_tracks.append(atrack)
318 for atrack
in recognized_tracks:
319 z_coords = [ahit[
'z']
for ahit
in atrack[
'hits_y']]
320 y_coords = [ahit[
'ytop']
for ahit
in atrack[
'hits_y']]
321 [atrack[
'k_y'], atrack[
'b_y']] = np.polyfit(z_coords, y_coords, deg=1)
323 return recognized_tracks
330 recognized_tracks_stereo = []
333 for atrack_y
in recognized_tracks_y:
335 k_y = atrack_y[
'k_y']
336 b_y = atrack_y[
'b_y']
339 for ahit
in SmearedHits_stereo:
340 x_center =
get_zy_projection(ahit[
'z'], ahit[
'ytop'], ahit[
'xtop'],ahit[
'ybot'], ahit[
'xbot'], k_y, b_y)
341 ahit[
'zx_projection'] = x_center
343 long_recognized_tracks_stereo = []
345 for ahit1
in SmearedHits_stereo:
346 for ahit2
in SmearedHits_stereo:
348 if ahit1[
'z'] >= ahit2[
'z']:
350 if ahit1[
'detID'] == ahit2[
'detID']:
352 if ahit1[
'digiHit']
in used_hits:
354 if ahit2[
'digiHit']
in used_hits:
357 if abs(ahit1[
'zx_projection']) > 300
or abs(ahit2[
'zx_projection']) > 300:
360 k_seed = 1. * (ahit2[
'zx_projection'] - ahit1[
'zx_projection']) / (ahit2[
'z'] - ahit1[
'z'])
361 b_seed = ahit1[
'zx_projection'] - k_seed * ahit1[
'z']
364 atrack_stereo[
'hits_stereo'] = [ahit1, ahit2]
365 atrack_stereo_layers = [ahit1[
'detID'] // 10000, ahit2[
'detID'] // 10000]
367 for ahit3
in SmearedHits_stereo:
369 if ahit3[
'digiHit'] == ahit1[
'digiHit']
or ahit3[
'digiHit'] == ahit2[
'digiHit']:
371 if ahit3[
'digiHit']
in used_hits:
374 if abs(ahit3[
'zx_projection']) > 300:
377 layer3 = ahit3[
'detID'] // 10000
378 if layer3
in atrack_stereo_layers:
381 in_bin =
hit_in_bin(ahit3[
'z'], ahit3[
'zx_projection'], k_seed, b_seed, k_size=0.6/200 * r_scale, b_size=1000./70 * r_scale)
383 atrack_stereo[
'hits_stereo'].append(ahit3)
384 atrack_stereo_layers.append(layer3)
386 if len(atrack_stereo[
'hits_stereo']) >= min_hits:
387 long_recognized_tracks_stereo.append(atrack_stereo)
394 for atrack_stereo
in long_recognized_tracks_stereo:
395 if len(atrack_stereo[
'hits_stereo']) > max_n_hits:
396 max_track = atrack_stereo
397 max_n_hits = len(atrack_stereo[
'hits_stereo'])
400 atrack[
'hits_y'] = atrack_y[
'hits_y']
401 atrack[
'k_y'] = atrack_y[
'k_y']
402 atrack[
'b_y'] = atrack_y[
'b_y']
403 atrack[
'hits_stereo'] = []
405 if max_track
is not None:
406 atrack[
'hits_stereo'] = max_track[
'hits_stereo']
407 for ahit
in max_track[
'hits_stereo']:
408 used_hits.append(ahit[
'digiHit'])
410 recognized_tracks_stereo.append(atrack)
412 return recognized_tracks_stereo
418 Counts hits in a bin of track parameter space (b, k).
423 Array of x coordinates of hits.
425 Array of x coordinates of hits.
427 Track parameter: y = k_bin * x + b_bin
429 Track parameter: y = k_bin * x + b_bin
433 track_inds : array-like
434 Hit indexes of a track: [ind1, ind2, ...]
438 b_left = y - (k_bin - 0.5 * k_size) * x
439 b_right = y - (k_bin + 0.5 * k_size) * x
441 sel = (b_left >= b_bin - 0.5 * b_size) * (b_right <= b_bin + 0.5 * b_size) + \
442 (b_left <= b_bin + 0.5 * b_size) * (b_right >= b_bin - 0.5 * b_size)
453from scipy.optimize
import minimize
457 Main function of track pattern recognition.
462 Smeared hits. SmearedHits = [{'digiHit': key,
463 'xtop': xtop, 'ytop': ytop, 'z': ztop,
464 'xbot': xbot, 'ybot': ybot,
465 'dist': dist2wire, 'detID': detID}, {...}, ...]
468 recognized_tracks = {}
470 if len(SmearedHits) > 500:
471 print(
"Too large hits in the event!")
472 return recognized_tracks
477 SmearedHits_12y, SmearedHits_12stereo, SmearedHits_34y, SmearedHits_34stereo =
hits_split(SmearedHits)
503 recognized_tracks = {}
505 for atrack_combo
in recognized_tracks_combo:
507 hits_y12 = atrack_combo[
'hits_y12']
508 hits_stereo12 = atrack_combo[
'hits_stereo12']
509 hits_y34 = atrack_combo[
'hits_y34']
510 hits_stereo34 = atrack_combo[
'hits_stereo34']
513 if len(hits_y12) >= min_hits
and len(hits_stereo12) >= min_hits
and len(hits_y34) >= min_hits
and len(hits_stereo34) >= min_hits:
514 atrack = {
'y12': hits_y12,
'stereo12': hits_stereo12,
'y34': hits_y34,
'stereo34': hits_stereo34}
515 recognized_tracks[i_track] = atrack
520 return recognized_tracks
525 Main function of track pattern recognition.
530 Smeared hits. SmearedHits = [{'digiHit': key,
531 'xtop': xtop, 'ytop': ytop, 'z': ztop,
532 'xbot': xbot, 'ybot': ybot,
533 'dist': dist2wire, 'detID': detID}, {...}, ...]
536 long_recognized_tracks = []
537 used_hits = np.zeros(len(SmearedHits))
539 hits_z = np.array([ahit[
'z']
for ahit
in SmearedHits])
540 hits_y = np.array([ahit[
'ytop']
for ahit
in SmearedHits])
542 for i
in range(len(SmearedHits)):
544 hits_z_unused = hits_z[used_hits == 0]
545 hits_y_unused = hits_y[used_hits == 0]
548 best_seed_params =
get_best_seed(hits_z_unused, hits_y_unused, sigma, sample_weight=
None)
550 res = minimize(retina_func, best_seed_params, args = (hits_z_unused, hits_y_unused, sigma,
None), method=
'BFGS',
551 jac=retina_grad, options={
'gtol': 1e-6,
'disp':
False,
'maxiter': 5})
552 [k_seed_upd, b_seed_upd] = res.x
555 atrack[
'hits_y'] = []
560 for i_hit3
in range(len(SmearedHits)):
562 if used_hits[i_hit3] == 1:
565 ahit3 = SmearedHits[i_hit3]
566 layer3 = ahit3[
'detID'] // 10000
567 if layer3
in atrack_layers:
570 in_bin =
hit_in_window(ahit3[
'z'], ahit3[
'ytop'], k_seed_upd, b_seed_upd, window_width=1.4 * r_scale)
572 atrack[
'hits_y'].append(ahit3)
573 atrack_layers.append(layer3)
574 hit_ids.append(i_hit3)
576 if len(atrack[
'hits_y']) >= min_hits:
577 long_recognized_tracks.append(atrack)
578 used_hits[hit_ids] = 1
586 for atrack
in recognized_tracks:
587 z_coords = [ahit[
'z']
for ahit
in atrack[
'hits_y']]
588 y_coords = [ahit[
'ytop']
for ahit
in atrack[
'hits_y']]
589 [atrack[
'k_y'], atrack[
'b_y']] = np.polyfit(z_coords, y_coords, deg=1)
591 return recognized_tracks
598 recognized_tracks_stereo = []
601 for atrack_y
in recognized_tracks_y:
603 k_y = atrack_y[
'k_y']
604 b_y = atrack_y[
'b_y']
607 for ahit
in SmearedHits_stereo:
608 x_center =
get_zy_projection(ahit[
'z'], ahit[
'ytop'], ahit[
'xtop'],ahit[
'ybot'], ahit[
'xbot'], k_y, b_y)
609 ahit[
'zx_projection'] = x_center
611 long_recognized_tracks_stereo = []
615 for ahit
in SmearedHits_stereo:
616 if ahit[
'digiHit']
in used_hits:
618 if abs(ahit[
'zx_projection']) > 300:
620 hits_z.append(ahit[
'z'])
621 hits_x.append(ahit[
'zx_projection'])
622 hits_z = np.array(hits_z)
623 hits_x = np.array(hits_x)
626 best_seed_params =
get_best_seed(hits_z, hits_x, sigma, sample_weight=
None)
628 res = minimize(retina_func, best_seed_params, args = (hits_z, hits_x, sigma,
None), method=
'BFGS',
629 jac=retina_grad, options={
'gtol': 1e-6,
'disp':
False,
'maxiter': 5})
630 [k_seed_upd, b_seed_upd] = res.x
633 atrack_stereo[
'hits_stereo'] = []
634 atrack_stereo_layers = []
636 for ahit3
in SmearedHits_stereo:
638 if ahit3[
'digiHit']
in used_hits:
641 if abs(ahit3[
'zx_projection']) > 300:
644 layer3 = ahit3[
'detID'] // 10000
645 if layer3
in atrack_stereo_layers:
648 in_bin =
hit_in_window(ahit3[
'z'], ahit3[
'zx_projection'], k_seed_upd, b_seed_upd, window_width=15. * r_scale)
650 atrack_stereo[
'hits_stereo'].append(ahit3)
651 atrack_stereo_layers.append(layer3)
653 if len(atrack_stereo[
'hits_stereo']) >= min_hits:
654 long_recognized_tracks_stereo.append(atrack_stereo)
661 for atrack_stereo
in long_recognized_tracks_stereo:
662 if len(atrack_stereo[
'hits_stereo']) > max_n_hits:
663 max_track = atrack_stereo
664 max_n_hits = len(atrack_stereo[
'hits_stereo'])
667 atrack[
'hits_y'] = atrack_y[
'hits_y']
668 atrack[
'k_y'] = atrack_y[
'k_y']
669 atrack[
'b_y'] = atrack_y[
'b_y']
670 atrack[
'hits_stereo'] = []
672 if max_track
is not None:
673 atrack[
'hits_stereo'] = max_track[
'hits_stereo']
674 for ahit
in max_track[
'hits_stereo']:
675 used_hits.append(ahit[
'digiHit'])
677 recognized_tracks_stereo.append(atrack)
679 return recognized_tracks_stereo
685 best_seed_params = [0, 0]
687 for i_1
in range(len(x)-1):
688 for i_2
in range(i_1+1, len(x)):
693 seed_k = (y[i_2] - y[i_1]) / (x[i_2] - x[i_1] + 10**-6)
694 seed_b = y[i_1] - seed_k * x[i_1]
696 retina_val =
retina_func([seed_k, seed_b], x, y, sigma, sample_weight)
698 if retina_val < best_retina_val:
699 best_retina_val = retina_val
700 best_seed_params = [seed_k, seed_b]
702 return best_seed_params
707 Calculates the artificial retina function value.
710 track_prams : array-like
711 Track parameters [k, b].
713 Array of x coordinates of hits.
715 Array of x coordinates of hits.
717 Standard deviation of hit form a track.
718 sample_weight : array-like
719 Hit weights used during the track fit.
723 Negative value of the artificial retina function.
726 rs = track_prams[0] * x + track_prams[1] - y
728 if sample_weight ==
None:
729 exps = np.exp(- (rs/sigma)**2)
731 exps = np.exp(- (rs/sigma)**2) * sample_weight
741 Calculates the artificial retina gradient.
744 track_prams : array-like
745 Track parameters [k, b].
747 Array of x coordinates of hits.
749 Array of x coordinates of hits.
751 Standard deviation of hit form a track.
752 sample_weight : array-like
753 Hit weights used during the track fit.
757 Negative value of the artificial retina gradient.
760 rs = track_prams[0] * x + track_prams[1] - y
762 if sample_weight ==
None:
763 exps = np.exp(- (rs/sigma)**2)
765 exps = np.exp(- (rs/sigma)**2) * sample_weight
767 dks = - 2.*rs / sigma**2 * exps * x
768 dbs = - 2.*rs / sigma**2 * exps
770 return -np.array([dks.sum(), dbs.sum()])
783 Split hits into groups of station views.
788 Smeared hits. SmearedHits = [{'digiHit': key,
789 'xtop': xtop, 'ytop': ytop, 'z': ztop,
790 'xbot': xbot, 'ybot': ybot,
791 'dist': dist2wire, 'detID': detID}, {...}, ...]
794 smeared_hits_12y = []
795 smeared_hits_12stereo = []
796 smeared_hits_34y = []
797 smeared_hits_34stereo = []
799 for i_hit
in range(len(smeared_hits)):
801 ahit = smeared_hits[i_hit]
803 detID = ahit[
'detID']
805 is_y12 = ((statnb == 1) + (statnb == 2)) * ((vnb == 0) + (vnb == 3))
806 is_stereo12 = ((statnb == 1) + (statnb == 2)) * ((vnb == 1) + (vnb == 2))
807 is_y34 = ((statnb == 3) + (statnb == 4)) * ((vnb == 0) + (vnb == 3))
808 is_stereo34 = ((statnb == 3) + (statnb == 4)) * ((vnb == 1) + (vnb == 2))
811 smeared_hits_12y.append(ahit)
813 smeared_hits_12stereo.append(ahit)
815 smeared_hits_34y.append(ahit)
817 smeared_hits_34stereo.append(ahit)
819 return smeared_hits_12y, smeared_hits_12stereo, smeared_hits_34y, smeared_hits_34stereo
824 Split hits into groups of station views.
828 recognized_tracks : list
829 Track hits. Tracks = [{'hits_y': [hit1, hit2, hit3, ...]}, {...}, ...]
831 Minimal number of hits per track.
835 tracks_no_clones = []
836 n_hits = [len(atrack[
'hits_y'])
for atrack
in recognized_tracks]
838 for i_track
in np.argsort(n_hits)[::-1]:
840 atrack = recognized_tracks[i_track]
842 new_track[
'hits_y'] = []
844 for i_hit
in range(len(atrack[
'hits_y'])):
845 ahit = atrack[
'hits_y'][i_hit]
846 if ahit[
'digiHit']
not in used_hits:
847 new_track[
'hits_y'].append(ahit)
849 if len(new_track[
'hits_y']) >= min_hits:
850 tracks_no_clones.append(new_track)
851 for ahit
in new_track[
'hits_y']:
852 used_hits.append(ahit[
'digiHit'])
854 return tracks_no_clones
859 recognized_tracks_combo = []
865 for i_12
in range(len(recognized_tracks_12)):
867 atrack_12 = recognized_tracks_12[i_12]
868 y_center_y12 = atrack_12[
'k_y'] * z_magnet + atrack_12[
'b_y']
870 for i_34
in range(len(recognized_tracks_34)):
872 atrack_34 = recognized_tracks_34[i_34]
873 y_center_y34 = atrack_34[
'k_y'] * z_magnet + atrack_34[
'b_y']
875 i_track_y12.append(i_12)
876 i_track_y34.append(i_34)
877 deltas_y.append(abs(y_center_y12 - y_center_y34))
883 for i
in np.argsort(deltas_y):
886 i_12 = i_track_y12[i]
887 i_34 = i_track_y34[i]
889 if (dy < max_dy)
and (i_12
not in used_y12)
and (i_34
not in used_y34):
891 atrack[
'hits_y12'] = recognized_tracks_12[i_12][
'hits_y']
892 atrack[
'hits_stereo12'] = recognized_tracks_12[i_12][
'hits_stereo']
893 atrack[
'hits_y34'] = recognized_tracks_34[i_34][
'hits_y']
894 atrack[
'hits_stereo34'] = recognized_tracks_34[i_34][
'hits_stereo']
895 recognized_tracks_combo.append(atrack)
896 used_y12.append(i_12)
897 used_y34.append(i_34)
899 for i_12
in range(len(recognized_tracks_12)):
900 if i_12
not in used_y12:
902 atrack[
'hits_y12'] = recognized_tracks_12[i_12][
'hits_y']
903 atrack[
'hits_stereo12'] = recognized_tracks_12[i_12][
'hits_stereo']
904 atrack[
'hits_y34'] = []
905 atrack[
'hits_stereo34'] = []
906 recognized_tracks_combo.append(atrack)
908 for i_34
in range(len(recognized_tracks_34)):
909 if i_34
not in used_y34:
911 atrack[
'hits_y12'] = []
912 atrack[
'hits_stereo12'] = []
913 atrack[
'hits_y34'] = recognized_tracks_34[i_34][
'hits_y']
914 atrack[
'hits_stereo34'] = recognized_tracks_34[i_34][
'hits_stereo']
915 recognized_tracks_combo.append(atrack)
916 recognized_tracks_combo.append(atrack)
918 return recognized_tracks_combo
928 detID : int or array-like
933 statnb : int or array-like
935 vnb : int or array-like
937 pnb : int or array-like
939 lnb : int or array-like
941 snb : int or array-like
945 statnb = detID // 10000000
946 vnb = (detID - statnb * 10000000) // 1000000
947 pnb = (detID - statnb * 10000000 - vnb * 1000000) // 100000
948 lnb = (detID - statnb * 10000000 - vnb * 1000000 - pnb * 100000) // 10000
949 snb = detID - statnb * 10000000 - vnb * 1000000 - pnb * 100000 - lnb * 10000 - 2000
951 return statnb, vnb, pnb, lnb, snb
957 Counts hits in a bin of track parameter space (b, k).
962 Array of x coordinates of hits.
964 Array of x coordinates of hits.
966 Track parameter: y = k_bin * x + b_bin
968 Track parameter: y = k_bin * x + b_bin
972 track_inds : array-like
973 Hit indexes of a track: [ind1, ind2, ...]
977 y_approx = k_bin * x + b_bin
980 if np.abs(y_approx - y) <= window_width:
989 k = (ytop - ybot) / (xtop - xbot + 10**-6)
999 recognized_tracks_stereo = []
1002 for atrack_y
in recognized_tracks_y:
1004 k_y = atrack_y[
'k_y']
1005 b_y = atrack_y[
'b_y']
1008 for ahit
in SmearedHits_stereo:
1009 x_center =
get_zy_projection(ahit[
'z'], ahit[
'ytop'], ahit[
'xtop'],ahit[
'ybot'], ahit[
'xbot'], k_y, b_y)
1010 ahit[
'zx_projection'] = x_center
1012 long_recognized_tracks_stereo = []
1014 for ahit1
in SmearedHits_stereo:
1015 for ahit2
in SmearedHits_stereo:
1017 if ahit1[
'z'] >= ahit2[
'z']:
1019 if ahit1[
'detID'] == ahit2[
'detID']:
1021 if ahit1[
'digiHit']
in used_hits:
1023 if ahit2[
'digiHit']
in used_hits:
1026 if abs(ahit1[
'zx_projection']) > 300
or abs(ahit2[
'zx_projection']) > 300:
1029 k_seed = 1. * (ahit2[
'zx_projection'] - ahit1[
'zx_projection']) / (ahit2[
'z'] - ahit1[
'z'])
1030 b_seed = ahit1[
'zx_projection'] - k_seed * ahit1[
'z']
1033 atrack_stereo[
'hits_stereo'] = [ahit1, ahit2]
1034 atrack_stereo_layers = [ahit1[
'detID'] // 10000, ahit2[
'detID'] // 10000]
1036 for ahit3
in SmearedHits_stereo:
1038 if ahit3[
'digiHit'] == ahit1[
'digiHit']
or ahit3[
'digiHit'] == ahit2[
'digiHit']:
1040 if ahit3[
'digiHit']
in used_hits:
1043 if abs(ahit3[
'zx_projection']) > 300:
1046 layer3 = ahit3[
'detID'] // 10000
1047 if layer3
in atrack_stereo_layers:
1050 in_bin =
hit_in_window(ahit3[
'z'], ahit3[
'zx_projection'], k_seed, b_seed, window_width=15. * r_scale)
1052 atrack_stereo[
'hits_stereo'].append(ahit3)
1053 atrack_stereo_layers.append(layer3)
1055 if len(atrack_stereo[
'hits_stereo']) >= min_hits:
1056 long_recognized_tracks_stereo.append(atrack_stereo)
1063 for atrack_stereo
in long_recognized_tracks_stereo:
1064 if len(atrack_stereo[
'hits_stereo']) > max_n_hits:
1065 max_track = atrack_stereo
1066 max_n_hits = len(atrack_stereo[
'hits_stereo'])
1069 atrack[
'hits_y'] = atrack_y[
'hits_y']
1070 atrack[
'k_y'] = atrack_y[
'k_y']
1071 atrack[
'b_y'] = atrack_y[
'b_y']
1072 atrack[
'hits_stereo'] = []
1074 if max_track
is not None:
1075 atrack[
'hits_stereo'] = max_track[
'hits_stereo']
1076 for ahit
in max_track[
'hits_stereo']:
1077 used_hits.append(ahit[
'digiHit'])
1079 recognized_tracks_stereo.append(atrack)
1081 return recognized_tracks_stereo
pat_rec_stereo_views(SmearedHits_stereo, recognized_tracks_y, min_hits)
fast_hough_pat_rec_stereo_views(SmearedHits_stereo, recognized_tracks_y, min_hits)
artificial_retina_pat_rec_stereo_views(SmearedHits_stereo, recognized_tracks_y, min_hits)
hit_in_window(x, y, k_bin, b_bin, window_width=1.)
fast_hough_transform_pattern_recognition(SmearedHits, ShipGeo)
Fast Hough Transform.
get_zy_projection(z, xtop, ytop, xbot, ybot, k_y, b_y)
pat_rec_view(SmearedHits, min_hits)
artificial_retina_pat_rec_y_view(SmearedHits, min_hits)
hits_split(smeared_hits)
The End of the PatRec Methods.
fast_hough_pat_rec_y_view(SmearedHits, min_hits)
template_matching_pattern_recognition(SmearedHits, ShipGeo)
Template Matching.
artificial_retina_pattern_recognition(SmearedHits, ShipGeo)
hit_in_bin(x, y, k_bin, b_bin, k_size, b_size)
get_best_seed(x, y, sigma, sample_weight=None)
retina_grad(track_prams, x, y, sigma, sample_weight=None)
tracks_combination_using_extrapolation(recognized_tracks_12, recognized_tracks_34, z_magnet)
retina_func(track_prams, x, y, sigma, sample_weight=None)
reduce_clones_using_one_track_per_hit(recognized_tracks, min_hits=3)
execute(smeared_hits, ship_geo, method='')