lcsim/src/org/lcsim/contrib/SiStripSim
diff -u -r1.5 -r1.6
--- CDFSiSensorSim.java 7 Aug 2007 18:11:40 -0000 1.5
+++ CDFSiSensorSim.java 14 Oct 2007 06:14:59 -0000 1.6
@@ -10,16 +10,19 @@
package org.lcsim.contrib.SiStripSim;
-import org.lcsim.detector.tracker.silicon.ErrorEllipse2D;
+//import org.lcsim.detector.tracker.silicon.ErrorEllipse2D;
+
import org.lcsim.event.SimTrackerHit;
-import org.lcsim.detector.IRotation3D;
-import org.lcsim.detector.RotationPassiveXYZ;
import org.lcsim.detector.tracker.silicon.SiSensor;
import org.lcsim.detector.tracker.silicon.SiSensorElectrodes;
-import org.lcsim.detector.tracker.silicon.SiStrips;
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;
import hep.physics.vec.Hep3Vector;
import hep.physics.vec.BasicHep3Vector;
@@ -27,12 +30,10 @@
import hep.physics.vec.VecOp;
import java.util.List;
-import java.util.Set;
-import java.util.HashSet;
import java.util.Map;
-import java.util.SortedMap;
import java.util.EnumMap;
+import java.util.SortedMap;
/**
*
@@ -143,7 +144,7 @@
double segment_charge = track.getEloss()/nsegments/_sensor.getBulk().ENERGY_EHPAIR;
// System.out.println("length of subsegments: " + segment_length);
-// System.out.println("total charge: " + segment_charge);
+// System.out.println("subsegment charge: " + segment_charge);
Hep3Vector segment_step = VecOp.mult(segment_length,track.getDirection());
Hep3Vector segment_center = VecOp.add( track.getP1(),VecOp.mult(0.5,segment_step) );
@@ -161,19 +162,39 @@
{
if (_sensor.hasElectrodesOnSide(carrier))
{
+ SiSensorElectrodes electrodes = _sensor.getElectrodes(carrier);
- IRotation3D sensor_to_electrodes = new RotationPassiveXYZ(0.0,0.0,-_sensor.getElectrodeAngle(carrier));
+ ChargeDistribution charge_distribution = diffusionDistribution(segment_charge,segment_center,carrier);
+ charge_distribution.transform(electrodes.getParentToLocal());
- Hep3Vector electrode_drift_destination = VecOp.mult(sensor_to_electrodes.getRotationMatrix(),driftDestination(segment_center,carrier));
- ErrorEllipse2D electrode_charge_distribution = diffusionEllipse(segment_center,carrier).rotate(-_sensor.getElectrodeAngle(carrier));
-
- SortedMap<Integer,Integer> sense_charge = _sensor.getElectrodes(carrier).
- computeElectrodeData(segment_charge,electrode_drift_destination,electrode_charge_distribution);
+ SortedMap<Integer,Integer> sense_charge = electrodes.computeElectrodeData(charge_distribution);
// System.out.println("Sense charge map: " + sense_charge);
_sense_data.get(carrier).add(new SiElectrodeDataCollection(sense_charge,hit));
+// ITransform3D sensor_to_electrodes = _sensor.getElectrodes(carrier).getParentToLocal();
+//
+// Hep3Vector electrode_drift_destination = sensor_to_electrodes.transformed(driftDestination(segment_center,carrier));
+//
+//
+// ErrorEllipse2D electrode_charge_distribution = diffusionEllipse(segment_center,carrier).transformed(sensor_to_electrodes);
+
+
+
+
+// IRotation3D sensor_to_electrodes = new RotationPassiveXYZ(0.0,0.0,-_sensor.getElectrodeAngle(carrier));
+//
+// Hep3Vector electrode_drift_destination = VecOp.mult(sensor_to_electrodes.getRotationMatrix(),driftDestination(segment_center,carrier));
+// ErrorEllipse2D electrode_charge_distribution = diffusionEllipse(segment_center,carrier).rotate(-_sensor.getElectrodeAngle(carrier));
+//
+// SortedMap<Integer,Integer> sense_charge = _sensor.getElectrodes(carrier).
+// computeElectrodeData(segment_charge,electrode_drift_destination,electrode_charge_distribution);
+//
+//// System.out.println("Sense charge map: " + sense_charge);
+//
+// _sense_data.get(carrier).add(new SiElectrodeDataCollection(sense_charge,hit));
+
}
}
@@ -181,11 +202,10 @@
segment_center = VecOp.add(segment_center, segment_step);
}
-// System.out.println("Final sense charge map: " + _sense_data.get(ChargeCarrier.HOLE).getChargeMap());
-
-
}
+// System.out.println("Final sense charge map: " + _sense_data.get(ChargeCarrier.HOLE).getChargeMap());
+
}
private void transferChargeToReadout()
@@ -223,7 +243,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++)
@@ -287,6 +307,7 @@
// 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);
// System.out.println("Track P1: " + track.getP1());
// System.out.println("Track P2: " + track.getP2());
@@ -298,15 +319,20 @@
Hep3Vector deposition_line = VecOp.sub( driftDestination(track.getP2(),carrier),
driftDestination(track.getP1(),carrier) );
- int naxes = _sensor.getElectrodes(carrier).getNAxes();
+ int naxes = electrodes.getNAxes();
for (int iaxis = 0; iaxis < naxes; iaxis++)
{
- double projected_deposition_length = Math.abs(VecOp.dot(deposition_line,_sensor.getMeasuredCoordinates(carrier)[iaxis]));
+ IRotation3D electrode_to_sensor = electrodes.getParentToLocal().getRotation().inverse();
+ Hep3Vector measured_coordinate = electrode_to_sensor.rotated(electrodes.getMeasuredCoordinate(iaxis));
+
+ double projected_deposition_length = Math.abs(VecOp.dot(deposition_line,measured_coordinate));
+
+// double projected_deposition_length = Math.abs(VecOp.dot(deposition_line,_sensor.getMeasuredCoordinates(carrier)[iaxis]));
// System.out.println("Projected deposition Length: " + projected_deposition_length);
int required_segments = (int)Math.ceil(projected_deposition_length/
- (deposition_granularity*_sensor.getElectrodes(carrier).getPitch(iaxis)));
+ (deposition_granularity*electrodes.getPitch(iaxis)));
nsegments = Math.max(nsegments,required_segments);
}
return nsegments;
@@ -315,7 +341,7 @@
private Hep3Vector driftDestination(Hep3Vector origin, ChargeCarrier carrier)
{
-// System.out.println("Beginning driftDestination");
+// System.out.println("Beginning driftDestination for origin: "+origin);
return VecOp.add(origin,driftVector(origin, carrier));
}
@@ -355,17 +381,15 @@
}
-
- private ErrorEllipse2D diffusionEllipse(Hep3Vector point, ChargeCarrier carrier)
+ private ChargeDistribution diffusionDistribution(double segment_charge, Hep3Vector origin, ChargeCarrier carrier)
{
+// System.out.println("Calculating charge distribution for carrier: "+carrier);
+
// Common factors
double difference_V = _sensor.getBiasVoltage() - _sensor.getDepletionVoltage();
double sum_V = _sensor.getBiasVoltage() + _sensor.getDepletionVoltage();
- double common_factor = 2.0*_sensor.distanceFromSide(point,carrier)*_sensor.getDepletionVoltage()/_sensor.getThickness();
-
-// System.out.println("sum_V: "+sum_V);
-// System.out.println("common_factor: "+common_factor);
+ double common_factor = 2.0*_sensor.distanceFromSide(origin,carrier)*_sensor.getDepletionVoltage()/_sensor.getThickness();
// Calculate charge spreading without magnetic field
double sigmasq = _sensor.getBulk().K_BOLTZMANN * _sensor.getBulk().getTemperature() *
@@ -381,26 +405,29 @@
double sigma = Math.sqrt(sigmasq);
-// System.out.println("Sigma: "+sigma);
-
// 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 phi_electrode = _sensor.getElectrodeAngle(carrier);
- double minor_axis = sigma*(1.0/cos_theta_lorentz); // drift time correction
- double major_axis = minor_axis*(1.0/cos_theta_lorentz); // + drift angle correction
- double phi_ellipse = -phi_electrode; // orientation of ellipse, relative to electrode coordinates
+ 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
+
+ // FIXME: this has a Z component!!! (is that OK??)
+ Hep3Vector drift_destination = driftDestination(origin,carrier);
+
+// System.out.println("Drift destination: "+drift_destination);
-// System.out.println("Minor axis: "+minor_axis);
-// System.out.println("Major axis: "+major_axis);
+ 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));
- // Create error ellipse
- return new ErrorEllipse2D(major_axis, minor_axis, phi_ellipse);
+ 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);
+
+ return distribution;
}
-
}