hps-java/src/main/java/org/lcsim/hps/recon/tracking
diff -u -r1.4 -r1.5
--- DataTrackerFakeHitDriver.java 9 Nov 2012 01:42:13 -0000 1.4
+++ DataTrackerFakeHitDriver.java 15 Nov 2012 02:49:06 -0000 1.5
@@ -266,16 +266,18 @@
// Get the sensor position along the z direction
double zposition = sensor.getGeometry().getPosition().z();
- // Extrapolate the track to the sensor
- Hep3Vector trackPosAtSensor = extrapolator.extrapolateTrack(zposition);
+ // Get the position where the sensor and track intercept
+ Hep3Vector trackPosAtSensor = this.getHelixPlaneIntercept(sensor, wtrack);
+
if(debug) {
- System.out.println(this.getClass().getSimpleName() + ": track position at sensor ( z= " + zposition + ") = " + trackPosAtSensor.toString());
+ System.out.printf("%s: track/plane intercept at %s\n",this.getClass().getSimpleName(),trackPosAtSensor.toString(),zposition);
}
// Check if the track lies within the sensor
boolean isHit = trackUtils.sensorContainsTrack(trackPosAtSensor, sensor);
+
if(isHit) {
if(debug) System.out.println(this.getClass().getSimpleName() + ": make a tracker hit and add to this sensor");
@@ -291,7 +293,7 @@
hths.add(this.makeHelicalTrackHit(sensor, wtrack));
} else if(createSimTrackerHits){
// Create a SimTrackerHit at the intersect between a track and a sensor
- simHits.add(this.makeSimTrackerHit(sensor, trackPosAtSensor.v(), mcParticle));
+ simHits.add(this.makeSimTrackerHit(sensor, trackPosAtSensor, mcParticle));
} else {
this.printDebug("Creating a SimTrackerHit at position: " + trackPosAtSensor);
@@ -493,32 +495,22 @@
}
-
-
-
- private HelicalTrackHit makeHelicalTrackHit(SiSensor sensor, WTrack wtrack) {
- //private SiTrackerHitStrip1D makeTrackerHit(List<HPSFittedRawTrackerHit> cluster, SiSensorElectrodes electrodes) {
- //create fake raw tracker hit
-
- if(debug) System.out.println(this.getClass().getSimpleName() + ": makeTrackerHit");
-
- List<RawTrackerHit> rth_cluster = this.makeRawTrackerFakeHit(sensor);
- if(rth_cluster.size()!=1) {
- System.out.println(this.getClass().getSimpleName() + ": the fake raw tracker hit cluster is different than one!? " + rth_cluster.size() );
- System.exit(1);
- }
- if(debug) System.out.println(this.getClass().getSimpleName() + ": created a fake raw tracker hit ");
- RawTrackerHit raw_hit = rth_cluster.get(0);
+ /**
+ *
+ * Find the unit vector of a sensor
+ * @param sensor
+ * @return unit vector of the plane
+ */
+ private Hep3Vector getPlaneUnitVector(SiSensor sensor) {
+ /*
+ * Weird way of getting the unit vector by creating a fake raw tracker hit...must be simpler way?
+ */
+ RawTrackerHit raw_hit = this.makeRawTrackerFakeHit(sensor).get(0);
IIdentifier id = raw_hit.getIdentifier();
-
//Get the electrode objects
SiTrackerIdentifierHelper _sid_helper = (SiTrackerIdentifierHelper) sensor.getIdentifierHelper();
ChargeCarrier carrier = ChargeCarrier.getCarrier(_sid_helper.getSideValue(id));
SiSensorElectrodes electrodes = ((SiSensor) raw_hit.getDetectorElement()).getReadoutElectrodes(carrier);
-
-
-
-
ITransform3D local_to_global;
if (coordinate_system == TrackerHitType.CoordinateSystem.GLOBAL) {
local_to_global = new Transform3D();
@@ -529,46 +521,69 @@
else {
throw new RuntimeException(this.getClass().getSimpleName() + " problem with coord system " + coordinate_system.toString());
}
-
-
ITransform3D electrodes_to_global = electrodes.getLocalToGlobal();
ITransform3D global_to_hit = local_to_global.inverse();
ITransform3D electrodes_to_hit = Transform3D.multiply(global_to_hit,electrodes_to_global);
Hep3Vector u= electrodes_to_hit.rotated(electrodes.getMeasuredCoordinate(0));
Hep3Vector v= electrodes_to_hit.rotated(electrodes.getUnmeasuredCoordinate(0));
- Hep3Vector w = VecOp.cross(u, v);
+ Hep3Vector w = VecOp.cross(u, v);
+ Hep3Vector eta = VecOp.mult(detToTrk, w);
+ return eta;
+
+ }
+
+
+ /**
+ *
+ * Find the origin of the sensor plane
+ * @param sensor
+ * @return origin position of the plane
+ */
+ private Hep3Vector getOrgLoc(SiSensor sensor) {
+ /*
+ * Weird way of getting the org location by creating a fake raw tracker hit...must be simpler way?
+ */
+ List<RawTrackerHit> rth_cluster = this.makeRawTrackerFakeHit(sensor);
+ if(rth_cluster.size()!=1) {
+ System.out.println(this.getClass().getSimpleName() + ": the fake raw tracker hit cluster is different than one!? " + rth_cluster.size() );
+ System.exit(1);
+ }
+ //Get the electrode objects
+ IIdentifier id = rth_cluster.get(0).getIdentifier();
+ SiTrackerIdentifierHelper _sid_helper = (SiTrackerIdentifierHelper) sensor.getIdentifierHelper();
+ ChargeCarrier carrier = ChargeCarrier.getCarrier(_sid_helper.getSideValue(id));
+ SiSensorElectrodes electrodes = ((SiSensor) rth_cluster.get(0).getDetectorElement()).getReadoutElectrodes(carrier);
+ ITransform3D local_to_global;
+ if (coordinate_system == TrackerHitType.CoordinateSystem.GLOBAL) {
+ local_to_global = new Transform3D();
+ }
+ else if (coordinate_system == TrackerHitType.CoordinateSystem.SENSOR) {
+ local_to_global = sensor.getGeometry().getLocalToGlobal();
+ }
+ else {
+ throw new RuntimeException(this.getClass().getSimpleName() + " problem with coord system " + coordinate_system.toString());
+ }
+ ITransform3D electrodes_to_global = electrodes.getLocalToGlobal();
Hep3Vector _orgloc = new BasicHep3Vector(0., 0., 0.);
electrodes_to_global.transformed(_orgloc);
- if(debug) {
- System.out.println(this.getClass().getSimpleName() + ": electrodes u " + u.toString());
- System.out.println(this.getClass().getSimpleName() + ": electrodes v " + v.toString());
- System.out.println(this.getClass().getSimpleName() + ": electrodes w " + w.toString() + "( " + w.magnitude() + ")");
- }
-
electrodes_to_global.getTranslation().translate(_orgloc);
if(debug) System.out.print(this.getClass().getSimpleName() + ": orgloc " + _orgloc.toString() + " -> ");
_orgloc = VecOp.mult(detToTrk, _orgloc);
if(debug) System.out.println(_orgloc.toString());
+ return _orgloc;
-
-
- if(debug) System.out.println(this.getClass().getSimpleName() + ": Try to find the interception point");
-
- //B-field must go along Z direction
+ }
+
+
+ private Hep3Vector getHelixPlaneIntercept(SiSensor sensor, WTrack wtrack) {
+ Hep3Vector eta = this.getPlaneUnitVector(sensor);
+ Hep3Vector _orgloc = this.getOrgLoc(sensor);
Hep3Vector h = new BasicHep3Vector(_bfield.x(),_bfield.y(),Math.abs(_bfield.z()));
h = VecOp.unit(h);
- //Rotate into tracking frame
- Hep3Vector eta = VecOp.mult(detToTrk, w);
-
- if(debug) System.out.println(this.getClass().getSimpleName() + ": eta " + eta.toString());
-
Hep3Vector position = wutils.getHelixAndPlaneIntercept(wtrack, _orgloc, eta, h);
-
- if(debug) System.out.println(this.getClass().getSimpleName() + ": found interception point at position " + position.toString());
-
- if(debug) {
+ if(debug) {
HelicalTrackFit htf = wtrack._htf;
List<Double> s = HelixUtils.PathToXPlane(htf, position.x(), 0, 0);
Hep3Vector posOnHelix = HelixUtils.PointOnHelix(htf, s.get(0));
@@ -576,7 +591,6 @@
System.out.println(this.getClass().getSimpleName() + ": Path length to position " + position.toString() + ": s = " + s.get(0));
System.out.println(this.getClass().getSimpleName() + ": Difference between W and helixutils: diffpos " + posdiff.toString() + " ( " + position.toString() + " posOnHelix " + posOnHelix.toString() + " R=" + htf.R());
}
-
//Fill some debug stuff
List<Double> deltas = wutils.getDeltas();
this._delta_itercount.get(sensor).fill(deltas.size());
@@ -587,6 +601,23 @@
}
_prf_final_deltas.fill(deltas.size(), deltas.get(deltas.size()-1));
+ return position;
+ }
+
+
+ private HelicalTrackHit makeHelicalTrackHit(SiSensor sensor, WTrack wtrack) {
+ //private SiTrackerHitStrip1D makeTrackerHit(List<HPSFittedRawTrackerHit> cluster, SiSensorElectrodes electrodes) {
+ //create fake raw tracker hit
+
+ if(debug) System.out.println(this.getClass().getSimpleName() + ": makeTrackerHit");
+
+ List<RawTrackerHit> rth_cluster = this.makeRawTrackerFakeHit(sensor);
+
+ if(debug) System.out.println(this.getClass().getSimpleName() + ": Try to find the interception point");
+
+ Hep3Vector position = this.getHelixPlaneIntercept(sensor, wtrack);
+
+
//Fill dummy covariance matrix with minimal uncertainties
//SymmetricMatrix covariance = this.getCovariance(rth_cluster, electrodes);
SymmetricMatrix covariance = new SymmetricMatrix(3);
@@ -631,17 +662,21 @@
* @param particle : MC particle associated with the track containing the hit
* @return SimTrackerHit
*/
- private SimTrackerHit makeSimTrackerHit(SiSensor sensor, double[] trkPositionAtSensor, MCParticle particle){
-
+ private SimTrackerHit makeSimTrackerHit(SiSensor sensor, Hep3Vector trkPositionAtSensor, MCParticle particle){
+ Hep3Vector trkPositionAtSensorDet = VecOp.mult(VecOp.inverse(detToTrk),trkPositionAtSensor);
+ if(this.debug) {
+ System.out.printf("%s: makeSimTrackerHit for sensor %s at position %s in JLab coord (from %s) for MCp pvec=%s \n",this.getClass().getSimpleName(),sensor.getName(),trkPositionAtSensorDet.toString(),trkPositionAtSensor.toString(),particle.getMomentum().toString());
+
+ }
double dEdx = 24000/* MIP */*DopedSilicon.ENERGY_EHPAIR;
double[] momentum = particle.getMomentum().v();
double pathLength = 0;
double time = 0;
int cellID = (int) TrackerHitUtils.makeSimTrackerHitId(sensor).getValue();
// Create a new SimTrackerHit
- SimTrackerHit simHit = new BaseSimTrackerHit(trkPositionAtSensor, dEdx, momentum, pathLength, time, cellID, particle, null, sensor);
+ SimTrackerHit simHit = new BaseSimTrackerHit(trkPositionAtSensorDet.v(), dEdx, momentum, pathLength, time, cellID, particle, null, sensor);
// Add it to the sensor readout
- //sensor.getReadout().addHit(simHit);
+ sensor.getReadout().addHit(simHit);
return simHit;
}
@@ -721,16 +756,20 @@
-
+ /**
+ * Creates a raw tracker hit at a dummy channel
+ * @param sensor that will get the hit
+ * @return lsit of a single raw tracker hit
+ */
public List<RawTrackerHit> makeRawTrackerFakeHit(SiSensor sensor)
{
- if(debug) System.out.println(this.getClass().getSimpleName() + ": makeRawTrackerFakeHit for sensor " + sensor.getName());
+ //if(debug) System.out.println(this.getClass().getSimpleName() + ": makeRawTrackerFakeHit for sensor " + sensor.getName());
List<RawTrackerHit> raw_hits = new ArrayList<RawTrackerHit>();
// Get SimTrackerHits
- IReadout ro = sensor.getReadout();
+ //IReadout ro = sensor.getReadout();
// Loop over electrodes and digitize with readout chip
@@ -739,7 +778,7 @@
if (sensor.hasElectrodesOnSide(carrier))
{
- if(debug) System.out.println(this.getClass().getSimpleName() + ": creating a dummy hit for sensor " + sensor.getName());
+ //if(debug) System.out.println(this.getClass().getSimpleName() + ": creating a dummy hit for sensor " + sensor.getName());
//SortedMap<Integer,List<Integer>> digitized_hits = _readout_chip.readout(electrode_data.get(carrier),sensor.getReadoutElectrodes(carrier));
//if(debug) System.out.println(this.getClass().getSimpleName() + ": creating a dummy hit for sensor " + sensor.getName());
@@ -754,9 +793,10 @@
}
IDetectorElement detector_element = sensor;
RawTrackerHit raw_hit = new BaseRawTrackerHit(time,cell_id,adc_values,new ArrayList<SimTrackerHit>(),detector_element);
- ro.addHit(raw_hit);
+ //ro.addHit(raw_hit);
raw_hits.add(raw_hit);
+
}
}