Print

Print


Commit in lcsim/src/org/lcsim/recon/tracking/digitization/sistripsim on MAIN
Clusterer.java+37added 1.1
PixelHitMaker.java+493added 1.1
SiTrackerHitStrip1D.java+2-21.1 -> 1.2
Kpix.java+16-181.2 -> 1.3
ReadoutChip.java+1-11.1 -> 1.2
GenericReadoutChip.java+2-21.2 -> 1.3
StripHitMaker.java+13-141.1 -> 1.2
TrackerHitDriver.java+31-271.4 -> 1.5
StripClusterer.java-371.1 removed
ClusterMaker.java-231.1 removed
PixelClusterer.java-301.1 removed
StripClusterMaker.java-3561.1 removed
+595-510
2 added + 4 removed + 6 modified, total 12 files
- Deprecated classes removed: StripClusterer, ClusterMaker, PixelClusterer, StripClusterMaker
- Replaced with Clusterer, PixelHitMaker
- MAJOR CHANGE is addition of pixel clustering via PixelHitMaker
- Minor changes to SiTrackerHitStrip1D, Kpix, ReadoutChip, GenericReadoutChip, TrackerHitDriver to support refactoring of hit making to accommodate pixels

lcsim/src/org/lcsim/recon/tracking/digitization/sistripsim
Clusterer.java added at 1.1
diff -N Clusterer.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ Clusterer.java	24 Apr 2009 00:16:51 -0000	1.1
@@ -0,0 +1,37 @@
+/*
+ * Clusterer.java
+ *
+ * Created on April 2, 2008, 6:51 AM
+ *
+ * To change this template, choose Tools | Template Manager
+ * and open the template in the editor.
+ */
+
+package org.lcsim.recon.tracking.digitization.sistripsim;
+
+import java.util.List;
+import org.lcsim.detector.IDetectorElement;
+import org.lcsim.detector.tracker.silicon.SiSensor;
+import org.lcsim.detector.tracker.silicon.SiSensorElectrodes;
+import org.lcsim.event.RawTrackerHit;
+
+/**
+ *
+ * @author tknelson
+ */
+public interface Clusterer
+{
+    public String getName();
+    
+    public double getSeedThreshold();
+    
+    public double getNeighborThreshold();
+    
+    public double getClusterThreshold();
+    
+    public List<SiTrackerHit> makeHits(IDetectorElement detector);
+    
+    public List<SiTrackerHit> makeHits(SiSensor sensor);
+    
+    public List<SiTrackerHit> makeHits(SiSensorElectrodes electrodes, List<RawTrackerHit> hits);
+}

lcsim/src/org/lcsim/recon/tracking/digitization/sistripsim
PixelHitMaker.java added at 1.1
diff -N PixelHitMaker.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ PixelHitMaker.java	24 Apr 2009 00:16:51 -0000	1.1
@@ -0,0 +1,493 @@
+/*
+ * StripHitMaker.java
+ *
+ * Created on September 26, 2007, 1:57 PM
+ *
+ * To change this template, choose Tools | Template Manager
+ * and open the template in the editor.
+ */
+
+package org.lcsim.recon.tracking.digitization.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.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.Map.Entry;
+
+import org.lcsim.detector.IDetectorElement;
+import org.lcsim.detector.IReadout;
+import org.lcsim.detector.identifier.IIdentifier;
+import org.lcsim.detector.tracker.silicon.ChargeCarrier;
+import org.lcsim.detector.tracker.silicon.DopedSilicon;
+import org.lcsim.detector.tracker.silicon.SiPixels;
+import org.lcsim.detector.tracker.silicon.SiSensor;
+import org.lcsim.detector.tracker.silicon.SiSensorElectrodes;
+import org.lcsim.detector.tracker.silicon.SiStrips;
+import org.lcsim.detector.tracker.silicon.SiTrackerIdentifierHelper;
+import org.lcsim.event.RawTrackerHit;
+import org.lcsim.event.SimTrackerHit;
+
+/**
+ *
+ * @author tknelson
+ */
+public class PixelHitMaker implements Clusterer
+{
+    
+    private static String _NAME = "PixelClusterer";
+    
+    // Thresholds
+    double _seed_threshold = 4;     // to seed a cluster
+    double _neighbor_threshold = 2; // to add to a cluster
+    double _cluster_threshold = 3;  // to make a cluster (noise of channels is summed)
+    
+    // Absolute maximum cluster size
+    int _max_cluster_npixels = 10;
+    
+    // Readout chip needed to decode hit information
+    ReadoutChip _readout_chip;
+    
+    // Sensor simulation needed to correct for Lorentz drift
+    SiSensorSim _simulation;
+    
+    // Identifier helper (reset once per sensor)
+    SiTrackerIdentifierHelper _sid_helper;
+    
+    // Temporary map connecting hits to pixel numbers for sake of speed (reset once per sensor)
+    Map<RawTrackerHit,Integer> _pixel_map = new HashMap<RawTrackerHit,Integer>();
+    
+    /** Creates a new instance of Tracker1DHitMaker */
+    public PixelHitMaker(SiSensorSim simulation, ReadoutChip readout_chip)
+    {
+        _simulation = simulation;
+        _readout_chip = readout_chip;
+        
+        _readout_chip.setClusterer(this);
+    }
+    
+    // Settings for Tracker1DHitMaker
+    public void setSeedThreshold(double nsigma)
+    {
+        _seed_threshold = nsigma;
+    }
+    
+    public void setNeigborThreshold(double nsigma)
+    {
+        _neighbor_threshold = nsigma;
+    }
+    
+    public void setClusterThreshold(double nsigma)
+    {
+        _cluster_threshold = nsigma;
+    }
+    
+    public void setMaxClusterSize(int max_cluster_npixels)
+    {
+        _max_cluster_npixels = max_cluster_npixels;
+    }
+    
+    public String getName()
+    {
+        return _NAME;
+    }
+    
+    public double getSeedThreshold()
+    {
+        return _seed_threshold;
+    }
+    
+    public double getNeighborThreshold()
+    {
+        return _neighbor_threshold;
+    }
+    
+    public double getClusterThreshold()
+    {
+        return _cluster_threshold;
+    }
+    
+    // Make hits for all sensors within a DetectorElement
+    public List<SiTrackerHit> makeHits(IDetectorElement detector)
+    {
+    	System.out.println("makeHits(IDetectorElement): " + detector.getName());
+        List<SiTrackerHit> hits = new ArrayList<SiTrackerHit>();
+        List<SiSensor> sensors = detector.findDescendants(SiSensor.class);
+        
+        // Loop over all sensors
+        for (SiSensor sensor : sensors)
+        {
+            if (sensor.hasPixels())
+            {
+                hits.addAll(makeHits(sensor));
+            }
+        }
+        
+        // Return hit list
+        return hits;
+    }
+    
+    
+    // Make hits for a sensor
+    public List<SiTrackerHit> makeHits(SiSensor sensor)
+    {
+       
+    	//System.out.println("makeHits: " + sensor.getName());
+    	
+        List<SiTrackerHit> hits = new ArrayList<SiTrackerHit>();
+        
+        // Get SiTrackerIdentifierHelper for this sensor and refresh the pixel map used to increase speed
+        _sid_helper = (SiTrackerIdentifierHelper)sensor.getIdentifierHelper();
+        _pixel_map.clear();
+        
+        // Get hits for this sensor
+        IReadout ro = sensor.getReadout();
+        List<RawTrackerHit> raw_hits = ro.getHits(RawTrackerHit.class);
+        
+        Map<SiSensorElectrodes,List<RawTrackerHit>> electrode_hits = new HashMap<SiSensorElectrodes,List<RawTrackerHit>>();
+        
+        for (RawTrackerHit raw_hit : raw_hits)
+        {
+            
+            // get id and create pixel map, get electrodes.
+            IIdentifier id = raw_hit.getIdentifier();
+            _pixel_map.put(raw_hit,_sid_helper.getElectrodeValue(id));
+            
+            // Get electrodes and check that they are pixels
+            //System.out.println("proc raw hit from: " + DetectorElementStore.getInstance().find(raw_hit.getIdentifier()).get(0).getName());
+            ChargeCarrier carrier = ChargeCarrier.getCarrier(_sid_helper.getSideValue(id));
+            SiSensorElectrodes electrodes = ((SiSensor)raw_hit.getDetectorElement()).getReadoutElectrodes(carrier);
+            if ( !(electrodes instanceof SiPixels) ) continue;
+            
+            if (electrode_hits.get(electrodes) == null)
+            {
+                electrode_hits.put(electrodes,new ArrayList<RawTrackerHit>());
+            }
+            
+            electrode_hits.get(electrodes).add(raw_hit);
+        }
+        
+        for (Entry entry : electrode_hits.entrySet())
+        {
+            hits.addAll(makeHits((SiPixels)entry.getKey(),(List<RawTrackerHit>)entry.getValue()));
+        }
+        
+        return hits;
+    }
+    
+    
+    // Private methods
+    //=========================
+    
+    // Make hits for an electrode
+    public List<SiTrackerHit> makeHits(SiSensorElectrodes electrodes, List<RawTrackerHit> raw_hits)
+    {
+        
+//            System.out.println("Clustering electrodes: "+electrodes_id);
+        
+        List<SiTrackerHit> hits = new ArrayList<SiTrackerHit>();
+        
+        List<RawTrackerHit> unclustered_rawhits = new ArrayList<RawTrackerHit>(raw_hits);
+        
+        for (RawTrackerHit raw_hit : raw_hits)
+        {
+            
+            int pixel_number = _pixel_map.get(raw_hit);
+            double signal = _readout_chip.decodeCharge(raw_hit);
+            double noise = _readout_chip.getChannel(pixel_number).computeNoise(electrodes.getCapacitance(pixel_number));
+            
+            if (signal/noise > _seed_threshold && unclustered_rawhits.contains(raw_hit))
+            {
+                
+//                    System.out.println("Creating new cluster, # Raw hits on electrodes is: "+hits.size());
+                
+                List<RawTrackerHit> cluster = new ArrayList<RawTrackerHit>();
+                List<RawTrackerHit> clustered_hits = new ArrayList<RawTrackerHit>();
+                
+                clustered_hits.add(raw_hit);
+                
+                while (clustered_hits.size() != 0)
+                {
+                    cluster.addAll(clustered_hits);
+                    unclustered_rawhits.removeAll(clustered_hits);
+                    clustered_hits = neighborHits(clustered_hits,unclustered_rawhits,electrodes);
+                    
+//                        System.out.println("    Cluster size:  "+cluster.size());
+//                        System.out.println("        # Unclustered hits:  "+unclustered_hits.size());
+//                        System.out.println("        # neighbors found:  "+clustered_hits.size());
+                }
+                
+//                if (cluster.size() > 10)
+//                {
+//                    System.out.println("Cluster size: "+cluster.size());
+//                }
+                
+                // Make a TrackerHit from the cluster if it meets max cluster size requirement
+                if (cluster.size() <= _max_cluster_npixels)
+                {
+                    SiTrackerHitPixel hit = makeTrackerHit(cluster,electrodes);
+                    
+                    // Add to readout and to list of hits
+                    ((SiSensor)electrodes.getDetectorElement()).getReadout().addHit(hit);
+                    hits.add(hit);
+                }
+                
+                
+            }
+        }
+        
+        return hits;
+    }
+    
+    
+    // Find the hits neigboring a cluster
+    private List<RawTrackerHit> neighborHits(List<RawTrackerHit> clustered_hits, List<RawTrackerHit> unclustered_hits,
+            SiSensorElectrodes electrodes)
+    {
+        List<RawTrackerHit> neighbor_hits = new ArrayList<RawTrackerHit>();
+        
+        for (RawTrackerHit seed_hit : clustered_hits)
+        {
+            Set<Integer> neighbor_cells = electrodes.getNearestNeighborCells(_pixel_map.get(seed_hit));
+            for (RawTrackerHit hit : unclustered_hits)
+            {
+                int pixel_number = _pixel_map.get(hit);
+                double signal = _readout_chip.decodeCharge(hit);
+                double noise = _readout_chip.getChannel(pixel_number).computeNoise(electrodes.getCapacitance(pixel_number));
+                
+                if (neighbor_cells.contains(_pixel_map.get(hit)) && signal/noise > _neighbor_threshold)
+                {
+                    neighbor_hits.add(hit);
+                }
+            }
+        }
+        return neighbor_hits;
+    }
+    
+    
+    //Make the hit
+    private SiTrackerHitPixel makeTrackerHit(List<RawTrackerHit> cluster, SiSensorElectrodes electrodes)
+    {
+        Hep3Vector position = getPosition(cluster,electrodes);
+        SymmetricMatrix covariance = getCovariance(cluster,electrodes);
+        double time = getTime(cluster);
+        double energy = getEnergy(cluster);
+        TrackerHitType type = new TrackerHitType(TrackerHitType.CoordinateSystem.GLOBAL,TrackerHitType.MeasurementType.PIXEL);
+        
+        SiTrackerHitPixel hit = new SiTrackerHitPixel(position, covariance, energy, time, cluster, type);
+        return hit;
+    }
+    
+    
+    private List<SimTrackerHit> getSimulatedHits(List<RawTrackerHit> cluster)
+    {
+        Set<SimTrackerHit> simulated_hits = new HashSet<SimTrackerHit>();
+        for (RawTrackerHit hit : cluster)
+        {
+            simulated_hits.addAll(hit.getSimTrackerHits());
+        }
+        return new ArrayList<SimTrackerHit>(simulated_hits);
+    }
+    
+    
+    private Hep3Vector getPosition(List<RawTrackerHit> cluster, SiSensorElectrodes electrodes)
+    {
+        List<Double> signals = new ArrayList<Double>();
+        List<Hep3Vector> positions = new ArrayList<Hep3Vector>();
+        
+        for (RawTrackerHit hit : cluster)
+        {
+            signals.add(_readout_chip.decodeCharge(hit));
+            positions.add(electrodes.getCellPosition(_pixel_map.get(hit)) );
+        }
+        
+        double total_charge = 0;
+        Hep3Vector position = new BasicHep3Vector(0,0,0);
+        
+        for (int ipixel = 0; ipixel < signals.size(); ipixel++)
+        {
+            double signal = signals.get(ipixel);
+            
+            total_charge += signal;
+            position = VecOp.add(position,VecOp.mult(signal,positions.get(ipixel)));
+        }
+        position = VecOp.mult(1/total_charge,position);
+        
+//        double total_charge = 0;
+//        Hep3Vector position = new BasicHep3Vector(0,0,0);
+//        
+//        for (RawTrackerHit hit : cluster)
+//        {
+//            int strip_number = _strip_map.get(hit);
+//            double signal = _readout_chip.decodeCharge(hit);
+//            
+//            total_charge += signal;
+//            position = VecOp.add(position,VecOp.mult(signal,((SiStrips)electrodes).getStripCenter(strip_number)));
+//        }
+//        position = VecOp.mult(1/total_charge,position);
+        
+        // Put position in sensor coordinates
+        electrodes.getParentToLocal().inverse().transform(position);
+        
+//        System.out.println("Position \n"+position);
+        
+        // Swim position back through lorentz drift direction to midpoint between bias surfaces
+        _simulation.setSensor((SiSensor)electrodes.getDetectorElement());
+        _simulation.lorentzCorrect(position,electrodes.getChargeCarrier());
+        
+//        System.out.println("Lorentz corrected position \n"+position);
+        
+        // return position in global coordinates
+        return ((SiSensor)electrodes.getDetectorElement()).getGeometry().getLocalToGlobal().transformed(position);
+//        return electrodes.getLocalToGlobal().transformed(position);
+    }
+    
+    
+    private double getTime(List<RawTrackerHit> cluster)
+    {
+        int time_sum = 0;
+        int signal_sum = 0;
+        
+        for (RawTrackerHit hit : cluster)
+        {
+            
+            int pixel_number = _pixel_map.get(hit);
+            double signal = _readout_chip.decodeCharge(hit);
+            double time = _readout_chip.decodeTime(hit);
+            
+            time_sum += time_sum * signal;
+            signal_sum += signal;
+            
+        }
+        return (double)time_sum/(double)signal_sum;
+    }
+    
+    
+    private SymmetricMatrix getCovariance(List<RawTrackerHit> cluster, SiSensorElectrodes electrodes)
+    {
+
+        SymmetricMatrix covariance = new SymmetricMatrix(3);
+        covariance.setElement( 0, 0, Math.pow( getXResolution(cluster, electrodes), 2 ) );
+        covariance.setElement( 1, 1, Math.pow( getYResolution(cluster, electrodes), 2 ) );
+        covariance.setElement( 2, 2, 0.0);
+        
+        SymmetricMatrix covariance_global = electrodes.getLocalToGlobal().transformed(covariance);
+        
+//        System.out.println("Global covariance matrix: \n"+covariance_global);
+        
+        return covariance_global;
+        
+//        BasicHep3Matrix rotation_matrix = (BasicHep3Matrix)electrodes.getLocalToGlobal().getRotation().getRotationMatrix();
+//        BasicHep3Matrix rotation_matrix_transposed = new BasicHep3Matrix(rotation_matrix);
+//        rotation_matrix_transposed.transpose();
+//
+////        System.out.println("Rotation matrix: \n"+rotation_matrix);
+////        System.out.println("Rotation matrix transposed: \n"+rotation_matrix_transposed);
+////        System.out.println("Local covariance matrix: \n"+covariance);
+//
+//        BasicHep3Matrix covariance_global = (BasicHep3Matrix)VecOp.mult(rotation_matrix,VecOp.mult(covariance,rotation_matrix_transposed));
+//
+////        System.out.println("Global covariance matrix: \n"+covariance_global);
+//
+//        return new SymmetricMatrix((Matrix)covariance_global);
+    }
+
+    private double getXResolution(List<RawTrackerHit> cluster, SiSensorElectrodes electrodes)
+    {
+
+        double measured_resolution;
+
+        Set<Integer> rows = new HashSet<Integer>();
+        for (RawTrackerHit hit : cluster)
+        {
+            rows.add(electrodes.getRowNumber(_pixel_map.get(hit)));
+        }
+
+        int cluster_width = rows.size();
+        double sense_pitch = ((SiSensor)electrodes.getDetectorElement()).getSenseElectrodes(electrodes.getChargeCarrier()).getPitch(0);
+
+        if (cluster_width == 1)
+        {
+            measured_resolution = sense_pitch / Math.sqrt(12);
+        }
+        else if (cluster_width == 2)
+        {
+            measured_resolution = sense_pitch / 5;
+        }
+        else if (cluster_width == 3)
+        {
+            measured_resolution = sense_pitch / 3;
+        }
+        else if (cluster_width == 4)
+        {
+            measured_resolution = sense_pitch / 2;
+        }
+        else
+        {
+            measured_resolution = sense_pitch;
+        }
+
+        return measured_resolution;
+
+    }
+
+     private double getYResolution(List<RawTrackerHit> cluster, SiSensorElectrodes electrodes)
+    {
+
+        double measured_resolution;
+
+        Set<Integer> columns = new HashSet<Integer>();
+        for (RawTrackerHit hit : cluster)
+        {
+            columns.add(electrodes.getColumnNumber(_pixel_map.get(hit)));
+        }
+
+        int cluster_width = columns.size();
+        double sense_pitch = ((SiSensor) electrodes.getDetectorElement()).getSenseElectrodes(electrodes.getChargeCarrier()).getPitch(0);
+
+        if (cluster_width == 1)
+        {
+            measured_resolution = sense_pitch / Math.sqrt(12);
+        } else if (cluster_width == 2)
+        {
+            measured_resolution = sense_pitch / 5;
+        } else if (cluster_width == 3)
+        {
+            measured_resolution = sense_pitch / 3;
+        } else if (cluster_width == 4)
+        {
+            measured_resolution = sense_pitch / 2;
+        } else
+        {
+            measured_resolution = sense_pitch;
+        }
+
+        return measured_resolution;
+
+    }
+
+    
+    
+    private double getEnergy(List<RawTrackerHit> cluster)
+    {
+        double total_charge = 0.0;
+        for (RawTrackerHit hit : cluster)
+        {
+            
+            int pixel_number = _pixel_map.get(hit);
+            double signal = _readout_chip.decodeCharge(hit);
+            
+            total_charge += signal;
+        }
+        return total_charge * DopedSilicon.ENERGY_EHPAIR;
+    }
+    
+    
+}

lcsim/src/org/lcsim/recon/tracking/digitization/sistripsim
SiTrackerHitStrip1D.java 1.1 -> 1.2
diff -u -r1.1 -r1.2
--- SiTrackerHitStrip1D.java	9 Dec 2008 22:22:34 -0000	1.1
+++ SiTrackerHitStrip1D.java	24 Apr 2009 00:16:51 -0000	1.2
@@ -68,10 +68,10 @@
         {
             hit_length = Math.max( hit_length,
                     ((SiStrips)getReadoutElectrodes()).
-                    getStripLength(getIdentifierHelper().getStripValue(raw_hit.getIdentifier())) );
+                    getStripLength(getIdentifierHelper().getElectrodeValue(raw_hit.getIdentifier())) );
             
 //            System.out.println("Strip length: "+((SiStrips)getReadoutElectrodes()).
-//                    getStripLength(getIdentifierHelper().getStripValue(raw_hit.getIdentifier())));
+//                    getStripLength(getIdentifierHelper().getElectrodeValue(raw_hit.getIdentifier())));
         }
 //        System.out.println("    Hit length: "+hit_length);
         

lcsim/src/org/lcsim/recon/tracking/digitization/sistripsim
Kpix.java 1.2 -> 1.3
diff -u -r1.2 -r1.3
--- Kpix.java	20 Apr 2009 21:23:50 -0000	1.2
+++ Kpix.java	24 Apr 2009 00:16:51 -0000	1.3
@@ -34,9 +34,9 @@
 
     private static final int VERSION_NUMBER = 1; // version number
     private static Random _random = new Random();
-    private static NormalDistribution _gaussian = new NormalDistributionImpl(0.0, 1.0);
-    private static BinomialDistribution _binomial = new BinomialDistributionImpl(1, 1);
-    private StripClusterer _strip_clusterer;
+    private static NormalDistribution _gaussian = new NormalDistributionImpl(0.0,1.0);
+    private static BinomialDistribution _binomial = new BinomialDistributionImpl(1,1);
+    private Clusterer _clusterer;
 
     // Static values and defaults: DO NOT CHANGE
     //==========================================
@@ -117,24 +117,22 @@
     /** Creates a new instance of Kpix */
     public Kpix() {
     }
-
-    public void setStripClusterer(StripClusterer strip_clusterer) {
-        _strip_clusterer = strip_clusterer;
+    
+    public void setClusterer(Clusterer clusterer)
+    {
+        _clusterer = clusterer;
     }
 
     // ReadoutChip Interface
     public KpixChannel getChannel(int channel_number) {
         return _channel;
     }
-
-    public SortedMap<Integer, List<Integer>> readout(SiElectrodeDataCollection data, SiSensorElectrodes electrodes) {
-        if (data == null) {
-            data = new SiElectrodeDataCollection();
-        }
-        if (_strip_clusterer != null) {
-            addNoise(data, electrodes);
-        }
-        return digitize(data, electrodes);
+    
+    public SortedMap<Integer,List<Integer>> readout(SiElectrodeDataCollection data, SiSensorElectrodes electrodes)
+    {
+        if (data == null) data = new SiElectrodeDataCollection();
+        if (_clusterer != null) addNoise(data,electrodes);
+        return digitize(data,electrodes);
     }
 
     // Decoding hit information
@@ -190,7 +188,7 @@
 
         int nelectrodes = electrodes.getNCells();
         int nelectrodes_empty = nelectrodes - data.size();
-        double normalized_integration_limit = _strip_clusterer.getSeedThreshold();  // We should get this from same place as clustering code
+        double normalized_integration_limit = _clusterer.getSeedThreshold();  // We should get this from same place as clustering code        
 
         double integral = normalCDF(normalized_integration_limit);
         int nchannels_throw = drawBinomial(nelectrodes_empty, integral);
@@ -232,8 +230,8 @@
             neighbors.removeAll(data.keySet());
 
             nelectrodes_empty = neighbors.size();
-            normalized_integration_limit = _strip_clusterer.getNeighborThreshold();  // We should get this from same place as clustering code
-
+            normalized_integration_limit = _clusterer.getNeighborThreshold();  // We should get this from same place as clustering code
+            
             integral = normalCDF(normalized_integration_limit);
             nchannels_throw = drawBinomial(nelectrodes_empty, integral);
 

lcsim/src/org/lcsim/recon/tracking/digitization/sistripsim
ReadoutChip.java 1.1 -> 1.2
diff -u -r1.1 -r1.2
--- ReadoutChip.java	9 Dec 2008 22:22:34 -0000	1.1
+++ ReadoutChip.java	24 Apr 2009 00:16:51 -0000	1.2
@@ -20,7 +20,7 @@
  */
 public interface ReadoutChip
 {
-    public void setStripClusterer(StripClusterer strip_clusterer);  
+    public void setClusterer(Clusterer clusterer);
     
     public SortedMap<Integer,List<Integer>> readout(SiElectrodeDataCollection data, SiSensorElectrodes electrodes);
 

lcsim/src/org/lcsim/recon/tracking/digitization/sistripsim
GenericReadoutChip.java 1.2 -> 1.3
diff -u -r1.2 -r1.3
--- GenericReadoutChip.java	23 Apr 2009 23:05:23 -0000	1.2
+++ GenericReadoutChip.java	24 Apr 2009 00:16:51 -0000	1.3
@@ -36,7 +36,7 @@
     private static Random _random = new Random();
     private static NormalDistribution _gaussian = new NormalDistributionImpl(0.0, 1.0);
     private static BinomialDistribution _binomial = new BinomialDistributionImpl(1, 1);
-    private StripClusterer _clusterer;
+    private Clusterer _clusterer;
     private GenericChannel _channel = new GenericChannel();
     private double _capacitance;
 
@@ -88,7 +88,7 @@
      *
      * @param _clusterer
      */
-    public void setStripClusterer(StripClusterer clusterer) {
+    public void setClusterer(Clusterer clusterer) {
         _clusterer = clusterer;
     }
 

lcsim/src/org/lcsim/recon/tracking/digitization/sistripsim
StripHitMaker.java 1.1 -> 1.2
diff -u -r1.1 -r1.2
--- StripHitMaker.java	9 Dec 2008 22:22:34 -0000	1.1
+++ StripHitMaker.java	24 Apr 2009 00:16:51 -0000	1.2
@@ -22,7 +22,6 @@
 import java.util.Set;
 import java.util.Map.Entry;
 
-import org.lcsim.detector.DetectorElementStore;
 import org.lcsim.detector.IDetectorElement;
 import org.lcsim.detector.IReadout;
 import org.lcsim.detector.identifier.IIdentifier;
@@ -39,7 +38,7 @@
  *
  * @author tknelson
  */
-public class StripHitMaker implements StripClusterer
+public class StripHitMaker implements Clusterer
 {
     
     private static String _NAME = "StripClusterer";
@@ -73,7 +72,7 @@
         _simulation = simulation;
         _readout_chip = readout_chip;
         
-        _readout_chip.setStripClusterer(this);
+        _readout_chip.setClusterer(this);
     }
     
     // Settings for Tracker1DHitMaker
@@ -123,10 +122,10 @@
     }
     
     // Make hits for all sensors within a DetectorElement
-    public List<SiTrackerHitStrip1D> makeHits(IDetectorElement detector)
+    public List<SiTrackerHit> makeHits(IDetectorElement detector)
     {
     	System.out.println("makeHits(IDetectorElement): " + detector.getName());
-        List<SiTrackerHitStrip1D> hits = new ArrayList<SiTrackerHitStrip1D>();
+        List<SiTrackerHit> hits = new ArrayList<SiTrackerHit>();
         List<SiSensor> sensors = detector.findDescendants(SiSensor.class);
         
         // Loop over all sensors
@@ -144,12 +143,12 @@
     
     
     // Make hits for a sensor
-    public List<SiTrackerHitStrip1D> makeHits(SiSensor sensor)
+    public List<SiTrackerHit> makeHits(SiSensor sensor)
     {
        
     	//System.out.println("makeHits: " + sensor.getName());
     	
-        List<SiTrackerHitStrip1D> hits = new ArrayList<SiTrackerHitStrip1D>();
+        List<SiTrackerHit> hits = new ArrayList<SiTrackerHit>();
         
         // Get SiTrackerIdentifierHelper for this sensor and refresh the strip map used to increase speed
         _sid_helper = (SiTrackerIdentifierHelper)sensor.getIdentifierHelper();
@@ -166,7 +165,7 @@
             
             // get id and create strip map, get electrodes.
             IIdentifier id = raw_hit.getIdentifier();
-            _strip_map.put(raw_hit,_sid_helper.getStripValue(id));
+            _strip_map.put(raw_hit,_sid_helper.getElectrodeValue(id));
             
             // Get electrodes and check that they are strips
             //System.out.println("proc raw hit from: " + DetectorElementStore.getInstance().find(raw_hit.getIdentifier()).get(0).getName());
@@ -195,12 +194,12 @@
     //=========================
     
     // Make hits for an electrode
-    public List<SiTrackerHitStrip1D> makeHits(SiStrips strips, List<RawTrackerHit> raw_hits)
+    public List<SiTrackerHit> makeHits(SiSensorElectrodes electrodes, List<RawTrackerHit> raw_hits)
     {
         
 //            System.out.println("Clustering electrodes: "+electrodes_id);
         
-        List<SiTrackerHitStrip1D> hits = new ArrayList<SiTrackerHitStrip1D>();
+        List<SiTrackerHit> hits = new ArrayList<SiTrackerHit>();
         
         List<RawTrackerHit> unclustered_rawhits = new ArrayList<RawTrackerHit>(raw_hits);
         
@@ -209,7 +208,7 @@
             
             int strip_number = _strip_map.get(raw_hit);
             double signal = _readout_chip.decodeCharge(raw_hit);
-            double noise = _readout_chip.getChannel(strip_number).computeNoise(strips.getCapacitance(strip_number));
+            double noise = _readout_chip.getChannel(strip_number).computeNoise(electrodes.getCapacitance(strip_number));
             
             if (signal/noise > _seed_threshold && unclustered_rawhits.contains(raw_hit))
             {
@@ -225,7 +224,7 @@
                 {
                     cluster.addAll(clustered_hits);
                     unclustered_rawhits.removeAll(clustered_hits);
-                    clustered_hits = neighborHits(clustered_hits,unclustered_rawhits,strips);
+                    clustered_hits = neighborHits(clustered_hits,unclustered_rawhits,electrodes);
                     
 //                        System.out.println("    Cluster size:  "+cluster.size());
 //                        System.out.println("        # Unclustered hits:  "+unclustered_hits.size());
@@ -240,10 +239,10 @@
                 // Make a TrackerHit from the cluster if it meets max cluster size requirement
                 if (cluster.size() <= _max_cluster_nstrips)
                 {
-                    SiTrackerHitStrip1D hit = makeTrackerHit(cluster,strips);
+                    SiTrackerHitStrip1D hit = makeTrackerHit(cluster,electrodes);
                     
                     // Add to readout and to list of hits
-                    ((SiSensor)strips.getDetectorElement()).getReadout().addHit(hit);
+                    ((SiSensor)electrodes.getDetectorElement()).getReadout().addHit(hit);
                     hits.add(hit);
                 }
                 

lcsim/src/org/lcsim/recon/tracking/digitization/sistripsim
TrackerHitDriver.java 1.4 -> 1.5
diff -u -r1.4 -r1.5
--- TrackerHitDriver.java	20 Apr 2009 21:23:50 -0000	1.4
+++ TrackerHitDriver.java	24 Apr 2009 00:16:51 -0000	1.5
@@ -40,12 +40,15 @@
     Set<SiTrackerModule> _process_modules = new HashSet<SiTrackerModule>();
     
     //  Algorithm classes responsible for making hits
-    SiSensorSim _si_simulation = new CDFSiSensorSim();
-    ReadoutChip _readout_chip = new Kpix();
+    SiSensorSim _strip_simulation = new CDFSiSensorSim();
+    ReadoutChip _strip_readout = new Kpix();
+
+    SiSensorSim _pixel_simulation = new CDFSiSensorSim();
+    ReadoutChip _pixel_readout = new Kpix();
     
-    SiDigitizer _digitizer = new RawTrackerHitMaker(_si_simulation,_readout_chip);
-    StripClusterer _strip_clusterer = new StripHitMaker(_si_simulation,_readout_chip);
-//    PixelClusterer _pixel_clusterer = new PixelHitMaker(_pixel_simulation,_pixel_readout);
+    SiDigitizer _digitizer = new RawTrackerHitMaker(_strip_simulation,_strip_readout);
+    Clusterer _strip_clusterer = new StripHitMaker(_strip_simulation,_strip_readout);
+    Clusterer _pixel_clusterer = new PixelHitMaker(_pixel_simulation,_pixel_readout);
     StripHitCombiner _striphit_combiner = new StripHit2DMaker();
     
     /**
@@ -59,12 +62,12 @@
     }
     
     // Construct your own
-    public TrackerHitDriver(SiDigitizer digitizer, StripClusterer strip_clusterer,
-            PixelClusterer pixel_clusterer, StripHitCombiner striphit_combiner)
+    public TrackerHitDriver(SiDigitizer digitizer, Clusterer strip_clusterer,
+            Clusterer pixel_clusterer, StripHitCombiner striphit_combiner)
     {
         _digitizer = digitizer;
         _strip_clusterer = strip_clusterer;
-//        _pixel_clusterer = pixel_clusterer;
+        _pixel_clusterer = pixel_clusterer;
         _striphit_combiner = striphit_combiner;
     }
     
@@ -75,15 +78,15 @@
         _digitizer = digitizer;
     }
     
-    public void setStripClusterer(StripClusterer strip_clusterer)
+    public void setStripClusterer(Clusterer strip_clusterer)
     {
         _strip_clusterer = strip_clusterer;
     }
-    
-//    public void setPixelClusterer(PixelClusterer pixel_clusterer)
-//    {
-//        _pixel_clusterer = pixel_clusterer;
-//    }
+
+    public void setPixelClusterer(Clusterer pixel_clusterer)
+    {
+        _pixel_clusterer = pixel_clusterer;
+    }
     
     public void setStripHitCombiner(StripHitCombiner striphit_combiner)
     {
@@ -97,15 +100,15 @@
         return _digitizer;
     }
     
-    public StripClusterer getStripClusterer()
+    public Clusterer getStripClusterer()
     {
         return _strip_clusterer;
     }
     
-//    public PixelClusterer getPixelClusterer()
-//    {
-//        return _pixel_clusterer;
-//    }
+    public Clusterer getPixelClusterer()
+    {
+        return _pixel_clusterer;
+    }
     
     public StripHitCombiner getStripHitCombiner()
     {
@@ -124,10 +127,10 @@
         return _strip_clusterer.getName()+"_SiTrackerHitStrip1D";
     }
     
-//    String getPixelHitsName()
-//    {
-//        return _pixel_clusterer.getName()+"_SiTrackerHitPixel";
-//    }
+    String getPixelHitsName()
+    {
+        return _pixel_clusterer.getName()+"_SiTrackerHitPixel";
+    }
     
     public String getStripHits2DName()
     {
@@ -213,9 +216,10 @@
         
         // Lists of hits
         List<RawTrackerHit> raw_hits = new ArrayList<RawTrackerHit>();
-        List<SiTrackerHitStrip1D> hits_strip1D = new ArrayList<SiTrackerHitStrip1D>();
-        //        List<SiPixelHit> hits_pixel = new ArrayList<SiPixelHit>();
-        List<SiTrackerHitStrip2D> hits_strip2D = new ArrayList<SiTrackerHitStrip2D>();
+
+        List<SiTrackerHit> hits_strip1D = new ArrayList<SiTrackerHit>();
+        List<SiTrackerHit> hits_pixel = new ArrayList<SiTrackerHit>();
+        List<SiTrackerHit> hits_strip2D = new ArrayList<SiTrackerHit>();
         
 //       for (IDetectorElement detector_element : _process_de)        {
 //
@@ -275,7 +279,7 @@
         int flag = (1 << LCIOConstants.RTHBIT_HITS | 1 << LCIOConstants.TRAWBIT_ID1); //correct flag for persistence 
         event.put(getRawHitsName(),raw_hits,RawTrackerHit.class,flag,toString());
         event.put(getStripHits1DName(),hits_strip1D,SiTrackerHitStrip1D.class,0,toString());
-//        event.put(getPixelHitsName(),hits_pixel,SiTrackerHitPixel.class,0,toString());
+        event.put(getPixelHitsName(),hits_pixel,SiTrackerHitPixel.class,0,toString());
         event.put(getStripHits2DName(),hits_strip2D,SiTrackerHitStrip2D.class,0,toString());
 
         

lcsim/src/org/lcsim/recon/tracking/digitization/sistripsim
StripClusterer.java removed after 1.1
diff -N StripClusterer.java
--- StripClusterer.java	9 Dec 2008 22:22:34 -0000	1.1
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,37 +0,0 @@
-/*
- * StripClusterer.java
- *
- * Created on April 2, 2008, 6:51 AM
- *
- * To change this template, choose Tools | Template Manager
- * and open the template in the editor.
- */
-
-package org.lcsim.recon.tracking.digitization.sistripsim;
-
-import java.util.List;
-import org.lcsim.detector.IDetectorElement;
-import org.lcsim.detector.tracker.silicon.SiSensor;
-import org.lcsim.detector.tracker.silicon.SiStrips;
-import org.lcsim.event.RawTrackerHit;
-
-/**
- *
- * @author tknelson
- */
-public interface StripClusterer
-{
-    public String getName();
-    
-    public double getSeedThreshold();
-    
-    public double getNeighborThreshold();
-    
-    public double getClusterThreshold();
-    
-    public List<SiTrackerHitStrip1D> makeHits(IDetectorElement detector);
-    
-    public List<SiTrackerHitStrip1D> makeHits(SiSensor sensor);
-    
-    public List<SiTrackerHitStrip1D> makeHits(SiStrips strips, List<RawTrackerHit> hits);
-}

lcsim/src/org/lcsim/recon/tracking/digitization/sistripsim
ClusterMaker.java removed after 1.1
diff -N ClusterMaker.java
--- ClusterMaker.java	9 Dec 2008 22:22:34 -0000	1.1
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,23 +0,0 @@
-/*
- * ClusterMaker.java
- *
- * Created on September 26, 2007, 1:57 PM
- *
- * To change this template, choose Tools | Template Manager
- * and open the template in the editor.
- */
-
-package org.lcsim.recon.tracking.digitization.sistripsim;
-
-import org.lcsim.event.RawTrackerHit;
-import org.lcsim.event.TrackerHit;
-import java.util.List;
-
-/**
- *
- * @author tknelson
- */
-public interface ClusterMaker
-{
-    List<TrackerHit> makeClusters(List<RawTrackerHit> raw_hits);
-}

lcsim/src/org/lcsim/recon/tracking/digitization/sistripsim
PixelClusterer.java removed after 1.1
diff -N PixelClusterer.java
--- PixelClusterer.java	9 Dec 2008 22:22:34 -0000	1.1
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,30 +0,0 @@
-/*
- * PixelClusterer.java
- *
- * Created on April 2, 2008, 6:51 AM
- *
- * To change this template, choose Tools | Template Manager
- * and open the template in the editor.
- */
-
-package org.lcsim.recon.tracking.digitization.sistripsim;
-
-import java.util.List;
-import org.lcsim.detector.IDetectorElement;
-import org.lcsim.detector.tracker.silicon.SiSensor;
-import org.lcsim.event.RawTrackerHit;
-
-/**
- *
- * @author tknelson
- */
-public interface PixelClusterer
-{
-    public String getName();
-    
-    public List<SiTrackerHitPixel> makeHits(IDetectorElement detector);
-    
-    public List<SiTrackerHitPixel> makeHits(SiSensor sensor);
-
-//    public List<SiTrackerHitPixel> makeHits(SiPixels pixels, List<RawTrackerHit> hits);
-}

lcsim/src/org/lcsim/recon/tracking/digitization/sistripsim
StripClusterMaker.java removed after 1.1
diff -N StripClusterMaker.java
--- StripClusterMaker.java	9 Dec 2008 22:22:34 -0000	1.1
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,356 +0,0 @@
-/*
- * StripClusterMaker.java
- *
- * Created on September 26, 2007, 1:57 PM
- *
- * To change this template, choose Tools | Template Manager
- * and open the template in the editor.
- */
-
-package org.lcsim.recon.tracking.digitization.sistripsim;
-
-import hep.physics.matrix.Matrix;
-import hep.physics.matrix.SymmetricMatrix;
-import hep.physics.vec.BasicHep3Matrix;
-import hep.physics.vec.BasicHep3Vector;
-import hep.physics.vec.Hep3Vector;
-import hep.physics.vec.VecOp;
-import org.lcsim.event.RawTrackerHit;
-import org.lcsim.event.TrackerHit;
-import org.lcsim.detector.identifier.IExpandedIdentifier;
-import org.lcsim.detector.identifier.ExpandedIdentifier;
-
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Set;
-import org.lcsim.detector.tracker.silicon.ChargeCarrier;
-import org.lcsim.detector.tracker.silicon.DopedSilicon;
-import org.lcsim.detector.tracker.silicon.SiSensor;
-import org.lcsim.detector.tracker.silicon.SiSensorElectrodes;
-import org.lcsim.detector.tracker.silicon.SiStrips;
-import org.lcsim.event.SimTrackerHit;
-
-/**
- *
- * @author tknelson
- */
-public class StripClusterMaker implements ClusterMaker
-{
-    int _seed_threshold = 4;
-    int _neighbor_threshold = 2;
-    int _cluster_threshold = 3;
-    
-    // Temporary maps connecting electrodes to hit list, hits to strip number, electrode ID to electrodes
-    // (the last should be cached... not a model of efficiency at the moment)
-    Map<String,List<RawTrackerHit>> _hit_map = new HashMap<String,List<RawTrackerHit>>();
-    Map<RawTrackerHit,Integer> _strip_map = new HashMap<RawTrackerHit,Integer>();
-    Map<String,SiSensorElectrodes> _electrode_map = new HashMap<String,SiSensorElectrodes>();
-    
-    // Readout chip needed to decode hit information
-    ReadoutChip _readout_chip;
-    
-    // Sensor simulation needed to correct for Lorentz drift
-    SiSensorSim _simulation;
-    
-    /** Creates a new instance of StripClusterMaker */
-    public StripClusterMaker(ReadoutChip readout_chip, SiSensorSim simulation)
-    {
-        _readout_chip = readout_chip;
-        _simulation = simulation;
-    }
-    
-    public List<TrackerHit> makeClusters(List<RawTrackerHit> raw_hits)
-    {
-        
-        // clear the maps
-        _hit_map.clear();
-        _strip_map.clear();
-        _electrode_map.clear();
-        
-        List<TrackerHit> clusters = new ArrayList<TrackerHit>();
-        
-        // Sort RawTrackerHits by electrodes
-        for (RawTrackerHit raw_hit : raw_hits)
-        {
-            // FIXME: This doesn't need to be inside a loop if all the hits have
-            //        the same helper.
-            int strip_field = raw_hit.getIdentifierHelper().getFieldIndex("strip");
-            int side_field = raw_hit.getIdentifierHelper().getFieldIndex("side");
-            
-            // Get expanded ID
-            IExpandedIdentifier id = new ExpandedIdentifier(raw_hit.getExpandedIdentifier());
-            
-            // Get strip number
-            int strip_id = id.getValue(strip_field);
-            _strip_map.put(raw_hit,strip_id);
-            
-            // Get side of sensor
-            ChargeCarrier carrier = ChargeCarrier.getCarrier(id.getValue(side_field));
-            
-            // Zero strip number to refer only to electrode set
-            id.setValue(strip_field,0);
-            
-            // Fill maps needed for clustering
-            if (!_electrode_map.containsKey(id.toString()))
-            {
-//                System.out.println("Adding electrodes to map for id: "+id.toString());
-                _electrode_map.put(id.toString(),((SiSensor)raw_hit.getDetectorElement()).getReadoutElectrodes(carrier));
-                _hit_map.put(id.toString(),new ArrayList<RawTrackerHit>());
-            }
-            _hit_map.get(id.toString()).add(raw_hit);
-            
-        }
-        
-        // Do clustering for each set of electrodes
-        for (String electrodes_id : _electrode_map.keySet())
-        {
-            
-//            System.out.println("Clustering electrodes: "+electrodes_id);
-            
-            List<RawTrackerHit> hits = _hit_map.get(electrodes_id);
-            List<RawTrackerHit> unclustered_hits = new ArrayList<RawTrackerHit>(hits);
-            SiSensorElectrodes electrodes = _electrode_map.get(electrodes_id);
-            
-            for (RawTrackerHit hit : hits)
-            {
-                
-                int strip_number = _strip_map.get(hit);
-                double signal = _readout_chip.decodeCharge(hit);
-                double noise = _readout_chip.getChannel(strip_number).computeNoise(electrodes.getCapacitance(strip_number));
-                
-                if (signal/noise > _seed_threshold && unclustered_hits.contains(hit))
-                {
-                    
-//                    System.out.println("Creating new cluster, # Raw hits on electrodes is: "+hits.size());
-                    
-                    List<RawTrackerHit> cluster = new ArrayList<RawTrackerHit>();
-                    List<RawTrackerHit> clustered_hits = new ArrayList<RawTrackerHit>();
-                    
-                    clustered_hits.add(hit);
-                    
-                    while (clustered_hits.size() != 0)
-                    {
-                        cluster.addAll(clustered_hits);
-                        unclustered_hits.removeAll(clustered_hits);
-                        clustered_hits = neighborHits(clustered_hits,unclustered_hits,electrodes);
-                        
-//                        System.out.println("    Cluster size:  "+cluster.size());
-//                        System.out.println("        # Unclustered hits:  "+unclustered_hits.size());
-//                        System.out.println("        # neighbors found:  "+clustered_hits.size());
-                    }
-                    
-                    // now make a cluster or trackerhit
-                    clusters.add(makeTrackerHit(cluster,electrodes));
-                    
-                }
-            }
-            
-            
-        }
-        
-        return clusters;
-        
-    }
-    
-    private List<RawTrackerHit> neighborHits(List<RawTrackerHit> clustered_hits, List<RawTrackerHit> unclustered_hits,
-            SiSensorElectrodes electrodes)
-    {
-        List<RawTrackerHit> neighbor_hits = new ArrayList<RawTrackerHit>();
-        
-        for (RawTrackerHit seed_hit : clustered_hits)
-        {
-            Set<Integer> neighbor_cells = electrodes.getNearestNeighborCells(_strip_map.get(seed_hit));
-            for (RawTrackerHit hit : unclustered_hits)
-            {
-                int strip_number = _strip_map.get(hit);
-                double signal = _readout_chip.decodeCharge(hit);
-                double noise = _readout_chip.getChannel(strip_number).computeNoise(electrodes.getCapacitance(strip_number));
-                
-                if (neighbor_cells.contains(_strip_map.get(hit)) && signal/noise > _neighbor_threshold)
-                {
-                    neighbor_hits.add(hit);
-                }
-            }
-        }
-        return neighbor_hits;
-    }
-    
-    private TrackerHit makeTrackerHit(List<RawTrackerHit> cluster, SiSensorElectrodes electrodes)
-    {
-        Hep3Vector position = getPosition(cluster,electrodes);
-        SymmetricMatrix covariance = getCovariance(cluster,electrodes);
-        double time = getTime(cluster);
-        double energy = getEnergy(cluster);
-        TrackerHitType type = new TrackerHitType(TrackerHitType.CoordinateSystem.GLOBAL,TrackerHitType.MeasurementType.STRIP_1D);
-        
-        TrackerHit hit = new SiTrackerHitStrip1D(position, covariance, energy, time, cluster, type);
-        return hit;
-    }
-    
-//    private TrackerHit makeTrackerHit(List<RawTrackerHit> cluster, SiSensorElectrodes electrodes)
-//    {
-//        double[] position = getPosition(cluster,electrodes);
-//        SymmetricMatrix covariance = getCovariance(cluster,electrodes);
-//        double time = getTime(cluster);
-//        double energy = getEnergy(cluster);
-//        int type = 0;
-//
-//        BaseTrackerHitMC hit = new BaseTrackerHitMC(position, covariance.asPackedArray(true), time, energy, type, getSimulatedHits(cluster));
-//	hit.addRawTrackerHits(cluster);
-//        return hit;
-//    }
-    
-    private List<SimTrackerHit> getSimulatedHits(List<RawTrackerHit> cluster)
-    {
-        Set<SimTrackerHit> simulated_hits = new HashSet<SimTrackerHit>();
-        for (RawTrackerHit hit : cluster)
-        {
-            simulated_hits.addAll(hit.getSimTrackerHits());
-        }
-        return new ArrayList<SimTrackerHit>(simulated_hits);
-    }
-    
-    private Hep3Vector getPosition(List<RawTrackerHit> cluster, SiSensorElectrodes electrodes)
-    {
-        double total_charge = 0;
-        Hep3Vector position = new BasicHep3Vector(0,0,0);
-        
-        for (RawTrackerHit hit : cluster)
-        {
-            int strip_number = _strip_map.get(hit);
-            double signal = _readout_chip.decodeCharge(hit);
-            
-            total_charge += signal;
-            position = VecOp.add(position,VecOp.mult(signal,((SiStrips)electrodes).getStripCenter(strip_number)));
-        }
-        position = VecOp.mult(1/total_charge,position);
-        
-        // Put position in sensor coordinates
-        electrodes.getParentToLocal().inverse().transform(position);
-        
-//        System.out.println("Position \n"+position);
-        
-        // Swim position back through lorentz drift direction to midpoint between bias surfaces
-        _simulation.setSensor((SiSensor)electrodes.getDetectorElement());
-        _simulation.lorentzCorrect(position,electrodes.getChargeCarrier());
-        
-//        System.out.println("Lorentz corrected position \n"+position);
-        
-        // return position in global coordinates
-        return ((SiSensor)electrodes.getDetectorElement()).getGeometry().getLocalToGlobal().transformed(position);
-//        return electrodes.getLocalToGlobal().transformed(position);
-    }
-    
-    private double getTime(List<RawTrackerHit> cluster)
-    {
-        int time_sum = 0;
-        int signal_sum = 0;
-        
-        for (RawTrackerHit hit : cluster)
-        {
-            
-            int strip_number = _strip_map.get(hit);
-            double signal = _readout_chip.decodeCharge(hit);
-            double time = _readout_chip.decodeTime(hit);
-            
-            time_sum += time_sum * signal;
-            signal_sum += signal;
-            
-        }
-        return (double)time_sum/(double)signal_sum;
-    }
-    
-    private SymmetricMatrix getCovariance(List<RawTrackerHit> cluster, SiSensorElectrodes electrodes)
-    {
-        SymmetricMatrix covariance = new SymmetricMatrix(3);
-        covariance.setElement( 0, 0, Math.pow( getMeasuredResolution(cluster, electrodes), 2 ) );
-        covariance.setElement( 1, 1, Math.pow( getUnmeasuredResolution(cluster, electrodes) ,2 ) );
-        covariance.setElement( 2, 2, 0.0);
-        
-        SymmetricMatrix covariance_global = electrodes.getLocalToGlobal().transformed(covariance);
-        
-//        System.out.println("Global covariance matrix: \n"+covariance_global);
-        
-        return covariance_global;
-        
-//        BasicHep3Matrix rotation_matrix = (BasicHep3Matrix)electrodes.getLocalToGlobal().getRotation().getRotationMatrix();
-//        BasicHep3Matrix rotation_matrix_transposed = new BasicHep3Matrix(rotation_matrix);
-//        rotation_matrix_transposed.transpose();
-//
-////        System.out.println("Rotation matrix: \n"+rotation_matrix);
-////        System.out.println("Rotation matrix transposed: \n"+rotation_matrix_transposed);
-////        System.out.println("Local covariance matrix: \n"+covariance);
-//
-//        BasicHep3Matrix covariance_global = (BasicHep3Matrix)VecOp.mult(rotation_matrix,VecOp.mult(covariance,rotation_matrix_transposed));
-//
-////        System.out.println("Global covariance matrix: \n"+covariance_global);
-//
-//        return new SymmetricMatrix((Matrix)covariance_global);
-    }
-    
-    private double getMeasuredResolution(List<RawTrackerHit> cluster, SiSensorElectrodes electrodes) // should replace this by a ResolutionModel class that gives expected resolution.  This could be a big job.
-    {
-        double measured_resolution;
-        
-        double sense_pitch = ((SiSensor)electrodes.getDetectorElement()).
-                getSenseElectrodes(electrodes.getChargeCarrier()).getPitch(0);
-        
-//        double readout_pitch = electrodes.getPitch(0);
-//        double noise = _readout_chip.getChannel(strip_number).computeNoise(electrodes.getCapacitance(strip_number));
-//        double signal_expected = (0.000280/DopedSilicon.ENERGY_EHPAIR) *
-//                ((SiSensor)electrodes.getDetectorElement()).getThickness(); // ~280 KeV/mm for thick Si sensors
-        
-        if (cluster.size() == 1)
-        {
-            measured_resolution = sense_pitch / Math.sqrt(12);
-        }
-        else if (cluster.size() == 2)
-        {
-            measured_resolution = sense_pitch / 5;
-        }
-        else if (cluster.size() == 3)
-        {
-            measured_resolution = sense_pitch / 3;
-        }
-        else if (cluster.size() == 4)
-        {
-            measured_resolution = sense_pitch / 2;
-        }
-        else
-        {
-            measured_resolution = sense_pitch;
-        }
-        
-        return measured_resolution;
-    }
-    
-    private double getUnmeasuredResolution(List<RawTrackerHit> cluster, SiSensorElectrodes electrodes)
-    {
-        // Get length of longest strip in hit
-        double hit_length = 0;
-        for (RawTrackerHit hit : cluster)
-        {
-            hit_length = Math.max( hit_length, ((SiStrips)electrodes).getStripLength(_strip_map.get(hit)) );
-        }
-        return hit_length/Math.sqrt(12);
-    }
-    
-    private double getEnergy(List<RawTrackerHit> cluster)
-    {
-        double total_charge = 0.0;
-        for (RawTrackerHit hit : cluster)
-        {
-            
-            int strip_number = _strip_map.get(hit);
-            double signal = _readout_chip.decodeCharge(hit);
-            
-            total_charge += signal;
-        }
-        return total_charge * DopedSilicon.ENERGY_EHPAIR;
-    }
-    
-    
-}
CVSspam 0.2.8