Print

Print


Author: [log in to unmask]
Date: Mon Jan  4 17:43:47 2016
New Revision: 4080

Log:
Mostly a commit as a consequence of the restructuring and refactoring of old classes.

Modified:
    java/trunk/users/src/main/java/org/hps/users/mgraham/ExamplePlotter.java
    java/trunk/users/src/main/java/org/hps/users/mgraham/TrackExtrapolationAnalysis.java
    java/trunk/users/src/main/java/org/hps/users/mgraham/TwoTrackAnalysis.java
    java/trunk/users/src/main/java/org/hps/users/phansson/DataTrackerFakeHitDriver.java
    java/trunk/users/src/main/java/org/hps/users/phansson/ECalExtrapolationDriver.java
    java/trunk/users/src/main/java/org/hps/users/phansson/ParticleHelixProducer.java
    java/trunk/users/src/main/java/org/hps/users/phansson/ROOTFlatTupleDriver.java
    java/trunk/users/src/main/java/org/hps/users/phansson/TrackingReconstructionPlots.java

Modified: java/trunk/users/src/main/java/org/hps/users/mgraham/ExamplePlotter.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/mgraham/ExamplePlotter.java	(original)
+++ java/trunk/users/src/main/java/org/hps/users/mgraham/ExamplePlotter.java	Mon Jan  4 17:43:47 2016
@@ -4,6 +4,7 @@
 import hep.aida.IHistogram1D;
 import hep.aida.IPlotter;
 import hep.aida.IPlotterStyle;
+import hep.physics.vec.BasicHep3Vector;
 import hep.physics.vec.Hep3Vector;
 
 import java.io.IOException;
@@ -12,9 +13,10 @@
 import java.util.logging.Logger;
 
 import org.hps.recon.tracking.BeamlineConstants;
-import org.hps.recon.tracking.HPSTrack;
+import org.hps.recon.tracking.HpsHelicalTrackFit;
 import org.hps.recon.tracking.HelixConverter;
 import org.hps.recon.tracking.StraightLineTrack;
+import org.hps.recon.tracking.TrackUtils;
 import org.lcsim.event.EventHeader;
 import org.lcsim.event.Track;
 import org.lcsim.fit.helicaltrack.HelicalTrackFit;
@@ -76,15 +78,9 @@
             aida.histogram1D("Track Momentum (Pz)").fill(trk.getTrackStates().get(0).getMomentum()[0]);
             aida.histogram1D("Track Chi2").fill(trk.getChi2());
 
-            SeedTrack stEle = (SeedTrack) trk;
-            SeedCandidate seedEle = stEle.getSeedCandidate();
-            HelicalTrackFit ht = seedEle.getHelix();
-            HelixConverter converter = new HelixConverter(0);
-            StraightLineTrack slt = converter.Convert(ht);
-            HPSTrack hpstrack = new HPSTrack(ht);
-            Hep3Vector[] trkatconver = hpstrack.getPositionAtZMap(100, BeamlineConstants.HARP_POSITION_TESTRUN, 1);
-            aida.histogram1D("X (mm) @ Converter").fill(trkatconver[0].x()); // y tracker frame?
-            aida.histogram1D("Y (mm) @ Converter").fill(trkatconver[0].y()); // z tracker frame?
+            Hep3Vector trkatconver = new BasicHep3Vector(TrackUtils.extrapolateTrackUsingFieldMap(trk, 100.0, BeamlineConstants.HARP_POSITION_TESTRUN, 5.0, event.getDetector().getFieldMap()).getReferencePoint());
+            aida.histogram1D("X (mm) @ Converter").fill(trkatconver.x()); // y tracker frame?
+            aida.histogram1D("Y (mm) @ Converter").fill(trkatconver.y()); // z tracker frame?
 
         }
     }

Modified: java/trunk/users/src/main/java/org/hps/users/mgraham/TrackExtrapolationAnalysis.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/mgraham/TrackExtrapolationAnalysis.java	(original)
+++ java/trunk/users/src/main/java/org/hps/users/mgraham/TrackExtrapolationAnalysis.java	Mon Jan  4 17:43:47 2016
@@ -5,13 +5,14 @@
 import hep.aida.IHistogram2D;
 import hep.aida.IPlotter;
 import hep.aida.IPlotterStyle;
+import hep.physics.vec.BasicHep3Vector;
 import hep.physics.vec.Hep3Vector;
 
 import java.util.List;
 import java.util.Map;
 
 import org.hps.recon.tracking.BeamlineConstants;
-import org.hps.recon.tracking.HPSTrack;
+import org.hps.recon.tracking.HpsHelicalTrackFit;
 import org.hps.recon.tracking.HelixConverter;
 import org.hps.recon.tracking.StraightLineTrack;
 import org.hps.recon.tracking.TrackUtils;
@@ -99,10 +100,9 @@
                 charge = 0;//make plot look pretty
 //            System.out.println("Charge = " + charge + "; isTop = " + isTop);
 
-            HPSTrack hpstrk=null;
-                hpstrk = new HPSTrack(ht);
-//            Hep3Vector posAtConv = hpstrk.getPositionAtZ(zAtConverter, -101, -100, 0.1);
-            Hep3Vector posAtConv = hpstrk.getPositionAtZMap(100,BeamlineConstants.HARP_POSITION_TESTRUN , 5.0)[0];
+            HpsHelicalTrackFit hpstrk=null;
+                hpstrk = new HpsHelicalTrackFit(ht);
+                Hep3Vector posAtConv = new BasicHep3Vector(TrackUtils.extrapolateTrackUsingFieldMap(trk, 100, BeamlineConstants.HARP_POSITION_TESTRUN, 5.0, event.getDetector().getFieldMap()).getReferencePoint());
             double useThisx=posAtConv.x();
             double useThisy=posAtConv.y();
             
@@ -123,7 +123,7 @@
                 aida.histogram1D("Negative Y (mm) @ Converter").fill(useThisy);
             }
 //            Hep3Vector posAtConvShort = hpstrk.getPositionAtZ(zAtConverter, -0.1, 0, 0.01);
-            Hep3Vector posAtConvShort = hpstrk.getPositionAtZMap(0,BeamlineConstants.HARP_POSITION_TESTRUN, 5.0)[0];
+            Hep3Vector posAtConvShort = new BasicHep3Vector(TrackUtils.extrapolateTrackUsingFieldMap(trk, 0, BeamlineConstants.HARP_POSITION_TESTRUN, 5.0, event.getDetector().getFieldMap()).getReferencePoint());
             aida.histogram2D("Extrapolated X: short vs long fringe").fill(posAtConvShort.x(), posAtConv.x());
             aida.histogram2D("Extrapolated Y: short vs long fringe").fill(posAtConvShort.y(), posAtConv.y());
 
@@ -144,7 +144,8 @@
 //                Hep3Vector posAtEcalHPS = hpstrk.getPositionAtZMap(750,zCluster, 5.0);
                 double zCluster=clust.getPosition()[2];
  //               double zCluster=1450.0;
-                 Hep3Vector posAtEcalHPS = hpstrk.getPositionAtZMap(750,zCluster, 5.0)[0];
+                Hep3Vector posAtEcalHPS = new BasicHep3Vector(TrackUtils.extrapolateTrackUsingFieldMap(trk, 750, zCluster, 5.0, event.getDetector().getFieldMap()).getReferencePoint());
+
                 Hep3Vector posAtEcalExtend= TrackUtils.extrapolateTrack(trk,zCluster);
                 aida.histogram2D("ECal Extrapolation X :  HPS vs Extend").fill( posAtEcalExtend.y(),posAtEcalHPS.x()-posAtEcalExtend.y());
                 aida.histogram2D("ECal Extrapolation Y :  HPS vs Extend").fill( posAtEcalExtend.z(),posAtEcalHPS.y()-posAtEcalExtend.z());

Modified: java/trunk/users/src/main/java/org/hps/users/mgraham/TwoTrackAnalysis.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/mgraham/TwoTrackAnalysis.java	(original)
+++ java/trunk/users/src/main/java/org/hps/users/mgraham/TwoTrackAnalysis.java	Mon Jan  4 17:43:47 2016
@@ -17,10 +17,12 @@
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
+import org.apache.commons.lang3.NotImplementedException;
 import org.hps.recon.tracking.BeamlineConstants;
-import org.hps.recon.tracking.HPSTrack;
+import org.hps.recon.tracking.HpsHelicalTrackFit;
 import org.hps.recon.tracking.HelixConverter;
 import org.hps.recon.tracking.StraightLineTrack;
+import org.hps.recon.tracking.TrackUtils;
 import org.lcsim.event.EventHeader;
 import org.lcsim.event.Track;
 import org.lcsim.event.TrackerHit;
@@ -273,10 +275,11 @@
             HelicalTrackFit ht = seedEle.getHelix();
             HelixConverter converter = new HelixConverter(0);
             StraightLineTrack slt = converter.Convert(ht);
-            HPSTrack hpstrack = new HPSTrack(ht);
-            Hep3Vector[] trkatconver = hpstrack.getPositionAtZMap(100, BeamlineConstants.HARP_POSITION_TESTRUN, 1);
-            aida.histogram1D("X (mm) @ Converter using Map").fill(trkatconver[0].x()); // y tracker frame?
-            aida.histogram1D("Y (mm) @ Converter using Map").fill(trkatconver[0].y()); // z tracker frame?
+            HpsHelicalTrackFit hpstrack = new HpsHelicalTrackFit(ht);
+            Hep3Vector trkatconver = new BasicHep3Vector(TrackUtils.extrapolateTrackUsingFieldMap(trk, 100, BeamlineConstants.HARP_POSITION_TESTRUN, 1, event.getDetector().getFieldMap()).getReferencePoint());
+
+            aida.histogram1D("X (mm) @ Converter using Map").fill(trkatconver.x()); // y tracker frame?
+            aida.histogram1D("Y (mm) @ Converter using Map").fill(trkatconver.y()); // z tracker frame?
             if (slt != null) {
                 aida.histogram1D("X (mm) @ Converter using SLT").fill(slt.getYZAtX(BeamlineConstants.HARP_POSITION_TESTRUN)[0]); // y tracker frame?
                 aida.histogram1D("Y (mm) @ Converter using SLT").fill(slt.getYZAtX(BeamlineConstants.HARP_POSITION_TESTRUN)[1]); // z tracker frame?
@@ -320,9 +323,9 @@
 //            HPSTrack hpstrack2 = new HPSTrack(ht2);
 //            Hep3Vector[] trkatconver2 = hpstrack2.getPositionAtZMap(100, BeamlineConstants.HARP_POSITION, 1);
 
-            HPSTrack hpstrack1 = new HPSTrack(ht1);
+            HpsHelicalTrackFit hpstrack1 = new HpsHelicalTrackFit(ht1);
             Hep3Vector[] trkatconver1 = {new BasicHep3Vector(), new BasicHep3Vector(0, 0, 0)};
-            HPSTrack hpstrack2 = new HPSTrack(ht2);
+            HpsHelicalTrackFit hpstrack2 = new HpsHelicalTrackFit(ht2);
             Hep3Vector[] trkatconver2 = {new BasicHep3Vector(), new BasicHep3Vector(0, 0, 0)};;
             if (isMC) {
                 double[] t1 = slt1.getYZAtX(BeamlineConstants.HARP_POSITION_TESTRUN);
@@ -330,8 +333,9 @@
                 trkatconver1[0] = new BasicHep3Vector(t1[0], t1[1], BeamlineConstants.HARP_POSITION_TESTRUN);
                 trkatconver2[0] = new BasicHep3Vector(t2[0], t2[1], BeamlineConstants.HARP_POSITION_TESTRUN);
             } else {
-                trkatconver1 = hpstrack1.getPositionAtZMap(100, BeamlineConstants.HARP_POSITION_TESTRUN, 1);
-                trkatconver2 = hpstrack2.getPositionAtZMap(100, BeamlineConstants.HARP_POSITION_TESTRUN, 1);
+                throw new NotImplementedException("Need to implement using TrackUtils to extrapolate tracks!");
+                //trkatconver1 = hpstrack1.getPositionAtZMap(100, BeamlineConstants.HARP_POSITION_TESTRUN, 1);
+                //trkatconver2 = hpstrack2.getPositionAtZMap(100, BeamlineConstants.HARP_POSITION_TESTRUN, 1);
             }
             List<TrackerHit> hitsOnTrack1 = trk1.getTrackerHits();
             int layer1;
@@ -508,9 +512,10 @@
                             posvec[1] = slt1.getYZAtX(z)[1];
                             posvec[2] = z;
                         } else {
-                            Hep3Vector[] trk1atz = hpstrack1.getPositionAtZMap(100, z, 1);
-                            posvec[0] = trk1atz[0].x();
-                            posvec[1] = trk1atz[0].y();
+                            Hep3Vector trk1atz = new BasicHep3Vector(TrackUtils.extrapolateTrackUsingFieldMap(trk1, 100, z, 1, event.getDetector().getFieldMap()).getReferencePoint());
+
+                            posvec[0] = trk1atz.x();
+                            posvec[1] = trk1atz.y();
                             posvec[2] = z;
                         }
                         Trk1.add(posvec);
@@ -592,9 +597,10 @@
                             posvec2[1] = slt2.getYZAtX(z)[1];
                             posvec2[2] = z;
                         } else {
-                            Hep3Vector[] trk2atz = hpstrack2.getPositionAtZMap(100, z, 1);
-                            posvec2[0] = trk2atz[0].x();
-                            posvec2[1] = trk2atz[0].y();
+                            Hep3Vector trk2atz = new BasicHep3Vector(TrackUtils.extrapolateTrackUsingFieldMap(trk2, 100, z, 1, event.getDetector().getFieldMap()).getReferencePoint());
+
+                            posvec2[0] = trk2atz.x();
+                            posvec2[1] = trk2atz.y();
                             posvec2[2] = z;
                         }
                         Trk2.add(posvec2);

Modified: java/trunk/users/src/main/java/org/hps/users/phansson/DataTrackerFakeHitDriver.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/phansson/DataTrackerFakeHitDriver.java	(original)
+++ java/trunk/users/src/main/java/org/hps/users/phansson/DataTrackerFakeHitDriver.java	Mon Jan  4 17:43:47 2016
@@ -17,7 +17,7 @@
 import java.util.Set;
 
 //===> import org.hps.conditions.deprecated.SvtUtils;
-import org.hps.recon.tracking.HPSTrack;
+import org.hps.recon.tracking.HpsHelicalTrackFit;
 import org.hps.recon.tracking.TrackUtils;
 import org.hps.recon.tracking.TrackerHitUtils;
 import org.lcsim.detector.IDetectorElement;
@@ -194,12 +194,12 @@
 
 
         // Obtain the tracks from the event
-        if (!event.hasCollection(HPSTrack.class, trackCollectionName)) {
+        if (!event.hasCollection(HpsHelicalTrackFit.class, trackCollectionName)) {
             this.printDebug("No HPSTracks were found, skipping event");
             simHits = null;
             return;
         }
-        List<HPSTrack> tracks = event.get(HPSTrack.class, trackCollectionName);
+        List<HpsHelicalTrackFit> tracks = event.get(HpsHelicalTrackFit.class, trackCollectionName);
 
         if (debug) {
             System.out.println(this.getClass().getSimpleName() + ": found " + tracks.size() + " tracks (" + this.trackCollectionName + ")");
@@ -223,13 +223,13 @@
             System.out.println(this.getClass().getSimpleName() + ": Add hits for " + tracks.size() + " tracks (" + this.trackCollectionName + ")");
         }
 
-        for (HPSTrack helix : tracks) {
+        for (HpsHelicalTrackFit helix : tracks) {
             if (debug) {
                 System.out.println(this.getClass().getSimpleName() + ": trying to add hits for this track");
             }
 
             // Get the MC Particle associated with this track
-            MCParticle mcParticle = helix.getMCParticle();
+            MCParticle mcParticle = helix.getMcParticle();
 
             if (debug) {
                 System.out.println(this.getClass().getSimpleName() + helix.toString());

Modified: java/trunk/users/src/main/java/org/hps/users/phansson/ECalExtrapolationDriver.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/phansson/ECalExtrapolationDriver.java	(original)
+++ java/trunk/users/src/main/java/org/hps/users/phansson/ECalExtrapolationDriver.java	Mon Jan  4 17:43:47 2016
@@ -11,62 +11,122 @@
 import hep.physics.vec.Hep3Vector;
 
 import java.util.List;
-
-import javax.swing.text.DefaultEditorKit.PasteAction;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 import org.hps.recon.tracking.TrackType;
 import org.hps.recon.tracking.TrackUtils;
-import org.lcsim.detector.tracker.silicon.HpsSiSensor;
 import org.lcsim.event.EventHeader;
-import org.lcsim.event.RawTrackerHit;
+import org.lcsim.event.LCRelation;
 import org.lcsim.event.Track;
 import org.lcsim.event.TrackState;
 import org.lcsim.event.TrackerHit;
+import org.lcsim.fit.helicaltrack.HelicalTrackCross;
 import org.lcsim.fit.helicaltrack.HelicalTrackHit;
+import org.lcsim.fit.helicaltrack.HelicalTrackStrip;
 import org.lcsim.geometry.Detector;
-import org.lcsim.geometry.compact.converter.HPSTrackerBuilder;
 import org.lcsim.util.Driver;
 import org.lcsim.util.aida.AIDA;
 
 /**
+ * 
+ * Compare residuals using updated track parameters from GBL.
+ * 
  * @author Per Hansson Adrian <[log in to unmask]>
  *
  */
 public class ECalExtrapolationDriver extends Driver {
-
+    
+    private static Logger logger = Logger.getLogger(ECalExtrapolationDriver.class.getName());
+
+    private double bfield; 
+    
     private AIDA aida = AIDA.defaultInstance();
+    IHistogram1D res_Seed_u;
+    IHistogram1D res_IP_u;
+    IHistogram1D res_Last_u;
+
+    IHistogram1D res_Seed_Y;
+    IHistogram1D res_Seed_X;
     IHistogram1D res_IP_Y;
     IHistogram1D res_IP_X;
     IHistogram1D res_Last_Y;
     IHistogram1D res_Last_X;
+    IHistogram1D res_IP_Last_diff_Y;
+    IHistogram1D res_IP_Last_diff_X;
+    IHistogram1D res_Seed_Last_diff_Y;
+    IHistogram1D res_Seed_Last_diff_X;
+    IHistogram1D res_IP_Last_diff_u;
+    IHistogram1D res_Seed_Last_diff_u;
     
     
     /**
      * 
      */
     public ECalExtrapolationDriver() {
-        // TODO Auto-generated constructor stub
+        logger.setLevel(Level.INFO);
     }
     
     @Override
     protected void detectorChanged(Detector arg0) {
+        
+        Hep3Vector bfieldVec = TrackUtils.getBField(arg0);
+        bfield = bfieldVec.y();
+        logger.info("bfieldVec " + bfieldVec.toString());
+
         aida.tree().cd("/");
         IAnalysisFactory fac = aida.analysisFactory();
         IPlotter plotter;
-        plotter = fac.createPlotterFactory().create("Residual");
+        plotter = fac.createPlotterFactory().create("Residual stereo hit");
         IPlotterStyle style = plotter.style();
         style.dataStyle().fillStyle().setColor("yellow");
         style.dataStyle().errorBarStyle().setVisible(false);
-        plotter.createRegions(2, 2);
+        plotter.createRegions(2, 3);
+        res_Seed_Y = aida.histogram1D("res_Seed_Y", 50, -5, 5);
+        res_Seed_X = aida.histogram1D("res_Seed_X", 50, -5, 5);
         res_IP_Y = aida.histogram1D("res_IP_Y", 50, -5, 5);
         res_IP_X = aida.histogram1D("res_IP_X", 50, -5, 5);
         res_Last_Y = aida.histogram1D("res_Last_Y", 50, -5, 5);
         res_Last_X = aida.histogram1D("res_Last_X", 50, -5, 5);
         plotter.region(0).plot(res_IP_Y);
-        plotter.region(1).plot(res_IP_X);
-        plotter.region(2).plot(res_Last_Y);
-        plotter.region(3).plot(res_Last_X);
+        plotter.region(3).plot(res_IP_X);
+        plotter.region(1).plot(res_Last_Y);
+        plotter.region(4).plot(res_Last_X);
+        plotter.region(2).plot(res_Seed_Y);
+        plotter.region(5).plot(res_Seed_X);
         plotter.show();
+
+        
+        IPlotter plotter1;
+        plotter1 = fac.createPlotterFactory().create("Residual local");
+        plotter1.setStyle(style);
+        plotter1.createRegions(1, 3);
+        res_Seed_u = aida.histogram1D("res_Seed_u", 50, -5, 5);
+        res_IP_u = aida.histogram1D("res_IP_u", 50, -5, 5);
+        res_Last_u = aida.histogram1D("res_Last_u", 50, -5, 5);
+        plotter1.region(0).plot(res_IP_u);
+        plotter1.region(1).plot(res_Last_u);
+        plotter1.region(2).plot(res_Seed_u);
+        plotter1.show();
+        
+        IPlotter plotter2;
+        plotter2 = fac.createPlotterFactory().create("Residual diffs");
+        plotter2.setStyle(style);
+        plotter2.createRegions(3, 2);
+        res_IP_Last_diff_Y = aida.histogram1D("res_IP_Last_diff_Y", 50, -5, 5);
+        res_IP_Last_diff_X = aida.histogram1D("res_IP_Last_diff_X", 50, -5, 5);
+        res_Seed_Last_diff_Y = aida.histogram1D("res_Seed_Last_diff_Y", 50, -5, 5);
+        res_Seed_Last_diff_X = aida.histogram1D("res_Seed_Last_diff_X", 50, -5, 5);
+        res_IP_Last_diff_u = aida.histogram1D("res_IP_Last_diff_u", 50, -5, 5);
+        res_Seed_Last_diff_u = aida.histogram1D("res_Seed_Last_diff_u", 50, -5, 5);
+        plotter2.region(0).plot(res_Seed_Last_diff_Y);
+        plotter2.region(2).plot(res_Seed_Last_diff_X);
+        plotter2.region(1).plot(res_IP_Last_diff_Y);
+        plotter2.region(3).plot(res_IP_Last_diff_X);
+        plotter2.region(4).plot(res_Seed_Last_diff_u);
+        plotter2.region(5).plot(res_IP_Last_diff_u);
+        plotter2.show();
     }
     
     protected void process(EventHeader event) {
@@ -76,14 +136,25 @@
     
     List<List<Track>> trackCollections = event.get(Track.class);
     
+    
+    logger.fine("Found " + trackCollections.size() + " track collections");
+    
+    // loop over all track collections
     for(List<Track> tracks : trackCollections) {
-        
+
+        logger.fine("Found " + tracks.size() + " tracks in this collection");
+
+        
+        // loop over all tracks
         for (Track track : tracks) {
             
+            logger.fine("Process track with " + track.getTrackerHits().size() + " hits and of type " + track.getType() + " GBL ? " + TrackType.isGBL(track.getType()));
+            
+            // require six stereo hits on the track
             if(track.getTrackerHits().size() != 6) 
                 continue;
             
-
+            // select GBL tracks
             if(TrackType.isGBL(track.getType())) {
 
                 TrackState stateIP = null;
@@ -93,48 +164,48 @@
                     if (state.getLocation() == TrackState.AtIP) stateIP = state;
                 }
 
-                
-                // find last 3D hit
-                Hep3Vector lastStereoHitPosition = null;
-                for (TrackerHit rotatedStereoHit : track.getTrackerHits()) {
-                    Hep3Vector stereoHitPosition = ((HelicalTrackHit) rotatedStereoHit).getCorrectedPosition();
-                    if(lastStereoHitPosition != null) {
-                        if(lastStereoHitPosition.x() < stereoHitPosition.x() )
-                            lastStereoHitPosition = stereoHitPosition;
-                    } else {
-                        lastStereoHitPosition = stereoHitPosition;
-                    }
-                }
-                
-                /*
-                for (TrackerHit rotatedStereoHit : track.getTrackerHits()) {
-                    Hep3Vector stereoHitPosition = ((HelicalTrackHit) rotatedStereoHit).getCorrectedPosition();
-                    RawTrackerHit rawhit = (RawTrackerHit) rotatedStereoHit.getRawHits().get(0);
-                    HpsSiSensor sensor = (HpsSiSensor) rawhit.getDetectorElement();
-                    int layer = HPSTrackerBuilder.getLayerFromVolumeName(sensor.getName());
-                    if(layer == 4) {
-                        if(HPSTrackerBuilder.isTopFromName(sensor.getName())) {
-                            if(HPSTrackerBuilder.isAxialFromName(sensor.getName())) {
-                                lastStereoHitPosition = stereoHitPosition;
-                                System.out.printf("\"Last hit\": %s %s: layer %d %s\n", stereoHitPosition.toString(), sensor.getName(), sensor.getLayerNumber(), sensor.isAxial()?"axial":"stereo");
-                                
-                                break;
-                            }
-                        } else {
-                            if(!HPSTrackerBuilder.isAxialFromName(sensor.getName())) {
-                                lastStereoHitPosition = stereoHitPosition;
-                                System.out.printf("\"Last hit\": %s %s: layer %d %s\n", stereoHitPosition.toString(), sensor.getName(), sensor.getLayerNumber(), sensor.isAxial()?"axial":"stereo");
-                                break;
-                            }
+                // find seed track
+                Track seedTrack = null;
+                List<LCRelation> seedToGblRelation = event.get(LCRelation.class, "MatchedToGBLTrackRelations");
+                
+                if(seedToGblRelation == null)
+                    logger.warning("no LCRelation found!?");
+                else {
+                    for(LCRelation relation : seedToGblRelation) {
+                        if(relation.getTo().equals(track)) {
+                            seedTrack = (Track)relation.getFrom();
+                            break;
                         }
                     }
                 }
-                */
-                
-                if( lastStereoHitPosition == null) 
+                
+                // find last 3D hit
+                HelicalTrackHit lastHelicalTrackHit = null;
+                //HelicalTrackStrip
+                for (TrackerHit rotatedStereoHit : track.getTrackerHits()) {
+                    HelicalTrackHit hit = (HelicalTrackHit) rotatedStereoHit;
+                    if(lastHelicalTrackHit != null) {
+                        if(lastHelicalTrackHit.getCorrectedPosition().x() < hit.getCorrectedPosition().x() ) {
+                            lastHelicalTrackHit = hit;
+                        }
+                    } else {
+                        lastHelicalTrackHit = hit;
+                    }
+                }
+                
+                if( lastHelicalTrackHit == null) 
                     throw new RuntimeException("No last hit found!");
-
-                //System.out.printf("\"Last hit position found\": %s \n",lastStereoHitPosition.toString());
+                
+                Hep3Vector lastStereoHitPosition = lastHelicalTrackHit.getCorrectedPosition();
+                
+
+                // find the last strip cluster
+                // OK, I could be more rigorous but this should work 
+                List<HelicalTrackStrip> strips = ((HelicalTrackCross) lastHelicalTrackHit).getStrips();
+                HelicalTrackStrip lastStrip = strips.get(0).origin().x() > strips.get(1).origin().x() ? strips.get(0) : strips.get(1);
+                
+                Map<String,Double> localResidualsIP = TrackUtils.calculateLocalTrackHitResiduals(TrackUtils.getHTF(stateIP), lastStrip, bfield);
+                Map<String,Double> localResidualsLast = TrackUtils.calculateLocalTrackHitResiduals(TrackUtils.getHTF(stateLast), lastStrip, bfield);
                 
                 Hep3Vector trackPositionIP = TrackUtils.extrapolateTrack(stateIP, lastStereoHitPosition.x());
                 Hep3Vector trackPositionLast = TrackUtils.extrapolateTrack(stateLast, lastStereoHitPosition.x());
@@ -145,15 +216,42 @@
                 double xResidualLast = trackPositionLast.x() - lastStereoHitPosition.y();
                 double yResidualLast = trackPositionLast.y() - lastStereoHitPosition.z();
 
-                //System.out.printf("Found last stereo hit at %s\n",lastStereoHitPosition.toString());
-                //System.out.printf("trackPositionIP   %s\n",trackPositionIP.toString());
-                //System.out.printf("trackPositionLast %s\n",trackPositionLast.toString());
-
-                
+                                
+                res_IP_u.fill(localResidualsIP.get("ures"));
                 res_IP_Y.fill(yResidualIP);
                 res_IP_X.fill(xResidualIP);
+                res_Last_u.fill(localResidualsLast.get("ures"));
                 res_Last_Y.fill(yResidualLast);
                 res_Last_X.fill(xResidualLast);
+                res_IP_Last_diff_Y.fill(Math.abs(yResidualLast) - Math.abs(yResidualIP));
+                res_IP_Last_diff_X.fill(Math.abs(xResidualLast) - Math.abs(xResidualIP));
+                res_IP_Last_diff_u.fill(Math.abs(localResidualsLast.get("ures")) - Math.abs(localResidualsIP.get("ures")));
+
+                
+                if(seedTrack != null) {
+                    Hep3Vector trackPositionSeed = TrackUtils.extrapolateTrack(seedTrack, lastStereoHitPosition.x());
+                    double xResidualSeed = trackPositionSeed.x() - lastStereoHitPosition.y();
+                    double yResidualSeed = trackPositionSeed.y() - lastStereoHitPosition.z();
+                    res_Seed_Y.fill(yResidualSeed);
+                    res_Seed_X.fill(xResidualSeed);
+                    res_Seed_Last_diff_Y.fill(Math.abs(yResidualLast) - Math.abs(yResidualSeed));
+                    res_Seed_Last_diff_X.fill(Math.abs(xResidualLast) - Math.abs(xResidualSeed));
+                    
+                    Map<String,Double> localResidualsSeed = TrackUtils.calculateLocalTrackHitResiduals(seedTrack, lastHelicalTrackHit, lastStrip, bfield);
+                    res_Seed_u.fill(localResidualsSeed.get("ures"));
+                    res_Seed_Last_diff_u.fill(Math.abs(localResidualsLast.get("ures")) - Math.abs(localResidualsSeed.get("ures")));
+
+
+                    
+                } else {
+                    logger.warning("No seed track found");
+                }
+                    
+
+                
+                
+
+                
                 
             }
         

Modified: java/trunk/users/src/main/java/org/hps/users/phansson/ParticleHelixProducer.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/phansson/ParticleHelixProducer.java	(original)
+++ java/trunk/users/src/main/java/org/hps/users/phansson/ParticleHelixProducer.java	Mon Jan  4 17:43:47 2016
@@ -13,7 +13,7 @@
 import java.util.List;
 
 import org.hps.analysis.ecal.HPSMCParticlePlotsDriver;
-import org.hps.recon.tracking.HPSTrack;
+import org.hps.recon.tracking.HpsHelicalTrackFit;
 import org.hps.recon.tracking.TrackerHitUtils;
 import org.lcsim.constants.Constants;
 import org.lcsim.event.EventHeader;
@@ -137,7 +137,7 @@
 
         //Make new tracks based on the MC particles
         //List<HelicalTrackFit> tracks = new ArrayList<HelicalTrackFit>();
-        List<HPSTrack> tracks = new ArrayList<HPSTrack>();
+        List<HpsHelicalTrackFit> tracks = new ArrayList<HpsHelicalTrackFit>();
 
         if (event.hasCollection(MCParticle.class)) {
             List<MCParticle> mcparticles = event.get(MCParticle.class).get(0);
@@ -251,7 +251,7 @@
                     pars[3] = hpc.getZ0();
                     pars[4] = hpc.getSlopeSZPlane();
                     //HelicalTrackFit htf = this.trackUtils.makeHelicalTrackFit(pars);
-                    HPSTrack htf = this.makeHPSTrack(pars, part);
+                    HpsHelicalTrackFit htf = this.makeHPSTrack(pars, part);
                     tracks.add(htf);
                     if (debug) {
                         System.out.println(this.getClass().getSimpleName() + ": MC particle created HelicalTrackFit " + htf.toString());
@@ -281,7 +281,7 @@
         }
 
         this.printDebug("created " + tracks.size() + " MC particle helix tracks");
-        event.put(this.trackOutputCollectionName, tracks, HPSTrack.class, 0);
+        event.put(this.trackOutputCollectionName, tracks, HpsHelicalTrackFit.class, 0);
         _totalTracks += tracks.size();
     }
 
@@ -292,9 +292,12 @@
      * @param mcParticle : MC particle associated to this HelicalTrackFit
      * @return HpsHelicalTrackFit :
      */
-    public HPSTrack makeHPSTrack(double[] helixParameters, MCParticle mcParticle) {
-        return new HPSTrack(helixParameters, new SymmetricMatrix(5), new double[2], new int[2],
-                new HashMap<HelicalTrackHit, Double>(), new HashMap<HelicalTrackHit, MultipleScatter>(), mcParticle);
+    public HpsHelicalTrackFit makeHPSTrack(double[] helixParameters, MCParticle mcParticle) {
+        HpsHelicalTrackFit helicalTrackFit = new HpsHelicalTrackFit(helixParameters, new SymmetricMatrix(5), new double[2], new int[2],
+                new HashMap<HelicalTrackHit, Double>(), new HashMap<HelicalTrackHit, MultipleScatter>());
+        helicalTrackFit.setMcParticle(mcParticle);
+        return  helicalTrackFit;
+        
     }
 
     /**

Modified: java/trunk/users/src/main/java/org/hps/users/phansson/ROOTFlatTupleDriver.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/phansson/ROOTFlatTupleDriver.java	(original)
+++ java/trunk/users/src/main/java/org/hps/users/phansson/ROOTFlatTupleDriver.java	Mon Jan  4 17:43:47 2016
@@ -20,10 +20,11 @@
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
+import org.apache.commons.lang3.NotImplementedException;
 import org.hps.analysis.ecal.HPSMCParticlePlotsDriver;
 import org.hps.recon.tracking.BeamlineConstants;
 import org.hps.recon.tracking.EventQuality;
-import org.hps.recon.tracking.HPSTrack;
+import org.hps.recon.tracking.HpsHelicalTrackFit;
 import org.hps.recon.tracking.StraightLineTrack;
 import org.hps.recon.tracking.TrackUtils;
 import org.hps.recon.vertexing.TwoParticleVertexer;
@@ -41,6 +42,7 @@
 import org.lcsim.event.GenericObject;
 import org.lcsim.event.MCParticle;
 import org.lcsim.event.Track;
+import org.lcsim.event.TrackState;
 import org.lcsim.event.TrackerHit;
 import org.lcsim.event.Vertex;
 import org.lcsim.event.base.ParticleTypeClassifier;
@@ -645,8 +647,8 @@
                 } else {
                     printWriter.format("%5.5f %5.5f ", -9999999.9, -9999999.9);
                 }
-                HPSTrack hpstrk1 = new HPSTrack(helix1);
-                Hep3Vector posAtConverterFringe1 = hpstrk1.getPositionAtZMap(100., BeamlineConstants.HARP_POSITION_TESTRUN, 5.0)[0];
+                HpsHelicalTrackFit hpstrk1 = new HpsHelicalTrackFit(helix1);
+                Hep3Vector posAtConverterFringe1 =  new BasicHep3Vector(TrackUtils.extrapolateTrackUsingFieldMap(trk1, 100., BeamlineConstants.HARP_POSITION_TESTRUN, 5.0, event.getDetector().getFieldMap()).getReferencePoint());
                 if (beamlinePosOk(posAtConverterFringe1)) {
                     printWriter.format("%5.5f %5.5f %5.5f ", posAtConverterFringe1.z(), posAtConverterFringe1.x(), posAtConverterFringe1.y()); //note rotation from JLab->tracking
                 } else {
@@ -660,15 +662,15 @@
                     printWriter.format("%5.5f %5.5f ", -9999999.9, -9999999.9);
                 }
 
-                Hep3Vector posAtNomTargetFringe1 = hpstrk1.getPositionAtZMap(100., 0.0, 5.0)[0];
+                Hep3Vector posAtNomTargetFringe1 =  new BasicHep3Vector(TrackUtils.extrapolateTrackUsingFieldMap(trk1, 100., 0., 5.0, event.getDetector().getFieldMap()).getReferencePoint());
                 if (beamlinePosOk(posAtNomTargetFringe1)) {
                     printWriter.format("%5.5f %5.5f %5.5f ", posAtNomTargetFringe1.z(), posAtNomTargetFringe1.x(), posAtNomTargetFringe1.y()); //note rotation from JLab->tracking
                 } else {
                     printWriter.format("%5.5f %5.5f %5.5f ", -9999999.9, -9999999.9, -9999999.9);
                 }
 
+                Hep3Vector posAtECalFringe1 =  new BasicHep3Vector(TrackUtils.extrapolateTrackUsingFieldMap(trk1, BeamlineConstants.DIPOLE_EDGE_TESTRUN - 100, BeamlineConstants.ECAL_FACE_TESTRUN, 5.0, event.getDetector().getFieldMap()).getReferencePoint());
                 Hep3Vector posAtECal = TrackUtils.extrapolateTrack(trk1, BeamlineConstants.ECAL_FACE_TESTRUN);
-                Hep3Vector posAtECalFringe1 = hpstrk1.getPositionAtZMap(BeamlineConstants.DIPOLE_EDGE_TESTRUN - 100, BeamlineConstants.ECAL_FACE_TESTRUN, 5.0, false)[0];
                 if (beamlinePosOk(posAtECal)) {
                     //printWriter.format("%5.5f %5.5f ",posAtECal.x(),posAtECal.y()); //note rotation from JLab->tracking
                     printWriter.format("%5.5f %5.5f %5.5f %5.5f %5.5f ", posAtECal.x(), posAtECal.y(), posAtECalFringe1.z(), posAtECalFringe1.x(), posAtECalFringe1.y()); //note rotation from JLab->tracking
@@ -681,7 +683,8 @@
                     double[] pos_cluster = matched_cluster.getPosition();
                     posAtECal = TrackUtils.extrapolateTrack(trk1, pos_cluster[2]);
                     if (beamlinePosOk(posAtECal)) {
-                        posAtECalFringe1 = hpstrk1.getPositionAtZMap(BeamlineConstants.DIPOLE_EDGE_TESTRUN - 100, pos_cluster[2], 5.0, false)[0];
+                        posAtECalFringe1 =  new BasicHep3Vector(TrackUtils.extrapolateTrackUsingFieldMap(trk1, BeamlineConstants.DIPOLE_EDGE_TESTRUN - 100,  pos_cluster[2], 5.0, event.getDetector().getFieldMap()).getReferencePoint());
+
                         printWriter.format("%5.5f %5.5f %5.5f %5.5f %5.5f ", posAtECal.x(), posAtECal.y(), posAtECalFringe1.z(), posAtECalFringe1.x(), posAtECalFringe1.y()); //note rotation from JLab->tracking
                         if (_debug) {
                             System.out.printf("clpos:%5.5f %5.5f %5.5f  trk: %5.5f %5.5f %5.5f %5.5f %5.5f \n", pos_cluster[0], pos_cluster[1], pos_cluster[2], posAtECal.x(), posAtECal.y(), posAtECalFringe1.z(), posAtECalFringe1.x(), posAtECalFringe1.y()); //note rotation from JLab->tracking
@@ -1212,15 +1215,19 @@
     }
 
     private StraightLineTrack[] getSLTs(Track trk1, Track trk2, boolean useFringe) {
+        throw new NotImplementedException("Need to implement the SLT stuff again. Not sure where it went.");
         // find the point on the x- and y-axis by 
         // 1) go outside the fringe region 
         // 2) assume straight lines 
         // 3) solve for the position where the z-position is at the crossing point
-        double zStart = useFringe == true ? -100. : 0.;
-        StraightLineTrack slt1 = TrackUtils.findSLTAtZ(trk1, zStart, useFringe);
-        StraightLineTrack slt2 = TrackUtils.findSLTAtZ(trk2, zStart, useFringe);
-        StraightLineTrack[] vv = {slt1, slt2};
-        return vv;
+        //double zStart = useFringe == true ? -100. : 0.;
+        //StraightLineTrack slt1 = TrackUtils.findSLTAtZ(trk1, zStart, useFringe);
+        //StraightLineTrack slt2 = TrackUtils.findSLTAtZ(trk2, zStart, useFringe);
+        //StraightLineTrack[] vv = {slt1, slt2};
+        //StraightLineTrack[] vv = {null, null};
+        //if(1==1)
+        //    throw new NotImplementedException("Need to implement the SLT stuff again. Not sure where it went.");
+        //return vv;
     }
 
     /*

Modified: java/trunk/users/src/main/java/org/hps/users/phansson/TrackingReconstructionPlots.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/phansson/TrackingReconstructionPlots.java	(original)
+++ java/trunk/users/src/main/java/org/hps/users/phansson/TrackingReconstructionPlots.java	Mon Jan  4 17:43:47 2016
@@ -50,7 +50,8 @@
 import org.lcsim.util.aida.AIDA;
 
 /**
- *
+ * Analysis class to check recon.
+ * 
  * @author phansson
  */
 public class TrackingReconstructionPlots extends Driver {