1 package org.lcsim.recon.tracking.vsegment.hitmaking;
2
3 import java.util.*;
4
5 import hep.aida.*;
6 import org.lcsim.util.aida.AIDA;
7
8 import hep.physics.matrix.SymmetricMatrix;
9 import hep.physics.vec.BasicHep3Vector;
10 import hep.physics.vec.Hep3Vector;
11 import hep.physics.vec.VecOp;
12 import org.lcsim.event.EventHeader;
13 import org.lcsim.recon.cat.util.NoSuchParameterException;
14 import org.lcsim.spacegeom.SpacePointVector;
15 import org.lcsim.util.Driver;
16
17 import org.lcsim.recon.tracking.vsegment.geom.RegionSegmenter;
18 import org.lcsim.recon.tracking.vsegment.geom.SegmentationManager;
19 import org.lcsim.recon.tracking.vsegment.geom.Sensor;
20 import org.lcsim.recon.tracking.vsegment.geom.SensorType;
21 import org.lcsim.recon.tracking.vsegment.hit.TrackerCluster;
22 import org.lcsim.recon.tracking.vsegment.hit.TrackerHit;
23 import org.lcsim.recon.tracking.vsegment.hitmaking.hitmakers.TrackerHitMakerBasic;
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 public class TrackerHitConverter extends Driver {
49
50
51
52 public TrackerHitConverter() {
53 _notInit = true;
54 _hitMapName = null;
55 _clusterMapName = "TrackerClusters";
56 _outListName = "StandardTrackerHits";
57 }
58
59 private void init(EventHeader event) {
60 _notInit = false;
61 if (_segMan == null) _segMan = (SegmentationManager) event.get("SegmentationManager");
62 if (_clusterMapName != null) {
63 List<Driver> drivers = drivers();
64 ListIterator<Driver> it = drivers.listIterator();
65 while (it.hasNext()) {
66 if (it.next() instanceof HitMakingDriver) it.remove();
67 }
68 if (_hitMaker == null) _hitMaker = new TrackerHitMakerBasic();
69 HitMakingDriver hitMakingDriver = new HitMakingDriver(_hitMaker);
70 hitMakingDriver.set("INPUT_MAP_NAME",_clusterMapName);
71 hitMakingDriver.set("OUTPUT_MAP_NAME", (_hitMapName == null) ? "_temporary_" : _hitMapName);
72 add(hitMakingDriver);
73 }
74
75 }
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105 public void set(String name, Object value) {
106 try {
107 if (name.equalsIgnoreCase("INPUT_HIT_MAP_NAME")) {
108 _hitMapName = (String) value;
109 } else if (name.equalsIgnoreCase("INPUT_CLUSTER_MAP_NAME")) {
110 _clusterMapName = (String) value;
111 } else if (name.equalsIgnoreCase("OUTPUT_HIT_LIST_NAME")) {
112 _outListName = (String) value;
113 } else if (name.equalsIgnoreCase("HIT_MAKER")) {
114 _hitMaker = (TrackerHitMaker) value;
115 } else {
116 throw new NoSuchParameterException(name, this.getClass());
117 }
118 } catch (ClassCastException x) {
119 throw new IllegalArgumentException("Value of incompatible type", x);
120 }
121 }
122
123
124
125 public void process(EventHeader event) {
126
127 if (_notInit) init(event);
128
129
130
131
132 super.process(event);
133
134 String hitMapName = (_hitMapName == null) ? "_temporary_" : _hitMapName;
135 HashMap<Sensor, ArrayList<TrackerHit>> hitMap = (HashMap<Sensor, ArrayList<TrackerHit>>) event.get(hitMapName);
136 ArrayList<OldTrackerHit> out = new ArrayList<OldTrackerHit>(1000);
137 ArrayList<Sensor> processedSensors = new ArrayList<Sensor>(hitMap.size());
138
139 for (Sensor sensor : hitMap.keySet()) {
140
141 List<TrackerHit> hitsOnSensor = hitMap.get(sensor);
142 int hitDimension = sensor.getType().getHitDimension();
143
144 if (hitDimension == 1) {
145 List<Sensor> partners = _segMan.getStereoPartners(sensor);
146 if (partners == null) {
147 for (TrackerHit hit : hitsOnSensor) {
148 OldTrackerHit oHit = convert(hit);
149 if (oHit != null) out.add(oHit);
150 }
151 } else {
152 for (Sensor partner : partners) {
153 Hep3Vector shift = VecOp.sub(sensor.getTranslation(), partner.getTranslation());
154 if (! processedSensors.contains(partner)) {
155 List<TrackerHit> hitsOnPartner = hitMap.get(partner);
156 if (hitsOnPartner != null) {
157 for (TrackerHit hitOnSensor : hitsOnSensor) {
158 for (TrackerHit hitOnPartner : hitsOnPartner) {
159 OldTrackerHit hit = cross(hitOnSensor, hitOnPartner);
160 if (hit != null) out.add(hit);
161 }
162 }
163 }
164 }
165 }
166 processedSensors.add(sensor);
167 }
168 } else if (hitDimension == 2) {
169 for (TrackerHit hit : hitsOnSensor) {
170 OldTrackerHit oHit = convert(hit);
171 if (oHit != null) out.add(oHit);
172 }
173 } else {
174 throw new RuntimeException("Unknown hit dimension " + hitDimension);
175 }
176 }
177
178 out.trimToSize();
179 if (_hitMapName == null) event.remove("_temporary_");
180 event.put(_outListName, out);
181 }
182
183
184
185
186
187
188
189
190
191
192
193
194
195 protected OldTrackerHit cross(TrackerHit hit1, TrackerHit hit2) {
196
197 Sensor sensor1 = hit1.getSensor();
198 double tolerance = _stereoTolerance * hit2.getLength();
199
200 SpacePointVector globSegment2 = hit2.getSegment();
201 Hep3Vector locStart2 = sensor1.globalToLocal(globSegment2.getStartPoint());
202 Hep3Vector locEnd2 = sensor1.globalToLocal(globSegment2.getEndPoint());
203 SpacePointVector locSegment1 = hit1.getLocalSegment();
204 Hep3Vector locStart1 = locSegment1.getStartPoint();
205 Hep3Vector locEnd1 = locSegment1.getEndPoint();
206
207 double du = locEnd2.x() - locStart2.x();
208 double dw = Math.abs(locEnd2.z() - locStart2.z());
209 if (Math.abs(du) < tolerance) {
210 System.out.println("Shallow stereo angle");
211 return null;
212 } else if (dw > tolerance ) {
213 System.out.println("Non-parallel stereo partners");
214 return null;
215 }
216 double u = locStart1.x();
217 double v = locStart2.y() - ((locStart2.x()-u) * (locEnd2.y()-locStart2.y())) / du;
218
219 if (((v - locStart1.y()) * (v - locEnd1.y())) > 0.) return null;
220
221 Hep3Vector locPos = new BasicHep3Vector(u, v, (locEnd2.z() + locEnd1.z())/2.);
222
223 Hep3Vector locUnitU2 = sensor1.globalToLocal(hit2.getSensor().localToGlobal(unitU));
224 double a = locUnitU2.x();
225 double b = locUnitU2.y();
226 double sigma1 = hit1.getCovMatrix().diagonal(0);
227 double sigma2 = hit2.getCovMatrix().diagonal(0);
228 double[] cov = new double[]{sigma1+a*a*sigma2, a*b*sigma2, b*b*sigma2, 0., 0., _errFlat*dw};
229 double s1 = hit1.getSignal();
230 double s2 = hit2.getSignal();
231 double signal = s1 + s2;
232 double time = (s1*hit1.getTime() + s2*hit2.getTime()) / signal;
233 ArrayList<TrackerCluster> parents = new ArrayList<TrackerCluster>(2);
234 parents.add(hit1.getCluster());
235 parents.add(hit2.getCluster());
236
237 return new OldTrackerHit(sensor1.localToGlobal(locPos), new SymmetricMatrix(3,cov,true), signal, time, 0, parents);
238 }
239
240
241
242
243
244
245
246
247 protected OldTrackerHit convert(TrackerHit hit) {
248 ArrayList<TrackerCluster> parents = new ArrayList<TrackerCluster>(1);
249 parents.add(hit.getCluster());
250 return new OldTrackerHit(hit.getPosition(), hit.getCovMatrix(), hit.getSignal(), hit.getTime(), 0, parents);
251 }
252
253
254
255 private boolean _notInit;
256
257 private String _hitMapName;
258 private String _clusterMapName;
259 private String _outListName;
260
261 protected SegmentationManager _segMan;
262 private TrackerHitMaker _hitMaker;
263
264 private double _stereoTolerance = 0.01;
265
266 private double _errFlat = 1./Math.sqrt(12.);
267 private Hep3Vector unitU = new BasicHep3Vector(1., 0., 0.);
268 }