GeomConverter/src/org/lcsim/detector/tracker/silicon
diff -u -r1.5 -r1.6
--- SiSensor.java 8 May 2007 23:39:47 -0000 1.5
+++ SiSensor.java 18 May 2007 21:56:34 -0000 1.6
@@ -56,7 +56,8 @@
private int _sensorid;
// electrodes, electrode angles and orientation of sensor
- private Map<ChargeCarrier, SiSensorElectrodes> _electrodes = new EnumMap<ChargeCarrier,SiSensorElectrodes>(ChargeCarrier.class);
+ private Map<ChargeCarrier, SiSensorElectrodes> _sense_electrodes = new EnumMap<ChargeCarrier,SiSensorElectrodes>(ChargeCarrier.class);
+ private Map<ChargeCarrier, SiSensorElectrodes> _readout_electrodes = new EnumMap<ChargeCarrier,SiSensorElectrodes>(ChargeCarrier.class);
private Map<ChargeCarrier, Double> _electrode_angles = new EnumMap<ChargeCarrier,Double>(ChargeCarrier.class);
private Orientation _orientation;
@@ -108,7 +109,7 @@
public void setElectrodes(ChargeCarrier carrier, SiSensorElectrodes electrodes)
{
- _electrodes.put(carrier,electrodes);
+ _sense_electrodes.put(carrier,electrodes);
}
public void setElectrodeAngle(ChargeCarrier carrier, double electrode_angle)
@@ -149,7 +150,7 @@
public SiSensorElectrodes getElectrodes(ChargeCarrier carrier)
{
- return _electrodes.get(carrier);
+ return _sense_electrodes.get(carrier);
}
public double getElectrodeAngle(ChargeCarrier carrier)
@@ -204,10 +205,10 @@
}
-
-
-
-
+ public Hep3Vector[] getMeasuredCoordinates(ChargeCarrier carrier)
+ {
+ return _measured_coordinates.get(carrier);
+ }
// Operators
@@ -234,7 +235,7 @@
double electrode_angle = getElectrodeAngle(carrier);
// System.out.println("Electrode angle: "+electrode_angle);
- int naxes = _electrodes.get(carrier).getNAxes();
+ int naxes = _sense_electrodes.get(carrier).getNAxes();
// System.out.println("# axes "+naxes);
Hep3Vector[] measured_coordinates = new Hep3Vector[naxes];
@@ -261,7 +262,7 @@
else return -_thickness/2.0;
}
- private double distanceFromSide(Hep3Vector point, ChargeCarrier carrier)
+ public double distanceFromSide(Hep3Vector point, ChargeCarrier carrier)
{
// System.out.println("Beginning distanceFromSide");
double distance = Math.abs(point.z() - zOfSide(carrier));
@@ -273,7 +274,7 @@
public boolean hasElectrodesOnSide(ChargeCarrier carrier)
{
- if(_electrodes.get(carrier) == null) return false;
+ if(_sense_electrodes.get(carrier) == null) return false;
else return true;
}
@@ -389,7 +390,7 @@
{
for (ChargeCarrier carrier : ChargeCarrier.values())
{
- if (hasElectrodesOnSide(carrier)) _electrodes.get(carrier).clear();
+ if (hasElectrodesOnSide(carrier)) _sense_electrodes.get(carrier).clear();
}
}
@@ -410,14 +411,14 @@
Hep3Vector deposition_line = VecOp.sub( driftDestination(track.getP2(),carrier),
driftDestination(track.getP1(),carrier) );
- int naxes = _electrodes.get(carrier).getNAxes();
+ int naxes = _sense_electrodes.get(carrier).getNAxes();
for (int iaxis = 0; iaxis < naxes; iaxis++)
{
double projected_deposition_length = Math.abs(VecOp.dot(deposition_line,_measured_coordinates.get(carrier)[iaxis]));
// System.out.println("Projected deposition Length: " + projected_deposition_length);
- int required_segments = (int)Math.ceil(projected_deposition_length/(deposition_granularity*_electrodes.get(carrier).getPitch(iaxis)));
+ int required_segments = (int)Math.ceil(projected_deposition_length/(deposition_granularity*_sense_electrodes.get(carrier).getPitch(iaxis)));
nsegments = Math.max(nsegments,required_segments);
}
return nsegments;
@@ -474,7 +475,7 @@
Hep3Vector electrode_drift_destination = VecOp.mult(sensor_to_electrodes.getRotationMatrix(),driftDestination(segment_center,carrier));
ErrorEllipse2D electrode_charge_distribution = diffusionEllipse(segment_center,carrier).rotate(-getElectrodeAngle(carrier));
- _electrodes.get(carrier).depositCharge(segment_charge,electrode_drift_destination,electrode_charge_distribution);
+ _sense_electrodes.get(carrier).depositCharge(segment_charge,electrode_drift_destination,electrode_charge_distribution);
}
}
@@ -550,7 +551,7 @@
// _measured_coordinate.get(carrier) );
// double diffusion_sigma = diffusionSigma(origin,carrier);
//
-// _electrodes.get(carrier).depositCharge(new BasicHep3Vector(drift_destination,0.0,0.0),charge,diffusion_sigma);
+// _sense_electrodes.get(carrier).depositCharge(new BasicHep3Vector(drift_destination,0.0,0.0),charge,diffusion_sigma);
//
// }
@@ -612,7 +613,7 @@
//
// double projected_deposition_length = VecOp.dot(deposition_line,_measured_coordinate.get(carrier));
//
-// return (int)Math.ceil(projected_deposition_length/(deposition_granularity*_electrodes.get(carrier).getPitch()));
+// return (int)Math.ceil(projected_deposition_length/(deposition_granularity*_sense_electrodes.get(carrier).getPitch()));
// }
GeomConverter/src/org/lcsim/detector/tracker/silicon
diff -u -r1.3 -r1.4
--- SiSensorElectrodes.java 7 May 2007 21:22:49 -0000 1.3
+++ SiSensorElectrodes.java 18 May 2007 21:56:34 -0000 1.4
@@ -10,7 +10,7 @@
package org.lcsim.detector.tracker.silicon;
import hep.physics.vec.Hep3Vector;
-import java.util.Map;
+import java.util.SortedMap;
/**
*
@@ -21,14 +21,26 @@
// Cell shape, assumed to be a polygon with an even number of sides (1=strip, 2=rectagular pixel, 3=hexagon, etc...)
public int getNAxes();
+ // Direction of each measured coordinate
+ public Hep3Vector getMeasuredCoordinate(int axis);
+
+ // Neigbor ncells away along each axis
+ public int getNeighborCell(int cell, int axis, int ncells);
+
+ // Cell number is valid
+ public boolean isValidCell(int cell);
+
+ // Cell number along this coordinate is valid
+ public boolean isValidCell(int cell, int axis);
+
// Number of cells (strips or pixels)
public int getNCells();
// Number of cells along each axis
- public int getNCells(int direction);
+ public int getNCells(int axis);
// Size of a cell (strip or pixel pitch)
- public double getPitch(int direction);
+ public double getPitch(int axis);
// Position of a particular cell (by cell number)
public Hep3Vector getCellPosition(int cell_id);
@@ -39,12 +51,15 @@
// Location of given position within a cell
public Hep3Vector getPositionInCell(Hep3Vector position);
- // Deposit Gaussian-distributed charge on electrodes
+ // Compute Gaussian-distributed charge on electrodes
+ public SortedMap<Integer,Integer> computeElectrodeData(double charge, Hep3Vector position, ErrorEllipse2D distribution);
+
+ // Deposit Gaussian-distributed charge on electrodes - deprecated
public void depositCharge(double charge, Hep3Vector position, ErrorEllipse2D distribution);
- // Get map of charge deposition on electrodes
- public Map<Integer,Integer> getChargeMap();
+ // Get map of charge deposition on electrodes - deprecated
+ public SortedMap<Integer,Integer> getChargeMap();
- // Clear charge from electrodes
+ // Clear charge from electrodes - deprecated
public void clear();
}
GeomConverter/src/org/lcsim/detector/tracker/silicon
diff -u -r1.6 -r1.7
--- SiStrips.java 8 May 2007 06:41:53 -0000 1.6
+++ SiStrips.java 18 May 2007 21:56:34 -0000 1.7
@@ -161,21 +161,49 @@
return 1;
}
+ public Hep3Vector getMeasuredCoordinate(int axis)
+ {
+ if (axis == 0) return new BasicHep3Vector(1.0,0.0,0.0);
+ else return null;
+ }
+
+ public int getNeighborCell(int cell, int axis, int ncells)
+ {
+ if (axis == 0)
+ {
+ int neighbor_cell = cell + ncells;
+ if (isValidCell(neighbor_cell, axis)) return neighbor_cell;
+ else return -1;
+ }
+ else return -1;
+
+ }
+
+ public boolean isValidCell(int cell)
+ {
+ return (cell >= 0 && cell < getNCells());
+ }
+
+ public boolean isValidCell(int cell, int axis)
+ {
+ return (cell >= 0 && cell < getNCells(axis));
+ }
+
public int getNCells()
{
return getNReadoutStrips();
}
- public int getNCells(int direction)
+ public int getNCells(int axis)
{
- if (direction == 0)
+ if (axis == 0)
{
return getNReadoutStrips();
}
else return 1;
}
- public double getPitch(int direction)
+ public double getPitch(int axis)
{
return getReadoutPitch();
}
@@ -201,6 +229,49 @@
return _strip_charge;
}
+ public SortedMap<Integer,Integer> computeElectrodeData(double charge, Hep3Vector position, ErrorEllipse2D distribution)
+ {
+
+ SortedMap<Integer,Integer> electrode_data = new TreeMap<Integer,Integer>();
+
+ int base_strip = getSenseStripID(position);
+
+ Hep3Vector interstrip_position = getPositionInSenseCell(position);
+
+ // put charge on strips in window 3-sigma strips on each side of base strip
+ double pitch = getSensePitch();
+ double axis_angle = 0.0;
+
+ int window_size = (int)Math.ceil(3.0*distribution.sigma1D(axis_angle)/pitch);
+
+ double erfc_lower = 1.0;
+ double erfc_upper = 1.0;
+
+ for (int istrip = base_strip-window_size; istrip <= base_strip+window_size; istrip++)
+ {
+
+ double cell_edge_upper = getSenseStripPosition(istrip).x() + pitch/2.0;
+
+ double erfc_limit = cell_edge_upper-position.x();
+
+ erfc_upper = distribution.erfc1D(erfc_limit,axis_angle);
+
+ if (erfc_lower<erfc_upper) System.out.println("SQUEAL LIKE A PIG!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
+
+ int strip_charge = (int)Math.round( (erfc_lower-erfc_upper) * charge);
+
+ if (strip_charge != 0)
+ {
+ electrode_data.put(istrip,strip_charge);
+ }
+
+ erfc_lower = erfc_upper;
+
+ }
+ return electrode_data;
+ }
+
+
public void depositCharge(double charge, Hep3Vector position, ErrorEllipse2D distribution)
{
// System.out.println("Beginning depositCharge");