Commit in lcsim/src/org/lcsim/contrib/SiStripSim on MAIN
Kpix.java+18-181.7 -> 1.8
Significant bugfixes

lcsim/src/org/lcsim/contrib/SiStripSim
Kpix.java 1.7 -> 1.8
diff -u -r1.7 -r1.8
--- Kpix.java	6 Nov 2007 19:58:03 -0000	1.7
+++ Kpix.java	15 Nov 2007 06:04:04 -0000	1.8
@@ -87,17 +87,17 @@
         // Encoding and decoding resgister information
         public int encoded()
         {
-            return ( getVersionNumber()<<1 & getGainMode().ordinal() )<<1 & getPolarity().ordinal();
+            return ( getVersionNumber()<<1 | getGainMode().ordinal() )<<1 | getPolarity().ordinal();
         }
         
         public static ControlRegisters decoded(int encoded_registers)
         {
             ControlRegisters registers = new ControlRegisters();
             
-            int version_number = encoded_registers & 0xFC;
-            int double_gain = encoded_registers & 0x1;
-            int polarity = encoded_registers &    0x2;
-            
+            int polarity =          encoded_registers & 0x1;
+            int double_gain =      (encoded_registers & 0x2)    >>1;
+            int version_number =   (encoded_registers & 0xFC)   >>2;
+
             registers.setVersionNumber(version_number);
             registers.setGainMode(GainMode.values()[double_gain]);
             registers.setPolarity(Polarity.values()[polarity]);
@@ -156,19 +156,19 @@
     public static double computeCharge(KpixChannel.ReadoutRegisters readout_registers, ControlRegisters control_registers)
     {
         double gain = KpixChannel.computeGain(readout_registers, control_registers);
-        return gain*readout_registers.getAdcValue();
+        return readout_registers.getAdcValue()/gain;
     }
     
     //=========================================
     // Class representing a single KPiX channel
     //=========================================
-
+    
     public static class KpixChannel
     {
         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 = 2.5; // count/mV
+        static final double ADC_GAIN = 2500; // count/V
         static final double NOISE_INTERCEPT = 300; // electrons
         static final double NOISE_SLOPE = 30; // electrons
         
@@ -227,17 +227,17 @@
             }
             
             public int encoded()
-            {
-                return ((((getGainRange().ordinal()<<12 & getBufferNumber())<<8) & getTime())<<8) & getAdcValue() ;
+            {                
+                return ((((getGainRange().ordinal()<<12 | getBufferNumber())<<8) | getTime())<<8) | getAdcValue() ;
             }
             
             public static ReadoutRegisters decoded(int readout)
             {
                 ReadoutRegisters registers = new ReadoutRegisters();
-                int adc_value = readout &          0xFF;
-                int time = readout &             0xFF00;
-                int buffer_number = readout & 0xFFF0000;
-                int gain_range = readout &   0x10000000;
+                int adc_value =  readout &          0xFF    ;
+                int time = (readout &             0xFF00)   >> 8;
+                int buffer_number = (readout & 0xFFF0000)   >> 16;
+                int gain_range = (readout &   0x10000000)   >> 28;
                 
                 registers.setAdcValue(adc_value);
                 registers.setTime(time);
@@ -258,7 +258,7 @@
         }
         
         private int digitize(SiElectrodeData data)
-        {
+        {   
             return computeReadoutRegisters(data).encoded();
         }
         
@@ -269,7 +269,7 @@
             registers.setBufferNumber(computeBufferNumber());
             registers.setGainRange(computeGainRange(data));
             registers.setAdcValue(computeAdcValue(data,registers));
-            
+
             return registers;
         }
         
@@ -306,11 +306,11 @@
         {
             if (readout_registers.getGainRange() == ReadoutRegisters.GainRange.NORMAL)
             {
-                return (int)Math.floor(computeNormalFEGain(control_registers)*ADC_GAIN);
+                return computeNormalFEGain(control_registers)*ADC_GAIN;
             }
             else
             {
-                return (int)Math.floor(computeLowFEGain(control_registers)*ADC_GAIN);
+                return computeLowFEGain(control_registers)*ADC_GAIN;
             }
         }
         
CVSspam 0.2.8