Commit in hps-java/src/main/java/org/lcsim/hps/recon/tracking on MAIN | |||
DataTrackerFakeHitDriver.java | +98 | -58 | 1.4 -> 1.5 |
Separated out functionality into functions: finding org loc, finding unit vector of sensor plane. Changed so that all fake hits will use the helix and plane intercept instead of z-position.
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);
+
} }
Use REPLY-ALL to reply to list
To unsubscribe from the LCD-CVS list, click the following link:
https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=LCD-CVS&A=1