12 Main function of muon tagger track pattern recognition.
17 Muon tagger hits. TaggerHits = [{'digiHit': key,
18 'xtop': xtop, 'ytop': ytop, 'z': ztop,
19 'xbot': xbot, 'ybot': ybot,
20 'detID': detID}, {...}, ...]
26 print(
"From MuonTaggerPatRec.py: ")
29 print([hit[
'digiHit']
for hit
in TaggerHits])
31 if len(TaggerHits) > 200:
32 print(
"Too many hits.")
39 TaggerHits_x, TaggerHits_y =
split_hits(TaggerHits)
42 tracks_zx =
pat_rec_plane(TaggerHits_x, coord=
'x', min_hits=min_hits, max_shared_hits=max_shared_hits)
45 tracks_zy =
pat_rec_plane(TaggerHits_y, coord=
'y', min_hits=min_hits, max_shared_hits=max_shared_hits)
51 for i_track
in range(len(track_combinations)):
53 atrack = track_combinations[i_track]
55 if len(atrack[
'hits_x']) >= min_hits
and len(atrack[
'hits_y']) >= min_hits:
56 track_hits[i_track] = {}
57 track_hits[i_track][
'hits_x'] =
sort_hits(atrack[
'hits_x'])
58 track_hits[i_track][
'hits_y'] =
sort_hits(atrack[
'hits_y'])
62 print(
"From MuonTaggerPatRec.py: ")
67 print(
"track_combinations: ")
68 print(len(track_combinations))
69 print(
"Recognized tracks: ")
70 for i_track
in track_hits.keys():
71 print(
"Track ", i_track)
72 print(
"Hits_x: ", [hit[
'digiHit']
for hit
in track_hits[i_track][
'hits_x']])
73 print(
"Hits_y: ", [hit[
'digiHit']
for hit
in track_hits[i_track][
'hits_y']])
104 for ahit1
in TaggerHits:
105 for ahit2
in TaggerHits:
107 if ahit1[
'z'] >= ahit2[
'z']:
109 if ahit1[
'detID'] == ahit2[
'detID']:
112 x1 = 0.5 * (ahit1[coord+
'top'] + ahit1[coord+
'bot'])
113 x2 = 0.5 * (ahit2[coord+
'top'] + ahit2[coord+
'bot'])
116 layer1 = ahit1[
'detID'] // 10000
117 layer2 = ahit2[
'detID'] // 10000
119 k_bin = 1. * (x2 - x1) / (z2 - z1)
120 b_bin = x1 - k_bin * z1
126 atrack[
'hits_'+coord] = [ahit1, ahit2]
127 atrack[coord+
'_'+coord] = [x1, x2]
128 atrack[
'z_'+coord] = [z1, z2]
129 atrack[
'layer'] = [layer1, layer2]
132 for ahit3
in TaggerHits:
134 if ahit3[
'detID'] == ahit1[
'detID']
or ahit3[
'detID'] == ahit2[
'detID']:
137 x3 = 0.5 * (ahit3[coord+
'top'] + ahit3[coord+
'bot'])
139 layer3 = ahit3[
'detID'] // 10000
141 if layer3
in atrack[
'layer']:
145 in_bin =
hit_in_window(z3, x3, k_bin, b_bin, window_width=5.0)
147 atrack[
'hits_'+coord].append(ahit3)
148 atrack[
'z_'+coord].append(z3)
149 atrack[coord+
'_'+coord].append(x3)
150 atrack[
'layer'].append(layer3)
152 if len(atrack[
'hits_'+coord]) >= min_hits:
153 long_tracks.append(atrack)
156 short_tracks =
reduce_clones(long_tracks, coord, min_hits, max_shared_hits)
159 for atrack
in short_tracks:
160 [atrack[
'k_'+coord], atrack[
'b_'+coord]] = np.polyfit(atrack[
'z_'+coord], atrack[coord+
'_'+coord], deg=1)
183 n_hits = [len(atrack[
'hits_'+coord])
for atrack
in long_tracks]
185 for i_track
in np.argsort(n_hits)[::-1]:
187 atrack = long_tracks[i_track]
190 for i_hit
in range(len(atrack[
'hits_'+coord])):
191 ahit = atrack[
'hits_'+coord][i_hit]
192 if ahit[
'digiHit']
in used_hits:
195 if len(atrack[
'hits_'+coord]) >= min_hits
and n_shared_hits <= max_shared_hits:
196 short_tracks.append(atrack)
197 for ahit
in atrack[
'hits_'+coord]:
198 used_hits.append(ahit[
'digiHit'])
205 Counts hits in a bin of track parameter space (b, k).
210 Array of x coordinates of hits.
212 Array of x coordinates of hits.
214 Track parameter: y = k_bin * x + b_bin
216 Track parameter: y = k_bin * x + b_bin
220 track_inds : array-like
221 Hit indexes of a track: [ind1, ind2, ...]
225 y_approx = k_bin * x + b_bin
228 if np.abs(y_approx - y) <= window_width: