View Javadoc

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   * Simple digitized tracker hit clusterer using nearest neighbor algorithm.
14   *
15   * @author D. Onoprienko
16   * @version $Id: NearestNeighborClusterer.java,v 1.1 2008/12/06 21:53:43 onoprien Exp $
17   */
18  public class NearestNeighborClusterer implements Clusterer {
19    
20  // -- Constructors :  ----------------------------------------------------------
21    
22    public NearestNeighborClusterer() {
23    }
24    
25  // -- Implementing Clusterer :  ------------------------------------------------
26  
27    /**
28     * Returns a list of found clusters, given a list of digitized hits that belong
29     * to the same <tt>Sensor</tt> object.
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  // -- Private parts :  ---------------------------------------------------------
63    
64  }