Commit in lcsim on MAIN
src/org/lcsim/contrib/SiStripSim/CDFSiSensorSim.java+75-241.6 -> 1.7
                                /SiElectrodeDataCollection.java+2-71.2 -> 1.3
                                /SiElectrodeData.java-111.4 -> 1.5
                                /StripClusterMaker.java+3-161.5 -> 1.6
test/org/lcsim/detector/driver/TrackerDigitizationDriverTest.java+3-31.6 -> 1.7
                              /TrackerHitDriverTest.java+19-191.2 -> 1.3
+102-80
6 modified files
Biggest change is CDFSiSensorSim that makes no asumptions about the local direction of the electric field.  This is required to allow for forward sensors that must have electrodes on different faces than in barrel.
Changed StripClusterMaker to work with the new hit information
Stripped out some junk in SiElectrodeData and related Collection
Updated tests (no real changes)

lcsim/src/org/lcsim/contrib/SiStripSim
CDFSiSensorSim.java 1.6 -> 1.7
diff -u -r1.6 -r1.7
--- CDFSiSensorSim.java	14 Oct 2007 06:14:59 -0000	1.6
+++ CDFSiSensorSim.java	3 Dec 2007 23:30:10 -0000	1.7
@@ -9,18 +9,14 @@
 
 package org.lcsim.contrib.SiStripSim;
 
-
-//import org.lcsim.detector.tracker.silicon.ErrorEllipse2D;
-
+import org.lcsim.detector.solids.GeomOp3D;
 import org.lcsim.event.SimTrackerHit;
 
 import org.lcsim.detector.tracker.silicon.SiSensor;
 import org.lcsim.detector.tracker.silicon.SiSensorElectrodes;
 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;
 
@@ -82,31 +78,44 @@
     // Simulate charge deposition
     public void simulate(SiSensor sensor)
     {
+//        System.out.println("# Sense strips: " + sensor.getSenseElectrodes(ChargeCarrier.HOLE).getNCells(0));
+//        System.out.println("# Readout strips: " + sensor.getReadoutElectrodes(ChargeCarrier.HOLE).getNCells(0));
+        
         _sensor = sensor;
         depositChargeOnSense();
         transferChargeToReadout();
         clearSense();
     }
     
-    private void clearSense()
+    public void clearReadout()
     {
         for (ChargeCarrier carrier : ChargeCarrier.values())
         {
-            _sense_data.get(carrier).clear();
+            _readout_data.get(carrier).clear();
         }
     }
     
-    public void clearReadout()
+    // Private
+    private void clearSense()
     {
         for (ChargeCarrier carrier : ChargeCarrier.values())
         {
-            _readout_data.get(carrier).clear();
+            _sense_data.get(carrier).clear();
         }
     }
     
     private void depositChargeOnSense()
     {
         
+        // Set up drift directions // FIXME: put this in a setup method.
+        for (ChargeCarrier carrier : ChargeCarrier.values())
+        {
+            if (_sensor.hasElectrodesOnSide(carrier))
+            {
+                _drift_direction.put( carrier, this.driftDirection(carrier,new BasicHep3Vector(0.0,0.0,0.0)) );
+            }
+        }
+        
         ITransform3D global_to_sensor = _sensor.getGeometry().getGlobalToLocal();
         List<SimTrackerHit> hits = _sensor.getReadout().getHits(SimTrackerHit.class);
         
@@ -121,9 +130,9 @@
             // Compute number of segments
             for (ChargeCarrier carrier : ChargeCarrier.values())
             {
-                _drift_direction.put( carrier, this.driftDirection(carrier,new BasicHep3Vector(0.0,0.0,0.0)) );
                 if (_sensor.hasElectrodesOnSide(carrier))
                 {
+//                    _drift_direction.put( carrier, this.driftDirection(carrier,new BasicHep3Vector(0.0,0.0,0.0)) );
                     nsegments = Math.max(nsegments,nSegments(track,carrier, _DEPOSITION_GRANULARITY));
                 }
             }
@@ -162,7 +171,7 @@
                 {
                     if (_sensor.hasElectrodesOnSide(carrier))
                     {
-                        SiSensorElectrodes electrodes = _sensor.getElectrodes(carrier);
+                        SiSensorElectrodes electrodes = _sensor.getSenseElectrodes(carrier);
                         
                         ChargeDistribution charge_distribution = diffusionDistribution(segment_charge,segment_center,carrier);
                         charge_distribution.transform(electrodes.getParentToLocal());
@@ -243,7 +252,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++)
@@ -265,7 +274,7 @@
 //                                System.out.println("readout_cell : "+readout_cell);
                                 
 //                                System.out.println("position_in_cell : "+readout_electrodes.getPositionInCell(sense_position));
-                                
+//
 //                                System.out.println("Sense position : "+sense_electrodes.getCellPosition(sense_id));
 //                                System.out.println("Readout position : "+readout_electrodes.getCellPosition(readout_cell));
                                 
@@ -307,14 +316,16 @@
         // 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);
+        SiSensorElectrodes electrodes = _sensor.getSenseElectrodes(carrier);
         
 //        System.out.println("Track P1: " + track.getP1());
 //        System.out.println("Track P2: " + track.getP2());
 //        System.out.println("Drift Destination of P1: " + driftDestination(track.getP1(),carrier));
 //        System.out.println("Drift Destination of P2: " + driftDestination(track.getP2(),carrier));
         
-        nsegments = (int)Math.ceil(track.getVector().z()/(_sensor.getThickness()*deposition_granularity));
+        nsegments = (int)Math.ceil(Math.abs(VecOp.dot(track.getVector(),electrodes.getGeometry().getNormal()))/(_sensor.getThickness()*deposition_granularity));
+        
+//        nsegments = (int)Math.ceil(track.getVector().z()/(_sensor.getThickness()*deposition_granularity));  // old way
         
         Hep3Vector deposition_line = VecOp.sub( driftDestination(track.getP2(),carrier),
                 driftDestination(track.getP1(),carrier) );
@@ -348,7 +359,10 @@
     private Hep3Vector driftVector(Hep3Vector origin, ChargeCarrier carrier)
     {
 //        System.out.println("Beginning driftVector");
-        double drift_vector_scale = _sensor.distanceFromSide(origin,carrier)/_drift_direction.get(carrier).z();
+        
+        double drift_vector_scale = _sensor.distanceFromSide(origin,carrier)/VecOp.dot(_drift_direction.get(carrier),_sensor.getBiasSurface(carrier).getNormal());
+//        double drift_vector_scale = _sensor.distanceFromSide(origin,carrier)/_drift_direction.get(carrier).z();
+        
         return VecOp.mult(drift_vector_scale,_drift_direction.get(carrier));
     }
     
@@ -406,21 +420,58 @@
         double sigma = Math.sqrt(sigmasq);
         
         // 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 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
+        // Special case if field is parallel to drift direction
+        Hep3Vector drift_direction = _drift_direction.get(carrier);
+        Hep3Vector bias_surface_normal = _sensor.getBiasSurface(carrier).getNormal();
+        
+        Hep3Vector major_axis;
+        Hep3Vector minor_axis;
         
-        // FIXME: this has a Z component!!! (is that OK??)
+        double major_axis_length;
+        double minor_axis_length;
+        
+        if (VecOp.cross(drift_direction,bias_surface_normal).magnitude() < GeomOp3D.ANGULAR_TOLERANCE)
+        {
+            major_axis = VecOp.cross(bias_surface_normal,_sensor.getBiasSurface(carrier).getEdges().get(0).getDirection()); // arbitrary vector in plane
+            minor_axis = VecOp.cross(bias_surface_normal,major_axis);
+            
+            major_axis_length = minor_axis_length = sigma;
+        }
+        else
+        {
+            major_axis = VecOp.unit(VecOp.cross(bias_surface_normal,VecOp.cross(_drift_direction.get(carrier),bias_surface_normal)));
+            minor_axis = VecOp.cross(bias_surface_normal,major_axis);
+            
+//        double phi_lorentz = VecOp.phi(_drift_direction.get(carrier));  // FIXME: careful here... calculate axis directions to instantiate distribution.
+            // Project-to-plane would definitely be convenient here!!!
+            
+            double cos_theta_lorentz = VecOp.dot(_drift_direction.get(carrier),_sensor.getBiasSurface(carrier).getNormal());
+//        double cos_theta_lorentz = VecOp.cosTheta(_drift_direction.get(carrier));                                 // FIXME: careful with cosTheta here!            
+//        System.out.println("Cos theta lorentz: "+cos_theta_lorentz);
+            
+            minor_axis_length = sigma*(1.0/cos_theta_lorentz); // drift time correction
+            major_axis_length = minor_axis_length*(1.0/cos_theta_lorentz); // + drift angle correction
+        }
+        
+        
+        major_axis = VecOp.mult(major_axis_length,major_axis);
+        minor_axis = VecOp.mult(minor_axis_length,minor_axis);
+        
+//        System.out.println("Major axis: "+major_axis);
+//        System.out.println("Minor axis: "+minor_axis);
+        
+        // FIXME: this has a Z component!!! (is that OK??  I think the whole thing transforms into the electrode coordinates before integrating charge.)
         Hep3Vector drift_destination = driftDestination(origin,carrier);
         
 //        System.out.println("Drift destination: "+drift_destination);
         
-        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));
+        ChargeDistribution distribution = new GaussianDistribution2D(segment_charge, drift_destination,major_axis,minor_axis);
         
-        ITransform3D phi_rotation = new Transform3D(new RotationPassiveXYZ(0.0,0.0,-phi_lorentz));
-        distribution.transform(phi_rotation);
+//        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));
+//
+//        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);
         

lcsim/src/org/lcsim/contrib/SiStripSim
SiElectrodeDataCollection.java 1.2 -> 1.3
diff -u -r1.2 -r1.3
--- SiElectrodeDataCollection.java	10 Jul 2007 23:43:19 -0000	1.2
+++ SiElectrodeDataCollection.java	3 Dec 2007 23:30:10 -0000	1.3
@@ -33,8 +33,8 @@
         {
             this.add(cellid,electrode_data.get(cellid));
         }
-    }    
-
+    }
+    
     // Create from a map of electrode charges for a single SimTrackerHit
     public SiElectrodeDataCollection(SortedMap<Integer,Integer> electrode_charge, SimTrackerHit hit)
     {
@@ -53,11 +53,6 @@
         }
         return charge_map;
     }
-        
-    public void putChargeMap(SortedMap<Integer,Integer> charge_map)
-    {
-        this.getChargeMap().putAll(charge_map);
-    }
     
     public void add(SortedMap<Integer,SiElectrodeData> electrode_data_collection)
     {

lcsim/src/org/lcsim/contrib/SiStripSim
SiElectrodeData.java 1.4 -> 1.5
diff -u -r1.4 -r1.5
--- SiElectrodeData.java	6 Nov 2007 19:58:03 -0000	1.4
+++ SiElectrodeData.java	3 Dec 2007 23:30:10 -0000	1.5
@@ -52,11 +52,6 @@
         return _charge;
     }
     
-    public void putCharge(int charge)
-    {
-        _charge = charge;
-    }
-    
     public Set<SimTrackerHit> getSimulatedHits()
     {
         return _simulated_hits;
@@ -90,10 +85,4 @@
         return this;
     }    
    
-    public SiElectrodeData scaleCharge(double scale_factor)
-    {
-        _charge *= scale_factor;
-        return this;
-    }
-   
 }

lcsim/src/org/lcsim/contrib/SiStripSim
StripClusterMaker.java 1.5 -> 1.6
diff -u -r1.5 -r1.6
--- StripClusterMaker.java	21 Nov 2007 22:26:39 -0000	1.5
+++ StripClusterMaker.java	3 Dec 2007 23:30:10 -0000	1.6
@@ -27,12 +27,11 @@
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Set;
-import org.lcsim.detector.Rotation3D;
-import org.lcsim.detector.RotationPassiveXYZ;
 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;
 import org.lcsim.event.base.BaseTrackerHitMC;
 
@@ -101,19 +100,7 @@
             _strip_map.put(raw_hit,strip_id);
             
             // Get side of sensor
-            ChargeCarrier carrier;
-            if (id.getValue(side_field) == 1)
-            {
-                carrier = ChargeCarrier.HOLE;
-            }
-            else if (id.getValue(side_field) == -1)
-            {
-                carrier = ChargeCarrier.ELECTRON;
-            }
-            else
-            {
-                throw new RuntimeException("Invalid side field in RawTrackerHit.");
-            }
+            ChargeCarrier carrier = ChargeCarrier.getCarrier(id.getValue(side_field));
             
             // Zero strip number to refer only to electrode set
             id.setValue(strip_field,0);
@@ -237,7 +224,7 @@
             double signal = _readout_chip.decodeCharge(hit);
             
             total_charge += signal;
-            position = VecOp.add(position,VecOp.mult(signal,electrodes.getCellPosition(_strip_map.get(hit))));
+            position = VecOp.add(position,VecOp.mult(signal,((SiStrips)electrodes).getStripCenter(_strip_map.get(hit))));
         }
         position = VecOp.mult(1/total_charge,position);
         

lcsim/test/org/lcsim/detector/driver
TrackerDigitizationDriverTest.java 1.6 -> 1.7
diff -u -r1.6 -r1.7
--- TrackerDigitizationDriverTest.java	30 Nov 2007 01:03:45 -0000	1.6
+++ TrackerDigitizationDriverTest.java	3 Dec 2007 23:30:11 -0000	1.7
@@ -94,7 +94,7 @@
                         if (!hits.isEmpty())
                         {
                             
-//                            System.out.println("Simulating sensor: "+sensor.getName());
+//                            System.out.println("\n"+"Simulating sensor: "+sensor.getName());
                             
                             List<RawTrackerHit> raw_hits = new ArrayList<RawTrackerHit>();
                             si_simulation.simulate(sensor);
@@ -109,7 +109,7 @@
                                     SortedMap<Integer,List<Integer>> digitized_hits = kpix.readout(si_simulation.getReadoutData(carrier),sensor.getReadoutElectrodes(carrier));
                                     
                                     // Create RawTrackerHits
-                                    
+                                     
                                     for (Integer readout_cell : digitized_hits.keySet())
                                     {
                                         int time = 0;
@@ -126,7 +126,7 @@
 //                                        System.out.println("ADC data for cell "+readout_cell+": "+
 //                                                raw_hit.getADCValues()[0]+", "+raw_hit.getADCValues()[1]);
                                        
-//                                        double signal = kpix.decodeCharge(raw_hit);
+                                        double signal = kpix.decodeCharge(raw_hit);
 //                                        System.out.println("Readout data for cell "+readout_cell+": "+signal);
                                         
                                     }

lcsim/test/org/lcsim/detector/driver
TrackerHitDriverTest.java 1.2 -> 1.3
diff -u -r1.2 -r1.3
--- TrackerHitDriverTest.java	30 Nov 2007 01:03:45 -0000	1.2
+++ TrackerHitDriverTest.java	3 Dec 2007 23:30:11 -0000	1.3
@@ -60,7 +60,7 @@
         loop.add( new SimTrackerHitIdentifierReadoutDriver(new String[] {"SiTrackerBarrel_RO"} ) );
         loop.add( new TKNRawHitsDriverV1(new String[]{"SiTrackerBarrel_RO"},new String[]{"RawBarrelTrackerHits"}));
         loop.add( new TestDriver() );
-        loop.loop(1, null);
+        loop.loop(10, null);
         loop.dispose();
     }
     
@@ -80,20 +80,20 @@
             List<RawTrackerHit> raw_hits = header.get(RawTrackerHit.class, "RawBarrelTrackerHits");
             List<TrackerHit> hits = cluster_maker.makeClusters(raw_hits);
             
-            System.out.println("# hits in event: "+hits.size());
-            for (TrackerHit hit : hits)
-            {
-                BaseTrackerHitMC mc_hit = (BaseTrackerHitMC)hit;
-                System.out.println("    # MCParticles contributing: "+mc_hit.mcParticles().size());
-                for (MCParticle particle : mc_hit.mcParticles())
-                {
-                    System.out.println("        MCParticle type: "+particle.getPDGID());
-                    System.out.println("        MCParticle momentum: "+particle.getMomentum());
-                }
-                System.out.println("    Charge in cluster (electrons): "+mc_hit.getdEdx()/DopedSilicon.ENERGY_EHPAIR);
-                System.out.println("    Position: "+new BasicHep3Vector(mc_hit.getPosition()));
-                System.out.println("    Covariance matrix: \n"+(new SymmetricMatrix(3,mc_hit.getCovMatrix(),true)));
-                System.out.println("    # SimTrackerHits contributing to cluster: "+mc_hit.getRawHits().size());
+//            System.out.println("# hits in event: "+hits.size());
+//            for (TrackerHit hit : hits)
+//            {
+//                BaseTrackerHitMC mc_hit = (BaseTrackerHitMC)hit;
+//                System.out.println("    # MCParticles contributing: "+mc_hit.mcParticles().size());
+//                for (MCParticle particle : mc_hit.mcParticles())
+//                {
+//                    System.out.println("        MCParticle type: "+particle.getPDGID());
+//                    System.out.println("        MCParticle momentum: "+particle.getMomentum());
+//                }
+//                System.out.println("    Charge in cluster (electrons): "+mc_hit.getdEdx()/DopedSilicon.ENERGY_EHPAIR);
+//                System.out.println("    Position: "+new BasicHep3Vector(mc_hit.getPosition()));
+//                System.out.println("    Covariance matrix: \n"+(new SymmetricMatrix(3,mc_hit.getCovMatrix(),true)));
+//                System.out.println("    # SimTrackerHits contributing to cluster: "+mc_hit.getRawHits().size());
 //                for (RawTrackerHit raw_hit : (List<RawTrackerHit>)mc_hit.getRawHits())
 //                {
 //                    IExpandedIdentifier id = new ExpandedIdentifier(raw_hit.getExpandedIdentifier());
@@ -111,10 +111,10 @@
 //                    System.out.println("        Strip number: "+strip_id);
 //                    System.out.println("        Charge: "+kpix.decodeCharge(raw_hit));
 //                }
-                
-                System.out.println("\n");
-                
-            }
+//                
+//                System.out.println("\n");
+//                
+//            }
             
         }
     }
CVSspam 0.2.8