lcsim/src/org/lcsim/contrib/SiStripSim
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
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;
}
-
+
}