Print

Print


Author: [log in to unmask]
Date: Thu Oct  1 18:39:46 2015
New Revision: 3749

Log:
more cleanup to GBL

Modified:
    java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackUtils.java
    java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/FittedGblTrajectory.java
    java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutput.java
    java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutputDriver.java
    java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblUtils.java
    java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblFitter.java
    java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblRefitter.java
    java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/MakeGblTracks.java

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	Thu Oct  1 18:39:46 2015
@@ -994,16 +994,12 @@
     }
 
     public static double getTrackTime(Track track, RelationalTable hitToStrips, RelationalTable hitToRotated) {
-        int nStrips = 0;
         double meanTime = 0;
-        for (TrackerHit hit : track.getTrackerHits()) {
-            Set<TrackerHit> htsList = hitToStrips.allFrom(hitToRotated.from(hit));
-            for (TrackerHit hts : htsList) {
-                nStrips++;
-                meanTime += hts.getTime();
-            }
-        }
-        meanTime /= nStrips;
+        List<TrackerHit> stripHits = getStripHits(track, hitToStrips, hitToRotated);
+        for (TrackerHit hit : stripHits) {
+            meanTime += hit.getTime();
+        }
+        meanTime /= stripHits.size();
         return meanTime;
     }
 
@@ -1280,4 +1276,8 @@
         }
         return null;
     }
+
+    public static Hep3Vector getBField(Detector detector) {
+        return detector.getFieldMap().getField(new BasicHep3Vector(0., 0., 500.0));
+    }
 }

Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/FittedGblTrajectory.java
 =============================================================================
--- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/FittedGblTrajectory.java	(original)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/FittedGblTrajectory.java	Thu Oct  1 18:39:46 2015
@@ -56,12 +56,6 @@
         _ndf = ndf;
         _lost = lost;
     }
-    public void set_track_data(GBLTrackData t) {
-       _t  = t;
-    }
-    public GBLTrackData get_track_data() {
-        return _t;
-    }
     public void set_seed(Track seed) {
         _seed = seed;
     }

Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutput.java
 =============================================================================
--- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutput.java	(original)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutput.java	Thu Oct  1 18:39:46 2015
@@ -13,7 +13,6 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import org.apache.commons.math3.util.Pair;
 import org.hps.recon.tracking.CoordinateTransformations;
 import org.hps.recon.tracking.MaterialSupervisor;
 import org.hps.recon.tracking.MultipleScattering;
@@ -21,15 +20,8 @@
 import org.hps.recon.tracking.MultipleScattering.ScatterPoints;
 import org.hps.recon.tracking.TrackUtils;
 import org.hps.recon.tracking.TrackerHitUtils;
-import org.lcsim.detector.DetectorIdentifierHelper;
 import org.lcsim.detector.IDetectorElement;
-import org.lcsim.detector.ITransform3D;
-import org.lcsim.detector.identifier.IIdentifier;
-import org.lcsim.detector.identifier.IIdentifierHelper;
-import org.lcsim.detector.tracker.silicon.ChargeCarrier;
 import org.lcsim.detector.tracker.silicon.HpsSiSensor;
-import org.lcsim.detector.tracker.silicon.SiSensor;
-import org.lcsim.detector.tracker.silicon.SiSensorElectrodes;
 import org.lcsim.event.MCParticle;
 import org.lcsim.event.RawTrackerHit;
 import org.lcsim.event.SimTrackerHit;
@@ -468,7 +460,7 @@
                     if (_debug > 0) {
                         System.out.printf("%s: WARNING cannot find scatter for detector %s with strip cluster at %s\n", this.getClass(), ((RawTrackerHit) strip.getStrip().rawhits().get(0)).getDetectorElement().getName(), strip.origin().toString());
                     }
-                    scatAngle = GblUtils.estimateScatter(strip, htf, _scattering, _B.magnitude());
+                    scatAngle = GblUtils.estimateScatter(sensor, htf, _scattering, _B.magnitude());
                 }
 
                 //GBLDATA
@@ -486,223 +478,6 @@
             addBeamspotToHitList(htf, stripClusterDataList, istrip, htfTruth);
         }
 
-    }
-
-    static List<GBLStripClusterData> printGBL(HelicalTrackFit htf, List<SiTrackerHitStrip1D> hitsOnTrack, MultipleScattering _scattering, double _B, int _debug) {
-        List<GBLStripClusterData> stripClusterDataList = new ArrayList<GBLStripClusterData>();
-
-        // Find scatter points along the path
-        ScatterPoints scatters = _scattering.FindHPSScatterPoints(htf);
-
-        if (_debug > 0) {
-            System.out.printf("perPar covariance matrix\n%s\n", htf.covariance().toString());
-        }
-
-        for (SiTrackerHitStrip1D hitOnTrack : hitsOnTrack) {
-            HelicalTrackStripGbl strip = new HelicalTrackStripGbl(makeDigiStrip(hitOnTrack), true);
-
-            // find Millepede layer definition from DetectorElement
-            IDetectorElement de = ((RawTrackerHit) strip.getStrip().rawhits().get(0)).getDetectorElement();
-            HpsSiSensor sensor;
-            if (de instanceof HpsSiSensor) {
-                sensor = (HpsSiSensor) de;
-            } else {
-                throw new ClassCastException("Detector element " + de.getName() + " couldn't be casted to " + HpsSiSensor.class.getName());
-            }
-
-            int millepedeId = sensor.getMillepedeId();
-
-            if (_debug > 0) {
-                System.out.printf("layer %d millepede %d (DE=\"%s\", origin %s) \n", strip.layer(), millepedeId, sensor.getName(), strip.origin().toString());
-            }
-
-            //Center of the sensor
-            Hep3Vector origin = strip.origin();
-
-            //Find intercept point with sensor in tracking frame
-            Hep3Vector trkpos = TrackUtils.getHelixPlaneIntercept(htf, strip, Math.abs(_B));
-            if (trkpos == null) {
-                if (_debug > 0) {
-                    System.out.println("Can't find track intercept; use sensor origin");
-                }
-                trkpos = strip.origin();
-            }
-            if (_debug > 0) {
-                System.out.printf("trkpos at intercept [%.10f %.10f %.10f]\n", trkpos.x(), trkpos.y(), trkpos.z());
-            }
-
-            //GBLDATA
-            GBLStripClusterData stripData = new GBLStripClusterData(millepedeId);
-            //Add to output list
-            stripClusterDataList.add(stripData);
-
-            //path length to intercept
-            double s = HelixUtils.PathToXPlane(htf, trkpos.x(), 0, 0).get(0);
-            double s3D = s / Math.cos(Math.atan(htf.slope()));
-
-            //GBLDATA
-            stripData.setPath(s);
-            stripData.setPath3D(s3D);
-
-            //GBLDATA
-            stripData.setU(strip.u());
-            stripData.setV(strip.v());
-            stripData.setW(strip.w());
-
-            //Print track direction at intercept
-            Hep3Vector tDir = HelixUtils.Direction(htf, s);
-            double phi = htf.phi0() - s / htf.R();
-            double lambda = Math.atan(htf.slope());
-
-            //GBLDATA
-            stripData.setTrackDir(tDir);
-            stripData.setTrackPhi(phi);
-            stripData.setTrackLambda(lambda);
-
-            //Print residual in measurement system
-            // start by find the distance vector between the center and the track position
-            Hep3Vector vdiffTrk = VecOp.sub(trkpos, origin);
-
-            // then find the rotation from tracking to measurement frame
-            Hep3Matrix trkToStripRot = getTrackToStripRotation(strip.getStrip());
-
-            // then rotate that vector into the measurement frame to get the predicted measurement position
-            Hep3Vector trkpos_meas = VecOp.mult(trkToStripRot, vdiffTrk);
-
-            //GBLDATA
-            stripData.setMeas(strip.umeas());
-            stripData.setTrackPos(trkpos_meas);
-            stripData.setMeasErr(strip.du());
-
-            if (_debug > 1) {
-                System.out.printf("rotation matrix to meas frame\n%s\n", VecOp.toString(trkToStripRot));
-                System.out.printf("tPosGlobal %s origin %s\n", trkpos.toString(), origin.toString());
-                System.out.printf("tDiff %s\n", vdiffTrk.toString());
-                System.out.printf("tPosMeas %s\n", trkpos_meas.toString());
-            }
-
-            if (_debug > 0) {
-                System.out.printf("layer %d millePedeId %d uRes %.10f\n", strip.layer(), millepedeId, stripData.getMeas() - stripData.getTrackPos().x());
-            }
-
-            // find scattering angle
-            ScatterPoint scatter = scatters.getScatterPoint(((RawTrackerHit) strip.getStrip().rawhits().get(0)).getDetectorElement());
-            double scatAngle;
-
-            if (scatter != null) {
-                scatAngle = scatter.getScatterAngle().Angle();
-            } else {
-                if (_debug > 0) {
-                    System.out.printf("WARNING cannot find scatter for detector %s with strip cluster at %s\n", ((RawTrackerHit) strip.getStrip().rawhits().get(0)).getDetectorElement().getName(), strip.origin().toString());
-                }
-                scatAngle = GblUtils.estimateScatter(strip, htf, _scattering, _B);
-            }
-
-            //GBLDATA
-            stripData.setScatterAngle(scatAngle);
-        }
-        return stripClusterDataList;
-    }
-
-    private static Hep3Matrix getTrackToStripRotation(HelicalTrackStrip strip) {
-        // This function transforms the hit to the sensor coordinates
-
-        // Transform from JLab frame to sensor frame (done through the RawTrackerHit)
-        RawTrackerHit rth = (RawTrackerHit) strip.rawhits().get(0);
-        IDetectorElement ide = rth.getDetectorElement();
-        SiSensor sensor = ide.findDescendants(SiSensor.class).get(0);
-        SiSensorElectrodes electrodes = sensor.getReadoutElectrodes(ChargeCarrier.HOLE);
-        ITransform3D detToStrip = electrodes.getGlobalToLocal();
-        // Get rotation matrix
-        Hep3Matrix detToStripMatrix = detToStrip.getRotation().getRotationMatrix();
-        // Transformation between the JLAB and tracking coordinate systems
-        Hep3Matrix detToTrackMatrix = CoordinateTransformations.getMatrix();
-
-        return VecOp.mult(detToStripMatrix, VecOp.inverse(detToTrackMatrix));
-    }
-
-    private static String getName(IDetectorElement de) {
-        //  Find the first level down from the top of the de tree
-        while (de.getParent().getParent() != null) {
-            de = de.getParent();
-        }
-        //  Find the name of this detector
-        String detname = de.getName();
-        return detname;
-    }
-
-    private static int getLayer(IDetectorElement de) {
-        int layer = -1;
-        IIdentifierHelper hlp = de.getIdentifierHelper();
-        if (hlp instanceof DetectorIdentifierHelper) {
-            DetectorIdentifierHelper dehlp = (DetectorIdentifierHelper) hlp;
-            //  Get the identifier
-            IIdentifier id = de.getIdentifier();
-            //  Get the layer number
-            layer = dehlp.getLayerValue(id);
-        }
-        return layer;
-    }
-
-    private static BarrelEndcapFlag getBarrelEndcapFlag(IDetectorElement de) {
-        BarrelEndcapFlag beflag = BarrelEndcapFlag.UNKNOWN;
-        //  Find the second level down from the top of the de tree
-        while (de.getParent().getParent().getParent() != null) {
-            de = de.getParent();
-        }
-        //  Get the DetectorIdentifierHelper
-        IIdentifierHelper hlp = de.getIdentifierHelper();
-        if (hlp instanceof DetectorIdentifierHelper) {
-            DetectorIdentifierHelper dehlp = (DetectorIdentifierHelper) hlp;
-            //  Get the identifier
-            IIdentifier id = de.getIdentifier();
-            //  Get the BarrelEndcapFlag
-            if (dehlp.isBarrel(id)) {
-                beflag = BarrelEndcapFlag.BARREL;
-            } else if (dehlp.isEndcapPositive(id)) {
-                beflag = BarrelEndcapFlag.ENDCAP_NORTH;
-            } else if (dehlp.isEndcapNegative(id)) {
-                beflag = BarrelEndcapFlag.ENDCAP_SOUTH;
-            }
-        }
-        return beflag;
-    }
-
-    private static HelicalTrackStrip makeDigiStrip(SiTrackerHitStrip1D h) {
-        SiTrackerHitStrip1D local = h.getTransformedHit(TrackerHitType.CoordinateSystem.SENSOR);
-        SiTrackerHitStrip1D global = h.getTransformedHit(TrackerHitType.CoordinateSystem.GLOBAL);
-
-        ITransform3D trans = local.getLocalToGlobal();
-        Hep3Vector org = trans.transformed(new BasicHep3Vector(0., 0., 0.));
-        Hep3Vector u = global.getMeasuredCoordinate();
-        Hep3Vector v = global.getUnmeasuredCoordinate();
-
-        double umeas = local.getPosition()[0];
-        double vmin = VecOp.dot(local.getUnmeasuredCoordinate(), local.getHitSegment().getStartPoint());
-        double vmax = VecOp.dot(local.getUnmeasuredCoordinate(), local.getHitSegment().getEndPoint());
-        double du = Math.sqrt(local.getCovarianceAsMatrix().diagonal(0));
-
-        IDetectorElement de = h.getSensor();
-        String det = getName(de);
-        int lyr = getLayer(de);
-        BarrelEndcapFlag be = getBarrelEndcapFlag(de);
-
-        double dEdx = h.getdEdx();
-        double time = h.getTime();
-        List<RawTrackerHit> rawhits = h.getRawHits();
-        HelicalTrackStrip strip = new HelicalTrackStrip(org, u, v, umeas, du, vmin, vmax, dEdx, time, rawhits, det, lyr, be);
-
-        try {
-            if (h.getMCParticles() != null) {
-                for (MCParticle p : h.getMCParticles()) {
-                    strip.addMCParticle(p);
-                }
-            }
-        } catch (RuntimeException e) {
-            // Okay when MC info not present.
-        }
-
-        return strip;
     }
 
     /**

Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutputDriver.java
 =============================================================================
--- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutputDriver.java	(original)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutputDriver.java	Thu Oct  1 18:39:46 2015
@@ -65,7 +65,7 @@
 
     @Override
     public void detectorChanged(Detector detector) {
-        Hep3Vector bfield = detector.getFieldMap().getField(new BasicHep3Vector(0., 0., 500.0));
+        Hep3Vector bfield = TrackUtils.getBField(detector);
 
         // Create the class that handles all the GBL output
         gbl = new GBLOutput(gblFileName, bfield); // if filename is empty no text file is written

Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblUtils.java
 =============================================================================
--- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblUtils.java	(original)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblUtils.java	Thu Oct  1 18:39:46 2015
@@ -1,12 +1,30 @@
 package org.hps.recon.tracking.gbl;
 
 import hep.physics.matrix.BasicMatrix;
+import hep.physics.vec.BasicHep3Vector;
+import hep.physics.vec.Hep3Matrix;
+import hep.physics.vec.Hep3Vector;
+import hep.physics.vec.VecOp;
+import java.util.ArrayList;
+import java.util.List;
+import org.hps.recon.tracking.CoordinateTransformations;
 import org.hps.recon.tracking.MaterialSupervisor;
 import org.hps.recon.tracking.MultipleScattering;
+import org.hps.recon.tracking.TrackUtils;
+import org.lcsim.constants.Constants;
 import org.lcsim.detector.IDetectorElement;
+import org.lcsim.detector.ITransform3D;
+import org.lcsim.detector.tracker.silicon.ChargeCarrier;
+import org.lcsim.detector.tracker.silicon.HpsSiSensor;
+import org.lcsim.detector.tracker.silicon.SiSensor;
+import org.lcsim.detector.tracker.silicon.SiSensorElectrodes;
 import org.lcsim.event.RawTrackerHit;
+import org.lcsim.event.TrackerHit;
 import org.lcsim.fit.helicaltrack.HelicalTrackFit;
+import org.lcsim.fit.helicaltrack.HelicalTrackStrip;
 import org.lcsim.fit.helicaltrack.HelixUtils;
+import org.lcsim.recon.tracking.digitization.sisim.SiTrackerHitStrip1D;
+import org.lcsim.recon.tracking.digitization.sisim.TrackerHitType;
 import org.lcsim.recon.tracking.seedtracker.ScatterAngle;
 
 /**
@@ -82,12 +100,11 @@
         return mat;
     }
 
-    public static double estimateScatter(HelicalTrackStripGbl strip, HelicalTrackFit htf, MultipleScattering scattering, double _B) {
+    public static double estimateScatter(IDetectorElement hitElement, HelicalTrackFit htf, MultipleScattering scattering, double _B) {
         //can be edge case where helix is outside, but close to sensor, so make a new scatter point assuming the helix does pass through the sensor
         MaterialSupervisor.DetectorPlane hitPlane = null;
         if (MaterialSupervisor.class.isInstance(scattering.getMaterialManager())) {
             MaterialSupervisor matSup = (MaterialSupervisor) scattering.getMaterialManager();
-            IDetectorElement hitElement = ((RawTrackerHit) strip.getStrip().rawhits().get(0)).getDetectorElement();
             for (MaterialSupervisor.ScatteringDetectorVolume vol : matSup.getMaterialVolumes()) {
                 if (vol.getDetectorElement() == hitElement) {
                     hitPlane = (MaterialSupervisor.DetectorPlane) vol;
@@ -107,4 +124,174 @@
             throw new UnsupportedOperationException("Should not happen. This problem is only solved with the MaterialSupervisor.");
         }
     }
+
+    public static FittedGblTrajectory doGBLFit(HelicalTrackFit htf, List<TrackerHit> stripHits, MultipleScattering _scattering, double bfield, int debug) {
+        List<GBLStripClusterData> stripData = makeStripData(htf, stripHits, _scattering, bfield, debug);
+        double bfac = Constants.fieldConversion * bfield;
+
+        FittedGblTrajectory fit = HpsGblRefitter.fit(stripData, bfac, debug > 0);
+        return fit;
+    }
+
+    public static List<GBLStripClusterData> makeStripData(HelicalTrackFit htf, List<TrackerHit> stripHits, MultipleScattering _scattering, double _B, int _debug) {
+        List<GBLStripClusterData> stripClusterDataList = new ArrayList<GBLStripClusterData>();
+
+        // Find scatter points along the path
+        MultipleScattering.ScatterPoints scatters = _scattering.FindHPSScatterPoints(htf);
+
+        if (_debug > 0) {
+            System.out.printf("perPar covariance matrix\n%s\n", htf.covariance().toString());
+        }
+
+        for (TrackerHit stripHit : stripHits) {
+            HelicalTrackStripGbl strip;
+            if (stripHit instanceof SiTrackerHitStrip1D) {
+                strip = new HelicalTrackStripGbl(makeDigiStrip((SiTrackerHitStrip1D) stripHit), true);
+            } else {
+                SiTrackerHitStrip1D newHit = new SiTrackerHitStrip1D(stripHit);
+                strip = new HelicalTrackStripGbl(makeDigiStrip(newHit), true);
+            }
+
+            // find Millepede layer definition from DetectorElement
+            HpsSiSensor sensor = (HpsSiSensor) ((RawTrackerHit) stripHit.getRawHits().get(0)).getDetectorElement();
+
+            int millepedeId = sensor.getMillepedeId();
+
+            if (_debug > 0) {
+                System.out.printf("layer %d millepede %d (DE=\"%s\", origin %s) \n", strip.layer(), millepedeId, sensor.getName(), strip.origin().toString());
+            }
+
+            //Center of the sensor
+            Hep3Vector origin = strip.origin();
+
+            //Find intercept point with sensor in tracking frame
+            Hep3Vector trkpos = TrackUtils.getHelixPlaneIntercept(htf, strip, Math.abs(_B));
+            if (trkpos == null) {
+                if (_debug > 0) {
+                    System.out.println("Can't find track intercept; use sensor origin");
+                }
+                trkpos = strip.origin();
+            }
+            if (_debug > 0) {
+                System.out.printf("trkpos at intercept [%.10f %.10f %.10f]\n", trkpos.x(), trkpos.y(), trkpos.z());
+            }
+
+            //GBLDATA
+            GBLStripClusterData stripData = new GBLStripClusterData(millepedeId);
+            //Add to output list
+            stripClusterDataList.add(stripData);
+
+            //path length to intercept
+            double s = HelixUtils.PathToXPlane(htf, trkpos.x(), 0, 0).get(0);
+            double s3D = s / Math.cos(Math.atan(htf.slope()));
+
+            //GBLDATA
+            stripData.setPath(s);
+            stripData.setPath3D(s3D);
+
+            //GBLDATA
+            stripData.setU(strip.u());
+            stripData.setV(strip.v());
+            stripData.setW(strip.w());
+
+            //Print track direction at intercept
+            Hep3Vector tDir = HelixUtils.Direction(htf, s);
+            double phi = htf.phi0() - s / htf.R();
+            double lambda = Math.atan(htf.slope());
+
+            //GBLDATA
+            stripData.setTrackDir(tDir);
+            stripData.setTrackPhi(phi);
+            stripData.setTrackLambda(lambda);
+
+            //Print residual in measurement system
+            // start by find the distance vector between the center and the track position
+            Hep3Vector vdiffTrk = VecOp.sub(trkpos, origin);
+
+            // then find the rotation from tracking to measurement frame
+            Hep3Matrix trkToStripRot = getTrackToStripRotation(sensor);
+
+            // then rotate that vector into the measurement frame to get the predicted measurement position
+            Hep3Vector trkpos_meas = VecOp.mult(trkToStripRot, vdiffTrk);
+
+            //GBLDATA
+            stripData.setMeas(strip.umeas());
+            stripData.setTrackPos(trkpos_meas);
+            stripData.setMeasErr(strip.du());
+
+            if (_debug > 1) {
+                System.out.printf("rotation matrix to meas frame\n%s\n", VecOp.toString(trkToStripRot));
+                System.out.printf("tPosGlobal %s origin %s\n", trkpos.toString(), origin.toString());
+                System.out.printf("tDiff %s\n", vdiffTrk.toString());
+                System.out.printf("tPosMeas %s\n", trkpos_meas.toString());
+            }
+
+            if (_debug > 0) {
+                System.out.printf("layer %d millePedeId %d uRes %.10f\n", strip.layer(), millepedeId, stripData.getMeas() - stripData.getTrackPos().x());
+            }
+
+            // find scattering angle
+            MultipleScattering.ScatterPoint scatter = scatters.getScatterPoint(((RawTrackerHit) strip.getStrip().rawhits().get(0)).getDetectorElement());
+            double scatAngle;
+
+            if (scatter != null) {
+                scatAngle = scatter.getScatterAngle().Angle();
+            } else {
+                if (_debug > 0) {
+                    System.out.printf("WARNING cannot find scatter for detector %s with strip cluster at %s\n", ((RawTrackerHit) strip.getStrip().rawhits().get(0)).getDetectorElement().getName(), strip.origin().toString());
+                }
+                scatAngle = GblUtils.estimateScatter(sensor, htf, _scattering, _B);
+            }
+
+            //GBLDATA
+            stripData.setScatterAngle(scatAngle);
+        }
+        return stripClusterDataList;
+    }
+
+    private static Hep3Matrix getTrackToStripRotation(SiSensor sensor) {
+        // This function transforms the hit to the sensor coordinates
+
+        // Transform from JLab frame to sensor frame (done through the RawTrackerHit)
+        SiSensorElectrodes electrodes = sensor.getReadoutElectrodes(ChargeCarrier.HOLE);
+        ITransform3D detToStrip = electrodes.getGlobalToLocal();
+        // Get rotation matrix
+        Hep3Matrix detToStripMatrix = detToStrip.getRotation().getRotationMatrix();
+        // Transformation between the JLAB and tracking coordinate systems
+        Hep3Matrix detToTrackMatrix = CoordinateTransformations.getMatrix();
+
+        return VecOp.mult(detToStripMatrix, VecOp.inverse(detToTrackMatrix));
+    }
+
+    private static HelicalTrackStrip makeDigiStrip(SiTrackerHitStrip1D h) {
+        SiTrackerHitStrip1D local = h.getTransformedHit(TrackerHitType.CoordinateSystem.SENSOR);
+        SiTrackerHitStrip1D global = h.getTransformedHit(TrackerHitType.CoordinateSystem.GLOBAL);
+
+        ITransform3D trans = local.getLocalToGlobal();
+        Hep3Vector org = trans.transformed(new BasicHep3Vector(0., 0., 0.));
+        Hep3Vector u = global.getMeasuredCoordinate();
+        Hep3Vector v = global.getUnmeasuredCoordinate();
+
+        //rotate to tracking frame
+        Hep3Vector neworigin = CoordinateTransformations.transformVectorToTracking(org);
+        Hep3Vector newu = CoordinateTransformations.transformVectorToTracking(u);
+        Hep3Vector newv = CoordinateTransformations.transformVectorToTracking(v);
+
+        double umeas = local.getPosition()[0];
+        double vmin = VecOp.dot(local.getUnmeasuredCoordinate(), local.getHitSegment().getStartPoint());
+        double vmax = VecOp.dot(local.getUnmeasuredCoordinate(), local.getHitSegment().getEndPoint());
+        double du = Math.sqrt(local.getCovarianceAsMatrix().diagonal(0));
+
+        //don't fill fields we don't use
+//        IDetectorElement de = h.getSensor();
+//        String det = getName(de);
+//        int lyr = getLayer(de);
+//        BarrelEndcapFlag be = getBarrelEndcapFlag(de);
+        double dEdx = h.getdEdx();
+        double time = h.getTime();
+        List<RawTrackerHit> rawhits = h.getRawHits();
+        HelicalTrackStrip strip = new HelicalTrackStrip(neworigin, newu, newv, umeas, du, vmin, vmax, dEdx, time, rawhits, null, -1, null);
+
+        return strip;
+    }
 }

Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblFitter.java
 =============================================================================
--- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblFitter.java	(original)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblFitter.java	Thu Oct  1 18:39:46 2015
@@ -303,7 +303,7 @@
                 if (_debug) {
                     System.out.printf("%s: WARNING cannot find scatter for detector %s with strip cluster at %s\n", this.getClass(), ((RawTrackerHit) strip.getStrip().rawhits().get(0)).getDetectorElement().getName(), strip.origin().toString());
                 }
-                scatAngle = GblUtils.estimateScatter(strip, htf, _scattering, _B);
+                scatAngle = GblUtils.estimateScatter(((RawTrackerHit) strip.getStrip().rawhits().get(0)).getDetectorElement(), htf, _scattering, _B);
             }
 
             // Scattering angle in the curvilinear frame

Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblRefitter.java
 =============================================================================
--- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblRefitter.java	(original)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblRefitter.java	Thu Oct  1 18:39:46 2015
@@ -13,6 +13,7 @@
 import java.util.logging.Formatter;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import org.hps.recon.tracking.TrackUtils;
 import org.hps.recon.tracking.gbl.matrix.Matrix;
 import org.hps.recon.tracking.gbl.matrix.SymMatrix;
 import org.hps.recon.tracking.gbl.matrix.Vector;
@@ -94,9 +95,7 @@
 
     @Override
     protected void process(EventHeader event) {
-//        Hep3Vector bfieldvec = event.getDetector().getFieldMap().getField(new BasicHep3Vector(0., 0., 1.));
-        Hep3Vector bfieldvec = event.getDetector().getFieldMap().getField(new BasicHep3Vector(0., 0., 500.));//mg...get the b-field in the middle of the magnet
-        double bfield = bfieldvec.y();
+        double bfield = TrackUtils.getBField(event.getDetector()).y();
         //double bfac = 0.0002998 * bfield;
         double bfac = Constants.fieldConversion * bfield;
 
@@ -155,11 +154,9 @@
 
         // loop over the tracks and do the GBL fit
         List<FittedGblTrajectory> trackFits = new ArrayList<FittedGblTrajectory>();
-        int trackNum = 0;
         logger.info("Trying to fit " + stripsGblMap.size() + " tracks");
         for (GBLTrackData t : stripsGblMap.keySet()) {
             FittedGblTrajectory traj = fit(stripsGblMap.get(t), bfac, _debug);
-            ++trackNum;
             if (traj != null) {
                 logger.info("GBL fit successful");
                 if (_debug) {
@@ -170,7 +167,6 @@
                     traj.get_traj().milleOut(mille);
                 }
                 traj.set_seed(gblToSeedMap.get(t));
-                traj.set_track_data(t);
                 trackFits.add(traj);
             } else {
                 logger.info("GBL fit failed");
@@ -194,7 +190,7 @@
 
     }
 
-    private static FittedGblTrajectory fit(List<GBLStripClusterData> hits, double bfac, boolean debug) {
+    public static FittedGblTrajectory fit(List<GBLStripClusterData> hits, double bfac, boolean debug) {
         // path length along trajectory
         double s = 0.;
 

Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/MakeGblTracks.java
 =============================================================================
--- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/MakeGblTracks.java	(original)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/MakeGblTracks.java	Thu Oct  1 18:39:46 2015
@@ -13,6 +13,7 @@
 
 import org.apache.commons.math3.util.Pair;
 import org.hps.recon.tracking.TrackType;
+import static org.hps.recon.tracking.gbl.GBLOutput.getPerToClPrj;
 import org.hps.recon.tracking.gbl.matrix.Matrix;
 import org.hps.recon.tracking.gbl.matrix.SymMatrix;
 import org.hps.recon.tracking.gbl.matrix.Vector;
@@ -50,10 +51,11 @@
     }
 
     public void setDebug(boolean debug) {
-        if (debug) 
+        if (debug) {
             logger.setLevel(Level.INFO);
-        else 
+        } else {
             logger.setLevel(Level.OFF);
+        }
     }
 
     /**
@@ -72,50 +74,14 @@
 
         for (FittedGblTrajectory fittedTraj : gblTrajectories) {
 
-            //  Initialize the reference point to the origin
-            double[] ref = new double[]{0., 0., 0.};
             SeedTrack seedTrack = (SeedTrack) fittedTraj.get_seed();
             SeedCandidate trackseed = seedTrack.getSeedCandidate();
 
-            //  Create a new SeedTrack
-            BaseTrack trk = new BaseTrack();
-
-            //  Add the hits to the track
-            for (HelicalTrackHit hit : trackseed.getHits()) {
-                trk.addHit((TrackerHit) hit);
-            }
-
-            //  Retrieve the helix
-            HelicalTrackFit helix = trackseed.getHelix();
-            // Set state at vertex
-            Pair<double[], SymmetricMatrix> correctedHelixParams = getGblCorrectedHelixParameters(helix, fittedTraj, bfield, FittedGblTrajectory.GBLPOINT.IP);
-            trk.setTrackParameters(correctedHelixParams.getFirst(), bfield);// hack to set the track charge
-            trk.getTrackStates().clear();
-
-            TrackState stateVertex = new BaseTrackState(correctedHelixParams.getFirst(), ref, correctedHelixParams.getSecond().asPackedArray(true), TrackState.AtIP, bfield);
-            trk.getTrackStates().add(stateVertex);
-            
-            // Set state at last point
-            Pair<double[], SymmetricMatrix> correctedHelixParamsLast = getGblCorrectedHelixParameters(helix, fittedTraj, bfield, FittedGblTrajectory.GBLPOINT.LAST);
-            TrackState stateLast = new BaseTrackState(correctedHelixParamsLast.getFirst(), ref, correctedHelixParamsLast.getSecond().asPackedArray(true), TrackState.AtLastHit, bfield);
-            trk.getTrackStates().add(stateLast);
-            
-            // Set other info needed
-            trk.setChisq(fittedTraj.get_chi2());
-            trk.setNDF(fittedTraj.get_ndf());
-            trk.setFitSuccess(true);
-            trk.setRefPointIsDCA(true);
-            trk.setTrackType(TrackType.setGBL(seedTrack.getType(), true));
-            
+            //  Create a new Track
+            Track trk = makeCorrectedTrack(fittedTraj, trackseed.getHelix(), seedTrack.getTrackerHits(), seedTrack.getType(), bfield);
+
             //  Add the track to the list of tracks
             tracks.add(trk);
-            logger.info(String.format("helix chi2 %f ndf %d gbl chi2 %f ndf %d\n", helix.chisqtot(), helix.ndf()[0] + helix.ndf()[1], trk.getChi2(), trk.getNDF()));
-            if (logger.getLevel().intValue() <= Level.INFO.intValue()) {
-                for (int i = 0; i < 5; ++i) {
-                    logger.info(String.format("param %d: %.10f -> %.10f    helix-gbl= %f", i, helix.parameters()[i], trk.getTrackParameter(i), helix.parameters()[i] - trk.getTrackParameter(i)));
-                }
-            }
-
         }
 
         logger.info("adding " + Integer.toString(tracks.size()) + " Gbl tracks to event with " + event.get(Track.class, "MatchedTracks").size() + " matched tracks");
@@ -125,16 +91,59 @@
         event.put(_TrkCollectionName, tracks, Track.class, flag);
     }
 
-    
+    public static Track makeCorrectedTrack(FittedGblTrajectory fittedTraj, HelicalTrackFit helix, List<TrackerHit> trackHits, int trackType, double bfield) {
+        //  Initialize the reference point to the origin
+        double[] ref = new double[]{0., 0., 0.};
+
+        //  Create a new SeedTrack
+        BaseTrack trk = new BaseTrack();
+
+        //  Add the hits to the track
+        for (TrackerHit hit : trackHits) {
+            trk.addHit(hit);
+        }
+
+        // Set state at vertex
+        Pair<double[], SymmetricMatrix> correctedHelixParams = getGblCorrectedHelixParameters(helix, fittedTraj.get_traj(), bfield, FittedGblTrajectory.GBLPOINT.IP);
+        trk.setTrackParameters(correctedHelixParams.getFirst(), bfield);// hack to set the track charge
+        trk.getTrackStates().clear();
+
+        TrackState stateVertex = new BaseTrackState(correctedHelixParams.getFirst(), ref, correctedHelixParams.getSecond().asPackedArray(true), TrackState.AtIP, bfield);
+        trk.getTrackStates().add(stateVertex);
+
+        // Set state at last point
+        Pair<double[], SymmetricMatrix> correctedHelixParamsLast = getGblCorrectedHelixParameters(helix, fittedTraj.get_traj(), bfield, FittedGblTrajectory.GBLPOINT.LAST);
+        TrackState stateLast = new BaseTrackState(correctedHelixParamsLast.getFirst(), ref, correctedHelixParamsLast.getSecond().asPackedArray(true), TrackState.AtLastHit, bfield);
+        trk.getTrackStates().add(stateLast);
+
+        // Set other info needed
+        trk.setChisq(fittedTraj.get_chi2());
+        trk.setNDF(fittedTraj.get_ndf());
+        trk.setFitSuccess(true);
+        trk.setRefPointIsDCA(true);
+        trk.setTrackType(TrackType.setGBL(trackType, true));
+
+        //  Add the track to the list of tracks
+//            tracks.add(trk);
+        logger.info(String.format("helix chi2 %f ndf %d gbl chi2 %f ndf %d\n", helix.chisqtot(), helix.ndf()[0] + helix.ndf()[1], trk.getChi2(), trk.getNDF()));
+        if (logger.getLevel().intValue() <= Level.INFO.intValue()) {
+            for (int i = 0; i < 5; ++i) {
+                logger.info(String.format("param %d: %.10f -> %.10f    helix-gbl= %f", i, helix.parameters()[i], trk.getTrackParameter(i), helix.parameters()[i] - trk.getTrackParameter(i)));
+            }
+        }
+        return trk;
+    }
+
     /**
-     * Compute the updated helix parameters and covariance matrix at a given point along the trajectory.
+     * Compute the updated helix parameters and covariance matrix at a given
+     * point along the trajectory.
      *
      * @param helix - original seed track
      * @param traj - fitted GBL trajectory
      * @param point - the point along the track where the result is computed.
      * @return corrected parameters.
      */
-    private Pair<double[], SymmetricMatrix> getGblCorrectedHelixParameters(HelicalTrackFit helix, FittedGblTrajectory traj, double bfield, FittedGblTrajectory.GBLPOINT point) {
+    public static Pair<double[], SymmetricMatrix> getGblCorrectedHelixParameters(HelicalTrackFit helix, GblTrajectory traj, double bfield, FittedGblTrajectory.GBLPOINT point) {
 
         // get seed helix parameters
         double qOverP = helix.curvature() / (Constants.fieldConversion * Math.abs(bfield) * Math.sqrt(1 + Math.pow(helix.slope(), 2)));
@@ -151,14 +160,15 @@
         Vector locPar = new Vector(5);
         SymMatrix locCov = new SymMatrix(5);
         int pointIndex;
-        if( point.compareTo( FittedGblTrajectory.GBLPOINT.IP) == 0 )
+        if (point.compareTo(FittedGblTrajectory.GBLPOINT.IP) == 0) {
             pointIndex = 1;
-        else if (point.compareTo(FittedGblTrajectory.GBLPOINT.LAST) == 0) 
-            pointIndex = traj.get_traj().getNumPoints();
-        else 
+        } else if (point.compareTo(FittedGblTrajectory.GBLPOINT.LAST) == 0) {
+            pointIndex = traj.getNumPoints();
+        } else {
             throw new RuntimeException("This GBLPOINT " + point.toString() + "( " + point.name() + ") is not valid");
-        
-        traj.get_traj().getResults(pointIndex, locPar, locCov); // vertex point
+        }
+
+        traj.getResults(pointIndex, locPar, locCov); // vertex point
 //        locCov.print(10, 8);
         double qOverPCorr = locPar.get(FittedGblTrajectory.GBLPARIDX.QOVERP.getValue());
         double xTPrimeCorr = locPar.get(FittedGblTrajectory.GBLPARIDX.XTPRIME.getValue());
@@ -169,7 +179,9 @@
         logger.info((helix.slope() > 0 ? "top: " : "bot ") + "qOverPCorr " + qOverPCorr + " xtPrimeCorr " + xTPrimeCorr + " yTPrimeCorr " + yTPrimeCorr + " xTCorr " + xTCorr + " yTCorr " + yTCorr);
 
         // calculate new d0 and z0
-        Hep3Matrix perToClPrj = traj.get_track_data().getPrjPerToCl();
+//        Hep3Matrix perToClPrj = traj.get_track_data().getPrjPerToCl();
+        Hep3Matrix perToClPrj = getPerToClPrj(helix);
+
         Hep3Matrix clToPerPrj = VecOp.inverse(perToClPrj);
         Hep3Vector corrPer = VecOp.mult(clToPerPrj, new BasicHep3Vector(xTCorr, yTCorr, 0.0));