Author: [log in to unmask] Date: Fri Mar 27 09:10:47 2015 New Revision: 2595 Log: Changes to HPSTrack & TrackUtils to work with 3d field map; remove old FieldMap class as it disturbs things now. Removed: java/trunk/tracking/src/main/java/org/hps/recon/tracking/FieldMap.java Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/HPSTrack.java java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackUtils.java Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/HPSTrack.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/recon/tracking/HPSTrack.java (original) +++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/HPSTrack.java Fri Mar 27 09:10:47 2015 @@ -16,6 +16,7 @@ import org.lcsim.fit.helicaltrack.HelicalTrackHit; import org.lcsim.fit.helicaltrack.HelixUtils; import org.lcsim.fit.helicaltrack.MultipleScatter; +import org.lcsim.geometry.FieldMap; import org.lcsim.spacegeom.CartesianVector; import org.lcsim.spacegeom.SpacePoint; import org.lcsim.spacegeom.SpaceVector; @@ -24,9 +25,10 @@ import org.lcsim.util.swim.Trajectory; /** - * Class HPSTrack: extension of HelicalTrackFit to include HPS-specific variables other useful + * Class HPSTrack: extension of HelicalTrackFit to include HPS-specific + * variables other useful * things. - * + * * @author mgraham created on 6/27/2011 */ // TODO: Check how much of the added behavior and information is really needed here. @@ -100,7 +102,7 @@ Double zVal = zStart; Integer nstep = 0; while (zVal < zStop) { - Double[] xyz = { 0.0, 0.0, 0.0 }; + Double[] xyz = {0.0, 0.0, 0.0}; double s = HelixUtils.PathToXPlane(this, zVal, 1000.0, 1).get(0); xyz[0] = HelixUtils.PointOnHelix(this, s).y(); xyz[1] = HelixUtils.PointOnHelix(this, s).z(); @@ -122,7 +124,7 @@ Integer nstep = 0; while (zVal < zStop) { - Double[] xyz = { 0.0, 0.0, 0.0 }; + Double[] xyz = {0.0, 0.0, 0.0}; double s = HelixUtils.PathToXPlane(this, zVal, 1000.0, 1).get(0); xyz[0] = HelixUtils.Direction(this, s).y(); xyz[1] = HelixUtils.Direction(this, s).z(); @@ -162,38 +164,52 @@ _posDocaZ = CoordinateTransformations.transformVectorToDetector(posDocaZTrkSystem); _pDocaZ = VecOp.mult(pTot, CoordinateTransformations.transformVectorToDetector(dirDocaZTrkSystem)); } - - // public Hep3Vector getPositionAtZ(double xFinal, double fringeHalfWidth, double step) { - // double startFringeUpstream = -2 * fringeHalfWidth; - // double stopFringeUpstream = 0; - // if (_debug) - // System.out.println(this.toString()); - // - // - // } - public Hep3Vector getPositionAtZ(double xFinal, double start, double stop, double step) { + + public Hep3Vector[] getPositionAtZMap(double start, double xFinal, double step) { + System.out.println("Don't use this anymore! Use the contructor with FieldMap provided"); + Hep3Vector out= new BasicHep3Vector(666,666,666); + Hep3Vector[] ret={out}; + return ret; + } + + + public Hep3Vector[] getPositionAtZMap(double start, double xFinal, double step, boolean debugOK) { + System.out.println("Don't use this anymore! Use the contructor with FieldMap provided"); + Hep3Vector out= new BasicHep3Vector(666,666,666); + Hep3Vector[] ret={out}; + return ret; + } + + /** + * Get the position and direction on the track using B-field map for + * extrapolation + * + * @param start = starting z-position of extrapolation + * @param zFinal = final z-position + * @param step = step size + * @param bmap = the B-Field map + * @return position[0] and direction[1] at Z=zfinal + */ + public Hep3Vector[] getPositionAtZMap(double start, double xFinal, double step, FieldMap bmap) { + return this.getPositionAtZMap(start, xFinal, step, bmap, false); + } + + public Hep3Vector[] getPositionAtZMap(double start, double xFinal, double step, FieldMap bmap, boolean debugOk) { double startFringe = start; - double stopFringe = stop; - // _debugForward = false; - // if (xFinal > 900) - // _debugForward = true; + + _debugForward = false; + if (xFinal > 900) + _debugForward = debugOk ? true : false; // if looking upstream, we'll be propagating backwards - if (xFinal < 0) { + if (xFinal < 0) step = -step; - startFringe = stop; - stopFringe = start; - } - double fringeHalfWidth = Math.abs(stopFringe - startFringe) / 2; - double fringeMid = (stopFringe + startFringe) / 2; - if (_debugForward) { + if (_debugForward) System.out.println(this.toString()); - } double sStartFringe = HelixUtils.PathToXPlane(this, startFringe, 1000.0, 1).get(0); - if (_debugForward) { + if (_debugForward) System.out.println("path to end of fringe = " + sStartFringe + "; xFinal = " + xFinal); - } double xtmp = startFringe; double ytmp = HelixUtils.PointOnHelix(this, sStartFringe).y(); double ztmp = HelixUtils.PointOnHelix(this, sStartFringe).z(); @@ -207,9 +223,8 @@ System.out.println("nOriginal Rorig = " + Rorig + "; xCtmp = " + xCtmp + "; yCtmp = " + yCtmp); } - if (_debugForward) { + if (_debugForward) System.out.println("Original Direction at Fringe: " + HelixUtils.Direction(this, startFringe).toString()); - } double Rtmp = Rorig; // now start stepping through the fringe field Hep3Vector r0Tmp = HelixUtils.PointOnHelix(this, sStartFringe); @@ -231,127 +246,6 @@ } // follow trajectory while: in fringe field, before end point, and we don't have a looper - while (Math.signum(step) * xtmp < Math.signum(step) * stopFringe && Math.signum(step) * xtmp < Math.signum(step) * xFinal && Math.signum(pXOrig * pXTmp) > 0) { - if (_debugForward) { - System.out.println("New step in Fringe Field"); - System.out.println("rTmp = " + rTmp.toString()); - System.out.println("pTmp = " + pTmp.toString()); - System.out.println("OriginalHelix pos = " + HelixUtils.PointOnHelix(this, totalS)); - System.out.println("OriginalHelix Momentum = " + VecOp.mult(pTot, HelixUtils.Direction(this, totalS))); - } - - double fringeFactor = getFringe(Math.signum(step) * (fringeMid - rTmp.x()), fringeHalfWidth); - // double myBField=bField * fringeFactor; - double myBField = FieldMap.getFieldFromMap(rTmp.x(), rTmp.y()); - if (_debugForward) { - System.out.println("rTmp.x() = " + rTmp.x() + " field = " + myBField); - } - setTrack(pTmp, rTmp, q, myBField); - rTmp = _trajectory.getPointAtDistance(step); - pTmp = VecOp.mult(pTot, _trajectory.getUnitTangentAtLength(step)); - pXTmp = pTmp.x(); - xtmp = rTmp.x(); - if (_debugForward) { - System.out.println("############## done... #############"); - - System.out.println("\n"); - } - totalS += step; - } - // ok, done with field...extrapolate straight back... - Hep3Vector pointInTrking; - if (Math.signum(step) * xtmp < Math.signum(step) * xFinal) { - // get direction of the track before it hits fringe field - double deltaX = xFinal - xtmp; - Hep3Vector dir = _trajectory.getUnitTangentAtLength(0); - // double deltaY = deltaX * dir.y(); - // double deltaZ = deltaX * dir.z(); - Hep3Vector delta = extrapolateStraight(dir, deltaX); - // double deltaZ = Math.sqrt(deltaX*deltaX+deltaY*deltaY)* dir.z(); - pointInTrking = new BasicHep3Vector(xFinal, delta.y() + ytmp, delta.z() + ztmp); - - if (_debugForward) { - System.out.println("Pointing straight forward from xtmp = " + xtmp + "; ytmp = " + ytmp + "; ztmp = " + ztmp + "; deltaX= " + deltaX); - System.out.println("Directions: " + dir.toString()); - System.out.println("Position at ECal: x = " + xFinal + "; y = " + pointInTrking.y() + "; z = " + pointInTrking.z()); - - } - } else { // still in the fringe field...just return the current position - // pointInTrking = new BasicHep3Vector(xFinal, ytmp, ztmp); - pointInTrking = new BasicHep3Vector(rTmp.x(), rTmp.y(), rTmp.z()); - } - return CoordinateTransformations.transformVectorToDetector(pointInTrking); - } - - /** - * Get the position and direction on the track using B-field map for extrapolation - * - * @param start = starting z-position of extrapolation - * @param zFinal = final z-position - * @param step = step size - * @return position[0] and direction[1] at Z=zfinal - */ - public Hep3Vector[] getPositionAtZMap(double start, double xFinal, double step) { - return this.getPositionAtZMap(start, xFinal, step, true); - } - - public Hep3Vector[] getPositionAtZMap(double start, double xFinal, double step, boolean debugOk) { - - double startFringe = start; - - _debugForward = false; - if (xFinal > 900) { - _debugForward = debugOk ? true : false; - } - // if looking upstream, we'll be propagating backwards - if (xFinal < 0) { - step = -step; - } - if (_debugForward) { - System.out.println(this.toString()); - } - - double sStartFringe = HelixUtils.PathToXPlane(this, startFringe, 1000.0, 1).get(0); - if (_debugForward) { - System.out.println("path to end of fringe = " + sStartFringe + "; xFinal = " + xFinal); - } - double xtmp = startFringe; - double ytmp = HelixUtils.PointOnHelix(this, sStartFringe).y(); - double ztmp = HelixUtils.PointOnHelix(this, sStartFringe).z(); - double Rorig = this.R(); - double xCtmp = this.xc(); - double yCtmp = this.yc(); - double q = Math.signum(this.curvature()); - double phitmp = getPhi(xtmp, ytmp, xCtmp, yCtmp, q); - if (_debugForward) { - System.out.println("\nOriginal xtmp = " + xtmp + "; ytmp = " + ytmp + "; ztmp = " + ztmp + "; phitmp = " + phitmp); - - System.out.println("nOriginal Rorig = " + Rorig + "; xCtmp = " + xCtmp + "; yCtmp = " + yCtmp); - } - if (_debugForward) { - System.out.println("Original Direction at Fringe: " + HelixUtils.Direction(this, startFringe).toString()); - } - double Rtmp = Rorig; - // now start stepping through the fringe field - Hep3Vector r0Tmp = HelixUtils.PointOnHelix(this, sStartFringe); - SpacePoint r0 = new SpacePoint(r0Tmp); - double pTot = this.p(bField); - Hep3Vector dirOrig = HelixUtils.Direction(this, sStartFringe); - Hep3Vector p0 = VecOp.mult(pTot, dirOrig); - Hep3Vector dirTmp = dirOrig; - SpacePoint rTmp = r0; - Hep3Vector pTmp = p0; - double pXOrig = p0.x(); - double pXTmp = pXOrig; - double totalS = sStartFringe; - if (_debugForward) { - double tmpdX = xFinal - startFringe; - Hep3Vector fooExt = extrapolateStraight(dirOrig, tmpdX); - Hep3Vector fooFinal = VecOp.add(fooExt, r0Tmp); - System.out.println("Extrpolating straight back from startFringe = (" + fooFinal.x() + "," + fooFinal.y() + "," + fooFinal.z() + ")"); - - } - // follow trajectory while: in fringe field, before end point, and we don't have a looper while (Math.signum(step) * xtmp < Math.signum(step) * xFinal && Math.signum(pXOrig * pXTmp) > 0) { if (_debugForward) { System.out.println("New step in Fringe Field"); @@ -361,10 +255,9 @@ System.out.println("OriginalHelix Momentum = " + VecOp.mult(pTot, HelixUtils.Direction(this, totalS))); } - double myBField = FieldMap.getFieldFromMap(rTmp.x(), rTmp.y()); - if (_debugForward) { + double myBField = bmap.getField(new BasicHep3Vector(rTmp.z(), rTmp.z(), rTmp.x())).z(); // note weird co ordinates for track vs det + if (_debugForward) System.out.println("rTmp.x() = " + rTmp.x() + " field = " + myBField); - } setTrack(pTmp, rTmp, q, myBField); rTmp = _trajectory.getPointAtDistance(step); pTmp = VecOp.mult(pTot, _trajectory.getUnitTangentAtLength(step)); @@ -394,10 +287,10 @@ System.out.println("OriginalHelix Momentum = " + VecOp.mult(pTot, HelixUtils.Direction(this, totalS))); } - double myBField = FieldMap.getFieldFromMap(rTmp.x(), rTmp.y()); - if (_debugForward) { + double myBField = bmap.getField(new BasicHep3Vector(rTmp.z(), rTmp.z(), rTmp.x())).z(); // note weird co ordinates for track vs det + + if (_debugForward) System.out.println("rTmp.x() = " + rTmp.x() + " field = " + myBField); - } setTrack(pTmp, rTmp, q, myBField); rTmp = _trajectory.getPointAtDistance(step); pTmp = VecOp.mult(pTot, _trajectory.getUnitTangentAtLength(step)); @@ -405,7 +298,6 @@ xtmp = rTmp.x(); if (_debugForward) { System.out.println("############## done... #############"); - System.out.println("\n"); } totalS += step; @@ -413,10 +305,9 @@ // ok, done with field. Hep3Vector pointInTrking = new BasicHep3Vector(rTmp.x(), rTmp.y(), rTmp.z()); - if (_debugForward) { + if (_debugForward) System.out.println("Position xfinal (tracking) : x = " + xFinal + "; y = " + pointInTrking.y() + "; z = " + pointInTrking.z()); - } - Hep3Vector[] out = { CoordinateTransformations.transformVectorToDetector(pointInTrking), CoordinateTransformations.transformVectorToDetector(pTmp) }; + Hep3Vector[] out = {CoordinateTransformations.transformVectorToDetector(pointInTrking), CoordinateTransformations.transformVectorToDetector(pTmp)}; return out; } @@ -435,12 +326,10 @@ // field that changes linearly from Bmax->0 private double getFringe(double x, double halfWidth) { // System.out.println("x = " + x + "; halfWidth = " + halfWidth); - if (x / halfWidth > 1) { + if (x / halfWidth > 1) return 1; - } - if (x / halfWidth < -1) { + if (x / halfWidth < -1) return 0; - } return (1.0 / 2.0) * (1 + x / halfWidth); } @@ -478,9 +367,8 @@ if (q != 0 && field != 0) { double radius = p.rxy() / (q * field); _trajectory = new Helix(r0, radius, phi, lambda); - } else { + } else _trajectory = new Line(r0, phi, lambda); - } } public Trajectory getTrajectory() { @@ -489,7 +377,7 @@ /** * Get the MC Particle associated with the HelicalTrackFit - * + * * @return mcParticle : */ public MCParticle getMCParticle() { @@ -498,7 +386,7 @@ /** * Set the MC Particle associated with the HelicalTrackFit - * + * * @param mcParticle : */ public void setMCParticle(MCParticle mcParticle) { Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackUtils.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackUtils.java (original) +++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackUtils.java Fri Mar 27 09:10:47 2015 @@ -719,7 +719,8 @@ HPSTrack hpstrk1 = new HPSTrack(htf1); Hep3Vector pos1; if (useFringe) { - pos1 = hpstrk1.getPositionAtZMap(100.0, zVal, 5.0)[0]; + // broken because you need ot provide the Field Map to get this... +// pos1 = hpstrk1.getPositionAtZMap(100.0, zVal, 5.0)[0]; } else { pos1 = TrackUtils.extrapolateTrack(trk1, zVal); }