Print

Print


Commit in GeomConverter/src/org/lcsim/detector/tracker/silicon on MAIN
ChargeCarrier.java+1-11.2 -> 1.3
SiSensor.java+17-161.5 -> 1.6
SiSensorElectrodes.java+22-71.3 -> 1.4
SiStrips.java+74-31.6 -> 1.7
+114-27
4 modified files
- Changes to support extraction of algorithms and data to org.lcsim.  Existing SiSensor and test code continues to work.
- Added cell neighboring code to SiSensorElectrodes/SiStrips

GeomConverter/src/org/lcsim/detector/tracker/silicon
ChargeCarrier.java 1.2 -> 1.3
diff -u -r1.2 -r1.3
--- ChargeCarrier.java	7 May 2007 21:22:49 -0000	1.2
+++ ChargeCarrier.java	18 May 2007 21:56:34 -0000	1.3
@@ -44,7 +44,7 @@
     }
     
     // Methods
-    int charge()
+    public int charge()
     {return _charge;}
     double mu0(double temperature)
     {return _mu_0_factor * Math.pow( (temperature/300.0), _mu_0_exponent);}

GeomConverter/src/org/lcsim/detector/tracker/silicon
SiSensor.java 1.5 -> 1.6
diff -u -r1.5 -r1.6
--- SiSensor.java	8 May 2007 23:39:47 -0000	1.5
+++ SiSensor.java	18 May 2007 21:56:34 -0000	1.6
@@ -56,7 +56,8 @@
     private int _sensorid;
     
     // electrodes, electrode angles and orientation of sensor
-    private Map<ChargeCarrier, SiSensorElectrodes> _electrodes = new EnumMap<ChargeCarrier,SiSensorElectrodes>(ChargeCarrier.class);
+    private Map<ChargeCarrier, SiSensorElectrodes> _sense_electrodes = new EnumMap<ChargeCarrier,SiSensorElectrodes>(ChargeCarrier.class);
+    private Map<ChargeCarrier, SiSensorElectrodes> _readout_electrodes = new EnumMap<ChargeCarrier,SiSensorElectrodes>(ChargeCarrier.class);
     private Map<ChargeCarrier, Double> _electrode_angles = new EnumMap<ChargeCarrier,Double>(ChargeCarrier.class);
     private Orientation _orientation;
 
@@ -108,7 +109,7 @@
     
     public void setElectrodes(ChargeCarrier carrier, SiSensorElectrodes electrodes)
     {
-        _electrodes.put(carrier,electrodes);
+        _sense_electrodes.put(carrier,electrodes);
     }
     
     public void setElectrodeAngle(ChargeCarrier carrier, double electrode_angle)
@@ -149,7 +150,7 @@
     
     public SiSensorElectrodes getElectrodes(ChargeCarrier carrier)
     {
-        return _electrodes.get(carrier);
+        return _sense_electrodes.get(carrier);
     }
     
     public double getElectrodeAngle(ChargeCarrier carrier)
@@ -204,10 +205,10 @@
         
     }
         
-    
-    
-    
-    
+    public Hep3Vector[] getMeasuredCoordinates(ChargeCarrier carrier)
+    {
+        return _measured_coordinates.get(carrier);
+    }
     
     
     // Operators
@@ -234,7 +235,7 @@
                 double electrode_angle = getElectrodeAngle(carrier); 
 //                System.out.println("Electrode angle: "+electrode_angle);                                        
                
-                int naxes = _electrodes.get(carrier).getNAxes();
+                int naxes = _sense_electrodes.get(carrier).getNAxes();
 //                System.out.println("# axes "+naxes);                                        
 
                 Hep3Vector[] measured_coordinates = new Hep3Vector[naxes];
@@ -261,7 +262,7 @@
         else return -_thickness/2.0;
     }
     
-    private double distanceFromSide(Hep3Vector point, ChargeCarrier carrier)
+    public double distanceFromSide(Hep3Vector point, ChargeCarrier carrier)
     {
 //        System.out.println("Beginning distanceFromSide");        
         double distance =  Math.abs(point.z() - zOfSide(carrier));
@@ -273,7 +274,7 @@
     
     public boolean hasElectrodesOnSide(ChargeCarrier carrier)
     {
-        if(_electrodes.get(carrier) == null) return false;
+        if(_sense_electrodes.get(carrier) == null) return false;
         else return true;
     }
     
@@ -389,7 +390,7 @@
     {
         for (ChargeCarrier carrier : ChargeCarrier.values())
         {
-            if (hasElectrodesOnSide(carrier)) _electrodes.get(carrier).clear();
+            if (hasElectrodesOnSide(carrier)) _sense_electrodes.get(carrier).clear();
         }        
     }
    
@@ -410,14 +411,14 @@
         Hep3Vector deposition_line = VecOp.sub( driftDestination(track.getP2(),carrier),
                 driftDestination(track.getP1(),carrier) );
        
-        int naxes = _electrodes.get(carrier).getNAxes();                        
+        int naxes = _sense_electrodes.get(carrier).getNAxes();                        
         for (int iaxis = 0; iaxis < naxes; iaxis++)
         {
             double projected_deposition_length = Math.abs(VecOp.dot(deposition_line,_measured_coordinates.get(carrier)[iaxis]));
 
 //            System.out.println("Projected deposition Length: " + projected_deposition_length);
             
-            int required_segments = (int)Math.ceil(projected_deposition_length/(deposition_granularity*_electrodes.get(carrier).getPitch(iaxis)));
+            int required_segments = (int)Math.ceil(projected_deposition_length/(deposition_granularity*_sense_electrodes.get(carrier).getPitch(iaxis)));
             nsegments = Math.max(nsegments,required_segments);
         }   
         return nsegments;
@@ -474,7 +475,7 @@
                         
                         Hep3Vector electrode_drift_destination = VecOp.mult(sensor_to_electrodes.getRotationMatrix(),driftDestination(segment_center,carrier));
                         ErrorEllipse2D electrode_charge_distribution = diffusionEllipse(segment_center,carrier).rotate(-getElectrodeAngle(carrier));
-                       _electrodes.get(carrier).depositCharge(segment_charge,electrode_drift_destination,electrode_charge_distribution);
+                       _sense_electrodes.get(carrier).depositCharge(segment_charge,electrode_drift_destination,electrode_charge_distribution);
                     }
                 }
                 
@@ -550,7 +551,7 @@
 //                _measured_coordinate.get(carrier) );
 //        double diffusion_sigma = diffusionSigma(origin,carrier);
 //        
-//        _electrodes.get(carrier).depositCharge(new BasicHep3Vector(drift_destination,0.0,0.0),charge,diffusion_sigma);
+//        _sense_electrodes.get(carrier).depositCharge(new BasicHep3Vector(drift_destination,0.0,0.0),charge,diffusion_sigma);
 //      
 //    }    
     
@@ -612,7 +613,7 @@
 //
 //        double projected_deposition_length = VecOp.dot(deposition_line,_measured_coordinate.get(carrier));
 //        
-//        return (int)Math.ceil(projected_deposition_length/(deposition_granularity*_electrodes.get(carrier).getPitch()));
+//        return (int)Math.ceil(projected_deposition_length/(deposition_granularity*_sense_electrodes.get(carrier).getPitch()));
 //    }
     
     

GeomConverter/src/org/lcsim/detector/tracker/silicon
SiSensorElectrodes.java 1.3 -> 1.4
diff -u -r1.3 -r1.4
--- SiSensorElectrodes.java	7 May 2007 21:22:49 -0000	1.3
+++ SiSensorElectrodes.java	18 May 2007 21:56:34 -0000	1.4
@@ -10,7 +10,7 @@
 package org.lcsim.detector.tracker.silicon;
 
 import hep.physics.vec.Hep3Vector;
-import java.util.Map;
+import java.util.SortedMap;
 
 /**
  *
@@ -21,14 +21,26 @@
     // Cell shape, assumed to be a polygon with an even number of sides (1=strip, 2=rectagular pixel, 3=hexagon, etc...)
     public int getNAxes();
     
+    // Direction of each measured coordinate
+    public Hep3Vector getMeasuredCoordinate(int axis);
+    
+    // Neigbor ncells away along each axis
+    public int getNeighborCell(int cell, int axis, int ncells);
+
+    // Cell number is valid
+    public boolean isValidCell(int cell);
+    
+    // Cell number along this coordinate is valid
+    public boolean isValidCell(int cell, int axis);
+    
     // Number of cells (strips or pixels)
     public int getNCells();
     
     // Number of cells along each axis
-    public int getNCells(int direction);
+    public int getNCells(int axis);
     
     // Size of a cell (strip or pixel pitch)
-    public double getPitch(int direction);
+    public double getPitch(int axis);
     
     // Position of a particular cell (by cell number)
     public Hep3Vector getCellPosition(int cell_id);
@@ -39,12 +51,15 @@
     // Location of given position within a cell
     public Hep3Vector getPositionInCell(Hep3Vector position);
     
-    // Deposit Gaussian-distributed charge on electrodes
+    // Compute Gaussian-distributed charge on electrodes
+    public SortedMap<Integer,Integer> computeElectrodeData(double charge, Hep3Vector position, ErrorEllipse2D distribution);
+    
+    // Deposit Gaussian-distributed charge on electrodes - deprecated
     public void depositCharge(double charge, Hep3Vector position, ErrorEllipse2D distribution);
     
-    // Get map of charge deposition on electrodes
-    public Map<Integer,Integer> getChargeMap();
+    // Get map of charge deposition on electrodes - deprecated
+    public SortedMap<Integer,Integer> getChargeMap();
     
-    // Clear charge from electrodes
+    // Clear charge from electrodes - deprecated
     public void clear();
 }

GeomConverter/src/org/lcsim/detector/tracker/silicon
SiStrips.java 1.6 -> 1.7
diff -u -r1.6 -r1.7
--- SiStrips.java	8 May 2007 06:41:53 -0000	1.6
+++ SiStrips.java	18 May 2007 21:56:34 -0000	1.7
@@ -161,21 +161,49 @@
         return 1;
     }
     
+    public Hep3Vector getMeasuredCoordinate(int axis)
+    {
+        if (axis == 0) return new BasicHep3Vector(1.0,0.0,0.0);
+        else return null;
+    }
+    
+    public int getNeighborCell(int cell, int axis, int ncells)
+    {
+        if (axis == 0)
+        {
+            int neighbor_cell = cell + ncells;
+            if (isValidCell(neighbor_cell, axis)) return neighbor_cell;
+            else return -1;
+        }
+        else return -1;
+        
+    }
+    
+    public boolean isValidCell(int cell)
+    {
+        return (cell >= 0 && cell < getNCells());
+    }
+    
+    public boolean isValidCell(int cell, int axis)
+    {
+        return (cell >= 0 && cell < getNCells(axis));
+    }
+    
     public int getNCells()
     {
         return getNReadoutStrips();
     }
     
-    public int getNCells(int direction)
+    public int getNCells(int axis)
     {
-        if (direction == 0)
+        if (axis == 0)
         {
             return getNReadoutStrips();
         }
         else return 1;
     }
     
-    public double getPitch(int direction)
+    public double getPitch(int axis)
     {
         return getReadoutPitch();
     }
@@ -201,6 +229,49 @@
         return _strip_charge;
     }
         
+    public SortedMap<Integer,Integer> computeElectrodeData(double charge, Hep3Vector position, ErrorEllipse2D distribution)
+    {
+
+        SortedMap<Integer,Integer> electrode_data = new TreeMap<Integer,Integer>();
+        
+        int base_strip = getSenseStripID(position);
+
+        Hep3Vector interstrip_position = getPositionInSenseCell(position);
+
+        // put charge on strips in window 3-sigma strips on each side of base strip
+        double pitch = getSensePitch();
+        double axis_angle = 0.0;
+        
+        int window_size = (int)Math.ceil(3.0*distribution.sigma1D(axis_angle)/pitch);
+        
+        double erfc_lower = 1.0;
+        double erfc_upper = 1.0;
+    
+        for (int istrip = base_strip-window_size; istrip <= base_strip+window_size; istrip++)
+        {
+            
+            double cell_edge_upper = getSenseStripPosition(istrip).x() + pitch/2.0;
+          
+            double erfc_limit = cell_edge_upper-position.x();
+            
+            erfc_upper = distribution.erfc1D(erfc_limit,axis_angle);
+
+            if (erfc_lower<erfc_upper) System.out.println("SQUEAL LIKE A PIG!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
+            
+            int strip_charge = (int)Math.round( (erfc_lower-erfc_upper) * charge);
+                        
+            if (strip_charge != 0)
+            {
+                electrode_data.put(istrip,strip_charge);
+            }
+            
+            erfc_lower = erfc_upper;
+            
+        }
+        return electrode_data;
+    }
+    
+    
     public void depositCharge(double charge, Hep3Vector position, ErrorEllipse2D distribution)
     {
 //        System.out.println("Beginning depositCharge");
CVSspam 0.2.8