View Javadoc

1   package org.lcsim.recon.tracking.vsegment.hit.base;
2   
3   import java.util.*;
4   
5   import org.lcsim.recon.tracking.vsegment.hit.DigiTrackerHit;
6   import org.lcsim.recon.tracking.vsegment.hit.TrackerCluster;
7   import org.lcsim.recon.tracking.vsegment.hit.TrackerHit;
8   import org.lcsim.recon.tracking.vsegment.geom.Sensor;
9   
10  /**
11   * Basic implementation of {@link TrackerCluster} interface.
12   *
13   * @author D.Onoprienko
14   * @version $Id: TrackerClusterBasic.java,v 1.1 2008/12/06 21:53:44 onoprien Exp $
15   */
16  public class TrackerClusterBasic implements TrackerCluster {
17    
18  // -- Constructors :  ----------------------------------------------------------
19    
20    /** Default constructor */
21    public TrackerClusterBasic() {
22      _digiList = new ArrayList<DigiTrackerHit>();
23      _hitList = new ArrayList<TrackerHit>(1);
24    }
25    
26    /** 
27     * Fast constructor, no consistency checks, no trimming to size, no sorting. 
28     * The list supplied as an argument will be owned by the created <tt>TrackerClusterDataBasic</tt> object.
29     */
30    public TrackerClusterBasic(ArrayList<DigiTrackerHit> digiList, Sensor sensor) {
31      _digiList = digiList;
32      _hitList = new ArrayList<TrackerHit>(1);
33      _sensor = sensor;
34    }
35    
36    /**
37     * Construct from a list of {@link DigiTrackerHit} objects.
38     * Checks that all hits in the list belong to the same sensor, and makes a copy
39     * of the list.
40     */
41    public TrackerClusterBasic(List<DigiTrackerHit> digiList) {
42      _digiList = new ArrayList<DigiTrackerHit>(digiList.size());
43      for (DigiTrackerHit hit : digiList) {
44        addDigiHit(hit);
45      }
46      Collections.sort(_digiList);
47      _hitList = new ArrayList<TrackerHit>(1);
48    }
49  
50  // -- Access to TrackerHits that have been produced from this cluster :  -------
51    
52    /** 
53     * Returns a list of TrackerHits produced from this cluster. 
54     * No new hits are created, and no existing hits are modified.
55     * The list returned by this method belongs to the <tt>TrackerCluster</tt> object
56     * for which it was called.
57     */
58    public List<TrackerHit> getTrackerHits() {
59      return _hitList;
60    }
61    
62    /** Add a hit to the list of <tt>TrackerHit</tt>s produced from this cluster. */
63    public void addTrackerHit(TrackerHit hit) {
64      _hitList.add(hit);
65    }
66    
67    /** Remove a hit from the list of <tt>TrackerHit</tt>s produced from this cluster. */
68    public void removeTrackerHit(TrackerHit hit) {
69      _hitList.remove(hit);
70    }
71  
72  // -- Getters :  ---------------------------------------------------------------
73  
74    /** Get list of <tt>DigiTrackerHits</tt> that compose the cluster. */
75    public List<DigiTrackerHit> getDigiHits() {
76      return _digiList;
77    }
78  
79    /** Returns signal-weighted average time for all <tt>DigiTrackerHits</tt> in the cluster. */
80    public double getTime() {
81      double time = 0.;
82      double signal = 0.;
83      for (DigiTrackerHit hit : _digiList) {
84        time += hit.getTime() * hit.getSignal();
85        signal += hit.getSignal();
86      }
87      return time/signal;
88    }
89  
90    /** Returns combined signal of all <tt>DigiTrackerHits</tt> in the cluster. */
91    public double getSignal() {
92      double signal = 0.;
93      for (DigiTrackerHit hit : _digiList) {
94        signal += hit.getSignal();
95      }
96      return signal;
97    }
98  
99    /** Returns the {@link Sensor} object associated with this cluster. */
100   public Sensor getSensor() {
101     return _sensor;
102   }
103   
104 // -- Modifiers :  -------------------------------------------------------------
105   
106   /** 
107    * Add {@link DigiTrackerHit} to the cluster.
108    * Throws <tt>IllegalArgumentException</tt> if the hit does not belong to the 
109    * same {@link Sensor} object as the hits already in the cluster.
110    */
111   public void addDigiHit(DigiTrackerHit digiHit) {
112     if (_sensor == null) {
113       _sensor = digiHit.getSensor();
114     } else {
115       if (_sensor != digiHit.getSensor()) {
116         throw new IllegalArgumentException("Sensor mismatch");
117       }
118     }
119     _digiList.add(digiHit);
120   }
121   
122   /** Trims the underlying <tt>DigiTrackerHit</tt> list of hits to size. */
123   public void trimToSize() {
124     _digiList.trimToSize();
125   }
126 
127 // -- Private parts :  ---------------------------------------------------------
128   
129   private ArrayList<DigiTrackerHit> _digiList;
130   private ArrayList<TrackerHit> _hitList;
131   private Sensor _sensor;
132 }