lcsim/test/org/lcsim/contrib/tracking
diff -N TrackerHitCheaterTest.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ TrackerHitCheaterTest.java 15 Jul 2007 06:34:34 -0000 1.1
@@ -0,0 +1,79 @@
+package org.lcsim.contrib.tracking;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.lcsim.event.EventHeader;
+import org.lcsim.geometry.Detector;
+import org.lcsim.event.SimTrackerHit;
+import org.lcsim.event.TrackerHit;
+import org.lcsim.util.Driver;
+import org.lcsim.util.cache.FileCache;
+import org.lcsim.util.loop.LCSimLoop;
+
+import java.io.File;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Reads 2 muon event generated in sid01_polyhedra, which uses
+ * SiTrackerBarrel. For DetectorElements where there is a
+ * Readout containing one hit, check that the hit from the event
+ * and the DE's have matching cell id.
+ */
+public class TrackerHitCheaterTest extends TestCase
+{
+ public TrackerHitCheaterTest(String testName)
+ {
+ super(testName);
+ }
+
+ public static Test suite()
+ {
+ return new TestSuite(TrackerHitCheaterTest.class);
+ }
+
+ public void setUp()
+ {
+ java.lang.Runtime.getRuntime().gc();
+ }
+
+ public void testReadout() throws Exception
+ {
+ URL url =
+ new URL("http://www.lcsim.org/test/lcio/mu-_10GeV_10_SLIC_v2r1p7_geant4-v8r2p0_SiTrackerBarrelTest00.slcio");
+ FileCache cache = new FileCache();
+ File file = cache.getCachedFile(url);
+
+ LCSimLoop loop = new LCSimLoop();
+ loop.setLCIORecordSource(file);
+ loop.add( new TestDriver() );
+ loop.loop(10);
+ loop.dispose();
+ }
+
+ class TestDriver extends Driver
+ {
+ protected void process(EventHeader event)
+ {
+ // Get detector and print out tracking subdetector names
+ Detector detector = event.getDetector();
+
+ // Get the SimTrackerHits
+ List<SimTrackerHit> simulated_hits = event.get(SimTrackerHit.class, "SiTrackerBarrel_RO");
+ System.out.println("Nubmer of input SimTrackerHits: "+simulated_hits.size());
+
+ // Make a TrackerHitCheater
+ TrackerHitCheater hit_cheater = new TrackerHitCheater();
+
+ List<TrackerHit> tracker_hits = hit_cheater.makeTrackerHits(simulated_hits);
+ System.out.println("Nubmer of output TrackerHits: "+tracker_hits.size());
+
+// event.put("CheatedTrackerHits",trackerhits,BaseTrackerHitMC.class,0);
+
+ }
+ }
+}
+
lcsim/src/org/lcsim/contrib/tracking
diff -N TrackerHitCheater.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ TrackerHitCheater.java 15 Jul 2007 06:34:35 -0000 1.1
@@ -0,0 +1,152 @@
+/*
+ * TrackerHitCheater.java
+ *
+ * Created on July 11, 2007, 10:54 AM
+ *
+ * To change this template, choose Tools | Template Manager
+ * and open the template in the editor.
+ */
+
+package org.lcsim.contrib.tracking;
+
+import org.lcsim.event.SimTrackerHit;
+import org.lcsim.event.TrackerHit;
+import org.lcsim.event.base.BaseTrackerHitMC;
+
+import hep.physics.vec.Hep3Vector;
+import hep.physics.vec.BasicHep3Vector;
+import hep.physics.vec.VecOp;
+
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ *
+ * @author tknelson
+ */
+public class TrackerHitCheater
+{
+
+ double _max_dist = 0.1;
+
+ /** Creates a new instance of TrackerHitCheater */
+ public TrackerHitCheater()
+ {
+ }
+
+ public List<TrackerHit> makeTrackerHits(List<SimTrackerHit> simulated_hits)
+ {
+
+ List<SimTrackerHit> unclustered_hits = new ArrayList<SimTrackerHit>(simulated_hits);
+
+ // Loop over hits, find clusters and create TrackerHits
+ List<TrackerHit> trackerhits = new ArrayList<TrackerHit>();
+
+ for (SimTrackerHit seed_hit : simulated_hits)
+ {
+ if (unclustered_hits.contains(seed_hit))
+ {
+ // Create a cluster with seed hit
+ List<SimTrackerHit> cluster = new ArrayList<SimTrackerHit>();
+ cluster.add(seed_hit);
+
+ // find nearby hits, move to cluster
+ while (nearbyHits(cluster,unclustered_hits).size() != 0)
+ {
+ List<SimTrackerHit> found_hits = nearbyHits(cluster,unclustered_hits);
+ cluster.addAll(found_hits);
+ unclustered_hits.removeAll(found_hits);
+ }
+ trackerhits.add(makeTrackerHit(cluster));
+ }
+ }
+
+ return trackerhits;
+
+ }
+
+
+ private List<SimTrackerHit> nearbyHits(List<SimTrackerHit> cluster, List<SimTrackerHit> unclustered_hits)
+ {
+ List<SimTrackerHit> nearby_hits = new ArrayList<SimTrackerHit>();
+
+ for (SimTrackerHit seed_hit : cluster)
+ {
+ for (SimTrackerHit hit : unclustered_hits)
+ {
+ double max_dist = Math.max(_max_dist,(seed_hit.getPathLength()+hit.getPathLength())/2.0);
+ Hep3Vector seed_point = new BasicHep3Vector(seed_hit.getPoint());
+ Hep3Vector hit_point = new BasicHep3Vector(hit.getPoint());
+
+ if (VecOp.sub(hit_point,seed_point).magnitude() < max_dist)
+ {
+ nearby_hits.add(hit);
+ }
+ }
+ }
+ return nearby_hits;
+ }
+
+ private TrackerHit makeTrackerHit(List<SimTrackerHit> cluster)
+ {
+ double[] position = getPosition(cluster);
+ double[] covariance = getCovariance(cluster);
+ double time = getTime(cluster);
+ double energy = getEnergy(cluster);
+ int type = 0;
+
+ TrackerHit hit = new BaseTrackerHitMC(position, covariance, time, energy, type, cluster);
+ return hit;
+ }
+
+ private double[] getPosition(List<SimTrackerHit> cluster)
+ {
+ double[] position = new double[3];
+
+ for (SimTrackerHit hit : cluster)
+ {
+ position[0] += hit.getPoint()[0] * hit.getdEdx();
+ position[1] += hit.getPoint()[1] * hit.getdEdx();
+ position[2] += hit.getPoint()[2] * hit.getdEdx();
+ }
+ for (int i = 0; i < 3; i++)
+ {
+ position[i] /= getEnergy(cluster);
+ }
+ return position;
+ }
+
+ private double getTime(List<SimTrackerHit> cluster)
+ {
+ double mean_time = 0.0;
+
+ for (SimTrackerHit hit : cluster)
+ {
+ mean_time += hit.getTime() * hit.getdEdx();
+ }
+ mean_time /= getEnergy(cluster);
+
+ return mean_time;
+ }
+
+ private double[] getCovariance(List<SimTrackerHit> cluster)
+ {
+ double[] covariance = new double[3];
+ covariance[0] = Math.pow(0.007,2);
+ covariance[1] = Math.pow(0.007,2);
+ covariance[2] = Math.pow(0.007,2);
+ return covariance;
+ }
+
+ private double getEnergy(List<SimTrackerHit> cluster)
+ {
+ double total_energy = 0.0;
+ for (SimTrackerHit hit : cluster)
+ {
+ total_energy += hit.getdEdx();
+ }
+ return total_energy;
+ }
+
+
+}