1 package org.lcsim.recon.tracking.vsegment.clustering.clusterers;
2
3 import java.util.*;
4
5 import org.lcsim.recon.tracking.vsegment.clustering.Clusterer;
6 import org.lcsim.recon.tracking.vsegment.geom.Sensor;
7 import org.lcsim.recon.tracking.vsegment.geom.SensorType;
8 import org.lcsim.recon.tracking.vsegment.hit.DigiTrackerHit;
9 import org.lcsim.recon.tracking.vsegment.hit.TrackerCluster;
10 import org.lcsim.recon.tracking.vsegment.hit.base.TrackerClusterBasic;
11
12
13
14
15
16
17
18 public class NearestNeighborClusterer implements Clusterer {
19
20
21
22 public NearestNeighborClusterer() {
23 }
24
25
26
27
28
29
30
31 public ArrayList<TrackerCluster> findClusters(Sensor sensor, List<DigiTrackerHit> hits) {
32 SensorType senType = sensor.getType();
33 LinkedList<DigiTrackerHit> hitList = (hits instanceof LinkedList) ?
34 (LinkedList<DigiTrackerHit>) hits : new LinkedList<DigiTrackerHit>(hits);
35 ArrayList<TrackerCluster> clusterList = new ArrayList<TrackerCluster>();
36 while (! hitList.isEmpty()) {
37 DigiTrackerHit seed = hitList.poll();
38 ArrayList<DigiTrackerHit> hitsInCluster = new ArrayList<DigiTrackerHit>();
39 hitsInCluster.add(seed);
40 List<Integer> newChannels = senType.getNeighbors(seed.getChannel());
41 while (!newChannels.isEmpty()) {
42 List<Integer> oldChannels = newChannels;
43 newChannels = new ArrayList<Integer>(30);
44 ListIterator<DigiTrackerHit> it = hitList.listIterator();
45 while (it.hasNext()) {
46 DigiTrackerHit hit = it.next();
47 int channel = hit.getChannel();
48 if ( oldChannels.contains(channel) ) {
49 hitsInCluster.add(hit);
50 newChannels.addAll(senType.getNeighbors(channel));
51 it.remove();
52 }
53 }
54 }
55 hitsInCluster.trimToSize();
56 clusterList.add(new TrackerClusterBasic(hitsInCluster,sensor));
57 }
58 clusterList.trimToSize();
59 return clusterList;
60 }
61
62
63
64 }