|
3 | 3 | import org.jlab.rec.ahdc.Hit.Hit; |
4 | 4 | import org.jlab.rec.ahdc.PreCluster.PreCluster; |
5 | 5 |
|
6 | | -import java.util.ArrayList; |
7 | | -import java.util.Arrays; |
8 | | -import java.util.Comparator; |
9 | | -import java.util.List; |
| 6 | +import java.util.*; |
10 | 7 |
|
11 | 8 | public class PreClustering { |
| 9 | + static final double DISTANCE_MAX = 8.0; |
12 | 10 |
|
13 | | - private ArrayList<Hit> fill(List<Hit> hits, int super_layer, int layer) { |
14 | | - |
15 | | - ArrayList<Hit> result = new ArrayList<>(); |
16 | | - for (Hit hit : hits) { |
17 | | - if (hit.getSuperLayerId() == super_layer && hit.getLayerId() == layer) result.add(hit); |
18 | | - } |
19 | | - return result; |
20 | | - } |
21 | | - |
22 | | - public ArrayList<PreCluster> find_preclusters_for_AI(List<Hit> AHDC_hits) { |
23 | | - ArrayList<PreCluster> preclusters = new ArrayList<>(); |
24 | | - |
25 | | - ArrayList<Hit> s1l1 = fill(AHDC_hits, 1, 1); |
26 | | - ArrayList<Hit> s2l1 = fill(AHDC_hits, 2, 1); |
27 | | - ArrayList<Hit> s2l2 = fill(AHDC_hits, 2, 2); |
28 | | - ArrayList<Hit> s3l1 = fill(AHDC_hits, 3, 1); |
29 | | - ArrayList<Hit> s3l2 = fill(AHDC_hits, 3, 2); |
30 | | - ArrayList<Hit> s4l1 = fill(AHDC_hits, 4, 1); |
31 | | - ArrayList<Hit> s4l2 = fill(AHDC_hits, 4, 2); |
32 | | - ArrayList<Hit> s5l1 = fill(AHDC_hits, 5, 1); |
33 | | - |
34 | | - // Sort hits of each layers by phi: |
35 | | - Comparator<Hit> comparator = new Comparator<>() { |
36 | | - @Override |
37 | | - public int compare(Hit a1, Hit a2) { |
38 | | - return Double.compare(a1.getPhi(), a2.getPhi()); |
39 | | - } |
40 | | - }; |
41 | | - |
42 | | - s1l1.sort(comparator); |
43 | | - s2l1.sort(comparator); |
44 | | - s2l2.sort(comparator); |
45 | | - s3l1.sort(comparator); |
46 | | - s3l2.sort(comparator); |
47 | | - s4l1.sort(comparator); |
48 | | - s4l2.sort(comparator); |
49 | | - s5l1.sort(comparator); |
50 | | - |
51 | | - ArrayList<ArrayList<Hit>> all_super_layer = new ArrayList<>(Arrays.asList(s1l1, s2l1, s2l2, s3l1, s3l2, s4l1, s4l2, s5l1)); |
52 | | - |
53 | | - for (ArrayList<Hit> p : all_super_layer) { |
54 | | - for (Hit hit : p) { |
55 | | - hit.setUse(false); |
56 | | - } |
57 | | - } |
58 | | - |
59 | | - for (ArrayList<Hit> p : all_super_layer) { |
60 | | - for (Hit hit : p) { |
61 | | - if (hit.is_NoUsed()) { |
62 | | - ArrayList<Hit> temp = new ArrayList<>(); |
63 | | - temp.add(hit); |
64 | | - hit.setUse(true); |
65 | | - int expected_wire_plus = hit.getWireId() + 1; |
66 | | - int expected_wire_minus = hit.getWireId() - 1; |
67 | | - if (hit.getWireId() == 1) |
68 | | - expected_wire_minus = hit.getNbOfWires(); |
69 | | - if (hit.getWireId() == hit.getNbOfWires() ) |
70 | | - expected_wire_plus = 1; |
71 | | - |
72 | | - |
73 | | - boolean has_next = true; |
74 | | - while (has_next) { |
75 | | - has_next = false; |
76 | | - for (Hit hit1 : p) { |
77 | | - if (hit1.is_NoUsed() && (hit1.getWireId() == expected_wire_minus || hit1.getWireId() == expected_wire_plus)) { |
78 | | - temp.add(hit1); |
79 | | - hit1.setUse(true); |
80 | | - has_next = true; |
81 | | - break; |
82 | | - } |
83 | | - } |
84 | | - } |
85 | | - if (!temp.isEmpty()) preclusters.add(new PreCluster(temp)); |
86 | | - } |
87 | | - } |
88 | | - } |
89 | | - return preclusters; |
90 | | - } |
91 | | - |
92 | | - public ArrayList<PreclusterSuperlayer> merge_preclusters(ArrayList<PreCluster> preclusters) { |
93 | | - double distance_max = 8.0; |
94 | | - |
95 | | - ArrayList<PreclusterSuperlayer> superpreclusters = new ArrayList<>(); |
| 11 | + public ArrayList<InterCluster> mergePreclusters(ArrayList<PreCluster> preclusters) { |
| 12 | + ArrayList<InterCluster> interclusters = new ArrayList<>(); |
96 | 13 | for (PreCluster precluster : preclusters) { |
97 | 14 | if (!precluster.is_Used()) { |
98 | 15 | ArrayList<PreCluster> tmp = new ArrayList<>(); |
99 | 16 | tmp.add(precluster); |
100 | 17 | precluster.set_Used(true); |
101 | 18 | for (PreCluster other : preclusters) { |
102 | | - if (precluster.get_hits_list().get(precluster.get_hits_list().size() - 1).getSuperLayerId() == other.get_hits_list().get(other.get_hits_list().size() - 1).getSuperLayerId() && precluster.get_hits_list().get(precluster.get_hits_list().size() - 1).getLayerId() != other.get_hits_list().get(other.get_hits_list().size() - 1).getLayerId() && !other.is_Used()) { |
103 | | - double dx = precluster.get_X() - other.get_X(); |
104 | | - double dy = precluster.get_Y() - other.get_Y(); |
105 | | - double distance = Math.sqrt(dx * dx + dy * dy); |
106 | | - |
107 | | - if (distance < distance_max) { |
| 19 | + if (precluster.get_hits_list().getLast().getSuperLayerId() == other.get_hits_list().getLast().getSuperLayerId() |
| 20 | + && precluster.get_hits_list().getLast().getLayerId() != other.get_hits_list().getLast().getLayerId() |
| 21 | + && !other.is_Used()) { |
| 22 | + if (Math.hypot(precluster.get_X() - other.get_X(), precluster.get_Y() - other.get_Y()) < DISTANCE_MAX) { |
108 | 23 | other.set_Used(true); |
109 | 24 | tmp.add(other); |
110 | 25 | } |
111 | 26 | } |
112 | 27 | } |
113 | | - |
114 | | - if (!tmp.isEmpty()) superpreclusters.add(new PreclusterSuperlayer(tmp)); |
| 28 | + if (!tmp.isEmpty()) interclusters.add(new InterCluster(tmp)); |
115 | 29 | } |
116 | 30 | } |
117 | | - |
118 | | - return superpreclusters; |
| 31 | + return interclusters; |
119 | 32 | } |
120 | 33 |
|
121 | 34 |
|
|
0 commit comments