Print

Print


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);
         }