1 package org.lcsim.recon.tracking.vsegment.hit.base;
2
3 import java.util.List;
4 import java.util.ArrayList;
5
6 import org.lcsim.event.MCParticle;
7
8 import org.lcsim.recon.tracking.vsegment.geom.Sensor;
9 import org.lcsim.recon.tracking.vsegment.hit.DigiTrackerHit;
10
11
12
13
14
15
16
17
18
19 public class DigiTrackerHitComposite extends DigiTrackerHitAdapter {
20
21
22
23
24
25
26
27 public DigiTrackerHitComposite() {
28 _signal = 0.;
29 _time = 0.;
30 }
31
32
33
34
35
36
37 public DigiTrackerHitComposite(double signal, double time, Sensor sensor, int channel, ArrayList<DigiTrackerHit> hitList) {
38 _signal = signal;
39 _time = time;
40 _sensor = sensor;
41 _channel = channel;
42 _hitList = hitList;
43 }
44
45
46
47
48
49
50
51 public DigiTrackerHitComposite(List<DigiTrackerHit> hitList) {
52 if (hitList.isEmpty()) throw new IllegalArgumentException("Empty list");
53 _signal = 0.;
54 _time = 0.;
55 _channel = 0;
56 _hitList = new ArrayList<DigiTrackerHit>(hitList.size());
57 _hitList.addAll(hitList);
58 for (DigiTrackerHit hit : hitList) {
59 if (_sensor == null) {
60 _sensor = hit.getSensor();
61 _channel = hit.getChannel();
62 } else {
63 if ( ! ( _sensor == hit.getSensor() && _channel == hit.getChannel() ) ) {
64 throw new IllegalArgumentException("Mismatched sensor or channel ID");
65 }
66 }
67 _time += hit.getTime() * hit.getSignal();
68 _signal += hit.getSignal();
69 }
70 _time /= _signal;
71 }
72
73
74 public DigiTrackerHitComposite(DigiTrackerHitComposite digiHit) {
75 _signal = digiHit._signal;
76 _time = digiHit._time;
77 _sensor = digiHit._sensor;
78 _channel = digiHit._channel;
79 _hitList = new ArrayList<DigiTrackerHit>(digiHit._hitList);
80 _hitList.trimToSize();
81 }
82
83
84
85
86
87
88
89 public boolean isComposite() {return true;}
90
91
92 public MCParticle getMCParticle() {return null;}
93
94
95 public List<DigiTrackerHit> getElementalHits() {
96 ArrayList<DigiTrackerHit> hList = new ArrayList<DigiTrackerHit>(_hitList.size());
97 for (DigiTrackerHit hit : _hitList) {
98 if (hit.isComposite()) {
99 hList.addAll(hit.getElementalHits());
100 } else {
101 hList.add(hit);
102 }
103 }
104 return hList;
105 }
106
107
108
109
110 public void addHit(DigiTrackerHit hit) {
111 if (_hitList == null) {
112 _signal = hit.getSignal();
113 _time = hit.getTime();
114 _sensor = hit.getSensor();
115 _channel = hit.getChannel();
116 _hitList = new ArrayList<DigiTrackerHit>(2);
117 } else {
118 if ( ! ( _sensor == hit.getSensor() && _channel == hit.getChannel() ) ) {
119 System.out.println("throwing");
120 throw new IllegalArgumentException("Mismatched cell ID");
121 }
122 double signal = hit.getSignal();
123 _time = (_time * _signal + hit.getTime() * signal) / (_signal + signal);
124 _signal += signal;
125 }
126 _hitList.add(hit);
127 }
128
129
130 public void trimToSize() {
131 _hitList.trimToSize();
132 }
133
134
135
136 protected ArrayList<DigiTrackerHit> _hitList;
137
138 }