Print

Print


Author: phansson
Date: Fri Oct 31 16:49:04 2014
New Revision: 1368

Log:
move here for a while

Added:
    java/trunk/users/src/main/java/org/hps/users/phansson/TrackingReconstructionPlots.java

Added: java/trunk/users/src/main/java/org/hps/users/phansson/TrackingReconstructionPlots.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/phansson/TrackingReconstructionPlots.java	(added)
+++ java/trunk/users/src/main/java/org/hps/users/phansson/TrackingReconstructionPlots.java	Fri Oct 31 16:49:04 2014
@@ -0,0 +1,1093 @@
+package org.hps.users.phansson;
+
+import hep.aida.IAnalysisFactory;
+import hep.aida.IHistogram1D;
+import hep.aida.IHistogram2D;
+import hep.aida.IPlotter;
+import hep.aida.IPlotterStyle;
+import hep.aida.IProfile;
+import hep.physics.matrix.SymmetricMatrix;
+import hep.physics.vec.Hep3Vector;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.hps.conditions.deprecated.BeamlineConstants;
+import org.hps.conditions.deprecated.HPSSVTCalibrationConstants;
+import org.hps.conditions.deprecated.HPSSVTCalibrationConstants.ChannelConstants;
+import org.hps.conditions.deprecated.SvtUtils;
+import org.hps.recon.ecal.HPSEcalCluster;
+import org.hps.recon.tracking.DumbShaperFit;
+import org.hps.recon.tracking.HelixConverter;
+import org.hps.recon.tracking.ShapeFitParameters;
+import org.hps.recon.tracking.ShaperFitAlgorithm;
+import org.hps.recon.tracking.StraightLineTrack;
+import org.hps.recon.tracking.TrackUtils;
+import org.hps.util.Resettable;
+import org.lcsim.detector.tracker.silicon.SiSensor;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.LCIOParameters.ParameterName;
+import org.lcsim.event.RawTrackerHit;
+import org.lcsim.event.Track;
+import org.lcsim.event.TrackerHit;
+import org.lcsim.fit.helicaltrack.HelicalTrackCross;
+import org.lcsim.fit.helicaltrack.HelicalTrackFit;
+import org.lcsim.fit.helicaltrack.HelicalTrackHit;
+import org.lcsim.fit.helicaltrack.HelicalTrackStrip;
+import org.lcsim.fit.helicaltrack.HelixUtils;
+import org.lcsim.geometry.Detector;
+import org.lcsim.geometry.IDDecoder;
+import org.lcsim.geometry.compact.converter.HPSTrackerBuilder;
+import org.lcsim.recon.tracking.digitization.sisim.SiTrackerHitStrip1D;
+import org.lcsim.recon.tracking.seedtracker.SeedCandidate;
+import org.lcsim.recon.tracking.seedtracker.SeedTrack;
+import org.lcsim.util.Driver;
+import org.lcsim.util.aida.AIDA;
+
+/**
+ *
+ * @author mgraham
+ */
+public class TrackingReconstructionPlots extends Driver implements Resettable {
+
+    //private AIDAFrame plotterFrame;
+    //private AIDAFrame topFrame;
+    //private AIDAFrame bottomFrame;
+    private AIDA aida = AIDA.defaultInstance();
+    private String rawTrackerHitCollectionName = "SVTRawTrackerHits";
+    private String fittedTrackerHitCollectionName = "SVTFittedRawTrackerHits";
+    private String trackerHitCollectionName = "StripClusterer_SiTrackerHitStrip1D";
+    private String helicalTrackHitCollectionName = "HelicalTrackHits";
+    private String rotatedTrackHitCollectionName = "RotatedHelicalTrackHits";
+    private String helicalTrackHitRelationsCollectionName = "HelicalTrackHitRelations";
+    private String trackCollectionName = "MatchedTracks";
+    private String trackerName = "Tracker";
+    String ecalSubdetectorName = "Ecal";
+    String ecalCollectionName = "EcalClusters";
+    private Detector detector = null;
+    IDDecoder dec;
+    private int eventCount;
+    private List<SiSensor> sensors;
+    private String outputPlots = null;
+    IPlotter plotter;
+    IPlotter plotter2;
+    IPlotter plotter22;
+    IPlotter plotter222;
+    IPlotter plotter3;
+    IPlotter plotter3_1;
+    IPlotter plotter3_2;
+    IPlotter plotter4;
+    IPlotter plotter5;
+    IPlotter plotter5_1;
+    IPlotter plotter55;
+    IPlotter plotter6;
+    IPlotter plotter7;
+    IPlotter top1;
+    IPlotter top2;
+    IPlotter top3;
+    IPlotter top4;
+    IPlotter bot1;
+    IPlotter bot2;
+    IPlotter bot3;
+    IPlotter bot4;
+    double zEcal = 1500;
+    double zAtDownStrPairSpec = 914.0; //mm
+    double zAtColl = -1500;
+    IHistogram1D trkPx;
+    IHistogram1D nTracks;
+    ShaperFitAlgorithm _shaper = new DumbShaperFit();
+
+    @Override
+    protected void detectorChanged(Detector detector) {
+        this.detector = detector;
+        aida.tree().cd("/");
+        //plotterFrame = new AIDAFrame();
+        //plotterFrame.setTitle("HPS Tracking Plots");
+
+        //topFrame = new AIDAFrame();
+        //topFrame.setTitle("Top Tracking Plots");
+        //bottomFrame = new AIDAFrame();
+        //bottomFrame.setTitle("Bottom Tracking Plots");
+        sensors = detector.getSubdetector(trackerName).getDetectorElement().findDescendants(SiSensor.class);
+
+        IAnalysisFactory fac = aida.analysisFactory();
+        plotter = fac.createPlotterFactory().create("HPS Tracking Plots");
+        plotter.setTitle("Momentum");
+        IPlotterStyle style = plotter.style();
+        style.dataStyle().fillStyle().setColor("yellow");
+        style.dataStyle().errorBarStyle().setVisible(false);
+        plotter.createRegions(2, 2);
+        //plotterFrame.addPlotter(plotter);
+
+        trkPx = aida.histogram1D("Track Momentum (Px)", 25, -0.25, 0.25);
+        IHistogram1D trkPy = aida.histogram1D("Track Momentum (Py)", 25, -0.5, 0.5);
+        IHistogram1D trkPz = aida.histogram1D("Track Momentum (Pz)", 25, 0, 3.5);
+        IHistogram1D trkChi2 = aida.histogram1D("Track Chi2", 25, 0, 25.0);
+
+        plotter.region(0).plot(trkPx);
+        plotter.region(1).plot(trkPy);
+        plotter.region(2).plot(trkPz);
+        plotter.region(3).plot(trkChi2);
+
+        plotter.show();
+
+//   ******************************************************************
+        top1 = fac.createPlotterFactory().create("Top Tracking Plots");
+        top1.setTitle("Top Momentum");
+        IPlotterStyle stop1 = top1.style();
+        stop1.dataStyle().fillStyle().setColor("green");
+        stop1.dataStyle().errorBarStyle().setVisible(false);
+        top1.createRegions(2, 2);
+        //topFrame.addPlotter(top1);
+
+        IHistogram1D toptrkPx = aida.histogram1D("Top Track Momentum (Px)", 25, -0.25, 0.25);
+        IHistogram1D toptrkPy = aida.histogram1D("Top Track Momentum (Py)", 25, -0.5, 0.5);
+        IHistogram1D toptrkPz = aida.histogram1D("Top Track Momentum (Pz)", 25, 0, 3.5);
+        IHistogram1D toptrkChi2 = aida.histogram1D("Top Track Chi2", 25, 0, 25.0);
+
+        top1.region(0).plot(toptrkPx);
+        top1.region(1).plot(toptrkPy);
+        top1.region(2).plot(toptrkPz);
+        top1.region(3).plot(toptrkChi2);
+
+        top1.show();
+
+        bot1 = fac.createPlotterFactory().create("Bottom Tracking Plots");
+        bot1.setTitle("Bottom Momentum");
+        IPlotterStyle sbot1 = bot1.style();
+        sbot1.dataStyle().fillStyle().setColor("blue");
+        sbot1.dataStyle().errorBarStyle().setVisible(false);
+        bot1.createRegions(2, 2);
+        //bottomFrame.addPlotter(bot1);
+
+        IHistogram1D bottrkPx = aida.histogram1D("Bottom Track Momentum (Px)", 25, -0.25, 0.25);
+        IHistogram1D bottrkPy = aida.histogram1D("Bottom Track Momentum (Py)", 25, -0.5, 0.5);
+        IHistogram1D bottrkPz = aida.histogram1D("Bottom Track Momentum (Pz)", 25, 0, 3.5);
+        IHistogram1D bottrkChi2 = aida.histogram1D("Bottom Track Chi2", 25, 0, 25.0);
+
+        bot1.region(0).plot(bottrkPx);
+        bot1.region(1).plot(bottrkPy);
+        bot1.region(2).plot(bottrkPz);
+        bot1.region(3).plot(bottrkChi2);
+
+        bot1.show();
+
+//   ******************************************************************
+        IHistogram1D trkd0 = aida.histogram1D("d0 ", 25, -100.0, 100.0);
+        IHistogram1D trkphi = aida.histogram1D("sinphi ", 25, -0.2, 0.2);
+        IHistogram1D trkomega = aida.histogram1D("omega ", 25, -0.0025, 0.0025);
+        IHistogram1D trklam = aida.histogram1D("tan(lambda) ", 25, -0.1, 0.1);
+        IHistogram1D trkz0 = aida.histogram1D("z0 ", 25, -100.0, 100.0);
+
+        plotter22 = fac.createPlotterFactory().create("HPS Track Params");
+        plotter22.setTitle("Track parameters");
+        //plotterFrame.addPlotter(plotter22);
+        IPlotterStyle style22 = plotter22.style();
+        style22.dataStyle().fillStyle().setColor("yellow");
+        style22.dataStyle().errorBarStyle().setVisible(false);
+        plotter22.createRegions(2, 3);
+        plotter22.region(0).plot(trkd0);
+        plotter22.region(1).plot(trkphi);
+        plotter22.region(2).plot(trkomega);
+        plotter22.region(3).plot(trklam);
+        plotter22.region(4).plot(trkz0);
+
+        plotter2 = fac.createPlotterFactory().create("HPS Tracking Plots");
+        plotter2.setTitle("Track extrapolation");
+        //plotterFrame.addPlotter(plotter2);
+        IPlotterStyle style2 = plotter2.style();
+        style2.dataStyle().fillStyle().setColor("yellow");
+        style2.dataStyle().errorBarStyle().setVisible(false);
+        plotter2.createRegions(2, 4);
+        IHistogram1D xAtConverter = aida.histogram1D("X (mm) @ Z=-60cm", 50, -50, 50);
+        IHistogram1D yAtConverter = aida.histogram1D("Y (mm) @ Z=-60cm", 50, -20, 20);
+        IHistogram1D xAtColl = aida.histogram1D("X (mm) @ Z=-150cm", 50, -200, 200);
+        IHistogram1D yAtColl = aida.histogram1D("Y (mm) @ Z=-150cm", 50, -200, 200);
+        IHistogram1D xAtEcal = aida.histogram1D("X (mm) @ ECAL", 50, -500, 500);
+        IHistogram1D yAtEcal = aida.histogram1D("Y (mm) @ ECAL", 50, -100, 100);
+        IHistogram1D xAtEcal2 = aida.histogram1D("X (mm) @ ECAL (Pz>1)", 50, -500, 500);
+        IHistogram1D yAtEcal2 = aida.histogram1D("Y (mm) @ ECAL (Pz>1)", 50, -100, 100);
+
+        plotter2.region(0).plot(xAtConverter);
+        plotter2.region(4).plot(yAtConverter);
+        plotter2.region(1).plot(xAtColl);
+        plotter2.region(5).plot(yAtColl);
+        plotter2.region(2).plot(xAtEcal);
+        plotter2.region(6).plot(yAtEcal);
+        plotter2.region(3).plot(xAtEcal2);
+        plotter2.region(7).plot(yAtEcal2);
+
+        plotter222 = fac.createPlotterFactory().create("HPS Tracking Plots");
+        plotter222.setTitle("Other");
+        //plotterFrame.addPlotter(plotter222);
+        IPlotterStyle style222 = plotter222.style();
+        style222.dataStyle().fillStyle().setColor("yellow");
+        style222.dataStyle().errorBarStyle().setVisible(false);
+        plotter222.createRegions(2, 3);
+
+        IHistogram1D nHits = aida.histogram1D("Hits per Track", 2, 4, 6);
+        IHistogram1D amp = aida.histogram1D("Amp (HitOnTrack)", 50, 0, 5000);
+        IHistogram1D ampcl = aida.histogram1D("Amp (CluOnTrack)", 50, 0, 5000);
+        IHistogram1D amp2 = aida.histogram1D("Amp Pz>1000 (HitOnTrack)", 50, 0, 5000);
+        IHistogram1D ampcl2 = aida.histogram1D("Amp Pz>1000 (CluOnTrack)", 50, 0, 5000);
+        nTracks = aida.histogram1D("Tracks per Event", 3, 0, 3);
+
+        plotter222.region(0).plot(nHits);
+        plotter222.region(3).plot(nTracks);
+        plotter222.region(1).plot(amp);
+        plotter222.region(4).plot(amp2);
+        plotter222.region(2).plot(ampcl);
+        plotter222.region(5).plot(ampcl2);
+
+        plotter3 = fac.createPlotterFactory().create("HPS Residual Plots");
+        plotter3.setTitle("Residuals");
+        //plotterFrame.addPlotter(plotter3);
+        IPlotterStyle style3 = plotter3.style();
+        style3.dataStyle().fillStyle().setColor("yellow");
+        style3.dataStyle().errorBarStyle().setVisible(false);
+        plotter3.createRegions(5, 2);
+
+        double minResidY = -1.5;
+        double maxResidY = 1.5;
+
+        double minResidX = -5;
+        double maxResidX = 5;
+
+        IHistogram1D mod1ResX = aida.histogram1D("Module 1 Residual X(mm)", 25, minResidX, maxResidX);
+        IHistogram1D mod1ResY = aida.histogram1D("Module 1 Residual Y(mm)", 25, minResidY, maxResidY);
+
+        IHistogram1D mod2ResX = aida.histogram1D("Module 2 Residual X(mm)", 25, minResidX, maxResidX);
+        IHistogram1D mod2ResY = aida.histogram1D("Module 2 Residual Y(mm)", 25, minResidY, maxResidY);
+
+        IHistogram1D mod3ResX = aida.histogram1D("Module 3 Residual X(mm)", 25, minResidX, maxResidX);
+        IHistogram1D mod3ResY = aida.histogram1D("Module 3 Residual Y(mm)", 25, minResidY, maxResidY);
+
+        IHistogram1D mod4ResX = aida.histogram1D("Module 4 Residual X(mm)", 25, minResidX, maxResidX);
+        IHistogram1D mod4ResY = aida.histogram1D("Module 4 Residual Y(mm)", 25, minResidY, maxResidY);
+
+        IHistogram1D mod5ResX = aida.histogram1D("Module 5 Residual X(mm)", 25, minResidX, maxResidX);
+        IHistogram1D mod5ResY = aida.histogram1D("Module 5 Residual Y(mm)", 25, minResidY, maxResidY);
+
+        plotter3.region(0).plot(mod1ResX);
+        plotter3.region(2).plot(mod2ResX);
+        plotter3.region(4).plot(mod3ResX);
+        plotter3.region(6).plot(mod4ResX);
+        plotter3.region(8).plot(mod5ResX);
+
+        plotter3.region(1).plot(mod1ResY);
+        plotter3.region(3).plot(mod2ResY);
+        plotter3.region(5).plot(mod3ResY);
+        plotter3.region(7).plot(mod4ResY);
+        plotter3.region(9).plot(mod5ResY);
+
+        plotter3_1 = fac.createPlotterFactory().create("HPS Residual Plots (Single hit per layer)");
+        plotter3_1.setTitle("Residuals (Top)");
+        //plotterFrame.addPlotter(plotter3_1);
+        IPlotterStyle style3_1 = plotter3_1.style();
+        style3_1.dataStyle().fillStyle().setColor("yellow");
+        style3_1.dataStyle().errorBarStyle().setVisible(false);
+        plotter3_1.createRegions(5, 2);
+
+        IHistogram1D mod1ResX_Top = aida.histogram1D("Module 1 Residual X(mm) Top", 25, minResidX, maxResidX);
+        IHistogram1D mod1ResY_Top = aida.histogram1D("Module 1 Residual Y(mm) Top", 25, minResidY, maxResidY);
+
+        IHistogram1D mod2ResX_Top = aida.histogram1D("Module 2 Residual X(mm) Top", 25, minResidX, maxResidX);
+        IHistogram1D mod2ResY_Top = aida.histogram1D("Module 2 Residual Y(mm) Top", 25, minResidY, maxResidY);
+
+        IHistogram1D mod3ResX_Top = aida.histogram1D("Module 3 Residual X(mm) Top", 25, minResidX, maxResidX);
+        IHistogram1D mod3ResY_Top = aida.histogram1D("Module 3 Residual Y(mm) Top", 25, minResidY, maxResidY);
+
+        IHistogram1D mod4ResX_Top = aida.histogram1D("Module 4 Residual X(mm) Top", 25, minResidX, maxResidX);
+        IHistogram1D mod4ResY_Top = aida.histogram1D("Module 4 Residual Y(mm) Top", 25, minResidY, maxResidY);
+
+        IHistogram1D mod5ResX_Top = aida.histogram1D("Module 5 Residual X(mm) Top", 25, minResidX, maxResidX);
+        IHistogram1D mod5ResY_Top = aida.histogram1D("Module 5 Residual Y(mm) Top", 25, minResidY, maxResidY);
+
+        plotter3_1.region(0).plot(mod1ResX_Top);
+        plotter3_1.region(2).plot(mod2ResX_Top);
+        plotter3_1.region(4).plot(mod3ResX_Top);
+        plotter3_1.region(6).plot(mod4ResX_Top);
+        plotter3_1.region(8).plot(mod5ResX_Top);
+
+        plotter3_1.region(1).plot(mod1ResY_Top);
+        plotter3_1.region(3).plot(mod2ResY_Top);
+        plotter3_1.region(5).plot(mod3ResY_Top);
+        plotter3_1.region(7).plot(mod4ResY_Top);
+        plotter3_1.region(9).plot(mod5ResY_Top);
+
+        plotter3_2 = fac.createPlotterFactory().create("HPS Residual Plots (Single strip cluster per layer)");
+        plotter3_2.setTitle("Residuals (Bottom)");
+        //plotterFrame.addPlotter(plotter3_2);
+        IPlotterStyle style3_2 = plotter3_2.style();
+        style3_2.dataStyle().fillStyle().setColor("yellow");
+        style3_2.dataStyle().errorBarStyle().setVisible(false);
+        plotter3_2.createRegions(5, 2);
+
+        IHistogram1D mod1ResX_Bottom = aida.histogram1D("Module 1 Residual X(mm) Bottom", 25, minResidX, maxResidX);
+        IHistogram1D mod1ResY_Bottom = aida.histogram1D("Module 1 Residual Y(mm) Bottom", 25, minResidY, maxResidY);
+
+        IHistogram1D mod2ResX_Bottom = aida.histogram1D("Module 2 Residual X(mm) Bottom", 25, minResidX, maxResidX);
+        IHistogram1D mod2ResY_Bottom = aida.histogram1D("Module 2 Residual Y(mm) Bottom", 25, minResidY, maxResidY);
+
+        IHistogram1D mod3ResX_Bottom = aida.histogram1D("Module 3 Residual X(mm) Bottom", 25, minResidX, maxResidX);
+        IHistogram1D mod3ResY_Bottom = aida.histogram1D("Module 3 Residual Y(mm) Bottom", 25, minResidY, maxResidY);
+
+        IHistogram1D mod4ResX_Bottom = aida.histogram1D("Module 4 Residual X(mm) Bottom", 25, minResidX, maxResidX);
+        IHistogram1D mod4ResY_Bottom = aida.histogram1D("Module 4 Residual Y(mm) Bottom", 25, minResidY, maxResidY);
+
+        IHistogram1D mod5ResX_Bottom = aida.histogram1D("Module 5 Residual X(mm) Bottom", 25, minResidX, maxResidX);
+        IHistogram1D mod5ResY_Bottom = aida.histogram1D("Module 5 Residual Y(mm) Bottom", 25, minResidY, maxResidY);
+
+        plotter3_2.region(0).plot(mod1ResX_Bottom);
+        plotter3_2.region(2).plot(mod2ResX_Bottom);
+        plotter3_2.region(4).plot(mod3ResX_Bottom);
+        plotter3_2.region(6).plot(mod4ResX_Bottom);
+        plotter3_2.region(8).plot(mod5ResX_Bottom);
+
+        plotter3_2.region(1).plot(mod1ResY_Bottom);
+        plotter3_2.region(3).plot(mod2ResY_Bottom);
+        plotter3_2.region(5).plot(mod3ResY_Bottom);
+        plotter3_2.region(7).plot(mod4ResY_Bottom);
+        plotter3_2.region(9).plot(mod5ResY_Bottom);
+
+        plotter4 = fac.createPlotterFactory().create("HPS Track and ECal Plots");
+        plotter4.setTitle("Track and ECal Correlations");
+        //plotterFrame.addPlotter(plotter4);
+        IPlotterStyle style4 = plotter4.style();
+        style4.setParameter("hist2DStyle", "colorMap");
+        style4.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+        style4.dataStyle().fillStyle().setColor("yellow");
+        style4.dataStyle().errorBarStyle().setVisible(false);
+        plotter4.createRegions(2, 3);
+
+        IHistogram2D eVsP = aida.histogram2D("Energy Vs Momentum", 50, 0, 500, 50, 0, 3000);
+        IHistogram1D eOverP = aida.histogram1D("Energy Over Momentum", 50, 0, 2);
+
+        IHistogram1D distX = aida.histogram1D("deltaX", 50, -400, 400);
+        IHistogram1D distY = aida.histogram1D("deltaY", 50, -40, 40);
+
+//        IHistogram1D distX2 = aida.histogram1D("deltaX (Pz>1)", 50, -400, 400);
+//        IHistogram1D distY2 = aida.histogram1D("deltaY (Pz>1)", 50, -40, 40);
+        IHistogram2D xEcalVsTrk = aida.histogram2D("X ECal Vs Track", 100, -400, 400, 100, -400, 400);
+        IHistogram2D yEcalVsTrk = aida.histogram2D("Y ECal Vs Track", 100, -100, 100, 100, -100, 100);
+
+        plotter4.region(0).plot(eVsP);
+        plotter4.region(3).plot(eOverP);
+        plotter4.region(1).plot(distX);
+        plotter4.region(4).plot(distY);
+        plotter4.region(2).plot(xEcalVsTrk);
+        plotter4.region(5).plot(yEcalVsTrk);
+
+        //   ******************************************************************
+        top2 = fac.createPlotterFactory().create("Top ECal Plots");
+        top2.setTitle("Top ECal Correlations");
+        IPlotterStyle stop2 = top2.style();
+        stop2.dataStyle().fillStyle().setColor("green");
+        stop2.dataStyle().errorBarStyle().setVisible(false);
+        stop2.setParameter("hist2DStyle", "colorMap");
+        stop2.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+        top2.createRegions(2, 3);
+        //topFrame.addPlotter(top2);
+
+        IHistogram2D topeVsP = aida.histogram2D("Top Energy Vs Momentum", 50, 0, 500, 50, 0, 3000);
+        IHistogram1D topeOverP = aida.histogram1D("Top Energy Over Momentum", 50, 0, 2);
+
+        IHistogram1D topdistX = aida.histogram1D("Top deltaX", 50, -400, 400);
+        IHistogram1D topdistY = aida.histogram1D("Top deltaY", 50, -40, 40);
+
+        IHistogram2D topxEcalVsTrk = aida.histogram2D("Top X ECal Vs Track", 100, -400, 400, 100, -400, 400);
+        IHistogram2D topyEcalVsTrk = aida.histogram2D("Top Y ECal Vs Track", 100, 0, 100, 100, 0, 100);
+
+        top2.region(0).plot(topeVsP);
+        top2.region(3).plot(topeOverP);
+        top2.region(1).plot(topdistX);
+        top2.region(4).plot(topdistY);
+        top2.region(2).plot(topxEcalVsTrk);
+        top2.region(5).plot(topyEcalVsTrk);
+
+        bot2 = fac.createPlotterFactory().create("Bottom ECal Plots");
+        bot2.setTitle("Bottom ECal Correlations");
+        IPlotterStyle sbot2 = bot2.style();
+        sbot2.dataStyle().fillStyle().setColor("green");
+        sbot2.dataStyle().errorBarStyle().setVisible(false);
+        sbot2.setParameter("hist2DStyle", "colorMap");
+        sbot2.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+        bot2.createRegions(2, 3);
+        //bottomFrame.addPlotter(bot2);
+
+        IHistogram2D BottomeVsP = aida.histogram2D("Bottom Energy Vs Momentum", 50, 0, 500, 50, 0, 3000);
+        IHistogram1D BottomeOverP = aida.histogram1D("Bottom Energy Over Momentum", 50, 0, 2);
+
+        IHistogram1D BottomdistX = aida.histogram1D("Bottom deltaX", 50, -400, 400);
+        IHistogram1D BottomdistY = aida.histogram1D("Bottom deltaY", 50, -40, 40);
+
+        IHistogram2D BottomxEcalVsTrk = aida.histogram2D("Bottom X ECal Vs Track", 100, -400, 400, 100, -400, 400);
+        IHistogram2D BottomyEcalVsTrk = aida.histogram2D("Bottom Y ECal Vs Track", 100, -100, 0, 100, -100, 0);
+
+        bot2.region(0).plot(BottomeVsP);
+        bot2.region(3).plot(BottomeOverP);
+        bot2.region(1).plot(BottomdistX);
+        bot2.region(4).plot(BottomdistY);
+        bot2.region(2).plot(BottomxEcalVsTrk);
+        bot2.region(5).plot(BottomyEcalVsTrk);
+
+//   ******************************************************************
+        top3 = fac.createPlotterFactory().create("Top ECal Plots");
+        top3.setTitle("Top ECal More Correlations");
+        IPlotterStyle stop3 = top3.style();
+        stop3.dataStyle().fillStyle().setColor("green");
+        stop3.dataStyle().errorBarStyle().setVisible(false);
+        stop3.setParameter("hist2DStyle", "colorMap");
+        stop3.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+        top3.createRegions(1, 2);
+        //topFrame.addPlotter(top3);
+
+        IHistogram2D topdistXvsX = aida.histogram2D("Top deltaX vs X", 51, -400, 400, 25, -400, 400);
+        IHistogram2D topdistYvsY = aida.histogram2D("Top deltaY vs Y", 51, 0, 100, 25, -40, 40);
+
+        top3.region(0).plot(topdistXvsX);
+        top3.region(1).plot(topdistYvsY);
+
+        bot3 = fac.createPlotterFactory().create("Bottom ECal Plots");
+        bot3.setTitle("Bottom ECal More Correlations");
+        IPlotterStyle sbot3 = bot3.style();
+        sbot3.dataStyle().fillStyle().setColor("green");
+        sbot3.dataStyle().errorBarStyle().setVisible(false);
+        sbot3.setParameter("hist2DStyle", "colorMap");
+        sbot3.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+        bot3.createRegions(1, 2);
+        //bottomFrame.addPlotter(bot3);
+
+        IHistogram2D botdistXvsX = aida.histogram2D("Bottom deltaX vs X", 51, -400, 400, 25, -400, 400);
+        IHistogram2D botdistYvsY = aida.histogram2D("Bottom deltaY vs Y", 51, -100, 0, 25, -40, 40);
+
+        bot3.region(0).plot(botdistXvsX);
+        bot3.region(1).plot(botdistYvsY);
+
+//   ******************************************************************
+        plotter5 = fac.createPlotterFactory().create("HPS Hit Positions");
+        plotter5.setTitle("Hit Positions:  Top");
+        //plotterFrame.addPlotter(plotter5);
+        IPlotterStyle style5 = plotter5.style();
+        style5.setParameter("hist2DStyle", "colorMap");
+        style5.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+        style5.dataStyle().fillStyle().setColor("yellow");
+        style5.dataStyle().errorBarStyle().setVisible(false);
+        plotter5.createRegions(1, 2);
+
+        IHistogram1D charge = aida.histogram1D("Charge", 3, -1, 1);
+
+        IHistogram2D l1Pos = aida.histogram2D("Layer 1 HTH Position:  Top", 50, -55, 55, 55, -25, 25);
+        IHistogram2D l7Pos = aida.histogram2D("Layer 7 HTH Position:  Top", 50, -55, 55, 55, -25, 25);
+
+        plotter5.region(0).plot(l1Pos);
+        plotter5.region(1).plot(l7Pos);
+
+        plotter5_1 = fac.createPlotterFactory().create("HPS Hit Positions");
+        plotter5_1.setTitle("Hit Positions:  Bottom");
+        //plotterFrame.addPlotter(plotter5_1);
+        IPlotterStyle style5_1 = plotter5_1.style();
+        style5_1.setParameter("hist2DStyle", "colorMap");
+        style5_1.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+        style5_1.dataStyle().fillStyle().setColor("yellow");
+        style5_1.dataStyle().errorBarStyle().setVisible(false);
+        plotter5_1.createRegions(1, 2);
+
+        IHistogram2D l1PosBot = aida.histogram2D("Layer 1 HTH Position:  Bottom", 50, -55, 55, 55, -25, 25);
+        IHistogram2D l7PosBot = aida.histogram2D("Layer 7 HTH Position:  Bottom", 50, -55, 55, 55, -25, 25);
+        plotter5_1.region(0).plot(l1PosBot);
+        plotter5_1.region(1).plot(l7PosBot);
+
+        plotter55 = fac.createPlotterFactory().create("HPS Hit Positions");
+        plotter55.setTitle("Helical Track Hits");
+        //plotterFrame.addPlotter(plotter55);
+        IPlotterStyle style55 = plotter55.style();
+        style55.dataStyle().fillStyle().setColor("Green");
+        style55.dataStyle().errorBarStyle().setVisible(false);
+        style55.dataStyle().markerStyle().setSize(20);
+        plotter55.createRegions(1, 2);
+
+        IProfile avgLayersTopPlot = aida.profile1D("Number of Stereo Hits per layer in Top Half", 5, 1, 11);
+        IProfile avgLayersBottomPlot = aida.profile1D("Number of Stereo Hits per layer in Bottom Half", 5, 1, 11);
+
+        plotter55.region(0).plot(avgLayersTopPlot);
+        plotter55.region(1).plot(avgLayersBottomPlot);
+
+        plotter6 = fac.createPlotterFactory().create("HPS ECAL Hit Positions");
+        plotter6.setTitle("ECAL Positions");
+        //plotterFrame.addPlotter(plotter6);
+        IPlotterStyle style6 = plotter6.style();
+        style6.setParameter("hist2DStyle", "colorMap");
+        style6.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+        style6.dataStyle().fillStyle().setColor("yellow");
+        style6.dataStyle().errorBarStyle().setVisible(false);
+        plotter6.createRegions(4, 2);
+
+        IHistogram2D topECal = aida.histogram2D("Top ECal Cluster Position", 50, -400, 400, 10, 0, 100);
+        IHistogram2D botECal = aida.histogram2D("Bottom ECal Cluster Position", 50, -400, 400, 10, -100, 0);
+        IHistogram2D topECal1 = aida.histogram2D("Top ECal Cluster Position (>0 tracks)", 50, -400, 400, 10, 0, 100);
+        IHistogram2D botECal1 = aida.histogram2D("Bottom ECal Cluster Position (>0 tracks)", 50, -400, 400, 10, -100, 0);
+        IHistogram2D topECal2 = aida.histogram2D("Top ECal Cluster Position (E>100,>0 tracks)", 50, -400, 400, 10, 0, 100);
+        IHistogram2D botECal2 = aida.histogram2D("Bottom ECal Cluster Position (E>100,>0 tracks)", 50, -400, 400, 10, -100, 0);
+        IHistogram2D topECal3 = aida.histogram2D("Top ECal Cluster Position w_E (E>100,>0 tracks)", 50, -400, 400, 10, 0, 100);
+        IHistogram2D botECal3 = aida.histogram2D("Bottom ECal Cluster Position w_E (E>100,>0 tracks)", 50, -400, 400, 10, -100, 0);
+
+        plotter6.region(0).plot(topECal);
+        plotter6.region(1).plot(botECal);
+        plotter6.region(2).plot(topECal1);
+        plotter6.region(3).plot(botECal1);
+        plotter6.region(4).plot(topECal2);
+        plotter6.region(5).plot(botECal2);
+        plotter6.region(6).plot(topECal3);
+        plotter6.region(7).plot(botECal3);
+
+        //plotterFrame.pack();
+        //plotterFrame.setVisible(true);
+        //topFrame.pack();
+        //topFrame.setVisible(true);
+        //bottomFrame.pack();
+        //bottomFrame.setVisible(true);
+        plotter7 = fac.createPlotterFactory().create("HPS ECAL Hit Positions");
+        plotter7.setTitle("Basic Misc Stuff");
+        //plotterFrame.addPlotter(plotter7);
+        IPlotterStyle style7 = plotter7.style();
+        style7.setParameter("hist2DStyle", "colorMap");
+        style7.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+        style7.dataStyle().fillStyle().setColor("yellow");
+        style7.dataStyle().errorBarStyle().setVisible(false);
+        plotter7.createRegions(2, 2);
+
+        IHistogram2D quadrants = aida.histogram2D("Charge vs Slope", 2, -1, 1, 2, -1, 1);
+        plotter7.region(0).plot(quadrants);
+
+    }
+
+    public TrackingReconstructionPlots() {
+    }
+
+    public void setOutputPlots(String output) {
+        this.outputPlots = output;
+    }
+
+    public void setRawTrackerHitCollectionName(String rawTrackerHitCollectionName) {
+        this.rawTrackerHitCollectionName = rawTrackerHitCollectionName;
+    }
+
+    public void setFittedTrackerHitCollectionName(String fittedTrackerHitCollectionName) {
+        this.fittedTrackerHitCollectionName = fittedTrackerHitCollectionName;
+    }
+
+    public void setTrackerHitCollectionName(String trackerHitCollectionName) {
+        this.trackerHitCollectionName = trackerHitCollectionName;
+    }
+
+    public void setHelicalTrackHitCollectionName(String helicalTrackHitCollectionName) {
+        this.helicalTrackHitCollectionName = helicalTrackHitCollectionName;
+    }
+
+    public void setTrackCollectionName(String trackCollectionName) {
+        this.trackCollectionName = trackCollectionName;
+    }
+
+    @Override
+    public void process(EventHeader event) {
+        aida.tree().cd("/");
+        if (!event.hasCollection(HelicalTrackHit.class, helicalTrackHitCollectionName)) {
+//            System.out.println(helicalTrackHitCollectionName + " does not exist; skipping event");
+            return;
+        }
+
+        List<HelicalTrackHit> rotList = event.get(HelicalTrackHit.class, rotatedTrackHitCollectionName);
+        for (HelicalTrackHit hth : rotList) {
+            HelicalTrackCross htc = (HelicalTrackCross) hth;
+//            System.out.println("TrackingReconstructionPlots::original helical track position = "+hth.getPosition()[0]+","+hth.getPosition()[1]+","+hth.getPosition()[2]);
+//            System.out.println("TrackingReconstructionPlots::corrected helical track position = "+htc.getCorrectedPosition().toString());
+        }
+        List<HelicalTrackHit> hthList = event.get(HelicalTrackHit.class, helicalTrackHitCollectionName);
+        int[] layersTop = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+        int[] layersBot = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+        for (HelicalTrackHit hth : hthList) {
+            HelicalTrackCross htc = (HelicalTrackCross) hth;
+//            System.out.println("TrackingReconstructionPlots::original helical track position = "+hth.getPosition()[0]+","+hth.getPosition()[1]+","+hth.getPosition()[2]);
+//            System.out.println("TrackingReconstructionPlots::corrected helical track position = "+htc.getCorrectedPosition().toString());
+            //These Helical Track Hits are in the JLAB frame
+//            htc.resetTrackDirection();
+            double x = htc.getPosition()[0];
+            double y = htc.getPosition()[1];
+            SiSensor sensor = ((SiSensor) ((RawTrackerHit) htc.getRawHits().get(0)).getDetectorElement());
+            if (SvtUtils.getInstance().isTopLayer(sensor)) {
+                layersTop[htc.Layer() - 1]++;
+                Hep3Vector sensorPos = ((SiSensor) ((RawTrackerHit) htc.getRawHits().get(0)).getDetectorElement()).getGeometry().getPosition();
+                if (htc.Layer() == 1) {
+//                    System.out.println(sensorPos.toString());
+//                    System.out.println("Hit X = " + x + "; Hit Y = " + y);
+//                    aida.histogram2D("Layer 1 HTH Position:  Top").fill(x - sensorPos.x(), y - sensorPos.y());
+                }
+//                if (htc.Layer() == 7)
+//                    aida.histogram2D("Layer 7 HTH Position:  Top").fill(x - sensorPos.x(), y - sensorPos.y());
+            } else {
+                layersBot[htc.Layer() - 1]++;
+                Hep3Vector sensorPos = ((SiSensor) ((RawTrackerHit) htc.getRawHits().get(0)).getDetectorElement()).getGeometry().getPosition();
+                if (htc.Layer() == 1) {
+//                    System.out.println(sensorPos.toString());
+//                    System.out.println("Hit X = " + x + "; Hit Y = " + y);
+//                    aida.histogram2D("Layer 1 HTH Position:  Bottom").fill(x - sensorPos.x(), y - sensorPos.y());
+                }
+//                if (htc.Layer() == 7)
+//                    aida.histogram2D("Layer 7 HTH Position:  Bottom").fill(x - sensorPos.x(), y - sensorPos.y());
+            }
+        }
+        for (int i = 0; i < 10; i++) {
+            aida.profile1D("Number of Stereo Hits per layer in Top Half").fill(i + 1, layersTop[i]);
+            aida.profile1D("Number of Stereo Hits per layer in Bottom Half").fill(i + 1, layersBot[i]);
+        }
+        if (!event.hasCollection(Track.class, trackCollectionName)) {
+//            System.out.println(trackCollectionName + " does not exist; skipping event");
+            aida.histogram1D("Number Tracks/Event").fill(0);
+            return;
+        }
+
+        List<Track> tracks = event.get(Track.class, trackCollectionName);
+        nTracks.fill(tracks.size());
+        if (event.hasCollection(HPSEcalCluster.class, ecalCollectionName)) {
+            List<HPSEcalCluster> clusters = event.get(HPSEcalCluster.class, ecalCollectionName);
+            for (HPSEcalCluster cluster : clusters) {
+                //System.out.println("cluser position = ("+cluster.getPosition()[0]+","+cluster.getPosition()[1]+") with energy = "+cluster.getEnergy());
+                if (cluster.getPosition()[1] > 0) {
+                    aida.histogram2D("Top ECal Cluster Position").fill(cluster.getPosition()[0], cluster.getPosition()[1]);
+                }
+                if (cluster.getPosition()[1] < 0) {
+                    aida.histogram2D("Bottom ECal Cluster Position").fill(cluster.getPosition()[0], cluster.getPosition()[1]);
+                }
+
+                if (tracks.size() > 0) {
+                    if (cluster.getPosition()[1] > 0) {
+                        aida.histogram2D("Top ECal Cluster Position (>0 tracks)").fill(cluster.getPosition()[0], cluster.getPosition()[1]);
+                    }
+                    if (cluster.getPosition()[1] < 0) {
+                        aida.histogram2D("Bottom ECal Cluster Position (>0 tracks)").fill(cluster.getPosition()[0], cluster.getPosition()[1]);
+                    }
+
+                    if (cluster.getEnergy() > 100) {
+                        if (cluster.getPosition()[1] > 0) {
+                            aida.histogram2D("Top ECal Cluster Position (E>100,>0 tracks)").fill(cluster.getPosition()[0], cluster.getPosition()[1]);
+                            aida.histogram2D("Top ECal Cluster Position w_E (E>100,>0 tracks)").fill(cluster.getPosition()[0], cluster.getPosition()[1], cluster.getEnergy());
+                        }
+                        if (cluster.getPosition()[1] < 0) {
+                            aida.histogram2D("Bottom ECal Cluster Position (E>100,>0 tracks)").fill(cluster.getPosition()[0], cluster.getPosition()[1]);
+                            aida.histogram2D("Bottom ECal Cluster Position w_E (E>100,>0 tracks)").fill(cluster.getPosition()[0], cluster.getPosition()[1], cluster.getEnergy());
+                        }
+                    }
+                }
+
+            }
+        }
+
+        List<SiTrackerHitStrip1D> stripHits = event.get(SiTrackerHitStrip1D.class, "StripClusterer_SiTrackerHitStrip1D");
+        int stripClustersPerLayerTop[] = getStripClustersPerLayer(stripHits, "up");
+        //int stripClustersPerLayerBottom[] = getStripClustersPerLayer(stripHits,"down");
+
+        boolean hasSingleStripClusterPerLayer = singleStripClusterPerLayer(stripClustersPerLayerTop);
+
+        for (Track trk : tracks) {
+
+            boolean isSingleHitPerLayerTrack = singleTrackHitPerLayer(trk);
+
+            aida.histogram1D("Track Momentum (Px)").fill(trk.getPY());
+            aida.histogram1D("Track Momentum (Py)").fill(trk.getPZ());
+            aida.histogram1D("Track Momentum (Pz)").fill(trk.getPX());
+            aida.histogram1D("Track Chi2").fill(trk.getChi2());
+
+            aida.histogram1D("Hits per Track").fill(trk.getTrackerHits().size());
+            SeedTrack stEle = (SeedTrack) trk;
+            SeedCandidate seedEle = stEle.getSeedCandidate();
+            HelicalTrackFit ht = seedEle.getHelix();
+            HelixConverter converter = new HelixConverter(0);
+            StraightLineTrack slt = converter.Convert(ht);
+
+            Hep3Vector posAtEcal = TrackUtils.getTrackPositionAtEcal(trk);
+
+            aida.histogram1D("X (mm) @ Z=-60cm").fill(slt.getYZAtX(BeamlineConstants.HARP_POSITION_TESTRUN)[0]);  //this is y in the tracker frame
+            aida.histogram1D("Y (mm) @ Z=-60cm").fill(slt.getYZAtX(BeamlineConstants.HARP_POSITION_TESTRUN)[1]);  //this is z in the tracker frame
+            //double sECAL = HelixUtils.PathToXPlane(ht, zEcal, 3000, 1).get(0);
+            aida.histogram1D("X (mm) @ Z=-150cm").fill(slt.getYZAtX(zAtColl)[0]);
+            aida.histogram1D("Y (mm) @ Z=-150cm").fill(slt.getYZAtX(zAtColl)[1]);
+
+            //Straight line after field-region???
+            //HelixConverter converterEcal = new HelixConverter(zAtDownStrPairSpec);
+            //StraightLineTrack sltEcal = converterEcal.Convert(ht);
+//            double sECAL = HelixUtils.PathToXPlane(ht, zEcal, 3000, 1).get(0);
+//            Hep3Vector posonhelix = HelixUtils.PointOnHelix(ht, sECAL);//position in tracker coordinates!
+            aida.histogram1D("X (mm) @ ECAL").fill(posAtEcal.x());
+            aida.histogram1D("Y (mm) @ ECAL").fill(posAtEcal.y());
+            if (trk.getPX() > 1.0) {
+                aida.histogram1D("X (mm) @ ECAL (Pz>1)").fill(posAtEcal.x());
+                aida.histogram1D("Y (mm) @ ECAL (Pz>1)").fill(posAtEcal.y());
+            }
+            aida.histogram1D("d0 ").fill(trk.getTrackParameter(ParameterName.d0.ordinal()));
+            aida.histogram1D("sinphi ").fill(Math.sin(trk.getTrackParameter(ParameterName.phi0.ordinal())));
+            aida.histogram1D("omega ").fill(trk.getTrackParameter(ParameterName.omega.ordinal()));
+            aida.histogram1D("tan(lambda) ").fill(trk.getTrackParameter(ParameterName.tanLambda.ordinal()));
+            aida.histogram1D("z0 ").fill(trk.getTrackParameter(ParameterName.z0.ordinal()));
+
+            int isTop = -1;
+            if (trk.getTrackerHits().get(0).getPosition()[2] > 0) {
+                isTop = 0;//make plot look pretty
+            }
+            int charge = trk.getCharge();
+            if (charge > 0) {
+                charge = 0;//make plot look pretty
+            }//            System.out.println("Charge = " + charge + "; isTop = " + isTop);
+            aida.histogram2D("Charge vs Slope").fill(charge, isTop);
+            if (isTop == 0) {
+                aida.histogram1D("Top Track Momentum (Px)").fill(trk.getPY());
+                aida.histogram1D("Top Track Momentum (Py)").fill(trk.getPZ());
+                aida.histogram1D("Top Track Momentum (Pz)").fill(trk.getPX());
+                aida.histogram1D("Top Track Chi2").fill(trk.getChi2());
+            } else {
+                aida.histogram1D("Bottom Track Momentum (Px)").fill(trk.getPY());
+                aida.histogram1D("Bottom Track Momentum (Py)").fill(trk.getPZ());
+                aida.histogram1D("Bottom Track Momentum (Pz)").fill(trk.getPX());
+                aida.histogram1D("Bottom Track Chi2").fill(trk.getChi2());
+            }
+            List<TrackerHit> hitsOnTrack = trk.getTrackerHits();
+            for (TrackerHit hit : hitsOnTrack) {
+                HelicalTrackHit htc = (HelicalTrackHit) hit;
+                HelicalTrackCross htcross = (HelicalTrackCross) htc;
+                double sHit = ht.PathMap().get(htc);
+                Hep3Vector posonhelix = HelixUtils.PointOnHelix(ht, sHit);
+
+                double yTr = posonhelix.y();
+                double zTr = posonhelix.z();
+                int layer = htc.Layer();
+                String modNum = "Module X ";
+                if (layer == 1) {
+                    modNum = "Module 1 ";
+                }
+                if (layer == 3) {
+                    modNum = "Module 2 ";
+                }
+                if (layer == 5) {
+                    modNum = "Module 3 ";
+                }
+                if (layer == 7) {
+                    modNum = "Module 4 ";
+                }
+                if (layer == 9) {
+                    modNum = "Module 5 ";
+                }
+                SymmetricMatrix cov = htc.getCorrectedCovMatrix();
+
+                aida.histogram1D(modNum + "Residual X(mm)").fill(htcross.getCorrectedPosition().y() - yTr);//these hits should be rotated track hits already
+                aida.histogram1D(modNum + "Residual Y(mm)").fill(htcross.getCorrectedPosition().z() - zTr);//these hits should be rotated track hits already
+                if (hit.getPosition()[2] > 0) {
+                    aida.histogram1D(modNum + "Residual X(mm) Top").fill(htcross.getCorrectedPosition().y() - yTr);//these hits should be rotated track hits already
+                    aida.histogram1D(modNum + "Residual Y(mm) Top").fill(htcross.getCorrectedPosition().z() - zTr);//these hits should be rotated track hits already
+
+                }
+                if (hit.getPosition()[2] < 0) {
+                    aida.histogram1D(modNum + "Residual X(mm) Bottom").fill(htcross.getCorrectedPosition().y() - yTr);//these hits should be rotated track hits already
+                    aida.histogram1D(modNum + "Residual Y(mm) Bottom").fill(htcross.getCorrectedPosition().z() - zTr);//these hits should be rotated track hits already
+
+                }
+                SiSensor sensor = ((SiSensor) ((RawTrackerHit) htc.getRawHits().get(0)).getDetectorElement());
+                double x = htcross.getCorrectedPosition().y();
+                double y = htcross.getCorrectedPosition().z();
+                if (SvtUtils.getInstance().isTopLayer(sensor)) {
+                    layersTop[htc.Layer() - 1]++;
+                    Hep3Vector sensorPos = ((SiSensor) ((RawTrackerHit) htc.getRawHits().get(0)).getDetectorElement()).getGeometry().getPosition();
+                    if (htc.Layer() == 1) {
+//                    System.out.println(sensorPos.toString());
+//                    System.out.println("Hit X = " + x + "; Hit Y = " + y);
+                        aida.histogram2D("Layer 1 HTH Position:  Top").fill(x - sensorPos.x(), y - sensorPos.y());
+                    }
+                    if (htc.Layer() == 7) {
+                        aida.histogram2D("Layer 7 HTH Position:  Top").fill(x - sensorPos.x(), y - sensorPos.y());
+                    }
+                } else {
+                    layersBot[htc.Layer() - 1]++;
+                    Hep3Vector sensorPos = ((SiSensor) ((RawTrackerHit) htc.getRawHits().get(0)).getDetectorElement()).getGeometry().getPosition();
+                    if (htc.Layer() == 1) {
+//                    System.out.println(sensorPos.toString());
+//                    System.out.println("Hit X = " + x + "; Hit Y = " + y);
+                        aida.histogram2D("Layer 1 HTH Position:  Bottom").fill(x - sensorPos.x(), y - sensorPos.y());
+                    }
+                    if (htc.Layer() == 7) {
+                        aida.histogram2D("Layer 7 HTH Position:  Bottom").fill(x - sensorPos.x(), y - sensorPos.y());
+                    }
+                }
+                /*
+                 List<RawTrackerHit> rawHits = hit.getRawHits();                
+                 for (RawTrackerHit rawHit : rawHits) {
+                 ChannelConstants constants = HPSSVTCalibrationConstants.getChannelConstants((SiSensor) rawHit.getDetectorElement(), rawHit.getIdentifierFieldValue("strip"));
+                 HPSShapeFitParameters fit = _shaper.fitShape(rawHit, constants);
+                 double amp = fit.getAmp();
+                    
+                 aida.histogram1D("Amp (HitOnTrack)").fill(amp);
+                 if (trk.getPX() > 1)
+                 aida.histogram1D("Amp Pz>1000 (HitOnTrack)").fill(amp);
+                 }                
+                 */
+                boolean doAmplitudePlots = false;
+                if(doAmplitudePlots) {
+                    for (HelicalTrackStrip hts : htcross.getStrips()) {
+                        double clusterSum = 0;
+                        for (RawTrackerHit rawHit : (List<RawTrackerHit>) hts.rawhits()) {
+                            ChannelConstants constants = HPSSVTCalibrationConstants.getChannelConstants((SiSensor) rawHit.getDetectorElement(), rawHit.getIdentifierFieldValue("strip"));
+                            for (ShapeFitParameters fit : _shaper.fitShape(rawHit, constants)) {
+                                double amp = fit.getAmp();
+                                clusterSum += amp;
+                                aida.histogram1D("Amp (HitOnTrack)").fill(amp);
+                                if (trk.getPX() > 1) {
+                                    aida.histogram1D("Amp Pz>1000 (HitOnTrack)").fill(amp);
+                                }
+                            }
+                        }
+                        aida.histogram1D("Amp (CluOnTrack)").fill(clusterSum);
+                        if (trk.getPX() > 1) {
+                            aida.histogram1D("Amp Pz>1000 (CluOnTrack)").fill(clusterSum);
+                        }
+                    }
+                }
+            }
+            if(event.hasCollection(HPSEcalCluster.class,ecalCollectionName)) {
+                List<HPSEcalCluster> clusters = event.get(HPSEcalCluster.class, ecalCollectionName);
+
+                HPSEcalCluster clust = findClosestCluster(posAtEcal, clusters);
+
+                //           if (clust != null) {
+                if (clust != null) {
+
+                    posAtEcal = TrackUtils.extrapolateTrack(trk, clust.getPosition()[2]);//.positionAtEcal();
+
+                    aida.histogram2D("Energy Vs Momentum").fill(clust.getEnergy(), trk.getPX() * 1000.0);
+                    aida.histogram1D("Energy Over Momentum").fill(clust.getEnergy() / (trk.getPX() * 1000.0));
+                    aida.histogram1D("deltaX").fill(clust.getPosition()[0] - posAtEcal.x());
+                    aida.histogram1D("deltaY").fill(clust.getPosition()[1] - posAtEcal.y());
+                    //                if (trk.getPX() > 1.0) {
+                    //                    aida.histogram1D("deltaX (Pz>1)").fill(clust.getPosition()[0] - posAtEcal.y());
+                    //                    aida.histogram1D("deltaY (Pz>1)").fill(clust.getPosition()[1] - posAtEcal.z());
+                    //                }
+                    aida.histogram2D("X ECal Vs Track").fill(clust.getPosition()[0], posAtEcal.x());
+                    aida.histogram2D("Y ECal Vs Track").fill(clust.getPosition()[1], posAtEcal.y());
+                    if (isTop == 0) {
+                        aida.histogram2D("Top Energy Vs Momentum").fill(clust.getEnergy(), trk.getPX() * 1000.0);
+                        //                    aida.histogram2D("Top Energy Vs Momentum").fill(posAtEcal.y(), trk.getPX() * 1000.0);
+                        aida.histogram1D("Top Energy Over Momentum").fill(clust.getEnergy() / (trk.getPX() * 1000.0));
+                        aida.histogram1D("Top deltaX").fill(clust.getPosition()[0] - posAtEcal.x());
+                        aida.histogram1D("Top deltaY").fill(clust.getPosition()[1] - posAtEcal.y());
+                        aida.histogram2D("Top deltaX vs X").fill(clust.getPosition()[0], clust.getPosition()[0] - posAtEcal.x());
+                        aida.histogram2D("Top deltaY vs Y").fill(clust.getPosition()[1], clust.getPosition()[1] - posAtEcal.y());
+                        aida.histogram2D("Top X ECal Vs Track").fill(clust.getPosition()[0], posAtEcal.x());
+                        aida.histogram2D("Top Y ECal Vs Track").fill(clust.getPosition()[1], posAtEcal.y());
+                    } else {
+                        aida.histogram2D("Bottom Energy Vs Momentum").fill(clust.getEnergy(), trk.getPX() * 1000.0);
+                        aida.histogram1D("Bottom Energy Over Momentum").fill(clust.getEnergy() / (trk.getPX() * 1000.0));
+                        aida.histogram1D("Bottom deltaX").fill(clust.getPosition()[0] - posAtEcal.x());
+                        aida.histogram1D("Bottom deltaY").fill(clust.getPosition()[1] - posAtEcal.y());
+                        aida.histogram2D("Bottom deltaX vs X").fill(clust.getPosition()[0], clust.getPosition()[0] - posAtEcal.x());
+                        aida.histogram2D("Bottom deltaY vs Y").fill(clust.getPosition()[1], clust.getPosition()[1] - posAtEcal.y());
+                        aida.histogram2D("Bottom X ECal Vs Track").fill(clust.getPosition()[0], posAtEcal.x());
+                        aida.histogram2D("Bottom Y ECal Vs Track").fill(clust.getPosition()[1], posAtEcal.y());
+                    }
+
+                }
+            }
+        }
+    }
+
+    public int[] getTrackHitsPerLayer(Track trk) {
+        int n[] = {0, 0, 0, 0, 0};
+        List<TrackerHit> hitsOnTrack = trk.getTrackerHits();
+        int layer;
+        for (TrackerHit hit : hitsOnTrack) {
+            HelicalTrackHit htc = (HelicalTrackHit) hit;
+//            if (htc.getPosition()[2] < 0) {
+            layer = htc.Layer();
+            layer = (layer - 1) / 2;
+            n[layer] = n[layer] + 1;
+//            }
+        }
+
+        return n;
+    }
+
+    public boolean singleTrackHitPerLayer(Track track) {
+        int hitsPerLayer[] = getTrackHitsPerLayer(track);
+        for (int i = 0; i < 5; ++i) {
+            if (hitsPerLayer[i] != 1) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    public boolean singleStripClusterPerLayer(int hitsPerLayer[]) {
+        //This includes both axial and stereo separately 
+        // so for a hit in each double layer we need 10 hits
+        for (int i = 0; i < 10; ++i) {
+            if (hitsPerLayer[i] != 1) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    public int[] getStripClustersPerLayer(List<SiTrackerHitStrip1D> trackerHits, String side) {
+        String si_side;
+        String name;
+        int l;
+        int i;
+        int n[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+        boolean ddd = true;
+
+        if (ddd) {
+            System.out.println("Get # hits per layer on side \"" + side + "\"");
+        }
+
+        for (SiTrackerHitStrip1D stripCluster : trackerHits) {
+
+            if (ddd) {
+                System.out.println("Processing stripCluster " + stripCluster.toString());
+            }
+
+            if (!"".equals(side)) {
+                String s;
+                if (stripCluster.getPosition()[1] >= 0.0) {
+                    s = "up";
+                } else {
+                    s = "down";
+                }
+                if (!s.equals(side)) {
+                    continue;
+                }
+            }
+
+            name = stripCluster.getSensor().getName();
+            if (name.length() < 14) {
+                System.err.println("This name is too short!!");
+                throw new RuntimeException("SiSensor name " + name + " is invalid?");
+            }
+
+            if (ddd) {
+                System.out.println("sensor name  " + name);
+            }
+            
+            if(name.contains("layer") && name.contains("_module")) {
+                //String str_l = name.substring(13);
+                String str_l = name.substring(name.indexOf("layer") + 5, name.indexOf("_module"));
+                l = Integer.parseInt(str_l);
+            }
+            else if(name.contains("module") && name.contains("_halfmodule")) {
+                l = HPSTrackerBuilder.getOldGeomDefLayerFromVolumeName(name);
+            } else {
+                throw new RuntimeException("Cannot get layer from name " + name);
+            }
+            
+            if (ddd) {
+                System.out.println("sensor name  " + name + " --> layer " + l);
+            }
+
+            if (l < 1 || l > 10) {
+                System.out.println("This layer doesn't exist?");
+                throw new RuntimeException("SiSensor name " + name + " is invalid?");
+            }
+
+            n[l - 1] = n[l - 1] + 1;
+
+        }
+
+        return n;
+    }
+
+    @Override
+    public void endOfData() {
+        if (outputPlots != null) {
+            try {
+                aida.saveAs(outputPlots);
+            } catch (IOException ex) {
+                Logger.getLogger(TrackingReconstructionPlots.class.getName()).log(Level.SEVERE, null, ex);
+            }
+        }
+        //plotterFrame.dispose();
+        //topFrame.dispose();
+        //bottomFrame.dispose();
+    }
+
+    private HPSEcalCluster findClosestCluster(Hep3Vector posonhelix, List<HPSEcalCluster> clusters) {
+        HPSEcalCluster closest = null;
+        double minDist = 9999;
+        for (HPSEcalCluster cluster : clusters) {
+            double[] clPos = cluster.getPosition();
+            double clEne = cluster.getEnergy();
+            double dist = Math.sqrt(Math.pow(clPos[0] - posonhelix.x(), 2) + Math.pow(clPos[1] - posonhelix.y(), 2)); //coordinates!!!
+//            double dist = Math.sqrt(Math.pow(clPos[1] - posonhelix.z(), 2)); //coordinates!!!
+            if (dist < minDist && clEne > 50) {
+                closest = cluster;
+                minDist = dist;
+            }
+//                    if(cluster.getEnergy()/10>500)
+        }
+//        System.out.println("Found a cluster..." + minDist);
+
+        return closest;
+
+    }
+
+    @Override
+    public void reset() {
+        aida.histogram1D("Track Momentum (Px)").reset();
+        aida.histogram1D("Track Momentum (Py)").reset();
+        aida.histogram1D("Track Momentum (Pz)").reset();
+        aida.histogram1D("Track Chi2").reset();
+        aida.histogram1D("Tracks per Event").reset();
+        aida.histogram1D("X @ Z=-60cm").reset();
+        aida.histogram1D("Y @ Z=-60cm").reset();
+        aida.histogram1D("Hits per Track").reset();
+        aida.histogram1D("Module 1 Residual X(mm)").reset();
+        aida.histogram1D("Module 1 Residual Y(mm)").reset();
+        aida.histogram1D("Module 2 Residual X(mm)").reset();
+        aida.histogram1D("Module 2 Residual Y(mm)").reset();
+        aida.histogram1D("Module 3 Residual X(mm)").reset();
+        aida.histogram1D("Module 3 Residual Y(mm)").reset();
+        aida.histogram1D("Module 4 Residual X(mm)").reset();
+        aida.histogram1D("Module 4 Residual Y(mm)").reset();
+        aida.histogram1D("Module 5 Residual X(mm)").reset();
+        aida.histogram1D("Module 5 Residual Y(mm)").reset();
+        aida.histogram1D("Module 1 Residual X(mm) Top").reset();
+        aida.histogram1D("Module 1 Residual Y(mm) Top").reset();
+        aida.histogram1D("Module 2 Residual X(mm) Top").reset();
+        aida.histogram1D("Module 2 Residual Y(mm) Top").reset();
+        aida.histogram1D("Module 3 Residual X(mm) Top").reset();
+        aida.histogram1D("Module 3 Residual Y(mm) Top").reset();
+        aida.histogram1D("Module 4 Residual X(mm) Top").reset();
+        aida.histogram1D("Module 4 Residual Y(mm) Top").reset();
+        aida.histogram1D("Module 5 Residual X(mm) Top").reset();
+        aida.histogram1D("Module 5 Residual Y(mm) Top").reset();
+        aida.histogram1D("Module 1 Residual X(mm) Bottom").reset();
+        aida.histogram1D("Module 1 Residual Y(mm) Bottom").reset();
+        aida.histogram1D("Module 2 Residual X(mm) Bottom").reset();
+        aida.histogram1D("Module 2 Residual Y(mm) Bottom").reset();
+        aida.histogram1D("Module 3 Residual X(mm) Bottom").reset();
+        aida.histogram1D("Module 3 Residual Y(mm) Bottom").reset();
+        aida.histogram1D("Module 4 Residual X(mm) Bottom").reset();
+        aida.histogram1D("Module 4 Residual Y(mm) Bottom").reset();
+        aida.histogram1D("Module 5 Residual X(mm) Bottom").reset();
+        aida.histogram1D("Module 5 Residual Y(mm) Bottom").reset();
+
+        aida.histogram2D("Energy Vs Momentum").reset();
+        aida.histogram1D("Energy Over Momentum").reset();
+        aida.histogram1D("deltaX").reset();
+        aida.histogram1D("deltaY").reset();
+
+        aida.histogram1D("Amp (HitOnTrack)").reset();
+
+        aida.histogram1D("d0 ").reset();
+        aida.histogram1D("sinphi ").reset();
+        aida.histogram1D("omega ").reset();
+        aida.histogram1D("tan(lambda) ").reset();
+        aida.histogram1D("z0 ").reset();
+    }
+}