View Javadoc

1   /*
2    * SiTrackerHitStrip2D.java
3    *
4    * Created on December 12, 2007, 10:56 AM
5    *
6    * To change this template, choose Tools | Template Manager
7    * and open the template in the editor.
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   * @author tknelson
33   */
34  public class SiTrackerHitStrip2D extends SiTrackerHit
35  {
36      
37      List<SiTrackerHitStrip1D> _hits_1D;
38      List<SiTrackerHitStrip1D> _hits_1D_transformed;
39      
40      /**
41       * Creates a new instance of SiTrackerHitStrip2D
42       */
43      
44      // For creating fresh hits
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      // For creating transformed versions of hits
54      public SiTrackerHitStrip2D(TrackerHit hit, List<SiTrackerHitStrip1D> hits_1D)
55      {
56          super(hit);
57          _hits_1D = hits_1D;
58      }
59      
60      // For creating SiTrackerStrip2D from persisted TrackerHits
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      // Get transformed version of hits
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      // Methods specific to 2d hits
85      public double[] getPosition()
86      {
87          return getPositionAsVector().v();
88      }
89      
90      public Hep3Vector getPositionAsVector()
91      {
92          // get IP (global origin) in local coordinates - could be more clever
93          Point3D origin = new Point3D(getLocalToGlobal().inverse().transformed(new BasicHep3Vector(0,0,0)));
94          return getPositionWithLineFrom(origin);
95      }
96  
97      // Get the module
98      public SiTrackerModule getModule()
99      {
100         return (SiTrackerModule)getSensor().getParent();
101     }
102     
103     // Get position referred to specific tracks: input and return parameters are in current coordinates of the hit!
104     // Get position if hit is due to track of infinite momentum originating at some point in current coordinates
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     // Get position if hit is due to track crossing in a given direction (momentum vector)
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 }