Print

Print


Author: [log in to unmask]
Date: Fri Jan 20 11:20:44 2017
New Revision: 4681

Log:
Driver to make SVT hit/track plots

Added:
    java/trunk/users/src/main/java/org/hps/users/byale/SvtTrackPlotDriver.java   (with props)

Added: java/trunk/users/src/main/java/org/hps/users/byale/SvtTrackPlotDriver.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/byale/SvtTrackPlotDriver.java	(added)
+++ java/trunk/users/src/main/java/org/hps/users/byale/SvtTrackPlotDriver.java	Fri Jan 20 11:20:44 2017
@@ -0,0 +1,848 @@
+package org.hps.users.byale;
+
+import static java.lang.Math.sqrt;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import hep.aida.IAnalysisFactory;
+import hep.aida.IHistogramFactory;
+import hep.aida.IPlotterFactory;
+import hep.aida.IPlotter;
+import hep.aida.IHistogram1D;
+import hep.aida.ITree;
+import hep.aida.ref.rootwriter.RootFileStore;
+import hep.physics.matrix.SymmetricMatrix;
+import hep.physics.vec.BasicHep3Vector;
+import hep.physics.vec.Hep3Vector;
+
+import org.lcsim.detector.DetectorElementStore;
+import org.lcsim.detector.IDetectorElement;
+import org.lcsim.detector.IRotation3D;
+import org.lcsim.detector.ITransform3D;
+import org.lcsim.detector.ITranslation3D;
+import org.lcsim.detector.identifier.IExpandedIdentifier;
+import org.lcsim.detector.identifier.IIdentifier;
+import org.lcsim.detector.identifier.IIdentifierDictionary;
+import org.lcsim.detector.tracker.silicon.HpsSiSensor;
+import org.lcsim.detector.tracker.silicon.SiSensor;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.LCRelation;
+import org.lcsim.event.RawTrackerHit;
+import org.lcsim.event.RelationalTable;
+import org.lcsim.event.SimTrackerHit;
+import org.lcsim.event.Track;
+import org.lcsim.event.TrackerHit;
+import org.lcsim.event.base.BaseRelationalTable;
+import org.lcsim.fit.helicaltrack.HelicalTrackHit;
+import org.lcsim.fit.helicaltrack.HelicalTrackStrip;
+import org.lcsim.geometry.Detector;
+import org.lcsim.recon.tracking.digitization.sisim.SiTrackerHit;
+import org.lcsim.recon.tracking.digitization.sisim.SiTrackerHitStrip1D;
+import org.lcsim.recon.tracking.digitization.sisim.TrackerHitType;
+import org.lcsim.recon.tracking.digitization.sisim.TransformableTrackerHit;
+import org.lcsim.util.Driver;
+
+import org.hps.recon.tracking.FittedRawTrackerHit;
+import org.hps.recon.tracking.TrackUtils;
+
+/**
+ * 
+ * @author Bradley Yale <[log in to unmask]>
+ *
+ */
+public class SvtTrackPlotDriver extends Driver {
+
+    // Use JFreeChart as the default plotting backend
+    static { 
+        hep.aida.jfree.AnalysisFactory.register();
+    }
+
+    // Plotting
+    ITree tree; 
+    IHistogramFactory histogramFactory; 
+    IPlotterFactory plotterFactory = IAnalysisFactory.create().createPlotterFactory();
+    protected Map<String, IPlotter> plotters = new HashMap<String, IPlotter>();
+    private Map<String, IHistogram1D> trackPlots = new HashMap<String, IHistogram1D>();
+    private Map<String, IHistogram1D> clusterChargePlots = new HashMap<String, IHistogram1D>();
+    private Map<String, IHistogram1D> clusterSizePlots = new HashMap<String, IHistogram1D>();    
+    private Map<String, IHistogram1D> MCPlots = new HashMap<String, IHistogram1D>();
+
+    private List<HpsSiSensor> sensors;
+    private Map<RawTrackerHit, LCRelation> fittedRawTrackerHitMap 
+        = new HashMap<RawTrackerHit, LCRelation>();
+    
+    // Detector name
+    private static final String SUBDETECTOR_NAME = "Tracker";
+    
+    // Collections
+    private String trackCollectionName = "MatchedTracks";
+    private String stereoHitRelationsColName = "HelicalTrackHitRelations";
+    private String fittedHitsCollectionName = "SVTFittedRawTrackerHits";
+    private String rotatedHthRelationsColName = "RotatedHelicalTrackHitRelations";
+    // private String StripsCollectionName = "SiTrackerHitStrip";
+    //private String MCParticleCollectionName = "MCParticles";
+    
+
+    private int runNumber = -1; 
+    
+    int npositive = 0;
+    int nnegative = 0;
+    double ntracks = 0;
+    double ntracksTop = 0;
+    double ntracksBottom = 0;
+    double nTwoTracks = 0;
+    double nevents = 0;
+
+    double d0Cut = -9999;
+    
+    // Flags 
+    boolean electronCut = false;
+    boolean positronCut = false;
+    
+    /**
+     *  Default Constructor
+     */    
+    public SvtTrackPlotDriver(){
+    }
+    
+    public void setEnableElectronCut(boolean electronCut) {
+        this.electronCut = electronCut;
+    }
+
+    public void setEnablePositronCut(boolean positronCut) {
+        this.positronCut = positronCut;
+    }
+
+    public void setD0Cut(double d0Cut) {
+       this.d0Cut = d0Cut; 
+    }
+    
+    private int computePlotterRegion(HpsSiSensor sensor) {
+
+        if (sensor.getLayerNumber() < 7) {
+            if (sensor.isTopLayer()) {
+                return 6*(sensor.getLayerNumber() - 1); 
+            } else { 
+                return 6*(sensor.getLayerNumber() - 1) + 1;
+            } 
+        } else { 
+        
+            if (sensor.isTopLayer()) {
+                if (sensor.getSide() == HpsSiSensor.POSITRON_SIDE) {
+                    return 6*(sensor.getLayerNumber() - 7) + 2;
+                } else { 
+                    return 6*(sensor.getLayerNumber() - 7) + 3;
+                }
+            } else if (sensor.isBottomLayer()) {
+                if (sensor.getSide() == HpsSiSensor.POSITRON_SIDE) {
+                    return 6*(sensor.getLayerNumber() - 7) + 4;
+                } else {
+                    return 6*(sensor.getLayerNumber() - 7) + 5;
+                }
+            }
+        }
+        return -1; 
+    }
+    
+    protected void detectorChanged(Detector detector){
+    
+        tree = IAnalysisFactory.create().createTreeFactory().create();
+        histogramFactory = IAnalysisFactory.create().createHistogramFactory(tree);
+        
+        // Get the HpsSiSensor objects from the tracker detector element
+        sensors = detector.getSubdetector(SUBDETECTOR_NAME)
+                          .getDetectorElement().findDescendants(HpsSiSensor.class);
+   
+        // If the detector element had no sensors associated with it, throw
+        // an exception
+        if (sensors.size() == 0) {
+            throw new RuntimeException("No sensors were found in this detector.");
+        }
+
+        plotters.put("Event Information", plotterFactory.create("Event information"));
+        plotters.get("Event Information").createRegions(2, 3);
+
+        trackPlots.put("Number of tracks", histogramFactory.createHistogram1D("Number of tracks", 10, 0, 10));
+        plotters.get("Event Information").region(0).plot(trackPlots.get("Number of tracks"));
+
+        trackPlots.put("Track charge", histogramFactory.createHistogram1D("Track charge", 3, -1, 2));
+        plotters.get("Event Information").region(1).plot(trackPlots.get("Track charge"));
+
+        trackPlots.put("chi2", histogramFactory.createHistogram1D("chi2", 40, 0, 40));    
+        plotters.get("Event Information").region(2).plot(trackPlots.get("chi2"));
+
+        plotters.put("Track Parameters", plotterFactory.create("Track Parameters"));
+        plotters.get("Track Parameters").createRegions(4, 4);
+
+        trackPlots.put("doca", histogramFactory.createHistogram1D("doca", 80, -10, 10));         
+        plotters.get("Track Parameters").region(0).plot(trackPlots.get("doca")); 
+      
+        trackPlots.put("z0", histogramFactory.createHistogram1D("z0", 80, -2, 2));    
+        plotters.get("Track Parameters").region(1).plot(trackPlots.get("z0"));
+
+        trackPlots.put("sin(phi0)", histogramFactory.createHistogram1D("sin(phi0)", 40, -0.2, 0.2));    
+        plotters.get("Track Parameters").region(2).plot(trackPlots.get("sin(phi0)"));
+    
+        trackPlots.put("curvature", histogramFactory.createHistogram1D("curvature", 50, -0.001, 0.001));    
+        plotters.get("Track Parameters").region(3).plot(trackPlots.get("curvature"));
+
+        trackPlots.put("tan_lambda", histogramFactory.createHistogram1D("tan_lambda", 100, -0.1, 0.1));    
+        plotters.get("Track Parameters").region(4).plot(trackPlots.get("tan_lambda"));
+
+        trackPlots.put("cos(theta)", histogramFactory.createHistogram1D("cos(theta)", 40, -0.1, 0.1));
+        plotters.get("Track Parameters").region(5).plot(trackPlots.get("cos(theta)"));
+        
+        trackPlots.put("cluster time dt", histogramFactory.createHistogram1D("cluster time dt", 100, -20, 20));
+        plotters.get("Track Parameters").region(6).plot(trackPlots.get("cluster time dt"));
+       
+        plotters.put("Cluster Amplitude", plotterFactory.create("Cluster Amplitude"));
+        plotters.get("Cluster Amplitude").createRegions(6, 6);
+        
+        plotters.put("Cluster Size", plotterFactory.create("Cluster Size"));
+        plotters.get("Cluster Size").createRegions(6, 6);
+        
+     // Strip hit coordinate
+        MCPlots.put("simHit_U", histogramFactory.createHistogram1D("simHit_U", 200, -20, 20));
+        plotters.get("Track Parameters").region(7).plot(MCPlots.get("simHit_U"));
+        
+        MCPlots.put("trackerHit_U", histogramFactory.createHistogram1D("trackerHit_U", 200, -20, 20));
+        plotters.get("Track Parameters").region(8).plot(MCPlots.get("trackerHit_U"));
+        
+        MCPlots.put("MC_U", histogramFactory.createHistogram1D("MC_U", 200, -20, 20));
+        plotters.get("Track Parameters").region(9).plot(MCPlots.get("MC_U"));
+        
+        MCPlots.put("trackerHit-MC_U", histogramFactory.createHistogram1D("trackerHit-MC_U", 200, -20, 20));
+        plotters.get("Track Parameters").region(10).plot(MCPlots.get("trackerHit-MC_U"));
+        
+        MCPlots.put("trackerHit-MC_U_Pull", histogramFactory.createHistogram1D("trackerHit-MC_U_Pull", 200, -20, 20));
+        plotters.get("Track Parameters").region(11).plot(MCPlots.get("trackerHit-MC_U_Pull"));
+        
+        MCPlots.put("trackerHit-MC_U_Chi2", histogramFactory.createHistogram1D("trackerHit-MC_U_Chi2", 200, -20, 20));
+        plotters.get("Track Parameters").region(12).plot(MCPlots.get("trackerHit-MC_U_Chi2"));
+        
+        for (HpsSiSensor sensor : sensors) { 
+       
+            clusterChargePlots.put(sensor.getName(), 
+                    histogramFactory.createHistogram1D(sensor.getName() + " - Cluster Charge", 100, 0, 5000));
+            plotters.get("Cluster Amplitude").region(this.computePlotterRegion(sensor))
+                                             .plot(clusterChargePlots.get(sensor.getName()));
+            
+            clusterSizePlots.put(sensor.getName(),
+                    histogramFactory.createHistogram1D(sensor.getName() + " - Cluster Size", 10, 0, 10));
+            plotters.get("Cluster Size").region(this.computePlotterRegion(sensor))
+                                                .plot(clusterSizePlots.get(sensor.getName()));
+            
+        }
+
+        //--- Track Extrapolation ---//
+        //---------------------------// 
+        /*plotters.add(aida.analysisFactory().createPlotterFactory().create("Track Position at Ecal"));
+        plotters.get(nPlotters).region(0).plot(aida.histogram2D("Track Position at Ecal", 200, -350, 350, 200, -100, 100));
+        plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap");
+        plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+        plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
+        plotters.get(nPlotters).style();
+        nPlotters++;
+        
+        plotters.add(aida.analysisFactory().createPlotterFactory().create("Track Position at Harp"));
+        plotters.get(nPlotters).region(0).plot(aida.histogram2D("Track Position at Harp", 200, -200, 200, 100, -50, 50));
+        plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap");
+        plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+        plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
+        nPlotters++;
+
+        plotters.add(aida.analysisFactory().createPlotterFactory().create("Track Position at Ecal: curvature < 0"));
+        plotters.get(nPlotters).region(0).plot(aida.histogram2D("Track Position at Ecal: curvature < 0",200, -350, 350, 200, -100, 100));
+        plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap");
+        plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+        plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
+        nPlotters++;
+        
+        plotters.add(aida.analysisFactory().createPlotterFactory().create("Track Position at Harp: curvature < 0"));
+        plotters.get(nPlotters).region(0).plot(aida.histogram2D("Track Position at Harp: curvature < 0", 200, -200, 200, 100, -50, 50));
+        plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap");
+        plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+        plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
+        nPlotters++;
+        
+        plotters.add(aida.analysisFactory().createPlotterFactory().create("Track Position at Ecal: curvature > 0"));
+        plotters.get(nPlotters).region(0).plot(aida.histogram2D("Track Position at Ecal: curvature > 0", 200, -350, 350, 200, -100, 100));
+        plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap");
+        plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+        plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
+        nPlotters++;
+        
+        plotters.add(aida.analysisFactory().createPlotterFactory().create("Track Position at Harp: curvature > 0"));
+        plotters.get(nPlotters).region(0).plot(aida.histogram2D("Track Position at Harp: curvature > 0", 200, -200, 200, 100, -50, 50));
+        plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap");
+        plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+        plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
+        nPlotters++;
+        
+        plotters.add(aida.analysisFactory().createPlotterFactory().create("Track Position at Ecal: Two Tracks"));
+        plotters.get(nPlotters).region(0).plot(aida.histogram2D("Track Position at Ecal: Two Tracks", 200, -350, 350, 200, -100, 100));
+        plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap");
+        plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+        plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
+        plotters.get(nPlotters).style();
+        nPlotters++;
+        
+        plotters.add(aida.analysisFactory().createPlotterFactory().create("Track Position at Harp: Two Tracks"));
+        plotters.get(nPlotters).region(0).plot(aida.histogram2D("Track Position at Harp: Two Tracks", 200, -200, 200, 100, -50, 50));
+        plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap");
+        plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+        plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
+        nPlotters++;
+        
+        
+        //--- Momentum ---//
+        //----------------//
+        plotters.add(aida.analysisFactory().createPlotterFactory().create("Px"));
+        plotters.get(nPlotters).region(0).plot(aida.histogram1D("Px", 100, 0, 5));
+        plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
+        plotters.get(nPlotters).style().dataStyle().errorBarStyle().setVisible(false);
+        nPlotters++;
+        
+        plotters.add(aida.analysisFactory().createPlotterFactory().create("Py"));
+        plotters.get(nPlotters).region(0).plot(aida.histogram1D("Py", 100, 0, 5));
+        plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
+        plotters.get(nPlotters).style().dataStyle().errorBarStyle().setVisible(false);
+        nPlotters++;
+        
+        plotters.add(aida.analysisFactory().createPlotterFactory().create("Pz"));
+        plotters.get(nPlotters).region(0).plot(aida.histogram1D("Pz", 100, 0, 5));
+        plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
+        plotters.get(nPlotters).style().dataStyle().errorBarStyle().setVisible(false);
+        nPlotters++;
+        
+        plotters.add(aida.analysisFactory().createPlotterFactory().create("Px: C > 0"));
+        plotters.get(nPlotters).region(0).plot(aida.histogram1D("Px: C > 0", 100, 0, 5));
+        plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
+        plotters.get(nPlotters).style().dataStyle().errorBarStyle().setVisible(false);
+        nPlotters++;
+        
+        plotters.add(aida.analysisFactory().createPlotterFactory().create("Py: C > 0"));
+        plotters.get(nPlotters).region(0).plot(aida.histogram1D("Py: C > 0", 100, 0, 5));
+        plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
+        plotters.get(nPlotters).style().dataStyle().errorBarStyle().setVisible(false);
+        nPlotters++;
+        
+        plotters.add(aida.analysisFactory().createPlotterFactory().create("Pz: C > 0"));
+        plotters.get(nPlotters).region(0).plot(aida.histogram1D("Pz: C > 0", 100, 0, 5));
+        plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
+        plotters.get(nPlotters).style().dataStyle().errorBarStyle().setVisible(false);
+        nPlotters++;
+        
+        plotters.add(aida.analysisFactory().createPlotterFactory().create("Px: C < 0"));
+        plotters.get(nPlotters).region(0).plot(aida.histogram1D("Px: C < 0", 100, 0, 5));
+        plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
+        plotters.get(nPlotters).style().dataStyle().errorBarStyle().setVisible(false);
+        nPlotters++;
+        
+        plotters.add(aida.analysisFactory().createPlotterFactory().create("Py: C < 0"));
+        plotters.get(nPlotters).region(0).plot(aida.histogram1D("Py: C < 0", 100, 0, 5));
+        plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
+        plotters.get(nPlotters).style().dataStyle().errorBarStyle().setVisible(false);
+        nPlotters++;
+        
+        plotters.add(aida.analysisFactory().createPlotterFactory().create("Pz: C < 0"));
+        plotters.get(nPlotters).region(0).plot(aida.histogram1D("Pz: C < 0", 100, 0, 5));
+        plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
+        plotters.get(nPlotters).style().dataStyle().errorBarStyle().setVisible(false);
+        nPlotters++;
+        
+        plotters.add(aida.analysisFactory().createPlotterFactory().create("Px: Two Tracks"));
+        plotters.get(nPlotters).region(0).plot(aida.histogram1D("Px: Two Tracks", 100, 0, 5));
+        plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
+        plotters.get(nPlotters).style().dataStyle().errorBarStyle().setVisible(false);
+        nPlotters++;
+        
+        plotters.add(aida.analysisFactory().createPlotterFactory().create("E over P"));
+        plotters.get(nPlotters).region(0).plot(aida.histogram1D("E over P", 100, 0, 5));
+        plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
+        plotters.get(nPlotters).style().dataStyle().errorBarStyle().setVisible(false);
+        nPlotters++;
+           
+        plotters.add(aida.analysisFactory().createPlotterFactory().create("E versus P"));
+        plotters.get(nPlotters).region(0).plot(aida.histogram2D("E versus P", 100, 0, 1500, 100, 0, 4000));
+        plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap");
+        plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+        plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
+        nPlotters++;
+        
+        //--- Cluster Matching ---//
+        //------------------------//        
+        plotters.add(aida.analysisFactory().createPlotterFactory().create("XY Difference between Ecal Cluster and Track Position"));
+        plotters.get(nPlotters).region(0).plot(aida.histogram2D("XY Difference between Ecal Cluster and Track Position", 200, -200, 200, 100, -50, 50));
+        plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap");
+        plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+        plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
+        nPlotters++;
+        */
+        for (IPlotter plotter : plotters.values()) { 
+            plotter.show();
+        }
+    }
+    
+    @SuppressWarnings({ "unchecked", "rawtypes" })
+    public void process(EventHeader event){
+        nevents++;
+
+        // Get the run number from the event
+        if (runNumber == -1) runNumber = event.getRunNumber();
+        
+        // If the event doesn't have any tracks, skip it    
+       // if(!event.hasCollection(Track.class, trackCollectionName)) return;
+        
+     // If the event doesn't have any SimTrackerHits, skip it    
+      //  if(!event.hasCollection(SimTrackerHit.class, TrackerHitsCollectionName)) return;
+     // If the event doesn't have any SimTrackerHits, skip it    
+       // if(!event.hasCollection(SiTrackerHitStrip1D.class)) return;
+        
+        
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%        
+       // Get the local u coordinate from SimTrackerHits
+
+        
+        // a map of MC hit positions keyed on sensor name
+        Map<String, List<Double>> mcSensorHitPositionMap = new HashMap<String, List<Double>>();
+        // a map of Tracker hit positions keyed on sensor name
+        Map<String, List<Double>> trackSensorHitPositionMap = new HashMap<String, List<Double>>();
+
+        // First step is to get the SimTrackerHits and determine their location
+        // in local coordinates.
+        List<SimTrackerHit> simHits = event.get(SimTrackerHit.class, "TrackerHits");
+  //      System.out.println("found " + simHits.size() + " SimTrackerHits");
+        // loop over each hit
+        for (SimTrackerHit hit : simHits) {
+            // get the hit's position in global coordinates..
+            Hep3Vector globalPos = hit.getPositionVec();
+            // get the transformation from global to local
+            ITransform3D g2lXform = hit.getDetectorElement().getGeometry().getGlobalToLocal();
+            //System.out.println("transform matrix: " + g2lXform);
+            IRotation3D rotMat = g2lXform.getRotation();
+            //System.out.println("rotation matrix: " + rotMat);
+            ITranslation3D transMat = g2lXform.getTranslation();
+            //System.out.println("translation vector: " + transMat);
+            // check that we can reproduce the local origin
+            ITransform3D l2gXform = hit.getDetectorElement().getGeometry().getLocalToGlobal();
+            Hep3Vector o = new BasicHep3Vector();
+            //System.out.println("origin: " + o);
+            // tranform the local origin into global position
+            Hep3Vector localOriginInglobal = l2gXform.transformed(o);
+            //System.out.println("transformed local to global: " + localOriginInglobal);
+            // and now back...
+            //System.out.println("and back: " + g2lXform.transformed(localOriginInglobal));
+            // hmmm, so why is this not the same as the translation vector of the transform?
+            //Note:
+            // u is the measurement direction perpendicular to the strip
+            // v is along the strip
+            // w is normal to the wafer plane
+
+            Hep3Vector localPos = g2lXform.transformed(globalPos);
+//            System.out.println("Layer: " + hit.getLayer() + " Layer Number: " + hit.getLayerNumber() + " ID: " + hit.getCellID() + " " + hit.getDetectorElement().getName());
+//            System.out.println("global position " + globalPos);
+//            System.out.println("local  position " + localPos);
+            String sensorName = hit.getDetectorElement().getName();
+            double u = localPos.x();
+   //         System.out.println("MC " + hit.getDetectorElement().getName() + " u= " + localPos.x());
+            if (mcSensorHitPositionMap.containsKey(sensorName)) {
+                List<Double> vals = mcSensorHitPositionMap.get(sensorName);
+                vals.add(u);
+            } else {
+                List<Double> vals = new ArrayList<Double>();
+                vals.add(u);
+                mcSensorHitPositionMap.put(sensorName, vals);
+            }
+            
+            MCPlots.get("simHit_U").fill(u);
+          
+        } // end of loop over SimTrackerHits
+        
+//TRACKER HITS        
+        setupSensors(event);
+        RelationalTable hitToStrips = TrackUtils.getHitToStripsTable(event);
+        RelationalTable hitToRotated = TrackUtils.getHitToRotatedTable(event);
+        List<Track> tracks = event.get(Track.class, "MatchedTracks");
+   //     System.out.println("found " + tracks.size() + " tracks");
+        for (Track t : tracks) {
+            List<TrackerHit> hits = t.getTrackerHits();
+ //           System.out.println("track has " + hits.size() + " hits");
+            if (hits.size() == 6) {
+                for (TrackerHit h : hits) {
+                    Set<TrackerHit> stripList = hitToStrips.allFrom(hitToRotated.from(h));
+                    for (TrackerHit strip : stripList) {
+                        List rawHits = strip.getRawHits();
+                        HpsSiSensor sensor = null;
+                        for (Object o : rawHits) {
+                            RawTrackerHit rth = (RawTrackerHit) o;
+                            // TODO figure out why the following collection is always null
+                            //List<SimTrackerHit> stipMCHits = rth.getSimTrackerHits();
+                            sensor = (HpsSiSensor) rth.getDetectorElement();
+                        }
+                        int nHitsInCluster = rawHits.size();
+                        String sensorName = sensor.getName();
+                        Hep3Vector posG = new BasicHep3Vector(strip.getPosition());
+                        Hep3Vector posL = sensor.getGeometry().getGlobalToLocal().transformed(posG);
+                        double u = posL.x();
+                        double mcU = mcSensorHitPositionMap.get(sensorName).get(0);
+
+                        // now for the uncertainty in u
+                        SymmetricMatrix covG = new SymmetricMatrix(3, strip.getCovMatrix(), true);
+                        SymmetricMatrix covL = sensor.getGeometry().getGlobalToLocal().transformed(covG);
+                        double sigmaU = sqrt(covL.e(0, 0));
+                        
+                        MCPlots.get("trackerHit_U").fill(u);
+                        MCPlots.get("MC_U").fill(mcU);
+                        MCPlots.get("trackerHit-MC_U").fill(u-mcU);
+                        MCPlots.get("trackerHit-MC_U_Pull").fill((u-mcU)/sigmaU);
+                        MCPlots.get("trackerHit-MC_U_Chi2").fill(((u-mcU)/sigmaU)*((u-mcU)/sigmaU));
+                        
+                        
+                        //System.out.println(" Track Hit: " + nHitsInCluster + " " + sensorName + " u " + u + " mcU " + mcU + " sigmaU " + sigmaU);
+                    }
+                }
+            } // end of loop over six-hit tracks
+        } // end of loop over tracks
+        
+       
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+//*********************THIS IS JUNK *****************************************************        
+//        List<SimTrackerHit> OneDHits = event.get(SimTrackerHit.class, "TrackerHits");
+//        for(SimTrackerHit OneDHit : OneDHits){
+//      
+//        	double umeas = ((TransformableTrackerHit) OneDHit).getTransformedHit(TrackerHitType.CoordinateSystem.SENSOR).getPosition()[0];
+//           // Hep3Vector v = OneDStrip.;
+//           // HelicalTrackStrip strip = makeDigiStrip(OneDStrips);
+
+//        	MCPlots.get("umeas").fill(umeas);
+
+//        }
+        
+        	
+     // Get the collection of SimTrackerHits from the event
+     //   List<SimTrackerHit> hits = event.get(SimTrackerHit.class, TrackerHitsCollectionName);
+   
+     //   for(SimTrackerHit hit : hits){
+        	
+       //     double[] hitPosition = hit.getPosition();
+           // double MCPosition_x = hit.getMCParticle();
+            
+      //      MCPlots.get("umeas").fill(MCPosition_x);
+            //hitPosition[0]
+         
+            
+      //  }
+        
+ // ************************** THIS IS JUNK ************************************************************************
+        
+        
+        
+        // Get the collection of LCRelations between a stereo hit and the strips making it up
+//        List<LCRelation> stereoHitRelations = event.get(LCRelation.class, stereoHitRelationsColName);
+//        BaseRelationalTable stereoHitToClusters = new BaseRelationalTable(RelationalTable.Mode.MANY_TO_MANY, RelationalTable.Weighting.UNWEIGHTED);
+//        for (LCRelation relation : stereoHitRelations) { 
+//            if (relation != null && relation.getFrom() != null && relation.getTo() != null) {
+//                stereoHitToClusters.add(relation.getFrom(), relation.getTo());
+ //           }
+ //       }
+        
+        // Get the collection of LCRelations relating RotatedHelicalTrackHits to
+        // HelicalTrackHits
+ //       List<LCRelation> rotatedHthToHthRelations = event.get(LCRelation.class, rotatedHthRelationsColName);
+ //       BaseRelationalTable hthToRotatedHth = new BaseRelationalTable(RelationalTable.Mode.ONE_TO_ONE, RelationalTable.Weighting.UNWEIGHTED);
+ //       for (LCRelation relation : rotatedHthToHthRelations) {
+ //           if (relation != null && relation.getFrom() != null && relation.getTo() != null) {
+  //              hthToRotatedHth.add(relation.getFrom(), relation.getTo());
+  //          }
+  //      }
+        
+        // Get the list of fitted hits from the event
+//        List<LCRelation> fittedHits = event.get(LCRelation.class, fittedHitsCollectionName);
+        
+        // Map the fitted hits to their corresponding raw hits
+//        this.mapFittedRawHits(fittedHits);
+       
+        trackPlots.get("Number of tracks").fill(tracks.size());
+        
+        // Loop over all of the tracks in the event
+        for(Track track : tracks){
+            
+            //if (TrackUtils.getR(track) < 0 && electronCut) continue;
+            
+            //if (TrackUtils.getR(track) > 0 && positronCut) continue;
+            
+            //if (d0Cut != -9999 && Math.abs(TrackUtils.getDoca(track)) < d0Cut) continue;
+            
+            trackPlots.get("Track charge").fill(TrackUtils.getR(track), 1);
+    
+            // Fill the track parameter plots
+            trackPlots.get("doca").fill(TrackUtils.getDoca(track));
+            trackPlots.get("z0").fill(TrackUtils.getZ0(track));
+            trackPlots.get("sin(phi0)").fill(TrackUtils.getPhi0(track));
+            trackPlots.get("curvature").fill(TrackUtils.getR(track));
+            trackPlots.get("tan_lambda").fill(TrackUtils.getTanLambda(track));
+            trackPlots.get("cos(theta)").fill(TrackUtils.getCosTheta(track));
+            trackPlots.get("chi2").fill(track.getChi2());
+        }
+     }
+ //           for (TrackerHit rotatedStereoHit : track.getTrackerHits()) { 
+             
+                // Get the HelicalTrackHit corresponding to the RotatedHelicalTrackHit
+                // associated with a track
+//                Set<TrackerHit> clusters = stereoHitToClusters.allFrom(hthToRotatedHth.from(rotatedStereoHit));
+                
+//                int clusterIndex = 0;
+//                double clusterTimeDt = 0;
+//                for (TrackerHit cluster : clusters) { 
+                    
+//                    if (clusterIndex == 0) { 
+//                        clusterTimeDt += cluster.getTime();
+//                        clusterIndex++;
+ //                   } else { 
+ //                       clusterTimeDt -= cluster.getTime();
+ //                   }
+                    
+  //                  double amplitude = 0;
+  //                  HpsSiSensor sensor = null;
+  //                  for (Object rawHitObject : cluster.getRawHits()) {
+  //                      RawTrackerHit rawHit = (RawTrackerHit) rawHitObject; 
+                        
+  //                      sensor = (HpsSiSensor) rawHit.getDetectorElement();
+                        
+                        // Get the channel of the raw hit
+                        //int channel = rawHit.getIdentifierFieldValue("strip");
+                
+                        // Add the amplitude of that channel to the total amplitude
+   //                     amplitude += FittedRawTrackerHit.getAmp(this.getFittedHit(rawHit));
+   //                 }
+                    
+   //                 clusterChargePlots.get(sensor.getName()).fill(amplitude);
+   //                 clusterSizePlots.get(sensor.getName()).fill(cluster.getRawHits().size());
+   //             }
+                
+   //             trackPlots.get("cluster time dt").fill(clusterTimeDt);
+   //         }
+   //     }
+  //  }
+    
+    public void endOfData() { 
+        
+        String rootFile = "run" + runNumber + "_track_analysis.root";
+        RootFileStore store = new RootFileStore(rootFile);
+        try {
+            store.open();
+            store.add(tree);
+            store.close(); 
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     *  Method that creates a map between a fitted raw hit and it's corresponding raw fit
+     *  
+     * @param fittedHits : List of fitted hits to map
+     */
+//    private void mapFittedRawHits(List<LCRelation> fittedHits) { 
+        
+        // Clear the fitted raw hit map of old values
+//        fittedRawTrackerHitMap.clear();
+       
+        // Loop through all fitted hits and map them to their corresponding raw hits
+ //       for (LCRelation fittedHit : fittedHits) { 
+ //           fittedRawTrackerHitMap.put(FittedRawTrackerHit.getRawTrackerHit(fittedHit), fittedHit);
+ //       }
+ //   }
+    
+    /**
+     * 
+     * @param rawHit
+     * @return
+     */
+//    private LCRelation getFittedHit(RawTrackerHit rawHit) { 
+//        return fittedRawTrackerHitMap.get(rawHit);
+//    }
+    
+    
+    
+
+   // Setup Sensors to use
+            private void setupSensors(EventHeader event)
+            {
+                List<RawTrackerHit> rawTrackerHits = null;
+                if (event.hasCollection(RawTrackerHit.class, "SVTRawTrackerHits")) {
+                    rawTrackerHits = event.get(RawTrackerHit.class, "SVTRawTrackerHits");
+                }
+                if (event.hasCollection(RawTrackerHit.class, "RawTrackerHitMaker_RawTrackerHits")) {
+                    rawTrackerHits = event.get(RawTrackerHit.class, "RawTrackerHitMaker_RawTrackerHits");
+                }
+                EventHeader.LCMetaData meta = event.getMetaData(rawTrackerHits);
+                // Get the ID dictionary and field information.
+                IIdentifierDictionary dict = meta.getIDDecoder().getSubdetector().getDetectorElement().getIdentifierHelper().getIdentifierDictionary();
+                int fieldIdx = dict.getFieldIndex("side");
+                int sideIdx = dict.getFieldIndex("strip");
+                for (RawTrackerHit hit : rawTrackerHits) {
+                    // The "side" and "strip" fields needs to be stripped from the ID for sensor lookup.
+                    IExpandedIdentifier expId = dict.unpack(hit.getIdentifier());
+                    expId.setValue(fieldIdx, 0);
+                    expId.setValue(sideIdx, 0);
+                    IIdentifier strippedId = dict.pack(expId);
+                    // Find the sensor DetectorElement.
+                    List<IDetectorElement> des = DetectorElementStore.getInstance().find(strippedId);
+                    if (des == null || des.size() == 0) {
+                        throw new RuntimeException("Failed to find any DetectorElements with stripped ID <0x" + Long.toHexString(strippedId.getValue()) + ">.");
+                    } else if (des.size() == 1) {
+                        hit.setDetectorElement((SiSensor) des.get(0));
+                    } else {
+                        // Use first sensor found, which should work unless there are sensors with duplicate IDs.
+                        for (IDetectorElement de : des) {
+                            if (de instanceof SiSensor) {
+                                hit.setDetectorElement((SiSensor) de);
+                                break;
+                            }
+                        }
+                    }
+                    // No sensor was found.
+                    if (hit.getDetectorElement() == null) {
+                        throw new RuntimeException("No sensor was found for hit with stripped ID <0x" + Long.toHexString(strippedId.getValue()) + ">.");
+                    }
+                }
+            }
+}
+
+
+            /*
+            ntracks++;
+            Hep3Vector positionEcal = TrackUtils.getTrackPositionAtEcal(track);
+            System.out.println("Position at Ecal: " + positionEcal);
+            Hep3Vector positionConverter = TrackUtils.extrapolateTrack(track,-700);
+        
+            aida.histogram2D("Track Position at Ecal").fill(positionEcal.y(), positionEcal.z());
+            aida.histogram2D("Track Position at Harp").fill(positionConverter.y(), positionConverter.z());
+
+            if(positionEcal.z() > 0 ) ntracksTop++;
+            else if(positionEcal.z() < 0) ntracksBottom++;
+            */
+            
+        
+            /*    
+            aida.histogram1D("Px").fill(track.getTrackStates().get(0).getMomentum()[0]);
+            aida.histogram1D("Py").fill(track.getTrackStates().get(0).getMomentum()[1]);
+            aida.histogram1D("Pz").fill(track.getTrackStates().get(0).getMomentum()[2]);
+            aida.histogram1D("ChiSquared").fill(track.getChi2());
+            
+            if(Math.signum(TrackUtils.getR(track)) < 0){
+                aida.histogram2D("Track Position at Ecal: curvature < 0").fill(positionEcal.y(), positionEcal.z());
+                aida.histogram2D("Track Position at Harp: curvature < 0").fill(positionConverter.y(), positionConverter.z());
+                aida.histogram1D("Px: C < 0").fill(track.getTrackStates().get(0).getMomentum()[0]);
+                aida.histogram1D("Py: C < 0").fill(track.getTrackStates().get(0).getMomentum()[1]);
+                aida.histogram1D("Pz: C < 0").fill(track.getTrackStates().get(0).getMomentum()[2]);
+                nnegative++;
+            } else if(Math.signum(TrackUtils.getR(track)) > 0){
+                aida.histogram2D("Track Position at Ecal: curvature > 0").fill(positionEcal.y(), positionEcal.z());
+                aida.histogram2D("Track Position at Harp: curvature > 0").fill(positionConverter.y(), positionConverter.z());
+                aida.histogram1D("Px: C > 0").fill(track.getTrackStates().get(0).getMomentum()[0]);
+                aida.histogram1D("Px: C > 0").fill(track.getTrackStates().get(0).getMomentum()[1]);
+                aida.histogram1D("Px: C > 0").fill(track.getTrackStates().get(0).getMomentum()[2]);
+                npositive++;
+            }
+            
+            if(tracks.size() > 1){
+                aida.histogram2D("Track Position at Ecal: Two Tracks").fill(positionEcal.y(), positionEcal.z());
+                aida.histogram2D("Track Position at Harp: Two Tracks").fill(positionConverter.y(), positionConverter.z()); 
+                aida.histogram1D("Px: Two Tracks").fill(track.getTrackStates().get(0).getMomentum()[0]);
+                if(tracks.size() == 2) nTwoTracks++;
+            }
+            
+            trackToEcalPosition.put(positionEcal, track);
+            ecalPos.add(positionEcal);          
+        }
+        
+        if(!event.hasCollection(Cluster.class, "EcalClusters")) return;
+        List<Cluster> clusters = event.get(Cluster.class, "EcalClusters");
+        
+
+        for(Hep3Vector ecalP : ecalPos){
+            double xdiff = 1000; 
+            double ydiff = 1000;
+            for(Cluster cluster : clusters){
+                double xd = ecalP.y() - cluster.getPosition()[0];
+                double yd = ecalP.z() - cluster.getPosition()[1];  
+                if(yd < ydiff){
+                    xdiff = xd;
+                    ydiff = yd;
+                    trackToCluster.put(trackToEcalPosition.get(ecalP),cluster);
+                }
+            }
+            clusters.remove(trackToCluster.get(trackToEcalPosition.get(ecalP)));
+            aida.histogram2D("XY Difference between Ecal Cluster and Track Position").fill(xdiff, ydiff);
+        }
+        
+        for(Map.Entry<Track, Cluster> entry : trackToCluster.entrySet()){
+            double Energy = entry.getValue().getEnergy();
+            Track track = entry.getKey();
+            double pTotal = Math.sqrt(track.getTrackStates().get(0).getMomentum()[0]*track.getTrackStates().get(0).getMomentum()[0] + track.getTrackStates().get(0).getMomentum()[1]*track.getTrackStates().get(0).getMomentum()[1] + track.getTrackStates().get(0).getMomentum()[2]*track.getTrackStates().get(0).getMomentum()[2]);
+            
+            double ep = Energy/(pTotal*1000);
+            
+            System.out.println("Energy: " + Energy + "P: " + pTotal + " E over P: " + ep);
+            
+            aida.histogram1D("E over P").fill(ep);
+            aida.histogram2D("E versus P").fill(Energy, pTotal*1000);
+        }
+        
+        for(Cluster cluster : clusters){
+            double[] clusterPosition = cluster.getPosition();
+            
+            System.out.println("Cluster Position: [" + clusterPosition[0] + ", " + clusterPosition[1] + ", " + clusterPosition[2]+ "]");
+        }
+        
+        double ratio = nnegative/npositive;
+        System.out.println("Ratio of Negative to Position Tracks: " + ratio);
+    
+        double tracksRatio = ntracks/nevents;
+        double tracksTopRatio = ntracksTop/nevents;
+        double tracksBottomRatio = ntracksBottom/nevents;
+        double twoTrackRatio = nTwoTracks/nevents;
+        System.out.println("Number of tracks per event: " + tracksRatio);
+        System.out.println("Number of top tracks per event: " + tracksTopRatio);
+        System.out.println("Number of bottom tracks per event: " + tracksBottomRatio);
+        System.out.println("Number of two track events: " + twoTrackRatio);
+    }*/
+
+