LISTSERV mailing list manager LISTSERV 16.5

Help for HPS-SVN Archives


HPS-SVN Archives

HPS-SVN Archives


HPS-SVN@LISTSERV.SLAC.STANFORD.EDU


View:

Message:

[

First

|

Previous

|

Next

|

Last

]

By Topic:

[

First

|

Previous

|

Next

|

Last

]

By Author:

[

First

|

Previous

|

Next

|

Last

]

Font:

Proportional Font

LISTSERV Archives

LISTSERV Archives

HPS-SVN Home

HPS-SVN Home

HPS-SVN  December 2015

HPS-SVN December 2015

Subject:

r4031 - in /java/branches/jeremy-dev: ./ analysis/src/main/java/org/hps/analysis/dataquality/ crawler/src/main/java/org/hps/crawler/ ecal-recon/src/main/java/org/hps/recon/ecal/ ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ job/src/main/java/org/hps/job/ monitoring-app/src/main/java/org/hps/monitoring/application/util/ monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/ parent/ recon/src/main/java/org/hps/recon/filtering/ recon/src/main/java/org/hps/recon/particle/ recon/src/main/java/org/hps/recon/utils/ record-util/src/main/java/org/hps/record/daqconfig/ record-util/src/main/java/org/hps/record/epics/ record-util/src/main/java/org/hps/record/evio/ record-util/src/main/java/org/hps/record/triggerbank/ run-database/src/main/java/org/hps/run/database/ steering-files/src/main/resources/org/hps/steering/production/ steering-files/src/main/resources/org/hps/steering/recon/ steering-files/src/main/resources/org/hps/steering/users/phansson/ tracking/src/main/java/org/hps/recon/tracking/ tracking/src/main/java/org/hps/recon/tracking/gbl/ tracking/src/main/java/org/hps/recon/tracking/straight/ users/src/main/java/org/hps/users/holly/ users/src/main/java/org/hps/users/phansson/

From:

[log in to unmask]

Reply-To:

Notification of commits to the hps svn repository <[log in to unmask]>

Date:

Wed, 9 Dec 2015 04:48:59 -0000

Content-Type:

text/plain

Parts/Attachments:

Parts/Attachments

text/plain (3231 lines)

Author: [log in to unmask]
Date: Tue Dec  8 20:48:40 2015
New Revision: 4031

Log:
More dev branch work on run db and datacat plus other minor changes and improvements; merge in more trunk changes.

Added:
    java/branches/jeremy-dev/recon/src/main/java/org/hps/recon/filtering/SvtHitMultiplicityFilter.java
      - copied unchanged from r4021, java/trunk/recon/src/main/java/org/hps/recon/filtering/SvtHitMultiplicityFilter.java
    java/branches/jeremy-dev/steering-files/src/main/resources/org/hps/steering/production/FilterHitsPerSensor.lcsim
      - copied, changed from r4021, java/trunk/steering-files/src/main/resources/org/hps/steering/production/FilterHitsPerSensor.lcsim
    java/branches/jeremy-dev/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015STRecon.lcsim
      - copied, changed from r4021, java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015STRecon.lcsim
    java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/SvtPlotUtils.java
      - copied unchanged from r4021, java/trunk/tracking/src/main/java/org/hps/recon/tracking/SvtPlotUtils.java
    java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/straight/
      - copied from r4021, java/trunk/tracking/src/main/java/org/hps/recon/tracking/straight/
Removed:
    java/branches/jeremy-dev/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SvtPlotUtils.java
    java/branches/jeremy-dev/steering-files/src/main/resources/org/hps/steering/users/phansson/HitRecon.lcsim
    java/branches/jeremy-dev/users/src/main/java/org/hps/users/phansson/STUtils.java
    java/branches/jeremy-dev/users/src/main/java/org/hps/users/phansson/StraightThroughAnalysisDriver.java
Modified:
    java/branches/jeremy-dev/   (props changed)
    java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/dataquality/PlotAndFitUtilities.java
    java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/dataquality/SvtMonitoring.java
    java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/dataquality/TrackingMonitoring.java
    java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/dataquality/TrackingResiduals.java
    java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/dataquality/TridentMonitoring.java
    java/branches/jeremy-dev/crawler/src/main/java/org/hps/crawler/EvioMetadataReader.java
    java/branches/jeremy-dev/crawler/src/main/java/org/hps/crawler/FileSet.java
    java/branches/jeremy-dev/ecal-recon/src/main/java/org/hps/recon/ecal/EcalOnlineRawConverter.java
    java/branches/jeremy-dev/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverter.java
    java/branches/jeremy-dev/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ClusterPositionCorrection.java
    java/branches/jeremy-dev/job/src/main/java/org/hps/job/JobManager.java
    java/branches/jeremy-dev/monitoring-app/src/main/java/org/hps/monitoring/application/util/TableExporter.java
    java/branches/jeremy-dev/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/PedestalPlots.java
    java/branches/jeremy-dev/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SampleZeroHVBiasChecker.java
    java/branches/jeremy-dev/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SensorOccupancyPlotsDriver.java
    java/branches/jeremy-dev/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SvtClusterPlots.java
    java/branches/jeremy-dev/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SvtHitPlots.java
    java/branches/jeremy-dev/parent/pom.xml
    java/branches/jeremy-dev/recon/src/main/java/org/hps/recon/particle/ReconParticleDriver.java
    java/branches/jeremy-dev/recon/src/main/java/org/hps/recon/utils/TrackClusterMatcher.java
    java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/daqconfig/DAQConfig.java
    java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/daqconfig/FADCConfig.java
    java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/daqconfig/GTPConfig.java
    java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/daqconfig/IDAQConfig.java
    java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/daqconfig/SSPConfig.java
    java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/epics/EpicsData.java
    java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/epics/EpicsRunProcessor.java
    java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/evio/EvioFileSource.java
    java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/triggerbank/TriggerModule.java
    java/branches/jeremy-dev/run-database/src/main/java/org/hps/run/database/EpicsType.java
    java/branches/jeremy-dev/run-database/src/main/java/org/hps/run/database/EpicsVariable.java
    java/branches/jeremy-dev/run-database/src/main/java/org/hps/run/database/RunDatabaseBuilder.java
    java/branches/jeremy-dev/run-database/src/main/java/org/hps/run/database/RunManager.java
    java/branches/jeremy-dev/run-database/src/main/java/org/hps/run/database/RunSummaryDaoImpl.java
    java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/TrackDataDriver.java
    java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/TrackUtils.java
    java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLKinkData.java
    java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutput.java
    java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutputDriver.java
    java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLRefitterDriver.java
    java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/gbl/MakeGblTracks.java
    java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/straight/StraightThroughAnalysisDriver.java
    java/branches/jeremy-dev/users/src/main/java/org/hps/users/holly/EcalRawConverter.java

Modified: java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/dataquality/PlotAndFitUtilities.java
 =============================================================================
--- java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/dataquality/PlotAndFitUtilities.java	(original)
+++ java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/dataquality/PlotAndFitUtilities.java	Tue Dec  8 20:48:40 2015
@@ -19,6 +19,7 @@
 
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import org.lcsim.detector.tracker.silicon.HpsSiSensor;
 
 import org.lcsim.util.aida.AIDA;
 
@@ -29,7 +30,7 @@
 public class PlotAndFitUtilities {
 
     private static Logger LOGGER = Logger.getLogger(PlotAndFitUtilities.class.getPackage().getName());
-    
+
     static private AIDA aida = AIDA.defaultInstance();
 
     /*
@@ -37,13 +38,15 @@
      *  copied from org.hps.monitoring.drivers.ecal.EcalMonitoringUtilities.java
      */
     static IPlotter plot(IPlotterFactory plotterFactory, IBaseHistogram histogram, IPlotterStyle style, boolean show) {
-        if (style == null)
+        if (style == null) {
             style = getPlotterStyle(histogram);
+        }
         IPlotter plotter = plotterFactory.create(histogram.title());
         plotter.createRegion();
         plotter.region(0).plot(histogram, style);
-        if (show)
+        if (show) {
             plotter.show();
+        }
         return plotter;
     }
 
@@ -52,8 +55,9 @@
      *  copied from org.hps.monitoring.drivers.ecal.EcalMonitoringUtilities.java
      */
     static void plot(IPlotter plotter, IBaseHistogram histogram, IPlotterStyle style, int region) {
-        if (style == null)
+        if (style == null) {
             style = getPlotterStyle(histogram);
+        }
         LOGGER.info("Putting plot in region " + region);
         plotter.region(region).plot(histogram, style);
 
@@ -64,8 +68,9 @@
      */
 
     static void plot(IPlotter plotter, IFunction function, IPlotterStyle style, int region) {
-        if (style == null)
+        if (style == null) {
             style = getPlotterStyle(function);
+        }
         LOGGER.info("Putting function in region " + region);
         plotter.region(region).plot(function, style);
     }
@@ -78,16 +83,17 @@
         StyleRegistry styleRegistry = StyleRegistry.getStyleRegistry();
         IStyleStore store = styleRegistry.getStore("DefaultStyleStore");
         IPlotterStyle style = null;
-        if ((histogram instanceof IHistogram1D) || (histogram instanceof ICloud1D) || (histogram instanceof IProfile1D))
+        if ((histogram instanceof IHistogram1D) || (histogram instanceof ICloud1D) || (histogram instanceof IProfile1D)) {
             style = store.getStyle("DefaultHistogram1DStyle");
-        else if ((histogram instanceof IHistogram2D) || (histogram instanceof IProfile2D)) {
+        } else if ((histogram instanceof IHistogram2D) || (histogram instanceof IProfile2D)) {
             style = store.getStyle("DefaultColorMapStyle");
             style.statisticsBoxStyle().setVisible(false);
             style.setParameter("hist2DStyle", "colorMap");
             style.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
         }
-        if (style == null)
+        if (style == null) {
             throw new RuntimeException("A default style could not be found for " + histogram.title());
+        }
 
         //custom stuff...mg
         style.dataStyle().errorBarStyle().setVisible(false);
@@ -106,8 +112,9 @@
         IStyleStore store = styleRegistry.getStore("DefaultStyleStore");
         IPlotterStyle style = null;
         style = store.getStyle("DefaultFunctionStyle");
-        if (style == null)
+        if (style == null) {
             throw new RuntimeException("A default style could not be found for " + func.title());
+        }
         return style;
     }
 
@@ -122,10 +129,10 @@
         parameters[2] = histogram.rms();
         function.setParameters(parameters);
         IFitResult fitResult = null;
-         Logger minuitLogger = Logger.getLogger("org.freehep.math.minuit");
+        Logger minuitLogger = Logger.getLogger("org.freehep.math.minuit");
         minuitLogger.setLevel(Level.OFF);
         minuitLogger.info("minuit logger test");
-        
+
         try {
             fitResult = fitter.fit(histogram, function);
         } catch (RuntimeException e) {
@@ -142,4 +149,44 @@
         }
     }
 
+    private static final String nameStrip = "Tracker_TestRunModule_";
+
+    private static String getNiceSensorName(HpsSiSensor sensor) {
+        return sensor.getName().replaceAll(nameStrip, "")
+                .replace("module", "mod")
+                .replace("layer", "lyr")
+                .replace("sensor", "sens");
+    }
+
+    public static IHistogram1D getSensorPlot(String prefix, HpsSiSensor sensor) {
+        String hname = prefix + getNiceSensorName(sensor);
+        return aida.histogram1D(hname);
+    }
+
+//    private static IHistogram1D getSensorPlot(String prefix, String sensorName) {
+//        return aida.histogram1D(prefix + sensorName);
+//    }
+    public static IHistogram1D createSensorPlot(String prefix, HpsSiSensor sensor, int nchan, double min, double max) {
+        String hname = prefix + getNiceSensorName(sensor);
+        IHistogram1D hist = aida.histogram1D(hname, nchan, min, max);
+        hist.setTitle(getNiceSensorName(sensor));
+
+        return hist;
+    }
+
+    public static IHistogram2D getSensorPlot2D(String prefix, HpsSiSensor sensor) {
+        String hname = prefix + getNiceSensorName(sensor);
+        return aida.histogram2D(hname);
+    }
+
+    public static IHistogram2D createSensorPlot2D(String prefix, HpsSiSensor sensor, int nchanX, double minX, double maxX, int nchanY, double minY, double maxY) {
+        String hname = prefix + getNiceSensorName(sensor);
+        IHistogram2D hist = aida.histogram2D(hname, nchanX, minX, maxX, nchanY, minY, maxY);
+        hist.setTitle(sensor.getName().replaceAll(nameStrip, "")
+                .replace("module", "mod")
+                .replace("layer", "lyr")
+                .replace("sensor", "sens"));
+
+        return hist;
+    }
 }

Modified: java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/dataquality/SvtMonitoring.java
 =============================================================================
--- java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/dataquality/SvtMonitoring.java	(original)
+++ java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/dataquality/SvtMonitoring.java	Tue Dec  8 20:48:40 2015
@@ -38,7 +38,7 @@
  */
 //TODO:  add some more quantities to DQM database:  <t0> or <sigma>_t0 for intime events;  <chi^2>, <amplitude> etc
 public class SvtMonitoring extends DataQualityMonitor {
-    
+
     private static Logger LOGGER = Logger.getLogger(SvtMonitoring.class.getPackage().getName());
 
     private String rawTrackerHitCollectionName = "SVTRawTrackerHits";
@@ -90,22 +90,22 @@
         aida.tree().cd("/");
         for (HpsSiSensor sensor : sensors) {
             //IHistogram1D occupancyPlot = aida.histogram1D(sensor.getName().replaceAll("Tracker_TestRunModule_", ""), 640, 0, 639);
-            IHistogram1D occupancyPlot = createSensorPlot(plotDir + triggerType + "/"+"occupancy_", sensor, maxChannels, 0, maxChannels - 1);
-            IHistogram1D t0Plot = createSensorPlot(plotDir + triggerType + "/"+"t0Hit_", sensor, 400, -100., 100.);
-            IHistogram1D nHits = createSensorPlot(plotDir + triggerType + "/"+"nHitsPerEvent_", sensor, 100, -0.5, 99.5);
-            IHistogram1D pileup = createSensorPlot(plotDir + triggerType + "/"+"nFitsPerHit_", sensor, 3, 0.5, 3.5);
-
-            IHistogram1D amplitudePlot = createSensorPlot(plotDir + triggerType + "/"+"amplitude_", sensor, 50, 0, 4000.0);
-            IHistogram2D t0AmpPlot = createSensorPlot2D(plotDir + triggerType + "/"+"t0AmpHit_", sensor, 200, -100., 100., 50, 0, 4000.0);
-            IHistogram2D t0ChanPlot = createSensorPlot2D(plotDir + triggerType + "/"+"t0ChanBigHit_", sensor, 640, -0.5, 639.5, 200, -100., 100.);
-            IHistogram2D ampChanPlot = createSensorPlot2D(plotDir + triggerType + "/"+"ampChanHit_", sensor, 640, -0.5, 639.5, 50, 0, 4000);
-            IHistogram2D chiprobChanPlot = createSensorPlot2D(plotDir + triggerType + "/"+"chiprobChanBigHit_", sensor, 640, -0.5, 639.5, 50, 0, 1.0);
-            IHistogram2D t0TrigTimeHitPlot = createSensorPlot2D(plotDir + triggerType + "/"+"t0BigHitTrigTime_", sensor, 400, -100., 100., 6, 0, 24);
-
-            IHistogram1D chiProbPlot = createSensorPlot(plotDir + triggerType + "/"+"chiProb_", sensor, 50, 0, 1.0);
-            IHistogram1D t0ClusterPlot = createSensorPlot(plotDir + triggerType + "/"+"t0Cluster_", sensor, 400, -100., 100.);
-            IHistogram2D t0TrigTimePlot = createSensorPlot2D(plotDir + triggerType + "/"+"t0ClusterTrigTime_", sensor, 400, -100., 100., 6, 0, 24);
-            IHistogram1D dedxClusterPlot = createSensorPlot(plotDir + triggerType + "/"+"electrons_", sensor, 50, 0., 10.);
+            IHistogram1D occupancyPlot = PlotAndFitUtilities.createSensorPlot(plotDir + triggerType + "/" + "occupancy_", sensor, maxChannels, 0, maxChannels - 1);
+            IHistogram1D t0Plot = PlotAndFitUtilities.createSensorPlot(plotDir + triggerType + "/" + "t0Hit_", sensor, 400, -100., 100.);
+            IHistogram1D nHits = PlotAndFitUtilities.createSensorPlot(plotDir + triggerType + "/" + "nHitsPerEvent_", sensor, 100, -0.5, 99.5);
+            IHistogram1D pileup = PlotAndFitUtilities.createSensorPlot(plotDir + triggerType + "/" + "nFitsPerHit_", sensor, 3, 0.5, 3.5);
+
+            IHistogram1D amplitudePlot = PlotAndFitUtilities.createSensorPlot(plotDir + triggerType + "/" + "amplitude_", sensor, 50, 0, 4000.0);
+            IHistogram2D t0AmpPlot = PlotAndFitUtilities.createSensorPlot2D(plotDir + triggerType + "/" + "t0AmpHit_", sensor, 200, -100., 100., 50, 0, 4000.0);
+            IHistogram2D t0ChanPlot = PlotAndFitUtilities.createSensorPlot2D(plotDir + triggerType + "/" + "t0ChanBigHit_", sensor, 640, -0.5, 639.5, 200, -100., 100.);
+            IHistogram2D ampChanPlot = PlotAndFitUtilities.createSensorPlot2D(plotDir + triggerType + "/" + "ampChanHit_", sensor, 640, -0.5, 639.5, 50, 0, 4000);
+            IHistogram2D chiprobChanPlot = PlotAndFitUtilities.createSensorPlot2D(plotDir + triggerType + "/" + "chiprobChanBigHit_", sensor, 640, -0.5, 639.5, 50, 0, 1.0);
+            IHistogram2D t0TrigTimeHitPlot = PlotAndFitUtilities.createSensorPlot2D(plotDir + triggerType + "/" + "t0BigHitTrigTime_", sensor, 400, -100., 100., 6, 0, 24);
+
+            IHistogram1D chiProbPlot = PlotAndFitUtilities.createSensorPlot(plotDir + triggerType + "/" + "chiProb_", sensor, 50, 0, 1.0);
+            IHistogram1D t0ClusterPlot = PlotAndFitUtilities.createSensorPlot(plotDir + triggerType + "/" + "t0Cluster_", sensor, 400, -100., 100.);
+            IHistogram2D t0TrigTimePlot = PlotAndFitUtilities.createSensorPlot2D(plotDir + triggerType + "/" + "t0ClusterTrigTime_", sensor, 400, -100., 100., 6, 0, 24);
+            IHistogram1D dedxClusterPlot = PlotAndFitUtilities.createSensorPlot(plotDir + triggerType + "/" + "electrons_", sensor, 50, 0., 10.);
             occupancyPlot.reset();
         }
 
@@ -116,10 +116,11 @@
 
     public void process(EventHeader event) {
 
-          //check to see if this event is from the correct trigger (or "all");
-        if (!matchTrigger(event))
+        //check to see if this event is from the correct trigger (or "all");
+        if (!matchTrigger(event)) {
             return;
-        
+        }
+
         /*  increment the strip occupancy arrays */
         Map<String, Integer> hitsPerSensor = new HashMap<String, Integer>();
 
@@ -140,7 +141,7 @@
             ++eventCountRaw;
         }
         for (HpsSiSensor sensor : sensors) {
-            IHistogram1D sensorHist = getSensorPlot(plotDir + triggerType + "/"+"nHitsPerEvent_", sensor);
+            IHistogram1D sensorHist = PlotAndFitUtilities.getSensorPlot(plotDir + triggerType + "/" + "nHitsPerEvent_", sensor);
             Integer nHits = hitsPerSensor.get(sensor.getName());
             if (nHits == null) {
                 sensorHist.fill(0);
@@ -161,22 +162,22 @@
                 RawTrackerHit rth = (RawTrackerHit) hit.getFrom();
                 GenericObject pars = (GenericObject) hit.getTo();
 
-                String sensorName = getNiceSensorName((HpsSiSensor) rth.getDetectorElement());
+                HpsSiSensor sensor = ((HpsSiSensor) rth.getDetectorElement());
                 //this is a clever way to get the parameters we want from the generic object
                 double t0 = ShapeFitParameters.getT0(pars);
                 double amp = ShapeFitParameters.getAmp(pars);
                 double chiProb = ShapeFitParameters.getChiProb(pars);
                 int channel = rth.getIdentifierFieldValue("strip");
-                getSensorPlot(plotDir + triggerType + "/"+"nFitsPerHit_", sensorName).fill(rthtofit.allFrom(rth).size());
-                getSensorPlot(plotDir + triggerType + "/"+"t0Hit_", sensorName).fill(t0);
-                getSensorPlot(plotDir + triggerType + "/"+"amplitude_", sensorName).fill(amp);
-                getSensorPlot2D(plotDir + triggerType + "/"+"t0AmpHit_", sensorName).fill(t0, amp);
-                getSensorPlot(plotDir + triggerType + "/"+"chiProb_", sensorName).fill(chiProb);
-                getSensorPlot2D(plotDir + triggerType + "/"+"ampChanHit_", sensorName).fill(channel, amp);
+                PlotAndFitUtilities.getSensorPlot(plotDir + triggerType + "/" + "nFitsPerHit_", sensor).fill(rthtofit.allFrom(rth).size());
+                PlotAndFitUtilities.getSensorPlot(plotDir + triggerType + "/" + "t0Hit_", sensor).fill(t0);
+                PlotAndFitUtilities.getSensorPlot(plotDir + triggerType + "/" + "amplitude_", sensor).fill(amp);
+                PlotAndFitUtilities.getSensorPlot2D(plotDir + triggerType + "/" + "t0AmpHit_", sensor).fill(t0, amp);
+                PlotAndFitUtilities.getSensorPlot(plotDir + triggerType + "/" + "chiProb_", sensor).fill(chiProb);
+                PlotAndFitUtilities.getSensorPlot2D(plotDir + triggerType + "/" + "ampChanHit_", sensor).fill(channel, amp);
                 if (amp > 1000.0) {
-                    getSensorPlot2D(plotDir + triggerType + "/"+"t0ChanBigHit_", sensorName).fill(channel, t0);
-                    getSensorPlot2D(plotDir + triggerType + "/"+"chiprobChanBigHit_", sensorName).fill(channel, chiProb);
-                    getSensorPlot2D(plotDir + triggerType + "/"+"t0BigHitTrigTime_", sensorName).fill(t0, event.getTimeStamp() % 24);
+                    PlotAndFitUtilities.getSensorPlot2D(plotDir + triggerType + "/" + "t0ChanBigHit_", sensor).fill(channel, t0);
+                    PlotAndFitUtilities.getSensorPlot2D(plotDir + triggerType + "/" + "chiprobChanBigHit_", sensor).fill(channel, chiProb);
+                    PlotAndFitUtilities.getSensorPlot2D(plotDir + triggerType + "/" + "t0BigHitTrigTime_", sensor).fill(t0, event.getTimeStamp() % 24);
                 }
             }
             ++eventCountFit;
@@ -186,55 +187,15 @@
 //            LOGGER.info("Found a Si cluster collection");
             List<TrackerHit> siClusters = (List<TrackerHit>) event.get(trackerHitCollectionName);
             for (TrackerHit cluster : siClusters) {
-                String sensorName = getNiceSensorName((HpsSiSensor) ((RawTrackerHit) cluster.getRawHits().get(0)).getDetectorElement());
+                HpsSiSensor sensor = (HpsSiSensor) ((RawTrackerHit) cluster.getRawHits().get(0)).getDetectorElement();
                 double t0 = cluster.getTime();
                 double dedx = cluster.getdEdx() * 1e6;
 //                LOGGER.info("dedx = "+dedx);
-                getSensorPlot(plotDir + triggerType + "/"+"t0Cluster_", sensorName).fill(t0);
-                getSensorPlot2D(plotDir + triggerType + "/"+"t0ClusterTrigTime_", sensorName).fill(t0, event.getTimeStamp() % 24);
-                getSensorPlot(plotDir + triggerType + "/"+"electrons_", sensorName).fill(dedx);
-            }
-        }
-    }
-
-    private IHistogram1D getSensorPlot(String prefix, HpsSiSensor sensor) {
-        String hname = prefix + getNiceSensorName(sensor);
-        return aida.histogram1D(hname);
-    }
-
-    private IHistogram1D getSensorPlot(String prefix, String sensorName) {
-        return aida.histogram1D(prefix + sensorName);
-    }
-
-    private IHistogram1D createSensorPlot(String prefix, HpsSiSensor sensor, int nchan, double min, double max) {
-        String hname = prefix + getNiceSensorName(sensor);
-        IHistogram1D hist = aida.histogram1D(hname, nchan, min, max);
-        hist.setTitle(sensor.getName().replaceAll(nameStrip, "")
-                .replace("module", "mod")
-                .replace("layer", "lyr")
-                .replace("sensor", "sens"));
-
-        return hist;
-    }
-
-    private IHistogram2D getSensorPlot2D(String prefix, HpsSiSensor sensor) {
-        String hname = prefix + getNiceSensorName(sensor);
-        return aida.histogram2D(hname);
-    }
-
-    private IHistogram2D getSensorPlot2D(String prefix, String sensorName) {
-        return aida.histogram2D(prefix + sensorName);
-    }
-
-    private IHistogram2D createSensorPlot2D(String prefix, HpsSiSensor sensor, int nchanX, double minX, double maxX, int nchanY, double minY, double maxY) {
-        String hname = prefix + getNiceSensorName(sensor);
-        IHistogram2D hist = aida.histogram2D(hname, nchanX, minX, maxX, nchanY, minY, maxY);
-        hist.setTitle(sensor.getName().replaceAll(nameStrip, "")
-                .replace("module", "mod")
-                .replace("layer", "lyr")
-                .replace("sensor", "sens"));
-
-        return hist;
+                PlotAndFitUtilities.getSensorPlot(plotDir + triggerType + "/" + "t0Cluster_", sensor).fill(t0);
+                PlotAndFitUtilities.getSensorPlot2D(plotDir + triggerType + "/" + "t0ClusterTrigTime_", sensor).fill(t0, event.getTimeStamp() % 24);
+                PlotAndFitUtilities.getSensorPlot(plotDir + triggerType + "/" + "electrons_", sensor).fill(dedx);
+            }
+        }
     }
 
     private void resetOccupancyMap() {
@@ -279,7 +240,7 @@
         for (HpsSiSensor sensor : sensors) {
             Double avg = 0.0;
             //IHistogram1D sensorHist = aida.histogram1D(sensor.getName());
-            IHistogram1D sensorHist = getSensorPlot(plotDir + triggerType + "/"+"occupancy_", sensor);
+            IHistogram1D sensorHist = PlotAndFitUtilities.getSensorPlot(plotDir + triggerType + "/" + "occupancy_", sensor);
             sensorHist.reset();
             int[] strips = occupancyMap.get(sensor.getName());
             for (int i = 0; i < strips.length; i++) {
@@ -314,7 +275,7 @@
         int irTop = 0;
         int irBot = 0;
         for (HpsSiSensor sensor : sensors) {
-            IHistogram1D sensPlot = getSensorPlot(plotDir + triggerType + "/"+"t0Hit_", sensor);
+            IHistogram1D sensPlot = PlotAndFitUtilities.getSensorPlot(plotDir + triggerType + "/" + "t0Hit_", sensor);
             IFitResult result = fitGaussian(sensPlot, fitter, "range=\"(-8.0,8.0)\"");
 
             boolean isTop = sensor.isTopLayer();
@@ -362,9 +323,9 @@
     @Override
     public void printDQMData() {
         for (HpsSiSensor sensor : sensors) {
-            LOGGER.info(avgOccupancyNames.get(sensor.getName()) + "  " +triggerType+" " + avgOccupancyMap.get(sensor.getName()));
-            LOGGER.info(avgt0Names.get(sensor.getName()) + "  " +triggerType+" " + avgt0Map.get(sensor.getName()));
-            LOGGER.info(sigt0Names.get(sensor.getName()) + "  " +triggerType+" " + sigt0Map.get(sensor.getName()));
+            LOGGER.info(avgOccupancyNames.get(sensor.getName()) + "  " + triggerType + " " + avgOccupancyMap.get(sensor.getName()));
+            LOGGER.info(avgt0Names.get(sensor.getName()) + "  " + triggerType + " " + avgt0Map.get(sensor.getName()));
+            LOGGER.info(sigt0Names.get(sensor.getName()) + "  " + triggerType + " " + sigt0Map.get(sensor.getName()));
         }
     }
 

Modified: java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/dataquality/TrackingMonitoring.java
 =============================================================================
--- java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/dataquality/TrackingMonitoring.java	(original)
+++ java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/dataquality/TrackingMonitoring.java	Tue Dec  8 20:48:40 2015
@@ -8,16 +8,17 @@
 import hep.physics.vec.BasicHep3Matrix;
 import hep.physics.vec.Hep3Vector;
 import hep.physics.vec.VecOp;
-
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import java.util.logging.Logger;
-
 import org.hps.recon.tracking.CoordinateTransformations;
 import org.hps.recon.tracking.TrackUtils;
+import org.hps.recon.tracking.gbl.GBLKinkData;
 import org.lcsim.detector.tracker.silicon.HpsSiSensor;
 import org.lcsim.event.EventHeader;
+import org.lcsim.event.GenericObject;
 import org.lcsim.event.LCRelation;
 import org.lcsim.event.RawTrackerHit;
 import org.lcsim.event.RelationalTable;
@@ -37,7 +38,7 @@
 public class TrackingMonitoring extends DataQualityMonitor {
 
     private static Logger LOGGER = Logger.getLogger(SvtMonitoring.class.getPackage().getName());
-    
+
     private String helicalTrackHitCollectionName = "HelicalTrackHits";
     private final String rotatedTrackHitCollectionName = "RotatedHelicalTrackHits";
     private final String helicalTrackHitRelationsCollectionName = "HelicalTrackHitRelations";
@@ -64,6 +65,7 @@
     private final String botDir = "Bottom/";
     private final String hthplotDir = "HelicalTrackHits/";
     private final String timeresidDir = "HitTimeResiduals/";
+    private final String kinkDir = "Kinks/";
     String[] trackingQuantNames = {"avg_N_tracks", "avg_N_hitsPerTrack", "avg_d0", "avg_z0", "avg_absslope", "avg_chi2"};
     int nmodules = 6;
     IHistogram1D[] hthTop = new IHistogram1D[nmodules];
@@ -300,9 +302,12 @@
         aida.tree().cd("/");
         for (HpsSiSensor sensor : sensors) {
             //IHistogram1D occupancyPlot = aida.histogram1D(sensor.getName().replaceAll("Tracker_TestRunModule_", ""), 640, 0, 639);
-            IHistogram1D hitTimeResidual = createSensorPlot(plotDir + trackCollectionName + "/" + triggerType + "/" + timeresidDir + "hitTimeResidual_", sensor, 100, -20, 20);
-        }
-
+            IHistogram1D hitTimeResidual = PlotAndFitUtilities.createSensorPlot(plotDir + trackCollectionName + "/" + triggerType + "/" + timeresidDir + "hitTimeResidual_", sensor, 100, -20, 20);
+            IHistogram1D lambdaKink = PlotAndFitUtilities.createSensorPlot(plotDir + trackCollectionName + "/" + triggerType + "/" + kinkDir + "lambdaKink_", sensor, 100, -5e-3, 5e-3);
+            IHistogram1D phiKink = PlotAndFitUtilities.createSensorPlot(plotDir + trackCollectionName + "/" + triggerType + "/" + kinkDir + "phiKink_", sensor, 100, -5e-3, 5e-3);
+            IHistogram2D lambdaKink2D = PlotAndFitUtilities.createSensorPlot2D(plotDir + trackCollectionName + "/" + triggerType + "/" + kinkDir + "lambdaKinkVsOmega_", sensor, 100, -omegaCut, omegaCut, 100, -5e-3, 5e-3);
+            IHistogram2D phiKink2D = PlotAndFitUtilities.createSensorPlot2D(plotDir + trackCollectionName + "/" + triggerType + "/" + kinkDir + "phiKinkVsOmega_", sensor, 100, -omegaCut, omegaCut, 100, -5e-3, 5e-3);
+        }
     }
 
     @Override
@@ -385,7 +390,7 @@
             double sinphi0 = Math.sin(trk.getTrackStates().get(0).getPhi());
             double omega = trk.getTrackStates().get(0).getOmega();
             double lambda = trk.getTrackStates().get(0).getTanLambda();
-            double z0 = trk.getTrackStates().get(0).getZ0();            
+            double z0 = trk.getTrackStates().get(0).getZ0();
             trkChi2.fill(trk.getChi2());
             nHits.fill(trk.getTrackerHits().size());
             trackNhitsVsChi2.fill(trk.getChi2(), trk.getTrackerHits().size());
@@ -447,8 +452,12 @@
             int nSeedStrips = 0;
             double meanTime = 0;
             double meanSeedTime = 0;
+
+            List<TrackerHit> stripHits = new ArrayList<TrackerHit>();
+
             for (TrackerHit hit : trk.getTrackerHits()) {
                 Collection<TrackerHit> htsList = hitToStrips.allFrom(hitToRotated.from(hit));
+                stripHits.addAll(htsList);
                 double hitTimes[] = new double[2];
                 for (TrackerHit hts : htsList) {
                     int stripLayer = ((HpsSiSensor) ((RawTrackerHit) hts.getRawHits().get(0)).getDetectorElement()).getLayerNumber();
@@ -479,18 +488,16 @@
 
             double rmsTime = 0;
             double rmsSeedTime = 0;
-            for (TrackerHit hit : trk.getTrackerHits()) {
-                Collection<TrackerHit> htsList = hitToStrips.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 + trackCollectionName + "/" + triggerType + "/" + timeresidDir + "hitTimeResidual_", sensorName).fill((hts.getTime() - meanTime) * nStrips / (nStrips - 1)); //correct residual for bias
+
+            stripHits = TrackUtils.sortHits(stripHits);
+            for (TrackerHit hts : stripHits) {
+                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);
                 }
+                PlotAndFitUtilities.getSensorPlot(plotDir + trackCollectionName + "/" + triggerType + "/" + timeresidDir + "hitTimeResidual_", sensor).fill((hts.getTime() - meanTime) * nStrips / (nStrips - 1)); //correct residual for bias
             }
             rmsTime = Math.sqrt(rmsTime / nStrips);
             trackMeanTime.fill(meanTime);
@@ -501,6 +508,23 @@
 
             rmsSeedTime = Math.sqrt(rmsSeedTime / nSeedStrips);
             seedRMSTime.fill(rmsSeedTime);
+
+            GenericObject kinkData = GBLKinkData.getKinkData(event, trk);
+            if (kinkData != null) {
+                for (int i = 0; i < stripHits.size(); i++) {
+                    TrackerHit hts = stripHits.get(i);
+                    HpsSiSensor sensor = (HpsSiSensor) ((RawTrackerHit) hts.getRawHits().get(0)).getDetectorElement();
+//                    int layer = sensor.getLayerNumber();
+                    double lambdaKink = GBLKinkData.getLambdaKink(kinkData, i);
+                    double phiKink = GBLKinkData.getPhiKink(kinkData, i);
+//                    System.out.format("%d %d %f %f\n", i, layer, lambdaKink, phiKink);
+
+                    PlotAndFitUtilities.getSensorPlot(plotDir + trackCollectionName + "/" + triggerType + "/" + kinkDir + "lambdaKink_", sensor).fill(lambdaKink);
+                    PlotAndFitUtilities.getSensorPlot(plotDir + trackCollectionName + "/" + triggerType + "/" + kinkDir + "phiKink_", sensor).fill(phiKink);
+                    PlotAndFitUtilities.getSensorPlot2D(plotDir + trackCollectionName + "/" + triggerType + "/" + kinkDir + "lambdaKinkVsOmega_", sensor).fill(trk.getTrackStates().get(0).getOmega(), lambdaKink);
+                    PlotAndFitUtilities.getSensorPlot2D(plotDir + trackCollectionName + "/" + triggerType + "/" + kinkDir + "phiKinkVsOmega_", sensor).fill(trk.getTrackStates().get(0).getOmega(), phiKink);
+                }
+            }
 
             if (trk.getTrackStates().get(0).getOmega() < 0) {//positrons
                 trkChi2Pos.fill(trk.getChi2());
@@ -568,7 +592,7 @@
 
         for (HpsSiSensor sensor : sensors) {
             //IHistogram1D occupancyPlot = aida.histogram1D(sensor.getName().replaceAll("Tracker_TestRunModule_", ""), 640, 0, 639);
-            IHistogram1D hitTimeResidual = getSensorPlot(plotDir + trackCollectionName + "/" + triggerType + "/" + timeresidDir + "hitTimeResidual_", getNiceSensorName(sensor));
+            IHistogram1D hitTimeResidual = PlotAndFitUtilities.getSensorPlot(plotDir + trackCollectionName + "/" + triggerType + "/" + timeresidDir + "hitTimeResidual_", sensor);
             IFitResult result = fitGaussian(hitTimeResidual, fitter, "range=\"(-20.0,20.0)\"");
             if (result != null) {
                 System.out.format("%s\t%f\t%f\t%d\t%d\t%f\n", getNiceSensorName(sensor), result.fittedParameters()[1], result.fittedParameters()[2], sensor.getFebID(), sensor.getFebHybridID(), sensor.getT0Shift());
@@ -611,26 +635,6 @@
         }
     }
 
-    private IHistogram1D getSensorPlot(String prefix, HpsSiSensor sensor) {
-        String hname = prefix + getNiceSensorName(sensor);
-        return aida.histogram1D(hname);
-    }
-
-    private IHistogram1D getSensorPlot(String prefix, String sensorName) {
-        return aida.histogram1D(prefix + sensorName);
-    }
-
-    private IHistogram1D createSensorPlot(String prefix, HpsSiSensor sensor, int nchan, double min, double max) {
-        String hname = prefix + getNiceSensorName(sensor);
-        IHistogram1D hist = aida.histogram1D(hname, nchan, min, max);
-        hist.setTitle(sensor.getName().replaceAll(nameStrip, "")
-                .replace("module", "mod")
-                .replace("layer", "lyr")
-                .replace("sensor", "sens"));
-
-        return hist;
-    }
-
     private String getNiceSensorName(HpsSiSensor sensor) {
         return sensor.getName().replaceAll(nameStrip, "")
                 .replace("module", "mod")

Modified: java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/dataquality/TrackingResiduals.java
 =============================================================================
--- java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/dataquality/TrackingResiduals.java	(original)
+++ java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/dataquality/TrackingResiduals.java	Tue Dec  8 20:48:40 2015
@@ -28,8 +28,8 @@
 // TODO:  Add some quantities for DQM monitoring: 
 public class TrackingResiduals extends DataQualityMonitor {
 
-    private static Logger LOGGER = Logger.getLogger(TrackingResiduals.class.getPackage().getName());
-    
+    private static final Logger LOGGER = Logger.getLogger(TrackingResiduals.class.getPackage().getName());
+
     // Collection Names
     String trackTimeDataCollectionName = "TrackTimeData";
     String trackResidualsCollectionName = "TrackResiduals";
@@ -82,8 +82,9 @@
             yresidbot[i - 1] = aida.histogram1D(plotDir + triggerType + "/" + posresDir + "Module " + i + " Bot y Residual", 50, -getRange(i, false), getRange(i, false));
         }
 
-        for (int i = 1; i <= nmodules * 2; i++)
+        for (int i = 1; i <= nmodules * 2; i++) {
             tresid[i - 1] = aida.histogram1D(plotDir + triggerType + "/" + timeresDir + "HalfModule " + i + " t Residual", 50, -20, 20);
+        }
         for (int i = 1; i <= nsensors; i++) {
 //            IHistogram1D utopresid = aida.histogram1D(plotDir + triggerType + "/"+uresDir + "HalfModule " + i + " Top u Residual", 50, -getRange((i + 1) / 2, false), getRange((i + 1) / 2, false));
 //            IHistogram1D ubotresid = aida.histogram1D(plotDir + triggerType + "/"+uresDir + "HalfModule " + i + " Bot u Residual", 50, -getRange((i + 1) / 2, false), getRange((i + 1) / 2, false));
@@ -106,17 +107,19 @@
     @Override
     public void process(EventHeader event) {
         aida.tree().cd("/");
-        if (!event.hasCollection(GenericObject.class, trackResidualsCollectionName))
+        if (!event.hasCollection(GenericObject.class, trackResidualsCollectionName)) {
             return;
+        }
         //check to see if this event is from the correct trigger (or "all");
-        if (!matchTrigger(event))
+        if (!matchTrigger(event)) {
             return;
+        }
         nEvents++;
         List<GenericObject> trdList = event.get(GenericObject.class, trackResidualsCollectionName);
         for (GenericObject trd : trdList) {
             int nResid = trd.getNDouble();
             int isBot = trd.getIntVal(trd.getNInt() - 1);//last Int is the top/bottom flag
-            for (int i = 1; i <= nResid; i++)
+            for (int i = 1; i <= nResid; i++) {
                 if (isBot == 1) {
                     xresidbot[i - 1].fill(trd.getDoubleVal(i - 1));//x is the double value in the generic object
                     yresidbot[i - 1].fill(trd.getFloatVal(i - 1));//y is the float value in the generic object
@@ -124,19 +127,22 @@
                     xresidtop[i - 1].fill(trd.getDoubleVal(i - 1));//x is the double value in the generic object
                     yresidtop[i - 1].fill(trd.getFloatVal(i - 1));//y is the float value in the generic object                    
                 }
-        }
-
+            }
+        }
+        
         if (event.hasCollection(GenericObject.class, trackTimeDataCollectionName)) {
             List<GenericObject> ttdList = event.get(GenericObject.class, trackTimeDataCollectionName);
             for (GenericObject ttd : ttdList) {
                 int nResid = ttd.getNDouble();
-                for (int i = 1; i <= nResid; i++)
+                for (int i = 1; i <= nResid; i++) {
                     tresid[i - 1].fill(ttd.getDoubleVal(i - 1));//x is the double value in the generic object               
-            }
-        }
-
-        if (!event.hasCollection(GenericObject.class, gblStripClusterDataCollectionName))
+                }
+            }
+        }
+
+        if (!event.hasCollection(GenericObject.class, gblStripClusterDataCollectionName)) {
             return;
+        }
         List<GenericObject> gblSCDList = event.get(GenericObject.class, gblStripClusterDataCollectionName);
         for (GenericObject gblSCD : gblSCDList) {
             double umeas = gblSCD.getDoubleVal(GBLStripClusterData.GBLDOUBLE.UMEAS);//TODO:  implement generic methods into GBLStripClusterData so this isn't hard coded
@@ -146,23 +152,25 @@
             double tanlambda = gblSCD.getDoubleVal(GBLStripClusterData.GBLDOUBLE.TLAMBDA);//use the slope as a proxy for the top/bottom half of tracker
 
             int i = gblSCD.getIntVal(GBLStripClusterData.GBLINT.ID);//implement generic methods into GBLStripClusterData so this isn't hard coded
-            if (i == 666)
-                if (tanlambda > 0)
+            if (i == 666) {
+                if (tanlambda > 0) {
                     xtopresidBS.fill(resid);
-                else
+                } else {
                     xbotresidBS.fill(resid);
-            else if (i == 667)
-                if (tanlambda > 0)
+                }
+            } else if (i == 667) {
+                if (tanlambda > 0) {
                     ytopresidBS.fill(resid);
-                else
+                } else {
                     ybotresidBS.fill(resid);
-            else if (tanlambda > 0)
+                }
+            } else if (tanlambda > 0) {
                 utopresid[i - 1].fill(resid);//x is the double value in the generic object                 
-            //                aida.histogram2D(plotDir + triggerType + "/"+uresDir + "HalfModule " + i + " Top u Residual vs. u").fill(utrk,resid);//x is the double value in the generic object                 
+            } //                aida.histogram2D(plotDir + triggerType + "/"+uresDir + "HalfModule " + i + " Top u Residual vs. u").fill(utrk,resid);//x is the double value in the generic object                 
             //                aida.histogram2D(plotDir + triggerType + "/"+uresDir + "HalfModule " + i + " Top u Residual vs. v").fill(vtrk,resid);//x is the double value in the generic object                 
-            else
+            else {
                 ubotresid[i - 1].fill(resid);//x is the double value in the generic object                 
-            //                aida.histogram2D(plotDir + triggerType + "/"+uresDir + "HalfModule " + i + " Bot u Residual vs. u").fill(utrk,resid);//x is the double value in the generic object                 
+            }            //                aida.histogram2D(plotDir + triggerType + "/"+uresDir + "HalfModule " + i + " Bot u Residual vs. u").fill(utrk,resid);//x is the double value in the generic object                 
             //                aida.histogram2D(plotDir + triggerType + "/"+uresDir + "HalfModule " + i + " Bot u Residual vs. v").fill(vtrk,resid);//x is the double value in the generic object                 
         }
     }
@@ -287,20 +295,25 @@
     private String getQuantityName(int itype, int iquant, int top, int nlayer) {
         String typeString = "position_resid";
         String quantString = "mean_";
-        if (itype == 1)
+        if (itype == 1) {
             typeString = "time_resid";
-        if (iquant == 1)
+        }
+        if (iquant == 1) {
             quantString = "sigma_";
+        }
 
         String botString = "bot_";
-        if (top == 1)
+        if (top == 1) {
             botString = "top_";
-        if (top == 2)
+        }
+        if (top == 2) {
             botString = "";
+        }
 
         String layerString = "module" + nlayer;
-        if (itype == 1)
+        if (itype == 1) {
             layerString = "halfmodule" + nlayer;
+        }
 
         return typeString + quantString + botString + layerString;
     }
@@ -308,51 +321,71 @@
     @Override
     public void printDQMData() {
         LOGGER.info("TrackingResiduals::printDQMData");
-        for (Map.Entry<String, Double> entry : xposTopMeanResidMap.entrySet())
-            LOGGER.info(entry.getKey() + " = " + entry.getValue());
-        for (Map.Entry<String, Double> entry : xposBotMeanResidMap.entrySet())
-            LOGGER.info(entry.getKey() + " = " + entry.getValue());
-        for (Map.Entry<String, Double> entry : xposTopSigmaResidMap.entrySet())
-            LOGGER.info(entry.getKey() + " = " + entry.getValue());
-        for (Map.Entry<String, Double> entry : xposBotSigmaResidMap.entrySet())
-            LOGGER.info(entry.getKey() + " = " + entry.getValue());
-        for (Map.Entry<String, Double> entry : yposTopMeanResidMap.entrySet())
-            LOGGER.info(entry.getKey() + " = " + entry.getValue());
-        for (Map.Entry<String, Double> entry : yposBotMeanResidMap.entrySet())
-            LOGGER.info(entry.getKey() + " = " + entry.getValue());
-        for (Map.Entry<String, Double> entry : yposTopSigmaResidMap.entrySet())
-            LOGGER.info(entry.getKey() + " = " + entry.getValue());
-        for (Map.Entry<String, Double> entry : yposBotSigmaResidMap.entrySet())
-            LOGGER.info(entry.getKey() + " = " + entry.getValue());
-        for (Map.Entry<String, Double> entry : timeMeanResidMap.entrySet())
-            LOGGER.info(entry.getKey() + " = " + entry.getValue());
-        for (Map.Entry<String, Double> entry : timeSigmaResidMap.entrySet())
-            LOGGER.info(entry.getKey() + " = " + entry.getValue());
+        for (Map.Entry<String, Double> entry : xposTopMeanResidMap.entrySet()) {
+            LOGGER.info(entry.getKey() + " = " + entry.getValue());
+        }
+        for (Map.Entry<String, Double> entry : xposBotMeanResidMap.entrySet()) {
+            LOGGER.info(entry.getKey() + " = " + entry.getValue());
+        }
+        for (Map.Entry<String, Double> entry : xposTopSigmaResidMap.entrySet()) {
+            LOGGER.info(entry.getKey() + " = " + entry.getValue());
+        }
+        for (Map.Entry<String, Double> entry : xposBotSigmaResidMap.entrySet()) {
+            LOGGER.info(entry.getKey() + " = " + entry.getValue());
+        }
+        for (Map.Entry<String, Double> entry : yposTopMeanResidMap.entrySet()) {
+            LOGGER.info(entry.getKey() + " = " + entry.getValue());
+        }
+        for (Map.Entry<String, Double> entry : yposBotMeanResidMap.entrySet()) {
+            LOGGER.info(entry.getKey() + " = " + entry.getValue());
+        }
+        for (Map.Entry<String, Double> entry : yposTopSigmaResidMap.entrySet()) {
+            LOGGER.info(entry.getKey() + " = " + entry.getValue());
+        }
+        for (Map.Entry<String, Double> entry : yposBotSigmaResidMap.entrySet()) {
+            LOGGER.info(entry.getKey() + " = " + entry.getValue());
+        }
+        for (Map.Entry<String, Double> entry : timeMeanResidMap.entrySet()) {
+            LOGGER.info(entry.getKey() + " = " + entry.getValue());
+        }
+        for (Map.Entry<String, Double> entry : timeSigmaResidMap.entrySet()) {
+            LOGGER.info(entry.getKey() + " = " + entry.getValue());
+        }
         LOGGER.info("*******************************");
     }
 
     @Override
     public void printDQMStrings() {
-        for (Map.Entry<String, Double> entry : xposTopMeanResidMap.entrySet())
-            LOGGER.info("ALTER TABLE dqm ADD " + entry.getKey() + " double;");
-        for (Map.Entry<String, Double> entry : xposBotMeanResidMap.entrySet())
-            LOGGER.info("ALTER TABLE dqm ADD " + entry.getKey() + " double;");
-        for (Map.Entry<String, Double> entry : xposTopSigmaResidMap.entrySet())
-            LOGGER.info("ALTER TABLE dqm ADD " + entry.getKey() + " double;");
-        for (Map.Entry<String, Double> entry : xposBotSigmaResidMap.entrySet())
-            LOGGER.info("ALTER TABLE dqm ADD " + entry.getKey() + " double;");
-        for (Map.Entry<String, Double> entry : yposTopMeanResidMap.entrySet())
-            LOGGER.info("ALTER TABLE dqm ADD " + entry.getKey() + " double;");
-        for (Map.Entry<String, Double> entry : yposBotMeanResidMap.entrySet())
-            LOGGER.info("ALTER TABLE dqm ADD " + entry.getKey() + " double;");
-        for (Map.Entry<String, Double> entry : yposTopSigmaResidMap.entrySet())
-            LOGGER.info("ALTER TABLE dqm ADD " + entry.getKey() + " double;");
-        for (Map.Entry<String, Double> entry : yposBotSigmaResidMap.entrySet())
-            LOGGER.info("ALTER TABLE dqm ADD " + entry.getKey() + " double;");
-        for (Map.Entry<String, Double> entry : timeMeanResidMap.entrySet())
-            LOGGER.info("ALTER TABLE dqm ADD " + entry.getKey() + " double;");
-        for (Map.Entry<String, Double> entry : timeSigmaResidMap.entrySet())
-            LOGGER.info("ALTER TABLE dqm ADD " + entry.getKey() + " double;");
+        for (Map.Entry<String, Double> entry : xposTopMeanResidMap.entrySet()) {
+            LOGGER.info("ALTER TABLE dqm ADD " + entry.getKey() + " double;");
+        }
+        for (Map.Entry<String, Double> entry : xposBotMeanResidMap.entrySet()) {
+            LOGGER.info("ALTER TABLE dqm ADD " + entry.getKey() + " double;");
+        }
+        for (Map.Entry<String, Double> entry : xposTopSigmaResidMap.entrySet()) {
+            LOGGER.info("ALTER TABLE dqm ADD " + entry.getKey() + " double;");
+        }
+        for (Map.Entry<String, Double> entry : xposBotSigmaResidMap.entrySet()) {
+            LOGGER.info("ALTER TABLE dqm ADD " + entry.getKey() + " double;");
+        }
+        for (Map.Entry<String, Double> entry : yposTopMeanResidMap.entrySet()) {
+            LOGGER.info("ALTER TABLE dqm ADD " + entry.getKey() + " double;");
+        }
+        for (Map.Entry<String, Double> entry : yposBotMeanResidMap.entrySet()) {
+            LOGGER.info("ALTER TABLE dqm ADD " + entry.getKey() + " double;");
+        }
+        for (Map.Entry<String, Double> entry : yposTopSigmaResidMap.entrySet()) {
+            LOGGER.info("ALTER TABLE dqm ADD " + entry.getKey() + " double;");
+        }
+        for (Map.Entry<String, Double> entry : yposBotSigmaResidMap.entrySet()) {
+            LOGGER.info("ALTER TABLE dqm ADD " + entry.getKey() + " double;");
+        }
+        for (Map.Entry<String, Double> entry : timeMeanResidMap.entrySet()) {
+            LOGGER.info("ALTER TABLE dqm ADD " + entry.getKey() + " double;");
+        }
+        for (Map.Entry<String, Double> entry : timeSigmaResidMap.entrySet()) {
+            LOGGER.info("ALTER TABLE dqm ADD " + entry.getKey() + " double;");
+        }
     }
 
     private void resetOccupancyMap() {
@@ -399,31 +432,35 @@
     private double getRange(int layer, boolean isX) {
         double range = 2.5;
         if (isX) {
-            if (layer == 1)
-                return 0.2;
-            if (layer == 2)
-                return 0.5;
-            if (layer == 3)
-                return 0.5;
-            if (layer == 4)
-                return 1.0;
-            if (layer == 5)
-                return 1.0;
-            if (layer == 6)
-                return 1.0;
+            switch (layer) {
+                case 1:
+                    return 0.2;
+                case 2:
+                    return 0.5;
+                case 3:
+                    return 0.5;
+                case 4:
+                    return 1.0;
+                case 5:
+                    return 1.0;
+                case 6:
+                    return 1.0;
+            }
         } else {
-            if (layer == 1)
-                return 0.005;
-            if (layer == 2)
-                return 0.5;
-            if (layer == 3)
-                return 0.5;
-            if (layer == 4)
-                return 1.0;
-            if (layer == 5)
-                return 1.0;
-            if (layer == 6)
-                return 1.5;
+            switch (layer) {
+                case 1:
+                    return 0.005;
+                case 2:
+                    return 0.5;
+                case 3:
+                    return 0.5;
+                case 4:
+                    return 1.0;
+                case 5:
+                    return 1.0;
+                case 6:
+                    return 1.5;
+            }
         }
         return range;
 

Modified: java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/dataquality/TridentMonitoring.java
 =============================================================================
--- java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/dataquality/TridentMonitoring.java	(original)
+++ java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/dataquality/TridentMonitoring.java	Tue Dec  8 20:48:40 2015
@@ -97,8 +97,8 @@
 
     private final String plotDir = "TridentMonitoring/";
 
-    private IHistogram2D triTrackTime2D;
-    private IHistogram1D triTrackTimeDiff;
+//    private IHistogram2D triTrackTime2D;
+//    private IHistogram1D triTrackTimeDiff;
     private IHistogram2D triMassMomentum;
     private IHistogram2D triZVsMomentum;
     private IHistogram2D triTrackMomentum2D;
@@ -108,22 +108,22 @@
     private IHistogram1D triSumP;
     private IHistogram1D triMass;
     private IHistogram2D triZVsMass;
-    private IHistogram1D triX;
-    private IHistogram1D triY;
-    private IHistogram1D triZ;
-    private IHistogram2D triZY;
-    private IHistogram2D triXY;
-    private IHistogram1D triPx;
-    private IHistogram1D triPy;
-    private IHistogram1D triPz;
-    private IHistogram2D triPxPy;
-    private IHistogram1D triU;
-    private IHistogram1D triV;
+//    private IHistogram1D triX;
+//    private IHistogram1D triY;
+//    private IHistogram1D triZ;
+//    private IHistogram2D triZY;
+//    private IHistogram2D triXY;
+//    private IHistogram1D triPx;
+//    private IHistogram1D triPy;
+//    private IHistogram1D triPz;
+//    private IHistogram2D triPxPy;
+//    private IHistogram1D triU;
+//    private IHistogram1D triV;
 
     private IHistogram2D triRadTrackTime2D;
     private IHistogram1D triRadTrackTimeDiff;
-    private IHistogram2D triRadMassMomentum;
-    private IHistogram2D triRadZVsMomentum;
+//    private IHistogram2D triRadMassMomentum;
+//    private IHistogram2D triRadZVsMomentum;
     private IHistogram2D triRadTrackMomentum2D;
     private IHistogram2D triRadPyEleVsPyPos;
     private IHistogram2D triRadPxEleVsPxPos;
@@ -131,11 +131,11 @@
     private IHistogram1D triRadSumP;
     private IHistogram1D triRadMass;
     private IHistogram2D triRadZVsMass;
-    private IHistogram1D triRadX;
-    private IHistogram1D triRadY;
-    private IHistogram1D triRadZ;
-    private IHistogram2D triRadZY;
-    private IHistogram2D triRadXY;
+//    private IHistogram1D triRadX;
+//    private IHistogram1D triRadY;
+//    private IHistogram1D triRadZ;
+//    private IHistogram2D triRadZY;
+//    private IHistogram2D triRadXY;
     private IHistogram1D triRadPx;
     private IHistogram1D triRadPy;
     private IHistogram1D triRadPz;
@@ -143,8 +143,8 @@
     private IHistogram1D triRadU;
     private IHistogram1D triRadV;
 
-    private IHistogram2D vertTrackTime2D;
-    private IHistogram1D vertTrackTimeDiff;
+//    private IHistogram2D vertTrackTime2D;
+//    private IHistogram1D vertTrackTimeDiff;
     private IHistogram2D vertMassMomentum;
     private IHistogram2D vertZVsMomentum;
     private IHistogram2D vertTrackMomentum2D;
@@ -154,17 +154,17 @@
     private IHistogram1D vertSumP;
     private IHistogram1D vertMass;
     private IHistogram2D vertZVsMass;
-    private IHistogram1D vertX;
-    private IHistogram1D vertY;
-    private IHistogram1D vertZ;
-    private IHistogram2D vertZY;
-    private IHistogram2D vertXY;
-    private IHistogram1D vertPx;
-    private IHistogram1D vertPy;
-    private IHistogram1D vertPz;
-    private IHistogram2D vertPxPy;
-    private IHistogram1D vertU;
-    private IHistogram1D vertV;
+//    private IHistogram1D vertX;
+//    private IHistogram1D vertY;
+//    private IHistogram1D vertZ;
+//    private IHistogram2D vertZY;
+//    private IHistogram2D vertXY;
+//    private IHistogram1D vertPx;
+//    private IHistogram1D vertPy;
+//    private IHistogram1D vertPz;
+//    private IHistogram2D vertPxPy;
+//    private IHistogram1D vertU;
+//    private IHistogram1D vertV;
 
     private IHistogram2D vertRadTrackTime2D;
     private IHistogram1D vertRadTrackTimeDiff;
@@ -284,9 +284,8 @@
 //        IHistogram1D tarconChi2 = aida.histogram1D(plotDir +  triggerType + "/"+ triggerType + "/"+"Target Constrained Chi2", 25, 0, 25);
         nTriCand = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Number of Trident Candidates", 5, 0, 4);
 
-        triTrackTimeDiff = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Trident: Track time difference", 100, -10, 10);
-        triTrackTime2D = aida.histogram2D(plotDir + trkType + triggerType + "/" + "Trident: Track time vs. track time", 100, -10, 10, 100, -10, 10);
-
+//        triTrackTimeDiff = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Trident: Track time difference", 100, -10, 10);
+//        triTrackTime2D = aida.histogram2D(plotDir + trkType + triggerType + "/" + "Trident: Track time vs. track time", 100, -10, 10, 100, -10, 10);
         triTrackMomentum2D = aida.histogram2D(plotDir + trkType + triggerType + "/" + "Trident: Positron vs. electron momentum", 100, 0, v0PzMax, 100, 0, v0PzMax);
         triDeltaP = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Trident: Positron - electron momentum", 100, -1., 1.0);
         triSumP = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Trident: Positron + electron momentum", 100, v0PzMin, v0PzMax);
@@ -297,17 +296,17 @@
         triZVsMomentum = aida.histogram2D(plotDir + trkType + triggerType + "/" + "Trident: Vertex Z vs. vertex momentum", 100, v0PzMin, v0PzMax, 100, -v0VzMax, v0VzMax);
         triMass = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Trident: Vertex mass", 100, 0, 0.11);
         triZVsMass = aida.histogram2D(plotDir + trkType + triggerType + "/" + "Trident: Vertex Z vs. mass", 100, 0, 0.11, 100, -v0VzMax, v0VzMax);
-        triX = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Trident: Vertex X", 100, -v0VxMax, v0VxMax);
-        triY = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Trident: Vertex Y", 100, -v0VyMax, v0VyMax);
-        triZ = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Trident: Vertex Z", 100, -v0VzMax, v0VzMax);
-        triXY = aida.histogram2D(plotDir + trkType + triggerType + "/" + "Trident: Vertex Y vs. X", 100, -v0VxMax, v0VxMax, 100, -v0VyMax, v0VyMax);
-        triZY = aida.histogram2D(plotDir + trkType + triggerType + "/" + "Trident: Vertex Z vs. Y", 100, -v0VyMax, v0VyMax, 100, -v0VzMax, v0VzMax);
-        triPx = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Trident: Vertex Px", 100, -v0PxMax, v0PxMax);
-        triPy = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Trident: Vertex Py", 100, -v0PyMax, v0PyMax);
-        triPz = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Trident: Vertex Pz", 100, v0PzMin, v0PzMax);
-        triPxPy = aida.histogram2D(plotDir + trkType + triggerType + "/" + "Trident: Vertex Py vs. Px", 100, -v0PxMax, v0PxMax, 100, -v0PyMax, v0PyMax);
-        triU = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Trident: Vertex Px over Ptot", 100, -0.1, 0.1);
-        triV = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Trident: Vertex Py over Ptot", 100, -0.1, 0.1);
+//        triX = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Trident: Vertex X", 100, -v0VxMax, v0VxMax);
+//        triY = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Trident: Vertex Y", 100, -v0VyMax, v0VyMax);
+//        triZ = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Trident: Vertex Z", 100, -v0VzMax, v0VzMax);
+//        triXY = aida.histogram2D(plotDir + trkType + triggerType + "/" + "Trident: Vertex Y vs. X", 100, -v0VxMax, v0VxMax, 100, -v0VyMax, v0VyMax);
+//        triZY = aida.histogram2D(plotDir + trkType + triggerType + "/" + "Trident: Vertex Z vs. Y", 100, -v0VyMax, v0VyMax, 100, -v0VzMax, v0VzMax);
+//        triPx = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Trident: Vertex Px", 100, -v0PxMax, v0PxMax);
+//        triPy = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Trident: Vertex Py", 100, -v0PyMax, v0PyMax);
+//        triPz = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Trident: Vertex Pz", 100, v0PzMin, v0PzMax);
+//        triPxPy = aida.histogram2D(plotDir + trkType + triggerType + "/" + "Trident: Vertex Py vs. Px", 100, -v0PxMax, v0PxMax, 100, -v0PyMax, v0PyMax);
+//        triU = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Trident: Vertex Px over Ptot", 100, -0.1, 0.1);
+//        triV = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Trident: Vertex Py over Ptot", 100, -0.1, 0.1);
 
         triRadTrackTimeDiff = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Radiative trident: Track time difference", 100, -10, 10);
         triRadTrackTime2D = aida.histogram2D(plotDir + trkType + triggerType + "/" + "Radiative trident: Track time vs. track time", 100, -10, 10, 100, -10, 10);
@@ -318,15 +317,15 @@
         triRadPyEleVsPyPos = aida.histogram2D(plotDir + trkType + triggerType + "/" + "Radiative trident: Py(e) vs Py(p)", 50, -0.04, 0.04, 50, -0.04, 0.04);
         triRadPxEleVsPxPos = aida.histogram2D(plotDir + trkType + triggerType + "/" + "Radiative trident: Px(e) vs Px(p)", 50, -0.04, 0.04, 50, -0.04, 0.04);
 
-        triRadMassMomentum = aida.histogram2D(plotDir + trkType + triggerType + "/" + "Radiative trident: Vertex mass vs. vertex momentum", 100, v0PzMin, v0PzMax, 100, 0, 0.1);
-        triRadZVsMomentum = aida.histogram2D(plotDir + trkType + triggerType + "/" + "Radiative trident: Vertex Z vs. vertex momentum", 100, v0PzMin, v0PzMax, 100, -v0VzMax, v0VzMax);
+//        triRadMassMomentum = aida.histogram2D(plotDir + trkType + triggerType + "/" + "Radiative trident: Vertex mass vs. vertex momentum", 100, v0PzMin, v0PzMax, 100, 0, 0.1);
+//        triRadZVsMomentum = aida.histogram2D(plotDir + trkType + triggerType + "/" + "Radiative trident: Vertex Z vs. vertex momentum", 100, v0PzMin, v0PzMax, 100, -v0VzMax, v0VzMax);
         triRadMass = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Radiative trident: Vertex mass", 100, 0, 0.11);
         triRadZVsMass = aida.histogram2D(plotDir + trkType + triggerType + "/" + "Radiative trident: Vertex Z vs. mass", 100, 0, 0.11, 100, -v0VzMax, v0VzMax);
-        triRadX = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Radiative trident: Vertex X", 100, -v0VxMax, v0VxMax);
-        triRadY = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Radiative trident: Vertex Y", 100, -v0VyMax, v0VyMax);
-        triRadZ = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Radiative trident: Vertex Z", 100, -v0VzMax, v0VzMax);
-        triRadXY = aida.histogram2D(plotDir + trkType + triggerType + "/" + "Radiative trident: Vertex Y vs. X", 100, -v0VxMax, v0VxMax, 100, -v0VyMax, v0VyMax);
-        triRadZY = aida.histogram2D(plotDir + trkType + triggerType + "/" + "Radiative trident: Vertex Z vs. Y", 100, -v0VyMax, v0VyMax, 100, -v0VzMax, v0VzMax);
+//        triRadX = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Radiative trident: Vertex X", 100, -v0VxMax, v0VxMax);
+//        triRadY = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Radiative trident: Vertex Y", 100, -v0VyMax, v0VyMax);
+//        triRadZ = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Radiative trident: Vertex Z", 100, -v0VzMax, v0VzMax);
+//        triRadXY = aida.histogram2D(plotDir + trkType + triggerType + "/" + "Radiative trident: Vertex Y vs. X", 100, -v0VxMax, v0VxMax, 100, -v0VyMax, v0VyMax);
+//        triRadZY = aida.histogram2D(plotDir + trkType + triggerType + "/" + "Radiative trident: Vertex Z vs. Y", 100, -v0VyMax, v0VyMax, 100, -v0VzMax, v0VzMax);
         triRadPx = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Radiative trident: Vertex Px", 100, -v0PxMax, v0PxMax);
         triRadPy = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Radiative trident: Vertex Py", 100, -v0PyMax, v0PyMax);
         triRadPz = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Radiative trident: Vertex Pz", 100, v0PzMin, v0PzMax);
@@ -334,9 +333,8 @@
         triRadU = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Radiative trident: Vertex Px over Ptot", 100, -0.1, 0.1);
         triRadV = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Radiative trident: Vertex Py over Ptot", 100, -0.1, 0.1);
 
-        vertTrackTimeDiff = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Vertex: Track time difference", 100, -10, 10);
-        vertTrackTime2D = aida.histogram2D(plotDir + trkType + triggerType + "/" + "Vertex: Track time vs. track time", 100, -10, 10, 100, -10, 10);
-
+//        vertTrackTimeDiff = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Vertex: Track time difference", 100, -10, 10);
+//        vertTrackTime2D = aida.histogram2D(plotDir + trkType + triggerType + "/" + "Vertex: Track time vs. track time", 100, -10, 10, 100, -10, 10);
         vertTrackMomentum2D = aida.histogram2D(plotDir + trkType + triggerType + "/" + "Vertex: Positron vs. electron momentum", 100, 0, v0PzMax, 100, 0, v0PzMax);
         vertDeltaP = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Vertex: Positron - electron momentum", 100, -1., 1.0);
         vertSumP = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Vertex: Positron + electron momentum", 100, v0PzMin, v0PzMax);
@@ -347,17 +345,17 @@
         vertZVsMomentum = aida.histogram2D(plotDir + trkType + triggerType + "/" + "Vertex: Vertex Z vs. vertex momentum", 100, v0PzMin, v0PzMax, 100, -v0VzMax, v0VzMax);
         vertMass = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Vertex: Vertex mass", 100, 0, 0.11);
         vertZVsMass = aida.histogram2D(plotDir + trkType + triggerType + "/" + "Vertex: Vertex Z vs. mass", 100, 0, 0.11, 100, -v0VzMax, v0VzMax);
-        vertX = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Vertex: Vertex X", 100, -v0VxMax, v0VxMax);
-        vertY = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Vertex: Vertex Y", 100, -v0VyMax, v0VyMax);
-        vertZ = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Vertex: Vertex Z", 100, -v0VzMax, v0VzMax);
-        vertXY = aida.histogram2D(plotDir + trkType + triggerType + "/" + "Vertex: Vertex Y vs. X", 100, -v0VxMax, v0VxMax, 100, -v0VyMax, v0VyMax);
-        vertZY = aida.histogram2D(plotDir + trkType + triggerType + "/" + "Vertex: Vertex Z vs. Y", 100, -v0VyMax, v0VyMax, 100, -v0VzMax, v0VzMax);
-        vertPx = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Vertex: Vertex Px", 100, -v0PxMax, v0PxMax);
-        vertPy = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Vertex: Vertex Py", 100, -v0PyMax, v0PyMax);
-        vertPz = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Vertex: Vertex Pz", 100, v0PzMin, v0PzMax);
-        vertPxPy = aida.histogram2D(plotDir + trkType + triggerType + "/" + "Vertex: Vertex Py vs. Px", 100, -v0PxMax, v0PxMax, 100, -v0PyMax, v0PyMax);
-        vertU = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Vertex: Vertex Px over Ptot", 100, -0.1, 0.1);
-        vertV = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Vertex: Vertex Py over Ptot", 100, -0.1, 0.1);
+//        vertX = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Vertex: Vertex X", 100, -v0VxMax, v0VxMax);
+//        vertY = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Vertex: Vertex Y", 100, -v0VyMax, v0VyMax);
+//        vertZ = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Vertex: Vertex Z", 100, -v0VzMax, v0VzMax);
+//        vertXY = aida.histogram2D(plotDir + trkType + triggerType + "/" + "Vertex: Vertex Y vs. X", 100, -v0VxMax, v0VxMax, 100, -v0VyMax, v0VyMax);
+//        vertZY = aida.histogram2D(plotDir + trkType + triggerType + "/" + "Vertex: Vertex Z vs. Y", 100, -v0VyMax, v0VyMax, 100, -v0VzMax, v0VzMax);
+//        vertPx = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Vertex: Vertex Px", 100, -v0PxMax, v0PxMax);
+//        vertPy = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Vertex: Vertex Py", 100, -v0PyMax, v0PyMax);
+//        vertPz = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Vertex: Vertex Pz", 100, v0PzMin, v0PzMax);
+//        vertPxPy = aida.histogram2D(plotDir + trkType + triggerType + "/" + "Vertex: Vertex Py vs. Px", 100, -v0PxMax, v0PxMax, 100, -v0PyMax, v0PyMax);
+//        vertU = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Vertex: Vertex Px over Ptot", 100, -0.1, 0.1);
+//        vertV = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Vertex: Vertex Py over Ptot", 100, -0.1, 0.1);
 
         vertRadTrackTimeDiff = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Radiative vertex: Track time difference", 100, -10, 10);
         vertRadTrackTime2D = aida.histogram2D(plotDir + trkType + triggerType + "/" + "Radiative vertex: Track time vs. track time", 100, -10, 10, 100, -10, 10);
@@ -407,11 +405,11 @@
 
         for (Cut cut : Cut.values()) {
             for (int i = 0; i < 2; i++) {
-                cutVertexZ[cut.ordinal()][i] = aida.histogram1D(String.format("%s%s%s/failed cut: %s/%s: Vertex Z position (mm)", plotDir, trkType, triggerType, cut.ordinal(), cut.name, i == VERTEX ? "vertex" : "trident"),
+                cutVertexZ[cut.ordinal()][i] = aida.histogram1D(String.format("%s%s%s/failed cut %d: %s/%s: Vertex Z position (mm)", plotDir, trkType, triggerType, cut.ordinal(), cut.name, i == VERTEX ? "vertex" : "trident"),
                         100, -v0VzMax, v0VzMax);
-                cutVertexMass[cut.ordinal()][i] = aida.histogram1D(String.format("%s%s%s/failed cut: %s/%s: Vertex mass (GeV)", plotDir, trkType, triggerType, cut.ordinal(), cut.name, i == VERTEX ? "vertex" : "trident"),
+                cutVertexMass[cut.ordinal()][i] = aida.histogram1D(String.format("%s%s%s/failed cut %d: %s/%s: Vertex mass (GeV)", plotDir, trkType, triggerType, cut.ordinal(), cut.name, i == VERTEX ? "vertex" : "trident"),
                         100, 0, 0.1 * ebeam);
-                cutVertexZVsMass[cut.ordinal()][i] = aida.histogram2D(String.format("%s%s%s/failed cut: %s/%s: Vertex Z vs. mass", plotDir, trkType, triggerType, cut.ordinal(), cut.name, i == VERTEX ? "vertex" : "trident"),
+                cutVertexZVsMass[cut.ordinal()][i] = aida.histogram2D(String.format("%s%s%s/failed cut %d: %s/%s: Vertex Z vs. mass", plotDir, trkType, triggerType, cut.ordinal(), cut.name, i == VERTEX ? "vertex" : "trident"),
                         100, 0, 0.1 * ebeam, 100, -v0VzMax, v0VzMax);
             }
         }
@@ -520,15 +518,11 @@
             EnumSet<Cut> bits = EnumSet.noneOf(Cut.class);
 
             boolean trackQualityCut = Math.max(tracks.get(0).getChi2(), tracks.get(1).getChi2()) < (isGBL ? maxChi2GBLTrack : maxChi2SeedTrack);
-            maxTrkChi2.fill(Math.max(tracks.get(0).getChi2(), tracks.get(1).getChi2()));
-            zVsMaxTrkChi2.fill(Math.max(tracks.get(0).getChi2(), tracks.get(1).getChi2()), v0Vtx.z());
             if (trackQualityCut) {
                 bits.add(Cut.TRK_QUALITY);
             }
 
             boolean v0QualityCut = uncVert.getChi2() < maxVertChi2;
-            v0Chi2.fill(uncVert.getChi2());
-            zVsV0Chi2.fill(uncVert.getChi2(), v0Vtx.z());
             if (v0QualityCut) {
                 bits.add(Cut.VTX_QUALITY);
             }
@@ -540,10 +534,6 @@
             }
 
             boolean trackTimeDiffCut = Math.abs(trackTimes.get(0) - trackTimes.get(1)) < trkTimeDiff;
-            trackTimeDiff.fill(Math.abs(trackTimes.get(0) - trackTimes.get(1)));
-            hitTimeStdDev.fill(stdDev);
-            zVsTrackTimeDiff.fill(Math.abs(trackTimes.get(0) - trackTimes.get(1)), v0Vtx.z());
-            zVsHitTimeStdDev.fill(stdDev, v0Vtx.z());
             if (trackTimeDiffCut) {
                 bits.add(Cut.TIMING);
             }
@@ -557,16 +547,13 @@
 
             boolean clusterMatchCut = !electron.getClusters().isEmpty() && !positron.getClusters().isEmpty();
             boolean clusterTimeCut = clusterMatchCut && Math.abs(ClusterUtilities.getSeedHitTime(electron.getClusters().get(0)) - ClusterUtilities.getSeedHitTime(positron.getClusters().get(0))) < clusterTimeDiffCut;
-            if (clusterMatchCut && clusterTimeCut) {
-                bits.add(Cut.CLUSTER_CUTS);
-            }
+//disable cut for now
+//            if (clusterMatchCut && clusterTimeCut) {
+            bits.add(Cut.CLUSTER_CUTS);
+//            }
 
             boolean eventTrkCountCut = ntrk >= 2 && ntrk <= nTrkMax;
             boolean eventPosCountCut = npos >= 1 && npos <= nPosMax;
-            eventTrkCount.fill(ntrk);
-            eventPosCount.fill(npos);
-            zVsEventTrkCount.fill(ntrk, v0Vtx.z());
-            zVsEventPosCount.fill(npos, v0Vtx.z());
             if (eventTrkCountCut && eventPosCountCut) {
                 bits.add(Cut.EVENT_QUALITY);
             }
@@ -576,10 +563,8 @@
                 bits.add(Cut.FRONT_HITS);
             }
 
-            l1Iso.fill(minL1Iso);
-            zVsL1Iso.fill(minL1Iso, v0Vtx.z());
             boolean isoCut = minL1Iso > l1IsoMin;
-            if (isoCut) {
+            if (!frontHitsCut || isoCut) { //diagnostic plots look better if failing the front hits cut makes you pass this one
                 bits.add(Cut.ISOLATION);
             }
 
@@ -597,22 +582,54 @@
             for (Cut cut : Cut.values()) {
                 EnumSet<Cut> allButThisCut = EnumSet.allOf(Cut.class);
                 allButThisCut.remove(cut);
-                if (bits.equals(allButThisCut)) {
+                if (bits.containsAll(allButThisCut)) {
                     if (uncV0.getMass() > plotsMinMass && uncV0.getMass() < plotsMaxMass) {
-                        cutVertexZ[cut.ordinal()][VERTEX].fill(v0Vtx.z());
+                        switch (cut) {
+                            case ISOLATION:
+                                l1Iso.fill(minL1Iso);
+                                zVsL1Iso.fill(minL1Iso, v0Vtx.z());
+                                break;
+                            case EVENT_QUALITY:
+                                eventTrkCount.fill(ntrk);
+                                eventPosCount.fill(npos);
+                                zVsEventTrkCount.fill(ntrk, v0Vtx.z());
+                                zVsEventPosCount.fill(npos, v0Vtx.z());
+                                break;
+                            case TIMING:
+                                trackTimeDiff.fill(Math.abs(trackTimes.get(0) - trackTimes.get(1)));
+                                hitTimeStdDev.fill(stdDev);
+                                zVsTrackTimeDiff.fill(Math.abs(trackTimes.get(0) - trackTimes.get(1)), v0Vtx.z());
+                                zVsHitTimeStdDev.fill(stdDev, v0Vtx.z());
+                                break;
+                            case VTX_QUALITY:
+                                v0Chi2.fill(uncVert.getChi2());
+                                zVsV0Chi2.fill(uncVert.getChi2(), v0Vtx.z());
+                                break;
+                            case TRK_QUALITY:
+                                maxTrkChi2.fill(Math.max(tracks.get(0).getChi2(), tracks.get(1).getChi2()));
+                                zVsMaxTrkChi2.fill(Math.max(tracks.get(0).getChi2(), tracks.get(1).getChi2()), v0Vtx.z());
+                                break;
+                        }
                     }
-                    cutVertexMass[cut.ordinal()][VERTEX].fill(uncV0.getMass());
-                    cutVertexZVsMass[cut.ordinal()][VERTEX].fill(uncV0.getMass(), v0Vtx.z());
+                    if (!bits.contains(cut)) {
+                        if (uncV0.getMass() > plotsMinMass && uncV0.getMass() < plotsMaxMass) {
+                            cutVertexZ[cut.ordinal()][VERTEX].fill(v0Vtx.z());
+                        }
+                        cutVertexMass[cut.ordinal()][VERTEX].fill(uncV0.getMass());
+                        cutVertexZVsMass[cut.ordinal()][VERTEX].fill(uncV0.getMass(), v0Vtx.z());
+                    }
                 }
 
                 EnumSet<Cut> allTriCutsButThisCut = EnumSet.range(Cut.values()[0], Cut.values()[Cut.firstVertexingCut - 1]);
                 allTriCutsButThisCut.remove(cut);
-                if (bits.containsAll(allTriCutsButThisCut) && !bits.contains(cut)) {
-                    if (uncV0.getMass() > plotsMinMass && uncV0.getMass() < plotsMaxMass) {
-                        cutVertexZ[cut.ordinal()][TRIDENT].fill(v0Vtx.z());
+                if (bits.containsAll(allTriCutsButThisCut)) {
+                    if (!bits.contains(cut)) {
+                        if (uncV0.getMass() > plotsMinMass && uncV0.getMass() < plotsMaxMass) {
+                            cutVertexZ[cut.ordinal()][TRIDENT].fill(v0Vtx.z());
+                        }
+                        cutVertexMass[cut.ordinal()][TRIDENT].fill(uncV0.getMass());
+                        cutVertexZVsMass[cut.ordinal()][TRIDENT].fill(uncV0.getMass(), v0Vtx.z());
                     }
-                    cutVertexMass[cut.ordinal()][TRIDENT].fill(uncV0.getMass());
-                    cutVertexZVsMass[cut.ordinal()][TRIDENT].fill(uncV0.getMass(), v0Vtx.z());
                 }
             }
 
@@ -645,8 +662,8 @@
             Hep3Vector pPosRot = VecOp.mult(beamAxisRotation, positron.getMomentum());
             Hep3Vector v0Vtx = VecOp.mult(beamAxisRotation, bestCandidate.getStartVertex().getPosition());
 
-            triTrackTime2D.fill(tEle, tPos);
-            triTrackTimeDiff.fill(tEle - tPos);
+//            triTrackTime2D.fill(tEle, tPos);
+//            triTrackTimeDiff.fill(tEle - tPos);
             triZVsMomentum.fill(bestCandidate.getMomentum().magnitude(), v0Vtx.z());
             triMassMomentum.fill(bestCandidate.getMomentum().magnitude(), bestCandidate.getMass());
             triTrackMomentum2D.fill(electron.getMomentum().magnitude(), positron.getMomentum().magnitude());
@@ -655,24 +672,24 @@
             triSumP.fill(bestCandidate.getMomentum().magnitude());
             triDeltaP.fill(positron.getMomentum().magnitude() - electron.getMomentum().magnitude());
 
-            triPxPy.fill(pBestV0Rot.x(), pBestV0Rot.y());
+//            triPxPy.fill(pBestV0Rot.x(), pBestV0Rot.y());
             triMass.fill(bestCandidate.getMass());
             triZVsMass.fill(bestCandidate.getMass(), v0Vtx.z());
-            triX.fill(v0Vtx.x());
-            triY.fill(v0Vtx.y());
-            triZ.fill(v0Vtx.z());
-            triPx.fill(pBestV0Rot.x());
-            triPy.fill(pBestV0Rot.y());
-            triPz.fill(pBestV0Rot.z());
-            triU.fill(pBestV0Rot.x() / pBestV0Rot.magnitude());
-            triV.fill(pBestV0Rot.y() / pBestV0Rot.magnitude());
-            triXY.fill(v0Vtx.x(), v0Vtx.y());
-            triZY.fill(v0Vtx.y(), v0Vtx.z());
+//            triX.fill(v0Vtx.x());
+//            triY.fill(v0Vtx.y());
+//            triZ.fill(v0Vtx.z());
+//            triPx.fill(pBestV0Rot.x());
+//            triPy.fill(pBestV0Rot.y());
+//            triPz.fill(pBestV0Rot.z());
+//            triU.fill(pBestV0Rot.x() / pBestV0Rot.magnitude());
+//            triV.fill(pBestV0Rot.y() / pBestV0Rot.magnitude());
+//            triXY.fill(v0Vtx.x(), v0Vtx.y());
+//            triZY.fill(v0Vtx.y(), v0Vtx.z());
             if (bestCandidate.getMomentum().magnitude() > radCut) {
                 triRadTrackTime2D.fill(tEle, tPos);
                 triRadTrackTimeDiff.fill(tEle - tPos);
-                triRadZVsMomentum.fill(bestCandidate.getMomentum().magnitude(), v0Vtx.z());
-                triRadMassMomentum.fill(bestCandidate.getMomentum().magnitude(), bestCandidate.getMass());
+//                triRadZVsMomentum.fill(bestCandidate.getMomentum().magnitude(), v0Vtx.z());
+//                triRadMassMomentum.fill(bestCandidate.getMomentum().magnitude(), bestCandidate.getMass());
                 triRadTrackMomentum2D.fill(electron.getMomentum().magnitude(), positron.getMomentum().magnitude());
                 triRadPyEleVsPyPos.fill(pEleRot.y(), pPosRot.y());
                 triRadPxEleVsPxPos.fill(pEleRot.x(), pPosRot.x());
@@ -682,16 +699,16 @@
                 triRadPxPy.fill(pBestV0Rot.x(), pBestV0Rot.y());
                 triRadMass.fill(bestCandidate.getMass());
                 triRadZVsMass.fill(bestCandidate.getMass(), v0Vtx.z());
-                triRadX.fill(v0Vtx.x());
-                triRadY.fill(v0Vtx.y());
-                triRadZ.fill(v0Vtx.z());
+//                triRadX.fill(v0Vtx.x());
+//                triRadY.fill(v0Vtx.y());
+//                triRadZ.fill(v0Vtx.z());
                 triRadPx.fill(pBestV0Rot.x());
                 triRadPy.fill(pBestV0Rot.y());
                 triRadPz.fill(pBestV0Rot.z());
                 triRadU.fill(pBestV0Rot.x() / pBestV0Rot.magnitude());
                 triRadV.fill(pBestV0Rot.y() / pBestV0Rot.magnitude());
-                triRadXY.fill(v0Vtx.x(), v0Vtx.y());
-                triRadZY.fill(v0Vtx.y(), v0Vtx.z());
+//                triRadXY.fill(v0Vtx.x(), v0Vtx.y());
+//                triRadZY.fill(v0Vtx.y(), v0Vtx.z());
             }
         }
 
@@ -713,8 +730,8 @@
             Hep3Vector pPosRot = VecOp.mult(beamAxisRotation, positron.getMomentum());
             Hep3Vector v0Vtx = VecOp.mult(beamAxisRotation, bestCandidate.getStartVertex().getPosition());
 
-            vertTrackTime2D.fill(tEle, tPos);
-            vertTrackTimeDiff.fill(tEle - tPos);
+//            vertTrackTime2D.fill(tEle, tPos);
+//            vertTrackTimeDiff.fill(tEle - tPos);
             vertZVsMomentum.fill(bestCandidate.getMomentum().magnitude(), v0Vtx.z());
             vertMassMomentum.fill(bestCandidate.getMomentum().magnitude(), bestCandidate.getMass());
             vertTrackMomentum2D.fill(electron.getMomentum().magnitude(), positron.getMomentum().magnitude());
@@ -723,19 +740,19 @@
             vertSumP.fill(bestCandidate.getMomentum().magnitude());
             vertDeltaP.fill(positron.getMomentum().magnitude() - electron.getMomentum().magnitude());
 
-            vertPxPy.fill(pBestV0Rot.x(), pBestV0Rot.y());
+//            vertPxPy.fill(pBestV0Rot.x(), pBestV0Rot.y());
             vertMass.fill(bestCandidate.getMass());
             vertZVsMass.fill(bestCandidate.getMass(), v0Vtx.z());
-            vertX.fill(v0Vtx.x());
-            vertY.fill(v0Vtx.y());
-            vertZ.fill(v0Vtx.z());
-            vertPx.fill(pBestV0Rot.x());
-            vertPy.fill(pBestV0Rot.y());
-            vertPz.fill(pBestV0Rot.z());
-            vertU.fill(pBestV0Rot.x() / pBestV0Rot.magnitude());
-            vertV.fill(pBestV0Rot.y() / pBestV0Rot.magnitude());
-            vertXY.fill(v0Vtx.x(), v0Vtx.y());
-            vertZY.fill(v0Vtx.y(), v0Vtx.z());
+//            vertX.fill(v0Vtx.x());
+//            vertY.fill(v0Vtx.y());
+//            vertZ.fill(v0Vtx.z());
+//            vertPx.fill(pBestV0Rot.x());
+//            vertPy.fill(pBestV0Rot.y());
+//            vertPz.fill(pBestV0Rot.z());
+//            vertU.fill(pBestV0Rot.x() / pBestV0Rot.magnitude());
+//            vertV.fill(pBestV0Rot.y() / pBestV0Rot.magnitude());
+//            vertXY.fill(v0Vtx.x(), v0Vtx.y());
+//            vertZY.fill(v0Vtx.y(), v0Vtx.z());
             if (bestCandidate.getMomentum().magnitude() > radCut) {
                 vertRadTrackTime2D.fill(tEle, tPos);
                 vertRadTrackTimeDiff.fill(tEle - tPos);

Modified: java/branches/jeremy-dev/crawler/src/main/java/org/hps/crawler/EvioMetadataReader.java
 =============================================================================
--- java/branches/jeremy-dev/crawler/src/main/java/org/hps/crawler/EvioMetadataReader.java	(original)
+++ java/branches/jeremy-dev/crawler/src/main/java/org/hps/crawler/EvioMetadataReader.java	Tue Dec  8 20:48:40 2015
@@ -214,7 +214,15 @@
         LOGGER.info("done reading " + events + " events");
 
         // Rough trigger rate calculation.
-        triggerRate = calculateTriggerRate(firstHeadTimestamp, lastHeadTimestamp, events);
+        try {
+            if (firstHeadTimestamp != null && lastHeadTimestamp != null && events > 0) {
+                triggerRate = calculateTriggerRate(firstHeadTimestamp, lastHeadTimestamp, events);
+            } else {
+                LOGGER.log(Level.WARNING, "Missing information for calculating trigger rate.");
+            }
+        } catch (Exception e) {
+            LOGGER.log(Level.WARNING, "Error calculating trigger rate.", e);
+        }
 
         // Create and fill the metadata map.
         final Map<String, Object> metadataMap = new LinkedHashMap<String, Object>();

Modified: java/branches/jeremy-dev/crawler/src/main/java/org/hps/crawler/FileSet.java
 =============================================================================
--- java/branches/jeremy-dev/crawler/src/main/java/org/hps/crawler/FileSet.java	(original)
+++ java/branches/jeremy-dev/crawler/src/main/java/org/hps/crawler/FileSet.java	Tue Dec  8 20:48:40 2015
@@ -12,7 +12,7 @@
  * 
  * @author Jeremy McCormick, SLAC
  */
-public class FileSet extends HashMap<DatasetFileFormat, List<File>> {
+final class FileSet extends HashMap<DatasetFileFormat, List<File>> {
     
     List<File> get(DatasetFileFormat format) {
         if (super.get(format) == null) {

Modified: java/branches/jeremy-dev/ecal-recon/src/main/java/org/hps/recon/ecal/EcalOnlineRawConverter.java
 =============================================================================
--- java/branches/jeremy-dev/ecal-recon/src/main/java/org/hps/recon/ecal/EcalOnlineRawConverter.java	(original)
+++ java/branches/jeremy-dev/ecal-recon/src/main/java/org/hps/recon/ecal/EcalOnlineRawConverter.java	Tue Dec  8 20:48:40 2015
@@ -46,7 +46,7 @@
 				System.out.println("======================================================================");
 				System.out.println("=== FADC Pulse-Processing Settings ===================================");
 				System.out.println("======================================================================");
-				config.printConfig();
+				config.printConfig(System.out);
 			}
     	});
     }

Modified: java/branches/jeremy-dev/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverter.java
 =============================================================================
--- java/branches/jeremy-dev/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverter.java	(original)
+++ java/branches/jeremy-dev/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverter.java	Tue Dec  8 20:48:40 2015
@@ -181,7 +181,7 @@
 					System.out.println("======================================================================");
 					System.out.println("=== FADC Pulse-Processing Settings ===================================");
 					System.out.println("======================================================================");
-					config.printConfig();
+					config.printConfig(System.out);
 				}
 			}
     	});

Modified: java/branches/jeremy-dev/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ClusterPositionCorrection.java
 =============================================================================
--- java/branches/jeremy-dev/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ClusterPositionCorrection.java	(original)
+++ java/branches/jeremy-dev/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ClusterPositionCorrection.java	Tue Dec  8 20:48:40 2015
@@ -12,30 +12,29 @@
  * @author Jeremy McCormick <[log in to unmask]>
  */
 public final class ClusterPositionCorrection {
-           
+    //Parameterizations tested in MC using v3-fieldmap
+    //Nov 2015
+      
     // Variables for electron position corrections.
-    static final double ELECTRON_POS_A1 = -0.0005813;//0.0066;
-    static final double ELECTRON_POS_A2 = 0.005738;//-0.03;
-    static final double ELECTRON_POS_A3 = -0.0309;
-    static final double ELECTRON_POS_B1 = 0.02963;//0.028;
-    static final double ELECTRON_POS_B2 = -4.289;//-0.451;
-    static final double ELECTRON_POS_B3 = 4.596;//0.465;
+    static final double ELECTRON_POS_A1 = 0.004483;
+    static final double ELECTRON_POS_A2 = -0.02884;
+    static final double ELECTRON_POS_B1 = 0.6197;
+    static final double ELECTRON_POS_B2 = -2.279;
+    static final double ELECTRON_POS_B3 = 3.66;
     
     // Variables for positron position corrections.
-    static final double POSITRON_POS_A1 = -0.0006243;//0.0072;
-    static final double POSITRON_POS_A2 = 0.006799;//-0.031;
-    static final double POSITRON_POS_A3 = -0.03141;
-    static final double POSITRON_POS_B1 = 0.0869;//0.007;
-    static final double POSITRON_POS_B2 = 2.965;//0.342;
-    static final double POSITRON_POS_B3 = 1.653;//0.108;
+    static final double POSITRON_POS_A1 = 0.006887;
+    static final double POSITRON_POS_A2 = -0.03207;
+    static final double POSITRON_POS_B1 = -0.8048;
+    static final double POSITRON_POS_B2 = 0.9366;
+    static final double POSITRON_POS_B3 = 2.628;
     
     // Variables for photon position corrections.
-    static final double PHOTON_POS_A1 = -0.0006329;//0.005;
-    static final double PHOTON_POS_A2 = 0.00595;//-0.032;
-    static final double PHOTON_POS_A3 = -0.03563;
-    static final double PHOTON_POS_B1 = 0.06444;//0.011;
-    static final double PHOTON_POS_B2 = -0.5836;//-0.037;
-    static final double PHOTON_POS_B3 = 3.508;//0.294;
+    static final double PHOTON_POS_A1 = 0.005385;
+    static final double PHOTON_POS_A2 = -0.03562;
+    static final double PHOTON_POS_B1 = -0.1948;
+    static final double PHOTON_POS_B2 = -0.7991;
+    static final double PHOTON_POS_B3 = 3.797;
     
   
     public static double[] calculateCorrectedPosition(Cluster cluster) {
@@ -66,13 +65,13 @@
         double xCorr;
         switch(pdg) {
             case 11: //Particle is electron        
-                xCorr = positionCorrection(xPos, rawEnergy, ELECTRON_POS_A1, ELECTRON_POS_A2, ELECTRON_POS_A3, ELECTRON_POS_B1, ELECTRON_POS_B2, ELECTRON_POS_B3);
+                xCorr = positionCorrection(xPos, rawEnergy, ELECTRON_POS_A1, ELECTRON_POS_A2, ELECTRON_POS_B1, ELECTRON_POS_B2, ELECTRON_POS_B3);
                 return xCorr;
             case -11:// Particle is positron       
-                xCorr = positionCorrection(xPos, rawEnergy, POSITRON_POS_A1, POSITRON_POS_A2, POSITRON_POS_A3, POSITRON_POS_B1, POSITRON_POS_B2, POSITRON_POS_B3);
+                xCorr = positionCorrection(xPos, rawEnergy, POSITRON_POS_A1, POSITRON_POS_A2, POSITRON_POS_B1, POSITRON_POS_B2, POSITRON_POS_B3);
                 return xCorr;
             case 22: // Particle is photon      
-                xCorr = positionCorrection(xPos, rawEnergy, PHOTON_POS_A1, PHOTON_POS_A2, PHOTON_POS_A3, PHOTON_POS_B1, PHOTON_POS_B2, PHOTON_POS_B3);
+                xCorr = positionCorrection(xPos, rawEnergy, PHOTON_POS_A1, PHOTON_POS_A2, PHOTON_POS_B1, PHOTON_POS_B2, PHOTON_POS_B3);
                 return xCorr;
             default: //Unknown 
                 xCorr = xPos;
@@ -94,8 +93,8 @@
     * @param varB3
     * @return
     */    
-    private static double positionCorrection(double xCl, double rawEnergy, double varA1, double varA2, double varA3, double varB1, double varB2, double varB3) {
+    private static double positionCorrection(double xCl, double rawEnergy, double varA1, double varA2, double varB1, double varB2, double varB3) {
         //return ((xCl - (varB1 * rawEnergy + varB2 / Math.sqrt(rawEnergy) + varB3))/(varA1 / Math.sqrt(rawEnergy) + varA2 + 1));
-    	return ((xCl - (varB1 * rawEnergy + varB2 / Math.sqrt(rawEnergy) + varB3))/(varA1 * rawEnergy + varA2 / Math.sqrt(rawEnergy) + varA3 + 1));
+    	return ((xCl - (varB1 * rawEnergy + varB2 / Math.sqrt(rawEnergy) + varB3))/(varA1 / Math.sqrt(rawEnergy) + varA2 + 1));
     }
-}
+}

Modified: java/branches/jeremy-dev/job/src/main/java/org/hps/job/JobManager.java
 =============================================================================
--- java/branches/jeremy-dev/job/src/main/java/org/hps/job/JobManager.java	(original)
+++ java/branches/jeremy-dev/job/src/main/java/org/hps/job/JobManager.java	Tue Dec  8 20:48:40 2015
@@ -1,5 +1,10 @@
 package org.hps.job;
 
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.Options;
 import org.hps.conditions.ConditionsDriver;
 import org.hps.conditions.database.DatabaseConditionsManager;
 import org.hps.detector.svt.SvtDetectorSetup;
@@ -15,6 +20,11 @@
  */
 public class JobManager extends JobControlManager {
 
+    /**
+     * The set of conditions tags (none by default).
+     */
+    private Set<String> tags = null;
+    
     /**
      * Run the job manager from the command line.
      *
@@ -33,6 +43,25 @@
     public JobManager() {
     }
    
+    @Override
+    protected Options createCommandLineOptions() {
+        Options options = super.createCommandLineOptions();
+        options.addOption("t", "tag", true, "conditions system tag (can be used multiple times)");
+        return options;
+    }
+    
+    @Override
+    public CommandLine parse(final String args[]) {
+        CommandLine commandLine = super.parse(args);
+        if (commandLine.hasOption("t")) {
+            tags = new HashSet<String>();
+            for (String tag : commandLine.getOptionValues("t")) {
+                tags.add(tag);
+            }
+        }
+        return commandLine;
+    }
+    
     /**
      * Initialize the conditions system for the job.
      * <p>
@@ -52,21 +81,26 @@
         
         // Add class that will setup SVT detector with conditions data.
         dbManager.addConditionsListener(new SvtDetectorSetup());
-                
-        // Call super method which will initialize conditions system if the detector and run were provided.
+        
+        // Add conditions system tags.
+        if (this.tags != null) {
+            dbManager.addTags(tags);
+        }
+                       
+        // Call super method which will initialize the conditions system if both the detector and run were provided.
         super.initializeConditions();
         
-        // Setup from conditions driver (to be deleted soon).
+        // Setup from conditions driver (to be deleted soon!).
         if (!dbManager.isInitialized()) {
             setupConditionsDriver();
         } else {
             // Command line options overrode the conditions driver.
-            LOGGER.config("conditions driver was overridden by command line options");
+            LOGGER.config("Conditions driver was overridden by command line options!");
         }
         
         if (dbManager.isInitialized()) {
-            // Assume conditions system should be frozen since detector and run were provided explicitly.
-            LOGGER.config("job manager freezing conditions system");
+            // Assume conditions system should be frozen since detector and run were both set explicitly.
+            LOGGER.config("Job manager is freezing the conditions system.");
             dbManager.freeze();
         }
     }
@@ -84,6 +118,9 @@
 
         // Close the conditions database connection if it is open.
         DatabaseConditionsManager.getInstance().closeConnection();
+                
+        // Close the connection to the run db if necessary.
+        RunManager.getRunManager().closeConnection();
 
         return result;
     }

Modified: java/branches/jeremy-dev/monitoring-app/src/main/java/org/hps/monitoring/application/util/TableExporter.java
 =============================================================================
--- java/branches/jeremy-dev/monitoring-app/src/main/java/org/hps/monitoring/application/util/TableExporter.java	(original)
+++ java/branches/jeremy-dev/monitoring-app/src/main/java/org/hps/monitoring/application/util/TableExporter.java	Tue Dec  8 20:48:40 2015
@@ -33,7 +33,7 @@
 
         // Column headers.
         for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) {
-            buffer.append("\"" + model.getColumnName(columnIndex) + "\"" + fieldDelimiter);
+            buffer.append("\"" + model.getColumnName(columnIndex) + "\"" + fieldDelimiter + ",");
         }
         buffer.setLength(buffer.length() - 1);
         buffer.append('\n');
@@ -47,6 +47,7 @@
                 } else {
                     buffer.append("\"" + value + "\"" + fieldDelimiter);
                 }
+                buffer.append(",");
             }
             buffer.setLength(buffer.length() - 1);
             buffer.append('\n');

Modified: java/branches/jeremy-dev/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/PedestalPlots.java
 =============================================================================
--- java/branches/jeremy-dev/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/PedestalPlots.java	(original)
+++ java/branches/jeremy-dev/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/PedestalPlots.java	Tue Dec  8 20:48:40 2015
@@ -23,6 +23,7 @@
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
+import org.hps.recon.tracking.SvtPlotUtils;
 //===> import org.hps.conditions.deprecated.HPSSVTCalibrationConstants;
 //===> import org.hps.conditions.deprecated.SvtUtils;
 import org.lcsim.detector.tracker.silicon.HpsSiSensor;

Modified: java/branches/jeremy-dev/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SampleZeroHVBiasChecker.java
 =============================================================================
--- java/branches/jeremy-dev/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SampleZeroHVBiasChecker.java	(original)
+++ java/branches/jeremy-dev/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SampleZeroHVBiasChecker.java	Tue Dec  8 20:48:40 2015
@@ -28,6 +28,7 @@
 import org.hps.conditions.svt.SvtBiasMyaDataReader;
 import org.hps.conditions.svt.SvtBiasMyaDataReader.SvtBiasMyaRange;
 import org.hps.conditions.svt.SvtBiasMyaDataReader.SvtBiasRunRange;
+import org.hps.recon.tracking.SvtPlotUtils;
 import org.hps.record.epics.EpicsData;
 import org.hps.record.triggerbank.AbstractIntData;
 import org.hps.record.triggerbank.HeadBankData;

Modified: java/branches/jeremy-dev/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SensorOccupancyPlotsDriver.java
 =============================================================================
--- java/branches/jeremy-dev/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SensorOccupancyPlotsDriver.java	(original)
+++ java/branches/jeremy-dev/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SensorOccupancyPlotsDriver.java	Tue Dec  8 20:48:40 2015
@@ -36,6 +36,7 @@
 import org.lcsim.recon.tracking.digitization.sisim.SiTrackerHitStrip1D;
 import org.lcsim.recon.tracking.digitization.sisim.TrackerHitType;
 import org.lcsim.util.Driver;
+import org.hps.recon.tracking.SvtPlotUtils;
 import org.hps.record.triggerbank.AbstractIntData;
 import org.hps.record.triggerbank.TIData;
 import org.lcsim.util.aida.AIDA;

Modified: java/branches/jeremy-dev/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SvtClusterPlots.java
 =============================================================================
--- java/branches/jeremy-dev/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SvtClusterPlots.java	(original)
+++ java/branches/jeremy-dev/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SvtClusterPlots.java	Tue Dec  8 20:48:40 2015
@@ -16,6 +16,7 @@
 import hep.aida.jfree.plotter.Plotter;
 import hep.aida.jfree.plotter.PlotterRegion;
 import hep.aida.ref.rootwriter.RootFileStore;
+
 import java.util.HashSet;
 import java.util.Set;
 
@@ -25,8 +26,8 @@
 import org.lcsim.geometry.Detector;
 import org.lcsim.recon.tracking.digitization.sisim.SiTrackerHitStrip1D;
 import org.lcsim.util.Driver;
-
 import org.hps.recon.tracking.FittedRawTrackerHit;
+import org.hps.recon.tracking.SvtPlotUtils;
 import org.lcsim.detector.tracker.silicon.DopedSilicon;
 import org.lcsim.util.aida.AIDA;
 

Modified: java/branches/jeremy-dev/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SvtHitPlots.java
 =============================================================================
--- java/branches/jeremy-dev/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SvtHitPlots.java	(original)
+++ java/branches/jeremy-dev/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SvtHitPlots.java	Tue Dec  8 20:48:40 2015
@@ -2,6 +2,7 @@
 
 import hep.aida.IAnalysisFactory;
 import hep.aida.IHistogram1D;
+import hep.aida.IHistogram2D;
 import hep.aida.IHistogramFactory;
 import hep.aida.IPlotter;
 import hep.aida.IPlotterFactory;
@@ -9,18 +10,19 @@
 import hep.aida.ITree;
 import hep.aida.jfree.plotter.Plotter;
 import hep.aida.jfree.plotter.PlotterRegion;
-
+import hep.aida.ref.rootwriter.RootFileStore;
+
+import java.io.IOException;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
-
+
+import org.hps.recon.tracking.SvtPlotUtils;
 import org.lcsim.detector.tracker.silicon.HpsSiSensor;
-import org.lcsim.util.Driver;
-import org.lcsim.geometry.Detector;
 import org.lcsim.event.EventHeader;
 import org.lcsim.event.RawTrackerHit;
+import org.lcsim.geometry.Detector;
+import org.lcsim.util.Driver;
 import org.lcsim.util.aida.AIDA;
 
 /**
@@ -28,6 +30,8 @@
  * event.
  *
  * @author Omar Moreno <[log in to unmask]>
+ * @author Per Hansson Adrian <[log in to unmask]>
+ * 
  */
 public class SvtHitPlots extends Driver {
 
@@ -49,6 +53,8 @@
     private static Map<String, IHistogram1D> layersHitPlots = new HashMap<String, IHistogram1D>();
     private static Map<String, IHistogram1D> hitCountPlots = new HashMap<String, IHistogram1D>();
     private static Map<String, IHistogram1D> firstSamplePlots = new HashMap<String, IHistogram1D>();
+    private static Map<String, IHistogram1D> firstSamplePlotsNoise = new HashMap<String, IHistogram1D>();
+    private static Map<String, IHistogram2D> firstSamplePlotsNoisePerChannel = new HashMap<String, IHistogram2D>();
 
     private List<HpsSiSensor> sensors;
 
@@ -62,6 +68,10 @@
     double totalBotHitCount = 0;
 
     private boolean dropSmallHitEvents = true;
+    private static final boolean debug = false;
+    private static final boolean doPerChannelSamplePlots = false;
+    private static final boolean saveRootFile = false;
+    private String outputRootFilename = "";
 
     public void setDropSmallHitEvents(boolean dropSmallHitEvents) {
         this.dropSmallHitEvents = dropSmallHitEvents;
@@ -137,6 +147,9 @@
         for (HpsSiSensor sensor : sensors) {
             hitsPerSensorPlots.get(sensor.getName()).reset();
             firstSamplePlots.get(sensor.getName()).reset();
+            firstSamplePlotsNoise.get(sensor.getName()).reset();
+            if(doPerChannelSamplePlots)
+                firstSamplePlotsNoisePerChannel.get(sensor.getName()).reset();
         }
 
         for (IHistogram1D histogram : layersHitPlots.values()) {
@@ -203,11 +216,34 @@
 
         plotters.put("First sample distributions (pedestal shifts)", plotterFactory.create("First sample distributions (pedestal shifts)"));
         plotters.get("First sample distributions (pedestal shifts)").createRegions(6, 6);
+
+        plotters.put("First sample distributions (pedestal shifts, MAX_SAMPLE>=4)", plotterFactory.create("First sample distributions (pedestal shifts, MAX_SAMPLE>=4)"));
+        plotters.get("First sample distributions (pedestal shifts, MAX_SAMPLE>=4)").createRegions(6, 6);
+        
+        if(doPerChannelSamplePlots) {
+            plotters.put("First sample channel distributions (pedestal shifts, MAX_SAMPLE>=4)", plotterFactory.create("First sample channel distributions (pedestal shifts, MAX_SAMPLE>=4)"));
+            plotters.get("First sample channel distributions (pedestal shifts, MAX_SAMPLE>=4)").createRegions(6, 6);
+        }
+
+        
         for (HpsSiSensor sensor : sensors) {
             firstSamplePlots.put(sensor.getName(),
                     histogramFactory.createHistogram1D(sensor.getName() + " - first sample", 100, -500.0, 2000.0));
             plotters.get("First sample distributions (pedestal shifts)").region(this.computePlotterRegion(sensor))
                     .plot(firstSamplePlots.get(sensor.getName()), this.createStyle(sensor, "First sample - pedestal [ADC counts]", ""));
+            firstSamplePlotsNoise.put(sensor.getName(),
+                    histogramFactory.createHistogram1D(sensor.getName() + " - first sample (MAX_SAMPLE>=4)", 100, -500.0, 2000.0));
+            plotters.get("First sample distributions (pedestal shifts, MAX_SAMPLE>=4)").region(this.computePlotterRegion(sensor))
+                    .plot(firstSamplePlotsNoise.get(sensor.getName()), this.createStyle(sensor, "First sample - pedestal (MAX_SAMPLE>=4) [ADC counts]", ""));
+
+            if( doPerChannelSamplePlots ) {
+                firstSamplePlotsNoisePerChannel.put(sensor.getName(),
+                        histogramFactory.createHistogram2D(sensor.getName() + " channels - first sample (MAX_SAMPLE>=4)", 640, -0.5,639.5, 20, -500.0, 500.0));
+                plotters.get("First sample channel distributions (pedestal shifts, MAX_SAMPLE>=4)").region(this.computePlotterRegion(sensor))
+                .plot(firstSamplePlotsNoisePerChannel.get(sensor.getName()), this.createStyle(sensor, "First sample channels - pedestal (MAX_SAMPLE>=4) [ADC counts]", ""));
+            }
+        
+        
         }
 
         for (IPlotter plotter : plotters.values()) {
@@ -228,8 +264,15 @@
             return;
         }
 
+        if(debug && ((int) eventCount % 100 == 0) )
+            System.out.println(this.getClass().getSimpleName() + ": processed " + String.valueOf(eventCount) + " events");
+        
         eventCount++;
-
+        
+
+        if(outputRootFilename.isEmpty())
+            outputRootFilename = "run" + String.valueOf( event.getRunNumber());
+        
         // Get RawTrackerHit collection from event.
         List<RawTrackerHit> rawHits = event.get(RawTrackerHit.class, rawTrackerHitCollectionName);
 
@@ -240,8 +283,28 @@
         this.clearHitMaps();
         for (RawTrackerHit rawHit : rawHits) {
             HpsSiSensor sensor = (HpsSiSensor) rawHit.getDetectorElement();
+            int channel = rawHit.getIdentifierFieldValue("strip");
+            double pedestal = sensor.getPedestal(channel,0);
+            // Find the sample with maximum ADC count
+            int maxSample = 0;
+            double maxSampleValue = 0;
+            for (int s = 0; s < 6; ++s) {
+                if (((double) rawHit.getADCValues()[s] - pedestal) > maxSampleValue) {
+                    maxSample = s;
+                    maxSampleValue = ((double) rawHit.getADCValues()[s]) - pedestal;
+                }
+            }
+
             hitsPerSensor.get(sensor.getName())[0]++;
-            firstSamplePlots.get(sensor.getName()).fill(rawHit.getADCValues()[0] - sensor.getPedestal(rawHit.getIdentifierFieldValue("strip"), 0));
+            firstSamplePlots.get(sensor.getName()).fill(rawHit.getADCValues()[0] - pedestal);
+            if (maxSample >= 4) {
+                firstSamplePlotsNoise.get(sensor.getName()).fill(rawHit.getADCValues()[0] - pedestal);
+                
+                if( doPerChannelSamplePlots ) {
+                    firstSamplePlotsNoisePerChannel.get(sensor.getName()).fill(channel, rawHit.getADCValues()[0] - pedestal);
+                }
+            
+            }
         }
 
         int[] topLayersHit = new int[12];
@@ -300,6 +363,19 @@
         System.out.println("% Total Top SVT Hits/Event: " + totalTopHitCount / eventCount);
         System.out.println("% Total Bottom SVT Hits/Event: " + totalBotHitCount / eventCount);
         System.out.println("\n%================================================%");
+        
+        if(saveRootFile) {
+            String rootFileName = outputRootFilename.isEmpty() ? "svthitplots.root" : outputRootFilename + "_svthitplots.root";
+            RootFileStore rootFileStore = new RootFileStore(rootFileName);
+            try {
+                rootFileStore.open();
+                rootFileStore.add(tree);
+                rootFileStore.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        
     }
 
 }

Modified: java/branches/jeremy-dev/parent/pom.xml
 =============================================================================
--- java/branches/jeremy-dev/parent/pom.xml	(original)
+++ java/branches/jeremy-dev/parent/pom.xml	Tue Dec  8 20:48:40 2015
@@ -290,6 +290,11 @@
                     </exclusion>
                 </exclusions>
             </dependency>
+            <dependency>
+                <groupId>org.lcsim</groupId>
+                <artifactId>lcsim-detector-framework</artifactId>
+                <version>3.1.6-SNAPSHOT</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>
     <reporting>

Modified: java/branches/jeremy-dev/recon/src/main/java/org/hps/recon/particle/ReconParticleDriver.java
 =============================================================================
--- java/branches/jeremy-dev/recon/src/main/java/org/hps/recon/particle/ReconParticleDriver.java	(original)
+++ java/branches/jeremy-dev/recon/src/main/java/org/hps/recon/particle/ReconParticleDriver.java	Tue Dec  8 20:48:40 2015
@@ -645,7 +645,7 @@
     // Beam size variables.
     // The beamsize array is in the tracking frame
     /* TODO  mg-May 14, 2014:  the the beam size from the conditions db...also beam position!  */
-    protected double[] beamSize = {0.001, 0.2, 0.02};
+    protected double[] beamSize = {0.001, 0.130, 0.050}; //rough estimate from harp scans during engineering run production running
     protected double bField;
 
     //  flipSign is a kludge...

Modified: java/branches/jeremy-dev/recon/src/main/java/org/hps/recon/utils/TrackClusterMatcher.java
 =============================================================================
--- java/branches/jeremy-dev/recon/src/main/java/org/hps/recon/utils/TrackClusterMatcher.java	(original)
+++ java/branches/jeremy-dev/recon/src/main/java/org/hps/recon/utils/TrackClusterMatcher.java	Tue Dec  8 20:48:40 2015
@@ -173,6 +173,31 @@
         this.topClusterTrackMatchDeltaYHigh = yHigh;
     }
 
+    /**
+     * Get distance between track and cluster.
+     * 
+     * @param cluster
+     * @param track
+     * @return distance between cluster and track
+     */
+    public double getDistance(Cluster cluster,Track track) {
+        
+    	// Get the cluster position
+        Hep3Vector cPos = new BasicHep3Vector(cluster.getPosition());
+        
+        // Extrapolate the track to the Ecal cluster position
+        Hep3Vector tPos = null;
+        if (this.useAnalyticExtrapolator) {
+            tPos = TrackUtils.extrapolateTrack(track, cPos.z());
+        } else {
+            TrackState trackStateAtEcal = TrackUtils.getTrackStateAtECal(track);
+            tPos = new BasicHep3Vector(trackStateAtEcal.getReferencePoint());
+            tPos = CoordinateTransformations.transformVectorToDetector(tPos);
+        }
+        
+        return Math.sqrt(Math.pow(cPos.x()-tPos.x(),2)+Math.pow(cPos.y()-tPos.y(),2));
+    }
+    
     /**
      * Determine if a track is matched to a cluster. Currently, this is
      * determined by checking that the track and cluster are within the same

Modified: java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/daqconfig/DAQConfig.java
 =============================================================================
--- java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/daqconfig/DAQConfig.java	(original)
+++ java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/daqconfig/DAQConfig.java	Tue Dec  8 20:48:40 2015
@@ -1,4 +1,8 @@
 package org.hps.record.daqconfig;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+
 
 /**
  * Class <code>DAQConfig</code> holds all of the supported parameters
@@ -47,13 +51,23 @@
     }
 
     @Override
-    public void printConfig() {
+    public void printConfig(PrintStream ps) {
         // Print the system-specific objects.
-        fadcConfig.printConfig();
-        System.out.println();
-        gtpConfig.printConfig();
-        System.out.println();
-        sspConfig.printConfig();
+        fadcConfig.printConfig(ps);
+        ps.println();
+        gtpConfig.printConfig(ps);
+        ps.println();
+        sspConfig.printConfig(ps);
     }
-    
-}
+
+    public String toString() {
+        ByteArrayOutputStream os = new ByteArrayOutputStream();
+        PrintStream ps = new PrintStream(os);
+        printConfig(ps);
+        try {
+            return os.toString("UTF8");
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+}

Modified: java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/daqconfig/FADCConfig.java
 =============================================================================
--- java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/daqconfig/FADCConfig.java	(original)
+++ java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/daqconfig/FADCConfig.java	Tue Dec  8 20:48:40 2015
@@ -1,6 +1,7 @@
 package org.hps.record.daqconfig;
 
 import java.awt.Point;
+import java.io.PrintStream;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -305,18 +306,18 @@
     }
     
     @Override
-    public void printConfig() {
+    public void printConfig(PrintStream ps) {
     	// Print the basic configuration information.
-        System.out.println("FADC Configuration:");
-        System.out.printf("\tMode          :: %d%n", mode);
-        System.out.printf("\tNSA           :: %d%n", nsa);
-        System.out.printf("\tNSB           :: %d%n", nsb);
-        System.out.printf("\tWindow Width  :: %d%n", windowWidth);
-        System.out.printf("\tWindow Offset :: %d%n", offset);
-        System.out.printf("\tMax Peaks     :: %d%n", maxPulses);
+        ps.println("FADC Configuration:");
+        ps.printf("\tMode          :: %d%n", mode);
+        ps.printf("\tNSA           :: %d%n", nsa);
+        ps.printf("\tNSB           :: %d%n", nsb);
+        ps.printf("\tWindow Width  :: %d%n", windowWidth);
+        ps.printf("\tWindow Offset :: %d%n", offset);
+        ps.printf("\tMax Peaks     :: %d%n", maxPulses);
         
         // Output the pedestal/gain write-out header.
-        System.out.println("\tix\tiy\tPedestal (ADC)\tGain (MeV/ADC)\tThreshold (ADC)");
+        ps.println("\tix\tiy\tPedestal (ADC)\tGain (MeV/ADC)\tThreshold (ADC)");
         
         // Iterate over each crystal y-index.
         yLoop:
@@ -335,7 +336,7 @@
         		
         		// Output the crystal indices, pedestal, and gain.
         		int channelID = indexChannelMap.get(new Point(ix, iy));
-        		System.out.printf("\t%3d\t%3d\t%8.3f\t%8.3f\t%4d%n", ix, iy,
+        		ps.printf("\t%3d\t%3d\t%8.3f\t%8.3f\t%4d%n", ix, iy,
         				getPedestal(channelID), getGain(channelID), getThreshold(channelID));
         	}
         }

Modified: java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/daqconfig/GTPConfig.java
 =============================================================================
--- java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/daqconfig/GTPConfig.java	(original)
+++ java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/daqconfig/GTPConfig.java	Tue Dec  8 20:48:40 2015
@@ -1,4 +1,6 @@
 package org.hps.record.daqconfig;
+
+import java.io.PrintStream;
 
 /**
  * Class <code>GTPConfig</code> stores GTP configuration settings
@@ -57,14 +59,14 @@
     }
     
     @Override
-    public void printConfig() {
+    public void printConfig(PrintStream ps) {
         // Print the configuration header.
-        System.out.println("GTP Configuration:");
+        ps.println("GTP Configuration:");
         
         // Print the GTP settings.
-        System.out.printf("\tTime Window Before :: %d clock-cycles%n", windowBefore);
-        System.out.printf("\tTime Window After  :: %d clock-cycles%n", windowAfter);
-        System.out.printf("\tSeed Energy Min    :: %5.3f GeV%n",       seedCut.getLowerBound());
+        ps.printf("\tTime Window Before :: %d clock-cycles%n", windowBefore);
+        ps.printf("\tTime Window After  :: %d clock-cycles%n", windowAfter);
+        ps.printf("\tSeed Energy Min    :: %5.3f GeV%n",       seedCut.getLowerBound());
     }
 
 }

Modified: java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/daqconfig/IDAQConfig.java
 =============================================================================
--- java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/daqconfig/IDAQConfig.java	(original)
+++ java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/daqconfig/IDAQConfig.java	Tue Dec  8 20:48:40 2015
@@ -1,4 +1,6 @@
 package org.hps.record.daqconfig;
+
+import java.io.PrintStream;
 
 
 /**
@@ -20,5 +22,5 @@
      * Prints a textual representation of the configuration bank to the
      * terminal.
      */
-    public abstract void printConfig();
+    public abstract void printConfig(PrintStream ps);
 }

Modified: java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/daqconfig/SSPConfig.java
 =============================================================================
--- java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/daqconfig/SSPConfig.java	(original)
+++ java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/daqconfig/SSPConfig.java	Tue Dec  8 20:48:40 2015
@@ -1,4 +1,6 @@
 package org.hps.record.daqconfig;
+
+import java.io.PrintStream;
 
 
 /**
@@ -98,64 +100,64 @@
     }
     
     @Override
-    public void printConfig() {
+    public void printConfig(PrintStream ps) {
         // Print the configuration header.
-        System.out.println("SSP Configuration:");
+        ps.println("SSP Configuration:");
         
         // Print the singles triggers.
         for(int triggerNum = 0; triggerNum < 2; triggerNum++) {
-            System.out.printf("\tSingles Trigger %d%n", (triggerNum + 1));
-            System.out.println("\t\tCluster Energy Lower Bound Cut");
-            System.out.printf("\t\t\tEnabled :: %b%n", singlesTrigger[triggerNum].getEnergyMinCutConfig().isEnabled());
-            System.out.printf("\t\t\tValue   :: %5.3f GeV%n", singlesTrigger[triggerNum].getEnergyMinCutConfig().getLowerBound());
+            ps.printf("\tSingles Trigger %d%n", (triggerNum + 1));
+            ps.println("\t\tCluster Energy Lower Bound Cut");
+            ps.printf("\t\t\tEnabled :: %b%n", singlesTrigger[triggerNum].getEnergyMinCutConfig().isEnabled());
+            ps.printf("\t\t\tValue   :: %5.3f GeV%n", singlesTrigger[triggerNum].getEnergyMinCutConfig().getLowerBound());
             
-            System.out.println("\t\tCluster Energy Upper Bound Cut");
-            System.out.printf("\t\t\tEnabled :: %b%n", singlesTrigger[triggerNum].getEnergyMaxCutConfig().isEnabled());
-            System.out.printf("\t\t\tValue   :: %5.3f GeV%n", singlesTrigger[triggerNum].getEnergyMaxCutConfig().getUpperBound());
+            ps.println("\t\tCluster Energy Upper Bound Cut");
+            ps.printf("\t\t\tEnabled :: %b%n", singlesTrigger[triggerNum].getEnergyMaxCutConfig().isEnabled());
+            ps.printf("\t\t\tValue   :: %5.3f GeV%n", singlesTrigger[triggerNum].getEnergyMaxCutConfig().getUpperBound());
             
-            System.out.println("\t\tCluster Hit Count Cut");
-            System.out.printf("\t\t\tEnabled :: %b%n", singlesTrigger[triggerNum].getHitCountCutConfig().isEnabled());
-            System.out.printf("\t\t\tValue   :: %1.0f hits%n", singlesTrigger[triggerNum].getHitCountCutConfig().getLowerBound());
-            System.out.println();
+            ps.println("\t\tCluster Hit Count Cut");
+            ps.printf("\t\t\tEnabled :: %b%n", singlesTrigger[triggerNum].getHitCountCutConfig().isEnabled());
+            ps.printf("\t\t\tValue   :: %1.0f hits%n", singlesTrigger[triggerNum].getHitCountCutConfig().getLowerBound());
+            ps.println();
         }
         
         // Print the pair triggers.
         for(int triggerNum = 0; triggerNum < 2; triggerNum++) {
-            System.out.printf("\tPair Trigger %d%n", (triggerNum + 1));
-            System.out.println("\t\tCluster Energy Lower Bound Cut");
-            System.out.printf("\t\t\tEnabled :: %b%n", pairTrigger[triggerNum].getEnergyMinCutConfig().isEnabled());
-            System.out.printf("\t\t\tValue   :: %5.3f GeV%n", pairTrigger[triggerNum].getEnergyMinCutConfig().getLowerBound());
+            ps.printf("\tPair Trigger %d%n", (triggerNum + 1));
+            ps.println("\t\tCluster Energy Lower Bound Cut");
+            ps.printf("\t\t\tEnabled :: %b%n", pairTrigger[triggerNum].getEnergyMinCutConfig().isEnabled());
+            ps.printf("\t\t\tValue   :: %5.3f GeV%n", pairTrigger[triggerNum].getEnergyMinCutConfig().getLowerBound());
             
-            System.out.println("\t\tCluster Energy Upper Bound Cut");
-            System.out.printf("\t\t\tEnabled :: %b%n", pairTrigger[triggerNum].getEnergyMaxCutConfig().isEnabled());
-            System.out.printf("\t\t\tValue   :: %5.3f GeV%n", pairTrigger[triggerNum].getEnergyMaxCutConfig().getUpperBound());
+            ps.println("\t\tCluster Energy Upper Bound Cut");
+            ps.printf("\t\t\tEnabled :: %b%n", pairTrigger[triggerNum].getEnergyMaxCutConfig().isEnabled());
+            ps.printf("\t\t\tValue   :: %5.3f GeV%n", pairTrigger[triggerNum].getEnergyMaxCutConfig().getUpperBound());
             
-            System.out.println("\t\tCluster Hit Count Cut");
-            System.out.printf("\t\t\tEnabled :: %b%n", pairTrigger[triggerNum].getHitCountCutConfig().isEnabled());
-            System.out.printf("\t\t\tValue   :: %1.0f hits%n", pairTrigger[triggerNum].getHitCountCutConfig().getLowerBound());
+            ps.println("\t\tCluster Hit Count Cut");
+            ps.printf("\t\t\tEnabled :: %b%n", pairTrigger[triggerNum].getHitCountCutConfig().isEnabled());
+            ps.printf("\t\t\tValue   :: %1.0f hits%n", pairTrigger[triggerNum].getHitCountCutConfig().getLowerBound());
             
-            System.out.println("\t\tPair Energy Sum Cut");
-            System.out.printf("\t\t\tEnabled :: %b%n", pairTrigger[triggerNum].getEnergySumCutConfig().isEnabled());
-            System.out.printf("\t\t\tMin     :: %5.3f GeV%n", pairTrigger[triggerNum].getEnergySumCutConfig().getLowerBound());
-            System.out.printf("\t\t\tMax     :: %5.3f GeV%n", pairTrigger[triggerNum].getEnergySumCutConfig().getUpperBound());
+            ps.println("\t\tPair Energy Sum Cut");
+            ps.printf("\t\t\tEnabled :: %b%n", pairTrigger[triggerNum].getEnergySumCutConfig().isEnabled());
+            ps.printf("\t\t\tMin     :: %5.3f GeV%n", pairTrigger[triggerNum].getEnergySumCutConfig().getLowerBound());
+            ps.printf("\t\t\tMax     :: %5.3f GeV%n", pairTrigger[triggerNum].getEnergySumCutConfig().getUpperBound());
             
-            System.out.println("\t\tPair Energy Difference Cut");
-            System.out.printf("\t\t\tEnabled :: %b%n", pairTrigger[triggerNum].getEnergyDifferenceCutConfig().isEnabled());
-            System.out.printf("\t\t\tValue   :: %5.3f GeV%n", pairTrigger[triggerNum].getEnergyDifferenceCutConfig().getUpperBound());
+            ps.println("\t\tPair Energy Difference Cut");
+            ps.printf("\t\t\tEnabled :: %b%n", pairTrigger[triggerNum].getEnergyDifferenceCutConfig().isEnabled());
+            ps.printf("\t\t\tValue   :: %5.3f GeV%n", pairTrigger[triggerNum].getEnergyDifferenceCutConfig().getUpperBound());
             
-            System.out.println("\t\tPair Energy Slope Cut");
-            System.out.printf("\t\t\tEnabled :: %b%n", pairTrigger[triggerNum].getEnergySlopeCutConfig().isEnabled());
-            System.out.printf("\t\t\tValue   :: %5.3f GeV%n", pairTrigger[triggerNum].getEnergySlopeCutConfig().getLowerBound());
-            System.out.printf("\t\t\tParam F :: %6.4f GeV/mm%n", pairTrigger[triggerNum].getEnergySlopeCutConfig().getParameterF());
+            ps.println("\t\tPair Energy Slope Cut");
+            ps.printf("\t\t\tEnabled :: %b%n", pairTrigger[triggerNum].getEnergySlopeCutConfig().isEnabled());
+            ps.printf("\t\t\tValue   :: %5.3f GeV%n", pairTrigger[triggerNum].getEnergySlopeCutConfig().getLowerBound());
+            ps.printf("\t\t\tParam F :: %6.4f GeV/mm%n", pairTrigger[triggerNum].getEnergySlopeCutConfig().getParameterF());
             
-            System.out.println("\t\tPair Coplanarity Cut");
-            System.out.printf("\t\t\tEnabled :: %b%n", pairTrigger[triggerNum].getCoplanarityCutConfig().isEnabled());
-            System.out.printf("\t\t\tValue   :: %3.0f degrees%n", pairTrigger[triggerNum].getCoplanarityCutConfig().getUpperBound());
+            ps.println("\t\tPair Coplanarity Cut");
+            ps.printf("\t\t\tEnabled :: %b%n", pairTrigger[triggerNum].getCoplanarityCutConfig().isEnabled());
+            ps.printf("\t\t\tValue   :: %3.0f degrees%n", pairTrigger[triggerNum].getCoplanarityCutConfig().getUpperBound());
             
-            System.out.println("\t\tPair Time Coincidence Cut");
-            System.out.printf("\t\t\tEnabled :: %b%n", pairTrigger[triggerNum].getTimeDifferenceCutConfig().isEnabled());
-            System.out.printf("\t\t\tValue   :: %1.0f clock-cycles%n", pairTrigger[triggerNum].getTimeDifferenceCutConfig().getUpperBound());
-            System.out.println();
+            ps.println("\t\tPair Time Coincidence Cut");
+            ps.printf("\t\t\tEnabled :: %b%n", pairTrigger[triggerNum].getTimeDifferenceCutConfig().isEnabled());
+            ps.printf("\t\t\tValue   :: %1.0f clock-cycles%n", pairTrigger[triggerNum].getTimeDifferenceCutConfig().getUpperBound());
+            ps.println();
         }
     }
 }

Modified: java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/epics/EpicsData.java
 =============================================================================
--- java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/epics/EpicsData.java	(original)
+++ java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/epics/EpicsData.java	Tue Dec  8 20:48:40 2015
@@ -276,6 +276,7 @@
      * @param evioEvent the EVIO event
      * @return the EPICS data or <code>null</code> if it is not present in the event
      */
+    // FIXME: Not currently used.
     public static EpicsData getEpicsData(EvioEvent evioEvent) {
         
         EpicsData epicsData = null;

Modified: java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/epics/EpicsRunProcessor.java
 =============================================================================
--- java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/epics/EpicsRunProcessor.java	(original)
+++ java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/epics/EpicsRunProcessor.java	Tue Dec  8 20:48:40 2015
@@ -66,7 +66,7 @@
 
         // Add EPICS data to the collection.
         if (this.currentEpicsData != null) {
-            LOGGER.info("Adding EPICS data with run " + this.currentEpicsData.getEpicsHeader().getRun() + "; timestamp " 
+            LOGGER.fine("Adding EPICS data with run " + this.currentEpicsData.getEpicsHeader().getRun() + "; timestamp " 
                     + this.currentEpicsData.getEpicsHeader().getTimestamp() + "; seq "
                     + this.currentEpicsData.getEpicsHeader().getSequence() + ".");
             this.epicsDataSet.add(this.currentEpicsData);

Modified: java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/evio/EvioFileSource.java
 =============================================================================
--- java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/evio/EvioFileSource.java	(original)
+++ java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/evio/EvioFileSource.java	Tue Dec  8 20:48:40 2015
@@ -4,6 +4,7 @@
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.logging.Logger;
 
 import org.freehep.record.source.NoSuchRecordException;
 import org.hps.record.AbstractRecordQueue;
@@ -19,6 +20,8 @@
  */
 public final class EvioFileSource extends AbstractRecordQueue<EvioEvent> {
 
+    private static final Logger LOGGER = Logger.getLogger(EvioFileSource.class.getPackage().getName());
+    
     /**
      * The current event.
      */
@@ -158,6 +161,7 @@
     private void openReader() {
         try {
             // FIXME: This should use the reader directly and MSS paths should be transformed externally.
+            LOGGER.info("opening EVIO file " + this.files.get(this.fileIndex).getPath() + " ...");
             this.reader = EvioFileUtilities.open(this.files.get(this.fileIndex), true);
         } catch (EvioException | IOException e) {
             throw new RuntimeException(e);

Modified: java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/triggerbank/TriggerModule.java
 =============================================================================
--- java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/triggerbank/TriggerModule.java	(original)
+++ java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/triggerbank/TriggerModule.java	Tue Dec  8 20:48:40 2015
@@ -449,8 +449,22 @@
      * be calculated.
      * @return Returns displacement of the cluster.
      */
-    // TODO: What defines cluster distance?
     public static double getClusterDistance(Cluster cluster) {
+    	// Get the variables from the cluster.
+    	double x = getClusterX(cluster);
+    	double y = getClusterY(cluster);
+    	
+    	// Perform the calculation.
+    	return getClusterDistance(x, y);
+    }
+    
+    /**
+     * Calculates the distance between the origin and a cluster.
+     * @param cluster - The cluster pair from which the value should
+     * be calculated.
+     * @return Returns displacement of the cluster.
+     */
+    public static double getClusterDistance(SSPCluster cluster) {
     	// Get the variables from the cluster.
     	double x = getClusterX(cluster);
     	double y = getClusterY(cluster);

Modified: java/branches/jeremy-dev/run-database/src/main/java/org/hps/run/database/EpicsType.java
 =============================================================================
--- java/branches/jeremy-dev/run-database/src/main/java/org/hps/run/database/EpicsType.java	(original)
+++ java/branches/jeremy-dev/run-database/src/main/java/org/hps/run/database/EpicsType.java	Tue Dec  8 20:48:40 2015
@@ -8,16 +8,17 @@
  *
  * @author Jeremy McCormick, SLAC
  */
+// FIXME: move to record-util
 public enum EpicsType {
 
     /**
      * 20S EPICS data.
      */
-    EPICS_20s(20),
+    EPICS_20S(20),
     /**
      * 2S EPICS data.
      */
-    EPICS_2s(2);
+    EPICS_2S(2);
 
     /**
      * Get the type from an int.
@@ -27,10 +28,10 @@
      * @throws IllegalArgumentException if <code>type</code> is invalid (not 2 or 20)
      */
     public static EpicsType fromInt(final int type) {
-        if (type == EPICS_2s.type) {
-            return EPICS_2s;
-        } else if (type == EPICS_20s.type) {
-            return EPICS_20s;
+        if (type == EPICS_2S.type) {
+            return EPICS_2S;
+        } else if (type == EPICS_20S.type) {
+            return EPICS_20S;
         } else {
             throw new IllegalArgumentException("The type code is invalid (must be 1 or 10): " + type);
         }
@@ -44,9 +45,9 @@
     public static EpicsType getEpicsType(final EpicsData epicsData) {
         // FIXME: The type argument should be set on creation which would make this key check unnecessary.
         if (epicsData.getKeys().contains("MBSY2C_energy")) {
-            return EpicsType.EPICS_2s;
+            return EpicsType.EPICS_2S;
         } else {
-            return EpicsType.EPICS_20s;
+            return EpicsType.EPICS_20S;
         }
     }
 

Modified: java/branches/jeremy-dev/run-database/src/main/java/org/hps/run/database/EpicsVariable.java
 =============================================================================
--- java/branches/jeremy-dev/run-database/src/main/java/org/hps/run/database/EpicsVariable.java	(original)
+++ java/branches/jeremy-dev/run-database/src/main/java/org/hps/run/database/EpicsVariable.java	Tue Dec  8 20:48:40 2015
@@ -29,7 +29,7 @@
     private final String variableName;
 
     /**
-     * The type of the variable (1s or 10s).
+     * The type of the variable (2s or 20s).
      */
     private final EpicsType variableType;
 

Modified: java/branches/jeremy-dev/run-database/src/main/java/org/hps/run/database/RunDatabaseBuilder.java
 =============================================================================
--- java/branches/jeremy-dev/run-database/src/main/java/org/hps/run/database/RunDatabaseBuilder.java	(original)
+++ java/branches/jeremy-dev/run-database/src/main/java/org/hps/run/database/RunDatabaseBuilder.java	Tue Dec  8 20:48:40 2015
@@ -156,8 +156,8 @@
 
         LOGGER.info("loaded run summary ..." + '\n' + runSummary);
 
-        LOGGER.info("loaded " + runManager.getEpicsData(EpicsType.EPICS_2s).size() + " EPICS 2S records");
-        LOGGER.info("loaded " + runManager.getEpicsData(EpicsType.EPICS_20s).size() + " EPICS 20S records");
+        LOGGER.info("loaded " + runManager.getEpicsData(EpicsType.EPICS_2S).size() + " EPICS 2S records");
+        LOGGER.info("loaded " + runManager.getEpicsData(EpicsType.EPICS_20S).size() + " EPICS 20S records");
 
         List<ScalerData> scalerData = runManager.getScalerData();
         LOGGER.info("loaded " + scalerData.size() + " scaler records");
@@ -167,7 +167,7 @@
             
         LOGGER.info("printing DAQ config ...");
         DAQConfig daqConfig = runManager.getDAQConfig();
-        daqConfig.printConfig();
+        daqConfig.printConfig(System.out);
         
         runManager.closeConnection();
     }
@@ -628,6 +628,7 @@
         LOGGER.info("updating end timestamp");
         IntBankDefinition headBankDefinition = new IntBankDefinition(HeadBankData.class, new int[] {0x2e, 0xe10f});
         File lastEvioFile = cacheFiles.get(cacheFiles.size() - 1);
+        LOGGER.info("setting end timestamp from file " + lastEvioFile.getPath());
         EvioReader reader = null;
         Integer endTimestamp = null;
         try {
@@ -659,7 +660,7 @@
             }
         }
         runSummary.setEndTimestamp(endTimestamp);
-        LOGGER.fine("end timestamp set to " + endTimestamp);
+        LOGGER.fine("end timestamp was set to " + endTimestamp);
     }
 
     /**
@@ -726,6 +727,7 @@
     private void updateStartTimestamps() {
         LOGGER.fine("updating start timestamps");
         File firstEvioFile = cacheFiles.get(0);
+        LOGGER.info("setting start timestamps from file " + firstEvioFile.getPath());
         int sequence = EvioFileUtilities.getSequenceFromName(firstEvioFile);
         if (sequence != 0) {
             LOGGER.warning("first file does not have sequence 0");
@@ -790,13 +792,21 @@
      */
     private void updateTriggerRate() {
         LOGGER.fine("updating trigger rate");
-        if (runSummary.getEndTimestamp() != null && runSummary.getGoTimestamp() != null) {
+        Integer startTimestamp = null;
+        if (runSummary.getGoTimestamp() != null) {
+            startTimestamp = runSummary.getGoTimestamp();
+        } else if (runSummary.getPrestartTimestamp() != null) {
+            startTimestamp = runSummary.getPrestartTimestamp();
+        } else {
+            LOGGER.warning("Could not get starting timestamp for trigger rate calculation.");
+        }
+        if (runSummary.getEndTimestamp() != null && startTimestamp != null) {
             double triggerRate = ((double) runSummary.getTotalEvents() / ((double) runSummary.getEndTimestamp() - (double) runSummary
                     .getGoTimestamp())) / 1000.;
             runSummary.setTriggerRate(triggerRate);
             LOGGER.info("trigger rate set to " + runSummary.getTriggerRate());
         } else {
-            LOGGER.warning("Skipped trigger rate calculation because END or GO timestamp is missing.");
+            LOGGER.warning("Skipped trigger rate calculation because a timestamp is missing.");
         }
     }
 }

Modified: java/branches/jeremy-dev/run-database/src/main/java/org/hps/run/database/RunManager.java
 =============================================================================
--- java/branches/jeremy-dev/run-database/src/main/java/org/hps/run/database/RunManager.java	(original)
+++ java/branches/jeremy-dev/run-database/src/main/java/org/hps/run/database/RunManager.java	Tue Dec  8 20:48:40 2015
@@ -143,8 +143,8 @@
      * @param run the run number
      */
     void deleteRun() {        
-        factory.createEpicsDataDao().deleteEpicsData(EpicsType.EPICS_2s, run);
-        factory.createEpicsDataDao().deleteEpicsData(EpicsType.EPICS_20s, run);
+        factory.createEpicsDataDao().deleteEpicsData(EpicsType.EPICS_2S, run);
+        factory.createEpicsDataDao().deleteEpicsData(EpicsType.EPICS_20S, run);
         factory.createScalerDataDao().deleteScalerData(run);        
         factory.createSvtConfigDao().deleteSvtConfigs(run);
         factory.createTriggerConfigDao().deleteTriggerConfig(run);

Modified: java/branches/jeremy-dev/run-database/src/main/java/org/hps/run/database/RunSummaryDaoImpl.java
 =============================================================================
--- java/branches/jeremy-dev/run-database/src/main/java/org/hps/run/database/RunSummaryDaoImpl.java	(original)
+++ java/branches/jeremy-dev/run-database/src/main/java/org/hps/run/database/RunSummaryDaoImpl.java	Tue Dec  8 20:48:40 2015
@@ -171,23 +171,24 @@
      */
     @Override
     public void insertRunSummary(final RunSummary runSummary) {
-        PreparedStatement preparedStatement = null;        
+        PreparedStatement preparedStatement = null;
         try {
             preparedStatement = connection.prepareStatement(INSERT);                       
             preparedStatement.setInt(1, runSummary.getRun());
             preparedStatement.setInt(2, runSummary.getTotalEvents());
             preparedStatement.setInt(3, runSummary.getTotalFiles());
-            preparedStatement.setInt(4, runSummary.getPrestartTimestamp());
-            preparedStatement.setInt(5, runSummary.getGoTimestamp());
-            preparedStatement.setInt(6, runSummary.getEndTimestamp());
-            preparedStatement.setDouble(7, runSummary.getTriggerRate());
-            preparedStatement.setString(8, runSummary.getTriggerConfigName());
-            preparedStatement.setLong(9, runSummary.getTiTimeOffset());
-            preparedStatement.setDouble(10, runSummary.getLivetimeClock());
-            preparedStatement.setDouble(11, runSummary.getLivetimeFcupTdc());
-            preparedStatement.setDouble(12, runSummary.getLivetimeFcupTrg());
-            preparedStatement.setString(13, runSummary.getTarget());
-            preparedStatement.setString(14, runSummary.getNotes());
+            /* Use setObject on the rest as they may be null. */
+            preparedStatement.setObject(4, runSummary.getPrestartTimestamp());
+            preparedStatement.setObject(5, runSummary.getGoTimestamp());
+            preparedStatement.setObject(6, runSummary.getEndTimestamp());
+            preparedStatement.setObject(7, runSummary.getTriggerRate());
+            preparedStatement.setObject(8, runSummary.getTriggerConfigName());
+            preparedStatement.setObject(9, runSummary.getTiTimeOffset());
+            preparedStatement.setObject(10, runSummary.getLivetimeClock());
+            preparedStatement.setObject(11, runSummary.getLivetimeFcupTdc());
+            preparedStatement.setObject(12, runSummary.getLivetimeFcupTrg());
+            preparedStatement.setObject(13, runSummary.getTarget());
+            preparedStatement.setObject(14, runSummary.getNotes());
             LOGGER.fine(preparedStatement.toString());
             preparedStatement.executeUpdate();
         } catch (final SQLException e) {

Copied: java/branches/jeremy-dev/steering-files/src/main/resources/org/hps/steering/production/FilterHitsPerSensor.lcsim (from r4021, java/trunk/steering-files/src/main/resources/org/hps/steering/production/FilterHitsPerSensor.lcsim)
 =============================================================================
--- java/trunk/steering-files/src/main/resources/org/hps/steering/production/FilterHitsPerSensor.lcsim	(original)
+++ java/branches/jeremy-dev/steering-files/src/main/resources/org/hps/steering/production/FilterHitsPerSensor.lcsim	Tue Dec  8 20:48:40 2015
@@ -5,6 +5,7 @@
       @author <a href="mailto:[log in to unmask]">Sho Uemura</a>
     -->
     <execute>
+        <driver name="CleanupDriver"/>
         <driver name="EventMarkerDriver"/>
         <!-- SVT reconstruction drivers -->
         <driver name="RawTrackerHitSensorSetup"/>
@@ -16,7 +17,6 @@
 
         <!-- write and cleanup -->
         <driver name="LCIOWriter"/>
-        <driver name="CleanupDriver"/>
     </execute>    
     <drivers>    
         <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">

Copied: java/branches/jeremy-dev/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015STRecon.lcsim (from r4021, java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015STRecon.lcsim)
 =============================================================================
--- java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015STRecon.lcsim	(original)
+++ java/branches/jeremy-dev/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015STRecon.lcsim	Tue Dec  8 20:48:40 2015
@@ -10,11 +10,8 @@
         <driver name="RawTrackerHitSensorSetup"/>
         <driver name="RawTrackerHitFitterDriver" />
         <driver name="TrackerHitDriver"/>
-        <driver name="HelicalTrackHitDriver"/>
-        <!--<driver name="SensorOccupancyDriver"/>-->
         
         <driver name="StraightThroughDriver"/>
-        <!--<driver name="TrackingReconstructionPlots" />-->
         <!--<driver name="LCIOWriter"/>-->
         <!--<driver name="AidaSaveDriver"/>-->
         <driver name="CleanupDriver"/>
@@ -40,12 +37,6 @@
         <driver name="TrackerHitDriver" type="org.hps.recon.tracking.DataTrackerHitDriver">
             <neighborDeltaT>8.0</neighborDeltaT>
         </driver>
-        <driver name="HelicalTrackHitDriver" type="org.hps.recon.tracking.HelicalTrackHitDriver">
-            <debug>false</debug>
-            <clusterTimeCut>12.0</clusterTimeCut>
-            <maxDt>16.0</maxDt>
-            <clusterAmplitudeCut>400.0</clusterAmplitudeCut>
-        </driver>
         <driver name="LCIOWriter" type="org.lcsim.util.loop.LCIODriver">
             <outputFilePath>${outputFile}.slcio</outputFilePath>
         </driver>
@@ -61,7 +52,7 @@
             <eventRefreshRate>100</eventRefreshRate>
             <enableTriggerFilter>False</enableTriggerFilter>
         </driver>
-        <driver name="StraightThroughDriver" type="org.hps.users.phansson.StraightThroughAnalysisDriver">
+        <driver name="StraightThroughDriver" type="org.hps.recon.tracking.straight.StraightThroughAnalysisDriver">
             <outputFilename>${outputFile}</outputFilename>
             <writeGbl>true</writeGbl>
         </driver>

Modified: java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/TrackDataDriver.java
 =============================================================================
--- java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/TrackDataDriver.java	(original)
+++ java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/TrackDataDriver.java	Tue Dec  8 20:48:40 2015
@@ -317,7 +317,7 @@
         }
         
         // Add all collections to the event
-        event.put(TrackData.TRACK_DATA_COLLECTION, trackDataCollection, TrackTimeData.class, 0);
+        event.put(TrackData.TRACK_DATA_COLLECTION, trackDataCollection, TrackData.class, 0);
         event.put(TrackData.TRACK_DATA_RELATION_COLLECTION, trackDataRelations, LCRelation.class, 0);
         event.put(TRK_RESIDUALS_COL_NAME, trackResidualsCollection, TrackResidualsData.class, 0);
         event.put(TRK_RESIDUALS_REL_COL_NAME, trackToTrackResidualsRelations, LCRelation.class, 0);

Modified: java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/TrackUtils.java
 =============================================================================
--- java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/TrackUtils.java	(original)
+++ java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/TrackUtils.java	Tue Dec  8 20:48:40 2015
@@ -7,6 +7,9 @@
 import hep.physics.vec.SpacePoint;
 import hep.physics.vec.VecOp;
 import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -1029,6 +1032,20 @@
         for (TrackerHit hit : track.getTrackerHits())
             hits.addAll(hitToStrips.allFrom(hitToRotated.from(hit)));
         return hits;
+    }
+
+    public static List<TrackerHit> sortHits(Collection<TrackerHit> hits) {
+        List<TrackerHit> hitList = new ArrayList<TrackerHit>(hits);
+        Collections.sort(hitList, new LayerComparator());
+        return hitList;
+    }
+
+    private static class LayerComparator implements Comparator<TrackerHit> {
+
+        @Override
+        public int compare(TrackerHit o1, TrackerHit o2) {
+            return Integer.compare(TrackUtils.getLayer(o1), TrackUtils.getLayer(o2));
+        }
     }
 
     public static boolean hasSharedStrips(Track track1, Track track2, RelationalTable hitToStrips, RelationalTable hitToRotated) {

Modified: java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLKinkData.java
 =============================================================================
--- java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLKinkData.java	(original)
+++ java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLKinkData.java	Tue Dec  8 20:48:40 2015
@@ -1,6 +1,13 @@
 package org.hps.recon.tracking.gbl;
 
+import java.util.List;
+import org.apache.commons.math3.util.Pair;
+import org.lcsim.event.EventHeader;
 import org.lcsim.event.GenericObject;
+import org.lcsim.event.LCRelation;
+import org.lcsim.event.RelationalTable;
+import org.lcsim.event.Track;
+import org.lcsim.event.base.BaseRelationalTable;
 
 /**
  * Generic object used to persist GBL kink data.
@@ -94,4 +101,27 @@
     public boolean isFixedSize() {
         return true;
     }
+
+    private static Pair<EventHeader, RelationalTable> kinkDataToTrackCache = null;
+
+    public static RelationalTable getKinkDataToTrackTable(EventHeader event) {
+        if (kinkDataToTrackCache == null || kinkDataToTrackCache.getFirst() != event) {
+            RelationalTable kinkDataToTrack = new BaseRelationalTable(RelationalTable.Mode.MANY_TO_MANY, RelationalTable.Weighting.UNWEIGHTED);
+            if (event.hasCollection(LCRelation.class, DATA_RELATION_COLLECTION)) {
+                List<LCRelation> relations = event.get(LCRelation.class, DATA_RELATION_COLLECTION);
+                for (LCRelation relation : relations) {
+                    if (relation != null && relation.getFrom() != null && relation.getTo() != null) {
+                        kinkDataToTrack.add(relation.getFrom(), relation.getTo());
+                    }
+                }
+            }
+            kinkDataToTrackCache = new Pair<EventHeader, RelationalTable>(event, kinkDataToTrack);
+        }
+        return kinkDataToTrackCache.getSecond();
+    }
+
+    public static GenericObject getKinkData(EventHeader event, Track track) {
+        return (GenericObject) getKinkDataToTrackTable(event).from(track);
+    }
+
 }

Modified: java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutput.java
 =============================================================================
--- java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutput.java	(original)
+++ java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutput.java	Tue Dec  8 20:48:40 2015
@@ -153,15 +153,13 @@
 
     void printGBL(Track trk, List<SiTrackerHitStrip1D> stripHits, GBLTrackData gtd, List<GBLStripClusterData> stripClusterDataList, List<MCParticle> mcParticles, List<SimTrackerHit> simTrackerHits, boolean isMC) {
 
-        SeedTrack st = (SeedTrack) trk;
-        SeedCandidate seed = st.getSeedCandidate();
-        HelicalTrackFit htf = seed.getHelix();
+        HelicalTrackFit htf = TrackUtils.getHTF(trk);
 
         // Find scatter points along the path
         ScatterPoints scatters = _scattering.FindHPSScatterPoints(htf);
 
         // Hits on track
-        List<HelicalTrackHit> hits = seed.getHits();
+        List<TrackerHit> hits = trk.getTrackerHits();
 
         // Find the truth particle of the track
         MCParticle mcp = null;
@@ -326,7 +324,7 @@
                      continue;
             } 
             else {
-                hit = hits.get(ihit);
+                hit = (HelicalTrackHit) hits.get(ihit);
                 htc = (HelicalTrackCross) hit;
                 strips = htc.getStrips();
                 correctedHitPosition = hit.getCorrectedPosition();

Modified: java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutputDriver.java
 =============================================================================
--- java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutputDriver.java	(original)
+++ java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutputDriver.java	Tue Dec  8 20:48:40 2015
@@ -1,32 +1,21 @@
 package org.hps.recon.tracking.gbl;
 
-import hep.physics.vec.BasicHep3Vector;
 import hep.physics.vec.Hep3Vector;
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Map;
-import java.util.Set;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import org.hps.recon.tracking.EventQuality;
-import org.hps.recon.tracking.StrategyType;
-import org.hps.recon.tracking.TrackType;
 import org.hps.recon.tracking.TrackUtils;
 import org.lcsim.event.EventHeader;
 import org.lcsim.event.LCRelation;
 import org.lcsim.event.MCParticle;
-import org.lcsim.event.RelationalTable;
 import org.lcsim.event.SimTrackerHit;
 import org.lcsim.event.Track;
-import org.lcsim.event.TrackerHit;
 import org.lcsim.event.base.MyLCRelation;
 import org.lcsim.geometry.Detector;
-import org.lcsim.lcio.LCIOConstants;
 import org.lcsim.recon.tracking.digitization.sisim.SiTrackerHitStrip1D;
-import org.lcsim.recon.tracking.seedtracker.SeedTrack;
 import org.lcsim.util.Driver;
 import org.lcsim.util.aida.AIDA;
 
@@ -58,15 +47,12 @@
     private int totalTracksProcessed = 0;
     private int iTrack = 0;
     private int iEvent = 0;
-    private boolean addBeamspot=false;
+    private boolean addBeamspot = false;
     private double beamspotScatAngle = 0.000001;
     private double beamspotWidthZ = 0.05;
     private double beamspotWidthY = 0.15;
-    private double beamspotTiltZOverY = 15.0*180.0/Math.PI;
-    private double beamspotPosition[] = {0,0,0};
-
-    
-    
+    private double beamspotTiltZOverY = 15.0 * 180.0 / Math.PI;
+    private double beamspotPosition[] = {0, 0, 0};
 
     public GBLOutputDriver() {
     }
@@ -95,7 +81,7 @@
 
     @Override
     public void process(EventHeader event) {
-        List<Track> tracklist = null;
+        List<Track> tracklist;
         if (event.hasCollection(Track.class, trackCollectionName)) {
             tracklist = event.get(Track.class, trackCollectionName);
             if (_debug > 0) {
@@ -107,7 +93,7 @@
 
         List<SiTrackerHitStrip1D> stripHits = event.get(SiTrackerHitStrip1D.class, "StripClusterer_SiTrackerHitStrip1D");
         if (_debug > 0) {
-            System.out.printf("%s: Got %d SiTrackerHitStrip1D in this event\n",this.getClass().getSimpleName(), stripHits.size());
+            System.out.printf("%s: Got %d SiTrackerHitStrip1D in this event\n", this.getClass().getSimpleName(), stripHits.size());
         }
 
         List<MCParticle> mcParticles = new ArrayList<MCParticle>();
@@ -143,13 +129,13 @@
         // Loop over each of the track collections retrieved from the event
         for (Track trk : tracklist) {
             totalTracks++;
-            
-            if (_debug > 0) System.out.printf("%s: PX %f bottom %d\n", this.getClass().getSimpleName(), trk.getPX(), TrackUtils.isBottomTrack(trk, 4)?1:0) ;
-            
+
+            if (_debug > 0) {
+                System.out.printf("%s: PX %f bottom %d\n", this.getClass().getSimpleName(), trk.getPX(), TrackUtils.isBottomTrack(trk, 4) ? 1 : 0);
+            }
+
             //if( trk.getPX() < 0.9) continue;
-            
             //if( TrackUtils.isBottomTrack(trk, 4)) continue;
-            
             if (TrackUtils.isGoodTrack(trk, tracklist, EventQuality.Quality.NONE)) {
                 if (_debug > 0) {
                     System.out.printf("%s: Print GBL output for this track\n", this.getClass().getSimpleName());
@@ -228,8 +214,8 @@
         this.isMC = isMC;
     }
 
-    public void setAddBeamspot(boolean add){
-        this.addBeamspot=add;
+    public void setAddBeamspot(boolean add) {
+        this.addBeamspot = add;
     }
 
     public double getBeamspotScatAngle() {
@@ -271,5 +257,8 @@
     public void setBeamspotPosition(double beamspotPosition[]) {
         this.beamspotPosition = beamspotPosition;
     }
-    
+
+    public void setTrackCollectionName(String trackCollectionName) {
+        this.trackCollectionName = trackCollectionName;
+    }
 }

Modified: java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLRefitterDriver.java
 =============================================================================
--- java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLRefitterDriver.java	(original)
+++ java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLRefitterDriver.java	Tue Dec  8 20:48:40 2015
@@ -11,9 +11,11 @@
 import org.hps.recon.tracking.MultipleScattering;
 import org.hps.recon.tracking.TrackUtils;
 import org.lcsim.event.EventHeader;
+import org.lcsim.event.LCRelation;
 import org.lcsim.event.RelationalTable;
 import org.lcsim.event.Track;
 import org.lcsim.event.TrackerHit;
+import org.lcsim.event.base.BaseLCRelation;
 import org.lcsim.geometry.Detector;
 import org.lcsim.lcio.LCIOConstants;
 import org.lcsim.util.Driver;
@@ -66,12 +68,20 @@
         RelationalTable hitToRotated = TrackUtils.getHitToRotatedTable(event);
 
         List<Track> refittedTracks = new ArrayList<Track>();
+        List<GBLKinkData> kinkDataCollection = new ArrayList<GBLKinkData>();
+
+        List<LCRelation> kinkDataRelations = new ArrayList<LCRelation>();
 
         Map<Track, Track> inputToRefitted = new HashMap<Track, Track>();
         for (Track track : tracks) {
-            Pair<Track, GBLKinkData> newTrack = MakeGblTracks.refitTrack(TrackUtils.getHTF(track), TrackUtils.getStripHits(track, hitToStrips, hitToRotated), track.getTrackerHits(), 5, _scattering, bfield);
+            Pair<Track, GBLKinkData> newTrack = MakeGblTracks.refitTrack(TrackUtils.getHTF(track), TrackUtils.getStripHits(track, hitToStrips, hitToRotated), track.getTrackerHits(), 5, track.getType(), _scattering, bfield
+            );
+//            newTrack.getFirst().
             refittedTracks.add(newTrack.getFirst());
             inputToRefitted.put(track, newTrack.getFirst());
+
+            kinkDataCollection.add(newTrack.getSecond());
+            kinkDataRelations.add(new BaseLCRelation(newTrack.getSecond(), newTrack.getFirst()));
         }
 
         if (mergeTracks) {
@@ -106,7 +116,7 @@
                         }
                     }
 
-                    Pair<Track, GBLKinkData> mergedTrack = MakeGblTracks.refitTrack(TrackUtils.getHTF(track), TrackUtils.getStripHits(track, hitToStrips, hitToRotated), allHth, 5, _scattering, bfield);
+                    Pair<Track, GBLKinkData> mergedTrack = MakeGblTracks.refitTrack(TrackUtils.getHTF(track), TrackUtils.getStripHits(track, hitToStrips, hitToRotated), allHth, 5, track.getType(), _scattering, bfield);
                     mergedTracks.add(mergedTrack.getFirst());
 //                    System.out.format("%f %f %f\n", fit.get_chi2(), inputToRefitted.get(track).getChi2(), inputToRefitted.get(otherTrack).getChi2());
 //                mergedTrackToTrackList.put(mergedTrack, new ArrayList<Track>());
@@ -131,5 +141,7 @@
         // Put the tracks back into the event and exit
         int flag = 1 << LCIOConstants.TRBIT_HITS;
         event.put(outputCollectionName, refittedTracks, Track.class, flag);
+        event.put(GBLKinkData.DATA_COLLECTION, kinkDataCollection, GBLKinkData.class, 0);
+        event.put(GBLKinkData.DATA_RELATION_COLLECTION, kinkDataRelations, LCRelation.class, 0);
     }
 }

Modified: java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/gbl/MakeGblTracks.java
 =============================================================================
--- java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/gbl/MakeGblTracks.java	(original)
+++ java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/gbl/MakeGblTracks.java	Tue Dec  8 20:48:40 2015
@@ -146,7 +146,7 @@
         double yTPrimeCorr = locPar.get(FittedGblTrajectory.GBLPARIDX.YTPRIME.getValue());
         double xTCorr = locPar.get(FittedGblTrajectory.GBLPARIDX.XT.getValue());
         double yTCorr = locPar.get(FittedGblTrajectory.GBLPARIDX.YT.getValue());
-
+//        System.out.println((helix.slope() > 0 ? "top: " : "bot ") + "qOverPCorr " + qOverPCorr + " xtPrimeCorr " + xTPrimeCorr + " yTPrimeCorr " + yTPrimeCorr + " xTCorr " + xTCorr + " yTCorr " + yTCorr);
         LOGGER.info((helix.slope() > 0 ? "top: " : "bot ") + "qOverPCorr " + qOverPCorr + " xtPrimeCorr " + xTPrimeCorr + " yTPrimeCorr " + yTPrimeCorr + " xTCorr " + xTCorr + " yTCorr " + yTCorr);
 
         // calculate new d0 and z0
@@ -275,6 +275,7 @@
             if (i > 0) {
                 lambdaKinks[i - 1] = (float) (newLambda - oldLambda);
                 phiKinks[i - 1] = newPhi - oldPhi;
+//                System.out.println("phikink: " + (newPhi - oldPhi));
             }
             oldPhi = newPhi;
             oldLambda = newLambda;
@@ -298,16 +299,16 @@
      * @param bfield B-field
      * @return The refitted track.
      */
-    public static Pair<Track, GBLKinkData> refitTrack(HelicalTrackFit helix, Collection<TrackerHit> stripHits, Collection<TrackerHit> hth, int nIterations, MultipleScattering scattering, double bfield) {
-        List<TrackerHit> allHthList = sortHits(hth);
-        List<TrackerHit> sortedStripHits = sortHits(stripHits);
-        FittedGblTrajectory fit = MakeGblTracks.doGBLFit(helix, sortedStripHits, scattering, bfield, 0);
+    public static Pair<Track, GBLKinkData> refitTrack(HelicalTrackFit helix, Collection<TrackerHit> stripHits, Collection<TrackerHit> hth, int nIterations, int trackType, MultipleScattering scattering, double bfield) {
+        List<TrackerHit> allHthList = TrackUtils.sortHits(hth);
+        List<TrackerHit> sortedStripHits = TrackUtils.sortHits(stripHits);
+        FittedGblTrajectory fit = doGBLFit(helix, sortedStripHits, scattering, bfield, 0);
         for (int i = 0; i < nIterations; i++) {
-            Pair<Track, GBLKinkData> newTrack = MakeGblTracks.makeCorrectedTrack(fit, helix, allHthList, 0, bfield);
+            Pair<Track, GBLKinkData> newTrack = makeCorrectedTrack(fit, helix, allHthList, trackType, bfield);
             helix = TrackUtils.getHTF(newTrack.getFirst());
-            fit = MakeGblTracks.doGBLFit(helix, sortedStripHits, scattering, bfield, 0);
-        }
-        Pair<Track, GBLKinkData> mergedTrack = MakeGblTracks.makeCorrectedTrack(fit, helix, allHthList, 0, bfield);
+            fit = doGBLFit(helix, sortedStripHits, scattering, bfield, 0);
+        }
+        Pair<Track, GBLKinkData> mergedTrack = makeCorrectedTrack(fit, helix, allHthList, trackType, bfield);
         return mergedTrack;
     }
 
@@ -480,18 +481,4 @@
 
         return strip;
     }
-
-    private static List<TrackerHit> sortHits(Collection<TrackerHit> hits) {
-        List<TrackerHit> hitList = new ArrayList<TrackerHit>(hits);
-        Collections.sort(hitList, new LayerComparator());
-        return hitList;
-    }
-
-    private static class LayerComparator implements Comparator<TrackerHit> {
-
-        @Override
-        public int compare(TrackerHit o1, TrackerHit o2) {
-            return Integer.compare(TrackUtils.getLayer(o1), TrackUtils.getLayer(o2));
-        }
-    }
 }

Modified: java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/straight/StraightThroughAnalysisDriver.java
 =============================================================================
--- java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/straight/StraightThroughAnalysisDriver.java	(original)
+++ java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/straight/StraightThroughAnalysisDriver.java	Tue Dec  8 20:48:40 2015
@@ -29,6 +29,7 @@
 
 import org.hps.recon.tracking.SvtPlotUtils;
 import org.hps.recon.tracking.straight.STUtils.STStereoTrack;
+import org.hps.recon.tracking.straight.STUtils.STTrack;
 import org.lcsim.detector.converter.compact.subdetector.HpsTracker2;
 import org.lcsim.detector.converter.compact.subdetector.SvtStereoLayer;
 import org.lcsim.detector.tracker.silicon.HpsSiSensor;
@@ -59,6 +60,8 @@
     private IHistogram1D botHitCount;
     private Map<String,IHistogram2D> stereoHitPositionsXY = new HashMap<String, IHistogram2D>();
     private Map<String,IHistogram1D> sensorHitResGlobal = new HashMap<String, IHistogram1D>();
+    private Map<String,IHistogram1D> sensorHitResGlobalL13 = new HashMap<String, IHistogram1D>();
+    private Map<String,IHistogram1D> sensorHitResGlobalL46 = new HashMap<String, IHistogram1D>();
     private Map<String,IHistogram1D>  sensorStereoHitYZResGlobal = new HashMap<String, IHistogram1D>();
     private Map<String,IHistogram1D>  sensorStereoHitXZResGlobal = new HashMap<String, IHistogram1D>();
     private Map<String,IHistogram1D>  sensorURes = new HashMap<String, IHistogram1D>();
@@ -79,6 +82,12 @@
     private IHistogram1D trackAxialHitCount[];
     private IHistogram1D trackAxialSlope[];
     private IHistogram1D trackAxialIntercept[];
+    private IHistogram1D trackL13AxialSlope[];
+    private IHistogram1D trackL13AxialIntercept[];
+    private IHistogram1D trackL46AxialSlope[];
+    private IHistogram1D trackL46AxialIntercept[];
+    private IHistogram1D trackL13L46AxialSlope[];
+    private IHistogram1D trackL13L46AxialIntercept[];
     private IHistogram1D trackAxialCount[];
     private IHistogram2D trackAxialExtraPolation[];
     private IHistogram2D trackExtraPolationY[];
@@ -154,6 +163,10 @@
         plotters.get("Sensor u res").createRegions(6, 6);
         plotters.put("Sensor hit res", af.createPlotterFactory().create("Sensor hit res"));
         plotters.get("Sensor hit res").createRegions(3, 6);
+        plotters.put("Sensor hit res L13", af.createPlotterFactory().create("Sensor hit res L13"));
+        plotters.get("Sensor hit res L13").createRegions(3, 6);
+        plotters.put("Sensor hit res L46", af.createPlotterFactory().create("Sensor hit res L46"));
+        plotters.get("Sensor hit res L46").createRegions(3, 6);
         plotters.put("Sensor stereo YZ hit res", af.createPlotterFactory().create("Sensor stereo YZ hit res"));
         plotters.get("Sensor stereo YZ hit res").setStyle(this.getDefaultPlotterStyle("Stereo hit y res global (mm)","Entries"));
         plotters.get("Sensor stereo YZ hit res").createRegions(3, 6);
@@ -194,6 +207,12 @@
         trackAxialCount = new IHistogram1D[2];
         trackAxialSlope = new IHistogram1D[2];
         trackAxialIntercept = new IHistogram1D[2];
+        trackL13AxialSlope = new IHistogram1D[2];
+        trackL13AxialIntercept = new IHistogram1D[2];
+        trackL46AxialSlope = new IHistogram1D[2];
+        trackL46AxialIntercept = new IHistogram1D[2];
+        trackL13L46AxialSlope = new IHistogram1D[2];
+        trackL13L46AxialIntercept = new IHistogram1D[2];
         trackAxialExtraPolation = new IHistogram2D[5];
         trackExtraPolationY = new IHistogram2D[5];
         trackExtraPolationX = new IHistogram2D[5];
@@ -212,20 +231,32 @@
             trackCount[i] = hf.createHistogram1D("Track " + half + " multiplicity", 11, -0.5, 10.5);
             trackSlope[i] = new IHistogram1D[2];
             trackIntercept[i] = new IHistogram1D[2];
+            trackSlope[i] = new IHistogram1D[2];
+            trackIntercept[i] = new IHistogram1D[2];
             trackSlope[i][STUtils.STStereoTrack.VIEW.YZ.ordinal()] = hf.createHistogram1D("Track " + half +" " + STUtils.STStereoTrack.VIEW.YZ.name()  + " slope", 50, -0.05, 0.05);
             trackSlope[i][STUtils.STStereoTrack.VIEW.XZ.ordinal()] = hf.createHistogram1D("Track " + half +" " + STUtils.STStereoTrack.VIEW.XZ.name()  + " slope", 50, -0.1, 0.1);
             if(i==0) {
                 trackIntercept[i][STUtils.STStereoTrack.VIEW.YZ.ordinal()] = hf.createHistogram1D("Track " + half +" " + STUtils.STStereoTrack.VIEW.YZ.name()  + " intecept", 50, 0, 50);
                 trackIntercept[i][STUtils.STStereoTrack.VIEW.XZ.ordinal()] = hf.createHistogram1D("Track " + half +" " + STUtils.STStereoTrack.VIEW.XZ.name()  + " intecept", 50, -80, 0);
                 trackAxialIntercept[i] = hf.createHistogram1D("Track axial " + half +" intercept", 50, 0, 50);
+                trackL13AxialIntercept[i] = hf.createHistogram1D("Track L13 axial " + half +" intercept", 50, -20, 50);
+                trackL46AxialIntercept[i] = hf.createHistogram1D("Track L46 axial " + half +" intercept", 50, -20, 50);
+                trackL13AxialSlope[i] = hf.createHistogram1D("Track L13 axial " + half +" slope", 50, -0.02, 0.1);
+                trackL46AxialSlope[i] = hf.createHistogram1D("Track L46 axial " + half +" slope", 50, -0.02, 0.1);
             } else {
                 trackIntercept[i][STUtils.STStereoTrack.VIEW.YZ.ordinal()] = hf.createHistogram1D("Track " + half +" " + STUtils.STStereoTrack.VIEW.YZ.name()  + " intecept", 50, -50, 0);
                 trackIntercept[i][STUtils.STStereoTrack.VIEW.XZ.ordinal()] = hf.createHistogram1D("Track " + half +" " + STUtils.STStereoTrack.VIEW.XZ.name()  + " intecept", 50, -50, 50);
                 trackAxialIntercept[i] = hf.createHistogram1D("Track axial " + half +" intercept", 50, -50, 0);
+                trackL13AxialIntercept[i] = hf.createHistogram1D("Track L13 axial " + half +" intercept", 50, -50, 20);
+                trackL46AxialIntercept[i] = hf.createHistogram1D("Track L46 axial " + half +" intercept", 50, -50, 20);
+                trackL13AxialSlope[i] = hf.createHistogram1D("Track L13 axial " + half +" slope", 50, -0.1, 0.02);
+                trackL46AxialSlope[i] = hf.createHistogram1D("Track L46 axial " + half +" slope", 50, -0.1, 0.02);
             }
             trackAxialHitCount[i] = hf.createHistogram1D("Track axial " + half +" hit multiplicity", 11, -0.5, 10.5);
             trackAxialCount[i] = hf.createHistogram1D("Track axial " + half +" multiplicity", 2, -0.5, 1.5);
             trackAxialSlope[i] = hf.createHistogram1D("Track axial " + half +" slope", 50, -0.05, 0.05);
+            trackL13L46AxialSlope[i] = hf.createHistogram1D("Track L13-L46 axial " + half +" slope", 50, -0.03, 0.03);
+            trackL13L46AxialIntercept[i] = hf.createHistogram1D("Track L13-L46 axial " + half +" intercept", 50, -8, 8);
             trackAxialExtraPolation[i] = hf.createHistogram2D("Track axial " + half +" extrapolation", nPointsZ, endPointZ, startPointZ,50,-80,80);
             trackExtraPolationY[i] = hf.createHistogram2D("Track " + half +" extrapolation Y", nPointsZ, endPointZ, startPointZ,50,-80,80);
             trackExtraPolationX[i] = hf.createHistogram2D("Track " + half +" extrapolation X", nPointsZ, endPointZ, startPointZ,50,-100,60);
@@ -243,7 +274,24 @@
             plotters.get("Track " + half +" axial").region(1).plot(trackAxialCount[i]);
             plotters.get("Track " + half +" axial").region(2).plot(trackAxialSlope[i]);
             plotters.get("Track " + half +" axial").region(3).plot(trackAxialIntercept[i]);
-
+            
+            plotters.put("Track L13 " + half +" axial", af.createPlotterFactory().create("Track L13 " + half +" axial"));
+            //plotters.get("Track " + half +" axial").setStyle(this.getDefaultPlotterStyle("","Entries",true));
+            plotters.get("Track L13 " + half +" axial").createRegions(2,2);            
+            plotters.get("Track L13 " + half +" axial").region(2).plot(trackL13AxialSlope[i]);
+            plotters.get("Track L13 " + half +" axial").region(3).plot(trackL13AxialIntercept[i]);
+
+            plotters.put("Track L46 " + half +" axial", af.createPlotterFactory().create("Track L46 " + half +" axial"));
+            //plotters.get("Track " + half +" axial").setStyle(this.getDefaultPlotterStyle("","Entries",true));
+            plotters.get("Track L46 " + half +" axial").createRegions(2,2);            
+            plotters.get("Track L46 " + half +" axial").region(2).plot(trackL46AxialSlope[i]);
+            plotters.get("Track L46 " + half +" axial").region(3).plot(trackL46AxialIntercept[i]);
+
+            plotters.put("Track L13L46 " + half +" axial", af.createPlotterFactory().create("Track L13L46 " + half +" axial"));
+            //plotters.get("Track " + half +" axial").setStyle(this.getDefaultPlotterStyle("","Entries",true));
+            plotters.get("Track L13L46 " + half +" axial").createRegions(2,2);            
+            plotters.get("Track L13L46 " + half +" axial").region(2).plot(trackL13L46AxialSlope[i]);
+            plotters.get("Track L13L46 " + half +" axial").region(3).plot(trackL13L46AxialIntercept[i]);
 
 
             plotters.put("Track " + half, af.createPlotterFactory().create("Track " + half));
@@ -321,6 +369,15 @@
                 sensorHitResGlobal.put(sensor.getName(), hf.createHistogram1D(sensor.getName() + "_hitresglobal", 50, -0.7, 0.7));
                 plotters.get("Sensor hit res").region(SvtPlotUtils.computePlotterRegionAxialOnly(sensor)).plot(sensorHitResGlobal.get(sensor.getName()));
                 plotters.get("Sensor hit res").region(0).style().dataStyle().showInStatisticsBox(true);
+
+                sensorHitResGlobalL13.put(sensor.getName(), hf.createHistogram1D(sensor.getName() + "_hitresglobalL13", 50, -0.7, 0.7));
+                plotters.get("Sensor hit res L13").region(SvtPlotUtils.computePlotterRegionAxialOnly(sensor)).plot(sensorHitResGlobalL13.get(sensor.getName()));
+                plotters.get("Sensor hit res L13").region(0).style().dataStyle().showInStatisticsBox(true);
+
+                sensorHitResGlobalL46.put(sensor.getName(), hf.createHistogram1D(sensor.getName() + "_hitresglobalL46", 50, -0.7, 0.7));
+                plotters.get("Sensor hit res L46").region(SvtPlotUtils.computePlotterRegionAxialOnly(sensor)).plot(sensorHitResGlobalL46.get(sensor.getName()));
+                plotters.get("Sensor hit res L46").region(0).style().dataStyle().showInStatisticsBox(true);
+
                 sensorStereoHitYZResGlobal.put(sensor.getName(), hf.createHistogram1D(sensor.getName() + "_stereohityzresglobal", 50, -1, 1));
                 plotters.get("Sensor stereo YZ hit res").region(SvtPlotUtils.computePlotterRegionAxialOnly(sensor)).plot(sensorStereoHitYZResGlobal.get(sensor.getName()));
                 plotters.get("Sensor stereo YZ hit res").region(0).style().dataStyle().showInStatisticsBox(true);
@@ -450,26 +507,44 @@
         
         // Pattern recognition for axial hits - yeah!
         List< List<SiTrackerHitStrip1D>> axialSeedHits = new ArrayList<List<SiTrackerHitStrip1D>>();
+        List< List<SiTrackerHitStrip1D>> axialSeedL13Hits = new ArrayList<List<SiTrackerHitStrip1D>>();
+        List< List<SiTrackerHitStrip1D>> axialSeedL46Hits = new ArrayList<List<SiTrackerHitStrip1D>>();
         for(int ihalf=0; ihalf<2; ++ihalf) {
             List<SiTrackerHitStrip1D> seedHits = new ArrayList<SiTrackerHitStrip1D>();
+            List<SiTrackerHitStrip1D> seedL13Hits = new ArrayList<SiTrackerHitStrip1D>();
+            List<SiTrackerHitStrip1D> seedL46Hits = new ArrayList<SiTrackerHitStrip1D>();
             for(int layer : axialHitsPerLayer.get(ihalf).keySet()) {
                 // single hit on the sensor
-                if( axialHitsPerLayer.get(ihalf).get(layer).size() == 1 )
+                if( axialHitsPerLayer.get(ihalf).get(layer).size() == 1 ) {
                     seedHits.add(axialHitsPerLayer.get(ihalf).get(layer).get(0));
+                    if( layer < 4) seedL13Hits.add(axialHitsPerLayer.get(ihalf).get(layer).get(0));
+                    else seedL46Hits.add(axialHitsPerLayer.get(ihalf).get(layer).get(0));
+                }
             }
             axialSeedHits.add(seedHits);
+            axialSeedL13Hits.add(seedL13Hits);
+            axialSeedL46Hits.add(seedL46Hits);
         }
         
         // Pattern recognition for stereo hits - yeah!
         List< List<SiTrackerHitStrip1D>> stereoSeedHits = new ArrayList<List<SiTrackerHitStrip1D>>();
+        List< List<SiTrackerHitStrip1D>> stereoSeedL13Hits = new ArrayList<List<SiTrackerHitStrip1D>>();
+        List< List<SiTrackerHitStrip1D>> stereoSeedL46Hits = new ArrayList<List<SiTrackerHitStrip1D>>();
         for(int ihalf=0; ihalf<2; ++ihalf) {
             List<SiTrackerHitStrip1D> seedHits = new ArrayList<SiTrackerHitStrip1D>();
+            List<SiTrackerHitStrip1D> seedL13Hits = new ArrayList<SiTrackerHitStrip1D>();
+            List<SiTrackerHitStrip1D> seedL46Hits = new ArrayList<SiTrackerHitStrip1D>();
             for(int layer : stereoHitsPerLayer.get(ihalf).keySet()) {
                 // single hit on the sensor
-                if( stereoHitsPerLayer.get(ihalf).get(layer).size() == 1 )
+                if( stereoHitsPerLayer.get(ihalf).get(layer).size() == 1 ) {
                     seedHits.add(stereoHitsPerLayer.get(ihalf).get(layer).get(0));
+                    if( layer < 4) seedL13Hits.add(stereoHitsPerLayer.get(ihalf).get(layer).get(0));
+                    else seedL46Hits.add(stereoHitsPerLayer.get(ihalf).get(layer).get(0));
+                }
             }
             stereoSeedHits.add(seedHits);
+            stereoSeedL13Hits.add(seedL13Hits);
+            stereoSeedL46Hits.add(seedL46Hits);
         }
         
 
@@ -565,6 +640,34 @@
             axialTracks.add(track);
         }
 
+        
+        // add hits to L13 axial tracks and fit them
+        List<STUtils.STTrack> axialL13Tracks = new ArrayList<STUtils.STTrack>();
+        for(List<SiTrackerHitStrip1D> seedHits : axialSeedL13Hits) {
+            if(seedHits.size() !=3)
+                continue;
+            STUtils.STTrack track = new STUtils.STTrack();
+            track.setHits(seedHits);
+            logger.fine("Fit axial L13 track");
+            regressionFitter.fit(track);
+            track.addFit(regressionFitter.getFit());
+            axialL13Tracks.add(track);
+        }
+
+        // add hits to L46 axial tracks and fit them
+        List<STUtils.STTrack> axialL46Tracks = new ArrayList<STUtils.STTrack>();
+        for(List<SiTrackerHitStrip1D> seedHits : axialSeedL46Hits) {
+            if(seedHits.size() !=3)
+                continue;
+            STUtils.STTrack track = new STUtils.STTrack();
+            track.setHits(seedHits);
+            logger.fine("Fit axial L46 track");
+            regressionFitter.fit(track);
+            track.addFit(regressionFitter.getFit());
+            axialL46Tracks.add(track);
+        }
+
+        
         // add stereo hits to tracks and fit them 
         List<STUtils.STStereoTrack> stereoTracks = new ArrayList<STUtils.STStereoTrack>();
         for(List<STUtils.StereoPair> seedHits : stereoPairs) {
@@ -616,8 +719,70 @@
         trackAxialCount[0].fill(nTracksAxial[0]);
         trackAxialCount[1].fill(nTracksAxial[1]);
         
-        
-        
+        // Fill histograms for axial L13 tracks
+        
+        for(STUtils.STTrack track : axialL13Tracks) {
+            
+            for(SiTrackerHitStrip1D hit : track.getHits()) {
+                double yhit = hit.getPositionAsVector().y();
+                double zHit = hit.getPositionAsVector().z();
+                double yPred = track.predict(zHit);
+                double resGlobal = yhit - yPred;
+                sensorHitResGlobalL13.get(hit.getRawHits().get(0).getDetectorElement().getName()).fill(resGlobal);
+            }
+            
+            logger.finest(track.toString());
+
+            if(track.isTop()) {
+                trackL13AxialSlope[0].fill(track.getSlope());
+                trackL13AxialIntercept[0].fill(track.getIntercept());
+            }
+            else {
+                trackL13AxialSlope[1].fill(track.getSlope());
+                trackL13AxialIntercept[1].fill(track.getIntercept());
+            }
+         }   
+        
+        // Fill histograms for axial L46 tracks
+        
+        for(STUtils.STTrack track : axialL46Tracks) {
+            
+            for(SiTrackerHitStrip1D hit : track.getHits()) {
+                double yhit = hit.getPositionAsVector().y();
+                double zHit = hit.getPositionAsVector().z();
+                double yPred = track.predict(zHit);
+                double resGlobal = yhit - yPred;
+                sensorHitResGlobalL46.get(hit.getRawHits().get(0).getDetectorElement().getName()).fill(resGlobal);
+            }
+            
+            logger.finest(track.toString());
+
+            if(track.isTop()) {
+                trackL46AxialSlope[0].fill(track.getSlope());
+                trackL46AxialIntercept[0].fill(track.getIntercept());
+            }
+            else {
+                trackL46AxialSlope[1].fill(track.getSlope());
+                trackL46AxialIntercept[1].fill(track.getIntercept());
+            }
+         }   
+        
+        // Look at difference b/w L13 and L46 axial tracks
+        
+        if(axialL13Tracks.size()==1 && axialL46Tracks.size()==1) {
+            STUtils.STTrack l13Track =  axialL13Tracks.get(0);
+            STUtils.STTrack l46Track =  axialL46Tracks.get(0);
+            if( l13Track.isTop() == l46Track.isTop()) {
+            if(l13Track.isTop()) {
+                trackL13L46AxialSlope[0].fill(l13Track.getSlope() - l46Track.getSlope());
+                trackL13L46AxialIntercept[0].fill(l13Track.getIntercept() - l46Track.getIntercept());
+            }
+            else {
+                trackL13L46AxialSlope[1].fill(l13Track.getSlope() - l46Track.getSlope());
+                trackL13L46AxialIntercept[1].fill(l13Track.getIntercept() - l46Track.getIntercept());
+            }
+        }
+        }        
         // Update track and hit positions
         for(STUtils.STStereoTrack track : stereoTracks) {
 

Modified: java/branches/jeremy-dev/users/src/main/java/org/hps/users/holly/EcalRawConverter.java
 =============================================================================
--- java/branches/jeremy-dev/users/src/main/java/org/hps/users/holly/EcalRawConverter.java	(original)
+++ java/branches/jeremy-dev/users/src/main/java/org/hps/users/holly/EcalRawConverter.java	Tue Dec  8 20:48:40 2015
@@ -138,7 +138,7 @@
 					System.out.println("======================================================================");
 					System.out.println("=== FADC Pulse-Processing Settings ===================================");
 					System.out.println("======================================================================");
-					config.printConfig();
+					config.printConfig(System.out);
 				}
 			}
     	});

Top of Message | Previous Page | Permalink

Advanced Options


Options

Log In

Log In

Get Password

Get Password


Search Archives

Search Archives


Subscribe or Unsubscribe

Subscribe or Unsubscribe


Archives

November 2017
August 2017
July 2017
January 2017
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
December 2013
November 2013

ATOM RSS1 RSS2



LISTSERV.SLAC.STANFORD.EDU

Secured by F-Secure Anti-Virus CataList Email List Search Powered by the LISTSERV Email List Manager

Privacy Notice, Security Notice and Terms of Use