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  February 2016

HPS-SVN February 2016

Subject:

r4229 - in /java/branches/jeremy-dev: ./ analysis/src/main/java/org/hps/analysis/dataquality/ analysis/src/main/java/org/hps/analysis/ecal/ detector-data/detectors/HPS-PhysicsRun2016-1_5mm-v4-4/ detector-data/detectors/HPS-PhysicsRun2016-2mm-v4-4/ detector-data/detectors/HPS-PhysicsRun2016-3mm-v4-4/ detector-data/detectors/HPS-PhysicsRun2016-4mm-v4-4/ detector-data/detectors/HPS-PhysicsRun2016-Nominal-v4-4/ evio/src/main/java/org/hps/evio/ integration-tests/ integration-tests/src/test/java/org/hps/test/it/ monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/ monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/ 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/monitoring/ steering-files/src/main/resources/org/hps/steering/production/ users/src/main/java/org/hps/users/celentan/

From:

[log in to unmask]

Reply-To:

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

Date:

Tue, 16 Feb 2016 21:35:48 -0000

Content-Type:

text/plain

Parts/Attachments:

Parts/Attachments

text/plain (4182 lines)

Author: [log in to unmask]
Date: Tue Feb 16 13:35:43 2016
New Revision: 4229

Log:
Merge in trunk changes to branch.

Added:
    java/branches/jeremy-dev/users/src/main/java/org/hps/users/celentan/LedOnlineOfflineComparisonDriver.java
      - copied unchanged from r4228, java/trunk/users/src/main/java/org/hps/users/celentan/LedOnlineOfflineComparisonDriver.java
Modified:
    java/branches/jeremy-dev/   (props changed)
    java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/dataquality/EcalMonitoring.java
    java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/dataquality/FinalStateMonitoring.java
    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/V0Monitoring.java
    java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/ecal/FEEClusterPlotter.java
    java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-1_5mm-v4-4/HPS-PhysicsRun2016-1_5mm-v4-4.lcdd
    java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-1_5mm-v4-4/compact.xml
    java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-2mm-v4-4/HPS-PhysicsRun2016-2mm-v4-4.lcdd
    java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-2mm-v4-4/compact.xml
    java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-3mm-v4-4/HPS-PhysicsRun2016-3mm-v4-4.lcdd
    java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-3mm-v4-4/compact.xml
    java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-4mm-v4-4/HPS-PhysicsRun2016-4mm-v4-4.lcdd
    java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-4mm-v4-4/compact.xml
    java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-Nominal-v4-4/HPS-PhysicsRun2016-Nominal-v4-4.lcdd
    java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-Nominal-v4-4/compact.xml
    java/branches/jeremy-dev/evio/src/main/java/org/hps/evio/AbstractSvtEvioReader.java
    java/branches/jeremy-dev/evio/src/main/java/org/hps/evio/AugmentedSvtEvioReader.java
    java/branches/jeremy-dev/integration-tests/   (props changed)
    java/branches/jeremy-dev/integration-tests/pom.xml
    java/branches/jeremy-dev/integration-tests/src/test/java/org/hps/test/it/EvioToLcioTest.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/ecal/plots/EcalLedSequenceMonitor.java
    java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/triggerbank/TIData.java
    java/branches/jeremy-dev/run-database/src/main/java/org/hps/run/database/RunManager.java
    java/branches/jeremy-dev/steering-files/src/main/resources/org/hps/steering/monitoring/SvtOnlineMonitoring.lcsim
    java/branches/jeremy-dev/steering-files/src/main/resources/org/hps/steering/production/DataQualityRecon.lcsim   (contents, props changed)

Modified: java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/dataquality/EcalMonitoring.java
 =============================================================================
--- java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/dataquality/EcalMonitoring.java	(original)
+++ java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/dataquality/EcalMonitoring.java	Tue Feb 16 13:35:43 2016
@@ -73,7 +73,14 @@
     boolean fillHitPlots = true;
     String[] ecalQuantNames = {"avg_N_hits", "avg_Hit_Energy",
         "avg_N_clusters", "avg_N_hitsPerCluster", "avg_Cluster_Energy", "avg_ClusterTime"};
-    double maxE = 1.1;
+    double beamEnergy = 1.1;
+    
+    double maxFactor = 1.5;
+    
+    public void setBeamEnergy(double e){
+    	beamEnergy = e;
+    }
+    
     private final String plotHitsDir = "EcalHits/";
     private final String plotClustersDir = "EcalClusters/";
     private final String plotFidCutDir = "FiducialCut/";
@@ -90,6 +97,7 @@
         this.clusterCollectionName = clusterCollectionName;
     }
 
+    
     public void setFillHitPlots(boolean fill) {
         this.fillHitPlots = fill;
     }
@@ -102,32 +110,32 @@
             // Setup hit plots.
             hitCountPlot = aida.histogram1D(plotHitsDir + triggerType + "/"+ calibratedHitCollectionName + " Hit Count In Event", 40, -0.5, 39.5);
             hitTimePlot = aida.histogram1D(plotHitsDir + triggerType + "/"+calibratedHitCollectionName + " Hit Time", 50, 0 * 4.0, 50 * 4.0);
-            hitEnergyPlot = aida.histogram1D(plotHitsDir + triggerType + "/"+calibratedHitCollectionName + " Hit Energy", 100, -0.1, maxE);
+            hitEnergyPlot = aida.histogram1D(plotHitsDir + triggerType + "/"+calibratedHitCollectionName + " Hit Energy", 100, -0.1, beamEnergy*maxFactor);
             fiducialHitCountPlot = aida.histogram1D(plotHitsDir + triggerType + "/"+calibratedHitCollectionName + " Hit Count with Fiducial Cut", 10, -0.5, 9.5);
-            fiducialEnergyPlot = aida.histogram1D(plotHitsDir + triggerType + "/"+calibratedHitCollectionName + " Hit Energy with Fiducial Cut", 100, -0.1, maxE);
+            fiducialEnergyPlot = aida.histogram1D(plotHitsDir + triggerType + "/"+calibratedHitCollectionName + " Hit Energy with Fiducial Cut", 100, -0.1, beamEnergy*maxFactor);
         }
         // Setup cluster plots
         clusterCountPlot = aida.histogram1D(plotClustersDir +  triggerType + "/"+clusterCollectionName + " Cluster Count per Event", 10, -0.5, 9.5);
         clusterSizePlot = aida.histogram1D(plotClustersDir +  triggerType + "/"+clusterCollectionName + " Cluster Size", 10, -0.5, 9.5);
-        clusterEnergyPlot = aida.histogram1D(plotClustersDir +  triggerType + "/"+clusterCollectionName + " Cluster Energy", 100, -0.1, maxE);
+        clusterEnergyPlot = aida.histogram1D(plotClustersDir +  triggerType + "/"+clusterCollectionName + " Cluster Energy", 100, -0.1, beamEnergy*maxFactor);
         clusterTimes = aida.histogram1D(plotClustersDir +  triggerType + "/"+clusterCollectionName + " Cluster Seed Times", 400, 0, 4.0 * 50);
         clusterTimeMean = aida.histogram1D(plotClustersDir +  triggerType + "/"+clusterCollectionName + " Cluster Time Mean", 400, 0, 4.0 * 50);
         clusterTimeSigma = aida.histogram1D(plotClustersDir +  triggerType + "/"+clusterCollectionName + " Cluster Time Sigma", 100, 0, 10);
-        twoclusterTotEnergy = aida.histogram1D(plotClustersDir +  triggerType + "/"+clusterCollectionName + " Two Cluster Energy Sum", 100, 0, maxE);
-        twoclusterEnergyAsymmetry = aida.histogram1D(plotClustersDir +  triggerType + "/"+clusterCollectionName + " Two Cluster Energy Asymmetry", 100, 0, 1.0);
-        energyVsT = aida.histogram2D(plotClustersDir +  triggerType + "/"+clusterCollectionName + " Energy vs time", 400, 0.0, 200.0, 100, -0.1, maxE);
+        twoclusterTotEnergy = aida.histogram1D(plotClustersDir +  triggerType + "/"+clusterCollectionName + " Two Cluster Energy Sum", 100, 0, beamEnergy*maxFactor);
+        twoclusterEnergyAsymmetry = aida.histogram1D(plotClustersDir +  triggerType + "/"+clusterCollectionName + " Two Cluster Energy Asymmetry", 100, 0, beamEnergy*maxFactor);
+        energyVsT = aida.histogram2D(plotClustersDir +  triggerType + "/"+clusterCollectionName + " Energy vs time", 400, 0.0, 200.0, 100, -0.1, beamEnergy*maxFactor);
         xVsY = aida.histogram2D(plotClustersDir +  triggerType + "/"+clusterCollectionName + " X vs Y (NHits >1)", 200, -200.0, 200.0, 85, -85.0, 85.0);
-        energyVsX = aida.histogram2D(plotClustersDir +  triggerType + "/"+clusterCollectionName + " Energy vs X", 50, 0, 1.6, 50, .0, 200.0);
-        energyVsY = aida.histogram2D(plotClustersDir +  triggerType + "/"+clusterCollectionName + " Energy vs Y", 50, 0, 1.6, 50, 20.0, 85.0);
-        pairsE1vsE2 = aida.histogram2D(plotClustersDir +  triggerType + "/"+clusterCollectionName + "Pair E1 vs E2", 50, 0, 2, 50, 0, 2);
+        energyVsX = aida.histogram2D(plotClustersDir +  triggerType + "/"+clusterCollectionName + " Energy vs X", 50, 0, maxFactor*beamEnergy, 50, .0, 200.0);
+        energyVsY = aida.histogram2D(plotClustersDir +  triggerType + "/"+clusterCollectionName + " Energy vs Y", 50, 0, maxFactor*beamEnergy, 50, 20.0, 85.0);
+        pairsE1vsE2 = aida.histogram2D(plotClustersDir +  triggerType + "/"+clusterCollectionName + "Pair E1 vs E2", 50, 0, beamEnergy*maxFactor, 50, 0, beamEnergy*maxFactor);
         pairsT1vsT2 = aida.histogram2D(plotClustersDir +  triggerType + "/"+clusterCollectionName + "Pair T1 vs T2", 200, 0, 100, 200, 0, 100);
         pairsDeltaT = aida.histogram1D(plotClustersDir + triggerType + "/" + clusterCollectionName + " Pair Time Difference", 100, -20.0, 20.0);
 
         fiducialClusterCountPlot = aida.histogram1D(plotClustersDir +  triggerType + "/"+plotFidCutDir + clusterCollectionName + " Cluster Count with Fiducal Cut", 10, -0.5, 9.5);
         fiducialClusterSizePlot = aida.histogram1D(plotClustersDir+  triggerType + "/" +plotFidCutDir + clusterCollectionName + " Cluster Size with Fiducal Cut", 10, -0.5, 9.5);
-        fiducialClusterEnergyPlot = aida.histogram1D(plotClustersDir +  triggerType + "/"+plotFidCutDir  + clusterCollectionName + " Cluster Energy with Fiducal Cut", 100, -0.1, maxE);
-        fiducialenergyVsY = aida.histogram2D(plotClustersDir +  triggerType + "/"+plotFidCutDir + clusterCollectionName + " Energy vs Y with Fiducial Cuts", 50, 0, 1.6, 50, 45.0, 85.0);
-        fiducialenergyVsX = aida.histogram2D(plotClustersDir+  triggerType + "/" +plotFidCutDir + clusterCollectionName + " Energy vs X with Fiducial Cuts", 50, 0, 1.6, 50, 0.0, 200.0);
+        fiducialClusterEnergyPlot = aida.histogram1D(plotClustersDir +  triggerType + "/"+plotFidCutDir  + clusterCollectionName + " Cluster Energy with Fiducal Cut", 100, -0.1, beamEnergy*maxFactor);
+        fiducialenergyVsY = aida.histogram2D(plotClustersDir +  triggerType + "/"+plotFidCutDir + clusterCollectionName + " Energy vs Y with Fiducial Cuts", 50, 0, beamEnergy*maxFactor, 50, 45.0, 85.0);
+        fiducialenergyVsX = aida.histogram2D(plotClustersDir+  triggerType + "/" +plotFidCutDir + clusterCollectionName + " Energy vs X with Fiducial Cuts", 50, 0, beamEnergy*maxFactor, 50, 0.0, 200.0);
 
     }
 

Modified: java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/dataquality/FinalStateMonitoring.java
 =============================================================================
--- java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/dataquality/FinalStateMonitoring.java	(original)
+++ java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/dataquality/FinalStateMonitoring.java	Tue Feb 16 13:35:43 2016
@@ -62,7 +62,7 @@
     private final String plotDir = "FinalStateParticles/";
     double beamEnergy = 1.05; //GeV
     double maxFactor = 1.5;
-    double feeMomentumCut = 0.8; //GeV
+    double feeMomentumCut = 0.75; //this number, multiplied by the beam energy, is the actual cut
 
     IHistogram1D elePx;
     IHistogram1D elePy;
@@ -97,6 +97,10 @@
     /* number of unassocaited tracks/event */
     IHistogram1D nUnAssTracksHisto;
     
+    
+    public void setBeamEnergy(double e){
+    	this.beamEnergy = e;
+    }
     public void setFinalStateParticlesColName(String fsp) {
         this.finalStateParticlesColName = fsp;
     }
@@ -111,24 +115,24 @@
        
         /*  Final State Particle Quantities   */
         /*  plot electron & positron momentum separately  */
-        elePx = aida.histogram1D(plotDir +trkType+ triggerType + "/" + "Electron Px (GeV)", 100, -0.1, 0.200);
-        elePy = aida.histogram1D(plotDir +trkType+ triggerType + "/" + "Electron Py (GeV)", 100, -0.1, 0.1);
+        elePx = aida.histogram1D(plotDir +trkType+ triggerType + "/" + "Electron Px (GeV)", 100, -0.1*beamEnergy, 0.200*beamEnergy);
+        elePy = aida.histogram1D(plotDir +trkType+ triggerType + "/" + "Electron Py (GeV)", 100, -0.1*beamEnergy, 0.1*beamEnergy);
         elePz = aida.histogram1D(plotDir +trkType+ triggerType + "/" + "Electron Pz (GeV)", 100, 0, beamEnergy * maxFactor);
-        elePzBeam = aida.histogram1D(plotDir +trkType+ triggerType + "/" + "Beam Electrons Total P (GeV)", 100, feeMomentumCut, beamEnergy * maxFactor);
-        elePzBeamTop = aida.histogram1D(plotDir +trkType+ triggerType + "/" + "Beam Electrons Total P (GeV):  Top", 100, feeMomentumCut, beamEnergy * maxFactor);
-        elePzBeamBottom = aida.histogram1D(plotDir +trkType+ triggerType + "/" + "Beam Electrons Total P (GeV):  Bottom", 100, feeMomentumCut, beamEnergy * maxFactor);
+        elePzBeam = aida.histogram1D(plotDir +trkType+ triggerType + "/" + "Beam Electrons Total P (GeV)", 100, feeMomentumCut*beamEnergy, beamEnergy * maxFactor);
+        elePzBeamTop = aida.histogram1D(plotDir +trkType+ triggerType + "/" + "Beam Electrons Total P (GeV):  Top", 100, feeMomentumCut*beamEnergy, beamEnergy * maxFactor);
+        elePzBeamBottom = aida.histogram1D(plotDir +trkType+ triggerType + "/" + "Beam Electrons Total P (GeV):  Bottom", 100, feeMomentumCut*beamEnergy, beamEnergy * maxFactor);
         elePTop = aida.histogram1D(plotDir +trkType+ triggerType + "/" + "Electron Total P (GeV):  Top", 100, 0, beamEnergy * maxFactor);
         elePBottom = aida.histogram1D(plotDir +trkType+ triggerType + "/" + "Electron Total P (GeV):  Bottom", 100, 0, beamEnergy * maxFactor);
 
-        posPx = aida.histogram1D(plotDir +trkType+ triggerType + "/" + "Positron Px (GeV)", 50, -0.1, 0.200);
-        posPy = aida.histogram1D(plotDir +trkType+ triggerType + "/" + "Positron Py (GeV)", 50, -0.1, 0.1);
+        posPx = aida.histogram1D(plotDir +trkType+ triggerType + "/" + "Positron Px (GeV)", 50, -0.1*beamEnergy, 0.200*beamEnergy);
+        posPy = aida.histogram1D(plotDir +trkType+ triggerType + "/" + "Positron Py (GeV)", 50, -0.1*beamEnergy, 0.1*beamEnergy);
         posPz = aida.histogram1D(plotDir +trkType+ triggerType + "/" + "Positron Pz (GeV)", 50, 0, beamEnergy * maxFactor);
         posPTop = aida.histogram1D(plotDir +trkType+ triggerType + "/" + "Positron Total P (GeV):  Top", 100, 0, beamEnergy * maxFactor);
         posPBottom = aida.histogram1D(plotDir +trkType+ triggerType + "/" + "Positron Total P (GeV):  Bottom", 100, 0, beamEnergy * maxFactor);
 
         /*  photon quanties (...right now, just unassociated clusters) */
         nPhotonsHisto = aida.histogram1D(plotDir +trkType+ triggerType + "/" + "Number of photons per event", 15, 0, 15);
-        enePhoton = aida.histogram1D(plotDir +trkType+ triggerType + "/" + "Photon Energy (GeV)", 50, 0, 2.4);
+        enePhoton = aida.histogram1D(plotDir +trkType+ triggerType + "/" + "Photon Energy (GeV)", 50, 0, 2.4*beamEnergy);
         xPhoton = aida.histogram1D(plotDir +trkType+ triggerType + "/" + "Photon X position (mm)", 50, -200, 200);
         yPhoton = aida.histogram1D(plotDir +trkType+ triggerType + "/" + "Photon Y position (mm)", 50, -100, 100);
 

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 Feb 16 13:35:43 2016
@@ -74,6 +74,36 @@
     private final static Logger LOGGER = Logger.getLogger(TridentMonitoring.class.getPackage().getName());
 
     private double ebeam = 1.05;
+    
+    public void setBeamEnergy(double ebeam){
+    	this.ebeam = ebeam;
+    	
+    	  plotsMinMass = 0.03 * ebeam;
+    	    plotsMaxMass = 0.04 * ebeam;
+
+
+    	    //v0 plot ranges
+    	    v0PzMax = 1.25 * ebeam;//GeV 
+    	    v0PzMin = 0.1;// GeV
+    	    v0PyMax = 0.04 * ebeam;//GeV absolute value
+    	    v0PxMax = 0.04 * ebeam;//GeV absolute value
+    	    
+    	    //v0 cuts
+    	    v0PzMaxCut = 1.25 * ebeam;//GeV 
+    	    v0PzMinCut = 0.1;// GeV
+    	    v0PyCut = 0.04 * ebeam;//GeV absolute value
+    	    v0PxCut = 0.04 * ebeam;//GeV absolute value
+    	    
+    	//  track quality cuts
+    	    beamPCut = 0.85 * ebeam;
+    	    minPCut = 0.05;
+//    	    private double trkPyMax = 0.2;
+//    	    private double trkPxMax = 0.2;
+    	    radCut = 0.8 * ebeam;
+    	    
+
+    }
+    
     private final BasicHep3Matrix beamAxisRotation = new BasicHep3Matrix();
 //    private static final int nCuts = 9;
 //    private final String[] cutNames = {"Trk Quality",
@@ -216,8 +246,8 @@
     private final IHistogram1D[][] cutVertexZ = new IHistogram1D[Cut.nCuts][2];
     private final IHistogram2D[][] cutVertexZVsMass = new IHistogram2D[Cut.nCuts][2];
 
-    private final double plotsMinMass = 0.03 * ebeam;
-    private final double plotsMaxMass = 0.04 * ebeam;
+    private  double plotsMinMass = 0.03 * ebeam;
+    private  double plotsMaxMass = 0.04 * ebeam;
 
     //clean up event first
     private final int nTrkMax = 5;
@@ -228,29 +258,29 @@
     private final double maxVertChi2 = 7.0;
 
     //v0 plot ranges
-    private final double v0PzMax = 1.25 * ebeam;//GeV 
-    private final double v0PzMin = 0.1;// GeV
-    private final double v0PyMax = 0.04;//GeV absolute value
-    private final double v0PxMax = 0.04;//GeV absolute value
+    private  double v0PzMax = 1.25 * ebeam;//GeV 
+    private  double v0PzMin = 0.1;// GeV
+    private  double v0PyMax = 0.04 * ebeam;//GeV absolute value
+    private  double v0PxMax = 0.04 * ebeam;//GeV absolute value
     private final double v0VzMax = 50.0;// mm from target...someday make mass dependent
     private final double v0VyMax = 2.0;// mm from target...someday make mass dependent
     private final double v0VxMax = 2.0;// mm from target...someday make mass dependent
 
     //v0 cuts
-    private final double v0PzMaxCut = 1.25 * ebeam;//GeV 
-    private final double v0PzMinCut = 0.1;// GeV
-    private final double v0PyCut = 0.04;//GeV absolute value
-    private final double v0PxCut = 0.04;//GeV absolute value
+    private  double v0PzMaxCut = 1.25 * ebeam;//GeV 
+    private  double v0PzMinCut = 0.1;// GeV
+    private  double v0PyCut = 0.04 * ebeam;//GeV absolute value
+    private  double v0PxCut = 0.04 * ebeam;//GeV absolute value
     private final double v0VzCut = 50.0;// mm from target...someday make mass dependent
     private final double v0VyCut = 2.0;// mm from target...someday make mass dependent
     private final double v0VxCut = 2.0;// mm from target...someday make mass dependent
     
 //  track quality cuts
-    private final double beamPCut = 0.85;
-    private final double minPCut = 0.05;
+    private  double beamPCut = 0.85 * ebeam;
+    private  double minPCut = 0.05;
 //    private double trkPyMax = 0.2;
 //    private double trkPxMax = 0.2;
-    private final double radCut = 0.8 * ebeam;
+    private  double radCut = 0.8 * ebeam;
     private final double trkTimeDiff = 5.0;
     private final double clusterTimeDiffCut = 2.5;
 
@@ -268,9 +298,7 @@
     private float nRecoV0 = 0;
     private final float[] nPassCut = new float[Cut.nCuts];
 
-    public void setEbeam(double ebeam) {
-        this.ebeam = ebeam;
-    }
+   
 
     @Override
     protected void detectorChanged(Detector detector) {

Modified: java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/dataquality/V0Monitoring.java
 =============================================================================
--- java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/dataquality/V0Monitoring.java	(original)
+++ java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/dataquality/V0Monitoring.java	Tue Feb 16 13:35:43 2016
@@ -150,19 +150,40 @@
     private final BasicHep3Matrix beamAxisRotation = new BasicHep3Matrix();
 
     double maxFactor = 1.25;
-    double feeMomentumCut = 0.8; //GeV
-
-    double v0ESumMinCut = 0.8 * beamEnergy;
-    double v0ESumMaxCut = 1.25 * beamEnergy;
-    double v0MaxPCut = 1.1;//GeV
-    double molPSumMin = 0.85;
-    double molPSumMax = 1.3;
-    double beambeamCut = 0.85;
+    
+    
     double thetaMax = 0.06;
     double thetaMin = 0.015;
+    
+    public void setBeamEnergy(double e){
+    	this.beamEnergy = e;
+    	feeMomentumCut = 0.75*beamEnergy; //GeV
+
+        v0ESumMinCut = 0.8 * beamEnergy;
+        v0ESumMaxCut = 1.25 * beamEnergy;
+        /*double v0MaxPCut = 1.1;//GeV
+        double molPSumMin = 0.85;
+        double molPSumMax = 1.3;
+        double beambeamCut = 0.85;
+        */
+        v0MaxPCut = 1.05*beamEnergy;//GeV
+        molPSumMin = 0.80*beamEnergy;
+        molPSumMax = 1.25*beamEnergy;
+        beambeamCut = 0.80*beamEnergy;
+    	
+    }
+    
+    double feeMomentumCut, v0ESumMinCut, v0MaxPCut, v0ESumMaxCut,
+    	molPSumMin, molPSumMax, beambeamCut;
+    
+    
 
     @Override
     protected void detectorChanged(Detector detector) {
+    	setBeamEnergy(beamEnergy);
+    	
+    	
+    	
         beamAxisRotation.setActiveEuler(Math.PI / 2, -0.0305, -Math.PI / 2);
 
         LOGGER.info("Setting up the plotter");
@@ -171,10 +192,13 @@
         String trkType = "SeedTrack/";
         if (isGBL)
             trkType = "GBLTrack/";
+        
+        double maxMass = .2*beamEnergy;
+        double maxMassMoller = .1*Math.sqrt(beamEnergy);
         /*  V0 Quantities   */
         /*  Mass, vertex, chi^2 of fit */
         /*  unconstrained */
-        unconMass = aida.histogram1D(plotDir + trkType + triggerType + "/" + unconstrainedV0CandidatesColName + "/" + "Invariant Mass (GeV)", 100, 0, 0.200);
+        unconMass = aida.histogram1D(plotDir + trkType + triggerType + "/" + unconstrainedV0CandidatesColName + "/" + "Invariant Mass (GeV)", 100, 0, maxMass);
         unconVx = aida.histogram1D(plotDir + trkType + triggerType + "/" + unconstrainedV0CandidatesColName + "/" + "Vx (mm)", 50, -10, 10);
         unconVy = aida.histogram1D(plotDir + trkType + triggerType + "/" + unconstrainedV0CandidatesColName + "/" + "Vy (mm)", 50, -10, 10);
         unconVz = aida.histogram1D(plotDir + trkType + triggerType + "/" + unconstrainedV0CandidatesColName + "/" + "Vz (mm)", 50, -50, 50);
@@ -182,7 +206,7 @@
         unconVzVsChi2 = aida.histogram2D(plotDir + trkType + triggerType + "/" + unconstrainedV0CandidatesColName + "/" + "Vz vs. Chi2", 25, 0, 25, 50, -50, 50);
         unconChi2VsTrkChi2 = aida.histogram2D(plotDir + trkType + triggerType + "/" + unconstrainedV0CandidatesColName + "/" + "Chi2 vs. total track chi2", 50, 0, 50, 50, 0, 25);
         /* beamspot constrained */
-        bsconMass = aida.histogram1D(plotDir + trkType + triggerType + "/" + beamConV0CandidatesColName + "/" + "Mass (GeV)", 100, 0, 0.200);
+        bsconMass = aida.histogram1D(plotDir + trkType + triggerType + "/" + beamConV0CandidatesColName + "/" + "Mass (GeV)", 100, 0, maxMass);
         bsconVx = aida.histogram1D(plotDir + trkType + triggerType + "/" + beamConV0CandidatesColName + "/" + "Vx (mm)", 50, -10, 10);
         bsconVy = aida.histogram1D(plotDir + trkType + triggerType + "/" + beamConV0CandidatesColName + "/" + "Vy (mm)", 50, -10, 10);
         bsconVz = aida.histogram1D(plotDir + trkType + triggerType + "/" + beamConV0CandidatesColName + "/" + "Vz (mm)", 50, -50, 50);
@@ -190,7 +214,7 @@
         bsconVzVsChi2 = aida.histogram2D(plotDir + trkType + triggerType + "/" + beamConV0CandidatesColName + "/" + "Vz vs. Chi2", 25, 0, 25, 50, -50, 50);
         bsconChi2VsTrkChi2 = aida.histogram2D(plotDir + trkType + triggerType + "/" + beamConV0CandidatesColName + "/" + "Chi2 vs. total track chi2", 50, 0, 50, 50, 0, 25);
         /* target constrained */
-        tarconMass = aida.histogram1D(plotDir + trkType + triggerType + "/" + targetV0ConCandidatesColName + "/" + "Mass (GeV)", 100, 0, 0.200);
+        tarconMass = aida.histogram1D(plotDir + trkType + triggerType + "/" + targetV0ConCandidatesColName + "/" + "Mass (GeV)", 100, 0, maxMass);
         tarconVx = aida.histogram1D(plotDir + trkType + triggerType + "/" + targetV0ConCandidatesColName + "/" + "Vx (mm)", 50, -1, 1);
         tarconVy = aida.histogram1D(plotDir + trkType + triggerType + "/" + targetV0ConCandidatesColName + "/" + "Vy (mm)", 50, -1, 1);
         tarconVz = aida.histogram1D(plotDir + trkType + triggerType + "/" + targetV0ConCandidatesColName + "/" + "Vz (mm)", 50, -10, 10);
@@ -206,9 +230,9 @@
 
         pEleVspPos = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "P(e) vs P(p)", 50, 0, beamEnergy * maxFactor, 50, 0, beamEnergy * maxFactor);
         pEleVspPosWithCut = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "P(e) vs P(p): Radiative", 50, 0, beamEnergy * maxFactor, 50, 0, beamEnergy * maxFactor);
-        pyEleVspyPos = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Py(e) vs Py(p)", 50, -0.04, 0.04, 50, -0.04, 0.04);
-        pxEleVspxPos = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Px(e) vs Px(p)", 50, -0.04, 0.04, 50, -0.04, 0.04);
-        VtxZVsMass = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Vz vs Mass", 50, 0, 0.15, 50, -50, 80);
+        pyEleVspyPos = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Py(e) vs Py(p)", 50, -0.04*beamEnergy, 0.04*beamEnergy, 50, -0.04*beamEnergy, 0.04*beamEnergy);
+        pxEleVspxPos = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Px(e) vs Px(p)", 50, -0.04*beamEnergy, 0.04*beamEnergy, 50, -0.04*beamEnergy, 0.04*beamEnergy);
+        VtxZVsMass = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Vz vs Mass", 50, 0, maxMass, 50, -50, 80);
         VtxXVsVtxZ = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Vx vs Vz", 100, -10, 10, 100, -50, 80);
         VtxYVsVtxZ = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Vy vs Vz", 100, -5, 5, 100, -50, 80);
         VtxXVsVtxY = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Vx vs Vy", 100, -10, 10, 100, -5, 5);
@@ -221,13 +245,13 @@
         VtxZVsTrkChi2 = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Vz vs Track Chi2", 50, 0, 50, 50, -50, 80);
         pEleVspEle = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/P(e) vs P(e)", 50, 0, beamEnergy * maxFactor, 50, 0, beamEnergy * maxFactor);
         phiEleVsphiEle = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/phi(e) vs phi(e)", 50, -Math.PI, Math.PI, 50, -Math.PI, Math.PI);
-        pyEleVspyEle = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Py(e) vs Py(e)", 50, -0.04, 0.04, 50, -0.04, 0.04);
-        pxEleVspxEle = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Px(e) vs Px(e)", 50, -0.02, 0.06, 50, -0.02, 0.06);
+        pyEleVspyEle = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Py(e) vs Py(e)", 50, -0.04*beamEnergy, 0.04*beamEnergy, 50, -0.04*beamEnergy, 0.04*beamEnergy);
+        pxEleVspxEle = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Px(e) vs Px(e)", 50, -0.02*beamEnergy, 0.06*beamEnergy, 50, -0.02*beamEnergy, 0.06*beamEnergy);
         pEleVspEleNoBeam = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/P(e) vs P(e) NoBeam", 50, 0, beambeamCut, 50, 0, beambeamCut);
         pEleVspEleMoller = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/P(e) vs P(e) Moller", 50, 0, beambeamCut, 50, 0, beambeamCut);
         pEleVspEleBeamBeam = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/P(e) vs P(e) BeamBeam", 50, beambeamCut, beamEnergy * maxFactor, 50, beambeamCut, beamEnergy * maxFactor);
-        pyEleVspyEleNoBeam = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Py(e) vs Py(e) NoBeam", 50, -0.04, 0.04, 50, -0.04, 0.04);
-        pxEleVspxEleNoBeam = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Px(e) vs Px(e) NoBeam", 50, -0.02, 0.06, 50, -0.02, 0.06);
+        pyEleVspyEleNoBeam = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Py(e) vs Py(e) NoBeam", 50, -0.04*beamEnergy, 0.04*beamEnergy, 50, -0.04*beamEnergy, 0.04*beamEnergy);
+        pxEleVspxEleNoBeam = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Px(e) vs Px(e) NoBeam", 50, -0.02*beamEnergy, 0.06*beamEnergy, 50, -0.02*beamEnergy, 0.06*beamEnergy);
         sumChargeHisto = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Total Charge of  Event", 5, -2, 3);
         numChargeHisto = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Number of Charged Particles", 6, 0, 6);
 
@@ -236,8 +260,8 @@
         pEleVsthetaBeamBeam = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/P(e) vs Theta BeamBeam", 50, beambeamCut, beamEnergy * maxFactor, 50, thetaMin, thetaMax);
         thetaEleVsthetaBeamBeam = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Theta vs Theta BeamBeam", 50, thetaMin, thetaMax, 50, thetaMin, thetaMax);
 
-        mollerMass = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Moller Mass (GeV)", 100, 0, 0.100);
-        mollerMassVtxCut = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Moller Mass (GeV): VtxCut", 100, 0, 0.100);
+        mollerMass = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Moller Mass (GeV)", 100, 0, maxMassMoller);
+        mollerMassVtxCut = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Moller Mass (GeV): VtxCut", 100, 0, maxMassMoller);
         mollerVx = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Moller Vx (mm)", 50, -10, 10);
         mollerVy = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Moller Vy (mm)", 50, -2, 2);
         mollerVz = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Moller Vz (mm)", 50, -50, 50);
@@ -246,8 +270,8 @@
         mollerYVsVtxZ = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Moller Vy vs Vz", 100, -2, 2, 100, -50, 50);
         mollerXVsVtxY = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Moller Vx vs Vy", 100, -5, 5, 100, -2, 2);
     
-        mollerUx = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Moller Pair Momentum Direction Ux", 100, .025, .035);
-        mollerUy = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Moller Pair Momentum Direction Uy", 100, -.005, .005);
+        mollerUx = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Moller Pair Momentum Direction Ux", 100, .015, .045);
+        mollerUy = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Moller Pair Momentum Direction Uy", 100, -.01, .01);
     
         
         
@@ -471,8 +495,10 @@
                 mollerYVsVtxZ.fill(bv.getPosition().y(), bv.getPosition().z());
                 mollerXVsVtxY.fill(bv.getPosition().x(), bv.getPosition().y());
                 
-                mollerUx.fill((p1.x()+p2.x())/(p1.z()+p2.z()));
-                mollerUy.fill((p1.y()+p2.y())/(p1.z()+p2.z()));
+                double ux = (ele1.getMomentum().x()+ele2.getMomentum().x())/(ele1.getMomentum().z()+ele2.getMomentum().z());
+                double uy = (ele1.getMomentum().y()+ele2.getMomentum().y())/(ele1.getMomentum().z()+ele2.getMomentum().z());
+                mollerUx.fill(ux);
+                mollerUy.fill(uy);
                 
                 if (Math.abs(bv.getPosition().x()) < 2
                         && Math.abs(bv.getPosition().y()) < 0.5) {

Modified: java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/ecal/FEEClusterPlotter.java
 =============================================================================
--- java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/ecal/FEEClusterPlotter.java	(original)
+++ java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/ecal/FEEClusterPlotter.java	Tue Feb 16 13:35:43 2016
@@ -52,7 +52,8 @@
         
         aida.tree().cd("/");
         for (EcalChannel cc : ecalConditions.getChannelCollection()) {
-            aida.histogram1D(getHistoName(cc),200,0.5,1.3);
+            //aida.histogram1D(getHistoName(cc),200,0.5,1.3);
+        	aida.histogram1D(getHistoName(cc),200,0.6,2.8);	
         }
 
     }
@@ -88,8 +89,9 @@
         		double seedE = seed.getCorrectedEnergy();
         		double clusE = clus.getEnergy();
         		double time = seed.getTime();
-        			
-        		if ((seedE/clusE > 0.6) && seedE >0.45 && time>30 && time <70){
+        		
+        		//if ((seedE/clusE > 0.6) && seedE >0.45 && time>30 && time <70){
+        		if ((seedE/clusE > 0.6) && seedE >0.6 && time>30 && time <70){
         	
         			EcalChannel cc = findChannel(seed);
         			aida.histogram1D(getHistoName(cc)).fill(clusE);

Modified: java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-1_5mm-v4-4/HPS-PhysicsRun2016-1_5mm-v4-4.lcdd
 =============================================================================
--- java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-1_5mm-v4-4/HPS-PhysicsRun2016-1_5mm-v4-4.lcdd	(original)
+++ java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-1_5mm-v4-4/HPS-PhysicsRun2016-1_5mm-v4-4.lcdd	Tue Feb 16 13:35:43 2016
@@ -8335,7 +8335,7 @@
     </setup>
   </gdml>
   <fields>
-    <box_dipole name="AnalyzingDipole" lunit="mm" funit="tesla" x="21.17" y="0.0" z="457.2" dx="500.0" dy="500.0" dz="540.0" bx="0.0" by="-0.5" bz="0.0" />
+    <box_dipole name="AnalyzingDipole" lunit="mm" funit="tesla" x="21.17" y="0.0" z="457.2" dx="500.0" dy="500.0" dz="540.0" bx="0.0" by="-0.524" bz="0.0" />
   </fields>
 </lcdd>
 

Modified: java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-1_5mm-v4-4/compact.xml
 =============================================================================
--- java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-1_5mm-v4-4/compact.xml	(original)
+++ java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-1_5mm-v4-4/compact.xml	Tue Feb 16 13:35:43 2016
@@ -33,7 +33,7 @@
         <constant name="dipoleMagnetHeight" value="100*cm" />
         <constant name="dipoleMagnetWidth" value="100*cm" />
         <constant name="dipoleMagnetLength" value="108*cm" />
-        <constant name="constBFieldY" value="-0.5" />
+        <constant name="constBFieldY" value="-0.524" />
          
         
         <!-- ECAL crystal dimensions -->
@@ -91,17 +91,17 @@
         <constant name="z02b" value="0+157.5+3.685" />
 
         <!-- Global Millepede tweak parameters (survey constraints)-->
-        <!--
-        <constant name="dOmega_top" value="1.56e-5" />
-        <constant name="dLambda_top" value="0.16e-3" />
-        <constant name="dPhi_top" value="6.87e-3" />
-        <constant name="dD0_top" value="-0.72" />
-        <constant name="dZ0_top" value="-0.13" />
-        <constant name="dOmega_bot" value="2.32e-5" />
-        <constant name="dLambda_bot" value="-0.06e-3" />
-        <constant name="dPhi_bot" value="17.92e-3" />
-        <constant name="dD0_bot" value="-6.71" />
-        <constant name="dZ0_bot" value="0.04" />
+        <!--
+        <constant name="dOmega_top" value="1.56e-5" />
+        <constant name="dLambda_top" value="0.16e-3" />
+        <constant name="dPhi_top" value="6.87e-3" />
+        <constant name="dD0_top" value="-0.72" />
+        <constant name="dZ0_top" value="-0.13" />
+        <constant name="dOmega_bot" value="2.32e-5" />
+        <constant name="dLambda_bot" value="-0.06e-3" />
+        <constant name="dPhi_bot" value="17.92e-3" />
+        <constant name="dD0_bot" value="-6.71" />
+        <constant name="dZ0_bot" value="0.04" />
                                 -->
 
         <!-- Global Millepede tweak parameters (mixed constraints: FEE momentum set at 1.05 GeV, top and bottom must agree on d0 and z0)-->
@@ -117,17 +117,17 @@
         <constant name="dZ0_bot" value="0.116788238356" />
         
         <!-- Global Millepede tweak parameters (external constraints)-->
-        <!--
-        <constant name="dOmega_top" value="0.1e-5" />
-        <constant name="dLambda_top" value="0.5e-3" />
-        <constant name="dPhi_top" value="1.5e-3" />
-        <constant name="dD0_top" value="0.8" />
-        <constant name="dZ0_top" value="-0.15" />
-        <constant name="dOmega_bot" value="2.4e-5" />
-        <constant name="dLambda_bot" value="1.5e-3" />
-        <constant name="dPhi_bot" value="17e-3" />
-        <constant name="dD0_bot" value="-5.6" />
-        <constant name="dZ0_bot" value="0.2" />
+        <!--
+        <constant name="dOmega_top" value="0.1e-5" />
+        <constant name="dLambda_top" value="0.5e-3" />
+        <constant name="dPhi_top" value="1.5e-3" />
+        <constant name="dD0_top" value="0.8" />
+        <constant name="dZ0_top" value="-0.15" />
+        <constant name="dOmega_bot" value="2.4e-5" />
+        <constant name="dLambda_bot" value="1.5e-3" />
+        <constant name="dPhi_bot" value="17e-3" />
+        <constant name="dD0_bot" value="-5.6" />
+        <constant name="dZ0_bot" value="0.2" />
                                 -->
 
     </define>
@@ -781,24 +781,24 @@
         </millepede_constants>
     </detector>   
       
-<!-- 
- <detector id="30" name="TrackerFieldDef" type="HPSTracker2" readout="TrackerHitsFieldDef" >
-            <comment>Boundary planes for magnetic field, also used as scoring planes</comment>
-            <module name="TestRunModuleFieldDef">
-                <box x="416.052" y="177.8" />
-                <module_component thickness="scoringThickness" material = "Vacuum" sensitive="true"/>
-            </module>            
-            <module name="TestRunModuleFieldDefFlare2">
-                <box x="416.052" y="177.8+(327.66-177.8)*(dipoleMagnetPositionZ+dipoleMagnetLength/2-913.378)/385.572" />
-                <module_component thickness="scoringThickness" material = "Vacuum" sensitive="true"/>
-            </module>            
-            <layer id="1">
-                <module_placement name="TestRunModuleFieldDef" id="0" x="dipoleMagnetPositionX" y="0" z="dipoleMagnetPositionZ-dipoleMagnetLength/2" rx="0" ry="0" rz="-PI/2"/>
-            </layer>
-            <layer id="2">
-                <module_placement name="TestRunModuleFieldDefFlare2" id="0" x="dipoleMagnetPositionX" y="0" z="dipoleMagnetPositionZ+dipoleMagnetLength/2" rx="0" ry="0" rz="-PI/2"/>
-            </layer>
-        </detector> 
+<!-- 
+ <detector id="30" name="TrackerFieldDef" type="HPSTracker2" readout="TrackerHitsFieldDef" >
+            <comment>Boundary planes for magnetic field, also used as scoring planes</comment>
+            <module name="TestRunModuleFieldDef">
+                <box x="416.052" y="177.8" />
+                <module_component thickness="scoringThickness" material = "Vacuum" sensitive="true"/>
+            </module>            
+            <module name="TestRunModuleFieldDefFlare2">
+                <box x="416.052" y="177.8+(327.66-177.8)*(dipoleMagnetPositionZ+dipoleMagnetLength/2-913.378)/385.572" />
+                <module_component thickness="scoringThickness" material = "Vacuum" sensitive="true"/>
+            </module>            
+            <layer id="1">
+                <module_placement name="TestRunModuleFieldDef" id="0" x="dipoleMagnetPositionX" y="0" z="dipoleMagnetPositionZ-dipoleMagnetLength/2" rx="0" ry="0" rz="-PI/2"/>
+            </layer>
+            <layer id="2">
+                <module_placement name="TestRunModuleFieldDefFlare2" id="0" x="dipoleMagnetPositionX" y="0" z="dipoleMagnetPositionZ+dipoleMagnetLength/2" rx="0" ry="0" rz="-PI/2"/>
+            </layer>
+        </detector> 
 -->        
        
  <detector id="29" name="ECalScoring" type="HPSTracker2" readout="TrackerHitsECal" insideTrackingVolume="false">
@@ -864,9 +864,9 @@
     </fields>
 -->
 
-    <fields>
-        <field type="BoxDipole" name="AnalyzingDipole" x="dipoleMagnetPositionX" y="0*cm" z="dipoleMagnetPositionZ" dx="dipoleMagnetWidth/2.0" dy="dipoleMagnetHeight/2.0" dz="dipoleMagnetLength/2.0" bx="0.0" by="constBFieldY" bz="0.0" />
-    </fields>
+    <fields>
+        <field type="BoxDipole" name="AnalyzingDipole" x="dipoleMagnetPositionX" y="0*cm" z="dipoleMagnetPositionZ" dx="dipoleMagnetWidth/2.0" dy="dipoleMagnetHeight/2.0" dz="dipoleMagnetLength/2.0" bx="0.0" by="constBFieldY" bz="0.0" />
+    </fields>
 
     <includes>
         <gdmlFile file="gdml/ecal_vacuum_flange_complete_v1.gdml" />

Modified: java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-2mm-v4-4/HPS-PhysicsRun2016-2mm-v4-4.lcdd
 =============================================================================
--- java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-2mm-v4-4/HPS-PhysicsRun2016-2mm-v4-4.lcdd	(original)
+++ java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-2mm-v4-4/HPS-PhysicsRun2016-2mm-v4-4.lcdd	Tue Feb 16 13:35:43 2016
@@ -8335,7 +8335,7 @@
     </setup>
   </gdml>
   <fields>
-    <box_dipole name="AnalyzingDipole" lunit="mm" funit="tesla" x="21.17" y="0.0" z="457.2" dx="500.0" dy="500.0" dz="540.0" bx="0.0" by="-0.5" bz="0.0" />
+    <box_dipole name="AnalyzingDipole" lunit="mm" funit="tesla" x="21.17" y="0.0" z="457.2" dx="500.0" dy="500.0" dz="540.0" bx="0.0" by="-0.524" bz="0.0" />
   </fields>
 </lcdd>
 

Modified: java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-2mm-v4-4/compact.xml
 =============================================================================
--- java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-2mm-v4-4/compact.xml	(original)
+++ java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-2mm-v4-4/compact.xml	Tue Feb 16 13:35:43 2016
@@ -33,7 +33,7 @@
         <constant name="dipoleMagnetHeight" value="100*cm" />
         <constant name="dipoleMagnetWidth" value="100*cm" />
         <constant name="dipoleMagnetLength" value="108*cm" />
-        <constant name="constBFieldY" value="-0.5" />
+        <constant name="constBFieldY" value="-0.524" />
          
         
         <!-- ECAL crystal dimensions -->
@@ -91,17 +91,17 @@
         <constant name="z02b" value="0+157.5+3.685" />
 
         <!-- Global Millepede tweak parameters (survey constraints)-->
-        <!--
-        <constant name="dOmega_top" value="1.56e-5" />
-        <constant name="dLambda_top" value="0.16e-3" />
-        <constant name="dPhi_top" value="6.87e-3" />
-        <constant name="dD0_top" value="-0.72" />
-        <constant name="dZ0_top" value="-0.13" />
-        <constant name="dOmega_bot" value="2.32e-5" />
-        <constant name="dLambda_bot" value="-0.06e-3" />
-        <constant name="dPhi_bot" value="17.92e-3" />
-        <constant name="dD0_bot" value="-6.71" />
-        <constant name="dZ0_bot" value="0.04" />
+        <!--
+        <constant name="dOmega_top" value="1.56e-5" />
+        <constant name="dLambda_top" value="0.16e-3" />
+        <constant name="dPhi_top" value="6.87e-3" />
+        <constant name="dD0_top" value="-0.72" />
+        <constant name="dZ0_top" value="-0.13" />
+        <constant name="dOmega_bot" value="2.32e-5" />
+        <constant name="dLambda_bot" value="-0.06e-3" />
+        <constant name="dPhi_bot" value="17.92e-3" />
+        <constant name="dD0_bot" value="-6.71" />
+        <constant name="dZ0_bot" value="0.04" />
                                 -->
 
         <!-- Global Millepede tweak parameters (mixed constraints: FEE momentum set at 1.05 GeV, top and bottom must agree on d0 and z0)-->
@@ -117,17 +117,17 @@
         <constant name="dZ0_bot" value="0.116788238356" />
         
         <!-- Global Millepede tweak parameters (external constraints)-->
-        <!--
-        <constant name="dOmega_top" value="0.1e-5" />
-        <constant name="dLambda_top" value="0.5e-3" />
-        <constant name="dPhi_top" value="1.5e-3" />
-        <constant name="dD0_top" value="0.8" />
-        <constant name="dZ0_top" value="-0.15" />
-        <constant name="dOmega_bot" value="2.4e-5" />
-        <constant name="dLambda_bot" value="1.5e-3" />
-        <constant name="dPhi_bot" value="17e-3" />
-        <constant name="dD0_bot" value="-5.6" />
-        <constant name="dZ0_bot" value="0.2" />
+        <!--
+        <constant name="dOmega_top" value="0.1e-5" />
+        <constant name="dLambda_top" value="0.5e-3" />
+        <constant name="dPhi_top" value="1.5e-3" />
+        <constant name="dD0_top" value="0.8" />
+        <constant name="dZ0_top" value="-0.15" />
+        <constant name="dOmega_bot" value="2.4e-5" />
+        <constant name="dLambda_bot" value="1.5e-3" />
+        <constant name="dPhi_bot" value="17e-3" />
+        <constant name="dD0_bot" value="-5.6" />
+        <constant name="dZ0_bot" value="0.2" />
                                 -->
 
     </define>
@@ -781,24 +781,24 @@
         </millepede_constants>
     </detector>   
       
-<!-- 
- <detector id="30" name="TrackerFieldDef" type="HPSTracker2" readout="TrackerHitsFieldDef" >
-            <comment>Boundary planes for magnetic field, also used as scoring planes</comment>
-            <module name="TestRunModuleFieldDef">
-                <box x="416.052" y="177.8" />
-                <module_component thickness="scoringThickness" material = "Vacuum" sensitive="true"/>
-            </module>            
-            <module name="TestRunModuleFieldDefFlare2">
-                <box x="416.052" y="177.8+(327.66-177.8)*(dipoleMagnetPositionZ+dipoleMagnetLength/2-913.378)/385.572" />
-                <module_component thickness="scoringThickness" material = "Vacuum" sensitive="true"/>
-            </module>            
-            <layer id="1">
-                <module_placement name="TestRunModuleFieldDef" id="0" x="dipoleMagnetPositionX" y="0" z="dipoleMagnetPositionZ-dipoleMagnetLength/2" rx="0" ry="0" rz="-PI/2"/>
-            </layer>
-            <layer id="2">
-                <module_placement name="TestRunModuleFieldDefFlare2" id="0" x="dipoleMagnetPositionX" y="0" z="dipoleMagnetPositionZ+dipoleMagnetLength/2" rx="0" ry="0" rz="-PI/2"/>
-            </layer>
-        </detector> 
+<!-- 
+ <detector id="30" name="TrackerFieldDef" type="HPSTracker2" readout="TrackerHitsFieldDef" >
+            <comment>Boundary planes for magnetic field, also used as scoring planes</comment>
+            <module name="TestRunModuleFieldDef">
+                <box x="416.052" y="177.8" />
+                <module_component thickness="scoringThickness" material = "Vacuum" sensitive="true"/>
+            </module>            
+            <module name="TestRunModuleFieldDefFlare2">
+                <box x="416.052" y="177.8+(327.66-177.8)*(dipoleMagnetPositionZ+dipoleMagnetLength/2-913.378)/385.572" />
+                <module_component thickness="scoringThickness" material = "Vacuum" sensitive="true"/>
+            </module>            
+            <layer id="1">
+                <module_placement name="TestRunModuleFieldDef" id="0" x="dipoleMagnetPositionX" y="0" z="dipoleMagnetPositionZ-dipoleMagnetLength/2" rx="0" ry="0" rz="-PI/2"/>
+            </layer>
+            <layer id="2">
+                <module_placement name="TestRunModuleFieldDefFlare2" id="0" x="dipoleMagnetPositionX" y="0" z="dipoleMagnetPositionZ+dipoleMagnetLength/2" rx="0" ry="0" rz="-PI/2"/>
+            </layer>
+        </detector> 
 -->        
        
  <detector id="29" name="ECalScoring" type="HPSTracker2" readout="TrackerHitsECal" insideTrackingVolume="false">
@@ -864,9 +864,9 @@
     </fields>
 -->
 
-    <fields>
-        <field type="BoxDipole" name="AnalyzingDipole" x="dipoleMagnetPositionX" y="0*cm" z="dipoleMagnetPositionZ" dx="dipoleMagnetWidth/2.0" dy="dipoleMagnetHeight/2.0" dz="dipoleMagnetLength/2.0" bx="0.0" by="constBFieldY" bz="0.0" />
-    </fields>
+    <fields>
+        <field type="BoxDipole" name="AnalyzingDipole" x="dipoleMagnetPositionX" y="0*cm" z="dipoleMagnetPositionZ" dx="dipoleMagnetWidth/2.0" dy="dipoleMagnetHeight/2.0" dz="dipoleMagnetLength/2.0" bx="0.0" by="constBFieldY" bz="0.0" />
+    </fields>
 
     <includes>
         <gdmlFile file="gdml/ecal_vacuum_flange_complete_v1.gdml" />

Modified: java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-3mm-v4-4/HPS-PhysicsRun2016-3mm-v4-4.lcdd
 =============================================================================
--- java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-3mm-v4-4/HPS-PhysicsRun2016-3mm-v4-4.lcdd	(original)
+++ java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-3mm-v4-4/HPS-PhysicsRun2016-3mm-v4-4.lcdd	Tue Feb 16 13:35:43 2016
@@ -8335,7 +8335,7 @@
     </setup>
   </gdml>
   <fields>
-    <box_dipole name="AnalyzingDipole" lunit="mm" funit="tesla" x="21.17" y="0.0" z="457.2" dx="500.0" dy="500.0" dz="540.0" bx="0.0" by="-0.5" bz="0.0" />
+    <box_dipole name="AnalyzingDipole" lunit="mm" funit="tesla" x="21.17" y="0.0" z="457.2" dx="500.0" dy="500.0" dz="540.0" bx="0.0" by="-0.524" bz="0.0" />
   </fields>
 </lcdd>
 

Modified: java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-3mm-v4-4/compact.xml
 =============================================================================
--- java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-3mm-v4-4/compact.xml	(original)
+++ java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-3mm-v4-4/compact.xml	Tue Feb 16 13:35:43 2016
@@ -33,7 +33,7 @@
         <constant name="dipoleMagnetHeight" value="100*cm" />
         <constant name="dipoleMagnetWidth" value="100*cm" />
         <constant name="dipoleMagnetLength" value="108*cm" />
-        <constant name="constBFieldY" value="-0.5" />
+        <constant name="constBFieldY" value="-0.524" />
          
         
         <!-- ECAL crystal dimensions -->
@@ -91,17 +91,17 @@
         <constant name="z02b" value="0+157.5+3.685" />
 
         <!-- Global Millepede tweak parameters (survey constraints)-->
-        <!--
-        <constant name="dOmega_top" value="1.56e-5" />
-        <constant name="dLambda_top" value="0.16e-3" />
-        <constant name="dPhi_top" value="6.87e-3" />
-        <constant name="dD0_top" value="-0.72" />
-        <constant name="dZ0_top" value="-0.13" />
-        <constant name="dOmega_bot" value="2.32e-5" />
-        <constant name="dLambda_bot" value="-0.06e-3" />
-        <constant name="dPhi_bot" value="17.92e-3" />
-        <constant name="dD0_bot" value="-6.71" />
-        <constant name="dZ0_bot" value="0.04" />
+        <!--
+        <constant name="dOmega_top" value="1.56e-5" />
+        <constant name="dLambda_top" value="0.16e-3" />
+        <constant name="dPhi_top" value="6.87e-3" />
+        <constant name="dD0_top" value="-0.72" />
+        <constant name="dZ0_top" value="-0.13" />
+        <constant name="dOmega_bot" value="2.32e-5" />
+        <constant name="dLambda_bot" value="-0.06e-3" />
+        <constant name="dPhi_bot" value="17.92e-3" />
+        <constant name="dD0_bot" value="-6.71" />
+        <constant name="dZ0_bot" value="0.04" />
                                 -->
 
         <!-- Global Millepede tweak parameters (mixed constraints: FEE momentum set at 1.05 GeV, top and bottom must agree on d0 and z0)-->
@@ -117,17 +117,17 @@
         <constant name="dZ0_bot" value="0.116788238356" />
         
         <!-- Global Millepede tweak parameters (external constraints)-->
-        <!--
-        <constant name="dOmega_top" value="0.1e-5" />
-        <constant name="dLambda_top" value="0.5e-3" />
-        <constant name="dPhi_top" value="1.5e-3" />
-        <constant name="dD0_top" value="0.8" />
-        <constant name="dZ0_top" value="-0.15" />
-        <constant name="dOmega_bot" value="2.4e-5" />
-        <constant name="dLambda_bot" value="1.5e-3" />
-        <constant name="dPhi_bot" value="17e-3" />
-        <constant name="dD0_bot" value="-5.6" />
-        <constant name="dZ0_bot" value="0.2" />
+        <!--
+        <constant name="dOmega_top" value="0.1e-5" />
+        <constant name="dLambda_top" value="0.5e-3" />
+        <constant name="dPhi_top" value="1.5e-3" />
+        <constant name="dD0_top" value="0.8" />
+        <constant name="dZ0_top" value="-0.15" />
+        <constant name="dOmega_bot" value="2.4e-5" />
+        <constant name="dLambda_bot" value="1.5e-3" />
+        <constant name="dPhi_bot" value="17e-3" />
+        <constant name="dD0_bot" value="-5.6" />
+        <constant name="dZ0_bot" value="0.2" />
                                 -->
 
     </define>
@@ -781,24 +781,24 @@
         </millepede_constants>
     </detector>   
       
-<!-- 
- <detector id="30" name="TrackerFieldDef" type="HPSTracker2" readout="TrackerHitsFieldDef" >
-            <comment>Boundary planes for magnetic field, also used as scoring planes</comment>
-            <module name="TestRunModuleFieldDef">
-                <box x="416.052" y="177.8" />
-                <module_component thickness="scoringThickness" material = "Vacuum" sensitive="true"/>
-            </module>            
-            <module name="TestRunModuleFieldDefFlare2">
-                <box x="416.052" y="177.8+(327.66-177.8)*(dipoleMagnetPositionZ+dipoleMagnetLength/2-913.378)/385.572" />
-                <module_component thickness="scoringThickness" material = "Vacuum" sensitive="true"/>
-            </module>            
-            <layer id="1">
-                <module_placement name="TestRunModuleFieldDef" id="0" x="dipoleMagnetPositionX" y="0" z="dipoleMagnetPositionZ-dipoleMagnetLength/2" rx="0" ry="0" rz="-PI/2"/>
-            </layer>
-            <layer id="2">
-                <module_placement name="TestRunModuleFieldDefFlare2" id="0" x="dipoleMagnetPositionX" y="0" z="dipoleMagnetPositionZ+dipoleMagnetLength/2" rx="0" ry="0" rz="-PI/2"/>
-            </layer>
-        </detector> 
+<!-- 
+ <detector id="30" name="TrackerFieldDef" type="HPSTracker2" readout="TrackerHitsFieldDef" >
+            <comment>Boundary planes for magnetic field, also used as scoring planes</comment>
+            <module name="TestRunModuleFieldDef">
+                <box x="416.052" y="177.8" />
+                <module_component thickness="scoringThickness" material = "Vacuum" sensitive="true"/>
+            </module>            
+            <module name="TestRunModuleFieldDefFlare2">
+                <box x="416.052" y="177.8+(327.66-177.8)*(dipoleMagnetPositionZ+dipoleMagnetLength/2-913.378)/385.572" />
+                <module_component thickness="scoringThickness" material = "Vacuum" sensitive="true"/>
+            </module>            
+            <layer id="1">
+                <module_placement name="TestRunModuleFieldDef" id="0" x="dipoleMagnetPositionX" y="0" z="dipoleMagnetPositionZ-dipoleMagnetLength/2" rx="0" ry="0" rz="-PI/2"/>
+            </layer>
+            <layer id="2">
+                <module_placement name="TestRunModuleFieldDefFlare2" id="0" x="dipoleMagnetPositionX" y="0" z="dipoleMagnetPositionZ+dipoleMagnetLength/2" rx="0" ry="0" rz="-PI/2"/>
+            </layer>
+        </detector> 
 -->        
        
  <detector id="29" name="ECalScoring" type="HPSTracker2" readout="TrackerHitsECal" insideTrackingVolume="false">
@@ -864,9 +864,9 @@
     </fields>
 -->
 
-    <fields>
-        <field type="BoxDipole" name="AnalyzingDipole" x="dipoleMagnetPositionX" y="0*cm" z="dipoleMagnetPositionZ" dx="dipoleMagnetWidth/2.0" dy="dipoleMagnetHeight/2.0" dz="dipoleMagnetLength/2.0" bx="0.0" by="constBFieldY" bz="0.0" />
-    </fields>
+    <fields>
+        <field type="BoxDipole" name="AnalyzingDipole" x="dipoleMagnetPositionX" y="0*cm" z="dipoleMagnetPositionZ" dx="dipoleMagnetWidth/2.0" dy="dipoleMagnetHeight/2.0" dz="dipoleMagnetLength/2.0" bx="0.0" by="constBFieldY" bz="0.0" />
+    </fields>
 
     <includes>
         <gdmlFile file="gdml/ecal_vacuum_flange_complete_v1.gdml" />

Modified: java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-4mm-v4-4/HPS-PhysicsRun2016-4mm-v4-4.lcdd
 =============================================================================
--- java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-4mm-v4-4/HPS-PhysicsRun2016-4mm-v4-4.lcdd	(original)
+++ java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-4mm-v4-4/HPS-PhysicsRun2016-4mm-v4-4.lcdd	Tue Feb 16 13:35:43 2016
@@ -8335,7 +8335,7 @@
     </setup>
   </gdml>
   <fields>
-    <box_dipole name="AnalyzingDipole" lunit="mm" funit="tesla" x="21.17" y="0.0" z="457.2" dx="500.0" dy="500.0" dz="540.0" bx="0.0" by="-0.5" bz="0.0" />
+    <box_dipole name="AnalyzingDipole" lunit="mm" funit="tesla" x="21.17" y="0.0" z="457.2" dx="500.0" dy="500.0" dz="540.0" bx="0.0" by="-0.524" bz="0.0" />
   </fields>
 </lcdd>
 

Modified: java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-4mm-v4-4/compact.xml
 =============================================================================
--- java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-4mm-v4-4/compact.xml	(original)
+++ java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-4mm-v4-4/compact.xml	Tue Feb 16 13:35:43 2016
@@ -33,7 +33,7 @@
         <constant name="dipoleMagnetHeight" value="100*cm" />
         <constant name="dipoleMagnetWidth" value="100*cm" />
         <constant name="dipoleMagnetLength" value="108*cm" />
-        <constant name="constBFieldY" value="-0.5" />
+        <constant name="constBFieldY" value="-0.524" />
          
         
         <!-- ECAL crystal dimensions -->
@@ -91,17 +91,17 @@
         <constant name="z02b" value="0+157.5+3.685" />
 
         <!-- Global Millepede tweak parameters (survey constraints)-->
-        <!--
-        <constant name="dOmega_top" value="1.56e-5" />
-        <constant name="dLambda_top" value="0.16e-3" />
-        <constant name="dPhi_top" value="6.87e-3" />
-        <constant name="dD0_top" value="-0.72" />
-        <constant name="dZ0_top" value="-0.13" />
-        <constant name="dOmega_bot" value="2.32e-5" />
-        <constant name="dLambda_bot" value="-0.06e-3" />
-        <constant name="dPhi_bot" value="17.92e-3" />
-        <constant name="dD0_bot" value="-6.71" />
-        <constant name="dZ0_bot" value="0.04" />
+        <!--
+        <constant name="dOmega_top" value="1.56e-5" />
+        <constant name="dLambda_top" value="0.16e-3" />
+        <constant name="dPhi_top" value="6.87e-3" />
+        <constant name="dD0_top" value="-0.72" />
+        <constant name="dZ0_top" value="-0.13" />
+        <constant name="dOmega_bot" value="2.32e-5" />
+        <constant name="dLambda_bot" value="-0.06e-3" />
+        <constant name="dPhi_bot" value="17.92e-3" />
+        <constant name="dD0_bot" value="-6.71" />
+        <constant name="dZ0_bot" value="0.04" />
                                 -->
 
         <!-- Global Millepede tweak parameters (mixed constraints: FEE momentum set at 1.05 GeV, top and bottom must agree on d0 and z0)-->
@@ -117,17 +117,17 @@
         <constant name="dZ0_bot" value="0.116788238356" />
         
         <!-- Global Millepede tweak parameters (external constraints)-->
-        <!--
-        <constant name="dOmega_top" value="0.1e-5" />
-        <constant name="dLambda_top" value="0.5e-3" />
-        <constant name="dPhi_top" value="1.5e-3" />
-        <constant name="dD0_top" value="0.8" />
-        <constant name="dZ0_top" value="-0.15" />
-        <constant name="dOmega_bot" value="2.4e-5" />
-        <constant name="dLambda_bot" value="1.5e-3" />
-        <constant name="dPhi_bot" value="17e-3" />
-        <constant name="dD0_bot" value="-5.6" />
-        <constant name="dZ0_bot" value="0.2" />
+        <!--
+        <constant name="dOmega_top" value="0.1e-5" />
+        <constant name="dLambda_top" value="0.5e-3" />
+        <constant name="dPhi_top" value="1.5e-3" />
+        <constant name="dD0_top" value="0.8" />
+        <constant name="dZ0_top" value="-0.15" />
+        <constant name="dOmega_bot" value="2.4e-5" />
+        <constant name="dLambda_bot" value="1.5e-3" />
+        <constant name="dPhi_bot" value="17e-3" />
+        <constant name="dD0_bot" value="-5.6" />
+        <constant name="dZ0_bot" value="0.2" />
                                 -->
 
     </define>
@@ -781,24 +781,24 @@
         </millepede_constants>
     </detector>   
       
-<!-- 
- <detector id="30" name="TrackerFieldDef" type="HPSTracker2" readout="TrackerHitsFieldDef" >
-            <comment>Boundary planes for magnetic field, also used as scoring planes</comment>
-            <module name="TestRunModuleFieldDef">
-                <box x="416.052" y="177.8" />
-                <module_component thickness="scoringThickness" material = "Vacuum" sensitive="true"/>
-            </module>            
-            <module name="TestRunModuleFieldDefFlare2">
-                <box x="416.052" y="177.8+(327.66-177.8)*(dipoleMagnetPositionZ+dipoleMagnetLength/2-913.378)/385.572" />
-                <module_component thickness="scoringThickness" material = "Vacuum" sensitive="true"/>
-            </module>            
-            <layer id="1">
-                <module_placement name="TestRunModuleFieldDef" id="0" x="dipoleMagnetPositionX" y="0" z="dipoleMagnetPositionZ-dipoleMagnetLength/2" rx="0" ry="0" rz="-PI/2"/>
-            </layer>
-            <layer id="2">
-                <module_placement name="TestRunModuleFieldDefFlare2" id="0" x="dipoleMagnetPositionX" y="0" z="dipoleMagnetPositionZ+dipoleMagnetLength/2" rx="0" ry="0" rz="-PI/2"/>
-            </layer>
-        </detector> 
+<!-- 
+ <detector id="30" name="TrackerFieldDef" type="HPSTracker2" readout="TrackerHitsFieldDef" >
+            <comment>Boundary planes for magnetic field, also used as scoring planes</comment>
+            <module name="TestRunModuleFieldDef">
+                <box x="416.052" y="177.8" />
+                <module_component thickness="scoringThickness" material = "Vacuum" sensitive="true"/>
+            </module>            
+            <module name="TestRunModuleFieldDefFlare2">
+                <box x="416.052" y="177.8+(327.66-177.8)*(dipoleMagnetPositionZ+dipoleMagnetLength/2-913.378)/385.572" />
+                <module_component thickness="scoringThickness" material = "Vacuum" sensitive="true"/>
+            </module>            
+            <layer id="1">
+                <module_placement name="TestRunModuleFieldDef" id="0" x="dipoleMagnetPositionX" y="0" z="dipoleMagnetPositionZ-dipoleMagnetLength/2" rx="0" ry="0" rz="-PI/2"/>
+            </layer>
+            <layer id="2">
+                <module_placement name="TestRunModuleFieldDefFlare2" id="0" x="dipoleMagnetPositionX" y="0" z="dipoleMagnetPositionZ+dipoleMagnetLength/2" rx="0" ry="0" rz="-PI/2"/>
+            </layer>
+        </detector> 
 -->        
        
  <detector id="29" name="ECalScoring" type="HPSTracker2" readout="TrackerHitsECal" insideTrackingVolume="false">
@@ -864,9 +864,9 @@
     </fields>
 -->
 
-    <fields>
-        <field type="BoxDipole" name="AnalyzingDipole" x="dipoleMagnetPositionX" y="0*cm" z="dipoleMagnetPositionZ" dx="dipoleMagnetWidth/2.0" dy="dipoleMagnetHeight/2.0" dz="dipoleMagnetLength/2.0" bx="0.0" by="constBFieldY" bz="0.0" />
-    </fields>
+    <fields>
+        <field type="BoxDipole" name="AnalyzingDipole" x="dipoleMagnetPositionX" y="0*cm" z="dipoleMagnetPositionZ" dx="dipoleMagnetWidth/2.0" dy="dipoleMagnetHeight/2.0" dz="dipoleMagnetLength/2.0" bx="0.0" by="constBFieldY" bz="0.0" />
+    </fields>
 
     <includes>
         <gdmlFile file="gdml/ecal_vacuum_flange_complete_v1.gdml" />

Modified: java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-Nominal-v4-4/HPS-PhysicsRun2016-Nominal-v4-4.lcdd
 =============================================================================
--- java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-Nominal-v4-4/HPS-PhysicsRun2016-Nominal-v4-4.lcdd	(original)
+++ java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-Nominal-v4-4/HPS-PhysicsRun2016-Nominal-v4-4.lcdd	Tue Feb 16 13:35:43 2016
@@ -8335,7 +8335,7 @@
     </setup>
   </gdml>
   <fields>
-    <box_dipole name="AnalyzingDipole" lunit="mm" funit="tesla" x="21.17" y="0.0" z="457.2" dx="500.0" dy="500.0" dz="540.0" bx="0.0" by="-0.5" bz="0.0" />
+    <box_dipole name="AnalyzingDipole" lunit="mm" funit="tesla" x="21.17" y="0.0" z="457.2" dx="500.0" dy="500.0" dz="540.0" bx="0.0" by="-0.524" bz="0.0" />
   </fields>
 </lcdd>
 

Modified: java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-Nominal-v4-4/compact.xml
 =============================================================================
--- java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-Nominal-v4-4/compact.xml	(original)
+++ java/branches/jeremy-dev/detector-data/detectors/HPS-PhysicsRun2016-Nominal-v4-4/compact.xml	Tue Feb 16 13:35:43 2016
@@ -33,7 +33,7 @@
         <constant name="dipoleMagnetHeight" value="100*cm" />
         <constant name="dipoleMagnetWidth" value="100*cm" />
         <constant name="dipoleMagnetLength" value="108*cm" />
-        <constant name="constBFieldY" value="-0.5" />
+        <constant name="constBFieldY" value="-0.524" />
          
         
         <!-- ECAL crystal dimensions -->
@@ -91,17 +91,17 @@
         <constant name="z02b" value="0+157.5+3.685" />
 
         <!-- Global Millepede tweak parameters (survey constraints)-->
-        <!--
-        <constant name="dOmega_top" value="1.56e-5" />
-        <constant name="dLambda_top" value="0.16e-3" />
-        <constant name="dPhi_top" value="6.87e-3" />
-        <constant name="dD0_top" value="-0.72" />
-        <constant name="dZ0_top" value="-0.13" />
-        <constant name="dOmega_bot" value="2.32e-5" />
-        <constant name="dLambda_bot" value="-0.06e-3" />
-        <constant name="dPhi_bot" value="17.92e-3" />
-        <constant name="dD0_bot" value="-6.71" />
-        <constant name="dZ0_bot" value="0.04" />
+        <!--
+        <constant name="dOmega_top" value="1.56e-5" />
+        <constant name="dLambda_top" value="0.16e-3" />
+        <constant name="dPhi_top" value="6.87e-3" />
+        <constant name="dD0_top" value="-0.72" />
+        <constant name="dZ0_top" value="-0.13" />
+        <constant name="dOmega_bot" value="2.32e-5" />
+        <constant name="dLambda_bot" value="-0.06e-3" />
+        <constant name="dPhi_bot" value="17.92e-3" />
+        <constant name="dD0_bot" value="-6.71" />
+        <constant name="dZ0_bot" value="0.04" />
                                 -->
 
         <!-- Global Millepede tweak parameters (mixed constraints: FEE momentum set at 1.05 GeV, top and bottom must agree on d0 and z0)-->
@@ -117,17 +117,17 @@
         <constant name="dZ0_bot" value="0.116788238356" />
         
         <!-- Global Millepede tweak parameters (external constraints)-->
-        <!--
-        <constant name="dOmega_top" value="0.1e-5" />
-        <constant name="dLambda_top" value="0.5e-3" />
-        <constant name="dPhi_top" value="1.5e-3" />
-        <constant name="dD0_top" value="0.8" />
-        <constant name="dZ0_top" value="-0.15" />
-        <constant name="dOmega_bot" value="2.4e-5" />
-        <constant name="dLambda_bot" value="1.5e-3" />
-        <constant name="dPhi_bot" value="17e-3" />
-        <constant name="dD0_bot" value="-5.6" />
-        <constant name="dZ0_bot" value="0.2" />
+        <!--
+        <constant name="dOmega_top" value="0.1e-5" />
+        <constant name="dLambda_top" value="0.5e-3" />
+        <constant name="dPhi_top" value="1.5e-3" />
+        <constant name="dD0_top" value="0.8" />
+        <constant name="dZ0_top" value="-0.15" />
+        <constant name="dOmega_bot" value="2.4e-5" />
+        <constant name="dLambda_bot" value="1.5e-3" />
+        <constant name="dPhi_bot" value="17e-3" />
+        <constant name="dD0_bot" value="-5.6" />
+        <constant name="dZ0_bot" value="0.2" />
                                 -->
 
     </define>
@@ -781,24 +781,24 @@
         </millepede_constants>
     </detector>   
       
-<!-- 
- <detector id="30" name="TrackerFieldDef" type="HPSTracker2" readout="TrackerHitsFieldDef" >
-            <comment>Boundary planes for magnetic field, also used as scoring planes</comment>
-            <module name="TestRunModuleFieldDef">
-                <box x="416.052" y="177.8" />
-                <module_component thickness="scoringThickness" material = "Vacuum" sensitive="true"/>
-            </module>            
-            <module name="TestRunModuleFieldDefFlare2">
-                <box x="416.052" y="177.8+(327.66-177.8)*(dipoleMagnetPositionZ+dipoleMagnetLength/2-913.378)/385.572" />
-                <module_component thickness="scoringThickness" material = "Vacuum" sensitive="true"/>
-            </module>            
-            <layer id="1">
-                <module_placement name="TestRunModuleFieldDef" id="0" x="dipoleMagnetPositionX" y="0" z="dipoleMagnetPositionZ-dipoleMagnetLength/2" rx="0" ry="0" rz="-PI/2"/>
-            </layer>
-            <layer id="2">
-                <module_placement name="TestRunModuleFieldDefFlare2" id="0" x="dipoleMagnetPositionX" y="0" z="dipoleMagnetPositionZ+dipoleMagnetLength/2" rx="0" ry="0" rz="-PI/2"/>
-            </layer>
-        </detector> 
+<!-- 
+ <detector id="30" name="TrackerFieldDef" type="HPSTracker2" readout="TrackerHitsFieldDef" >
+            <comment>Boundary planes for magnetic field, also used as scoring planes</comment>
+            <module name="TestRunModuleFieldDef">
+                <box x="416.052" y="177.8" />
+                <module_component thickness="scoringThickness" material = "Vacuum" sensitive="true"/>
+            </module>            
+            <module name="TestRunModuleFieldDefFlare2">
+                <box x="416.052" y="177.8+(327.66-177.8)*(dipoleMagnetPositionZ+dipoleMagnetLength/2-913.378)/385.572" />
+                <module_component thickness="scoringThickness" material = "Vacuum" sensitive="true"/>
+            </module>            
+            <layer id="1">
+                <module_placement name="TestRunModuleFieldDef" id="0" x="dipoleMagnetPositionX" y="0" z="dipoleMagnetPositionZ-dipoleMagnetLength/2" rx="0" ry="0" rz="-PI/2"/>
+            </layer>
+            <layer id="2">
+                <module_placement name="TestRunModuleFieldDefFlare2" id="0" x="dipoleMagnetPositionX" y="0" z="dipoleMagnetPositionZ+dipoleMagnetLength/2" rx="0" ry="0" rz="-PI/2"/>
+            </layer>
+        </detector> 
 -->        
        
  <detector id="29" name="ECalScoring" type="HPSTracker2" readout="TrackerHitsECal" insideTrackingVolume="false">
@@ -864,9 +864,9 @@
     </fields>
 -->
 
-    <fields>
-        <field type="BoxDipole" name="AnalyzingDipole" x="dipoleMagnetPositionX" y="0*cm" z="dipoleMagnetPositionZ" dx="dipoleMagnetWidth/2.0" dy="dipoleMagnetHeight/2.0" dz="dipoleMagnetLength/2.0" bx="0.0" by="constBFieldY" bz="0.0" />
-    </fields>
+    <fields>
+        <field type="BoxDipole" name="AnalyzingDipole" x="dipoleMagnetPositionX" y="0*cm" z="dipoleMagnetPositionZ" dx="dipoleMagnetWidth/2.0" dy="dipoleMagnetHeight/2.0" dz="dipoleMagnetLength/2.0" bx="0.0" by="constBFieldY" bz="0.0" />
+    </fields>
 
     <includes>
         <gdmlFile file="gdml/ecal_vacuum_flange_complete_v1.gdml" />

Modified: java/branches/jeremy-dev/evio/src/main/java/org/hps/evio/AbstractSvtEvioReader.java
 =============================================================================
--- java/branches/jeremy-dev/evio/src/main/java/org/hps/evio/AbstractSvtEvioReader.java	(original)
+++ java/branches/jeremy-dev/evio/src/main/java/org/hps/evio/AbstractSvtEvioReader.java	Tue Feb 16 13:35:43 2016
@@ -232,7 +232,11 @@
                 SvtHeaderDataInfo headerData = this.extractSvtHeader(dataBank.getHeader().getNumber(), data);
                 
                 // Check that the multisample count is consistent
-                this.checkSvtSampleCount(sampleCount, headerData);
+                try {
+                    this.checkSvtSampleCount(sampleCount, headerData);
+                }  catch(final SvtEvioHeaderException e) {
+                    LOGGER.warning("Caught SVT exception:" + e.getMessage());
+                }
                 
                 // Add header to list
                 headers.add(headerData);
@@ -344,7 +348,7 @@
      */
     protected void checkSvtSampleCount(int sampleCount, SvtHeaderDataInfo headerData) throws SvtEvioHeaderException {
         if( sampleCount != SvtEvioUtils.getSvtTailMultisampleCount(headerData.getTail())*4)
-            throw new SvtEvioHeaderException("multisample count is not consistent with bank size.");
+            throw new SvtEvioHeaderException("ROC " + headerData.getNum() + " multisample count " + sampleCount + " is not consistent with bank size " + SvtEvioUtils.getSvtTailMultisampleCount(headerData.getTail()));
     }
     
     /**

Modified: java/branches/jeremy-dev/evio/src/main/java/org/hps/evio/AugmentedSvtEvioReader.java
 =============================================================================
--- java/branches/jeremy-dev/evio/src/main/java/org/hps/evio/AugmentedSvtEvioReader.java	(original)
+++ java/branches/jeremy-dev/evio/src/main/java/org/hps/evio/AugmentedSvtEvioReader.java	Tue Feb 16 13:35:43 2016
@@ -32,7 +32,10 @@
     
     @Override
     protected void processSvtHeaders(List<SvtHeaderDataInfo> headers, EventHeader lcsimEvent) throws SvtEvioHeaderException {
-    
+
+
+        LOGGER.finest("Process " + headers.size() + " SVT headers for run " + lcsimEvent.getRunNumber() + " and event " + lcsimEvent.getEventNumber());
+        
         // Check that the SVT header data is valid
         // Catch the exceptions locally, add stuff to the event, then throw it again
         // and handle it outside
@@ -43,6 +46,8 @@
 
         if( !exceptions.isEmpty() ) {
 
+            LOGGER.finest("Found " + exceptions.size() + " " + SvtEvioHeaderException.class.getSimpleName() + " exceptions");
+            
             // print some debug info 
             
             List<String> exceptionNames = SvtEventHeaderChecker.getSvtEvioHeaderExceptionNames(exceptions);
@@ -68,8 +73,14 @@
                 throw new SvtEvioHeaderException(exceptions.get(0));
             
         } else { 
+            
+            LOGGER.finest("No " + SvtEvioHeaderException.class.getSimpleName() + " exceptions found for this event");
+            
             // add skimming flag - the header is OK since I would never get here otherwise
             SvtEventFlagger.voidAddHeaderCheckResultToMetaData(true, lcsimEvent);
+            
+            
+            
         }
 
         // Add SVT header data to the event

Modified: java/branches/jeremy-dev/integration-tests/pom.xml
 =============================================================================
--- java/branches/jeremy-dev/integration-tests/pom.xml	(original)
+++ java/branches/jeremy-dev/integration-tests/pom.xml	Tue Feb 16 13:35:43 2016
@@ -87,28 +87,5 @@
                 </plugins>
             </build>
         </profile> 
-        <!-- This profile activates automatically when not running tests on a SLAC Unix system with NFS access. -->
-        <profile>
-            <id>no-slac-nfs</id>
-            <activation>
-                <activeByDefault>false</activeByDefault>
-                <file>
-                    <missing>/nfs/slac/g/hps/</missing>
-                </file>
-            </activation>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-surefire-plugin</artifactId>
-                        <configuration>
-                            <excludes>                           
-                                <exclude>org/hps/test/it/EvioToLcioTest.java</exclude> 
-                            </excludes>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>        
-        </profile>  
     </profiles>    
 </project>

Modified: java/branches/jeremy-dev/integration-tests/src/test/java/org/hps/test/it/EvioToLcioTest.java
 =============================================================================
--- java/branches/jeremy-dev/integration-tests/src/test/java/org/hps/test/it/EvioToLcioTest.java	(original)
+++ java/branches/jeremy-dev/integration-tests/src/test/java/org/hps/test/it/EvioToLcioTest.java	Tue Feb 16 13:35:43 2016
@@ -1,5 +1,6 @@
 package org.hps.test.it;
 
+import java.io.File;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.logging.Level;
@@ -7,8 +8,8 @@
 
 import junit.framework.TestCase;
 
+import org.hps.data.test.TestDataUtility;
 import org.hps.evio.EvioToLcio;
-import org.hps.record.epics.EpicsData;
 import org.hps.record.scalers.ScalerData;
 import org.hps.test.util.TestOutputFile;
 import org.lcsim.event.EventHeader;
@@ -20,16 +21,6 @@
 /**
  * Basic test of converting EVIO to LCIO using the {@link org.hps.evio.EvioToLcio} command line utility on Engineering
  * Run 2015 data.
- * <p>
- * This test checks the LCIO output for the:</br>
- * <ul>
- * <li>correct number of EPICS data collections</li>
- * <li>correct number of scaler data collections</li>
- * <li>all expected event collections</li>
- * <li>scaler parameters in event header</li>
- * </ul>
- * <p>
- * The test input is the first file of run 5772 in which scaler data appears around every 100k events.
  *
  * @author Jeremy McCormick, SLAC
  */
@@ -45,12 +36,7 @@
          * Map to keep track of number of events with empty collections.
          */
         Map<String, Integer> emptyCollections = new HashMap<String, Integer>();
-
-        /**
-         * Number of EPICS data collections found.
-         */
-        int epicsDataCount = 0;
-
+       
         /**
          * Number of events processed.
          */
@@ -60,6 +46,12 @@
          * Number of scaler data collections found.
          */
         int scalerDataCount = 0;
+        
+        CheckDriver() {
+            for (String collectionName : COLLECTION_NAMES) {
+                emptyCollections.put(collectionName, new Integer(0));
+            }
+        }
 
         /**
          * Check a collection by making sure it is present in the event and incrementing a counter if it is empty.
@@ -72,13 +64,9 @@
             if (!event.hasCollection(type, name)) {
                 throw new RuntimeException("Missing " + name + " collection.");
             }
+            Integer nEmpty = emptyCollections.get(name);
             if (event.get(type, name).isEmpty()) {
-                Integer nEmpty = emptyCollections.get(name);
-                if (nEmpty == null) {
-                    nEmpty = 0;
-                }
                 ++nEmpty;
-                // System.out.println(name + " is empty in event " + event.getEventNumber());
                 emptyCollections.put(name, nEmpty);
             }
         }
@@ -88,17 +76,7 @@
                 this.checkCollection(event, COLLECTION_TYPES[i], COLLECTION_NAMES[i]);
             }
         }
-
-        private void checkEpicsData(final EventHeader event) {
-            final EpicsData epicsData = EpicsData.read(event);
-            if (epicsData != null) {
-                if (epicsData.getEpicsHeader() == null) {
-                    throw new RuntimeException("The EpicsData header is null.");
-                }
-                ++epicsDataCount;
-            }
-        }
-
+ 
         private void checkScalarData(final EventHeader event) {
             final ScalerData scalerData = ScalerData.read(event);
             if (scalerData != null) {
@@ -113,10 +91,7 @@
          */
         @Override
         public void process(final EventHeader event) {
-
-            // Find and check EPICS data.
-            this.checkEpicsData(event);
-
+          
             // Find scaler data.
             this.checkScalarData(event);
 
@@ -128,41 +103,34 @@
     }
 
     /**
-     * The number of empty collections that are allowed.
-     */
-    private static int[] ALLOWED_EMPTY = new int[] {45, 0, 0, 0};
-
-    /**
      * Names of collections to check.
      */
-    private static String[] COLLECTION_NAMES = new String[] {"EcalReadoutHits", "FADCGenericHits", "SVTRawTrackerHits",
-            "TriggerBank"};
+    private static String[] COLLECTION_NAMES = new String[] {
+        "EcalReadoutHits", 
+        "FADCGenericHits", 
+        "SVTRawTrackerHits",
+        "TriggerBank"
+    };
 
     /**
      * Classes of collections.
      */
-    private static Class<?>[] COLLECTION_TYPES = new Class<?>[] {RawTrackerHit.class, GenericObject.class,
-            RawTrackerHit.class, GenericObject.class};
-
-    /**
-     * The number of EPICS collections that should be found.
-     */
-    private static int EPICS_DATA_COUNT = 7;
-
-    /**
-     * The default input file (large file at SLAC so the pom.xml file excludes this test on non-SLAC hosts).
-     */
-    private static final String INPUT_FILE = "/nfs/slac/g/hps3/data/engrun2015/evio/hps_005772.evio.0";
+    private static Class<?>[] COLLECTION_TYPES = new Class<?>[] {
+        RawTrackerHit.class, 
+        GenericObject.class,
+        RawTrackerHit.class, 
+        GenericObject.class
+    };
 
     /**
      * The number of events that should be processed.
      */
-    private static int PROCESSED_COUNT = 251823;
+    private static int PROCESSED_COUNT = 1000;
 
     /**
      * The number of scaler data collections that should be found.
      */
-    private static int SCALER_DATA_COUNT = 3;
+    private static int SCALER_DATA_COUNT = 1;
    
     /**
      * Run the test.
@@ -171,13 +139,15 @@
      */
     public void testEvioToLcio() throws Exception {
 
+        final File inputFile = new TestDataUtility().getTestData("run5772_integrationTest.evio");
+        
         // LCIO output file.
         final TestOutputFile outputFile = new TestOutputFile(EvioToLcioTest.class, "hps_005772.slcio");
 
         // Run the command line utility.
         final String[] args = new String[] {"-l", outputFile.getPath(), "-d", "HPS-EngRun2015-Nominal-v1", "-r", "-x", 
-                "/org/hps/steering/EventMarker.lcsim", INPUT_FILE};
-        System.out.println("Running EvioToLcio on " + INPUT_FILE);
+                "/org/hps/steering/EventMarker.lcsim", inputFile.getAbsolutePath()};
+        System.out.println("Running EvioToLcio on " + inputFile.getPath());
         Logger.getLogger("org.hps.evio").setLevel(Level.WARNING);
         System.out.println("org.hps.evio logging level is " + Logger.getLogger("org.hps.evio").getLevel());
         EvioToLcio cnv = new EvioToLcio();
@@ -188,9 +158,6 @@
         System.out.println("Done running EvioToLcio!");
         System.out.println("conversion to LCIO took " + elapsed + " ms");
         
-        // Check that the conversion did not take too long.
-        //assertTrue("Conversion from EVIO to LCIO took too long.", elapsed < 2000000);
-
         // Read in the LCIO file and run the CheckDriver on it.
         System.out.println("Checking LCIO output ...");
         final LCSimLoop loop = new LCSimLoop();
@@ -209,22 +176,15 @@
         System.out.println("CheckDriver processed " + checkDriver.processedCount + " events.");
         assertEquals("Wrong number of events processed by the check Driver.", PROCESSED_COUNT, checkDriver.processedCount);
 
-        // Check that the correct number of EPICS data collections were written out.
-        System.out.println("Found " + checkDriver.epicsDataCount + " events with EPICS data.");
-        assertTrue("EPICS data count is wrong.", checkDriver.epicsDataCount == EPICS_DATA_COUNT);
-
         // Check that the correct number of scaler data collections were written out.
         System.out.println("Found " + checkDriver.scalerDataCount + " events with scaler data.");
         assertTrue("Scaler data count is wrong.", checkDriver.scalerDataCount == SCALER_DATA_COUNT);
-
-        // Check that there were not too many empty collections.  
+        
+        // Check that there were no empty output collections.
         for (int i = 0; i < COLLECTION_NAMES.length; i++) {
             final String collection = COLLECTION_NAMES[i];
             final Integer nEmpty = checkDriver.emptyCollections.get(collection);
-            if (nEmpty != null) {
-                System.out.println(collection + " had " + nEmpty + " empty collections.");
-                assertTrue(collection + " had too many empty collections.", nEmpty <= ALLOWED_EMPTY[i]);
-            }
+            assertTrue("Collection " + collection + " was empty.", nEmpty == 0);
         }
     }
 }

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 Feb 16 13:35:43 2016
@@ -52,7 +52,6 @@
     //static {
     //    hep.aida.jfree.AnalysisFactory.register();
     //}
-
     // Plotting
     private static ITree tree = null;
     private IAnalysisFactory analysisFactory = AIDA.defaultInstance().analysisFactory();
@@ -76,8 +75,6 @@
     private String triggerBankCollectionName = "TriggerBank";
     private String stripClusterCollectionName = "StripClusterer_SiTrackerHitStrip1D";
 
-    String rootFile = null;
-
     private int maxSamplePosition = -1;
     private int timeWindowWeight = 1;
     private int eventCount = 0;
@@ -109,7 +106,9 @@
     private boolean enableClusterTimeCuts = true;
     private double clusterTimeCutMax = 4.0;
     private double clusterTimeCutMin = -4.0;
-    
+
+    private boolean saveRootFile = true;
+
     public SensorOccupancyPlotsDriver() {
         maxSampleStatus = new SystemStatusImpl(Subsystem.SVT, "Checks that SVT is timed in (max sample plot)", true);
         maxSampleStatus.setStatus(StatusCode.UNKNOWN, "Status is unknown.");
@@ -195,6 +194,10 @@
 
     public void setMaxPeakOccupancy(double maxPeakOccupancy) {
         this.maxPeakOccupancy = maxPeakOccupancy;
+    }
+
+    public void setSaveRootFile(boolean saveRootFile) {
+        this.saveRootFile = saveRootFile;
     }
 
     /**
@@ -405,7 +408,7 @@
                 plotters.get("Occupancy vs Position").region(SvtPlotUtils.computePlotterRegion(sensor))
                         .plot(positionPlots.get(sensor.getName()), this.createOccupancyPlotStyle("Distance from Beam [mm]", sensor, false));
                 plotters.get("Cluster occupancy vs Position").region(SvtPlotUtils.computePlotterRegion(sensor))
-                .plot(clusterPositionPlots.get(sensor.getName()), this.createOccupancyPlotStyle("Distance from Beam [mm]", sensor, false));
+                        .plot(clusterPositionPlots.get(sensor.getName()), this.createOccupancyPlotStyle("Distance from Beam [mm]", sensor, false));
             }
             occupancyMap.put(sensor.getName(), new int[640]);
 
@@ -521,22 +524,22 @@
                 maxSamplePositionPlots.get(((HpsSiSensor) rawHit.getDetectorElement()).getName()).fill(maxSamplePositionFound);
             }
         }
-        
+
         // Fill the strip cluster counts if available
-        if(event.hasCollection(SiTrackerHitStrip1D.class, stripClusterCollectionName)) {
+        if (event.hasCollection(SiTrackerHitStrip1D.class, stripClusterCollectionName)) {
             List<SiTrackerHitStrip1D> stripHits1D = event.get(SiTrackerHitStrip1D.class, stripClusterCollectionName);
-            for(SiTrackerHitStrip1D h : stripHits1D) {
+            for (SiTrackerHitStrip1D h : stripHits1D) {
                 SiTrackerHitStrip1D global = h.getTransformedHit(TrackerHitType.CoordinateSystem.GLOBAL);
                 Hep3Vector pos_global = global.getPositionAsVector();
-                if(enableClusterTimeCuts) {
-                    if( h.getTime() < clusterTimeCutMax && h.getTime() > clusterTimeCutMin) 
+                if (enableClusterTimeCuts) {
+                    if (h.getTime() < clusterTimeCutMax && h.getTime() > clusterTimeCutMin) {
                         clusterPositionPlotCounts.get(((HpsSiSensor) h.getRawHits().get(0).getDetectorElement()).getName()).fill(pos_global.y());
-                } else
+                    }
+                } else {
                     clusterPositionPlotCounts.get(((HpsSiSensor) h.getRawHits().get(0).getDetectorElement()).getName()).fill(pos_global.y());
-            }
-        }
-        
-        
+                }
+            }
+        }
 
         if (enableMaxSamplePlots && eventCount > maxSampleMonitorStart && eventCount % maxSampleMonitorPeriod == 0) {
             checkMaxSample();
@@ -564,17 +567,17 @@
                         positionPlots.get(sensor.getName()).fill(stripPosition, stripOccupancy);
                     }
                 }
-                if(enablePositionPlots) {
+                if (enablePositionPlots) {
                     clusterPositionPlots.get(sensor.getName()).reset();
                     IHistogram1D h = clusterPositionPlotCounts.get(sensor.getName());
-                    for(int bin=0; bin<h.axis().bins(); ++bin) {
+                    for (int bin = 0; bin < h.axis().bins(); ++bin) {
                         int y = h.binEntries(bin);
                         double stripClusterOccupancy = (double) y / (double) eventCount;
                         double x = h.axis().binCenter(bin);
-                        clusterPositionPlots.get(sensor.getName()).fill(x,stripClusterOccupancy);
+                        clusterPositionPlots.get(sensor.getName()).fill(x, stripClusterOccupancy);
                     }
                 }
-                
+
             }
         }
 
@@ -705,14 +708,16 @@
     @Override
     public void endOfData() {
 
-        rootFile = "run" + runNumber + "_occupancy.root";
-        RootFileStore store = new RootFileStore(rootFile);
-        try {
-            store.open();
-            store.add(tree);
-            store.close();
-        } catch (IOException e) {
-            e.printStackTrace();
+        if (saveRootFile) {
+            String rootFile = "run" + runNumber + "_occupancy.root";
+            RootFileStore store = new RootFileStore(rootFile);
+            try {
+                store.open();
+                store.add(tree);
+                store.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
         }
 
         System.out.println("%===============================================================================%");

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 Feb 16 13:35:43 2016
@@ -56,11 +56,15 @@
     private static Map<String, IHistogram1D> singleHitClusterChargePlots = new HashMap<String, IHistogram1D>();
     private static Map<String, IHistogram1D> clusterTimePlots = new HashMap<String, IHistogram1D>();
     private static Map<String, IHistogram2D> hitTimeTrigTimePlots = new HashMap<String, IHistogram2D>();
-    private static IHistogram1D[] hitTimeTrigTimePlots1D = new IHistogram1D[6];
+    private static IHistogram1D[][] hitTimeTrigTimePlots1D = new IHistogram1D[6][2];
+    private static IHistogram2D[][] hitTimeTrigTimePlots2D = new IHistogram2D[6][2];
+
+    private static final int TOP = 0;
+    private static final int BOTTOM = 1;
 
     private List<HpsSiSensor> sensors;
-    private Map<RawTrackerHit, FittedRawTrackerHit> fittedRawTrackerHitMap
-            = new HashMap<RawTrackerHit, FittedRawTrackerHit>();
+//    private Map<RawTrackerHit, FittedRawTrackerHit> fittedRawTrackerHitMap
+//            = new HashMap<RawTrackerHit, FittedRawTrackerHit>();
 
     // Detector name
     private static final String SUBDETECTOR_NAME = "Tracker";
@@ -71,10 +75,16 @@
 
     private int runNumber = -1;
 
+    private boolean saveRootFile = true;
+
     private boolean dropSmallHitEvents = true;
 
     public void setDropSmallHitEvents(boolean dropSmallHitEvents) {
         this.dropSmallHitEvents = dropSmallHitEvents;
+    }
+
+    public void setSaveRootFile(boolean saveRootFile) {
+        this.saveRootFile = saveRootFile;
     }
 
     private int computePlotterRegion(HpsSiSensor sensor) {
@@ -85,20 +95,17 @@
             } else {
                 return 6 * (sensor.getLayerNumber() - 1) + 1;
             }
-        } else {
-
-            if (sensor.isTopLayer()) {
-                if (sensor.getSide() == HpsSiSensor.POSITRON_SIDE) {
-                    return 6 * (sensor.getLayerNumber() - 7) + 2;
-                } else {
-                    return 6 * (sensor.getLayerNumber() - 7) + 3;
-                }
-            } else if (sensor.isBottomLayer()) {
-                if (sensor.getSide() == HpsSiSensor.POSITRON_SIDE) {
-                    return 6 * (sensor.getLayerNumber() - 7) + 4;
-                } else {
-                    return 6 * (sensor.getLayerNumber() - 7) + 5;
-                }
+        } else if (sensor.isTopLayer()) {
+            if (sensor.getSide() == HpsSiSensor.POSITRON_SIDE) {
+                return 6 * (sensor.getLayerNumber() - 7) + 2;
+            } else {
+                return 6 * (sensor.getLayerNumber() - 7) + 3;
+            }
+        } else if (sensor.isBottomLayer()) {
+            if (sensor.getSide() == HpsSiSensor.POSITRON_SIDE) {
+                return 6 * (sensor.getLayerNumber() - 7) + 4;
+            } else {
+                return 6 * (sensor.getLayerNumber() - 7) + 5;
             }
         }
         return -1;
@@ -159,8 +166,7 @@
     private void resetPlots() {
 
         // Clear the fitted raw hit map of old values
-        fittedRawTrackerHitMap.clear();
-
+//        fittedRawTrackerHitMap.clear();
         // Since all plots are mapped to the name of a sensor, loop 
         // through the sensors, get the corresponding plots and clear them.
         for (HpsSiSensor sensor : sensors) {
@@ -172,34 +178,40 @@
         for (IHistogram2D histogram : hitTimeTrigTimePlots.values()) {
             histogram.reset();
         }
-    }
-
-    /**
-     * Method that creates a map between a fitted raw hit and it's corresponding
-     * raw fit
-     *
-     * @param fittedHits : List of fitted hits to map
-     */
-    private void mapFittedRawHits(List<FittedRawTrackerHit> fittedHits) {
-
-        // Clear the fitted raw hit map of old values
-        fittedRawTrackerHitMap.clear();
-
-        // Loop through all fitted hits and map them to their corresponding raw hits
-        for (FittedRawTrackerHit fittedHit : fittedHits) {
-            fittedRawTrackerHitMap.put(fittedHit.getRawTrackerHit(), fittedHit);
-        }
-    }
-
-    /**
-     *
-     * @param rawHit
-     * @return
-     */
-    private FittedRawTrackerHit getFittedHit(RawTrackerHit rawHit) {
-        return fittedRawTrackerHitMap.get(rawHit);
-    }
-
+
+        for (int i = 0; i < 6; i++) {
+            for (int j = 0; j < 2; j++) {
+                hitTimeTrigTimePlots1D[i][j].reset();
+                hitTimeTrigTimePlots2D[i][j].reset();
+            }
+        }
+    }
+
+//    /**
+//     * Method that creates a map between a fitted raw hit and it's corresponding
+//     * raw fit
+//     *
+//     * @param fittedHits : List of fitted hits to map
+//     */
+//    private void mapFittedRawHits(List<FittedRawTrackerHit> fittedHits) {
+//
+//        // Clear the fitted raw hit map of old values
+//        fittedRawTrackerHitMap.clear();
+//
+//        // Loop through all fitted hits and map them to their corresponding raw hits
+//        for (FittedRawTrackerHit fittedHit : fittedHits) {
+//            fittedRawTrackerHitMap.put(fittedHit.getRawTrackerHit(), fittedHit);
+//        }
+//    }
+//
+//    /**
+//     *
+//     * @param rawHit
+//     * @return
+//     */
+//    private FittedRawTrackerHit getFittedHit(RawTrackerHit rawHit) {
+//        return fittedRawTrackerHitMap.get(rawHit);
+//    }
     protected void detectorChanged(Detector detector) {
 
         // Get the HpsSiSensor objects from the geometry
@@ -237,7 +249,7 @@
                     .plot(singleHitClusterChargePlots.get(sensor.getName()), this.createStyle(null, "Cluster Amplitude [ADC Counts]", ""));
 
             clusterTimePlots.put(sensor.getName(),
-                    histogramFactory.createHistogram1D(sensor.getName() + " - Cluster Time", 100, -50, 50));
+                    histogramFactory.createHistogram1D(sensor.getName() + " - Cluster Time", 100, -75, 50));
             plotters.get("Cluster Time").region(this.computePlotterRegion(sensor))
                     .plot(clusterTimePlots.get(sensor.getName()), this.createStyle(null, "Cluster Time [ns]", ""));
         }
@@ -246,18 +258,25 @@
         plotters.get("SVT-trigger timing top-bottom").createRegions(1, 2);
 
         hitTimeTrigTimePlots.put("Top",
-                histogramFactory.createHistogram2D("Top Cluster Time vs. Trigger Phase", 100, -50, 50, 6, 0, 24));
+                histogramFactory.createHistogram2D("Top Cluster Time vs. Trigger Phase", 100, -75, 50, 6, 0, 24));
         plotters.get("SVT-trigger timing top-bottom").region(0).plot(hitTimeTrigTimePlots.get("Top"), this.createStyle(null, "Cluster Time [ns]", "Trigger Phase[ns]"));
         hitTimeTrigTimePlots.put("Bottom",
-                histogramFactory.createHistogram2D("Bottom Cluster Time vs. Trigger Phase", 100, -50, 50, 6, 0, 24));
+                histogramFactory.createHistogram2D("Bottom Cluster Time vs. Trigger Phase", 100, -75, 50, 6, 0, 24));
         plotters.get("SVT-trigger timing top-bottom").region(1).plot(hitTimeTrigTimePlots.get("Bottom"), this.createStyle(null, "Cluster Time [ns]", "Trigger Phase[ns]"));
 
         plotters.put("SVT-trigger timing by phase", plotterFactory.create("SVT-trigger timing by phase"));
-        plotters.get("SVT-trigger timing by phase").createRegions(1, 6);
+        plotters.get("SVT-trigger timing by phase").createRegions(2, 6);
+
+        plotters.put("SVT-trigger timing and amplitude by phase", plotterFactory.create("SVT-trigger timing and amplitude by phase"));
+        plotters.get("SVT-trigger timing and amplitude by phase").createRegions(2, 6);
 
         for (int i = 0; i < 6; i++) {
-            hitTimeTrigTimePlots1D[i] = histogramFactory.createHistogram1D("Cluster Time for Phase " + i, 100, -50, 50);
-            plotters.get("SVT-trigger timing by phase").region(i).plot(hitTimeTrigTimePlots1D[i], this.createStyle(null, "Cluster Time [ns]", ""));
+            for (int j = 0; j < 2; j++) {
+                hitTimeTrigTimePlots1D[i][j] = histogramFactory.createHistogram1D(String.format("Cluster Time for Phase %d, %s", i, j == TOP ? "Top" : "Bottom"), 100, -75, 50);
+                plotters.get("SVT-trigger timing by phase").region(i + 6 * j).plot(hitTimeTrigTimePlots1D[i][j], this.createStyle(null, "Cluster Time [ns]", ""));
+                hitTimeTrigTimePlots2D[i][j] = histogramFactory.createHistogram2D(String.format("Cluster Amplitude vs. Time for Phase %d, %s", i, j == TOP ? "Top" : "Bottom"), 100, -75, 50, 100, 0, 5000.0);
+                plotters.get("SVT-trigger timing and amplitude by phase").region(i + 6 * j).plot(hitTimeTrigTimePlots2D[i][j], this.createStyle(null, "Cluster Time [ns]", "Cluster Amplitude [ADC Counts]"));
+            }
         }
 
         for (IPlotter plotter : plotters.values()) {
@@ -278,17 +297,15 @@
             runNumber = event.getRunNumber();
         }
 
-        // If the event doesn't contain fitted raw hits, skip it
-        if (!event.hasCollection(FittedRawTrackerHit.class, fittedHitsCollectionName)) {
-            return;
-        }
-
-        // Get the list of fitted hits from the event
-        List<FittedRawTrackerHit> fittedHits = event.get(FittedRawTrackerHit.class, fittedHitsCollectionName);
-
-        // Map the fitted hits to their corresponding raw hits
-        this.mapFittedRawHits(fittedHits);
-
+//        // If the event doesn't contain fitted raw hits, skip it
+//        if (!event.hasCollection(FittedRawTrackerHit.class, fittedHitsCollectionName)) {
+//            return;
+//        }
+//         Get the list of fitted hits from the event
+//        List<FittedRawTrackerHit> fittedHits = event.get(FittedRawTrackerHit.class, fittedHitsCollectionName);
+//
+//        // Map the fitted hits to their corresponding raw hits
+//        this.mapFittedRawHits(fittedHits);
         // If the event doesn't contain any clusters, skip it
         if (!event.hasCollection(SiTrackerHitStrip1D.class, clusterCollectionName)) {
             return;
@@ -319,26 +336,29 @@
             }
 
             clusterTimePlots.get(sensor.getName()).fill(cluster.getTime());
-            hitTimeTrigTimePlots1D[(int) ((event.getTimeStamp() / 4) % 6)].fill(cluster.getTime());
             if (sensor.isTopLayer()) {
+                hitTimeTrigTimePlots1D[(int) ((event.getTimeStamp() / 4) % 6)][TOP].fill(cluster.getTime());
+                hitTimeTrigTimePlots2D[(int) ((event.getTimeStamp() / 4) % 6)][TOP].fill(cluster.getTime(), cluster.getdEdx() / DopedSilicon.ENERGY_EHPAIR);
                 hitTimeTrigTimePlots.get("Top").fill(cluster.getTime(), event.getTimeStamp() % 24);
             } else {
+                hitTimeTrigTimePlots1D[(int) ((event.getTimeStamp() / 4) % 6)][BOTTOM].fill(cluster.getTime());
+                hitTimeTrigTimePlots2D[(int) ((event.getTimeStamp() / 4) % 6)][BOTTOM].fill(cluster.getTime(), cluster.getdEdx() / DopedSilicon.ENERGY_EHPAIR);
                 hitTimeTrigTimePlots.get("Bottom").fill(cluster.getTime(), event.getTimeStamp() % 24);
             }
         }
     }
 
     public void endOfData() {
-
-        String rootFile = "run" + runNumber + "_cluster_analysis.root";
-        RootFileStore store = new RootFileStore(rootFile);
-        try {
-            store.open();
-            store.add(tree);
-            store.close();
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-    }
-
+        if (saveRootFile) {
+            String rootFile = "run" + runNumber + "_cluster_analysis.root";
+            RootFileStore store = new RootFileStore(rootFile);
+            try {
+                store.open();
+                store.add(tree);
+                store.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
 }

Modified: java/branches/jeremy-dev/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalLedSequenceMonitor.java
 =============================================================================
--- java/branches/jeremy-dev/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalLedSequenceMonitor.java	(original)
+++ java/branches/jeremy-dev/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalLedSequenceMonitor.java	Tue Feb 16 13:35:43 2016
@@ -58,852 +58,836 @@
  */
 public class EcalLedSequenceMonitor extends Driver{
 
-    private static final int NUM_CHANNELS = 11 * 47;
-    private static final String dbTag = "led";
-    private static final String dbTableName = "ecal_led_calibrations";
-    private static final int runNumberMax = 9999;
-    private static final int nDrivers = 8;
-    private static final int nSteps = 100; //should be 56 but here is to avoid seg fault
-    
-   
-
-    String inputCollectionRaw = "EcalReadoutHits";
-    String inputCollection = "EcalCalHits";	
-    AIDA aida;
-
-    DatabaseConditionsManager conditionsManager;
-
-    private EcalChannelCollection ChannelCollection;	
-    private EcalLedCollection LedCollection;
-    private EcalConditions ecalConditions;
-
-    Map < Integer,Integer > LedTopMap; //chid (conditions) --> LED id
-    Map < Integer,Integer > LedBotMap; //chid (conditions) --> LED id 
-
-    Map < Integer,Integer > LedTopMapInverted; //LED id --> chid (conditions)
-    Map < Integer,Integer > LedBotMapInverted; //LED id  --> chid (conditions)
-
-    private boolean useRawEnergy=false;
-
-    String outFileName;
-
-
-    private int runNumber = 0;	
-    private int eventN    = 0;
-    private int id,row,column,chid,ledId,driverId;
-    private  int[][] expectedSequence = new int[][]{ /*A.C. it is a terrible thing to have this hard-coded here!*/
-            //first 4 are the flasher1 sequence, TOP controller 
-            {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,-1,-1},
-            {56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111},
-            {112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,-1}, //missing 135 is ok
-            {168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223},
-            //second 4 are the flasher2 sequence, BOTTOM controller 
-            {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,-1,-1},	
-            {56,57,58,59,60,61,62,63,64,65,66,67,68,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,-1}, //missing 69 is OK
-            {112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167},	
-            {168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223},
-    };
-    private int[][] actualSequence=new int[nDrivers][nSteps];
-
-    private int[] iStep = new int[nDrivers];
-    private int[] nEvents = new int[NUM_CHANNELS];
-    private double[] mMean = new double[NUM_CHANNELS];
-    private double[] mRMS = new double[NUM_CHANNELS];
-
-    private int nEventsMin=200;
-    private int nMinChannelsWithEvents=350; 
-    private double energy,fillEnergy,fillTime;
-    private double energyCut=2; //we expect very high energy from the LEDs..
-    private double skipInitial=0.05;
-    private double skipMin=0.3;
-    private long cellID;
-
-
-
-
-    //Histograms-functions-ntuples
-    private ArrayList<ITuple> iTuple;
-
-    private IFunction  fFunction,fFunction1;
-    private IProfile1D   cProfile;
-    private IHistogram2D			hMeanCharge2D;
-    private ArrayList<IHistogram1D> hCharge;
-    private ArrayList<IHistogram2D> hChargeVsEvn;
-    private IPlotterFactory factory;
-    private IPlotter pPlotter=null;
-    private IPlotter pPlotter2=null;
-    private IPlotterStyle style ;
-    private int[] fitStatus = new int[NUM_CHANNELS];
-
-    private boolean doFullAnalysis=false;
-    private boolean isMonitoringApp=false; 
-    private boolean saveTuple=false; 
-
-    private double[] fPars;    
-    private double[] fPrevPars;
-    private double[] fParErrs;
-    private String[] fParNames; 
-
-
-    private double fEvnMinDraw=0.;
-    private double fEvnMaxDraw=80000.;
-    private double fChargeMinDraw=0.;
-    private double fChargeMaxDraw=100.;
-
-    /*Components for user interaction*/
-    private JDialog dialog;
-    private JLabel  label;
-    private JFrame frame;
-    private JPanel panel;
-    String  labelString;
-    private JButton okButtonRed,okButtonBlue,cancelButton;
-    private int m_iteration=0;
-    private LedColor m_ret=LedColor.UNKNOWN; //use UNKNONW as CANCEL button
-    static Object modalMonitor = new Object();
-
-    public void setUseRawEnergy(boolean useRawEnergy) {
-        this.useRawEnergy=useRawEnergy;
-    }
-
-    public void setEnergyCut(double energyCut) {
-        this.energyCut=energyCut;
-    }
-    public void setSkipInitial(double skipInitial) {
-        this.skipInitial=skipInitial;
-    }
-    public void setSkipMin(double skipMin) {
-        this.skipMin=skipMin;
-    }
-
-    public void setEvnMinDraw(double evnMinDraw){
-        this.fEvnMinDraw=evnMinDraw;
-    }
-    public void setEvnMaxDraw(double evnMaxDraw){
-        this.fEvnMaxDraw=evnMaxDraw;
-    }
-    public void setChargeMinDraw(double chargeMinDraw){
-        this.fChargeMinDraw=chargeMinDraw;
-    }
-    public void setChargeMaxDraw(double chargeMaxDraw){
-        this.fChargeMaxDraw=chargeMaxDraw;
-    }
-
-    public void setNEventsMin(int nEeventsMin){
-        this.nEventsMin=nEventsMin;
-    }
-
-    public void setIsMonitoringApp(boolean app){
-        this.isMonitoringApp=app;
-    }
-
-    public void setDoFullAnalysis(boolean fullAnalysis){
-        this.doFullAnalysis=fullAnalysis;
-    }
-
-    public void setSaveTuple(boolean flag){
-        this.saveTuple=flag;
-    }
-
-    @Override
-    protected void detectorChanged(Detector detector) {
-        System.out.println("LedAnalysis::Detector changed was called");
-        System.out.println(fEvnMinDraw+" "+fEvnMaxDraw);
-        for (int ii=0;ii<nDrivers;ii++){
-            iStep[ii]=0;
-            // actualSequence[ii][iStep[ii]]=-1;
-        }
-
-        // Setup conditions
-
-        conditionsManager = DatabaseConditionsManager.getInstance();
-
-        LedTopMap = new HashMap< Integer , Integer >(); //key: ecal channel ID. Value:  led id
-        LedBotMap = new HashMap< Integer , Integer >();	
-
-        LedTopMapInverted = new HashMap< Integer , Integer >(); //key: led id. Value: ecal channel id
-        LedBotMapInverted = new HashMap< Integer , Integer >(); 
-
-
-        ChannelCollection = conditionsManager.getCachedConditions(EcalChannelCollection.class, "ecal_channels").getCachedData();	
-        LedCollection = conditionsManager.getCachedConditions(EcalLedCollection.class, "ecal_leds").getCachedData();
-        ecalConditions = conditionsManager.getEcalConditions();		
-
-        for (EcalChannel channel : ChannelCollection){
-            chid = channel.getChannelId();
-            for (EcalLed Led : LedCollection) {    	
-                if (Led.getEcalChannelId()==chid){
-                    if (channel.getY()>0){
-                        LedTopMap.put( chid , Led.getLedNumber() );
-                        LedTopMapInverted.put(  Led.getLedNumber(), chid  );
-                    }
-                    else if (channel.getY()<0){
-                        LedBotMap.put( chid , Led.getLedNumber() );
-                        LedBotMapInverted.put( Led.getLedNumber(), chid );                    
-                    }
-                }
-            }
-        }
-
-
-
-        // Setup plots
-        aida = AIDA.defaultInstance();
-        aida.tree().cd("/");
-        hMeanCharge2D = aida.histogram2D("Average LED response", 47, -23.5, 23.5, 11, -5.5, 5.5);
-
-        factory= aida.analysisFactory().createPlotterFactory("Ecal Led Sequence");
-        pPlotter= factory.create("Drivers");
-        pPlotter.createRegions(4,2);
-        if (isMonitoringApp){
-            pPlotter2=factory.create("Sequence Map");
-            pPlotter2.createRegions(1,1);
-            pPlotter2.region(0).plot(hMeanCharge2D);
-        }   
-        iTuple = new ArrayList<ITuple>(NUM_CHANNELS);   
-        hCharge = new ArrayList<IHistogram1D>(NUM_CHANNELS);
-        hChargeVsEvn = new ArrayList<IHistogram2D>(nDrivers);
-
-
-
-        //pPlotter2.region(0).plot(hMeanCharge2D);
-
-        for (int ii=0;ii<NUM_CHANNELS;ii++){
-            int row = EcalMonitoringUtilities.getRowFromHistoID(ii);
-            int column = EcalMonitoringUtilities.getColumnFromHistoID(ii);	    
-            iTuple.add(aida.analysisFactory().createTupleFactory(aida.tree()).create("nTuple"+ii,"nTuple"+ii,"int fEvn=0 , double fCharge=0.,double fTime=0.",""));
-        }
-
-        for (int ii=0;ii<nDrivers;ii++){
-            hChargeVsEvn.add(aida.histogram2D("Driver"+ii,100,fEvnMinDraw,fEvnMaxDraw,100,fChargeMinDraw,fChargeMaxDraw));
-            pPlotter.region(ii).plot( hChargeVsEvn.get(ii));
-        }
-
-        pPlotter.show();
-        if (isMonitoringApp) pPlotter2.show();
-
-    }		
-
-    @Override
-    public void process(EventHeader event) {
-        runNumber = event.getRunNumber();
-        eventN++;
-        if (event.hasCollection(CalorimeterHit.class, inputCollection)) {
-            //List<BaseRawCalorimeterHit> hits = event.get(BaseRawCalorimeterHit.class, inputCollectionRaw);
-            List<CalorimeterHit> hits = event.get(CalorimeterHit.class, inputCollection);
-            for (CalorimeterHit hit : hits) {
-
-                column = hit.getIdentifierFieldValue("ix");
-                row = hit.getIdentifierFieldValue("iy");
-                id = EcalMonitoringUtilities.getHistoIDFromRowColumn(row, column);
-                cellID=hit.getCellID();        
-                chid = ChannelCollection.findGeometric(cellID).getChannelId();
-
-                energy = hit.getCorrectedEnergy();
-                
-                if (useRawEnergy){
-                    fillEnergy = getRawADCSum(energy,cellID);
-                }
-                else {
-                    fillEnergy = energy;
-                }
-                fillTime = hit.getTime();
-
-
-                //find the LED
-                if (row>0){
-                    ledId=LedTopMap.get(chid);
-                }
-                else if (row<0){
-                    ledId=LedBotMap.get(chid);
-                }
-                driverId=getDriver(ledId);
-                if (row<0) driverId+=4;
-
-
-
-                /*Skip the events under thr*/
-                if (energy<energyCut) continue;
-                
-                /*First, check if this led is the one in the NEXT step. Therefore, increment by 1 the step*/
-                if (iStep[driverId]==0){
-                    actualSequence[driverId][iStep[driverId]]=ledId;
-                    iStep[driverId]=1;                  
-                }
-                else if ((iStep[driverId]==1)&&(ledId!=actualSequence[driverId][0])){              
-                    System.out.println("LedAnalysis:: increment step ("+iStep[driverId]+") for driver "+driverId+" . Led ID: "+ledId+" Column: "+column+" Row: "+row);                 
-                    if (iStep[driverId]>0) drawProfiles(actualSequence[driverId][iStep[driverId]-1],driverId); 
-                    actualSequence[driverId][iStep[driverId]]=ledId;
-                    iStep[driverId]++;
-                }
-                else if ((iStep[driverId]>1)&&(ledId!=actualSequence[driverId][iStep[driverId]-1])&&(ledId!=actualSequence[driverId][iStep[driverId]-2])){
-                    System.out.println("LedAnalysis:: increment step ("+iStep[driverId]+") for driver "+driverId+" . Led ID: "+ledId+" Column: "+column+" Row: "+row);                 
-                    if (iStep[driverId]>0) drawProfiles(actualSequence[driverId][iStep[driverId]-1],driverId); 
-                    actualSequence[driverId][iStep[driverId]]=ledId;
-                    iStep[driverId]++;
-                }
-
-
-
-
-
-
-                if (iStep[driverId]==-1) continue; /*Not yet data*/
-
-                /*Put this code here, since we want to always fill the ntuple*/
-                iTuple.get(id).fill(0,nEvents[id]);
-                iTuple.get(id).fill(1,fillEnergy);
-                iTuple.get(id).fill(2,fillTime);
-                iTuple.get(id).addRow();
-                nEvents[id]++;
-
-
-
-                /*Add a debug print */
-                if (eventN % 10000==0){
-                    System.out.println("Debug. Event "+eventN+" LED ID: "+ledId+" DRIVER ID: "+driverId+" ECAL ID: "+id+" ROW: "+row+" COLUMN: "+column+ "HISTO ID: "+id);
-                }
-            }
-            if (eventN % 10000==0){
-                System.out.println("\n");
-            }
-        }		
-    }
-
-    /*
-     * The endOfData() method analises each ntuple to find the LED response.
-     * We cannot simply fit a gaussian to the energy distribution, since there is a high-energy tail due to the LED being turned on:
-     * When the LED turns on, it is "cold", and emits more light. Immediately, it starts to heat, and due to temperature effects the
-     * emitted light is less. This is clearly visible if one plots the charge VS the event number: the trend is decreasing, toward a
-     * plateau, that corresponds to the value at thermal equilibrium.
-     * 
-     * For (few) channels, the first charge values are close to 0, then charge grows rapidly, then it returns back to the plateau.
-     * To handle these, I always cut the first 10% events
-     * To properly handle this:
-     * 
-     * 1) First create a profile histogram, charge VS event number.
-     * 2) Fit it with something like "A*exp(-event_number/N0)+C. The function does not need to be extra-accurate at this stage
-     * 3) Cut the events with event_number < 5*N0.
-     * 4) Fit the remaining events with a gaussian.
-     */
-    @Override
-    public void endOfData() {
-        System.out.println("LedAnalysis::end of data");
-        System.out.println("LedAnalysis:: nEventsMin is: "+nEventsMin);
-
-        double e,eMin,eMax;
-        double t;
-        int n,nBins,nFits,nSkip;
-
-        int row, column;
-
-        String hName; 
-        IFunctionFactory fFactory=aida.analysisFactory().createFunctionFactory(aida.tree());
-
-        IFitResult fResult;
-        IFitter	   fFitter;
-
-        for (int id = 0; id < 11 * 47; id++) {
-
-            eMin=9999;
-            eMax=-9999;
-            row = EcalMonitoringUtilities.getRowFromHistoID(id);
-            column = EcalMonitoringUtilities.getColumnFromHistoID(id);
-            System.out.println("");
-            System.out.println("Doing channel: X= "+column+" Y= "+row);
-            System.out.println("Number of entries in analysis ntuple: "+iTuple.get(id).rows());
-            System.out.println("Number of recognized events: "+nEvents[id]);
-            /*Create the profile. Create it for all the channels, to keep sync.*/
-            nBins=nEvents[id]/100;
-            if (nBins<=0) nBins=1;
-
-            /*Clear previous*/
-
-            if (id>0){
-                aida.tree().rm("strip");
-                aida.tree().rm("fun0");
-                aida.tree().rm("fun1");
-            }
-            /*Create the profile.*/
-            cProfile=aida.profile1D("strip",nBins,-0.5,nEvents[id]*(1-skipInitial)+0.5);
-            cProfile.reset();
-            /*Create the function for the profile fit and the gaus fit*/
-            fFunction=fFactory.createFunctionFromScript("fun0",1,"A*exp(-x[0]/tau)+B","A,tau,B","",null);
-            fFunction1=fFactory.createFunctionByName("fun1","G");
-
-            if (EcalMonitoringUtilities.isInHole(row,column)==true){
-                System.out.println("Channel X= "+column+" Y= "+row+" is in hole. Skip");
-                hCharge.add(aida.histogram1D("charge_"+id,200,0.,1.)); //create here the histogram to keep sync
-                System.out.println("In hole, skip");
-                continue;
-            }
-            else if (nEvents[id]<nEventsMin) {
-                hCharge.add(aida.histogram1D("charge_"+id,200,0.,1.)); //create here the histogram to keep sync
-                System.err.println("LedAnalysis:: the channel X= "+column+" Y= "+row+" has not enough events "+nEvents[id]+" "+nEventsMin);
-
-                continue;
-            }			  
-
-            //Fill the profile*/
-            nSkip=(int)(nEvents[id]*skipInitial);
-            if (nSkip>iTuple.get(id).rows()){
-                System.out.println("Can't skip initial events?");
-                nSkip=0;
-            }
-            iTuple.get(id).start();
-            iTuple.get(id).skip(nSkip); //This is the work-around for those channels with charge starting from 0 and rapidly growing//
-            n=0;
-            iTuple.get(id).next(); 
-            while ( iTuple.get(id).next() ){
-                e=iTuple.get(id).getDouble(1);
-                if (e<eMin) eMin=e;           			  
-                if (e>eMax) eMax=e;
-                cProfile.fill(1.*n,e);
-                n++;
-            }			
-            fFitter=aida.analysisFactory().createFitFactory().createFitter("chi2","","v");
-
-            if (doFullAnalysis){ 
-                //Init function parameters
-                double[] initialPars={eMax-eMin,nEvents[id]/10.,eMin};
-                if (initialPars[0]<0) initialPars[0]=0;
-                fFunction.setParameters(initialPars);
-
-                //Do the fit      
-                System.out.println("LedAnalysis:: do profile fit "+id+" "+fFitter.engineName()+" "+fFitter.fitMethodName());
-                System.out.println("LedAnalysis:: initial parameters "+initialPars[0]+" "+initialPars[1]+" "+initialPars[2]);
-                fResult=fFitter.fit(cProfile,fFunction);
-                fPars     = fResult.fittedParameters();
-                fParErrs  = fResult.errors();
-                fParNames = fResult.fittedParameterNames();			
-                System.out.println("LedAnalysis:: Status= "+fResult.fitStatus()+" "+fResult.isValid()+" Chi2 = "+fResult.quality()+" NDF: "+fResult.ndf());
-                for(int i=0; i< fResult.fittedFunction().numberOfParameters(); i++ ){
-                    System.out.println(fParNames[i]+" : "+fPars[i]+" +- "+fParErrs[i]);
-                }  
-                fFunction.setParameters(fPars);
-
-
-                //Do again the fit: it is a terrible work-around
-                nFits=0;
-                if (Double.isNaN(fParErrs[1])){
-                    fPars=fPrevPars;
-                }
-                while (Double.isNaN(fParErrs[1])){
-                    System.out.println("LedAnalysis:: redo fit");
-                    fFunction.setParameters(fPars);
-                    fResult=fFitter.fit(cProfile,fFunction);
-                    fPars     = fResult.fittedParameters();
-                    fParErrs  = fResult.errors();
-                    System.out.println("LedAnalysis:: Status= "+fResult.fitStatus()+" "+fResult.isValid()+" Chi2 = "+fResult.quality()+" NDF: "+fResult.ndf());
-                    for(int i=0; i< fResult.fittedFunction().numberOfParameters(); i++ ){
-                        System.out.println(fParNames[i]+" : "+fPars[i]+" +- "+fParErrs[i]);
-                    }  
-                    fFunction.setParameters(fPars);
-                    nFits++;
-                    if (nFits>=10){
-                        System.out.println("LedAnalysis:: Error, too many fits without convergence");
-                        break;
-                    }
-                }
-                fPrevPars=Arrays.copyOf(fPars,fPars.length);
-                System.out.println("LedAnalysis:: fit "+id+" done");  
-
-                //Now we have the tau parameter. Take ONLY the events that are with N>5*tau/
-                //As a cross-check, also verify that tau > Nevents/10, otherwise skip the first Nevents/2
-                //and emit warning
-                nSkip=(int)( fPars[1]*5);
-                if (nSkip < (nEvents[id]*skipMin)){
-                    System.out.println("LedAnalysis:: Skip number too low: "+nSkip+" Increment it to "+nEvents[id]/2);
-                    nSkip=(int)(nEvents[id]*skipMin);
-                }
-                if (nSkip > nEvents[id]){
-                    System.out.println("LedAnalysis:: Skip number too high, reduce it");
-                    nSkip=(int)(nEvents[id]*skipMin);
-                }
-
-            }
-            else{
-                nSkip=(int)(nEvents[id]*(skipMin+skipInitial));
-            }
-
-            System.out.println("LedAnalysis:: gaus fit :: Going to skip "+nSkip+" out of "+nEvents[id]);
-            System.out.println("eMin is: "+eMin+" eMax is: "+eMax);
-            hCharge.add(aida.histogram1D("charge_"+id,200,eMin*0.9,eMax*1.1));
-
-
-            iTuple.get(id).start();
-            iTuple.get(id).skip(nSkip); 
-            n=0;
-            while (iTuple.get(id).next()){
-                e=iTuple.get(id).getDouble(1);
-                t=iTuple.get(id).getDouble(2);
-                hCharge.get(id).fill(e);
-                n++;
-            }			
-
-            /*Finally do the fit with the gaussian*/
-            double[] initialPars1={hCharge.get(id).maxBinHeight(),hCharge.get(id).mean(),hCharge.get(id).rms()};
-
-            System.out.println("LedAnalysis:: Gaus fit");
-            System.out.println("LedAnalysis:: initial parameters "+initialPars1[0]+" "+initialPars1[1]+" "+initialPars1[2]);
-
-            fFunction1.setParameters(initialPars1);
-            fResult=fFitter.fit(hCharge.get(id),fFunction1);
-            fPars     = fResult.fittedParameters();
-            fParErrs  = fResult.errors();
-            fParNames = fResult.fittedParameterNames();			
-            System.out.println("Status= "+fResult.fitStatus()+" "+fResult.isValid()+" Chi2 = "+fResult.quality()+" NDF: "+fResult.ndf());
-            for(int i=0; i< fResult.fittedFunction().numberOfParameters(); i++ ){
-                System.out.println(fParNames[i]+" : "+fPars[i]+" +- "+fParErrs[i]);
-            }  
-            fFunction1.setParameters(fPars);
-            mMean[id]=fPars[1];
-            mRMS[id]=fPars[2];
-
-            hMeanCharge2D.fill(column,row,mMean[id]);
-            System.out.println("\n");
-        }//End loop on channels
-
-
-
-        if ((pPlotter2!=null)&&(isMonitoringApp)){
-            style = pPlotter2.region(0).style();
-            style.setParameter("hist2DStyle", "colorMap");
-            style.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
-            style.dataStyle().fillStyle().setParameter("showZeroHeightBins", Boolean.FALSE.toString()); 
-            pPlotter2.region(0).plot(hMeanCharge2D);
-            pPlotter2.region(0).refresh();
-        }
-        else{
-            IPlotterStyle pstyle =  aida.analysisFactory().createPlotterFactory().createPlotterStyle();
-            pPlotter2 = null;
-            pPlotter2 =  aida.analysisFactory().createPlotterFactory().create();
-            pstyle.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
-            pstyle.dataStyle().fillStyle().setParameter("showZeroHeightBins", Boolean.FALSE.toString());
-            pstyle.setParameter("hist2DStyle", "colorMap");
-            if (pPlotter2!=null){
-                pPlotter2.createRegion().plot(hMeanCharge2D,pstyle);
-                pPlotter2.show();
-            }
-        }
-
-        if (isMonitoringApp){
-            askUploadToDBDialog();
-            synchronized (modalMonitor) {
-                try{
-                    modalMonitor.wait(60000); //wait 1 minute for user interaction.
-                }
-                catch(InterruptedException excp){
-                    System.out.println("Got exception: "+excp);
-                }
-            }
-            if ((m_ret!=LedColor.UNKNOWN)){
-                if (m_ret==LedColor.BLUE)    System.out.println("OK, upload to DB BLUE");
-                else System.out.println("OK, upload to DB RED");
-                try {
-                    uploadToDB(m_ret);
-                } catch (SQLException | DatabaseObjectException | ConditionsObjectException error) {
-                    throw new RuntimeException("Error uploading to the database ", error);
-                }
-
-                System.out.println("Save an Elog too");
-                uploadToElog();
-            }
-            else{
-                System.out.println("Cancel pressed. Nothing to do");
-            }
-        }
-
-        /*Write a file with the LED values*/
-        try {
-            if (useRawEnergy){
-                outFileName=runNumber+".raw.txt";
-            }
-            else{
-                outFileName=runNumber+".energy.txt";
-            }
-            PrintWriter writer = new PrintWriter(outFileName, "UTF-8");
-
-
-            for (int id = 0; id < 11 * 47; id++) {
-
-                row = EcalMonitoringUtilities.getRowFromHistoID(id);
-                column = EcalMonitoringUtilities.getColumnFromHistoID(id);
-                if (EcalMonitoringUtilities.isInHole(row, column)) continue;
-                if ((row == 0) || (column == 0)) continue;
-
-                writer.print(column+" "+row+" "+" "+ mMean[id]+" "+mRMS[id]+"\r\n");
-
-            }
-            writer.close();
-
-        } 
-        catch (FileNotFoundException fnfe) {
-
-            System.out.println(fnfe.getMessage());
-
-        }
-
-        catch (IOException ioe) {
-
-            System.out.println(ioe.getMessage());
-
-        }
-
-
-        System.out.println("EcalLedSequenceMonitor endOfData clear histograms"); 
-        for(int ii = 0; ii < NUM_CHANNELS; ii++) {   	
-            row=EcalMonitoringUtilities.getRowFromHistoID(ii);
-            column = EcalMonitoringUtilities.getColumnFromHistoID(ii);      	  
-            hName="charge_"+ii;	 
-            try{
-                aida.tree().rm(hName);
-            }
-            catch(IllegalArgumentException ee){
-                System.out.println("Got exception "+ee);
-            }
-
-            if (!saveTuple||(isMonitoringApp)){
-                hName="nTuple"+ii;
-                try{
-                    aida.tree().rm(hName);
-                }
-                catch(IllegalArgumentException ee){
-                    System.out.println("Got exception "+ee);
-                }
-            }
-
-        }
-        System.out.println("EcalLedSequenceMonitor endOfData clear histograms done");   
-        System.out.println("endOfData end");
-        System.out.println("The program is not stucked. It is writing the output AIDA file, this takes time!");
-    }/*End endOfData*/
-
-
-    /**
-     * This function returns the driver number (from 0 to 3) given the LED id.
-     * @param led
-     * @return
-     */
-    public int getDriver(int led){
-        int ret=-1;	
-        if ((led>=2)&&(led<56)) ret=0;
-        else if ((led>=56)&&(led<112)) ret=1;
-        else if ((led>=112)&&(led<168)) ret=2;
-        else if ((led>=168)&&(led<224)) ret=3;
-        return ret;
-    }
-
-    /**
-     * Very simple method to retrieve the pedestal-subtracted raw Energy.
-     * If the gain changes (because we do a re-calibration), I do not want to include this in the LED analysis
-     * @param energy
-     * @param cellID
-     * @return
-     */
-    public double getRawADCSum(double energy,long cellID){
-        EcalChannelConstants channelData = ecalConditions.getChannelConstants(ecalConditions.getChannelCollection().findGeometric(cellID));
-        double RawSum=energy / EcalUtils.GeV;
-        double gain=channelData.getGain().getGain();
-        double ret=RawSum/gain;
-        //  System.out.println("A:C "+RawSum+" "+ret);
-        return ret;
-    }
-
-    private void uploadToDB(LedColor color) throws DatabaseObjectException, ConditionsObjectException, SQLException {
-        int x,y,id;
-        double mean,rms;
-        System.out.println(String.format("Uploading new led data to the database, runMin=%d, runMax=%d, tag=%s ....",
-                runNumber,runNumberMax,dbTag));
-        
-        conditionsManager = DatabaseConditionsManager.getInstance();
-        EcalLedCalibrationCollection led_calibrations =  new EcalLedCalibrationCollection();
-        led_calibrations.setConnection(conditionsManager.getConnection());
-
-        TableMetaData tableMetaData = conditionsManager.findTableMetaData(dbTableName);
-        led_calibrations.setTableMetaData(tableMetaData);
-
-        for (int cid = 1; cid <= 442; cid++) {/*This is a loop over the channel ID, as in the conditions system*/
-            EcalChannel cc = findChannel(cid);
-            x = cc.getX(); //This is the column
-            y = cc.getY(); //This is the row
-            id=EcalMonitoringUtilities.getHistoIDFromRowColumn(y,x);
-            mean=mMean[id];
-            rms=mRMS[id];
-            led_calibrations.add(new EcalLedCalibration(cid,mean,rms,color));
-        }
-
-        int collectionId = -1;
-
-        try {
-            collectionId = conditionsManager.getCollectionId(led_calibrations, "loaded by EcalLedSequenceMonitor");
-        } catch (Exception e) {
-            System.out.println("Got exception on uploadToDB "+ e);
-            throw new RuntimeException(e);
-        }
-        System.err.println("CollectionID:  "+collectionId);
-        led_calibrations.insert();
-        ConditionsRecord conditionsRecord = new ConditionsRecord(
-                led_calibrations.getCollectionId(), runNumber, runNumberMax, dbTableName, dbTableName, 
-                "Generated by LedAnalysis from Run #"+runNumber, dbTag);
-        conditionsRecord.setConnection(conditionsManager.getConnection());
-        tableMetaData = conditionsManager.findTableMetaData("conditions");
-        conditionsRecord.setTableMetaData(tableMetaData);
-        conditionsRecord.insert();
-
-        System.out.println("Upload to DB done");
-    }
-
-    private void uploadToElog(){
-        String path,exe,command,imgpath;
-        path="/home/hpsrun/LedSequenceData";
-        exe=path+"/doElog.csh";
-        imgpath=path+"/screenshots/"+runNumber+".png";
-
-        File f=new File(path);
-        if (!f.exists()){
-            System.err.println("LedMonitoringSequence:: wrong path");
-            return;
-        }
-        if (pPlotter2==null){
-            System.err.println("LedMonitoringSquence:: no plotter");
-            return;
-        }
-        try{
-            pPlotter2.writeToFile(imgpath);
-        }
-        catch(Exception e){
-            System.err.println("Exception "+e);
-        }
-        File f1=new File(exe);
-        if (!f1.exists()){
-            System.err.println("LedMonitoringSequence:: no script!");
-            return;
-        }   
-        command=exe+" "+imgpath;
-        try{
-            System.out.println("LedMonitoringSequence:: try this command: "+command);
-            Runtime.getRuntime().exec(command);
-        }
-        catch(Exception e){
-            System.err.println("Exception "+e);
-        }
-    }
-
-
-    private void drawProfiles(int ledID,int driverID){
-
-        int m_column,m_row,m_ledID,m_chID,m_ID,m_driverID;
-
-        m_ledID = ledID;
-        m_driverID = driverID;
-        m_chID = 0;
-
-
-        if (m_driverID<=3) m_chID = LedTopMapInverted.get(ledID);
-        else m_chID = LedBotMapInverted.get(ledID);
-
-        m_column=findChannel(m_chID).getX();
-        m_row=findChannel(m_chID).getY();
-        m_ID=EcalMonitoringUtilities.getHistoIDFromRowColumn(m_row, m_column);
-        /* 
+	private static final int NUM_CHANNELS = 11 * 47;
+	private static final String dbTag = "led";
+	private static final String dbTableName = "ecal_led_calibrations";
+	private static final int runNumberMax = 9999;
+	private static final int nDrivers = 8;
+	private static final int nSteps = 100; //should be 56 but here is to avoid seg fault
+
+
+
+	String inputCollectionRaw = "EcalReadoutHits";
+	String inputCollection = "EcalCalHits";	
+	AIDA aida;
+
+	DatabaseConditionsManager conditionsManager;
+
+	private EcalChannelCollection ChannelCollection;	
+	private EcalLedCollection LedCollection;
+	private EcalConditions ecalConditions;
+
+	Map < Integer,Integer > LedTopMap; //chid (conditions) --> LED id
+	Map < Integer,Integer > LedBotMap; //chid (conditions) --> LED id 
+
+	Map < Integer,Integer > LedTopMapInverted; //LED id --> chid (conditions)
+	Map < Integer,Integer > LedBotMapInverted; //LED id  --> chid (conditions)
+
+	private boolean useRawEnergy=false;
+
+	String outFileName;
+
+
+	private int runNumber = 0;	
+	private int eventN    = 0;
+	private int id,row,column,chid,ledId,driverId;
+	private  int[][] expectedSequence = new int[][]{ /*A.C. it is a terrible thing to have this hard-coded here!*/
+			//first 4 are the flasher1 sequence, TOP controller 
+			{2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,-1,-1},
+			{56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111},
+			{112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,-1}, //missing 135 is ok
+			{168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223},
+			//second 4 are the flasher2 sequence, BOTTOM controller 
+			{2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,-1,-1},	
+			{56,57,58,59,60,61,62,63,64,65,66,67,68,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,-1}, //missing 69 is OK
+			{112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167},	
+			{168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223},
+	};
+	private int[][] actualSequence=new int[nDrivers][nSteps];
+
+	private int[] iStep = new int[nDrivers];
+	private int[] nEvents = new int[NUM_CHANNELS];
+	private double[] mMean = new double[NUM_CHANNELS];
+	private double[] mRMS = new double[NUM_CHANNELS];
+
+	private int nEventsMin=200;
+	private int nMinChannelsWithEvents=350; 
+	private double energy,fillEnergy,fillTime;
+	private double energyCut=2; //we expect very high energy from the LEDs..
+	private double skipInitial=0.05;
+	private double skipMin=0.3;
+	private long cellID;
+
+
+
+
+	//Histograms-functions-ntuples
+	private ArrayList<ITuple> iTuple;
+
+	private IFunction  fFunction,fFunction1;
+	private IProfile1D   cProfile;
+	private IHistogram2D			hMeanCharge2D;
+	private ArrayList<IHistogram1D> hCharge;
+	private ArrayList<IHistogram2D> hChargeVsEvn;
+	private IPlotterFactory factory;
+	private IPlotter pPlotter=null;
+	private IPlotter pPlotter2=null;
+	private IPlotterStyle style ;
+	private int[] fitStatus = new int[NUM_CHANNELS];
+
+	private boolean doFullAnalysis=false;
+	private boolean isMonitoringApp=false; 
+	private boolean saveTuple=false; 
+
+	private double[] fPars;    
+	private double[] fPrevPars;
+	private double[] fParErrs;
+	private String[] fParNames; 
+
+
+	private double fEvnMinDraw=0.;
+	private double fEvnMaxDraw=80000.;
+	private double fChargeMinDraw=0.;
+	private double fChargeMaxDraw=100.;
+
+	/*Components for user interaction*/
+	private JDialog dialog;
+	private JLabel  label;
+	private JFrame frame;
+	private JPanel panel;
+	String  labelString;
+	private JButton okButtonRed,okButtonBlue,cancelButton;
+	private int m_iteration=0;
+	private LedColor m_ret=LedColor.UNKNOWN; //use UNKNONW as CANCEL button
+	static Object modalMonitor = new Object();
+
+	public void setUseRawEnergy(boolean useRawEnergy) {
+		this.useRawEnergy=useRawEnergy;
+	}
+
+	public void setEnergyCut(double energyCut) {
+		this.energyCut=energyCut;
+	}
+	public void setSkipInitial(double skipInitial) {
+		this.skipInitial=skipInitial;
+	}
+	public void setSkipMin(double skipMin) {
+		this.skipMin=skipMin;
+	}
+
+	public void setEvnMinDraw(double evnMinDraw){
+		this.fEvnMinDraw=evnMinDraw;
+	}
+	public void setEvnMaxDraw(double evnMaxDraw){
+		this.fEvnMaxDraw=evnMaxDraw;
+	}
+	public void setChargeMinDraw(double chargeMinDraw){
+		this.fChargeMinDraw=chargeMinDraw;
+	}
+	public void setChargeMaxDraw(double chargeMaxDraw){
+		this.fChargeMaxDraw=chargeMaxDraw;
+	}
+
+	public void setNEventsMin(int nEeventsMin){
+		this.nEventsMin=nEventsMin;
+	}
+
+	public void setIsMonitoringApp(boolean app){
+		this.isMonitoringApp=app;
+	}
+
+	public void setDoFullAnalysis(boolean fullAnalysis){
+		this.doFullAnalysis=fullAnalysis;
+	}
+
+	public void setSaveTuple(boolean flag){
+		this.saveTuple=flag;
+	}
+
+	@Override
+	protected void detectorChanged(Detector detector) {
+		System.out.println("LedAnalysis::Detector changed was called");
+		System.out.println(fEvnMinDraw+" "+fEvnMaxDraw);
+		for (int ii=0;ii<nDrivers;ii++){
+			iStep[ii]=0;
+			// actualSequence[ii][iStep[ii]]=-1;
+		}
+
+		// Setup conditions
+
+		conditionsManager = DatabaseConditionsManager.getInstance();
+
+		LedTopMap = new HashMap< Integer , Integer >(); //key: ecal channel ID. Value:  led id
+		LedBotMap = new HashMap< Integer , Integer >();	
+
+		LedTopMapInverted = new HashMap< Integer , Integer >(); //key: led id. Value: ecal channel id
+		LedBotMapInverted = new HashMap< Integer , Integer >(); 
+
+
+		ChannelCollection = conditionsManager.getCachedConditions(EcalChannelCollection.class, "ecal_channels").getCachedData();	
+		LedCollection = conditionsManager.getCachedConditions(EcalLedCollection.class, "ecal_leds").getCachedData();
+		ecalConditions = conditionsManager.getEcalConditions();		
+
+		for (EcalChannel channel : ChannelCollection){
+			chid = channel.getChannelId();
+			for (EcalLed Led : LedCollection) {    	
+				if (Led.getEcalChannelId()==chid){
+					if (channel.getY()>0){
+						LedTopMap.put( chid , Led.getLedNumber() );
+						LedTopMapInverted.put(  Led.getLedNumber(), chid  );
+					}
+					else if (channel.getY()<0){
+						LedBotMap.put( chid , Led.getLedNumber() );
+						LedBotMapInverted.put( Led.getLedNumber(), chid );                    
+					}
+				}
+			}
+		}
+
+
+
+		// Setup plots
+		aida = AIDA.defaultInstance();
+		aida.tree().cd("/");
+		hMeanCharge2D = aida.histogram2D("Average LED response", 47, -23.5, 23.5, 11, -5.5, 5.5);
+
+		factory= aida.analysisFactory().createPlotterFactory("Ecal Led Sequence");
+		pPlotter= factory.create("Drivers");
+		pPlotter.createRegions(4,2);
+		if (isMonitoringApp){
+			pPlotter2=factory.create("Sequence Map");
+			pPlotter2.createRegions(1,1);
+			pPlotter2.region(0).plot(hMeanCharge2D);
+		}   
+		iTuple = new ArrayList<ITuple>(NUM_CHANNELS);   
+		hCharge = new ArrayList<IHistogram1D>(NUM_CHANNELS);
+		hChargeVsEvn = new ArrayList<IHistogram2D>(nDrivers);
+
+
+
+		//pPlotter2.region(0).plot(hMeanCharge2D);
+
+		for (int ii=0;ii<NUM_CHANNELS;ii++){
+			int row = EcalMonitoringUtilities.getRowFromHistoID(ii);
+			int column = EcalMonitoringUtilities.getColumnFromHistoID(ii);	    
+			iTuple.add(aida.analysisFactory().createTupleFactory(aida.tree()).create("nTuple"+ii,"nTuple"+ii,"int fEvn=0 , double fCharge=0.,double fTime=0.",""));
+		}
+
+		for (int ii=0;ii<nDrivers;ii++){
+			hChargeVsEvn.add(aida.histogram2D("Driver"+ii,100,fEvnMinDraw,fEvnMaxDraw,100,fChargeMinDraw,fChargeMaxDraw));
+			pPlotter.region(ii).plot( hChargeVsEvn.get(ii));
+		}
+
+		pPlotter.show();
+		if (isMonitoringApp) pPlotter2.show();
+
+	}		
+
+	@Override
+	public void process(EventHeader event) {
+		runNumber = event.getRunNumber();
+		eventN++;
+		if (event.hasCollection(CalorimeterHit.class, inputCollection)) {
+			//List<BaseRawCalorimeterHit> hits = event.get(BaseRawCalorimeterHit.class, inputCollectionRaw);
+			List<CalorimeterHit> hits = event.get(CalorimeterHit.class, inputCollection);
+			for (CalorimeterHit hit : hits) {
+
+				column = hit.getIdentifierFieldValue("ix");
+				row = hit.getIdentifierFieldValue("iy");
+				id = EcalMonitoringUtilities.getHistoIDFromRowColumn(row, column);
+				cellID=hit.getCellID();        
+				chid = ChannelCollection.findGeometric(cellID).getChannelId();
+
+				energy = hit.getCorrectedEnergy();
+
+				if (useRawEnergy){
+					fillEnergy = getRawADCSum(energy,cellID);
+				}
+				else {
+					fillEnergy = energy;
+				}
+				fillTime = hit.getTime();
+
+
+				//find the LED
+				if (row>0){
+					ledId=LedTopMap.get(chid);
+				}
+				else if (row<0){
+					ledId=LedBotMap.get(chid);
+				}
+				driverId=getDriver(ledId);
+				if (row<0) driverId+=4;
+
+
+
+				/*Skip the events under thr*/
+				if (energy<energyCut) continue;
+
+				/*First, check if this led is the one in the NEXT step. Therefore, increment by 1 the step*/
+				/*
+				 * if (iStep[driverId]==0){
+				 
+					actualSequence[driverId][iStep[driverId]]=ledId;
+					iStep[driverId]=1;                  
+				}
+				else if ((iStep[driverId]==1)&&(ledId!=actualSequence[driverId][0])){              
+					System.out.println("LedAnalysis:: increment step ("+iStep[driverId]+") for driver "+driverId+" . Led ID: "+ledId+" Column: "+column+" Row: "+row);                 
+					if (iStep[driverId]>0) drawProfiles(actualSequence[driverId][iStep[driverId]-1],driverId); 
+					actualSequence[driverId][iStep[driverId]]=ledId;
+					iStep[driverId]++;
+				}
+				else if ((iStep[driverId]>1)&&(ledId!=actualSequence[driverId][iStep[driverId]-1])&&(ledId!=actualSequence[driverId][iStep[driverId]-2])){
+					System.out.println("LedAnalysis:: increment step ("+iStep[driverId]+") for driver "+driverId+" . Led ID: "+ledId+" Column: "+column+" Row: "+row);                 
+					if (iStep[driverId]>0) drawProfiles(actualSequence[driverId][iStep[driverId]-1],driverId); 
+					actualSequence[driverId][iStep[driverId]]=ledId;
+					iStep[driverId]++;
+				}
+
+
+			    //	if (iStep[driverId]==-1) continue; 
+
+				*/
+
+				if (iStep[driverId]==-1) continue; /*Not yet data*/
+
+				/*Put this code here, since we want to always fill the ntuple*/
+				iTuple.get(id).fill(0,nEvents[id]);
+				iTuple.get(id).fill(1,fillEnergy);
+				iTuple.get(id).fill(2,fillTime);
+				iTuple.get(id).addRow();
+				nEvents[id]++;
+
+			
+
+				/*Add a debug print */
+				if (eventN % 10000==0){
+					System.out.println("Debug. Event "+eventN+" LED ID: "+ledId+" DRIVER ID: "+driverId+" ECAL ID: "+id+" ROW: "+row+" COLUMN: "+column+ "HISTO ID: "+id);
+				}
+			}
+			if (eventN % 10000==0){
+				System.out.println("\n");
+			}
+		}		
+	}
+
+	/*
+	 * The endOfData() method analises each ntuple to find the LED response.
+	 * We cannot simply fit a gaussian to the energy distribution, since there is a high-energy tail due to the LED being turned on:
+	 * When the LED turns on, it is "cold", and emits more light. Immediately, it starts to heat, and due to temperature effects the
+	 * emitted light is less. This is clearly visible if one plots the charge VS the event number: the trend is decreasing, toward a
+	 * plateau, that corresponds to the value at thermal equilibrium.
+	 * 
+	 * For (few) channels, the first charge values are close to 0, then charge grows rapidly, then it returns back to the plateau.
+	 * To handle these, I always cut the first 10% events
+	 * To properly handle this:
+	 * 
+	 * 1) First create a profile histogram, charge VS event number.
+	 * 2) Fit it with something like "A*exp(-event_number/N0)+C. The function does not need to be extra-accurate at this stage
+	 * 3) Cut the events with event_number < 5*N0.
+	 * 4) Fit the remaining events with a gaussian.
+	 */
+	@Override
+	public void endOfData() {
+		System.out.println("LedAnalysis::end of data");
+		System.out.println("LedAnalysis:: nEventsMin is: "+nEventsMin);
+
+		double e,eMin,eMax;
+		double t;
+		int n,nBins,nSkip;
+
+		int row, column;
+
+		String hName; 
+		IFunctionFactory fFactory=aida.analysisFactory().createFunctionFactory(aida.tree());
+
+		IFitResult fResult;
+		IFitter	   fFitter;
+
+		for (int id = 0; id < 11 * 47; id++) {
+
+			eMin=9999;
+			eMax=-9999;
+			row = EcalMonitoringUtilities.getRowFromHistoID(id);
+			column = EcalMonitoringUtilities.getColumnFromHistoID(id);
+			System.out.println("");
+			System.out.println("Doing channel: X= "+column+" Y= "+row+ "id= "+id);
+			System.out.println("Number of entries in analysis ntuple: "+iTuple.get(id).rows());
+			System.out.println("Number of recognized events: "+nEvents[id]);
+			/*Create the profile. Create it for all the channels, to keep sync.*/
+			nBins=nEvents[id]/100;
+			if (nBins<=0) nBins=1;
+
+			/*Clear previous*/
+
+			if (id>0){
+				aida.tree().rm("strip");
+				aida.tree().rm("fun0");
+				aida.tree().rm("fun1");
+			}
+			/*Create the profile.*/
+			cProfile=aida.profile1D("strip",nBins,-0.5,nEvents[id]*(1-skipInitial)+0.5);
+			cProfile.reset();
+			/*Create the function for the profile fit and the gaus fit*/
+			fFunction=fFactory.createFunctionFromScript("fun0",1,"A*exp(-x[0]/tau)+B","A,tau,B","",null);
+			fFunction1=fFactory.createFunctionByName("fun1","G");
+
+			if (EcalMonitoringUtilities.isInHole(row,column)==true){
+				System.out.println("Channel X= "+column+" Y= "+row+" is in hole. Skip");
+				hCharge.add(aida.histogram1D("charge_"+id,200,0.,1.)); //create here the histogram to keep sync
+				System.out.println("In hole, skip");
+				continue;
+			}
+			else if (nEvents[id]<nEventsMin) {
+				hCharge.add(aida.histogram1D("charge_"+id,200,0.,1.)); //create here the histogram to keep sync
+				System.err.println("LedAnalysis:: the channel X= "+column+" Y= "+row+" has not enough events "+nEvents[id]+" "+nEventsMin);
+
+				continue;
+			}			  
+
+			//Fill the profile*/
+			nSkip=(int)(nEvents[id]*skipInitial);
+			if (nSkip>iTuple.get(id).rows()){
+				System.out.println("Can't skip initial events?");
+				nSkip=0;
+			}
+			iTuple.get(id).start();
+			iTuple.get(id).skip(nSkip); //This is the work-around for those channels with charge starting from 0 and rapidly growing//
+			n=0;
+			iTuple.get(id).next(); 
+			while ( iTuple.get(id).next() ){
+				e=iTuple.get(id).getDouble(1);
+				if (e<eMin) eMin=e;           			  
+				if (e>eMax) eMax=e;
+				cProfile.fill(1.*n,e);
+				n++;
+			}			
+			fFitter=aida.analysisFactory().createFitFactory().createFitter("chi2","","v");
+
+			if (doFullAnalysis){ 
+				//Init function parameters
+				double[] initialPars={eMax-eMin,nEvents[id]/10.,eMin};
+				if (initialPars[0]<0) initialPars[0]=0;
+				fFunction.setParameters(initialPars);
+
+				//Do the fit      
+				System.out.println("LedAnalysis:: do profile fit "+id+" "+fFitter.engineName()+" "+fFitter.fitMethodName());
+				System.out.println("LedAnalysis:: initial parameters "+initialPars[0]+" "+initialPars[1]+" "+initialPars[2]);
+				fResult=fFitter.fit(cProfile,fFunction);
+				fPars     = fResult.fittedParameters();
+				fParErrs  = fResult.errors();
+				fParNames = fResult.fittedParameterNames();			
+				System.out.println("LedAnalysis:: Status= "+fResult.fitStatus()+" "+fResult.isValid()+" Chi2 = "+fResult.quality()+" NDF: "+fResult.ndf());
+				for(int i=0; i< fResult.fittedFunction().numberOfParameters(); i++ ){
+					System.out.println(fParNames[i]+" : "+fPars[i]+" +- "+fParErrs[i]);
+				}  
+				fFunction.setParameters(fPars);
+
+
+				//if fit failed, revert to simpler case
+				if ((fResult.isValid()==false)||Double.isNaN(fParErrs[0])||Double.isNaN(fParErrs[1])||Double.isNaN(fParErrs[2])){
+					System.out.println("LedAnalysis:: fit failed. Reverting to simpler case");
+					nSkip=(int)(nEvents[id]*(skipMin+skipInitial));
+				}
+				else{   
+					//Now we have the tau parameter. Take ONLY the events that are with N>5*tau/
+					//As a cross-check, also verify that tau > Nevents/10, otherwise skip the first Nevents/2
+					//and emit warning
+					nSkip=(int)( fPars[1]*5);
+					if (nSkip < (nEvents[id]*skipMin)){
+						System.out.println("LedAnalysis:: Skip number too low: "+nSkip+" Increment it to "+nEvents[id]/2);
+						nSkip=(int)(nEvents[id]*(skipMin+skipInitial));
+					}
+					if (nSkip > nEvents[id]){
+						System.out.println("LedAnalysis:: Skip number too high, reduce it");
+						nSkip=(int)(nEvents[id]*(skipMin+skipInitial));
+					}
+				}
+			}
+			else{
+				nSkip=(int)(nEvents[id]*(skipMin+skipInitial));
+			}
+
+			System.out.println("LedAnalysis:: gaus fit :: Going to skip "+nSkip+" out of "+nEvents[id]);
+			System.out.println("eMin is: "+eMin+" eMax is: "+eMax);
+			hCharge.add(aida.histogram1D("charge_"+id,200,eMin*0.9,eMax*1.1));
+
+
+			iTuple.get(id).start();
+			iTuple.get(id).skip(nSkip); 
+			n=0;
+			while (iTuple.get(id).next()){
+				e=iTuple.get(id).getDouble(1);
+				t=iTuple.get(id).getDouble(2);
+				hCharge.get(id).fill(e);
+				n++;
+			}			
+
+			/*Finally do the fit with the gaussian*/
+			double[] initialPars1={hCharge.get(id).maxBinHeight(),hCharge.get(id).mean(),hCharge.get(id).rms()};
+
+			System.out.println("LedAnalysis:: Gaus fit");
+			System.out.println("LedAnalysis:: initial parameters "+initialPars1[0]+" "+initialPars1[1]+" "+initialPars1[2]);
+
+			fFunction1.setParameters(initialPars1);
+			fResult=fFitter.fit(hCharge.get(id),fFunction1);
+			fPars     = fResult.fittedParameters();
+			fParErrs  = fResult.errors();
+			fParNames = fResult.fittedParameterNames();			
+			System.out.println("Status= "+fResult.fitStatus()+" "+fResult.isValid()+" Chi2 = "+fResult.quality()+" NDF: "+fResult.ndf());
+			for(int i=0; i< fResult.fittedFunction().numberOfParameters(); i++ ){
+				System.out.println(fParNames[i]+" : "+fPars[i]+" +- "+fParErrs[i]);
+			}  
+			fFunction1.setParameters(fPars);
+			mMean[id]=fPars[1];
+			mRMS[id]=fPars[2];
+
+			hMeanCharge2D.fill(column,row,mMean[id]);
+			System.out.println("\n");
+		}//End loop on channels
+
+
+
+		if ((pPlotter2!=null)&&(isMonitoringApp)){
+			style = pPlotter2.region(0).style();
+			style.setParameter("hist2DStyle", "colorMap");
+			style.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+			style.dataStyle().fillStyle().setParameter("showZeroHeightBins", Boolean.FALSE.toString()); 
+			pPlotter2.region(0).plot(hMeanCharge2D);
+			pPlotter2.region(0).refresh();
+		}
+		else{
+			IPlotterStyle pstyle =  aida.analysisFactory().createPlotterFactory().createPlotterStyle();
+			pPlotter2 = null;
+			pPlotter2 =  aida.analysisFactory().createPlotterFactory().create();
+			pstyle.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+			pstyle.dataStyle().fillStyle().setParameter("showZeroHeightBins", Boolean.FALSE.toString());
+			pstyle.setParameter("hist2DStyle", "colorMap");
+			if (pPlotter2!=null){
+				pPlotter2.createRegion().plot(hMeanCharge2D,pstyle);
+				pPlotter2.show();
+			}
+		}
+
+		if (isMonitoringApp){
+			askUploadToDBDialog();
+			synchronized (modalMonitor) {
+				try{
+					modalMonitor.wait(60000); //wait 1 minute for user interaction.
+				}
+				catch(InterruptedException excp){
+					System.out.println("Got exception: "+excp);
+				}
+			}
+			if ((m_ret!=LedColor.UNKNOWN)){
+				if (m_ret==LedColor.BLUE)    System.out.println("OK, upload to DB BLUE");
+				else System.out.println("OK, upload to DB RED");
+				try {
+					uploadToDB(m_ret);
+				} catch (SQLException | DatabaseObjectException | ConditionsObjectException error) {
+					throw new RuntimeException("Error uploading to the database ", error);
+				}
+
+				System.out.println("Save an Elog too");
+				uploadToElog();
+			}
+			else{
+				System.out.println("Cancel pressed. Nothing to do");
+			}
+		}
+
+		/*Write a file with the LED values*/
+		try {
+			if (useRawEnergy){
+				outFileName=runNumber+".raw.txt";
+			}
+			else{
+				outFileName=runNumber+".energy.txt";
+			}
+			PrintWriter writer = new PrintWriter(outFileName, "UTF-8");
+
+			for (int cid = 1; cid <= 442; cid++) {/*This is a loop over the channel ID, as in the conditions system*/
+				EcalChannel cc = findChannel(cid);
+				column = cc.getX(); //This is the column
+				row = cc.getY(); //This is the row
+				id=EcalMonitoringUtilities.getHistoIDFromRowColumn(row,column);
+				row = EcalMonitoringUtilities.getRowFromHistoID(id);
+				column = EcalMonitoringUtilities.getColumnFromHistoID(id);
+				if (EcalMonitoringUtilities.isInHole(row, column)) continue;
+				if ((row == 0) || (column == 0)) continue;
+
+				writer.print(cid+" "+column+" "+row+" "+" "+ mMean[id]+" "+mRMS[id]+"\r\n");
+
+			}
+			writer.close();
+
+		} 
+		catch (FileNotFoundException fnfe) {
+
+			System.out.println(fnfe.getMessage());
+
+		}
+
+		catch (IOException ioe) {
+
+			System.out.println(ioe.getMessage());
+
+		}
+
+
+		System.out.println("EcalLedSequenceMonitor endOfData clear histograms"); 
+		for(int ii = 0; ii < NUM_CHANNELS; ii++) {   	
+			row=EcalMonitoringUtilities.getRowFromHistoID(ii);
+			column = EcalMonitoringUtilities.getColumnFromHistoID(ii);      	  
+			hName="charge_"+ii;	 
+			try{
+				aida.tree().rm(hName);
+			}
+			catch(IllegalArgumentException ee){
+				System.out.println("Got exception "+ee);
+			}
+
+			if (!saveTuple||(isMonitoringApp)){
+				hName="nTuple"+ii;
+				try{
+					aida.tree().rm(hName);
+				}
+				catch(IllegalArgumentException ee){
+					System.out.println("Got exception "+ee);
+				}
+			}
+		}
+		System.out.println("EcalLedSequenceMonitor endOfData clear histograms done");   
+		System.out.println("endOfData end");
+		System.out.println("The program is not stucked. It is writing the output AIDA file, this takes time!");
+	}/*End endOfData*/
+
+
+	/**
+	 * This function returns the driver number (from 0 to 3) given the LED id.
+	 * @param led
+	 * @return
+	 */
+	public int getDriver(int led){
+		int ret=-1;	
+		if ((led>=2)&&(led<56)) ret=0;
+		else if ((led>=56)&&(led<112)) ret=1;
+		else if ((led>=112)&&(led<168)) ret=2;
+		else if ((led>=168)&&(led<224)) ret=3;
+		return ret;
+	}
+
+	/**
+	 * Very simple method to retrieve the pedestal-subtracted raw Energy.
+	 * If the gain changes (because we do a re-calibration), I do not want to include this in the LED analysis
+	 * @param energy
+	 * @param cellID
+	 * @return
+	 */
+	public double getRawADCSum(double energy,long cellID){
+		EcalChannelConstants channelData = ecalConditions.getChannelConstants(ecalConditions.getChannelCollection().findGeometric(cellID));
+		double RawSum=energy / EcalUtils.GeV;
+		double gain=channelData.getGain().getGain();
+		double ret=RawSum/gain;
+		//  System.out.println("A:C "+RawSum+" "+ret);
+		return ret;
+	}
+
+	private void uploadToDB(LedColor color) throws DatabaseObjectException, ConditionsObjectException, SQLException {
+		int x,y,id;
+		double mean,rms;
+		System.out.println(String.format("Uploading new led data to the database, runMin=%d, runMax=%d, tag=%s ....",
+				runNumber,runNumberMax,dbTag));
+
+		conditionsManager = DatabaseConditionsManager.getInstance();
+		EcalLedCalibrationCollection led_calibrations =  new EcalLedCalibrationCollection();
+		led_calibrations.setConnection(conditionsManager.getConnection());
+
+		TableMetaData tableMetaData = conditionsManager.findTableMetaData(dbTableName);
+		led_calibrations.setTableMetaData(tableMetaData);
+
+		for (int cid = 1; cid <= 442; cid++) {/*This is a loop over the channel ID, as in the conditions system*/
+			EcalChannel cc = findChannel(cid);
+			x = cc.getX(); //This is the column
+			y = cc.getY(); //This is the row
+			id=EcalMonitoringUtilities.getHistoIDFromRowColumn(y,x);
+			mean=mMean[id];
+			rms=mRMS[id];
+			led_calibrations.add(new EcalLedCalibration(cid,mean,rms,color));
+		}
+
+		int collectionId = -1;
+
+		try {
+			collectionId = conditionsManager.getCollectionId(led_calibrations, "loaded by EcalLedSequenceMonitor");
+		} catch (Exception e) {
+			System.out.println("Got exception on uploadToDB "+ e);
+			throw new RuntimeException(e);
+		}
+		System.err.println("CollectionID:  "+collectionId);
+		led_calibrations.insert();
+		ConditionsRecord conditionsRecord = new ConditionsRecord(
+				led_calibrations.getCollectionId(), runNumber, runNumberMax, dbTableName, dbTableName, 
+				"Generated by LedAnalysis from Run #"+runNumber, dbTag);
+		conditionsRecord.setConnection(conditionsManager.getConnection());
+		tableMetaData = conditionsManager.findTableMetaData("conditions");
+		conditionsRecord.setTableMetaData(tableMetaData);
+		conditionsRecord.insert();
+
+		System.out.println("Upload to DB done");
+	}
+
+	private void uploadToElog(){
+		String path,exe,command,imgpath;
+		path="/home/hpsrun/LedSequenceData";
+		exe=path+"/doElog.csh";
+		imgpath=path+"/screenshots/"+runNumber+".png";
+
+		File f=new File(path);
+		if (!f.exists()){
+			System.err.println("LedMonitoringSequence:: wrong path");
+			return;
+		}
+		if (pPlotter2==null){
+			System.err.println("LedMonitoringSquence:: no plotter");
+			return;
+		}
+		try{
+			pPlotter2.writeToFile(imgpath);
+		}
+		catch(Exception e){
+			System.err.println("Exception "+e);
+		}
+		File f1=new File(exe);
+		if (!f1.exists()){
+			System.err.println("LedMonitoringSequence:: no script!");
+			return;
+		}   
+		command=exe+" "+imgpath;
+		try{
+			System.out.println("LedMonitoringSequence:: try this command: "+command);
+			Runtime.getRuntime().exec(command);
+		}
+		catch(Exception e){
+			System.err.println("Exception "+e);
+		}
+	}
+
+
+	private void drawProfiles(int ledID,int driverID){
+
+		int m_column,m_row,m_ledID,m_chID,m_ID,m_driverID;
+
+		m_ledID = ledID;
+		m_driverID = driverID;
+		m_chID = 0;
+
+
+		if (m_driverID<=3) m_chID = LedTopMapInverted.get(ledID);
+		else m_chID = LedBotMapInverted.get(ledID);
+
+		m_column=findChannel(m_chID).getX();
+		m_row=findChannel(m_chID).getY();
+		m_ID=EcalMonitoringUtilities.getHistoIDFromRowColumn(m_row, m_column);
+		/* 
         System.out.println("Going to draw LED id "+m_ledID+" X= "+m_column+" Y= "+m_row+" driver: "+m_driverID);
         System.out.println("Ch_ID: "+m_chID);
         System.out.println("Histo ID:"+m_ID);
         System.out.println("Events: "+iTuple.get(m_ID).rows());
-         */      
-        hChargeVsEvn.get(m_driverID).reset();
-        hChargeVsEvn.get(m_driverID).setTitle("Driver_"+m_driverID+" Led_"+ledID);
-        IEvaluator evaluatorX = aida.analysisFactory().createTupleFactory(aida.analysisFactory().createTreeFactory().create()).createEvaluator("fEvn");
-        IEvaluator evaluatorY = aida.analysisFactory().createTupleFactory(aida.analysisFactory().createTreeFactory().create()).createEvaluator("fCharge");  
-
-        iTuple.get(m_ID).project(hChargeVsEvn.get(m_driverID),evaluatorX,evaluatorY);
-
-        pPlotter.region(m_driverID).clear();  
-        pPlotter.region(m_driverID).plot(hChargeVsEvn.get(m_driverID));
-        pPlotter.region(m_driverID).refresh();
-
-    }
-
-    private EcalChannel findChannel(int channel_id) {
-        return ecalConditions.getChannelCollection().findChannel(channel_id);
-    }
-
-
-    private void askUploadToDBDialog(){
-        m_ret=LedColor.UNKNOWN;
-
-        okButtonRed = new JButton("Yes, red");
-        okButtonBlue = new JButton("Yes, blue");
-        cancelButton = new JButton("Cancel");
-        labelString = "<html> Update conditions to DB <br> for run: <br> "+runNumber+" - "+runNumberMax+" <br> ???? <br> "
-                + "Use the monitoring app to look at the map<br>"
-                + "(Tab LED sequence)<br>"
-                +"Reply in 60 seconds<br>"+"</html>";   
-        label = new JLabel( labelString);
-
-        frame  = new JFrame("Upload to DB?");
-        frame.setSize(500,250);
-        panel = new JPanel();
-        frame.add(panel);
-
-
-        // dialog = new JDialog((JFrame)null, "User selection");
-        // dialog.setSize(200,200);
-        // dialog.setLayout(new FlowLayout());
-        // dialog.add(label);
-        // dialog.add(cancelButton);
-        // dialog.add(okButton);
-        // dialog.setVisible(true);
-        //dialog.pack();
-        panel.add(label);
-        panel.add(cancelButton);
-        panel.add(okButtonBlue);
-        panel.add(okButtonRed);
-     
-
-        frame.setVisible(true);
-        okButtonBlue.addActionListener(new ActionListener(){
-            public void actionPerformed(ActionEvent event)
-            {
-                m_ret=LedColor.BLUE;
-                frame.dispose();    
-                synchronized(modalMonitor)
-                {
-                    System.out.println("Blue pressed");
-                    modalMonitor.notify();
-                }
-            }
-        }
-                );
-        okButtonRed.addActionListener(new ActionListener(){
-            public void actionPerformed(ActionEvent event)
-            {
-                m_ret=LedColor.RED;
-                frame.dispose();    
-                synchronized(modalMonitor)
-                {
-                    System.out.println("Red pressed");
-                    modalMonitor.notify();
-                }
-            }
-        }
-                );
-
-        cancelButton.addActionListener(new ActionListener(){
-            public void actionPerformed(ActionEvent event)
-            {
-                m_ret=LedColor.UNKNOWN;
-                frame.dispose();   
-                synchronized(modalMonitor)
-                {
-                    System.out.println("Cancel pressed");
-                    modalMonitor.notify();
-                }
-            }
-        }
-                );
-
-        System.out.println("askUploadDB done");
-    }
+		 */      
+		hChargeVsEvn.get(m_driverID).reset();
+		hChargeVsEvn.get(m_driverID).setTitle("Driver_"+m_driverID+" Led_"+ledID);
+		IEvaluator evaluatorX = aida.analysisFactory().createTupleFactory(aida.analysisFactory().createTreeFactory().create()).createEvaluator("fEvn");
+		IEvaluator evaluatorY = aida.analysisFactory().createTupleFactory(aida.analysisFactory().createTreeFactory().create()).createEvaluator("fCharge");  
+
+		iTuple.get(m_ID).project(hChargeVsEvn.get(m_driverID),evaluatorX,evaluatorY);
+
+		pPlotter.region(m_driverID).clear();  
+		pPlotter.region(m_driverID).plot(hChargeVsEvn.get(m_driverID));
+		pPlotter.region(m_driverID).refresh();
+
+	}
+
+	private EcalChannel findChannel(int channel_id) {
+		return ecalConditions.getChannelCollection().findChannel(channel_id);
+	}
+
+
+	private void askUploadToDBDialog(){
+		m_ret=LedColor.UNKNOWN;
+
+		okButtonRed = new JButton("Yes, red");
+		okButtonBlue = new JButton("Yes, blue");
+		cancelButton = new JButton("Cancel");
+		labelString = "<html> Update conditions to DB <br> for run: <br> "+runNumber+" - "+runNumberMax+" <br> ???? <br> "
+				+ "Use the monitoring app to look at the map<br>"
+				+ "(Tab LED sequence)<br>"
+				+"Reply in 60 seconds<br>"+"</html>";   
+		label = new JLabel( labelString);
+
+		frame  = new JFrame("Upload to DB?");
+		frame.setSize(500,250);
+		panel = new JPanel();
+		frame.add(panel);
+
+
+		// dialog = new JDialog((JFrame)null, "User selection");
+		// dialog.setSize(200,200);
+		// dialog.setLayout(new FlowLayout());
+		// dialog.add(label);
+		// dialog.add(cancelButton);
+		// dialog.add(okButton);
+		// dialog.setVisible(true);
+		//dialog.pack();
+		panel.add(label);
+		panel.add(cancelButton);
+		panel.add(okButtonBlue);
+		panel.add(okButtonRed);
+
+
+		frame.setVisible(true);
+		okButtonBlue.addActionListener(new ActionListener(){
+			public void actionPerformed(ActionEvent event)
+			{
+				m_ret=LedColor.BLUE;
+				frame.dispose();    
+				synchronized(modalMonitor)
+				{
+					System.out.println("Blue pressed");
+					modalMonitor.notify();
+				}
+			}
+		}
+				);
+		okButtonRed.addActionListener(new ActionListener(){
+			public void actionPerformed(ActionEvent event)
+			{
+				m_ret=LedColor.RED;
+				frame.dispose();    
+				synchronized(modalMonitor)
+				{
+					System.out.println("Red pressed");
+					modalMonitor.notify();
+				}
+			}
+		}
+				);
+
+		cancelButton.addActionListener(new ActionListener(){
+			public void actionPerformed(ActionEvent event)
+			{
+				m_ret=LedColor.UNKNOWN;
+				frame.dispose();   
+				synchronized(modalMonitor)
+				{
+					System.out.println("Cancel pressed");
+					modalMonitor.notify();
+				}
+			}
+		}
+				);
+
+		System.out.println("askUploadDB done");
+	}
 
 }

Modified: java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/triggerbank/TIData.java
 =============================================================================
--- java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/triggerbank/TIData.java	(original)
+++ java/branches/jeremy-dev/record-util/src/main/java/org/hps/record/triggerbank/TIData.java	Tue Feb 16 13:35:43 2016
@@ -5,18 +5,25 @@
 /**
  * Class <code>TIData</code> is an implementation of abstract class
  * <code>AbstractIntData</code> that represents a TI trigger bit bank.
- * It contains both a time window length and a set of flags that track
- * whether a trigger of a given type was registered with the event to
- * which this bank is attached.
  *
  * @author Nathan Baltzell <[log in to unmask]>
  */
 public class TIData extends AbstractIntData {
-	/** The EvIO bank header tag for TI data banks. */
+
+    /**
+     * The EvIO bank header tag for TI data banks.
+     */
     public static final int BANK_TAG = 0xe10a; // EvioEventConstants.TI_TRIGGER_BANK_TAG;
-    /** The expected number of entries in the data bank. */
-    public static final int BANK_SIZE = 4;
-    
+    /**
+     * The expected number of entries in the data bank for the 2015 data.
+     */
+    private static final int BANK_SIZE_2015 = 4;
+    /**
+     * The expected number of entries in the data bank for the 2016 data (after
+     * unprescaled trigger bits were added).
+     */
+    private static final int BANK_SIZE_2016 = 5;
+
     // Store the parsed data bank parameters.
     private long time = 0;
     private boolean singles0 = false;
@@ -25,36 +32,59 @@
     private boolean pairs1 = false;
     private boolean calib = false;
     private boolean pulser = false;
-    
-    /**
-     * Creates a <code>TIData</code> bank from a raw EvIO data bank.
-     * It is expected that the EvIO reader will verify that the bank
-     * tag is of the appropriate type.
+    private boolean hasUnprescaledTriggerBits = false;
+    private boolean singles0Unprescaled = false;
+    private boolean singles1Unprescaled = false;
+    private boolean pairs0Unprescaled = false;
+    private boolean pairs1Unprescaled = false;
+    private boolean calibUnprescaled = false;
+    private boolean pulserUnprescaled = false;
+
+    /**
+     * Creates a <code>TIData</code> bank from a raw EvIO data bank. It is
+     * expected that the EvIO reader will verify that the bank tag is of the
+     * appropriate type.
+     *
      * @param bank - The EvIO data bank.
      */
     public TIData(int[] bank) {
         super(bank);
         decodeData();
     }
-    
+
     /**
      * Creates a <code>TIData</code> object from an existing LCIO
      * <code>GenericObject</code>.
+     *
      * @param tiData - The source data bank object.
      */
     public TIData(GenericObject tiData) {
         super(tiData, BANK_TAG);
         decodeData();
     }
-    
+
     @Override
     protected final void decodeData() {
-    	// Check that the data bank is the expected size. If not, throw
-    	// and exception.
-        if(this.bank.length != BANK_SIZE) {
-            throw new RuntimeException("Invalid Data Length:  " + bank.length);
-        }
-        
+        // Check that the data bank is the expected size. If not, throw
+        // and exception.
+        switch (this.bank.length) {
+            case BANK_SIZE_2015:
+//                System.out.println("2015-style TI bank");
+                break;
+            case BANK_SIZE_2016:
+//                System.out.format("2016-style TI bank, first word %x, last word %x\n", bank[0], bank[4]);
+                hasUnprescaledTriggerBits = true;
+                singles0Unprescaled = ((bank[0]) & 1) == 1;
+                singles1Unprescaled = ((bank[0] >> 1) & 1) == 1;
+                pairs0Unprescaled = ((bank[0] >> 2) & 1) == 1;
+                pairs1Unprescaled = ((bank[0] >> 3) & 1) == 1;
+                calibUnprescaled = ((bank[0] >> 4) & 1) == 1;
+                pulserUnprescaled = ((bank[0] >> 5) & 1) == 1;
+                break;
+            default:
+                throw new RuntimeException("Invalid Data Length:  " + bank.length);
+        }
+
         // Check each trigger bit to see if it is active. A value of 
         // 1 indicates a trigger of that type occurred, and 0 that it
         // did not.
@@ -64,83 +94,175 @@
         pairs1 = ((bank[0] >> 27) & 1) == 1;
         calib = ((bank[0] >> 28) & 1) == 1;
         pulser = ((bank[0] >> 29) & 1) == 1;
-        
-        // Get the unprocessed start and end times for the bank.
-        long w1 = bank[2] & 0xffffffffL;
-        long w2 = bank[3] & 0xffffffffL;
-        
-        // Process the times into units of clock-cycles.
+
+        // interpret time:
+        final long w1 = bank[2] & 0xffffffffL;
+        final long w2 = bank[3] & 0xffffffffL;
         final long timelo = w1;
         final long timehi = (w2 & 0xffff) << 32;
-        
-        // Store the time difference in nanoseconds.
         time = 4 * (timelo + timehi);
     }
-    
+
     @Override
     public int getTag() {
         return BANK_TAG;
     }
-    
-    /**
-     * Gets the time window for the bank.
-     * @return Returns the time window length in nanoseconds.
-     */
+
     public long getTime() {
         return time;
     }
-    
+
     /**
      * Indicates whether a singles 0 trigger was registered.
+     *
      * @return Returns <code>true</code> if the trigger occurred, and
      * <code>false</code> otherwise.
      */
     public boolean isSingle0Trigger() {
         return singles0;
     }
-    
+
     /**
      * Indicates whether a singles 1 trigger was registered.
+     *
      * @return Returns <code>true</code> if the trigger occurred, and
      * <code>false</code> otherwise.
      */
     public boolean isSingle1Trigger() {
         return singles1;
     }
-    
+
     /**
      * Indicates whether a pair 0 trigger was registered.
+     *
      * @return Returns <code>true</code> if the trigger occurred, and
      * <code>false</code> otherwise.
      */
     public boolean isPair0Trigger() {
         return pairs0;
     }
-    
+
     /**
      * Indicates whether a pair 1 trigger was registered.
+     *
      * @return Returns <code>true</code> if the trigger occurred, and
      * <code>false</code> otherwise.
      */
     public boolean isPair1Trigger() {
         return pairs1;
     }
-    
+
     /**
      * Indicates whether a cosmic trigger was registered.
+     *
      * @return Returns <code>true</code> if the trigger occurred, and
      * <code>false</code> otherwise.
      */
     public boolean isCalibTrigger() {
         return calib;
     }
-    
+
     /**
      * Indicates whether a random/pulser trigger was registered.
+     *
      * @return Returns <code>true</code> if the trigger occurred, and
      * <code>false</code> otherwise.
      */
     public boolean isPulserTrigger() {
         return pulser;
     }
-}
+
+    /**
+     * Indicates whether this TI data has unprescaled trigger bits.
+     *
+     * @return Returns <code>true</code> if the TI data has a fifth int
+     * containing unprescaled trigger bits, and <code>false</code> otherwise.
+     */
+    public boolean hasUnprescaledTriggerBits() {
+        return hasUnprescaledTriggerBits;
+    }
+
+    /**
+     * Indicates whether a singles 0 (unprescaled) trigger was registered.
+     *
+     * @return Returns <code>true</code> if the trigger occurred, and
+     * <code>false</code> otherwise. Throws a RuntimeException if this data does
+     * not have unprescaled trigger bits.
+     */
+    public boolean isSingle0UnprescaledTrigger() {
+        if (!hasUnprescaledTriggerBits) {
+            throw new RuntimeException("This TI data does not have unprescaled trigger bits.");
+        }
+        return singles0Unprescaled;
+    }
+
+    /**
+     * Indicates whether a singles 1 (unprescaled) trigger was registered.
+     *
+     * @return Returns <code>true</code> if the trigger occurred, and
+     * <code>false</code> otherwise. Throws a RuntimeException if this data does
+     * not have unprescaled trigger bits.
+     */
+    public boolean isSingle1UnprescaledTrigger() {
+        if (!hasUnprescaledTriggerBits) {
+            throw new RuntimeException("This TI data does not have unprescaled trigger bits.");
+        }
+        return singles1Unprescaled;
+    }
+
+    /**
+     * Indicates whether a pairs 0 (unprescaled) trigger was registered.
+     *
+     * @return Returns <code>true</code> if the trigger occurred, and
+     * <code>false</code> otherwise. Throws a RuntimeException if this data does
+     * not have unprescaled trigger bits.
+     */
+    public boolean isPair0UnprescaledTrigger() {
+        if (!hasUnprescaledTriggerBits) {
+            throw new RuntimeException("This TI data does not have unprescaled trigger bits.");
+        }
+        return pairs0Unprescaled;
+    }
+
+    /**
+     * Indicates whether a pairs 1 (unprescaled) trigger was registered.
+     *
+     * @return Returns <code>true</code> if the trigger occurred, and
+     * <code>false</code> otherwise. Throws a RuntimeException if this data does
+     * not have unprescaled trigger bits.
+     */
+    public boolean isPair1UnprescaledTrigger() {
+        if (!hasUnprescaledTriggerBits) {
+            throw new RuntimeException("This TI data does not have unprescaled trigger bits.");
+        }
+        return pairs1Unprescaled;
+    }
+
+    /**
+     * Indicates whether a cosmic (unprescaled) trigger was registered.
+     *
+     * @return Returns <code>true</code> if the trigger occurred, and
+     * <code>false</code> otherwise. Throws a RuntimeException if this data does
+     * not have unprescaled trigger bits.
+     */
+    public boolean isCalibUnprescaledTrigger() {
+        if (!hasUnprescaledTriggerBits) {
+            throw new RuntimeException("This TI data does not have unprescaled trigger bits.");
+        }
+        return calibUnprescaled;
+    }
+
+    /**
+     * Indicates whether a random/pulser (unprescaled) trigger was registered.
+     *
+     * @return Returns <code>true</code> if the trigger occurred, and
+     * <code>false</code> otherwise. Throws a RuntimeException if this data does
+     * not have unprescaled trigger bits.
+     */
+    public boolean isPulserUnprescaledTrigger() {
+        if (!hasUnprescaledTriggerBits) {
+            throw new RuntimeException("This TI data does not have unprescaled trigger bits.");
+        }
+        return pulserUnprescaled;
+    }
+}

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 Feb 16 13:35:43 2016
@@ -247,6 +247,15 @@
      * @return <code>true</code> if the run exists in the database
      */
     public boolean runExists() {
+        if (factory == null) {
+            throw new RuntimeException("factory is null");
+        }
+        if (factory.getRunSummaryDao() == null) {
+            throw new RuntimeException("RunSummaryDao is null");
+        }
+        if (this.run == null) {
+            throw new RuntimeException("run is null");
+        }
         return factory.getRunSummaryDao().runSummaryExists(this.run);
     }
 

Modified: java/branches/jeremy-dev/steering-files/src/main/resources/org/hps/steering/monitoring/SvtOnlineMonitoring.lcsim
 =============================================================================
--- java/branches/jeremy-dev/steering-files/src/main/resources/org/hps/steering/monitoring/SvtOnlineMonitoring.lcsim	(original)
+++ java/branches/jeremy-dev/steering-files/src/main/resources/org/hps/steering/monitoring/SvtOnlineMonitoring.lcsim	Tue Feb 16 13:35:43 2016
@@ -22,10 +22,11 @@
             <maxSamplePosition>3</maxSamplePosition>
             <timeWindowWeight>3</timeWindowWeight>
             <resetPeriod>50000</resetPeriod>
+            <saveRootFile>false</saveRootFile>
        </driver>
         <driver name="SvtHitPlots" type="org.hps.monitoring.drivers.svt.SvtHitPlots">
             <doPerChannelsSampleplots>true</doPerChannelsSampleplots>
-            <saveRootFile>true</saveRootFile>
+            <saveRootFile>false</saveRootFile>
         </driver>
         <driver name="SamplesPlots" type="org.hps.monitoring.drivers.svt.SamplesPlots" />
         <driver name="PedestalPlots" type="org.hps.monitoring.drivers.svt.PedestalPlots" />
@@ -44,7 +45,9 @@
             <neighborDeltaT>8.0</neighborDeltaT>
             <debug>false</debug>
         </driver>
-        <driver name="ClusterPlots" type="org.hps.monitoring.drivers.svt.SvtClusterPlots" />
+        <driver name="ClusterPlots" type="org.hps.monitoring.drivers.svt.SvtClusterPlots">
+            <saveRootFile>false</saveRootFile>
+        </driver>
         <driver name="CleanupDriver" type="org.lcsim.recon.tracking.digitization.sisim.config.ReadoutCleanupDriver" />
     </drivers>
 </lcsim>

Modified: java/branches/jeremy-dev/steering-files/src/main/resources/org/hps/steering/production/DataQualityRecon.lcsim
 =============================================================================
--- java/branches/jeremy-dev/steering-files/src/main/resources/org/hps/steering/production/DataQualityRecon.lcsim	(original)
+++ java/branches/jeremy-dev/steering-files/src/main/resources/org/hps/steering/production/DataQualityRecon.lcsim	Tue Feb 16 13:35:43 2016
@@ -9,7 +9,8 @@
         <!--        <driver name="DQMDatabaseDriver"/>  -->
         <driver name="RawTrackerHitSensorSetup"/>
         <driver name="EcalMonitoring"/>  
-        <driver name="SVTMonitoring"/>  
+        <driver name="EcalMonitoringCorr"/>  
+          <driver name="SVTMonitoring"/>
         <driver name="TrackingMonitoring"/>  
         <driver name="TrackingResiduals"/>
         <driver name="FinalStateMonitoring"/>          
@@ -21,6 +22,7 @@
         <driver name="TridentMonitoringGBL"/>
         <!-- Singles0 -->
         <driver name="EcalMonitoringSingles0"/>  
+        <driver name="EcalMonitoringCorrSingles0"/> 
         <driver name="TrackingMonitoringSingles0"/>  
         <driver name="TrackingMonitoringGBLSingles0"/>  
         <driver name="TrackingResidualsSingles0"/>
@@ -29,6 +31,7 @@
         <driver name="TridentMonitoringSingles0"/>
         <!-- Singles1 -->
         <driver name="EcalMonitoringSingles1"/>  
+        <driver name="EcalMonitoringCorrSingles1"/>  
         <driver name="TrackingMonitoringSingles1"/>  
         <driver name="TrackingMonitoringGBLSingles1"/>  
         <driver name="TrackingResidualsSingles1"/>
@@ -39,7 +42,8 @@
         <driver name="V0MonitoringGBLSingles1"/>          
         <driver name="TridentMonitoringGBLSingles1"/>
         <!-- Pairs0 -->
-        <driver name="EcalMonitoringPairs0"/>  
+        <driver name="EcalMonitoringPairs0"/>
+        <driver name="EcalMonitoringCorrPairs0"/>   
         <driver name="TrackingMonitoringPairs0"/>  
         <driver name="TrackingMonitoringGBLPairs0"/>  
         <driver name="TrackingResidualsPairs0"/>
@@ -47,7 +51,8 @@
         <driver name="V0MonitoringPairs0"/>          
         <driver name="TridentMonitoringPairs0"/>
         <!-- Pairs1 -->
-        <driver name="EcalMonitoringPairs1"/>  
+        <driver name="EcalMonitoringPairs1"/> 
+        <driver name="EcalMonitoringCorrPairs1"/>   
         <driver name="TrackingMonitoringPairs1"/>  
         <driver name="TrackingMonitoringGBLPairs1"/>  
         <driver name="TrackingResidualsPairs1"/>
@@ -58,7 +63,7 @@
         <driver name="V0MonitoringGBLPairs1"/>          
         <driver name="TridentMonitoringGBLPairs1"/>     
         <!--           -->
-        <driver name="AidaSaveDriver"/>
+        <!-- <driver name="AidaSaveDriver"/>-->
         <driver name="AidaToRootSaveDriver"/>
         <driver name="CleanupDriver"/>
     </execute>    
@@ -79,6 +84,13 @@
         <!-- all triggers  -->
         <driver name="EcalMonitoring" type="org.hps.analysis.dataquality.EcalMonitoring">         
             <triggerType>all</triggerType>
+            <beamEnergy>${beamEnergy}</beamEnergy>
+        </driver>
+        <driver name="EcalMonitoringCorr" type="org.hps.analysis.dataquality.EcalMonitoring">         
+            <triggerType>all</triggerType>
+            <beamEnergy>${beamEnergy}</beamEnergy>
+            <clusterCollectionName>EcalClustersCorr</clusterCollectionName>
+            <fillHitPlots>false</fillHitPlots>
         </driver>
         <driver name="SVTMonitoring" type="org.hps.analysis.dataquality.SvtMonitoring">         
             <triggerType>all</triggerType>
@@ -92,12 +104,15 @@
         </driver>
         <driver name="FinalStateMonitoring" type="org.hps.analysis.dataquality.FinalStateMonitoring">
             <triggerType>all</triggerType>
+            <beamEnergy>${beamEnergy}</beamEnergy>
         </driver>
         <driver name="V0Monitoring" type="org.hps.analysis.dataquality.V0Monitoring">
             <triggerType>all</triggerType>
+            <beamEnergy>${beamEnergy}</beamEnergy>
         </driver>
         <driver name="TridentMonitoring" type="org.hps.analysis.dataquality.TridentMonitoring">
             <triggerType>all</triggerType>
+            <beamEnergy>${beamEnergy}</beamEnergy>
         </driver>
        <driver name="TrackingMonitoringGBL" type="org.hps.analysis.dataquality.TrackingMonitoring">
             <trackCollectionName>GBLTracks</trackCollectionName>
@@ -105,20 +120,30 @@
         </driver>    
         <driver name="FinalStateMonitoringGBL" type="org.hps.analysis.dataquality.FinalStateMonitoring">
             <triggerType>all</triggerType>
+            <beamEnergy>${beamEnergy}</beamEnergy>
             <isGBL>true</isGBL>
         </driver>
         <driver name="V0MonitoringGBL" type="org.hps.analysis.dataquality.V0Monitoring">
             <triggerType>all</triggerType>
             <isGBL>true</isGBL>
+            <beamEnergy>${beamEnergy}</beamEnergy>
         </driver>
         <driver name="TridentMonitoringGBL" type="org.hps.analysis.dataquality.TridentMonitoring">
             <triggerType>all</triggerType>
             <isGBL>true</isGBL>
+            <beamEnergy>${beamEnergy}</beamEnergy>
         </driver>
 
         <!-- singles0 triggers  -->
         <driver name="EcalMonitoringSingles0" type="org.hps.analysis.dataquality.EcalMonitoring">         
             <triggerType>singles0</triggerType>
+            <beamEnergy>${beamEnergy}</beamEnergy>
+        </driver>
+        <driver name="EcalMonitoringCorrSingles0" type="org.hps.analysis.dataquality.EcalMonitoring">         
+            <triggerType>singles0</triggerType>
+            <beamEnergy>${beamEnergy}</beamEnergy>
+            <clusterCollectionName>EcalClustersCorr</clusterCollectionName>
+            <fillHitPlots>false</fillHitPlots>
         </driver>
         <driver name="SVTMonitoringSingles0" type="org.hps.analysis.dataquality.SvtMonitoring">         
             <triggerType>singles0</triggerType>
@@ -135,17 +160,27 @@
         </driver>
         <driver name="FinalStateMonitoringSingles0" type="org.hps.analysis.dataquality.FinalStateMonitoring">
             <triggerType>singles0</triggerType>
+            <beamEnergy>${beamEnergy}</beamEnergy>
         </driver>
         <driver name="V0MonitoringSingles0" type="org.hps.analysis.dataquality.V0Monitoring">
             <triggerType>singles0</triggerType>
+            <beamEnergy>${beamEnergy}</beamEnergy>
         </driver>
         <driver name="TridentMonitoringSingles0" type="org.hps.analysis.dataquality.TridentMonitoring">
             <triggerType>singles0</triggerType>
+            <beamEnergy>${beamEnergy}</beamEnergy>
         </driver>
 
         <!-- singles1 triggers  -->
         <driver name="EcalMonitoringSingles1" type="org.hps.analysis.dataquality.EcalMonitoring">         
             <triggerType>singles1</triggerType>
+            <beamEnergy>${beamEnergy}</beamEnergy>
+        </driver>
+        <driver name="EcalMonitoringCorrSingles1" type="org.hps.analysis.dataquality.EcalMonitoring">         
+            <triggerType>singles1</triggerType>
+            <beamEnergy>${beamEnergy}</beamEnergy>
+            <clusterCollectionName>EcalClustersCorr</clusterCollectionName>
+            <fillHitPlots>false</fillHitPlots>
         </driver>
         <driver name="SVTMonitoringSingles1" type="org.hps.analysis.dataquality.SvtMonitoring">         
             <triggerType>singles1</triggerType>
@@ -162,29 +197,42 @@
         </driver>
         <driver name="FinalStateMonitoringSingles1" type="org.hps.analysis.dataquality.FinalStateMonitoring">
             <triggerType>singles1</triggerType>
+            <beamEnergy>${beamEnergy}</beamEnergy>
         </driver>
          <driver name="V0MonitoringSingles1" type="org.hps.analysis.dataquality.V0Monitoring">
             <triggerType>singles1</triggerType>
+            <beamEnergy>${beamEnergy}</beamEnergy>
         </driver>
         <driver name="TridentMonitoringSingles1" type="org.hps.analysis.dataquality.TridentMonitoring">
-            <triggerType>singles1</triggerType>            
+            <triggerType>singles1</triggerType> 
+            <beamEnergy>${beamEnergy}</beamEnergy>           
         </driver>
        <driver name="FinalStateMonitoringGBLSingles1" type="org.hps.analysis.dataquality.FinalStateMonitoring">
                <triggerType>singles1</triggerType>
             <isGBL>true</isGBL>
+            <beamEnergy>${beamEnergy}</beamEnergy>
         </driver>
         <driver name="V0MonitoringGBLSingles1" type="org.hps.analysis.dataquality.V0Monitoring">
             <triggerType>singles1</triggerType>
+            <beamEnergy>${beamEnergy}</beamEnergy>
             <isGBL>true</isGBL>
         </driver>
         <driver name="TridentMonitoringGBLSingles1" type="org.hps.analysis.dataquality.TridentMonitoring">
             <triggerType>singles1</triggerType>
             <isGBL>true</isGBL>
+            <beamEnergy>${beamEnergy}</beamEnergy>
         </driver>
  
         <!-- pairs0 triggers  -->
         <driver name="EcalMonitoringPairs0" type="org.hps.analysis.dataquality.EcalMonitoring">         
             <triggerType>pairs0</triggerType>
+            <beamEnergy>${beamEnergy}</beamEnergy>
+        </driver>
+        <driver name="EcalMonitoringCorrPairs0" type="org.hps.analysis.dataquality.EcalMonitoring">         
+            <triggerType>pairs0</triggerType>
+            <beamEnergy>${beamEnergy}</beamEnergy>
+            <clusterCollectionName>EcalClustersCorr</clusterCollectionName>
+            <fillHitPlots>false</fillHitPlots>
         </driver>
         <driver name="SVTMonitoringPairs0" type="org.hps.analysis.dataquality.SvtMonitoring">         
             <triggerType>pairs0</triggerType>
@@ -201,18 +249,28 @@
         </driver>
         <driver name="FinalStateMonitoringPairs0" type="org.hps.analysis.dataquality.FinalStateMonitoring">
             <triggerType>pairs0</triggerType>
+            <beamEnergy>${beamEnergy}</beamEnergy>
         </driver>
         <driver name="V0MonitoringPairs0" type="org.hps.analysis.dataquality.V0Monitoring">
             <triggerType>pairs0</triggerType>
+            <beamEnergy>${beamEnergy}</beamEnergy>
         </driver>
         <driver name="TridentMonitoringPairs0" type="org.hps.analysis.dataquality.TridentMonitoring">
             <triggerType>pairs0</triggerType>
+            <beamEnergy>${beamEnergy}</beamEnergy>
         </driver>
 
 
         <!-- pairs1 triggers  -->
         <driver name="EcalMonitoringPairs1" type="org.hps.analysis.dataquality.EcalMonitoring">         
             <triggerType>pairs1</triggerType>
+            <beamEnergy>${beamEnergy}</beamEnergy>
+        </driver>
+        <driver name="EcalMonitoringCorrPairs1" type="org.hps.analysis.dataquality.EcalMonitoring">         
+            <triggerType>pairs1</triggerType>
+            <beamEnergy>${beamEnergy}</beamEnergy>
+            <clusterCollectionName>EcalClustersCorr</clusterCollectionName>
+            <fillHitPlots>false</fillHitPlots>
         </driver>
         <driver name="SVTMonitoringPairs1" type="org.hps.analysis.dataquality.SvtMonitoring">         
             <triggerType>pairs1</triggerType>
@@ -229,24 +287,30 @@
         </driver>
         <driver name="FinalStateMonitoringPairs1" type="org.hps.analysis.dataquality.FinalStateMonitoring">
             <triggerType>pairs1</triggerType>
+            <beamEnergy>${beamEnergy}</beamEnergy>
         </driver>
         <driver name="V0MonitoringPairs1" type="org.hps.analysis.dataquality.V0Monitoring">
             <triggerType>pairs1</triggerType>
+            <beamEnergy>${beamEnergy}</beamEnergy>
         </driver>
         <driver name="TridentMonitoringPairs1" type="org.hps.analysis.dataquality.TridentMonitoring">
             <triggerType>pairs1</triggerType>
+            <beamEnergy>${beamEnergy}</beamEnergy>
         </driver>
     <driver name="FinalStateMonitoringGBLPairs1" type="org.hps.analysis.dataquality.FinalStateMonitoring">
             <triggerType>pairs1</triggerType>
             <isGBL>true</isGBL>
+            <beamEnergy>${beamEnergy}</beamEnergy>
         </driver>
         <driver name="V0MonitoringGBLPairs1" type="org.hps.analysis.dataquality.V0Monitoring">
             <triggerType>pairs1</triggerType>
+            <beamEnergy>${beamEnergy}</beamEnergy>
             <isGBL>true</isGBL>
         </driver>
         <driver name="TridentMonitoringGBLPairs1" type="org.hps.analysis.dataquality.TridentMonitoring">
             <triggerType>pairs1</triggerType>
             <isGBL>true</isGBL>
+            <beamEnergy>${beamEnergy}</beamEnergy>
         </driver>
 
         <driver name="CleanupDriver" type="org.lcsim.recon.tracking.digitization.sisim.config.ReadoutCleanupDriver"/>

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