Commit in lcsim/src/org/lcsim/contrib/SiStripSim on MAIN
CDFSiSensorSim.java+66-391.5 -> 1.6
Kpix.java+201.5 -> 1.6
+86-39
2 modified files
Support for changes to SiSensor and electrodes.

lcsim/src/org/lcsim/contrib/SiStripSim
CDFSiSensorSim.java 1.5 -> 1.6
diff -u -r1.5 -r1.6
--- CDFSiSensorSim.java	7 Aug 2007 18:11:40 -0000	1.5
+++ CDFSiSensorSim.java	14 Oct 2007 06:14:59 -0000	1.6
@@ -10,16 +10,19 @@
 package org.lcsim.contrib.SiStripSim;
 
 
-import org.lcsim.detector.tracker.silicon.ErrorEllipse2D;
+//import org.lcsim.detector.tracker.silicon.ErrorEllipse2D;
+
 import org.lcsim.event.SimTrackerHit;
 
-import org.lcsim.detector.IRotation3D;
-import org.lcsim.detector.RotationPassiveXYZ;
 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.ChargeCarrier;
 import org.lcsim.detector.ITransform3D;
+import org.lcsim.detector.Transform3D;
+import org.lcsim.detector.IRotation3D;
+import org.lcsim.detector.RotationPassiveXYZ;
+import org.lcsim.detector.tracker.silicon.ChargeDistribution;
+import org.lcsim.detector.tracker.silicon.GaussianDistribution2D;
 
 import hep.physics.vec.Hep3Vector;
 import hep.physics.vec.BasicHep3Vector;
@@ -27,12 +30,10 @@
 import hep.physics.vec.VecOp;
 
 import java.util.List;
-import java.util.Set;
-import java.util.HashSet;
 
 import java.util.Map;
-import java.util.SortedMap;
 import java.util.EnumMap;
+import java.util.SortedMap;
 
 /**
  *
@@ -143,7 +144,7 @@
             double segment_charge = track.getEloss()/nsegments/_sensor.getBulk().ENERGY_EHPAIR;
             
 //            System.out.println("length of subsegments: " + segment_length);
-//            System.out.println("total charge: " + segment_charge);
+//            System.out.println("subsegment charge: " + segment_charge);
             
             Hep3Vector segment_step = VecOp.mult(segment_length,track.getDirection());
             Hep3Vector segment_center = VecOp.add( track.getP1(),VecOp.mult(0.5,segment_step) );
@@ -161,19 +162,39 @@
                 {
                     if (_sensor.hasElectrodesOnSide(carrier))
                     {
+                        SiSensorElectrodes electrodes = _sensor.getElectrodes(carrier);
                         
-                        IRotation3D sensor_to_electrodes = new RotationPassiveXYZ(0.0,0.0,-_sensor.getElectrodeAngle(carrier));
+                        ChargeDistribution charge_distribution = diffusionDistribution(segment_charge,segment_center,carrier);
+                        charge_distribution.transform(electrodes.getParentToLocal());
                         
-                        Hep3Vector electrode_drift_destination = VecOp.mult(sensor_to_electrodes.getRotationMatrix(),driftDestination(segment_center,carrier));
-                        ErrorEllipse2D electrode_charge_distribution = diffusionEllipse(segment_center,carrier).rotate(-_sensor.getElectrodeAngle(carrier));
-                        
-                        SortedMap<Integer,Integer> sense_charge = _sensor.getElectrodes(carrier).
-                                computeElectrodeData(segment_charge,electrode_drift_destination,electrode_charge_distribution);
+                        SortedMap<Integer,Integer> sense_charge = electrodes.computeElectrodeData(charge_distribution);
                         
 //                        System.out.println("Sense charge map: " + sense_charge);
                         
                         _sense_data.get(carrier).add(new SiElectrodeDataCollection(sense_charge,hit));
                         
+//                        ITransform3D sensor_to_electrodes = _sensor.getElectrodes(carrier).getParentToLocal();
+//
+//                        Hep3Vector electrode_drift_destination = sensor_to_electrodes.transformed(driftDestination(segment_center,carrier));
+//
+//
+//                        ErrorEllipse2D electrode_charge_distribution = diffusionEllipse(segment_center,carrier).transformed(sensor_to_electrodes);
+                        
+                        
+                        
+                        
+//                        IRotation3D sensor_to_electrodes = new RotationPassiveXYZ(0.0,0.0,-_sensor.getElectrodeAngle(carrier));
+//
+//                        Hep3Vector electrode_drift_destination = VecOp.mult(sensor_to_electrodes.getRotationMatrix(),driftDestination(segment_center,carrier));
+//                        ErrorEllipse2D electrode_charge_distribution = diffusionEllipse(segment_center,carrier).rotate(-_sensor.getElectrodeAngle(carrier));
+//
+//                        SortedMap<Integer,Integer> sense_charge = _sensor.getElectrodes(carrier).
+//                                computeElectrodeData(segment_charge,electrode_drift_destination,electrode_charge_distribution);
+//
+////                        System.out.println("Sense charge map: " + sense_charge);
+//
+//                        _sense_data.get(carrier).add(new SiElectrodeDataCollection(sense_charge,hit));
+                        
                     }
                 }
                 
@@ -181,11 +202,10 @@
                 segment_center = VecOp.add(segment_center, segment_step);
             }
             
-//            System.out.println("Final sense charge map: " + _sense_data.get(ChargeCarrier.HOLE).getChargeMap());
-            
-            
         }
         
+//        System.out.println("Final sense charge map: " + _sense_data.get(ChargeCarrier.HOLE).getChargeMap());
+        
     }
     
     private void transferChargeToReadout()
@@ -223,7 +243,7 @@
 //                        System.out.println("sense_col : "+sense_col);
 //                        System.out.println("row_steps : "+row_steps);
 //                        System.out.println("col_steps : "+col_steps);
-//                        
+//
 //                        System.out.println("transfer_efficiencies : "+transfer_efficiencies);
                         
                         for (int irow = sense_row - row_steps; irow <= sense_row + row_steps; irow++)
@@ -287,6 +307,7 @@
         // Decide how to cut track into pieces as a fraction of strip pitch
         int nsegments = 0;
         if (!_sensor.hasElectrodesOnSide(carrier)) return nsegments;
+        SiSensorElectrodes electrodes = _sensor.getElectrodes(carrier);
         
 //        System.out.println("Track P1: " + track.getP1());
 //        System.out.println("Track P2: " + track.getP2());
@@ -298,15 +319,20 @@
         Hep3Vector deposition_line = VecOp.sub( driftDestination(track.getP2(),carrier),
                 driftDestination(track.getP1(),carrier) );
         
-        int naxes = _sensor.getElectrodes(carrier).getNAxes();
+        int naxes = electrodes.getNAxes();
         for (int iaxis = 0; iaxis < naxes; iaxis++)
         {
-            double projected_deposition_length = Math.abs(VecOp.dot(deposition_line,_sensor.getMeasuredCoordinates(carrier)[iaxis]));
+            IRotation3D electrode_to_sensor = electrodes.getParentToLocal().getRotation().inverse();
+            Hep3Vector measured_coordinate = electrode_to_sensor.rotated(electrodes.getMeasuredCoordinate(iaxis));
+            
+            double projected_deposition_length = Math.abs(VecOp.dot(deposition_line,measured_coordinate));
+            
+//            double projected_deposition_length = Math.abs(VecOp.dot(deposition_line,_sensor.getMeasuredCoordinates(carrier)[iaxis]));
             
 //            System.out.println("Projected deposition Length: " + projected_deposition_length);
             
             int required_segments = (int)Math.ceil(projected_deposition_length/
-                    (deposition_granularity*_sensor.getElectrodes(carrier).getPitch(iaxis)));
+                    (deposition_granularity*electrodes.getPitch(iaxis)));
             nsegments = Math.max(nsegments,required_segments);
         }
         return nsegments;
@@ -315,7 +341,7 @@
     
     private Hep3Vector driftDestination(Hep3Vector origin, ChargeCarrier carrier)
     {
-//        System.out.println("Beginning driftDestination");
+//        System.out.println("Beginning driftDestination for origin: "+origin);
         return VecOp.add(origin,driftVector(origin, carrier));
     }
     
@@ -355,17 +381,15 @@
         
     }
     
-    
-    private ErrorEllipse2D diffusionEllipse(Hep3Vector point, ChargeCarrier carrier)
+    private ChargeDistribution diffusionDistribution(double segment_charge, Hep3Vector origin, ChargeCarrier carrier)
     {
         
+//        System.out.println("Calculating charge distribution for carrier: "+carrier);
+        
         // Common factors
         double difference_V = _sensor.getBiasVoltage() - _sensor.getDepletionVoltage();
         double sum_V = _sensor.getBiasVoltage() + _sensor.getDepletionVoltage();
-        double common_factor = 2.0*_sensor.distanceFromSide(point,carrier)*_sensor.getDepletionVoltage()/_sensor.getThickness();
-        
-//        System.out.println("sum_V: "+sum_V);
-//        System.out.println("common_factor: "+common_factor);
+        double common_factor = 2.0*_sensor.distanceFromSide(origin,carrier)*_sensor.getDepletionVoltage()/_sensor.getThickness();
         
         // Calculate charge spreading without magnetic field
         double sigmasq = _sensor.getBulk().K_BOLTZMANN * _sensor.getBulk().getTemperature() *
@@ -381,26 +405,29 @@
         
         double sigma = Math.sqrt(sigmasq);
         
-//        System.out.println("Sigma: "+sigma);
-        
         // Corrections for magnetic field -- this is an approximation, may have to be done better for high fields
         double cos_theta_lorentz = VecOp.cosTheta(_drift_direction.get(carrier));
         double phi_lorentz = VecOp.phi(_drift_direction.get(carrier));
-        double phi_electrode = _sensor.getElectrodeAngle(carrier);
         
-        double minor_axis = sigma*(1.0/cos_theta_lorentz); // drift time correction
-        double major_axis = minor_axis*(1.0/cos_theta_lorentz); // + drift angle correction
-        double phi_ellipse = -phi_electrode; // orientation of ellipse, relative to electrode coordinates
+        double minor_axis_length = sigma*(1.0/cos_theta_lorentz); // drift time correction
+        double major_axis_length = minor_axis_length*(1.0/cos_theta_lorentz); // + drift angle correction
+        
+        // FIXME: this has a Z component!!! (is that OK??)
+        Hep3Vector drift_destination = driftDestination(origin,carrier);
+        
+//        System.out.println("Drift destination: "+drift_destination);
         
-//        System.out.println("Minor axis: "+minor_axis);
-//        System.out.println("Major axis: "+major_axis);
+        ChargeDistribution distribution = new GaussianDistribution2D(segment_charge, drift_destination,new BasicHep3Vector(major_axis_length,0.0,0.0),new BasicHep3Vector(0.0,minor_axis_length,0.0));
         
-        // Create error ellipse
-        return new ErrorEllipse2D(major_axis, minor_axis, phi_ellipse);
+        ITransform3D phi_rotation = new Transform3D(new RotationPassiveXYZ(0.0,0.0,-phi_lorentz));
+        distribution.transform(phi_rotation);
+        
+//        System.out.println("Done calculating charge distribution for carrier: "+carrier);
+        
+        return distribution;
         
     }
     
-    
 }
 
 

lcsim/src/org/lcsim/contrib/SiStripSim
Kpix.java 1.5 -> 1.6
diff -u -r1.5 -r1.6
--- Kpix.java	10 Jul 2007 23:43:19 -0000	1.5
+++ Kpix.java	14 Oct 2007 06:14:59 -0000	1.6
@@ -70,6 +70,26 @@
         return;
     }
     
+    
+//    private SiElectrodeDataCollection digitize(SiElectrodeDataCollection electrode_charge)
+//    {        
+//        
+//        SiElectrodeDataCollection digitized_charge = new SiElectrodeDataCollection();
+//                
+//        for (Integer channel : electrode_charge.keySet())
+//        {
+//
+//            SiElectrodeData analog = electrode_charge.get(channel);
+//
+//            double gain = _high_gain; 
+//            
+//            int digital = (int)Math.floor(analog.getCharge() * gain);
+//           
+//            if (digital != 0) digitized_charge.put(channel,new SiElectrodeData(digital);
+//        }
+//        return digitized_charge;
+//    }    
+    
     private SortedMap<Integer,Integer> digitize(SortedMap<Integer,Integer> electrode_charge)
     {        
         
CVSspam 0.2.8