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 }