Commit in lcsim on MAIN
src/org/lcsim/contrib/SiStripSim/ReadoutChip.java+111.4 -> 1.5
                                /Kpix.java+84-621.9 -> 1.10
                                /StripClusterMaker.java+31-361.1 -> 1.2
test/org/lcsim/detector/driver/TrackerDigitizationDriverTest.java+6-61.3 -> 1.4
+132-104
4 modified files
- Cleaned up ReadoutChip / Kpix to make all user-required access through ReadoutChip and hide Kpix innards.  
- Many other small functional improvements to Kpix.  
- Modified StripClusterMaker to use designated ReadoutChip (instead of Kpix).  
- Got rid of annoying Sysouts mistakenly left in TrackerDigitizationDriverTest on last commit

lcsim/src/org/lcsim/contrib/SiStripSim
ReadoutChip.java 1.4 -> 1.5
diff -u -r1.4 -r1.5
--- ReadoutChip.java	6 Nov 2007 19:58:03 -0000	1.4
+++ ReadoutChip.java	16 Nov 2007 23:00:06 -0000	1.5
@@ -12,6 +12,7 @@
 import java.util.List;
 import org.lcsim.detector.tracker.silicon.SiSensorElectrodes;
 import java.util.SortedMap;
+import org.lcsim.event.RawTrackerHit;
 
 /**
  *
@@ -21,5 +22,15 @@
 {
     
     public SortedMap<Integer,List<Integer>> readout(SiElectrodeDataCollection data, SiSensorElectrodes electrodes);
+
+    public ReadoutChannel getChannel(int channel_number);
+    
+    public double decodeCharge(RawTrackerHit hit);
+    public int decodeTime(RawTrackerHit hit);
+    
+    public interface ReadoutChannel
+    {
+        public double computeNoise(double capacitance);
+    }
     
 }

lcsim/src/org/lcsim/contrib/SiStripSim
Kpix.java 1.9 -> 1.10
diff -u -r1.9 -r1.10
--- Kpix.java	15 Nov 2007 06:46:53 -0000	1.9
+++ Kpix.java	16 Nov 2007 23:00:06 -0000	1.10
@@ -14,6 +14,7 @@
 import java.util.SortedMap;
 import java.util.TreeMap;
 import org.lcsim.detector.tracker.silicon.SiSensorElectrodes;
+import org.lcsim.event.RawTrackerHit;
 import org.lcsim.units.clhep.SystemOfUnits;
 
 /**
@@ -23,17 +24,17 @@
 public class Kpix implements ReadoutChip
 {
     
-    static final int VERSION_NUMBER = 0; // version number
+    private static final int VERSION_NUMBER = 0; // version number
     
     // Static values and defaults: DO NOT CHANGE
     //==========================================
     
-    public static class ControlRegisters
+    private static class ControlRegisters
     {
         
-        enum GainMode
+        private enum GainMode
         {SINGLE, DOUBLE}
-        enum Polarity
+        private enum Polarity
         {POSITIVE, NEGATIVE}
         
         private int _version_number = VERSION_NUMBER;
@@ -53,44 +54,44 @@
             _version_number = version_number;
         }
         
-        public void setPolarity(Polarity polarity)
+        private void setPolarity(Polarity polarity)
         {
             _polarity = polarity;
         }
         
-        public void setGainMode(GainMode gain_mode)
+        private void setGainMode(GainMode gain_mode)
         {
             _gain_mode = gain_mode;
         }
         
         // Getters
-        public int getVersionNumber()
+        private int getVersionNumber()
         {
             return _version_number;
         }
         
-        public GainMode getGainMode()
+        private GainMode getGainMode()
         {
             return _gain_mode;
         }
         
-        public Polarity getPolarity()
+        private Polarity getPolarity()
         {
             return _polarity;
         }
         
-        public double getGainCrossover()
+        private double getGainCrossover()
         {
             return _gain_crossover;
         }
         
         // Encoding and decoding resgister information
-        public int encoded()
+        private int encoded()
         {
             return ( getVersionNumber()<<1 | getGainMode().ordinal() )<<1 | getPolarity().ordinal();
         }
         
-        public static ControlRegisters decoded(int encoded_registers)
+        private static ControlRegisters decoded(int encoded_registers)
         {
             ControlRegisters registers = new ControlRegisters();
             
@@ -116,24 +117,50 @@
     {
     }
     
-    // Set and get register information
-    public ControlRegisters getControlRegisters()
-    {
-        return _control_registers;
-    }
-    
-    public KpixChannel getKpixChannels()
+    // ReadoutChip Interface
+    public KpixChannel getChannel(int channel_number)
     {
         return _channel;
     }
     
-    // Actions
     public SortedMap<Integer,List<Integer>> readout(SiElectrodeDataCollection data, SiSensorElectrodes electrodes)
     {
         addNoise(data,electrodes);
         return digitize(data,electrodes);
     }
     
+    // Decoding hit information
+    public double decodeCharge(RawTrackerHit hit)
+    {
+        Kpix.ControlRegisters control_registers = Kpix.ControlRegisters.decoded(hit.getADCValues()[0]);
+        if (control_registers.getVersionNumber() != VERSION_NUMBER)
+        {
+            throw new RuntimeException("Attempting to reconstruct hits generated with Kpix version "+control_registers.getVersionNumber()+
+                    " with Kpix version "+VERSION_NUMBER);
+        }
+        Kpix.KpixChannel.ReadoutRegisters readout_registers = Kpix.KpixChannel.ReadoutRegisters.decoded(hit.getADCValues()[1]);
+        
+        return (readout_registers.getAdcValue()+0.5)/KpixChannel.computeGain(readout_registers, control_registers); // be clever about reconstructing charge
+    }
+    
+    public int decodeTime(RawTrackerHit hit)
+    {
+        Kpix.ControlRegisters control_registers = Kpix.ControlRegisters.decoded(hit.getADCValues()[0]);
+        if (control_registers.getVersionNumber() != VERSION_NUMBER)
+        {
+            throw new RuntimeException("Attempting to reconstruct hits generated with Kpix version "+control_registers.getVersionNumber()+
+                    " with Kpix version "+VERSION_NUMBER);
+        }
+        Kpix.KpixChannel.ReadoutRegisters readout_registers = Kpix.KpixChannel.ReadoutRegisters.decoded(hit.getADCValues()[1]);
+        return readout_registers.getTime();
+    }
+    
+    // Internal stuff - all private
+    private ControlRegisters getControlRegisters()
+    {
+        return _control_registers;
+    }
+    
     private void addNoise(SiElectrodeDataCollection data, SiSensorElectrodes electrodes)
     {
         
@@ -144,13 +171,13 @@
         SortedMap<Integer,List<Integer>> chip_data = new TreeMap<Integer,List<Integer>>();
         for (Integer channel : data.keySet())
         {
-            KpixChannel.ReadoutRegisters readout_registers = getKpixChannels().computeReadoutRegisters(data.get(channel));
+            KpixChannel.ReadoutRegisters readout_registers = getChannel(channel).computeReadoutRegisters(data.get(channel));
             if (readout_registers.getAdcValue() == 0) // supress readout of zeros
             {
                 continue;
             }
             else
-            {   
+            {
                 List<Integer> channel_data = new ArrayList<Integer>();
                 channel_data.add(getControlRegisters().encoded());
                 channel_data.add(readout_registers.encoded());
@@ -160,86 +187,79 @@
         return chip_data;
     }
     
-    // Static calculations of important quantities
-    public static double computeCharge(KpixChannel.ReadoutRegisters readout_registers, ControlRegisters control_registers)
-    {
-        double gain = KpixChannel.computeGain(readout_registers, control_registers);
-        return (readout_registers.getAdcValue()+0.5)/gain; // be clever about reconstructing charge
-    }
+    //==========================================================================
+    // KpixChannel - Class representing a single Kpix channel
+    //==========================================================================
     
-    //=========================================
-    // Class representing a single KPiX channel
-    //=========================================
-    
-    public static class KpixChannel
+    private static class KpixChannel implements ReadoutChannel
     {
-        static final double NORMAL_GAIN_CAP = 400E-15; // 400 fF
-        static final double DOUBLE_GAIN_CAP = 200E-15; // 200 fF
-        static final double LOW_GAIN_CAP = 10E-12; // 10pF
-        static final double ADC_GAIN = 2500; // count/V
-        static final double NOISE_INTERCEPT = 300; // electrons
-        static final double NOISE_SLOPE = 30; // electrons
+        private static final double NORMAL_GAIN_CAP = 400E-15; // 400 fF
+        private static final double DOUBLE_GAIN_CAP = 200E-15; // 200 fF
+        private static final double LOW_GAIN_CAP = 10E-12; // 10pF
+        private static final double ADC_GAIN = 2500; // count/V
+        private static final double NOISE_INTERCEPT = 300; // electrons
+        private static final double NOISE_SLOPE = 30; // electrons
         
-        public static class ReadoutRegisters
+        private static class ReadoutRegisters
         {
             enum GainRange
             {NORMAL, LOW}
             
-            GainRange _gain_range = GainRange.NORMAL;
-            int _buffer_number = 0;
-            int _time = 0;
-            int _adc_value = 0;
+            private GainRange _gain_range = GainRange.NORMAL;
+            private int _buffer_number = 0;
+            private int _time = 0;
+            private int _adc_value = 0;
             
             public ReadoutRegisters()
             {
             }
             
-            public void setGainRange(GainRange gain_range)
+            private void setGainRange(GainRange gain_range)
             {
                 _gain_range = gain_range;
             }
             
-            public void setBufferNumber(int buffer_number)
+            private void setBufferNumber(int buffer_number)
             {
                 _buffer_number = buffer_number;
             }
             
-            public void setTime(int time)
+            private void setTime(int time)
             {
                 _time = time;
             }
             
-            public void setAdcValue(int adc_value)
+            private void setAdcValue(int adc_value)
             {
                 _adc_value = adc_value;
             }
             
-            public GainRange getGainRange()
+            private GainRange getGainRange()
             {
                 return _gain_range;
             }
             
-            public int getBufferNumber()
+            private int getBufferNumber()
             {
                 return _buffer_number;
             }
             
-            public int getTime()
+            private int getTime()
             {
                 return _time;
             }
             
-            public int getAdcValue()
+            private int getAdcValue()
             {
                 return _adc_value;
             }
             
-            public int encoded()
+            private int encoded()
             {
                 return ((((getGainRange().ordinal()<<12 | getBufferNumber())<<8) | getTime())<<8) | getAdcValue() ;
             }
             
-            public static ReadoutRegisters decoded(int readout)
+            private static ReadoutRegisters decoded(int readout)
             {
                 ReadoutRegisters registers = new ReadoutRegisters();
                 int adc_value =  readout &          0xFF    ;
@@ -265,6 +285,13 @@
             _control_registers = control_registers;
         }
         
+        // ReadoutChannel subinterface
+        public double computeNoise(double capacitance)
+        {
+            return NOISE_INTERCEPT + capacitance*NOISE_SLOPE;
+        }
+        
+        // Internal stuff - all private
         private ReadoutRegisters computeReadoutRegisters(SiElectrodeData data)
         {
             ReadoutRegisters registers = new ReadoutRegisters();
@@ -305,7 +332,7 @@
         }
         
         
-        public static double computeGain(ReadoutRegisters readout_registers, ControlRegisters control_registers)
+        private static double computeGain(ReadoutRegisters readout_registers, ControlRegisters control_registers)
         {
             if (readout_registers.getGainRange() == ReadoutRegisters.GainRange.NORMAL)
             {
@@ -317,7 +344,7 @@
             }
         }
         
-        public static double computeNormalFEGain(ControlRegisters control_registers)
+        private static double computeNormalFEGain(ControlRegisters control_registers)
         {
             double feedback_cap;
             if (control_registers.getGainMode() == ControlRegisters.GainMode.SINGLE)
@@ -331,7 +358,7 @@
             return SystemOfUnits.e_SI/feedback_cap;
         }
         
-        public static double computeLowFEGain(ControlRegisters control_registers)
+        private static double computeLowFEGain(ControlRegisters control_registers)
         {
             double feedback_cap;
             if (control_registers.getGainMode() == ControlRegisters.GainMode.SINGLE)
@@ -345,11 +372,6 @@
             return SystemOfUnits.e_SI/feedback_cap;
         }
         
-        public static double computeNoise(double capacitance)
-        {
-            return NOISE_INTERCEPT + capacitance*NOISE_SLOPE;
-        }
-        
     }
     
 }

lcsim/src/org/lcsim/contrib/SiStripSim
StripClusterMaker.java 1.1 -> 1.2
diff -u -r1.1 -r1.2
--- StripClusterMaker.java	6 Nov 2007 20:06:33 -0000	1.1
+++ StripClusterMaker.java	16 Nov 2007 23:00:06 -0000	1.2
@@ -50,10 +50,13 @@
     Map<RawTrackerHit,Integer> _strip_map = new HashMap<RawTrackerHit,Integer>();
     Map<IExpandedIdentifier,SiSensorElectrodes> _electrode_map = new HashMap<IExpandedIdentifier,SiSensorElectrodes>();
     
+    // Readout chip needed to decode hit information
+    ReadoutChip _readout_chip;
+    
     /** Creates a new instance of StripClusterMaker */
-    public StripClusterMaker()
+    public StripClusterMaker(ReadoutChip readout_chip)
     {
-        
+        _readout_chip = readout_chip;
     }
     
     public List<TrackerHit> makeClusters(List<RawTrackerHit> raw_hits)
@@ -65,11 +68,7 @@
         _electrode_map.clear();
         
         List<TrackerHit> clusters = new ArrayList<TrackerHit>();
-        
-//        Map<IExpandedIdentifier,List<RawTrackerHit>> hit_map = new HashMap<IExpandedIdentifier,List<RawTrackerHit>>();
-//        Map<IExpandedIdentifier,SiSensorElectrodes> electrode_map = new HashMap<IExpandedIdentifier,SiSensorElectrodes>();
-//        Map<RawTrackerHit,Integer> strip_map = new HashMap<RawTrackerHit,Integer>();
-        
+
         // Sort RawTrackerHits by electrodes
         for (RawTrackerHit raw_hit : raw_hits)
         {
@@ -138,11 +137,10 @@
             for (RawTrackerHit hit : hits)
             {
                 
-                Kpix.ControlRegisters control_registers = Kpix.ControlRegisters.decoded(hit.getADCValues()[0]);
-                Kpix.KpixChannel.ReadoutRegisters readout_registers = Kpix.KpixChannel.ReadoutRegisters.decoded(hit.getADCValues()[1]);
-                double noise = Kpix.KpixChannel.computeNoise(10.0);  // FIXME: should get this information from the electrodes.
-                double signal = Kpix.computeCharge(readout_registers, control_registers);
-                
+                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))
                 {
                     List<RawTrackerHit> cluster = new ArrayList<RawTrackerHit>();
@@ -180,12 +178,10 @@
             Set<Integer> neighbor_cells = electrodes.getNearestNeighborCells(_strip_map.get(seed_hit));
             for (RawTrackerHit hit : unclustered_hits)
             {
-                
-                Kpix.ControlRegisters control_registers = Kpix.ControlRegisters.decoded(hit.getADCValues()[0]);
-                Kpix.KpixChannel.ReadoutRegisters readout_registers = Kpix.KpixChannel.ReadoutRegisters.decoded(hit.getADCValues()[1]);
-                double noise = Kpix.KpixChannel.computeNoise(10.0);  // FIXME: should get this information from the electrodes.
-                double signal = Kpix.computeCharge(readout_registers, control_registers);
-                
+                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);
@@ -218,22 +214,21 @@
     }
     
     private double[] getPosition(List<RawTrackerHit> cluster, SiSensorElectrodes electrodes)
-    {   
+    {
         double total_charge = 0;
         Hep3Vector position = new BasicHep3Vector(0,0,0);
         
         for (RawTrackerHit hit : cluster)
         {
-            Kpix.ControlRegisters control_registers = Kpix.ControlRegisters.decoded(hit.getADCValues()[0]);
-            Kpix.KpixChannel.ReadoutRegisters readout_registers = Kpix.KpixChannel.ReadoutRegisters.decoded(hit.getADCValues()[1]);
-            double signal = Kpix.computeCharge(readout_registers, control_registers);
-
+            int strip_number = _strip_map.get(hit);
+            double signal = _readout_chip.decodeCharge(hit);
+     
             total_charge += signal;
             position = VecOp.add(position,VecOp.mult(signal,electrodes.getCellPosition(_strip_map.get(hit))));
         }
         position = VecOp.mult(1/total_charge,position);
         
-        return electrodes.getLocalToGlobal().transformed(position).v();        
+        return electrodes.getLocalToGlobal().transformed(position).v();
     }
     
     private double getTime(List<RawTrackerHit> cluster)
@@ -243,20 +238,20 @@
         
         for (RawTrackerHit hit : cluster)
         {
-            Kpix.ControlRegisters control_registers = Kpix.ControlRegisters.decoded(hit.getADCValues()[0]);
-            Kpix.KpixChannel.ReadoutRegisters readout_registers = Kpix.KpixChannel.ReadoutRegisters.decoded(hit.getADCValues()[1]);
-            double signal = Kpix.computeCharge(readout_registers, control_registers);
-            double time = readout_registers.getTime();
-
+            
+            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_sum;
-
+            
         }
         return (double)time_sum/(double)signal_sum;
     }
     
     private SymmetricMatrix getCovariance(List<RawTrackerHit> cluster, SiSensorElectrodes electrodes)
-    { 
+    {
         // FIXME: very raw hack
         
         BasicHep3Matrix covariance = new BasicHep3Matrix();
@@ -272,14 +267,14 @@
         double total_charge = 0.0;
         for (RawTrackerHit hit : cluster)
         {
-            Kpix.ControlRegisters control_registers = Kpix.ControlRegisters.decoded(hit.getADCValues()[0]);
-            Kpix.KpixChannel.ReadoutRegisters readout_registers = Kpix.KpixChannel.ReadoutRegisters.decoded(hit.getADCValues()[1]);
-            double signal = Kpix.computeCharge(readout_registers, control_registers);
-            
+
+            int strip_number = _strip_map.get(hit);
+            double signal = _readout_chip.decodeCharge(hit);
+   
             total_charge += signal;
         }
         return total_charge * DopedSilicon.ENERGY_EHPAIR;
     }
-
+    
     
 }

lcsim/test/org/lcsim/detector/driver
TrackerDigitizationDriverTest.java 1.3 -> 1.4
diff -u -r1.3 -r1.4
--- TrackerDigitizationDriverTest.java	6 Nov 2007 19:58:03 -0000	1.3
+++ TrackerDigitizationDriverTest.java	16 Nov 2007 23:00:06 -0000	1.4
@@ -94,7 +94,7 @@
                         if (!hits.isEmpty())
                         {
                             
-                            System.out.println("Simulating sensor: "+sensor.getName());
+//                            System.out.println("Simulating sensor: "+sensor.getName());
                             
                             List<RawTrackerHit> raw_hits = new ArrayList<RawTrackerHit>();
                             si_simulation.simulate(sensor);
@@ -123,11 +123,11 @@
                                         raw_hits.add(raw_hit);
                                         found_hits = true;
                                         
-//                                        Kpix.ControlRegisters control_registers = Kpix.ControlRegisters.decoded(raw_hit.getADCValues()[0]);
-//                                        Kpix.KpixChannel.ReadoutRegisters readout_registers = Kpix.KpixChannel.ReadoutRegisters.decoded(raw_hit.getADCValues()[1]);
-//                                        double signal = Kpix.computeCharge(readout_registers, control_registers);
-//                                        
-//                                        System.out.println("Readout data for cell "+readout_cell+": "+si_simulation.getReadoutData(carrier).getChargeMap());
+//                                        System.out.println("ADC data for cell "+readout_cell+": "+
+//                                                raw_hit.getADCValues()[0]+", "+raw_hit.getADCValues()[1]);
+                                       
+//                                        double signal = kpix.decodeCharge(raw_hit);
+//                                        System.out.println("Readout data for cell "+readout_cell+": "+signal);
                                         
                                     }
                                     
CVSspam 0.2.8