1 package org.lcsim.recon.tracking.vsegment.geom;
2
3 import java.lang.ref.SoftReference;
4 import java.util.*;
5
6 import hep.physics.vec.BasicHep3Vector;
7 import hep.physics.vec.Hep3Vector;
8 import org.lcsim.conditions.ConditionsListener;
9 import org.lcsim.conditions.ConditionsEvent;
10 import org.lcsim.conditions.ConditionsManager;
11 import org.lcsim.conditions.ConditionsManager.ConditionsSetNotFoundException;
12 import org.lcsim.geometry.Detector;
13 import org.lcsim.event.EventHeader;
14 import org.lcsim.event.SimTrackerHit;
15 import org.lcsim.recon.cat.util.NoSuchParameterException;
16 import org.lcsim.util.Driver;
17
18 import org.lcsim.recon.tracking.vsegment.transform.Rotation3D;
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 public class SegmentationManager extends Driver implements ConditionsListener {
44
45
46
47
48
49
50
51
52 public SegmentationManager(Segmenter segmenter) {
53 _segmenter = segmenter;
54 _notInitialized = true;
55 _createSensorsOnDetectorChange = true;
56 _sensorWeakMap = new HashMap<Integer, SoftReference<Sensor>>();
57 _cacheStereoRequests = true;
58 _stereoMap = new HashMap<Sensor, List<Sensor>>();
59 ConditionsManager.defaultInstance().addConditionsListener(this);
60 }
61
62
63 public void conditionsChanged(ConditionsEvent event) {
64 _notInitialized = true;
65 }
66
67
68
69
70
71
72 private void detectorChanged() {
73 ConditionsManager conMan = ConditionsManager.defaultInstance();
74 Detector detector = null;
75 try {
76 detector = conMan.getCachedConditions(Detector.class,"compact.xml").getCachedData();
77 } catch (ConditionsSetNotFoundException x) {}
78 if (detector != null) {
79 if (_createSensorsOnDetectorChange) {
80 _sensorWeakMap = null;
81 _sensorMap = new HashMap<Integer, Sensor>();
82 } else {
83 _sensorWeakMap = new HashMap<Integer, SoftReference<Sensor>>();
84 _sensorMap = null;
85 }
86 if (_cacheStereoRequests) _stereoMap = new HashMap<Sensor, List<Sensor>>();
87 _segmenter.detectorChanged(detector);
88 if (_segmenter instanceof AbstractSegmenter) ((AbstractSegmenter)_segmenter).setPrefix(0);
89 if (_createSensorsOnDetectorChange) {
90 List<Integer> sensorIDs = _segmenter.getSensorIDs();
91 for (int sensorID : sensorIDs) {
92 _sensorMap.put(sensorID, _segmenter.getSensor(sensorID));
93 };
94 }
95 _navigator = new Navigator(detector);
96 } else {
97 throw new RuntimeException("SegmentationManager cannot initialize, no Detector");
98 }
99 }
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122 public void set(String name, boolean value) {
123 if (name.equalsIgnoreCase("MAKE_SENSORS_ON_DETECTOR_CHANGE")) {
124 _createSensorsOnDetectorChange = value;
125 } else if (name.equalsIgnoreCase("CACHE_STEREO_REQUESTS")) {
126 _cacheStereoRequests = value;
127 } else {
128 throw new NoSuchParameterException(name, this.getClass());
129 }
130 }
131
132
133
134
135
136
137
138 public Navigator getNavigator() {
139 return _navigator;
140 }
141
142
143
144
145 public void process(EventHeader event) {
146 if (_notInitialized) {
147 detectorChanged();
148 _notInitialized = false;
149 }
150 event.put("SegmentationManager", this);
151 super.process(event);
152 }
153
154
155
156
157
158
159 public Collection<Sensor> getSensors() {
160 if (_createSensorsOnDetectorChange) {
161 return _sensorMap.values();
162 } else {
163 List<Integer> sensorIDs = _segmenter.getSensorIDs();
164 ArrayList<Sensor> sensors = new ArrayList<Sensor>(sensorIDs.size());
165 for (int sensorID : sensorIDs) sensors.add(getSensor(sensorID));
166 return sensors;
167 }
168 }
169
170
171
172
173 public Sensor getSensor(int sensorID) {
174 Sensor sensor = null;
175 if (_createSensorsOnDetectorChange) {
176 sensor = _sensorMap.get(sensorID);
177 } else {
178 SoftReference<Sensor> ref = _sensorWeakMap.get(sensorID);
179 if (ref != null) sensor = ref.get();
180 if (sensor == null) {
181 sensor = _segmenter.getSensor(sensorID);
182 if (sensor != null) _sensorWeakMap.put(sensorID, new SoftReference<Sensor>(sensor));
183 }
184 }
185 return sensor;
186 }
187
188
189
190
191
192 public int getChannelID(Sensor sensor, Hep3Vector position) {
193 return sensor.getType().getChannelID(sensor.globalToLocal(position));
194 }
195
196
197
198
199
200
201 public int getChannelID(Sensor sensor, SimTrackerHit hit) {
202 Hep3Vector position = new BasicHep3Vector(hit.getPoint());
203 return getChannelID(sensor, position);
204 }
205
206
207
208
209
210
211 public int getChannelID(int sensorID, Hep3Vector position) {
212 Sensor sensor = getSensor(sensorID);
213 return (sensor == null) ? -1 : getChannelID(sensor, position);
214 }
215
216
217
218
219
220 public Sensor getSensor(SimTrackerHit hit) {
221 int id = getSensorID(hit);
222 return (id == -1) ? null : getSensor(id);
223 }
224
225
226
227
228
229
230 public int getSensorID(SimTrackerHit hit) {
231 return _segmenter.getSensorID(hit);
232 }
233
234
235
236
237
238
239
240
241
242 public List<Sensor> getStereoPartners(Sensor sensor) {
243 List<Sensor> partners = null;
244 if (_cacheStereoRequests) partners = _stereoMap.get(sensor);
245 if (partners == null) {
246 List<Integer> partnerIDs = _segmenter.getStereoPartners(sensor.getID());
247 if (partnerIDs == null) return null;
248 partners = new ArrayList<Sensor>(partnerIDs.size());
249 for (int sensorID : partnerIDs) partners.add(getSensor(sensorID));
250 }
251 if (_cacheStereoRequests) _stereoMap.put(sensor, partners);
252 return partners;
253 }
254
255
256
257
258 static public void setDefaultInstance(SegmentationManager segMan) {
259 _defaultSegMan = segMan;
260 }
261
262
263
264
265
266 static public SegmentationManager defaultInstance() {
267 return _defaultSegMan;
268 }
269
270
271
272 static private SegmentationManager _defaultSegMan;
273 private boolean _notInitialized;
274
275 private HashMap<Integer, SoftReference<Sensor>> _sensorWeakMap;
276 private HashMap<Integer, Sensor> _sensorMap;
277
278 private Segmenter _segmenter;
279 private Navigator _navigator;
280
281 private boolean _createSensorsOnDetectorChange;
282
283 private boolean _cacheStereoRequests;
284 private HashMap<Sensor, List<Sensor>> _stereoMap;
285
286 }