lcsim/src/org/lcsim/contrib/SiStripSim
diff -N TrackerHit2DMaker.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ TrackerHit2DMaker.java 17 Jan 2008 06:50:02 -0000 1.1
@@ -0,0 +1,179 @@
+/*
+ * TrackerHit2DMaker.java
+ *
+ * Created on December 20, 2007, 11:39 PM
+ *
+ * To change this template, choose Tools | Template Manager
+ * and open the template in the editor.
+ */
+
+package org.lcsim.contrib.SiStripSim;
+
+import hep.physics.matrix.SymmetricMatrix;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.lcsim.detector.IDetectorElement;
+import org.lcsim.detector.IReadout;
+import org.lcsim.detector.tracker.silicon.SiSensor;
+import org.lcsim.detector.tracker.silicon.SiSensorElectrodes;
+import org.lcsim.detector.tracker.silicon.SiTrackerModule;
+import org.lcsim.event.RawTrackerHit;
+
+/**
+ *
+ * @author tknelson
+ */
+public class TrackerHit2DMaker
+{
+
+ /** Creates a new instance of TrackerHit2DMaker */
+ public TrackerHit2DMaker()
+ {
+ }
+
+ public List<SiTrackerHitStrip2D> makeHits2D(IDetectorElement detector)
+ {
+
+ List<SiTrackerHitStrip2D> hits_2D = new ArrayList<SiTrackerHitStrip2D>();
+
+ List<SiTrackerModule> modules = detector.findDescendants(SiTrackerModule.class);
+
+ // Loop over all modules
+ for (SiTrackerModule module : modules)
+ {
+
+ List<SiSensor> sensors = detector.findDescendants(SiSensor.class);
+
+ boolean doublesided_sensors = false;
+
+ // Process double-sided sensors first
+ for (SiSensor sensor : sensors)
+ {
+ if (sensor.isDoubleSided())
+ {
+ doublesided_sensors = true;
+
+ // Get hits for this sensor
+ IReadout ro = sensor.getReadout();
+ List<SiTrackerHitStrip1D> hits = ro.getHits(SiTrackerHitStrip1D.class);
+
+ // Make map from electrodes to lists of hits
+ Map<SiSensorElectrodes,List<SiTrackerHitStrip1D>> side_hitlists = new HashMap<SiSensorElectrodes,List<SiTrackerHitStrip1D>>();
+ for (SiTrackerHitStrip1D hit : hits)
+ {
+ SiSensorElectrodes electrodes = hit.getReadoutElectrodes();
+ if (side_hitlists.get(electrodes) == null)
+ {
+ side_hitlists.put(electrodes,new ArrayList<SiTrackerHitStrip1D>());
+ }
+
+ side_hitlists.get(electrodes).add(hit);
+ }
+
+ // If have hits on both sides, make 2d strip hits
+ if (side_hitlists.keySet().size() == 2)
+ {
+ List<List<SiTrackerHitStrip1D>> hitlists = new ArrayList<List<SiTrackerHitStrip1D>>(side_hitlists.values());
+
+ for (SiTrackerHitStrip1D hit1: hitlists.get(0))
+ {
+ for (SiTrackerHitStrip1D hit2: hitlists.get(1))
+ {
+ List<SiTrackerHitStrip1D> hitpair = new ArrayList<SiTrackerHitStrip1D>();
+ hitpair.add(hit1);
+ hitpair.add(hit2);
+ hits_2D.add(makeTrackerHit2D(hitpair));
+ }
+ }
+ }
+ }
+ }
+
+ // If have two sensors and neither is double-sided then make 2d hits from single-sided sensor hits
+ if (sensors.size() == 2 && !doublesided_sensors)
+ {
+
+ Map<SiSensor,List<SiTrackerHitStrip1D>> sensor_hitlists = new HashMap<SiSensor,List<SiTrackerHitStrip1D>>();
+
+ for (SiSensor sensor : sensors)
+ {
+ // Get hits for this sensor
+ IReadout ro = sensor.getReadout();
+ List<SiTrackerHitStrip1D> hits = ro.getHits(SiTrackerHitStrip1D.class);
+
+ // If sensor is single-sided strip sensor, add hits to map
+ if (hits.size() != 0)
+ {
+ sensor_hitlists.put(sensor,new ArrayList<SiTrackerHitStrip1D>());
+ sensor_hitlists.get(sensor).addAll(hits);
+ }
+
+ }
+
+ if (sensor_hitlists.keySet().size() == 2)
+ {
+ List<List<SiTrackerHitStrip1D>> hitlists = new ArrayList<List<SiTrackerHitStrip1D>>(sensor_hitlists.values());
+
+ for (SiTrackerHitStrip1D hit1: hitlists.get(0))
+ {
+ for (SiTrackerHitStrip1D hit2: hitlists.get(1))
+ {
+ List<SiTrackerHitStrip1D> hitpair = new ArrayList<SiTrackerHitStrip1D>();
+ hitpair.add(hit1);
+ hitpair.add(hit2);
+ hits_2D.add(makeTrackerHit2D(hitpair));
+ }
+ }
+ }
+
+ }
+
+ }
+
+ return hits_2D;
+
+ }
+
+
+ private SiTrackerHitStrip2D makeTrackerHit2D(List<SiTrackerHitStrip1D> hits_1D)
+ {
+ double energy = 0;
+ double time = 0;
+ List<RawTrackerHit> raw_hits = new ArrayList<RawTrackerHit>();
+
+ for (SiTrackerHitStrip1D hit_1D : hits_1D)
+ {
+ energy += hit_1D.getdEdx();
+ time += hit_1D.getdEdx()*hit_1D.getTime();
+ raw_hits.addAll(hit_1D.getRawHits());
+ }
+ time /= energy;
+
+ TrackerHitType decoded_type = new TrackerHitType(TrackerHitType.CoordinateSystem.GLOBAL,
+ TrackerHitType.MeasurementType.STRIP_2D);
+
+ return new SiTrackerHitStrip2D(calculateGlobalCovariance(hits_1D), energy, time,
+ raw_hits, decoded_type, hits_1D);
+
+ }
+
+ SymmetricMatrix calculateGlobalCovariance(List<SiTrackerHitStrip1D> hits_1D)
+ {
+ double[] covariance_elements = new double[6];
+
+ for (SiTrackerHitStrip1D hit_1D : hits_1D)
+ {
+ for (int i = 0; i < covariance_elements.length; i++)
+ {
+ covariance_elements[i] += hit_1D.getTransformedHit(TrackerHitType.CoordinateSystem.GLOBAL).getCovMatrix()[i];
+ }
+ }
+
+ return new SymmetricMatrix(3,covariance_elements,true);
+
+ }
+
+
+}
\ No newline at end of file
lcsim/src/org/lcsim/contrib/SiStripSim
diff -u -r1.1 -r1.2
--- SiTrackerHitStrip2D.java 24 Dec 2007 14:38:11 -0000 1.1
+++ SiTrackerHitStrip2D.java 17 Jan 2008 06:50:02 -0000 1.2
@@ -10,11 +10,21 @@
package org.lcsim.contrib.SiStripSim;
import hep.physics.matrix.SymmetricMatrix;
+import hep.physics.vec.BasicHep3Vector;
import hep.physics.vec.Hep3Vector;
+import hep.physics.vec.VecOp;
+import java.util.ArrayList;
import java.util.List;
+import java.util.Set;
import org.lcsim.detector.ITransform3D;
+import org.lcsim.detector.Transform3D;
+import org.lcsim.detector.solids.GeomOp3D;
+import org.lcsim.detector.solids.LineSegment3D;
+import org.lcsim.detector.solids.Plane3D;
+import org.lcsim.detector.solids.Point3D;
import org.lcsim.event.MCParticle;
import org.lcsim.event.RawTrackerHit;
+import org.lcsim.event.RelationalTable;
import org.lcsim.event.TrackerHit;
/**
@@ -25,52 +35,137 @@
{
List<SiTrackerHitStrip1D> _hits_1D;
+ List<SiTrackerHitStrip1D> _hits_1D_transformed;
/**
* Creates a new instance of SiTrackerHitStrip2D
*/
- public SiTrackerHitStrip2D(Hep3Vector position_vector, SymmetricMatrix covariance_matrix, double energy, double time, List<RawTrackerHit> raw_hits, TrackerHitType decoded_type)
+
+ // For creating fresh hits
+ public SiTrackerHitStrip2D(SymmetricMatrix covariance_matrix, double energy, double time,
+ List<RawTrackerHit> raw_hits, TrackerHitType decoded_type, List<SiTrackerHitStrip1D> hits_1D)
{
- super(position_vector, covariance_matrix, energy, time, raw_hits, decoded_type);
+ super(new BasicHep3Vector(0,0,0), covariance_matrix, energy, time, raw_hits, decoded_type);
+ _hits_1D = hits_1D;
}
- public SiTrackerHitStrip2D(TrackerHit hit)
+
+ // For creating transformed versions of hits
+ public SiTrackerHitStrip2D(TrackerHit hit, List<SiTrackerHitStrip1D> hits_1D)
{
super(hit);
+ _hits_1D = hits_1D;
}
- public SiTrackerHitStrip2D(TrackerHit hit, TrackerHitType.CoordinateSystem coordinate_system)
+ // For creating SiTrackerStrip2D from persisted TrackerHits
+ public SiTrackerHitStrip2D(TrackerHit hit, RelationalTable hits_1D)
+ {
+ super(hit);
+ _hits_1D = new ArrayList((Set<SiTrackerHitStrip1D>)hits_1D.allTo(hit));
+ }
+
+ public SiTrackerHitStrip2D(TrackerHit hit, RelationalTable hits_1D, TrackerHitType.CoordinateSystem coordinate_system)
{
super(hit,coordinate_system);
+ _hits_1D = new ArrayList((Set<SiTrackerHitStrip1D>)hits_1D.allTo(hit));
}
+ // Get transformed version of hits
public TrackerHit getTransformedHit(TrackerHitType.CoordinateSystem coordinate_system)
{
- return new SiTrackerHitStrip2D(super.getTransformedHit(coordinate_system));
+ return new SiTrackerHitStrip2D(super.getTransformedHit(coordinate_system),getHits1D());
}
public TrackerHit getTransformedHit(ITransform3D global_to_local)
{
- return new SiTrackerHitStrip2D(super.getTransformedHit(global_to_local));
+ return new SiTrackerHitStrip2D(super.getTransformedHit(global_to_local),getHits1D());
}
// Methods specific to 2d hits
+ public double[] getPosition()
+ {
+ return getPositionAsVector().v();
+ }
+
+ public Hep3Vector getPositionAsVector()
+ {
+ // get IP (global origin) in local coordinates - could be more clever
+ Point3D origin = (Point3D)getLocalToGlobal().inverse().transformed(new BasicHep3Vector(0,0,0));
+ return getPositionWithLineFrom(origin);
+ }
+
+ // Get position referred to specific tracks: input and return parameters are in current coordinates of the hit!
+ // Get position if hit is due to track of infinite momentum originating at some point in current coordinates
+ public Hep3Vector getPositionWithLineFrom(Point3D origin)
+ {
+ List<Point3D> plane_points = new ArrayList<Point3D>();
+ plane_points.add(origin);
+ plane_points.addAll(getHits1DTransformed().get(0).getHitSegment().getPoints());
+ Plane3D plane = new Plane3D(plane_points);
+
+ Point3D start_point = GeomOp3D.intersection(getHits1DTransformed().get(1).getHitSegment(),plane);
+
+ plane_points.clear();
+ plane_points.add(origin);
+ plane_points.addAll(getHits1DTransformed().get(1).getHitSegment().getPoints());
+ plane = new Plane3D(plane_points);
+
+ Point3D end_point = GeomOp3D.intersection(getHits1DTransformed().get(0).getHitSegment(),plane);
+
+ LineSegment3D hitsegment_2d = new LineSegment3D(start_point,end_point);
+
+ return hitsegment_2d.getEndPoint(hitsegment_2d.getLength()/2);
+ }
+
+ // Get position if hit is due to track crossing in a given direction (momentum vector)
+ public Hep3Vector getPositionWithDirection(Hep3Vector direction)
+ {
+ Hep3Vector normal = VecOp.cross(direction,getHits1DTransformed().get(0).getUnmeasuredCoordinate());
+ Point3D hitpoint = new Point3D(getHits1DTransformed().get(0).getPositionAsVector());
+ Plane3D plane = new Plane3D(normal,hitpoint);
+
+ Point3D start_point = GeomOp3D.intersection(getHits1DTransformed().get(1).getHitSegment(),plane);
+
+ normal = VecOp.cross(direction,getHits1DTransformed().get(1).getUnmeasuredCoordinate());
+ hitpoint = new Point3D(getHits1DTransformed().get(1).getPositionAsVector());
+ plane = new Plane3D(normal,hitpoint);
+
+ Point3D end_point = GeomOp3D.intersection(getHits1DTransformed().get(0).getHitSegment(),plane);
+
+ LineSegment3D hitsegment_2d = new LineSegment3D(start_point,end_point);
+
+ return hitsegment_2d.getEndPoint(hitsegment_2d.getLength()/2);
+ }
+
public List<SiTrackerHitStrip1D> getHits1D()
{
- // do this at creation time... need to synchronize coordinate system of 1D hits.
- // I think the LCRelations needs to be dug up by the constructor. How do we find the right relations?
- if (_hits_1D == null)
+ return _hits_1D;
+ }
+
+ public List<SiTrackerHitStrip1D> getHits1DTransformed()
+ {
+ if (_hits_1D_transformed == null)
{
- // find LCRelations?
+ for (SiTrackerHitStrip1D hit_1D : _hits_1D)
+ {
+ if (getCoordinateSystem() == TrackerHitType.CoordinateSystem.UNKNOWN)
+ {
+ _hits_1D_transformed.add((SiTrackerHitStrip1D)hit_1D.getTransformedHit(getLocalToGlobal().inverse()));
+ }
+ else
+ {
+ _hits_1D_transformed.add((SiTrackerHitStrip1D)hit_1D.getTransformedHit(getCoordinateSystem()));
+ }
+ }
}
- return _hits_1D;
+ return _hits_1D_transformed;
}
public boolean isGhost()
{
- for (MCParticle particle1 : _hits_1D.get(0).getMCParticles())
+ for (MCParticle particle1 : getHits1D().get(0).getMCParticles())
{
- if (_hits_1D.get(1).getMCParticles().contains(particle1)) return true;
+ if (getHits1D().get(1).getMCParticles().contains(particle1)) return true;
}
return false;
}
lcsim/test/org/lcsim/detector/driver
diff -u -r1.1 -r1.2
--- TrackerHitEndcapDriverTest.java 24 Dec 2007 14:38:12 -0000 1.1
+++ TrackerHitEndcapDriverTest.java 17 Jan 2008 06:50:03 -0000 1.2
@@ -1,7 +1,5 @@
package org.lcsim.detector.driver;
-import hep.physics.matrix.SymmetricMatrix;
-import hep.physics.vec.BasicHep3Vector;
import java.io.File;
import java.net.URL;
import java.util.List;
@@ -9,21 +7,16 @@
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
+import org.lcsim.contrib.RobKutschke.TKNHits.TKNClusterMakerDriverV1;
import org.lcsim.contrib.RobKutschke.TKNHits.TKNRawHitsDriverV1;
import org.lcsim.contrib.SiStripSim.CDFSiSensorSim;
import org.lcsim.contrib.SiStripSim.ClusterMaker;
import org.lcsim.contrib.SiStripSim.Kpix;
import org.lcsim.contrib.SiStripSim.ReadoutChip;
import org.lcsim.contrib.SiStripSim.SiSensorSim;
-import org.lcsim.contrib.SiStripSim.SiTrackerHitStrip1D;
import org.lcsim.contrib.SiStripSim.StripClusterMaker;
-import org.lcsim.contrib.SiStripSim.TrackerHitType;
-import org.lcsim.detector.identifier.ExpandedIdentifier;
-import org.lcsim.detector.identifier.IExpandedIdentifier;
-import org.lcsim.detector.tracker.silicon.DopedSilicon;
import org.lcsim.event.EventHeader;
-import org.lcsim.event.MCParticle;
import org.lcsim.event.RawTrackerHit;
import org.lcsim.event.TrackerHit;
import org.lcsim.util.Driver;
@@ -55,7 +48,7 @@
public void testReadout() throws Exception
{
- URL url = new URL("http://www.lcsim.org/test/lcio/mu-_10GeV_SLIC-v2r3p10_geant4-v9r0p1_LCPhys_SiTrackerEndcapTest00.slcio");
+ URL url = new URL("http://www.lcsim.org/test/lcio/pythiaZPoleuds-0-1000_SLIC-v2r4p2_geant4-v9r1p0_LCPhys_SiTrackerTest01.slcio");
FileCache cache = new FileCache();
File file = cache.getCachedFile(url);