Print

Print


Commit in lcsim on MAIN
test/org/lcsim/contrib/tracking/TrackerHitCheaterTest.java+79added 1.1
src/org/lcsim/contrib/tracking/TrackerHitCheater.java+152added 1.1
+231
2 added files
First version of a simple cheater that produces TrackerHits directly from SimTrackerHits

lcsim/test/org/lcsim/contrib/tracking
TrackerHitCheaterTest.java added at 1.1
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
TrackerHitCheater.java added at 1.1
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;
+    }
+    
+    
+}
CVSspam 0.2.8