Print

Print


Author: [log in to unmask]
Date: Mon May 11 09:36:24 2015
New Revision: 2946

Log:
Additions to DQM analysis 

Added:
    java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/PlotAndFitUtilities.java
      - copied, changed from r2846, java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/trackrecon/PlotAndFitUtilities.java
    java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/SVTOpeningStudies.java
      - copied, changed from r2846, java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/trackrecon/SVTOpeningAlignment.java
Modified:
    java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/FinalStateMonitoring.java
    java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/TrackingMonitoring.java
    java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/V0Monitoring.java

Modified: java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/FinalStateMonitoring.java
 =============================================================================
--- java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/FinalStateMonitoring.java	(original)
+++ java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/FinalStateMonitoring.java	Mon May 11 09:36:24 2015
@@ -59,7 +59,6 @@
     double beamEnergy = 1.05; //GeV
     double maxFactor = 1.5;
     double feeMomentumCut = 0.8; //GeV
-   
 
     @Override
     protected void detectorChanged(Detector detector) {
@@ -111,7 +110,7 @@
                     if (!matchTriggerType(triggerData))//only process singles0 triggers...
                         return;
                 }
-        } else
+        } else if (debug)
             System.out.println(this.getClass().getSimpleName() + ":  No trigger bank found...running over all trigger types");
 
         nRecoEvents++;
@@ -228,10 +227,13 @@
         IFitter fitter = fitFactory.createFitter("chi2");
         IHistogram1D beamE = aida.histogram1D(plotDir + triggerType + "/" + "Beam Electrons Pz (GeV)");
         IFitResult result = fitBeamEnergyPeak(beamE, fitter, "range=\"(-10.0,10.0)\"");
-        double[] pars = result.fittedParameters();
-        for (int i = 0; i < 5; i++)
-            System.out.println("Beam Energy Peak:  " + result.fittedParameterNames()[i] + " = " + pars[i]);
-
+        if (result != null) {
+            double[] pars = result.fittedParameters();
+            for (int i = 0; i < 5; i++)
+                System.out.println("Beam Energy Peak:  " + result.fittedParameterNames()[i] + " = " + pars[i]);
+            monitoredQuantityMap.put(fpQuantNames[7], (double) pars[1]);
+            monitoredQuantityMap.put(fpQuantNames[8], (double) pars[2]);
+        }
         monitoredQuantityMap.put(fpQuantNames[0], (double) nTotEle / nRecoEvents);
         monitoredQuantityMap.put(fpQuantNames[1], (double) nTotPos / nRecoEvents);
         monitoredQuantityMap.put(fpQuantNames[2], (double) nTotPhotons / nRecoEvents);
@@ -239,8 +241,7 @@
         monitoredQuantityMap.put(fpQuantNames[4], (double) sumdelX / nTotAss);
         monitoredQuantityMap.put(fpQuantNames[5], (double) sumdelY / nTotAss);
         monitoredQuantityMap.put(fpQuantNames[6], (double) sumEoverP / nTotAss);
-        monitoredQuantityMap.put(fpQuantNames[7], (double) pars[1]);
-        monitoredQuantityMap.put(fpQuantNames[8], (double) pars[2]);
+
         IPlotter plotter = analysisFactory.createPlotterFactory().create("Beam Energy Electrons");
 
         IPlotterStyle pstyle = plotter.style();
@@ -248,7 +249,7 @@
         pstyle.dataStyle().fillStyle().setColor("green");
         pstyle.dataStyle().lineStyle().setColor("black");
         plotter.region(0).plot(beamE);
-        plotter.region(0).plot(result.fittedFunction());
+//        plotter.region(0).plot(result.fittedFunction());
         if (outputPlots)
             try {
                 plotter.writeToFile(outputPlotDir + "beamEnergyElectrons.png");
@@ -269,9 +270,14 @@
 //        return fitter.fit(h1d, "g+p1", init, range);
         double[] init = {20.0, 2.2, 0.12, 10, 0.0};
 //        double[] init = {20.0, 2.2, 0.1};
-        return fitter.fit(h1d, "g+p1", init);
-    }
-
-  
+        IFitResult ifr = null;
+        try {
+            ifr = fitter.fit(h1d, "g+p1", init);
+        } catch (RuntimeException ex) {
+            System.out.println(this.getClass().getSimpleName() + ":  caught exception in fitGaussian");
+        }
+
+        return ifr;
+    }
 
 }

Copied: java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/PlotAndFitUtilities.java (from r2846, java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/trackrecon/PlotAndFitUtilities.java)
 =============================================================================
--- java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/trackrecon/PlotAndFitUtilities.java	(original)
+++ java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/PlotAndFitUtilities.java	Mon May 11 09:36:24 2015
@@ -1,4 +1,4 @@
-package org.hps.monitoring.drivers.trackrecon;
+package org.hps.analysis.dataquality;
 
 import hep.aida.IBaseHistogram;
 import hep.aida.ICloud1D;

Copied: java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/SVTOpeningStudies.java (from r2846, java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/trackrecon/SVTOpeningAlignment.java)
 =============================================================================
--- java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/trackrecon/SVTOpeningAlignment.java	(original)
+++ java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/SVTOpeningStudies.java	Mon May 11 09:36:24 2015
@@ -1,36 +1,22 @@
-package org.hps.monitoring.drivers.trackrecon;
-
-import hep.aida.IAnalysisFactory;
-import hep.aida.IFitFactory;
-import hep.aida.IFitResult;
-import hep.aida.IFitter;
-import hep.aida.IFunction;
-import hep.aida.IFunctionFactory;
+package org.hps.analysis.dataquality;
+
 import hep.aida.IHistogram1D;
-import hep.aida.IPlotter;
-import hep.aida.IPlotterFactory;
-import hep.aida.IPlotterStyle;
-import java.io.IOException;
+import hep.aida.IHistogram2D;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import static org.hps.monitoring.drivers.trackrecon.PlotAndFitUtilities.fitAndPutParameters;
 import org.lcsim.event.EventHeader;
 import org.lcsim.event.Track;
 import org.lcsim.event.TrackState;
 import org.lcsim.event.TrackerHit;
 import org.lcsim.fit.helicaltrack.HelicalTrackHit;
 import org.lcsim.geometry.Detector;
-import org.lcsim.util.Driver;
 import org.lcsim.util.aida.AIDA;
-import static org.hps.monitoring.drivers.trackrecon.PlotAndFitUtilities.performGaussianFit;
 
 /**
  *
  * @author mgraham
  */
-public class SVTOpeningAlignment extends Driver {
+public class SVTOpeningStudies extends DataQualityMonitor {
 
     static private AIDA aida = AIDA.defaultInstance();
     private String helicalTrackHitCollectionName = "HelicalTrackHits";
@@ -38,8 +24,7 @@
     private String l1to3CollectionName = "L1to3Tracks";
     private String l4to6CollectionName = "L4to6Tracks";
     private String outputPlots = null;
-    IPlotter plotterTop;
-    IPlotter plotterBot;
+
     IHistogram1D nTracks46Top;
     IHistogram1D nTracks13Top;
     IHistogram1D nTracks46Bot;
@@ -55,23 +40,47 @@
     IHistogram1D dellambdaBot;
     IHistogram1D delz0Bot;
 
-    IPlotterFactory plotterFactory;
-    IFunctionFactory functionFactory;
-    IFitFactory fitFactory;
-    IFunction fd0Top;
-    IFunction fphi0Top;
-    IFunction fz0Top;
-    IFunction flambdaTop;
-    IFunction fwTop;
-    IFunction fd0Bot;
-    IFunction fphi0Bot;
-    IFunction fz0Bot;
-    IFunction flambdaBot;
-    IFunction fwBot;
-
-    IFitter jminChisq;
-
-    public SVTOpeningAlignment() {
+    IHistogram1D nTracks46Pos;
+    IHistogram1D nTracks13Pos;
+    IHistogram1D nTracks46Ele;
+    IHistogram1D nTracks13Ele;
+    IHistogram1D deld0Pos;
+    IHistogram1D delphiPos;
+    IHistogram1D delwPos;
+    IHistogram1D dellambdaPos;
+    IHistogram1D delz0Pos;
+    IHistogram1D deld0Ele;
+    IHistogram1D delphiEle;
+    IHistogram1D delwEle;
+    IHistogram1D dellambdaEle;
+    IHistogram1D delz0Ele;
+
+    IHistogram2D d0Ele;
+    IHistogram2D phiEle;
+    IHistogram2D wEle;
+    IHistogram2D lambdaEle;
+    IHistogram2D z0Ele;
+
+    IHistogram2D d0Pos;
+    IHistogram2D phiPos;
+    IHistogram2D wPos;
+    IHistogram2D lambdaPos;
+    IHistogram2D z0Pos;
+
+    IHistogram1D nCombosTop;
+    IHistogram1D nCombosBot;
+
+    double rangeD0 = 50;
+    double rangePhi0 = 0.25;
+    double rangeOmega = 0.00025;
+    double rangeSlope = 0.01;
+    double rangeZ0 = 10;
+
+    double pcut = 0.8;
+
+    private final String plotDir = "SVTOpening/";
+
+    public SVTOpeningStudies() {
     }
 
     public void setOutputPlots(String output) {
@@ -94,93 +103,57 @@
     protected void detectorChanged(Detector detector) {
         aida.tree().cd("/");
 
-        IAnalysisFactory fac = aida.analysisFactory();
-        IPlotterFactory pfac = fac.createPlotterFactory("SVT Alignment");
-        functionFactory = aida.analysisFactory().createFunctionFactory(null);
-        fitFactory = aida.analysisFactory().createFitFactory();
-        jminChisq = fitFactory.createFitter("chi2", "jminuit");
-
-        plotterTop = pfac.create("Top Layers");
-        IPlotterStyle style = plotterTop.style();
-        style.dataStyle().fillStyle().setColor("yellow");
-        style.dataStyle().errorBarStyle().setVisible(false);
-        style.legendBoxStyle().setVisible(false);
-        style.dataStyle().outlineStyle().setVisible(false);
-        plotterTop.createRegions(3, 3);
-        //plotterFrame.addPlotter(plotter);
-
-        IPlotterStyle functionStyle = pfac.createPlotterStyle();
-        functionStyle.dataStyle().lineStyle().setColor("red");
-        functionStyle.dataStyle().markerStyle().setVisible(true);
-        functionStyle.dataStyle().markerStyle().setColor("black");
-        functionStyle.dataStyle().markerStyle().setShape("dot");
-        functionStyle.dataStyle().markerStyle().setSize(2);
-
-        nTracks13Top = aida.histogram1D("Number of L1-3 Tracks: Top ", 7, 0, 7.0);
-        nTracks46Top = aida.histogram1D("Number of L4-6 Tracks: Top ", 7, 0, 7.0);
-
-        deld0Top = aida.histogram1D("Delta d0: Top", 50, -20.0, 20.0);
-        delphiTop = aida.histogram1D("Delta sin(phi): Top", 50, -0.1, 0.1);
-        delwTop = aida.histogram1D("Delta curvature: Top", 50, -0.0002, 0.0002);
-        dellambdaTop = aida.histogram1D("Delta slope: Top", 50, -0.02, 0.02);
-        delz0Top = aida.histogram1D("Delta y0: Top", 50, -5, 5.0);
-
-        fd0Top = functionFactory.createFunctionByName("Gaussian", "G");
-        fphi0Top = functionFactory.createFunctionByName("Gaussian", "G");
-        fwTop = functionFactory.createFunctionByName("Gaussian", "G");
-        flambdaTop = functionFactory.createFunctionByName("Gaussian", "G");
-        fz0Top = functionFactory.createFunctionByName("Gaussian", "G");
-
-        plotterTop.region(0).plot(deld0Top);
-        plotterTop.region(3).plot(delphiTop);
-        plotterTop.region(6).plot(delwTop);
-        plotterTop.region(1).plot(dellambdaTop);
-        plotterTop.region(4).plot(delz0Top);
-        plotterTop.region(2).plot(nTracks13Top);
-        plotterTop.region(5).plot(nTracks46Top);
-        plotterTop.region(0).plot(fd0Top, functionStyle);
-        plotterTop.region(3).plot(fphi0Top, functionStyle);
-        plotterTop.region(6).plot(fwTop, functionStyle);
-        plotterTop.region(1).plot(flambdaTop, functionStyle);
-        plotterTop.region(4).plot(fz0Top, functionStyle);
-        plotterTop.show();
-
-        plotterBot = pfac.create("Bottom Layers");
-        IPlotterStyle styleBot = plotterBot.style();
-        styleBot.legendBoxStyle().setVisible(false);
-        styleBot.dataStyle().fillStyle().setColor("yellow");
-        styleBot.dataStyle().errorBarStyle().setVisible(false);
-        styleBot.dataStyle().outlineStyle().setVisible(false);
-        plotterBot.createRegions(3, 3);
-
-        nTracks13Bot = aida.histogram1D("Number of L1-3 Tracks: Bot ", 7, 0, 7.0);
-        nTracks46Bot = aida.histogram1D("Number of L4-6 Tracks: Bot ", 7, 0, 7.0);
-
-        deld0Bot = aida.histogram1D("Delta d0: Bot", 50, -20.0, 20.0);
-        delphiBot = aida.histogram1D("Delta sin(phi): Bot", 50, -0.1, 0.1);
-        delwBot = aida.histogram1D("Delta curvature: Bot", 50, -0.0002, 0.0002);
-        dellambdaBot = aida.histogram1D("Delta slope: Bot", 50, -0.02, 0.02);
-        delz0Bot = aida.histogram1D("Delta y0: Bot", 50, -5, 5.0);
-
-        fd0Bot = functionFactory.createFunctionByName("Gaussian", "G");
-        fphi0Bot = functionFactory.createFunctionByName("Gaussian", "G");
-        fwBot = functionFactory.createFunctionByName("Gaussian", "G");
-        flambdaBot = functionFactory.createFunctionByName("Gaussian", "G");
-        fz0Bot = functionFactory.createFunctionByName("Gaussian", "G");
-
-        plotterBot.region(0).plot(deld0Bot);
-        plotterBot.region(3).plot(delphiBot);
-        plotterBot.region(6).plot(delwBot);
-        plotterBot.region(1).plot(dellambdaBot);
-        plotterBot.region(4).plot(delz0Bot);
-        plotterBot.region(2).plot(nTracks13Bot);
-        plotterBot.region(5).plot(nTracks46Bot);
-        plotterBot.region(0).plot(fd0Bot, functionStyle);
-        plotterBot.region(3).plot(fphi0Bot, functionStyle);
-        plotterBot.region(6).plot(fwBot, functionStyle);
-        plotterBot.region(1).plot(flambdaBot, functionStyle);
-        plotterBot.region(4).plot(fz0Bot, functionStyle);
-        plotterBot.show();
+        nTracks13Top = aida.histogram1D(plotDir + "Number of L1-3 Tracks: Top ", 7, 0, 7.0);
+        nTracks46Top = aida.histogram1D(plotDir + "Number of L4-6 Tracks: Top ", 7, 0, 7.0);
+
+        deld0Top = aida.histogram1D(plotDir + "Delta d0: Top", 50, -rangeD0, rangeD0);
+        delphiTop = aida.histogram1D(plotDir + "Delta sin(phi): Top", 50, -rangePhi0, rangePhi0);
+        delwTop = aida.histogram1D(plotDir + "Delta curvature: Top", 50, -rangeOmega, rangeOmega);
+        dellambdaTop = aida.histogram1D(plotDir + "Delta slope: Top", 50, -rangeSlope, rangeSlope);
+        delz0Top = aida.histogram1D(plotDir + "Delta y0: Top", 50, -rangeZ0, rangeZ0);
+
+        nTracks13Bot = aida.histogram1D(plotDir + "Number of L1-3 Tracks: Bot ", 7, 0, 7.0);
+        nTracks46Bot = aida.histogram1D(plotDir + "Number of L4-6 Tracks: Bot ", 7, 0, 7.0);
+
+        deld0Bot = aida.histogram1D(plotDir + "Delta d0: Bot", 50, -rangeD0, rangeD0);
+        delphiBot = aida.histogram1D(plotDir + "Delta sin(phi): Bot", 50, -rangePhi0, rangePhi0);
+        delwBot = aida.histogram1D(plotDir + "Delta curvature: Bot", 50, -rangeOmega, rangeOmega);
+        dellambdaBot = aida.histogram1D(plotDir + "Delta slope: Bot", 50, -rangeSlope, rangeSlope);
+        delz0Bot = aida.histogram1D(plotDir + "Delta y0: Bot", 50, -rangeZ0, rangeZ0);
+
+        nTracks13Ele = aida.histogram1D(plotDir + "Number of L1-3 Tracks: Ele ", 7, 0, 7.0);
+        nTracks46Ele = aida.histogram1D(plotDir + "Number of L4-6 Tracks: Ele ", 7, 0, 7.0);
+
+        deld0Ele = aida.histogram1D(plotDir + "Delta d0: Ele", 50, -rangeD0, rangeD0);
+        delphiEle = aida.histogram1D(plotDir + "Delta sin(phi): Ele", 50, -rangePhi0, rangePhi0);
+        delwEle = aida.histogram1D(plotDir + "Delta curvature: Ele", 50, -rangeOmega, rangeOmega);
+        dellambdaEle = aida.histogram1D(plotDir + "Delta slope: Ele", 50, -rangeSlope, rangeSlope);
+        delz0Ele = aida.histogram1D(plotDir + "Delta y0: Ele", 50, -rangeZ0, rangeZ0);
+
+        nTracks13Pos = aida.histogram1D(plotDir + "Number of L1-3 Tracks: Pos ", 7, 0, 7.0);
+        nTracks46Pos = aida.histogram1D(plotDir + "Number of L4-6 Tracks: Pos ", 7, 0, 7.0);
+
+        deld0Pos = aida.histogram1D(plotDir + "Delta d0: Pos", 50, -rangeD0, rangeD0);
+        delphiPos = aida.histogram1D(plotDir + "Delta sin(phi): Pos", 50, -rangePhi0, rangePhi0);
+        delwPos = aida.histogram1D(plotDir + "Delta curvature: Pos", 50, -rangeOmega, rangeOmega);
+        dellambdaPos = aida.histogram1D(plotDir + "Delta slope: Pos", 50, -rangeSlope, rangeSlope);
+        delz0Pos = aida.histogram1D(plotDir + "Delta y0: Pos", 50, -rangeZ0, rangeZ0);
+
+        d0Ele = aida.histogram2D(plotDir + "electrons d0: L46vs L13", 50, -rangeD0, rangeD0, 50, -rangeD0, rangeD0);
+        phiEle = aida.histogram2D(plotDir + "electrons sin(phi): L46vs L13", 50, -rangePhi0, rangePhi0, 50, -rangePhi0, rangePhi0);
+        wEle = aida.histogram2D(plotDir + "electrons curvature: L46vs L13", 50, -rangeOmega, rangeOmega, 50, -rangeOmega, rangeOmega);
+        lambdaEle = aida.histogram2D(plotDir + "electrons slope: L46vs L13", 50, -10 * rangeSlope, 10 * rangeSlope, 50, -10 * rangeSlope, 10 * rangeSlope);
+        z0Ele = aida.histogram2D(plotDir + "electrons y0: L46vs L13", 50, -rangeZ0, rangeZ0, 50, -rangeZ0, rangeZ0);
+
+        d0Pos = aida.histogram2D(plotDir + "positrons d0: L46vs L13", 50, -rangeD0, rangeD0, 50, -rangeD0, rangeD0);
+        phiPos = aida.histogram2D(plotDir + "positrons sin(phi): L46vs L13", 50, -rangePhi0, rangePhi0, 50, -rangePhi0, rangePhi0);
+        wPos = aida.histogram2D(plotDir + "positrons curvature: L46vs L13", 50, -rangeOmega, rangeOmega, 50, -rangeOmega, rangeOmega);
+        lambdaPos = aida.histogram2D(plotDir + "positrons slope: L46vs L13", 50, -10 * rangeSlope, 10 * rangeSlope, 50, -10 * rangeSlope, 10 * rangeSlope);
+        z0Pos = aida.histogram2D(plotDir + "positrons y0: L46vs L13", 50, -rangeZ0, rangeZ0, 50, -rangeZ0, rangeZ0);
+
+        nCombosTop = aida.histogram1D(plotDir + "Number of Combinations: Top", 7, 0, 7.0);
+        nCombosBot = aida.histogram1D(plotDir + "Number of Combinations: Bot", 7, 0, 7.0);
+
     }
 
     @Override
@@ -203,59 +176,106 @@
         List<Track> l4to6tracksTop = splitTrackList(l4to6tracks, true);
         List<Track> l4to6tracksBot = splitTrackList(l4to6tracks, false);
 
+        List<Track> l1to3tracksEle = splitByCharge(l1to3tracks, -1);
+        List<Track> l1to3tracksPos = splitByCharge(l1to3tracks, 1);
+        List<Track> l4to6tracksEle = splitByCharge(l4to6tracks, -1);
+        List<Track> l4to6tracksPos = splitByCharge(l4to6tracks, 1);
+
         nTracks13Top.fill(l1to3tracksTop.size());
         nTracks13Bot.fill(l1to3tracksBot.size());
         nTracks46Top.fill(l4to6tracksTop.size());
         nTracks46Bot.fill(l4to6tracksBot.size());
 
+        nTracks13Ele.fill(l1to3tracksEle.size());
+        nTracks13Pos.fill(l1to3tracksPos.size());
+        nTracks46Ele.fill(l4to6tracksEle.size());
+        nTracks46Pos.fill(l4to6tracksPos.size());
+
+        int ncombotop = 0;
+        int ncombobot = 0;
+
         for (Track trk46 : l4to6tracksTop) {
             TrackState ts46 = trk46.getTrackStates().get(0);
-            for (Track trk13 : l1to3tracksTop) {
-                TrackState ts13 = trk13.getTrackStates().get(0);
-                deld0Top.fill(ts46.getD0() - ts13.getD0());
-                delphiTop.fill(Math.sin(ts46.getPhi()) - Math.sin(ts13.getPhi()));
-                delwTop.fill(ts46.getOmega() - ts13.getOmega());
-                delz0Top.fill(ts46.getZ0() - ts13.getZ0());
-                dellambdaTop.fill(ts46.getTanLambda() - ts13.getTanLambda());
-            }
-        }
-        fitAndPutParameters(deld0Top, fd0Top);
-        fitAndPutParameters(delphiTop, fphi0Top);
-        fitAndPutParameters(delwTop, fwTop);
-        fitAndPutParameters(delz0Top, fz0Top);
-        fitAndPutParameters(dellambdaTop, flambdaTop);
+            for (Track trk13 : l1to3tracksTop)
+                if (trk46.getMomentum()[0] > pcut && trk13.getMomentum()[0] > pcut) {
+                    TrackState ts13 = trk13.getTrackStates().get(0);
+                    deld0Top.fill(ts46.getD0() - ts13.getD0());
+                    delphiTop.fill(Math.sin(ts46.getPhi()) - Math.sin(ts13.getPhi()));
+                    delwTop.fill(ts46.getOmega() - ts13.getOmega());
+                    delz0Top.fill(ts46.getZ0() - ts13.getZ0());
+                    dellambdaTop.fill(ts46.getTanLambda() - ts13.getTanLambda());
+                    ncombotop++;
+                }
+        }
 
         for (Track trk46 : l4to6tracksBot) {
             TrackState ts46 = trk46.getTrackStates().get(0);
-            for (Track trk13 : l1to3tracksBot) {
+            for (Track trk13 : l1to3tracksBot)
+                if (trk46.getMomentum()[0] > pcut && trk13.getMomentum()[0] > pcut) {
+                    TrackState ts13 = trk13.getTrackStates().get(0);
+                    deld0Bot.fill(ts46.getD0() - ts13.getD0());
+                    delphiBot.fill(Math.sin(ts46.getPhi()) - Math.sin(ts13.getPhi()));
+                    delwBot.fill(ts46.getOmega() - ts13.getOmega());
+                    delz0Bot.fill(ts46.getZ0() - ts13.getZ0());
+                    dellambdaBot.fill(ts46.getTanLambda() - ts13.getTanLambda());
+                    ncombobot++;
+                }
+        }
+
+        nCombosTop.fill(ncombotop);
+        nCombosBot.fill(ncombobot);
+
+        for (Track trk46 : l4to6tracksEle) {
+            TrackState ts46 = trk46.getTrackStates().get(0);
+            for (Track trk13 : l1to3tracksEle) {
                 TrackState ts13 = trk13.getTrackStates().get(0);
-                deld0Bot.fill(ts46.getD0() - ts13.getD0());
-                delphiBot.fill(Math.sin(ts46.getPhi()) - Math.sin(ts13.getPhi()));
-                delwBot.fill(ts46.getOmega() - ts13.getOmega());
-                delz0Bot.fill(ts46.getZ0() - ts13.getZ0());
-                dellambdaBot.fill(ts46.getTanLambda() - ts13.getTanLambda());
+                deld0Ele.fill(ts46.getD0() - ts13.getD0());
+                delphiEle.fill(Math.sin(ts46.getPhi()) - Math.sin(ts13.getPhi()));
+                delwEle.fill(ts46.getOmega() - ts13.getOmega());
+                delz0Ele.fill(ts46.getZ0() - ts13.getZ0());
+                dellambdaEle.fill(ts46.getTanLambda() - ts13.getTanLambda());
+                d0Ele.fill(ts46.getD0(), ts13.getD0());
+                phiEle.fill(Math.sin(ts46.getPhi()), Math.sin(ts13.getPhi()));
+                wEle.fill(ts46.getOmega(), ts13.getOmega());
+                lambdaEle.fill(ts46.getTanLambda(), ts13.getTanLambda());
+                z0Ele.fill(ts46.getZ0(), ts13.getZ0());
+
             }
         }
 
-//        IFunction currentFitFunction = performGaussianFit(deld0Bot, fd0Bot, jminChisq).fittedFunction();;
-//         fd0Bot.setParameters(currentFitFunction.parameters());
-        fitAndPutParameters(deld0Bot, fd0Bot);
-        fitAndPutParameters(delphiBot, fphi0Bot);
-        fitAndPutParameters(delwBot, fwBot);
-        fitAndPutParameters(delz0Bot, fz0Bot);
-        fitAndPutParameters(dellambdaBot, flambdaBot);
-
+        for (Track trk46 : l4to6tracksPos) {
+            TrackState ts46 = trk46.getTrackStates().get(0);
+            for (Track trk13 : l1to3tracksPos) {
+                TrackState ts13 = trk13.getTrackStates().get(0);
+                deld0Pos.fill(ts46.getD0() - ts13.getD0());
+                delphiPos.fill(Math.sin(ts46.getPhi()) - Math.sin(ts13.getPhi()));
+                delwPos.fill(ts46.getOmega() - ts13.getOmega());
+                delz0Pos.fill(ts46.getZ0() - ts13.getZ0());
+                dellambdaPos.fill(ts46.getTanLambda() - ts13.getTanLambda());
+                d0Pos.fill(ts46.getD0(), ts13.getD0());
+                phiPos.fill(Math.sin(ts46.getPhi()), Math.sin(ts13.getPhi()));
+                wPos.fill(ts46.getOmega(), ts13.getOmega());
+                lambdaPos.fill(ts46.getTanLambda(), ts13.getTanLambda());
+                z0Pos.fill(ts46.getZ0(), ts13.getZ0());
+            }
+        }
+
+        /*
+         l1to3tracksPos = null;
+         l1to3tracksEle = null;
+         l1to3tracksTop = null;
+         l1to3tracksBot = null;
+
+         l4to6tracksPos = null;
+         l4to6tracksEle = null;
+         l4to6tracksTop = null;
+         l4to6tracksBot = null;
+         */
     }
 
     @Override
     public void endOfData() {
-        if (outputPlots != null)
-            try {
-                plotterTop.writeToFile(outputPlots + "-deltasTop.gif");
-                plotterBot.writeToFile(outputPlots + "-deltasBottom.gif");
-            } catch (IOException ex) {
-                Logger.getLogger(TrackingReconPlots.class.getName()).log(Level.SEVERE, null, ex);
-            }
+
     }
 
     private List<Track> splitTrackList(List<Track> trks, boolean doTop) {
@@ -277,4 +297,26 @@
         }
         return tracksHalf;
     }
+
+    private List<Track> splitByCharge(List<Track> trks, int charge) {
+        List<Track> tracksHalf = new ArrayList<>();
+        boolean isTop = false;
+        boolean isBot = false;
+        for (Track trk : trks) {
+            isTop = false;
+            isBot = false;
+            if (!(trk.getCharge() == charge)) { //XNOR but remember that the track charge is opposite because of B-field definition...
+                for (TrackerHit hit : trk.getTrackerHits())
+                    if (hit.getPosition()[2] > 0)//remember, non-bend in tracking frame is z-direction
+                        isTop = true;
+                    else
+                        isBot = true;
+                if (isTop == true && isBot != true)  //if  all hits are in top
+                    tracksHalf.add(trk);
+                if (isBot == true && isTop != true) //if all hits are in bottom
+                    tracksHalf.add(trk);
+            }
+        }
+        return tracksHalf;
+    }
 }

Modified: java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/TrackingMonitoring.java
 =============================================================================
--- java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/TrackingMonitoring.java	(original)
+++ java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/TrackingMonitoring.java	Mon May 11 09:36:24 2015
@@ -5,11 +5,13 @@
 import hep.aida.IFitter;
 import hep.aida.IHistogram1D;
 import hep.aida.IHistogram2D;
+import hep.physics.vec.Hep3Vector;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import org.hps.recon.ecal.triggerbank.AbstractIntData;
 import org.hps.recon.ecal.triggerbank.TIData;
+import org.hps.recon.tracking.TrackUtils;
 import org.lcsim.detector.tracker.silicon.HpsSiSensor;
 import org.lcsim.event.EventHeader;
 import org.lcsim.event.GenericObject;
@@ -65,6 +67,9 @@
     IHistogram2D[] xvsyTop = new IHistogram2D[nmodules];
     IHistogram2D[] xvsyBot = new IHistogram2D[nmodules];
 
+    IHistogram1D trkYAtECALTop;
+    IHistogram1D trkYAtECALBot;
+
     IHistogram1D trkChi2Pos;
     IHistogram1D trkChi2Ele;
     IHistogram1D trkChi2Top;
@@ -118,18 +123,20 @@
         this.detector = detector;
         aida.tree().cd("/");
 
-        IHistogram1D trkChi2 = aida.histogram1D(plotDir + triggerType + "/" + "Track Chi2", 25, 0, 25.0);
-        IHistogram1D nTracks = aida.histogram1D(plotDir + triggerType + "/" + "Tracks per Event", 6, 0, 6);
-        IHistogram1D trkd0 = aida.histogram1D(plotDir + triggerType + "/" + "d0 ", 25, -5.0, 5.0);
-        IHistogram1D trkphi = aida.histogram1D(plotDir + triggerType + "/" + "sinphi ", 25, -0.2, 0.2);
-        IHistogram1D trkomega = aida.histogram1D(plotDir + triggerType + "/" + "omega ", 25, -0.0005, 0.0005);
-        IHistogram1D trklam = aida.histogram1D(plotDir + triggerType + "/" + "tan(lambda) ", 25, -0.1, 0.1);
-        IHistogram1D trkz0 = aida.histogram1D(plotDir + triggerType + "/" + "z0 ", 25, -1.0, 1.0);
-        IHistogram1D nHits = aida.histogram1D(plotDir + triggerType + "/" + "Hits per Track", 2, 5, 7);
-        IHistogram1D trackMeanTime = aida.histogram1D(plotDir + triggerType + "/" + "Mean time of hits on track", 100, -10., 100.);
-        IHistogram1D trackRMSTime = aida.histogram1D(plotDir + triggerType + "/" + "RMS time of hits on track", 100, 0., 15.);
-        IHistogram2D trackChi2RMSTime = aida.histogram2D(plotDir + triggerType + "/" + "Track chi2 vs. RMS time of hits", 100, 0., 15., 25, 0, 25.0);
-        IHistogram1D seedRMSTime = aida.histogram1D(plotDir + triggerType + "/" + "RMS time of hits on seed layers", 100, 0., 15.);
+        IHistogram1D trkChi2 = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "Track Chi2", 25, 0, 25.0);
+        IHistogram1D nTracks = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "Tracks per Event", 6, 0, 6);
+        IHistogram1D trkd0 = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "d0 ", 25, -5.0, 5.0);
+        IHistogram1D trkphi = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "sinphi ", 25, -0.2, 0.2);
+        IHistogram1D trkomega = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "omega ", 25, -0.0005, 0.0005);
+        IHistogram1D trklam = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "tan(lambda) ", 25, -0.1, 0.1);
+        IHistogram1D trkz0 = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "z0 ", 25, -1.0, 1.0);
+        IHistogram1D nHits = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "Hits per Track", 4, 3, 7);
+        IHistogram1D trackMeanTime = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "Mean time of hits on track", 100, -10., 100.);
+        IHistogram1D trackRMSTime = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "RMS time of hits on track", 100, 0., 15.);
+        IHistogram2D trackChi2RMSTime = aida.histogram2D(plotDir + trackCollectionName + "/" + triggerType + "/" + "Track chi2 vs. RMS time of hits", 100, 0., 15., 25, 0, 25.0);
+        IHistogram1D seedRMSTime = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "RMS time of hits on seed layers", 100, 0., 15.);
+        trkYAtECALTop = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "Track Y at ECAL: Top", 100, 0, 100);
+        trkYAtECALBot = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "Track Y at ECAL: Bot", 100, 0, 100);
         for (int i = 1; i <= nmodules; i++) {
             xvsyTop[i - 1] = aida.histogram2D(hthplotDir + "Module " + i + " Top", 50, -100, 100, 50, 0, 40);
             xvsyBot[i - 1] = aida.histogram2D(hthplotDir + "Module " + i + " Bottom", 50, -100, 100, 50, 0, 40);
@@ -137,41 +144,41 @@
             hthBot[i - 1] = aida.histogram1D(hthplotDir + "Module " + i + "Bot: Track Hits", 25, 0, 25);
         }
 
-        trkChi2Pos = aida.histogram1D(plotDir + triggerType + "/" + positronDir + "Track Chi2", 25, 0, 25.0);
-        nTracksPos = aida.histogram1D(plotDir + triggerType + "/" + positronDir + "Tracks per Event", 6, 0, 6);
-        trkd0Pos = aida.histogram1D(plotDir + triggerType + "/" + positronDir + "d0 ", 25, -5.0, 5.0);
-        trkphiPos = aida.histogram1D(plotDir + triggerType + "/" + positronDir + "sinphi ", 25, -0.2, 0.2);
-        trkomegaPos = aida.histogram1D(plotDir + triggerType + "/" + positronDir + "omega ", 25, -0.0005, 0.0005);
-        trklamPos = aida.histogram1D(plotDir + triggerType + "/" + positronDir + "tan(lambda) ", 25, -0.1, 0.1);
-        trkz0Pos = aida.histogram1D(plotDir + triggerType + "/" + positronDir + "z0 ", 25, -1.0, 1.0);
-        nHitsPos = aida.histogram1D(plotDir + triggerType + "/" + positronDir + "Hits per Track", 2, 5, 7);
-
-        trkChi2Ele = aida.histogram1D(plotDir + triggerType + "/" + electronDir + "Track Chi2", 25, 0, 25.0);
-        nTracksEle = aida.histogram1D(plotDir + triggerType + "/" + electronDir + "Tracks per Event", 6, 0, 6);
-        trkd0Ele = aida.histogram1D(plotDir + triggerType + "/" + electronDir + "d0 ", 25, -5.0, 5.0);
-        trkphiEle = aida.histogram1D(plotDir + triggerType + "/" + electronDir + "sinphi ", 25, -0.2, 0.2);
-        trkomegaEle = aida.histogram1D(plotDir + triggerType + "/" + electronDir + "omega ", 25, -0.0005, 0.0005);
-        trklamEle = aida.histogram1D(plotDir + triggerType + "/" + electronDir + "tan(lambda) ", 25, -0.1, 0.1);
-        trkz0Ele = aida.histogram1D(plotDir + triggerType + "/" + electronDir + "z0 ", 25, -1.0, 1.0);
-        nHitsEle = aida.histogram1D(plotDir + triggerType + "/" + electronDir + "Hits per Track", 2, 5, 7);
-
-        trkChi2Top = aida.histogram1D(plotDir + triggerType + "/" + topDir + "Track Chi2", 25, 0, 25.0);
-        nTracksTop = aida.histogram1D(plotDir + triggerType + "/" + topDir + "Tracks per Event", 6, 0, 6);
-        trkd0Top = aida.histogram1D(plotDir + triggerType + "/" + topDir + "d0 ", 25, -5.0, 5.0);
-        trkphiTop = aida.histogram1D(plotDir + triggerType + "/" + topDir + "sinphi ", 25, -0.2, 0.2);
-        trkomegaTop = aida.histogram1D(plotDir + triggerType + "/" + topDir + "omega ", 25, -0.0005, 0.0005);
-        trklamTop = aida.histogram1D(plotDir + triggerType + "/" + topDir + "tan(lambda) ", 25, -0.1, 0.1);
-        trkz0Top = aida.histogram1D(plotDir + triggerType + "/" + topDir + "z0 ", 25, -1.0, 1.0);
-        nHitsTop = aida.histogram1D(plotDir + triggerType + "/" + topDir + "Hits per Track", 2, 5, 7);
-
-        trkChi2Bot = aida.histogram1D(plotDir + triggerType + "/" + botDir + "Track Chi2", 25, 0, 25.0);
-        nTracksBot = aida.histogram1D(plotDir + triggerType + "/" + botDir + "Tracks per Event", 6, 0, 6);
-        trkd0Bot = aida.histogram1D(plotDir + triggerType + "/" + botDir + "d0 ", 25, -5.0, 5.0);
-        trkphiBot = aida.histogram1D(plotDir + triggerType + "/" + botDir + "sinphi ", 25, -0.2, 0.2);
-        trkomegaBot = aida.histogram1D(plotDir + triggerType + "/" + botDir + "omega ", 25, -0.0005, 0.0005);
-        trklamBot = aida.histogram1D(plotDir + triggerType + "/" + botDir + "tan(lambda) ", 25, -0.1, 0.1);
-        trkz0Bot = aida.histogram1D(plotDir + triggerType + "/" + botDir + "z0 ", 25, -1.0, 1.0);
-        nHitsBot = aida.histogram1D(plotDir + triggerType + "/" + botDir + "Hits per Track", 2, 5, 7);
+        trkChi2Pos = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + positronDir + "Track Chi2", 25, 0, 25.0);
+        nTracksPos = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + positronDir + "Tracks per Event", 6, 0, 6);
+        trkd0Pos = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + positronDir + "d0 ", 25, -5.0, 5.0);
+        trkphiPos = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + positronDir + "sinphi ", 25, -0.2, 0.2);
+        trkomegaPos = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + positronDir + "omega ", 25, -0.0005, 0.0005);
+        trklamPos = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + positronDir + "tan(lambda) ", 25, -0.1, 0.1);
+        trkz0Pos = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + positronDir + "z0 ", 25, -1.0, 1.0);
+        nHitsPos = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + positronDir + "Hits per Track", 4, 3, 7);
+
+        trkChi2Ele = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + electronDir + "Track Chi2", 25, 0, 25.0);
+        nTracksEle = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + electronDir + "Tracks per Event", 6, 0, 6);
+        trkd0Ele = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + electronDir + "d0 ", 25, -5.0, 5.0);
+        trkphiEle = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + electronDir + "sinphi ", 25, -0.2, 0.2);
+        trkomegaEle = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + electronDir + "omega ", 25, -0.0005, 0.0005);
+        trklamEle = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + electronDir + "tan(lambda) ", 25, -0.1, 0.1);
+        trkz0Ele = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + electronDir + "z0 ", 25, -1.0, 1.0);
+        nHitsEle = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + electronDir + "Hits per Track", 4, 3, 7);
+
+        trkChi2Top = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + topDir + "Track Chi2", 25, 0, 25.0);
+        nTracksTop = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + topDir + "Tracks per Event", 6, 0, 6);
+        trkd0Top = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + topDir + "d0 ", 25, -5.0, 5.0);
+        trkphiTop = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + topDir + "sinphi ", 25, -0.2, 0.2);
+        trkomegaTop = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + topDir + "omega ", 25, -0.0005, 0.0005);
+        trklamTop = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + topDir + "tan(lambda) ", 50, 0.0, 0.1);
+        trkz0Top = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + topDir + "z0 ", 25, -1.0, 1.0);
+        nHitsTop = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + topDir + "Hits per Track", 4, 3, 7);
+
+        trkChi2Bot = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + botDir + "Track Chi2", 25, 0, 25.0);
+        nTracksBot = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + botDir + "Tracks per Event", 6, 0, 6);
+        trkd0Bot = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + botDir + "d0 ", 25, -5.0, 5.0);
+        trkphiBot = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + botDir + "sinphi ", 25, -0.2, 0.2);
+        trkomegaBot = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + botDir + "omega ", 25, -0.0005, 0.0005);
+        trklamBot = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + botDir + "tan(lambda) ", 50, 0, 0.1);
+        trkz0Bot = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + botDir + "z0 ", 25, -1.0, 1.0);
+        nHitsBot = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + botDir + "Hits per Track", 4, 3, 7);
 
         // Make a list of SiSensors in the SVT.
         sensors = this.detector.getSubdetector(trackerName).getDetectorElement().findDescendants(HpsSiSensor.class);
@@ -190,99 +197,97 @@
 
         aida.tree().cd("/");
 
-        if (!event.hasCollection(LCRelation.class, helicalTrackHitRelationsCollectionName) || !event.hasCollection(LCRelation.class, rotatedHelicalTrackHitRelationsCollectionName)) {
+        if (!event.hasCollection(LCRelation.class, helicalTrackHitRelationsCollectionName) || !event.hasCollection(LCRelation.class, rotatedHelicalTrackHitRelationsCollectionName))
             return;
-        }
         RelationalTable hittostrip = new BaseRelationalTable(RelationalTable.Mode.MANY_TO_MANY, RelationalTable.Weighting.UNWEIGHTED);
         List<LCRelation> hitrelations = event.get(LCRelation.class, helicalTrackHitRelationsCollectionName);
-        for (LCRelation relation : hitrelations) {
-            if (relation != null && relation.getFrom() != null && relation.getTo() != null) {
+        for (LCRelation relation : hitrelations)
+            if (relation != null && relation.getFrom() != null && relation.getTo() != null)
                 hittostrip.add(relation.getFrom(), relation.getTo());
-            }
-        }
 
         RelationalTable hittorotated = new BaseRelationalTable(RelationalTable.Mode.ONE_TO_ONE, RelationalTable.Weighting.UNWEIGHTED);
         List<LCRelation> rotaterelations = event.get(LCRelation.class, rotatedHelicalTrackHitRelationsCollectionName);
-        for (LCRelation relation : rotaterelations) {
-            if (relation != null && relation.getFrom() != null && relation.getTo() != null) {
+        for (LCRelation relation : rotaterelations)
+            if (relation != null && relation.getFrom() != null && relation.getTo() != null)
                 hittorotated.add(relation.getFrom(), relation.getTo());
-            }
-        }
-
-        if (!event.hasCollection(TrackerHit.class, helicalTrackHitCollectionName)) {
+
+        if (!event.hasCollection(TrackerHit.class, helicalTrackHitCollectionName))
             return;
-        }
 
         if (event.hasCollection(GenericObject.class, "TriggerBank")) {
             List<GenericObject> triggerList = event.get(GenericObject.class, "TriggerBank");
-            for (GenericObject data : triggerList) {
+            for (GenericObject data : triggerList)
                 if (AbstractIntData.getTag(data) == TIData.BANK_TAG) {
                     TIData triggerData = new TIData(data);
                     if (!matchTriggerType(triggerData))//only process singles0 triggers...
-                    {
+
                         return;
-                    }
                 }
-            }
-        } else {
+        } else if (debug)
             System.out.println(this.getClass().getSimpleName() + ":  No trigger bank found...running over all trigger types");
-        }
-
-        int[] topHits = {0, 0, 0, 0, 0, 0};
-        int[] botHits = {0, 0, 0, 0, 0, 0};
-        List<TrackerHit> hth = event.get(TrackerHit.class, helicalTrackHitCollectionName);
-        for (TrackerHit hit : hth) {
-            int module = -99;
-            int layer = ((RawTrackerHit) hit.getRawHits().get(0)).getLayerNumber();
-            if (layer < 2) {
-                module = 1;
-            } else if (layer < 4) {
-                module = 2;
-            } else if (layer < 6) {
-                module = 3;
-            } else if (layer < 8) {
-                module = 4;
-            } else if (layer < 10) {
-                module = 5;
-            } else {
-                module = 6;
-            }
-
-            if (hit.getPosition()[1] > 0) {
-                topHits[module - 1]++;
-                xvsyTop[module - 1].fill(hit.getPosition()[0], hit.getPosition()[1]);
-            } else {
-                botHits[module - 1]++;
-                xvsyBot[module - 1].fill(hit.getPosition()[0], Math.abs(hit.getPosition()[1]));
-            }
-        }
-
-        for (int i = 0; i < nmodules; i++) {
-            hthTop[i].fill(topHits[i]);
-            hthBot[i].fill(botHits[i]);
-        }
-
+        /*  This doesn't work on reco'ed files...fix me!
+         int[] topHits = {0, 0, 0, 0, 0, 0};
+         int[] botHits = {0, 0, 0, 0, 0, 0};
+         List<TrackerHit> hth = event.get(TrackerHit.class, helicalTrackHitCollectionName);
+         for (TrackerHit hit : hth) {           
+         int module = -99;
+         int layer = ((RawTrackerHit) hit.getRawHits().get(0)).getLayerNumber();
+         if (layer < 2) {
+         module = 1;
+         } else if (layer < 4) {
+         module = 2;
+         } else if (layer < 6) {
+         module = 3;
+         } else if (layer < 8) {
+         module = 4;
+         } else if (layer < 10) {
+         module = 5;
+         } else {
+         module = 6;
+         }
+
+         if (hit.getPosition()[1] > 0) {
+         topHits[module - 1]++;
+         xvsyTop[module - 1].fill(hit.getPosition()[0], hit.getPosition()[1]);
+         } else {
+         botHits[module - 1]++;
+         xvsyBot[module - 1].fill(hit.getPosition()[0], Math.abs(hit.getPosition()[1]));
+         }
+         }
+
+         for (int i = 0; i < nmodules; i++) {
+         hthTop[i].fill(topHits[i]);
+         hthBot[i].fill(botHits[i]);
+         }
+         */
         if (!event.hasCollection(Track.class, trackCollectionName)) {
-            aida.histogram1D(plotDir + triggerType + "/" + "Tracks per Event").fill(0);
+            aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "Tracks per Event").fill(0);
             return;
         }
         nEvents++;
         List<Track> tracks = event.get(Track.class, trackCollectionName);
         nTotTracks += tracks.size();
-        aida.histogram1D(plotDir + triggerType + "/" + "Tracks per Event").fill(tracks.size());
+        aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "Tracks per Event").fill(tracks.size());
         int cntEle = 0;
         int cntPos = 0;
         int cntTop = 0;
         int cntBot = 0;
+        double ecalFace = 1393.0;//mm
         for (Track trk : tracks) {
+            Hep3Vector trackPosAtEcalFace = TrackUtils.extrapolateTrack(trk, ecalFace);
+            double yAtECal = trackPosAtEcalFace.y();
+            if (yAtECal > 0)
+                trkYAtECALTop.fill(yAtECal);
+            else
+                trkYAtECALBot.fill(Math.abs(yAtECal));
             nTotHits += trk.getTrackerHits().size();
-            aida.histogram1D(plotDir + triggerType + "/" + "Track Chi2").fill(trk.getChi2());
-            aida.histogram1D(plotDir + triggerType + "/" + "Hits per Track").fill(trk.getTrackerHits().size());
-            aida.histogram1D(plotDir + triggerType + "/" + "d0 ").fill(trk.getTrackStates().get(0).getD0());
-            aida.histogram1D(plotDir + triggerType + "/" + "sinphi ").fill(Math.sin(trk.getTrackStates().get(0).getPhi()));
-            aida.histogram1D(plotDir + triggerType + "/" + "omega ").fill(trk.getTrackStates().get(0).getOmega());
-            aida.histogram1D(plotDir + triggerType + "/" + "tan(lambda) ").fill(trk.getTrackStates().get(0).getTanLambda());
-            aida.histogram1D(plotDir + triggerType + "/" + "z0 ").fill(trk.getTrackStates().get(0).getZ0());
+            aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "Track Chi2").fill(trk.getChi2());
+            aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "Hits per Track").fill(trk.getTrackerHits().size());
+            aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "d0 ").fill(trk.getTrackStates().get(0).getD0());
+            aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "sinphi ").fill(Math.sin(trk.getTrackStates().get(0).getPhi()));
+            aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "omega ").fill(trk.getTrackStates().get(0).getOmega());
+            aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "tan(lambda) ").fill(trk.getTrackStates().get(0).getTanLambda());
+            aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "z0 ").fill(trk.getTrackStates().get(0).getZ0());
             if (trk.getTrackStates().get(0).getOmega() < 0) {//positrons
                 trkChi2Pos.fill(trk.getChi2());
                 nHitsPos.fill(trk.getTrackerHits().size());
@@ -309,7 +314,7 @@
                 trkd0Bot.fill(trk.getTrackStates().get(0).getD0());
                 trkphiBot.fill(Math.sin(trk.getTrackStates().get(0).getPhi()));
                 trkomegaBot.fill(trk.getTrackStates().get(0).getOmega());
-                trklamBot.fill(trk.getTrackStates().get(0).getTanLambda());
+                trklamBot.fill(Math.abs(trk.getTrackStates().get(0).getTanLambda()));
                 trkz0Bot.fill(trk.getTrackStates().get(0).getZ0());
                 cntBot++;
             } else {
@@ -318,7 +323,7 @@
                 trkd0Top.fill(trk.getTrackStates().get(0).getD0());
                 trkphiTop.fill(Math.sin(trk.getTrackStates().get(0).getPhi()));
                 trkomegaTop.fill(trk.getTrackStates().get(0).getOmega());
-                trklamTop.fill(trk.getTrackStates().get(0).getTanLambda());
+                trklamTop.fill(Math.abs(trk.getTrackStates().get(0).getTanLambda()));
                 trkz0Top.fill(trk.getTrackStates().get(0).getZ0());
                 cntTop++;
             }
@@ -327,48 +332,49 @@
             sumz0 += trk.getTrackStates().get(0).getZ0();
             sumslope += Math.abs(trk.getTrackStates().get(0).getTanLambda());
             sumchisq += trk.getChi2();
-
-            int nStrips = 0;
-            int nSeedStrips = 0;
-            double meanTime = 0;
-            double meanSeedTime = 0;
-            for (TrackerHit hit : trk.getTrackerHits()) {
-                Collection<TrackerHit> htsList = hittostrip.allFrom(hittorotated.from(hit));
-                for (TrackerHit hts : htsList) {
-                    nStrips++;
-                    meanTime += hts.getTime();
-                    int layer = ((HpsSiSensor) ((RawTrackerHit) hts.getRawHits().get(0)).getDetectorElement()).getLayerNumber();
-                    if (layer <= 6) {
-                        nSeedStrips++;
-                        meanSeedTime += hts.getTime();
-                    }
-                }
-            }
-            meanTime /= nStrips;
-            meanSeedTime /= nSeedStrips;
-
-            double rmsTime = 0;
-            double rmsSeedTime = 0;
-            for (TrackerHit hit : trk.getTrackerHits()) {
-                Collection<TrackerHit> htsList = hittostrip.allFrom(hittorotated.from(hit));
-                for (TrackerHit hts : htsList) {
-                    rmsTime += Math.pow(hts.getTime() - meanTime, 2);
-                    HpsSiSensor sensor = (HpsSiSensor) ((RawTrackerHit) hts.getRawHits().get(0)).getDetectorElement();
-                    int layer = sensor.getLayerNumber();
-                    if (layer <= 6) {
-                        rmsSeedTime += Math.pow(hts.getTime() - meanSeedTime, 2);
-                    }
-                    String sensorName = getNiceSensorName(sensor);
-                    getSensorPlot(plotDir + "hitTimeResidual_", sensorName).fill((hts.getTime() - meanTime) * nStrips / (nStrips - 1)); //correct residual for bias
-                }
-            }
-            rmsTime = Math.sqrt(rmsTime / nStrips);
-            aida.histogram1D(plotDir + triggerType + "/" + "Mean time of hits on track").fill(meanTime);
-            aida.histogram1D(plotDir + triggerType + "/" + "RMS time of hits on track").fill(rmsTime);
-            aida.histogram2D(plotDir + triggerType + "/" + "Track chi2 vs. RMS time of hits").fill(rmsTime, trk.getChi2());
-
-            rmsSeedTime = Math.sqrt(rmsSeedTime / nSeedStrips);
-            aida.histogram1D(plotDir + triggerType + "/" + "RMS time of hits on seed layers").fill(rmsSeedTime);
+//below does not work on recon'ed files            
+//
+//            int nStrips = 0;
+//            int nSeedStrips = 0;
+//            double meanTime = 0;
+//            double meanSeedTime = 0;
+//            for (TrackerHit hit : trk.getTrackerHits()) {
+//                Collection<TrackerHit> htsList = hittostrip.allFrom(hittorotated.from(hit));
+//                for (TrackerHit hts : htsList) {
+//                    nStrips++;
+//                    meanTime += hts.getTime();
+//                    int layer = ((HpsSiSensor) ((RawTrackerHit) hts.getRawHits().get(0)).getDetectorElement()).getLayerNumber();
+//                    if (layer <= 6) {
+//                        nSeedStrips++;
+//                        meanSeedTime += hts.getTime();
+//                    }
+//                }
+//            }
+//            meanTime /= nStrips;
+//            meanSeedTime /= nSeedStrips;
+//
+//            double rmsTime = 0;
+//            double rmsSeedTime = 0;
+//            for (TrackerHit hit : trk.getTrackerHits()) {
+//                Collection<TrackerHit> htsList = hittostrip.allFrom(hittorotated.from(hit));
+//                for (TrackerHit hts : htsList) {
+//                    rmsTime += Math.pow(hts.getTime() - meanTime, 2);
+//                    HpsSiSensor sensor = (HpsSiSensor) ((RawTrackerHit) hts.getRawHits().get(0)).getDetectorElement();
+//                    int layer = sensor.getLayerNumber();
+//                    if (layer <= 6) {
+//                        rmsSeedTime += Math.pow(hts.getTime() - meanSeedTime, 2);
+//                    }
+//                    String sensorName = getNiceSensorName(sensor);
+//                    getSensorPlot(plotDir + "hitTimeResidual_", sensorName).fill((hts.getTime() - meanTime) * nStrips / (nStrips - 1)); //correct residual for bias
+//                }
+//            }
+//            rmsTime = Math.sqrt(rmsTime / nStrips);
+//            aida.histogram1D(plotDir + trackCollectionName+ "/"+ triggerType + "/" + "Mean time of hits on track").fill(meanTime);
+//            aida.histogram1D(plotDir + trackCollectionName+ "/"+ triggerType + "/" + "RMS time of hits on track").fill(rmsTime);
+//            aida.histogram2D(plotDir + trackCollectionName+ "/"+ triggerType + "/" + "Track chi2 vs. RMS time of hits").fill(rmsTime, trk.getChi2());
+//
+//            rmsSeedTime = Math.sqrt(rmsSeedTime / nSeedStrips);
+//            aida.histogram1D(plotDir + trackCollectionName+ "/"+ triggerType + "/" + "RMS time of hits on seed layers").fill(rmsSeedTime);
 
 //            System.out.format("%d seed strips, RMS time %f\n", nSeedStrips, rmsSeedTime);
 //            System.out.format("%d strips, mean time %f, RMS time %f\n", nStrips, meanTime, rmsTime);
@@ -388,7 +394,7 @@
             //IHistogram1D occupancyPlot = aida.histogram1D(sensor.getName().replaceAll("Tracker_TestRunModule_", ""), 640, 0, 639);
             IHistogram1D hitTimeResidual = getSensorPlot(plotDir + "hitTimeResidual_", getNiceSensorName(sensor));
             IFitResult result = fitGaussian(hitTimeResidual, fitter, "range=\"(-20.0,20.0)\"");
-            System.out.format("%s\t%f\t%f\t%d\t%d\n",getNiceSensorName(sensor), result.fittedParameters()[1], result.fittedParameters()[2], sensor.getFebID(), sensor.getFebHybridID());
+            System.out.format("%s\t%f\t%f\t%d\t%d\n", getNiceSensorName(sensor), result.fittedParameters()[1], result.fittedParameters()[2], sensor.getFebID(), sensor.getFebHybridID());
         }
 
         monitoredQuantityMap.put(trackingQuantNames[0], (double) nTotTracks / nEvents);
@@ -415,17 +421,15 @@
     @Override
     public void printDQMData() {
         System.out.println("ReconMonitoring::printDQMData");
-        for (Map.Entry<String, Double> entry : monitoredQuantityMap.entrySet()) {
+        for (Map.Entry<String, Double> entry : monitoredQuantityMap.entrySet())
             System.out.println(entry.getKey() + " = " + entry.getValue());
-        }
         System.out.println("*******************************");
     }
 
     @Override
     public void printDQMStrings() {
-        for (Map.Entry<String, Double> entry : monitoredQuantityMap.entrySet()) {
+        for (Map.Entry<String, Double> entry : monitoredQuantityMap.entrySet())
             System.out.println("ALTER TABLE dqm ADD " + entry.getKey() + " double;");
-        }
     }
 
     private IHistogram1D getSensorPlot(String prefix, HpsSiSensor sensor) {

Modified: java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/V0Monitoring.java
 =============================================================================
--- java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/V0Monitoring.java	(original)
+++ java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/V0Monitoring.java	Mon May 11 09:36:24 2015
@@ -41,6 +41,7 @@
     //some counters
     int nRecoEvents = 0;
     int nTotV0 = 0;
+    int nTot2Ele = 0;
     //some summers
     double sumMass = 0.0;
     double sumVx = 0.0;
@@ -49,17 +50,31 @@
     double sumChi2 = 0.0;
 
     IHistogram2D pEleVspPos;
+    IHistogram2D pEleVspPosWithCut;
     IHistogram2D pyEleVspyPos;
     IHistogram2D pxEleVspxPos;
+    IHistogram2D pEleVspEle;
+    IHistogram2D pyEleVspyEle;
+    IHistogram2D pxEleVspxEle;
     IHistogram2D massVsVtxZ;
+    IHistogram2D VtxYVsVtxZ;
+    IHistogram2D VtxXVsVtxZ;
+    IHistogram2D VtxXVsVtxY;
+
+    IHistogram1D sumChargeHisto;
+    IHistogram1D numChargeHisto;
 
     boolean debug = false;
     private String plotDir = "V0Monitoring/";
 
-      double beamEnergy = 1.05; //GeV
-    double maxFactor = 1.5;
+    double beamEnergy = 1.05; //GeV
+    double maxFactor = 1.25;
     double feeMomentumCut = 0.8; //GeV
-    
+
+    double v0ESumMinCut = 0.8 * beamEnergy;
+     double v0ESumMaxCut = 1.1 * beamEnergy;
+    double v0MaxPCut = 1.1;//GeV
+
     @Override
     protected void detectorChanged(Detector detector) {
         System.out.println("V0Monitoring::detectorChanged  Setting up the plotter");
@@ -87,11 +102,19 @@
         IHistogram1D tarconVy = aida.histogram1D(plotDir + triggerType + "/" + "Target Constrained Vy (mm)", 50, -1, 1);
         IHistogram1D tarconVz = aida.histogram1D(plotDir + triggerType + "/" + "Target Constrained Vz (mm)", 50, -10, 10);
         IHistogram1D tarconChi2 = aida.histogram1D(plotDir + triggerType + "/" + "Target Constrained Chi2", 25, 0, 25);
-        pEleVspPos = aida.histogram2D(plotDir + triggerType + "/" + "P(e) vs P(p)", 50, 0, beamEnergy * maxFactor, 50, 0,beamEnergy * maxFactor);
+        pEleVspPos = aida.histogram2D(plotDir + triggerType + "/" + "P(e) vs P(p)", 50, 0, beamEnergy * maxFactor, 50, 0, beamEnergy * maxFactor);
+        pEleVspPosWithCut = aida.histogram2D(plotDir + triggerType + "/" + "P(e) vs P(p): Radiative", 50, 0, beamEnergy * maxFactor, 50, 0, beamEnergy * maxFactor);
         pyEleVspyPos = aida.histogram2D(plotDir + triggerType + "/" + "Py(e) vs Py(p)", 50, -0.1, 0.1, 50, -0.1, 0.1);
         pxEleVspxPos = aida.histogram2D(plotDir + triggerType + "/" + "Px(e) vs Px(p)", 50, -0.1, 0.1, 50, -0.1, 0.1);
-        massVsVtxZ = aida.histogram2D(plotDir + triggerType + "/" + "Mass vs Vz", 50, 0, 0.15, 50, -50, 50);
-
+        massVsVtxZ = aida.histogram2D(plotDir + triggerType + "/" + "Mass vs Vz", 50, 0, 0.15, 50, -50, 80);
+        VtxXVsVtxZ = aida.histogram2D(plotDir + triggerType + "/" + "Vx vs Vz", 100, -10, 10, 100, -50, 80);
+        VtxYVsVtxZ = aida.histogram2D(plotDir + triggerType + "/" + "Vy vs Vz", 100, -5, 5, 100, -50, 80);
+        VtxXVsVtxY = aida.histogram2D(plotDir + triggerType + "/" + "Vx vs Vy", 100, -10, 10, 100, -5, 5);
+        pEleVspEle = aida.histogram2D(plotDir + triggerType + "/" + "2 Electron: P(e) vs P(p)", 50, 0, beamEnergy * maxFactor, 50, 0, beamEnergy * maxFactor);
+        pyEleVspyEle = aida.histogram2D(plotDir + triggerType + "/" + "2 Electron:Py(e) vs Py(p)", 50, -0.1, 0.1, 50, -0.1, 0.1);
+        pxEleVspxEle = aida.histogram2D(plotDir + triggerType + "/" + "2 Electron:Px(e) vs Px(p)", 50, -0.1, 0.1, 50, -0.1, 0.1);
+        sumChargeHisto = aida.histogram1D(plotDir + triggerType + "/" + "Total Charge of  Event", 5, -2, 3);
+        numChargeHisto = aida.histogram1D(plotDir + triggerType + "/" + "Number of Charged Particles", 6, 0, 6);
     }
 
     @Override
@@ -114,7 +137,7 @@
                     if (!matchTriggerType(triggerData))//only process singles0 triggers...
                         return;
                 }
-        } else
+        } else if (debug)
             System.out.println(this.getClass().getSimpleName() + ":  No trigger bank found...running over all trigger types");
 
         nRecoEvents++;
@@ -129,20 +152,37 @@
             aida.histogram1D(plotDir + triggerType + "/" + "Unconstrained Chi2").fill(uncVert.getChi2());
 
             aida.histogram2D(plotDir + triggerType + "/" + "Mass vs Vz").fill(uncV0.getMass(), uncVert.getPosition().z());
+            VtxXVsVtxZ.fill(uncVert.getPosition().x(), uncVert.getPosition().z());
+            VtxYVsVtxZ.fill(uncVert.getPosition().y(), uncVert.getPosition().z());
+            VtxXVsVtxY.fill(uncVert.getPosition().x(), uncVert.getPosition().y());
+
             //this always has 2 tracks. 
             List<ReconstructedParticle> trks = uncV0.getParticles();
-            Track ele = trks.get(0).getTracks().get(0);
-            Track pos = trks.get(1).getTracks().get(0);
-            //if track #0 has charge>0 it's the electron!  This seems mixed up, but remember the track 
-            //charge is assigned assuming a positive B-field, while ours is negative
-            if (trks.get(0).getCharge() > 0) {
-                pos = trks.get(0).getTracks().get(0);
-                ele = trks.get(1).getTracks().get(0);
+//            Track ele = trks.get(0).getTracks().get(0);
+//            Track pos = trks.get(1).getTracks().get(0);
+//            //if track #0 has charge>0 it's the electron!  This seems mixed up, but remember the track 
+//            //charge is assigned assuming a positive B-field, while ours is negative
+//            if (trks.get(0).getCharge() > 0) {
+//                pos = trks.get(0).getTracks().get(0);
+//                ele = trks.get(1).getTracks().get(0);
+//            }
+//            aida.histogram2D(plotDir + triggerType + "/" + "P(e) vs P(p)").fill(getMomentum(ele), getMomentum(pos));
+//            aida.histogram2D(plotDir + triggerType + "/" + "Px(e) vs Px(p)").fill(ele.getTrackStates().get(0).getMomentum()[1], pos.getTrackStates().get(0).getMomentum()[1]);
+//            aida.histogram2D(plotDir + triggerType + "/" + "Py(e) vs Py(p)").fill(ele.getTrackStates().get(0).getMomentum()[2], pos.getTrackStates().get(0).getMomentum()[2]);
+            ReconstructedParticle ele = trks.get(0);
+            ReconstructedParticle pos = trks.get(1);
+            //ReconParticles have the charge correct. 
+            if (trks.get(0).getCharge() < 0) {
+                pos = trks.get(0);
+                ele = trks.get(1);
             }
-            aida.histogram2D(plotDir + triggerType + "/" + "P(e) vs P(p)").fill(getMomentum(ele), getMomentum(pos));
-            aida.histogram2D(plotDir + triggerType + "/" + "Px(e) vs Px(p)").fill(ele.getTrackStates().get(0).getMomentum()[1], pos.getTrackStates().get(0).getMomentum()[1]);
-            aida.histogram2D(plotDir + triggerType + "/" + "Py(e) vs Py(p)").fill(ele.getTrackStates().get(0).getMomentum()[2], pos.getTrackStates().get(0).getMomentum()[2]);
-
+            double pe = ele.getMomentum().magnitude();
+            double pp = pos.getMomentum().magnitude();
+            aida.histogram2D(plotDir + triggerType + "/" + "P(e) vs P(p)").fill(pe, pp);
+            aida.histogram2D(plotDir + triggerType + "/" + "Px(e) vs Px(p)").fill(ele.getMomentum().x(), pos.getMomentum().x());
+            aida.histogram2D(plotDir + triggerType + "/" + "Py(e) vs Py(p)").fill(ele.getMomentum().y(), pos.getMomentum().y());
+            if (pe < v0MaxPCut && pp < v0MaxPCut && (pe + pp) > v0ESumMinCut&&(pe + pp)<v0ESumMaxCut)//enrich radiative-like events
+                aida.histogram2D(plotDir + triggerType + "/" + "P(e) vs P(p): Radiative").fill(pe, pp);
         }
 
         List<ReconstructedParticle> beamConstrainedV0List = event.get(ReconstructedParticle.class, beamConV0CandidatesColName);
@@ -171,6 +211,36 @@
             aida.histogram1D(plotDir + triggerType + "/" + "Target Constrained Mass (GeV)").fill(tarV0.getMass());
             aida.histogram1D(plotDir + triggerType + "/" + "Target Constrained Chi2").fill(tarVert.getChi2());
         }
+        List<ReconstructedParticle> finalStateParticles = event.get(ReconstructedParticle.class, finalStateParticlesColName);
+        if (debug)
+            System.out.println("This events has " + finalStateParticles.size() + " final state particles");
+
+        ReconstructedParticle ele1 = null;
+        ReconstructedParticle ele2 = null;
+        int sumCharge = 0;
+        int numChargedParticles = 0;
+        for (ReconstructedParticle fsPart : finalStateParticles) {
+            if (debug)
+                System.out.println("PDGID = " + fsPart.getParticleIDUsed() + "; charge = " + fsPart.getCharge() + "; pz = " + fsPart.getMomentum().x());
+            double charge = fsPart.getCharge();
+            sumCharge += charge;
+            if (charge != 0) {
+                numChargedParticles++;
+                if (charge < 1)
+                    if (ele1 == null)
+                        ele1 = fsPart;
+                    else
+                        ele2 = fsPart;
+            }
+        }
+        sumChargeHisto.fill(sumCharge);
+        numChargeHisto.fill(numChargedParticles);
+
+        if (ele1 != null && ele2 != null) {
+            pEleVspEle.fill(ele1.getMomentum().magnitude(), ele2.getMomentum().magnitude());
+            pyEleVspyEle.fill(ele1.getMomentum().y(), ele2.getMomentum().y());
+            pxEleVspxEle.fill(ele1.getMomentum().x(), ele2.getMomentum().x());
+        }
     }
 
     @Override
@@ -200,44 +270,45 @@
         double[] init3 = {50.0, 0.0, 3.0, 1.0, 0.0};
         IFitResult resVz = fitVertexPosition(bsconVz, fitter, init3, "range=\"(-6,6)\"");
 
-        double[] parsVx = resVx.fittedParameters();
-        double[] parsVy = resVy.fittedParameters();
-        double[] parsVz = resVz.fittedParameters();
-
-        for (int i = 0; i < 5; i++)
-            System.out.println("Vertex Fit Parameters:  " + resVx.fittedParameterNames()[i] + " = " + parsVx[i] + "; " + parsVy[i] + "; " + parsVz[i]);
-
-        IPlotter plotter = analysisFactory.createPlotterFactory().create("Vertex Position");
-        plotter.createRegions(1, 3);
-        IPlotterStyle pstyle = plotter.style();
-        pstyle.legendBoxStyle().setVisible(false);
-        pstyle.dataStyle().fillStyle().setColor("green");
-        pstyle.dataStyle().lineStyle().setColor("black");
-        plotter.region(0).plot(bsconVx);
-        plotter.region(0).plot(resVx.fittedFunction());
-        plotter.region(1).plot(bsconVy);
-        plotter.region(1).plot(resVy.fittedFunction());
-        plotter.region(2).plot(bsconVz);
-        plotter.region(2).plot(resVz.fittedFunction());
-        if (outputPlots)
-            try {
-                plotter.writeToFile(outputPlotDir + "vertex.png");
-            } catch (IOException ex) {
-                Logger.getLogger(V0Monitoring.class.getName()).log(Level.SEVERE, null, ex);
-            }
-
-        monitoredQuantityMap.put(fpQuantNames[0], (double) nTotV0 / nRecoEvents);
-        monitoredQuantityMap.put(fpQuantNames[1], sumMass / nTotV0);
+        if (resVx != null && resVy != null & resVz != null) {
+            double[] parsVx = resVx.fittedParameters();
+            double[] parsVy = resVy.fittedParameters();
+            double[] parsVz = resVz.fittedParameters();
+
+            for (int i = 0; i < 5; i++)
+                System.out.println("Vertex Fit Parameters:  " + resVx.fittedParameterNames()[i] + " = " + parsVx[i] + "; " + parsVy[i] + "; " + parsVz[i]);
+
+            IPlotter plotter = analysisFactory.createPlotterFactory().create("Vertex Position");
+            plotter.createRegions(1, 3);
+            IPlotterStyle pstyle = plotter.style();
+            pstyle.legendBoxStyle().setVisible(false);
+            pstyle.dataStyle().fillStyle().setColor("green");
+            pstyle.dataStyle().lineStyle().setColor("black");
+            plotter.region(0).plot(bsconVx);
+            plotter.region(0).plot(resVx.fittedFunction());
+            plotter.region(1).plot(bsconVy);
+            plotter.region(1).plot(resVy.fittedFunction());
+            plotter.region(2).plot(bsconVz);
+            plotter.region(2).plot(resVz.fittedFunction());
+            if (outputPlots)
+                try {
+                    plotter.writeToFile(outputPlotDir + "vertex.png");
+                } catch (IOException ex) {
+                    Logger.getLogger(V0Monitoring.class.getName()).log(Level.SEVERE, null, ex);
+                }
+
 //        monitoredQuantityMap.put(fpQuantNames[2], sumVx / nTotV0);
 //        monitoredQuantityMap.put(fpQuantNames[3], sumVy / nTotV0);
 //        monitoredQuantityMap.put(fpQuantNames[4], sumVz / nTotV0);
-        monitoredQuantityMap.put(fpQuantNames[2], parsVx[1]);
-        monitoredQuantityMap.put(fpQuantNames[3], parsVy[1]);
-        monitoredQuantityMap.put(fpQuantNames[4], parsVz[1]);
-        monitoredQuantityMap.put(fpQuantNames[5], parsVx[2]);
-        monitoredQuantityMap.put(fpQuantNames[6], parsVy[2]);
-        monitoredQuantityMap.put(fpQuantNames[7], parsVz[2]);
-
+            monitoredQuantityMap.put(fpQuantNames[2], parsVx[1]);
+            monitoredQuantityMap.put(fpQuantNames[3], parsVy[1]);
+            monitoredQuantityMap.put(fpQuantNames[4], parsVz[1]);
+            monitoredQuantityMap.put(fpQuantNames[5], parsVx[2]);
+            monitoredQuantityMap.put(fpQuantNames[6], parsVy[2]);
+            monitoredQuantityMap.put(fpQuantNames[7], parsVz[2]);
+        }
+        monitoredQuantityMap.put(fpQuantNames[0], (double) nTotV0 / nRecoEvents);
+        monitoredQuantityMap.put(fpQuantNames[1], sumMass / nTotV0);
         monitoredQuantityMap.put(fpQuantNames[8], sumChi2 / nTotV0);
 
     }
@@ -248,8 +319,15 @@
             System.out.println("ALTER TABLE dqm ADD " + fpQuantNames[i] + " double;");
     }
 
-    IFitResult fitVertexPosition(IHistogram1D h1d, IFitter fitter, double[] init, String range) {
-        return fitter.fit(h1d, "g+p1", init, range);
+    IFitResult fitVertexPosition(IHistogram1D h1d, IFitter fitter, double[] init, String range
+    ) {
+        IFitResult ifr = null;
+        try {
+            ifr = fitter.fit(h1d, "g+p1", init, range);
+        } catch (RuntimeException ex) {
+            System.out.println(this.getClass().getSimpleName() + ":  caught exception in fitGaussian");
+        }
+        return ifr;
     }
 
     private double getMomentum(Track trk) {