1
2
3
4
5
6
7
8
9
10 package org.lcsim.recon.tracking.digitization.sisim;
11
12 import hep.physics.matrix.SymmetricMatrix;
13 import hep.physics.vec.BasicHep3Vector;
14 import hep.physics.vec.Hep3Vector;
15 import hep.physics.vec.VecOp;
16 import java.util.ArrayList;
17 import java.util.List;
18 import java.util.Set;
19 import org.lcsim.detector.ITransform3D;
20 import org.lcsim.detector.solids.GeomOp3D;
21 import org.lcsim.detector.solids.LineSegment3D;
22 import org.lcsim.detector.solids.Plane3D;
23 import org.lcsim.detector.solids.Point3D;
24 import org.lcsim.detector.tracker.silicon.SiTrackerModule;
25 import org.lcsim.event.MCParticle;
26 import org.lcsim.event.RawTrackerHit;
27 import org.lcsim.event.RelationalTable;
28 import org.lcsim.event.TrackerHit;
29
30
31
32
33
34 public class SiTrackerHitStrip2D extends SiTrackerHit
35 {
36
37 List<SiTrackerHitStrip1D> _hits_1D;
38 List<SiTrackerHitStrip1D> _hits_1D_transformed;
39
40
41
42
43
44
45 public SiTrackerHitStrip2D(SymmetricMatrix covariance_matrix, double energy, double time,
46 List<RawTrackerHit> raw_hits, TrackerHitType decoded_type, List<SiTrackerHitStrip1D> hits_1D)
47 {
48 super(new BasicHep3Vector(0,0,0), covariance_matrix, energy, time, raw_hits, decoded_type);
49 _hits_1D = hits_1D;
50 }
51
52
53
54 public SiTrackerHitStrip2D(TrackerHit hit, List<SiTrackerHitStrip1D> hits_1D)
55 {
56 super(hit);
57 _hits_1D = hits_1D;
58 }
59
60
61 public SiTrackerHitStrip2D(TrackerHit hit, RelationalTable hits_1D)
62 {
63 super(hit);
64 _hits_1D = new ArrayList((Set<SiTrackerHitStrip1D>)hits_1D.allTo(hit));
65 }
66
67 public SiTrackerHitStrip2D(TrackerHit hit, RelationalTable hits_1D, TrackerHitType.CoordinateSystem coordinate_system)
68 {
69 super(hit,coordinate_system);
70 _hits_1D = new ArrayList((Set<SiTrackerHitStrip1D>)hits_1D.allTo(hit));
71 }
72
73
74 public SiTrackerHitStrip2D getTransformedHit(TrackerHitType.CoordinateSystem coordinate_system)
75 {
76 return new SiTrackerHitStrip2D(super.getTransformedHit(coordinate_system),getHits1D());
77 }
78
79 public SiTrackerHitStrip2D getTransformedHit(ITransform3D global_to_local)
80 {
81 return new SiTrackerHitStrip2D(super.getTransformedHit(global_to_local),getHits1D());
82 }
83
84
85 public double[] getPosition()
86 {
87 return getPositionAsVector().v();
88 }
89
90 public Hep3Vector getPositionAsVector()
91 {
92
93 Point3D origin = new Point3D(getLocalToGlobal().inverse().transformed(new BasicHep3Vector(0,0,0)));
94 return getPositionWithLineFrom(origin);
95 }
96
97
98 public SiTrackerModule getModule()
99 {
100 return (SiTrackerModule)getSensor().getParent();
101 }
102
103
104
105 public Hep3Vector getPositionWithLineFrom(Point3D origin)
106 {
107 List<Point3D> plane_points = new ArrayList<Point3D>();
108 plane_points.add(origin);
109 plane_points.addAll(getHits1DTransformed().get(0).getHitSegment().getPoints());
110 Plane3D plane = new Plane3D(plane_points);
111
112 Point3D start_point = GeomOp3D.intersection(getHits1DTransformed().get(1).getHitSegment(),plane);
113
114 plane_points.clear();
115 plane_points.add(origin);
116 plane_points.addAll(getHits1DTransformed().get(1).getHitSegment().getPoints());
117 plane = new Plane3D(plane_points);
118
119 Point3D end_point = GeomOp3D.intersection(getHits1DTransformed().get(0).getHitSegment(),plane);
120
121 LineSegment3D hitsegment_2d = new LineSegment3D(start_point,end_point);
122
123 return hitsegment_2d.getEndPoint(hitsegment_2d.getLength()/2);
124 }
125
126
127 public Hep3Vector getPositionWithDirection(Hep3Vector direction)
128 {
129 Hep3Vector normal = VecOp.cross(direction,getHits1DTransformed().get(0).getUnmeasuredCoordinate());
130 Point3D hitpoint = new Point3D(getHits1DTransformed().get(0).getPositionAsVector());
131 Plane3D plane = new Plane3D(normal,hitpoint);
132
133 Point3D start_point = GeomOp3D.intersection(getHits1DTransformed().get(1).getHitSegment(),plane);
134
135 normal = VecOp.cross(direction,getHits1DTransformed().get(1).getUnmeasuredCoordinate());
136 hitpoint = new Point3D(getHits1DTransformed().get(1).getPositionAsVector());
137 plane = new Plane3D(normal,hitpoint);
138
139 Point3D end_point = GeomOp3D.intersection(getHits1DTransformed().get(0).getHitSegment(),plane);
140
141 LineSegment3D hitsegment_2d = new LineSegment3D(start_point,end_point);
142
143 return hitsegment_2d.getEndPoint(hitsegment_2d.getLength()/2);
144 }
145
146 public List<SiTrackerHitStrip1D> getHits1D()
147 {
148 return _hits_1D;
149 }
150
151 public List<SiTrackerHitStrip1D> getHits1DTransformed()
152 {
153 if (_hits_1D_transformed == null)
154 {
155 _hits_1D_transformed = new ArrayList<SiTrackerHitStrip1D>();
156 for (SiTrackerHitStrip1D hit_1D : _hits_1D)
157 {
158 if (getCoordinateSystem() == TrackerHitType.CoordinateSystem.UNKNOWN)
159 {
160 _hits_1D_transformed.add((SiTrackerHitStrip1D)hit_1D.getTransformedHit(getLocalToGlobal().inverse()));
161 }
162 else
163 {
164 _hits_1D_transformed.add((SiTrackerHitStrip1D)hit_1D.getTransformedHit(getCoordinateSystem()));
165 }
166 }
167 }
168 return _hits_1D_transformed;
169 }
170
171 public boolean isGhost()
172 {
173 for (MCParticle particle1 : getHits1D().get(0).getMCParticles())
174 {
175 if (getHits1D().get(1).getMCParticles().contains(particle1)) return true;
176 }
177 return false;
178 }
179
180 }