Print

Print


Author: [log in to unmask]
Date: Thu Mar  5 10:58:18 2015
New Revision: 2265

Log:
changes to tracking recon monitoring

Added:
    java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/trackrecon/
    java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/trackrecon/TrackResiduals.java
    java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/trackrecon/TrackTimePlots.java
      - copied, changed from r2221, java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/TrackTimePlots.java
    java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/trackrecon/TrackingReconPlots.java
      - copied, changed from r2221, java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/TrackingReconstructionPlots.java
    java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/trackrecon/V0ReconPlots.java
Removed:
    java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/TrackTimePlots.java
    java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/TrackingReconstructionPlots.java
Modified:
    java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/DataQualityMonitor.java
    java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/FinalStateMonitoring.java
    java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/TrackMCEfficiency.java
    java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/TrackingResiduals.java
    java/trunk/conditions/   (props changed)
    java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SVTEventInfo.java
    java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SVTHitPulsePlots.java
    java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SVTHitReconstructionPlots.java
    java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SVTPulseFitPlots.java
    java/trunk/monitoring-util/   (props changed)
    java/trunk/steering-files/src/main/resources/org/hps/steering/users/mgraham/MattsScrewAround.lcsim
    java/trunk/steering-files/src/main/resources/org/hps/steering/users/mgraham/NoTimeNoTriggerRecon.lcsim

Modified: java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/DataQualityMonitor.java
 =============================================================================
--- java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/DataQualityMonitor.java	(original)
+++ java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/DataQualityMonitor.java	Thu Mar  5 10:58:18 2015
@@ -26,7 +26,7 @@
     protected boolean connectToDB = false;
     protected boolean printDQMStrings = false;
     protected Map<String, Double> monitoredQuantityMap = new HashMap<>();
-
+    protected boolean debug=false;
     protected boolean outputPlots = false;
     protected String outputPlotDir = "DQMOutputPlots/";
     
@@ -34,6 +34,10 @@
         this.recoVersion = recoVersion;
     }
 
+    public void setDebug(boolean debug){
+        this.debug=debug;
+    }
+    
     public void setRunNumber(int run) {
         this.runNumber = run;
     }

Modified: java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/FinalStateMonitoring.java
 =============================================================================
--- java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/FinalStateMonitoring.java	(original)
+++ java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/FinalStateMonitoring.java	Thu Mar  5 10:58:18 2015
@@ -51,8 +51,7 @@
     //some summers
     double sumdelX = 0.0;
     double sumdelY = 0.0;
-    double sumEoverP = 0.0;
-    boolean debug = false;
+    double sumEoverP = 0.0;   
     private String plotDir = "FinalStateParticles/";
 
     @Override
@@ -90,8 +89,11 @@
     @Override
     public void process(EventHeader event) {
         /*  make sure everything is there */
-        if (!event.hasCollection(ReconstructedParticle.class, finalStateParticlesColName))
+        if (!event.hasCollection(ReconstructedParticle.class, finalStateParticlesColName)){
+            if(debug)
+                    System.out.println(finalStateParticlesColName+" collection not found???");
             return;
+        }
         nRecoEvents++;
         int nPhotons = 0;  //number of photons 
         int nUnAssTracks = 0; //number of tracks w/o clusters

Modified: java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/TrackMCEfficiency.java
 =============================================================================
--- java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/TrackMCEfficiency.java	(original)
+++ java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/TrackMCEfficiency.java	Thu Mar  5 10:58:18 2015
@@ -121,28 +121,34 @@
 
         //make sure the required collections exist
         if (!event.hasCollection(RawTrackerHit.class, rawTrackerHitCollectionName)) {
-            System.out.println(this.getClass().getSimpleName() + ": no collection found " + rawTrackerHitCollectionName);
+            if (debug)
+                System.out.println(this.getClass().getSimpleName() + ": no collection found " + rawTrackerHitCollectionName);
             return;
         }
-        if (!event.hasCollection(LCRelation.class, fittedSVTHitCollectionName)) {
-            System.out.println(this.getClass().getSimpleName() + ": no collection found " + fittedSVTHitCollectionName);
+        if (!event.hasCollection(LCRelation.class, fittedSVTHitCollectionName))
+            if (debug)
+                System.out.println(this.getClass().getSimpleName() + ": no collection found " + fittedSVTHitCollectionName); //mg...2/1/2015...don't return if the fitted collection isn't there...
+        //allow us to run if we simulated in "simple" mode (i.e. no time evolution)
+        //            return;
+        if (!event.hasCollection(Track.class, trackCollectionName)) {
+            if (debug)
+                System.out.println(this.getClass().getSimpleName() + ": no collection found " + trackCollectionName);
             return;
         }
-        if (!event.hasCollection(Track.class, trackCollectionName)) {
-            System.out.println(this.getClass().getSimpleName() + ": no collection found " + trackCollectionName);
+        if (!event.hasCollection(LCRelation.class, trackHitMCRelationsCollectionName)) {
+            if (debug)
+                System.out.println(this.getClass().getSimpleName() + ": no collection found " + trackHitMCRelationsCollectionName);
             return;
         }
-        if (!event.hasCollection(LCRelation.class, trackHitMCRelationsCollectionName)) {
-            System.out.println(this.getClass().getSimpleName() + ": no collection found " + trackHitMCRelationsCollectionName);
+        if (!event.hasCollection(TrackerHit.class, siClusterCollectionName)) {
+            if (debug)
+                System.out.println(this.getClass().getSimpleName() + ": no collection found " + siClusterCollectionName);
             return;
         }
-        if (!event.hasCollection(TrackerHit.class, siClusterCollectionName)) {
-            System.out.println(this.getClass().getSimpleName() + ": no collection found " + siClusterCollectionName);
-            return;
-        }
 
         if (!event.hasCollection(SimTrackerHit.class, trackerHitCollectionName)) {
-            System.out.println(this.getClass().getSimpleName() + ": no collection found " + trackerHitCollectionName);
+            if (debug)
+                System.out.println(this.getClass().getSimpleName() + ": no collection found " + trackerHitCollectionName);
             return;
         }
         //
@@ -153,37 +159,28 @@
         Map<Track, TrackAnalysis> tkanalMap = new HashMap<Track, TrackAnalysis>();
         RelationalTable hittomc = new BaseRelationalTable(RelationalTable.Mode.MANY_TO_MANY, RelationalTable.Weighting.UNWEIGHTED);
         List<LCRelation> mcrelations = event.get(LCRelation.class, trackHitMCRelationsCollectionName);
-        if (debugTrackEfficiency) {
+        if (debugTrackEfficiency)
             System.out.println(this.getClass().getSimpleName() + ": number of MC relations = " + mcrelations.size());
-        }
-        for (LCRelation relation : mcrelations) {
-            if (relation != null && relation.getFrom() != null && relation.getTo() != null) {
+        for (LCRelation relation : mcrelations)
+            if (relation != null && relation.getFrom() != null && relation.getTo() != null)
                 hittomc.add(relation.getFrom(), relation.getTo());
-            }
-        }
-        if (debugTrackEfficiency) {
+        if (debugTrackEfficiency)
             System.out.println(this.getClass().getSimpleName() + ": number of hittomc relations = " + hittomc.size());
-        }
         RelationalTable mcHittomcP = new BaseRelationalTable(RelationalTable.Mode.MANY_TO_MANY, RelationalTable.Weighting.UNWEIGHTED);
         //  Get the collections of SimTrackerHits
         List<List<SimTrackerHit>> simcols = event.get(SimTrackerHit.class);
         //  Loop over the SimTrackerHits and fill in the relational table
-        for (List<SimTrackerHit> simlist : simcols) {
-            for (SimTrackerHit simhit : simlist) {
-                if (simhit.getMCParticle() != null) {
+        for (List<SimTrackerHit> simlist : simcols)
+            for (SimTrackerHit simhit : simlist)
+                if (simhit.getMCParticle() != null)
                     mcHittomcP.add(simhit, simhit.getMCParticle());
-                }
-            }
-        }
         RelationalTable trktomc = new BaseRelationalTable(RelationalTable.Mode.MANY_TO_MANY, RelationalTable.Weighting.UNWEIGHTED);
         RelationalTable rawtomc = new BaseRelationalTable(RelationalTable.Mode.MANY_TO_MANY, RelationalTable.Weighting.UNWEIGHTED);
         if (event.hasCollection(LCRelation.class, "SVTTrueHitRelations")) {
             List<LCRelation> trueHitRelations = event.get(LCRelation.class, "SVTTrueHitRelations");
-            for (LCRelation relation : trueHitRelations) {
-                if (relation != null && relation.getFrom() != null && relation.getTo() != null) {
+            for (LCRelation relation : trueHitRelations)
+                if (relation != null && relation.getFrom() != null && relation.getTo() != null)
                     rawtomc.add(relation.getFrom(), relation.getTo());
-                }
-            }
         }
         // make relational table for strip clusters to mc particle
         List<TrackerHit> siClusters = event.get(TrackerHit.class, siClusterCollectionName);
@@ -192,59 +189,49 @@
             List<RawTrackerHit> rawHits = cluster.getRawHits();
             for (RawTrackerHit rth : rawHits) {
                 Set<SimTrackerHit> simTrackerHits = rawtomc.allFrom(rth);
-                if (simTrackerHits != null) {
-                    for (SimTrackerHit simhit : simTrackerHits) {
+                if (simTrackerHits != null)
+                    for (SimTrackerHit simhit : simTrackerHits)
                         clustertosimhit.add(cluster, simhit);
-                    }
-                }
             }
         }
         //relational tables from mc particle to raw and fitted tracker hits
         RelationalTable fittomc = new BaseRelationalTable(RelationalTable.Mode.MANY_TO_MANY, RelationalTable.Weighting.UNWEIGHTED);
-        List<LCRelation> fittedTrackerHits = event.get(LCRelation.class, fittedSVTHitCollectionName);
-        for (LCRelation hit : fittedTrackerHits) {
-            RawTrackerHit rth = FittedRawTrackerHit.getRawTrackerHit(hit);
-            Set<SimTrackerHit> simTrackerHits = rawtomc.allFrom(rth);
-            if (simTrackerHits != null) {
-                for (SimTrackerHit simhit : simTrackerHits) {
-                    if (simhit.getMCParticle() != null) {
-                        fittomc.add(hit, simhit.getMCParticle());
-                    }
-                }
-            }
-        }
-
+        if (event.hasCollection(LCRelation.class, fittedSVTHitCollectionName)) {
+            List<LCRelation> fittedTrackerHits = event.get(LCRelation.class, fittedSVTHitCollectionName);
+            for (LCRelation hit : fittedTrackerHits) {
+                RawTrackerHit rth = FittedRawTrackerHit.getRawTrackerHit(hit);
+                Set<SimTrackerHit> simTrackerHits = rawtomc.allFrom(rth);
+                if (simTrackerHits != null)
+                    for (SimTrackerHit simhit : simTrackerHits)
+                        if (simhit.getMCParticle() != null)
+                            fittomc.add(hit, simhit.getMCParticle());
+            }
+        }
         RelationalTable hittostrip = new BaseRelationalTable(RelationalTable.Mode.MANY_TO_MANY, RelationalTable.Weighting.UNWEIGHTED);
         List<LCRelation> hitrelations = event.get(LCRelation.class, detectorFrameHitRelationsCollectionName);
-        for (LCRelation relation : hitrelations) {
-            if (relation != null && relation.getFrom() != null && relation.getTo() != null) {
+        for (LCRelation relation : hitrelations)
+            if (relation != null && relation.getFrom() != null && relation.getTo() != null)
                 hittostrip.add(relation.getFrom(), relation.getTo());
-            }
-        }
 
         RelationalTable hittorotated = new BaseRelationalTable(RelationalTable.Mode.ONE_TO_ONE, RelationalTable.Weighting.UNWEIGHTED);
         List<LCRelation> rotaterelations = event.get(LCRelation.class, trackHitRelationsCollectionName);
-        for (LCRelation relation : rotaterelations) {
-            if (relation != null && relation.getFrom() != null && relation.getTo() != null) {
+        for (LCRelation relation : rotaterelations)
+            if (relation != null && relation.getFrom() != null && relation.getTo() != null)
                 hittorotated.add(relation.getFrom(), relation.getTo());
-            }
-        }
 
         //  Instantiate the class that determines if a track is "findable"
         FindableTrack findable = new FindableTrack(event);
 
         List<Track> tracks = event.get(Track.class, trackCollectionName);
-        if (debugTrackEfficiency) {
+        if (debugTrackEfficiency)
             System.out.println(this.getClass().getSimpleName() + ": nTracks = " + tracks.size());
-        }
         for (Track trk : tracks) {
             TrackAnalysis tkanal = new TrackAnalysis(trk, hittomc, rawtomc, hittostrip, hittorotated);
             tkanalMap.put(trk, tkanal);
             MCParticle mcp = tkanal.getMCParticleNew();
             if (mcp != null) {//  Create a map between the tracks found and the assigned MC particle            
-                if (debugTrackEfficiency) {
+                if (debugTrackEfficiency)
                     System.out.println(this.getClass().getSimpleName() + ": found MCP match");
-                }
                 trktomc.add(trk, tkanal.getMCParticleNew());
             }
         }
@@ -266,12 +253,12 @@
             double eta = -Math.log(Math.tan(Math.atan2(pt, pz) / 2));
             double phi = Math.atan2(px, pz);
             //  Find the number of layers hit by this mc particle
-            if (debugTrackEfficiency) {
+            if (debugTrackEfficiency)
                 System.out.println("MC pt=" + pt);
-            }
             int nhits = findable.LayersHit(mcp);
             boolean isFindable = findable.InnerTrackerIsFindable(mcp, nlayers - 2);
-
+            if (debugTrackEfficiency)
+                System.out.println("nhits Findable =" + nhits + "; is findable? " + isFindable);
             //  Calculate the helix parameters for this MC particle
             HelixParamCalculator helix = new HelixParamCalculator(mcp, bfield);
             double d0 = helix.getDCA();
@@ -289,17 +276,14 @@
                 //it's the A'...let's see if we found both tracks.
                 List<MCParticle> daughters = mcp.getDaughters();
                 for (MCParticle d : daughters) {
-                    if (trktomc.allTo(d).isEmpty()) {
+                    if (trktomc.allTo(d).isEmpty())
                         bothreco = false;
-                    }
-                    if (!findable.InnerTrackerIsFindable(d, nlayers - 2)) {
+                    if (!findable.InnerTrackerIsFindable(d, nlayers - 2))
                         bothfindable = false;
-                    }
                 }
                 double vtxWgt = 0;
-                if (bothreco) {
+                if (bothreco)
                     vtxWgt = 1.0;
-                }
 //                VxEff.fill(mcp.getOriginX(), vtxWgt);
 //                VyEff.fill(mcp.getOriginY(), vtxWgt);
 //                VzEff.fill(mcp.getOriginZ(), vtxWgt);
@@ -315,35 +299,41 @@
                 _nchMCP++;
                 findableTracks++;
                 double wgt = 0.;
-                if (ntrk > 0) {
+                if (ntrk > 0)
                     wgt = 1.;
-                }
                 foundTracks += wgt;
+                if (debugTrackEfficiency)
+                    System.out.println("...is findable; filling plots with weight " + wgt);
                 peffFindable.fill(p, wgt);
                 phieffFindable.fill(phi, wgt);
                 ctheffFindable.fill(cth, wgt);
 
                 if (wgt == 0) {
-
                     Set<SimTrackerHit> mchitlist = mcHittomcP.allTo(mcp);
                     Set<HelicalTrackCross> hitlist = hittomc.allTo(mcp);
-                    Set<FittedRawTrackerHit> fitlist = fittomc.allTo(mcp);
-                    if (debugTrackEfficiency) {
-                        System.out.println(this.getClass().getSimpleName() + ":  Missed a findable track with MC p = " + p);
-                        if (!hasHTHInEachLayer(hitlist, fitlist)) {
-                            System.out.println("\t\tThis track failed becasue it's missing a helical track hit");
+                    if (debugTrackEfficiency)
+                        if (fittomc != null) {
+                            Set<FittedRawTrackerHit> fitlist = fittomc.allTo(mcp);
+                            System.out.println(this.getClass().getSimpleName() + ":  Missed a findable track with MC p = " + p);
+                            if (!hasHTHInEachLayer(hitlist, fitlist))
+                                System.out.println("\t\tThis track failed becasue it's missing a helical track hit");
                         }
-                    }
                 }
 
+            }
+            if (debugTrackEfficiency){
+                System.out.println("# of mc parents " + mcp.getParents().size());
+                if(mcp.getParents().size() > 0 )
+                    System.out.println("PDG ID of parent 0 is " + mcp.getParents().get(0).getPDGID());
             }
             if (mcp.getParents().size() == 1 && mcp.getParents().get(0).getPDGID() == 622) {
                 totelectrons++;
 //                    findableelectrons++;
                 double wgt = 0.;
-                if (ntrk > 0) {
+                if (ntrk > 0)
                     wgt = 1.;
-                }
+                if (debugTrackEfficiency)
+                    System.out.println("...is from A'; filling plots with weight " + wgt);
                 foundelectrons += wgt;
                 peffElectrons.fill(p, wgt);
                 phieffElectrons.fill(phi, wgt);
@@ -386,19 +376,15 @@
     }
 
     private boolean hasHTHInEachLayer(Set<HelicalTrackCross> list, Set<FittedRawTrackerHit> fitlist) {
-        if (list.isEmpty()) {
+        if (list.isEmpty())
             return false;
-        }
-        if (!(list.toArray()[0] instanceof HelicalTrackCross)) {
+        if (!(list.toArray()[0] instanceof HelicalTrackCross))
             return false;
-        }
         for (int layer = 1; layer < nlayers - 2; layer += 2) {
             boolean hasThisLayer = false;
-            for (HelicalTrackCross hit : list) {
-                if (hit.Layer() == layer) {
+            for (HelicalTrackCross hit : list)
+                if (hit.Layer() == layer)
                     hasThisLayer = true;
-                }
-            }
             if (!hasThisLayer) {
 //                System.out.println("Missing reconstructed hit in layer = " + layer);
                 boolean hasFitHitSL1 = false;

Modified: java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/TrackingResiduals.java
 =============================================================================
--- java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/TrackingResiduals.java	(original)
+++ java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/TrackingResiduals.java	Thu Mar  5 10:58:18 2015
@@ -13,7 +13,6 @@
 import java.util.Map;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import org.hps.recon.tracking.gbl.GBLStripClusterData;
 import org.lcsim.event.EventHeader;
 import org.lcsim.event.GenericObject;
 import org.lcsim.geometry.Detector;

Modified: java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SVTEventInfo.java
 =============================================================================
--- java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SVTEventInfo.java	(original)
+++ java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SVTEventInfo.java	Thu Mar  5 10:58:18 2015
@@ -1,5 +1,6 @@
 package org.hps.monitoring.drivers.svt;
 
+import org.hps.monitoring.drivers.trackrecon.TrackingReconPlots;
 import hep.aida.IAnalysisFactory;
 import hep.aida.IHistogram1D;
 import hep.aida.IPlotter;
@@ -160,7 +161,7 @@
             try {
                 aida.saveAs(outputPlots);
             } catch (IOException ex) {
-                Logger.getLogger(TrackingReconstructionPlots.class.getName()).log(Level.SEVERE, null, ex);
+                Logger.getLogger(TrackingReconPlots.class.getName()).log(Level.SEVERE, null, ex);
             }
     }
 

Modified: java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SVTHitPulsePlots.java
 =============================================================================
--- java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SVTHitPulsePlots.java	(original)
+++ java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SVTHitPulsePlots.java	Thu Mar  5 10:58:18 2015
@@ -1,5 +1,6 @@
 package org.hps.monitoring.drivers.svt;
 
+import org.hps.monitoring.drivers.trackrecon.TrackingReconPlots;
 import hep.aida.IAnalysisFactory;
 import hep.aida.IHistogram2D;
 import hep.aida.IPlotter;
@@ -148,7 +149,7 @@
             try {
                 aida.saveAs(outputPlots);
             } catch (IOException ex) {
-                Logger.getLogger(TrackingReconstructionPlots.class.getName()).log(Level.SEVERE, null, ex);
+                Logger.getLogger(TrackingReconPlots.class.getName()).log(Level.SEVERE, null, ex);
             }
         }
         //plotterFrame.dispose();

Modified: java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SVTHitReconstructionPlots.java
 =============================================================================
--- java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SVTHitReconstructionPlots.java	(original)
+++ java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SVTHitReconstructionPlots.java	Thu Mar  5 10:58:18 2015
@@ -1,5 +1,6 @@
 package org.hps.monitoring.drivers.svt;
 
+import org.hps.monitoring.drivers.trackrecon.TrackingReconPlots;
 import hep.aida.IAnalysisFactory;
 import hep.aida.IHistogram1D;
 import hep.aida.IHistogram2D;
@@ -285,7 +286,7 @@
             try {
                 aida.saveAs(outputPlots);
             } catch (IOException ex) {
-                Logger.getLogger(TrackingReconstructionPlots.class.getName()).log(Level.SEVERE, null, ex);
+                Logger.getLogger(TrackingReconPlots.class.getName()).log(Level.SEVERE, null, ex);
             }
         }
         //plotterFrame.dispose();

Modified: java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SVTPulseFitPlots.java
 =============================================================================
--- java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SVTPulseFitPlots.java	(original)
+++ java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SVTPulseFitPlots.java	Thu Mar  5 10:58:18 2015
@@ -1,5 +1,6 @@
 package org.hps.monitoring.drivers.svt;
 
+import org.hps.monitoring.drivers.trackrecon.TrackingReconPlots;
 import hep.aida.IAnalysisFactory;
 import hep.aida.IHistogram1D;
 import hep.aida.IHistogram2D;
@@ -185,7 +186,7 @@
             try {
                 aida.saveAs(outputPlots);
             } catch (IOException ex) {
-                Logger.getLogger(TrackingReconstructionPlots.class.getName()).log(Level.SEVERE, null, ex);
+                Logger.getLogger(TrackingReconPlots.class.getName()).log(Level.SEVERE, null, ex);
             }
         }
     }

Added: java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/trackrecon/TrackResiduals.java
 =============================================================================
--- java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/trackrecon/TrackResiduals.java	(added)
+++ java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/trackrecon/TrackResiduals.java	Thu Mar  5 10:58:18 2015
@@ -0,0 +1,235 @@
+package org.hps.monitoring.drivers.trackrecon;
+
+import hep.aida.IAnalysisFactory;
+import hep.aida.IFitFactory;
+import hep.aida.IFitResult;
+import hep.aida.IFitter;
+import hep.aida.IHistogram1D;
+import hep.aida.IPlotter;
+import hep.aida.IPlotterStyle;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.GenericObject;
+import org.lcsim.geometry.Detector;
+import org.lcsim.util.Driver;
+import org.lcsim.util.aida.AIDA;
+
+/**
+ *
+ * @author mgraham
+ */
+public class TrackResiduals extends Driver {
+
+    // Collection Names
+    String trackTimeDataCollectionName = "TrackTimeData";
+    String trackResidualsCollectionName = "TrackResiduals";
+    String gblStripClusterDataCollectionName = "GBLStripClusterData";
+    private AIDA aida = AIDA.defaultInstance();
+
+    int nEvents = 0;
+
+    private String plotDir = "TrackResiduals/";
+    String[] trackingQuantNames = {};
+    int nmodules = 6;
+    private String posresDir = "PostionResiduals/";
+    private String uresDir = "UResiduals/";
+    private String timeresDir = "TimeResiduals/";
+  
+    IPlotter plotterResX;
+    IPlotter plotterResY;
+
+    String outputPlots;
+
+    void setupPlotter(IPlotter plotter, String title) {
+        plotter.setTitle(title);
+        IPlotterStyle style = plotter.style();
+        style.dataStyle().fillStyle().setColor("yellow");
+        style.dataStyle().errorBarStyle().setVisible(false);
+    }
+
+    private int computePlotterRegion(int i, boolean istop) {
+    
+        int region =-99;
+        if (i < 3)
+            if (istop)
+                region= i*4;
+            else
+                region= i*4+1;
+        else
+            if (istop)
+                region= (i-3)*4+2 ;
+            else
+                region= (i-3)*4+3;
+//     System.out.println("Setting region to "+region);
+        return region;
+    }
+
+    @Override
+    protected void detectorChanged(Detector detector) {
+
+        aida.tree().cd("/");
+//        resetOccupancyMap(); // this is for calculating averages         
+        IAnalysisFactory fac = aida.analysisFactory();
+
+        plotterResX = fac.createPlotterFactory().create("HPS Tracking Plots");
+        setupPlotter(plotterResX, "X-Residuals");
+        plotterResX.createRegions(3, 4);
+
+        plotterResY = fac.createPlotterFactory().create("HPS Tracking Plots");
+        setupPlotter(plotterResY, "Y-Residuals");
+        plotterResY.createRegions(3, 4);
+
+        for (int i = 1; i <= nmodules; i++) {
+            IHistogram1D xresid = aida.histogram1D("Module " + i + " Top x Residual", 50, -getRange(i, true), getRange(i, true));
+            IHistogram1D yresid = aida.histogram1D("Module " + i + " Top y Residual", 50, -getRange(i, false), getRange(i, false));
+            IHistogram1D xresidbot = aida.histogram1D("Module " + i + " Bot x Residual", 50, -getRange(i, true), getRange(i, true));
+            IHistogram1D yresidbot = aida.histogram1D("Module " + i + " Bot y Residual", 50, -getRange(i, false), getRange(i, false));
+            plotterResX.region(computePlotterRegion(i - 1, true)).plot(xresid);
+            plotterResX.region(computePlotterRegion(i - 1, false)).plot(xresidbot);
+            plotterResY.region(computePlotterRegion(i - 1, true)).plot(yresid);
+            plotterResY.region(computePlotterRegion(i - 1, false)).plot(yresidbot);
+        }
+
+        /*
+         for (int i = 1; i <= nmodules * 2; i++) {
+         IHistogram1D tresid = aida.histogram1D(plotDir + timeresDir + "HalfModule " + i + " t Residual", 50, -20, 20);
+         IHistogram1D utopresid = aida.histogram1D(plotDir + uresDir + "HalfModule " + i + " Top u Residual", 50, -getRange((i + 1) / 2, false), getRange((i + 1) / 2, false));
+         IHistogram1D ubotresid = aida.histogram1D(plotDir + uresDir + "HalfModule " + i + " Bot u Residual", 50, -getRange((i + 1) / 2, false), getRange((i + 1) / 2, false));
+         }
+         */
+    }
+
+    @Override
+    public void process(EventHeader event) {
+        aida.tree().cd("/");
+        if (!event.hasCollection(GenericObject.class, trackTimeDataCollectionName))
+            return;
+        if (!event.hasCollection(GenericObject.class, trackResidualsCollectionName))
+            return;
+        nEvents++;
+        List<GenericObject> trdList = event.get(GenericObject.class, trackResidualsCollectionName);
+        for (GenericObject trd : trdList) {
+            int nResid = trd.getNDouble();
+            int isBot = trd.getIntVal(trd.getNInt() - 1);//last Int is the top/bottom flag
+            for (int i = 1; i <= nResid; i++)
+
+                if (isBot == 1) {
+                    aida.histogram1D("Module " + i + " Bot x Residual").fill(trd.getDoubleVal(i - 1));//x is the double value in the generic object
+                    aida.histogram1D("Module " + i + " Bot y Residual").fill(trd.getFloatVal(i - 1));//y is the float value in the generic object
+                } else {
+                    aida.histogram1D("Module " + i + " Top x Residual").fill(trd.getDoubleVal(i - 1));//x is the double value in the generic object
+                    aida.histogram1D("Module " + i + " Top y Residual").fill(trd.getFloatVal(i - 1));//y is the float value in the generic object                    
+                }
+        }
+        /*
+         List<GenericObject> ttdList = event.get(GenericObject.class, trackTimeDataCollectionName);
+         for (GenericObject ttd : ttdList) {
+         int nResid = ttd.getNDouble();
+         for (int i = 1; i <= nResid; i++)
+         aida.histogram1D( "HalfModule " + i + " t Residual").fill(ttd.getDoubleVal(i - 1));//x is the double value in the generic object               
+         }
+         */
+        /*
+         if (!event.hasCollection(GenericObject.class, gblStripClusterDataCollectionName))
+         return;
+         List<GenericObject> gblSCDList = event.get(GenericObject.class, gblStripClusterDataCollectionName);
+         for (GenericObject gblSCD : gblSCDList) {
+         double umeas = gblSCD.getDoubleVal(15);//TODO:  implement generic methods into GBLStripClusterData so this isn't hard coded
+         double utrk = gblSCD.getDoubleVal(16);//implement generic methods into GBLStripClusterData so this isn't hard coded
+         double resid = umeas - utrk;
+         double tanlambda = gblSCD.getDoubleVal(21);//use the slope as a proxy for the top/bottom half of tracker
+
+         int i = gblSCD.getIntVal(0);//implement generic methods into GBLStripClusterData so this isn't hard coded
+         if (tanlambda > 0)
+         aida.histogram1D(plotDir + uresDir + "HalfModule " + i + " Top u Residual").fill(resid);//x is the double value in the generic object                 
+         else
+         aida.histogram1D(plotDir + uresDir + "HalfModule " + i + " Bot u Residual").fill(resid);//x is the double value in the generic object                 
+
+         }
+         */
+    }
+
+    private String getQuantityName(int itype, int iquant, int top, int nlayer) {
+        String typeString = "position_resid";
+        String quantString = "mean_";
+        if (itype == 1)
+            typeString = "time_resid";
+        if (iquant == 1)
+            quantString = "sigma_";
+
+        String botString = "bot_";
+        if (top == 1)
+            botString = "top_";
+        if (top == 2)
+            botString = "";
+
+        String layerString = "module" + nlayer;
+        if (itype == 1)
+            layerString = "halfmodule" + nlayer;
+
+        return typeString + quantString + botString + layerString;
+    }
+
+
+    private double getRange(int layer, boolean isX) {
+        double range = 2.5;
+        if (isX) {
+            if (layer == 1)
+                return 0.5;
+            if (layer == 2)
+                return 0.5;
+            if (layer == 3)
+                return 0.5;
+            if (layer == 4)
+                return 1.0;
+            if (layer == 5)
+                return 1.0;
+            if (layer == 6)
+                return 1.0;
+        } else {
+            if (layer == 1)
+                return 0.005;
+            if (layer == 2)
+                return 0.5;
+            if (layer == 3)
+                return 0.5;
+            if (layer == 4)
+                return 1.0;
+            if (layer == 5)
+                return 1.0;
+            if (layer == 6)
+                return 1.5;
+        }
+        return range;
+
+    }
+
+    IFitResult fitGaussian(IHistogram1D h1d, IFitter fitter, String range) {
+        double[] init = {20.0, 0.0, 0.2};
+        return fitter.fit(h1d, "g", init, range);
+//        double[] init = {20.0, 0.0, 1.0, 20, -1};
+//        return fitter.fit(h1d, "g+p1", init, range);
+    }
+
+    public void setOutputPlots(String output) {
+        this.outputPlots = output;
+    }
+
+    @Override
+    public void endOfData() {
+        if (outputPlots != null)
+            try {
+                plotterResX.writeToFile(outputPlots + "-X.gif");
+                plotterResY.writeToFile(outputPlots + "-Y.gif");
+            } catch (IOException ex) {
+                Logger.getLogger(TrackingReconPlots.class.getName()).log(Level.SEVERE, null, ex);
+            }
+
+    }
+
+}

Copied: java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/trackrecon/TrackTimePlots.java (from r2221, java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/TrackTimePlots.java)
 =============================================================================
--- java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/TrackTimePlots.java	(original)
+++ java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/trackrecon/TrackTimePlots.java	Thu Mar  5 10:58:18 2015
@@ -1,4 +1,4 @@
-package org.hps.monitoring.drivers.svt;
+package org.hps.monitoring.drivers.trackrecon;
 
 import hep.aida.IHistogram1D;
 import hep.aida.IHistogram2D;

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

Added: java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/trackrecon/V0ReconPlots.java
 =============================================================================
--- java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/trackrecon/V0ReconPlots.java	(added)
+++ java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/trackrecon/V0ReconPlots.java	Thu Mar  5 10:58:18 2015
@@ -0,0 +1,155 @@
+package org.hps.monitoring.drivers.trackrecon;
+
+import hep.aida.IAnalysisFactory;
+import hep.aida.IHistogram1D;
+import hep.aida.IHistogram2D;
+import hep.aida.IPlotter;
+import hep.aida.IPlotterStyle;
+import java.io.IOException;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.ReconstructedParticle;
+import org.lcsim.event.Track;
+import org.lcsim.event.Vertex;
+import org.lcsim.geometry.Detector;
+import org.lcsim.util.Driver;
+import org.lcsim.util.aida.AIDA;
+
+/**
+ *
+ * @author mgraham
+ */
+public class V0ReconPlots extends Driver {
+
+    private AIDA aida = AIDA.defaultInstance();
+    String finalStateParticlesColName = "FinalStateParticles";
+    String unconstrainedV0CandidatesColName = "UnconstrainedV0Candidates";
+    String beamConV0CandidatesColName = "BeamspotConstrainedV0Candidates";
+    String targetV0ConCandidatesColName = "TargetConstrainedV0Candidates";
+    //some counters
+    int nRecoEvents = 0;
+    boolean debug = false;
+
+    IPlotter plotterUncon;
+    IPlotter plotter2d;
+    String outputPlots;
+
+    @Override
+    protected void detectorChanged(Detector detector) {
+        System.out.println("V0Monitoring::detectorChanged  Setting up the plotter");
+
+        aida.tree().cd("/");
+//        resetOccupancyMap(); // this is for calculating averages         
+        IAnalysisFactory fac = aida.analysisFactory();
+
+        plotterUncon = fac.createPlotterFactory().create("HPS Tracking Plots");
+        setupPlotter(plotterUncon, "Unconstrained V0s");
+        plotterUncon.createRegions(2, 3);
+
+        /*  V0 Quantities   */
+        /*  Mass, vertex, chi^2 of fit */
+        /* beamspot constrained */
+        IHistogram1D nV0 = aida.histogram1D("Number of V0 per event", 5, 0, 5);
+        IHistogram1D unconMass = aida.histogram1D("Unconstrained Mass (GeV)", 100, 0, 0.200);
+        IHistogram1D unconVx = aida.histogram1D("Unconstrained Vx (mm)", 50, -1, 1);
+        IHistogram1D unconVy = aida.histogram1D("Unconstrained Vy (mm)", 50, -0.6, 0.6);
+        IHistogram1D unconVz = aida.histogram1D("Unconstrained Vz (mm)", 50, -10, 10);
+        IHistogram1D unconChi2 = aida.histogram1D("Unconstrained Chi2", 25, 0, 25);
+        plotterUncon.region(0).plot(nV0);
+        plotterUncon.region(1).plot(unconMass);
+        plotterUncon.region(2).plot(unconChi2);
+        plotterUncon.region(3).plot(unconVx);
+        plotterUncon.region(4).plot(unconVy);
+        plotterUncon.region(5).plot(unconVz);
+
+        plotter2d = fac.createPlotterFactory().create("HPS Tracking Plots");
+        setupPlotter(plotter2d, "V0 2D Plots");
+        plotter2d.createRegions(2, 2);
+        IPlotterStyle style = plotter2d.style();
+        style.statisticsBoxStyle().setVisible(false);
+        style.setParameter("hist2DStyle", "colorMap");
+        style.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+
+        IHistogram2D pEleVspPos = aida.histogram2D("P(e) vs P(p)", 50, 0, 2.5, 50, 0, 2.5);
+        IHistogram2D pyEleVspyPos = aida.histogram2D("Py(e) vs Py(p)", 50, -0.1, 0.1, 50, -0.1, 0.1);
+        IHistogram2D pxEleVspxPos = aida.histogram2D("Px(e) vs Px(p)", 50, -0.1, 0.1, 50, -0.1, 0.1);
+        IHistogram2D massVsVtxZ = aida.histogram2D("Mass vs Vz", 50, 0, 0.15, 50, -10, 10);
+        plotter2d.region(0).plot(pEleVspPos);
+        plotter2d.region(1).plot(pxEleVspxPos);
+        plotter2d.region(2).plot(massVsVtxZ);
+        plotter2d.region(3).plot(pyEleVspyPos);
+    }
+
+    @Override
+    public void process(EventHeader event) {
+        /*  make sure everything is there */
+        if (!event.hasCollection(ReconstructedParticle.class, finalStateParticlesColName))
+            return;
+        if (!event.hasCollection(ReconstructedParticle.class, unconstrainedV0CandidatesColName))
+            return;
+        if (!event.hasCollection(ReconstructedParticle.class, beamConV0CandidatesColName))
+            return;
+        if (!event.hasCollection(ReconstructedParticle.class, targetV0ConCandidatesColName))
+            return;
+        nRecoEvents++;
+
+        List<ReconstructedParticle> unConstrainedV0List = event.get(ReconstructedParticle.class, unconstrainedV0CandidatesColName);
+        aida.histogram1D("Number of V0 per event").fill(unConstrainedV0List.size());
+        for (ReconstructedParticle uncV0 : unConstrainedV0List) {
+            Vertex uncVert = uncV0.getStartVertex();
+            aida.histogram1D("Unconstrained Vx (mm)").fill(uncVert.getPosition().x());
+            aida.histogram1D("Unconstrained Vy (mm)").fill(uncVert.getPosition().y());
+            aida.histogram1D("Unconstrained Vz (mm)").fill(uncVert.getPosition().z());
+            aida.histogram1D("Unconstrained Mass (GeV)").fill(uncV0.getMass());
+            aida.histogram1D("Unconstrained Chi2").fill(uncVert.getChi2());
+            aida.histogram2D("Mass vs Vz").fill(uncV0.getMass(), uncVert.getPosition().z());
+            //this always has 2 tracks. 
+            List<ReconstructedParticle> trks = uncV0.getParticles();
+            Track ele = trks.get(0).getTracks().get(0);
+            Track pos = trks.get(1).getTracks().get(0);
+            //if track #0 has charge>0 it's the electron!  This seems mixed up, but remember the track 
+            //charge is assigned assuming a positive B-field, while ours is negative
+            if (trks.get(0).getCharge() > 0) {
+                pos = trks.get(0).getTracks().get(0);
+                ele = trks.get(1).getTracks().get(0);
+            }
+            aida.histogram2D("P(e) vs P(p)").fill(getMomentum(ele), getMomentum(pos));
+            aida.histogram2D("Px(e) vs Px(p)").fill(ele.getTrackStates().get(0).getMomentum()[1], pos.getTrackStates().get(0).getMomentum()[1]);
+            aida.histogram2D("Py(e) vs Py(p)").fill(ele.getTrackStates().get(0).getMomentum()[2], pos.getTrackStates().get(0).getMomentum()[2]);
+        }
+    }
+
+    void setupPlotter(IPlotter plotter, String title) {
+        plotter.setTitle(title);
+        IPlotterStyle style = plotter.style();
+        style.dataStyle().fillStyle().setColor("yellow");
+        style.dataStyle().errorBarStyle().setVisible(false);
+    }
+
+    public void setOutputPlots(String output) {
+        this.outputPlots = output;
+    }
+
+    private double getMomentum(Track trk) {
+
+        double px = trk.getTrackStates().get(0).getMomentum()[0];
+        double py = trk.getTrackStates().get(0).getMomentum()[1];
+        double pz = trk.getTrackStates().get(0).getMomentum()[2];
+        return Math.sqrt(px * px + py * py + pz * pz);
+    }
+
+    @Override
+    public void endOfData() {
+        if (outputPlots != null)
+            try {
+                plotterUncon.writeToFile(outputPlots + "-Unconstrained.gif");
+                plotter2d.writeToFile(outputPlots + "-2d.gif");
+            } catch (IOException ex) {
+                Logger.getLogger(TrackingReconPlots.class.getName()).log(Level.SEVERE, null, ex);
+            }
+
+    }
+
+}

Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/users/mgraham/MattsScrewAround.lcsim
 =============================================================================
--- java/trunk/steering-files/src/main/resources/org/hps/steering/users/mgraham/MattsScrewAround.lcsim	(original)
+++ java/trunk/steering-files/src/main/resources/org/hps/steering/users/mgraham/MattsScrewAround.lcsim	Thu Mar  5 10:58:18 2015
@@ -5,32 +5,31 @@
 <lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd">
     <execute>
         <driver name="EventMarkerDriver" />
-        <driver name="ConditionsDriver" />
         <driver name="SvtSensorSetup" />
         <driver name="RawTrackerHitSensorSetup" />
         <driver name="RawTrackerHitFitterDriver" />
         <driver name="TrackerHitDriver" />
         <driver name="HelicalTrackHitDriver" />
-<!--         <driver name="TrackerReconDriver"/> 
-          <driver name="TrackDataDriver"/>    -->
-        <driver name="AxialTrackReconDriver" />
+         <driver name="TrackerReconDriver"/> 
+          <driver name="TrackDataDriver"/>   
         <driver name="EcalRawConverter" />
         <driver name="EcalClusterer" />
         <driver name="ReconParticle" />
-        <driver name="TrackingMonitoring" />
-        <driver name="TrackMCEfficiency" />
-<!--        <driver name="StraightTrackAnalysis"/>    -->
-        <driver name="AidaSaveDriver" />
-        <driver name="LCIOWriter" />
+<!--        <driver name="TrackingMonitoring" />
+        <driver name="TrackingResiduals"/>  
+        <driver name="V0Monitoring"/>  -->
+        <driver name="TrackingDQM" />
+        <driver name="TrackingResidualsDQM"/>  
+        <driver name="FinalStateDQM"/>  
+        <driver name="V0DQM"/>  
+        <driver name="AidaSaveDriver"/> 
         <driver name="CleanupDriver" />
     </execute>
     <drivers>
+     <driver name="SvtSensorSetup" type="org.hps.recon.tracking.SvtSensorSetup" />   
         <driver name="ConditionsDriver" type="org.hps.conditions.ConditionsDriver" />
-        <driver name="SvtSensorSetup" type="org.hps.recon.tracking.SvtSensorSetup" />
-        <!-- Broken due to missing prop file.  JM -->
-        <!-- <driver name="DQMDatabaseDriver" type="org.hps.analysis.dataquality.DQMDatabaseDriver" />  -->
-        <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">
-            <eventInterval>1</eventInterval>
+         <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">
+            <eventInterval>10</eventInterval>
         </driver>
         <driver name="RawTrackerHitSensorSetup" type="org.lcsim.recon.tracking.digitization.sisim.config.RawTrackerHitSensorSetup" />
         <driver name="BadChannelFilter" type="org.hps.recon.tracking.SVTBadChannelFilterDriver" />
@@ -49,7 +48,7 @@
             <clusterTimeCut>16.0</clusterTimeCut>
             <maxSeperation>20.0</maxSeperation>
             <tolerance>1.0</tolerance>
-            <saveAxialHits>true</saveAxialHits>
+            <saveAxialHits>false</saveAxialHits>
         </driver>
         <driver name="TrackerReconDriver" type="org.hps.recon.tracking.TrackerReconDriver">
             <debug>false</debug>
@@ -62,10 +61,6 @@
         </driver>
         <driver name="EcalClusterer" type="org.hps.recon.ecal.cluster.ClusterDriver">
             <clustererName>LegacyClusterer</clustererName>
-        </driver>
-        <driver name="AddBeamSpotToTrack" type="org.hps.users.mgraham.AddBeamSpotToTrack">
-        </driver>
-        <driver name="BeamSpotTrackAnalysis" type="org.hps.users.mgraham.BeamSpotTrackAnalysis">
         </driver>
         <driver name="ReconParticle" type="org.hps.recon.particle.HpsReconParticleDriver">
             <debug>false</debug>
@@ -81,50 +76,33 @@
             <beamConV0VerticesColName>BSBeamspotConstrainedV0Vertices</beamConV0VerticesColName>
             <targetConV0VerticesColName>BSTargetConstrainedV0Vertices</targetConV0VerticesColName>
         </driver>
-        <driver name="AidaSaveDriver" type="org.lcsim.job.AidaSaveDriver">
-            <outputFileName>./conditions_test_plots.root</outputFileName>
+     
+        <driver name="TrackingMonitoring" type="org.hps.monitoring.drivers.trackrecon.TrackingReconPlots">         
+        <outputPlots>tracking</outputPlots>
         </driver>
-        <driver name="SVTMonitoring" type="org.hps.analysis.dataquality.SvtMonitoring">
-            <runNumber>${runNumber}</runNumber>
+        <driver name="TrackingResiduals" type="org.hps.monitoring.drivers.trackrecon.TrackResiduals">
+             <outputPlots>track-residuals</outputPlots>      
+        </driver>
+         <driver name="V0Monitoring" type="org.hps.monitoring.drivers.trackrecon.V0ReconPlots">         
+        <outputPlots>v0recon</outputPlots>
+        </driver>      
+
+
+        <driver name="TrackingDQM" type="org.hps.analysis.dataquality.TrackingMonitoring">         
             <overwriteDB>false</overwriteDB>
         </driver>
-        <driver name="TrackingMonitoring" type="org.hps.analysis.dataquality.TrackingMonitoring">
-            <runNumber>${runNumber}</runNumber>
-            <overwriteDB>false</overwriteDB>
-            <trackCollectionName>StraightTracks</trackCollectionName>
-        </driver>
-        <driver name="TrackingResiduals" type="org.hps.analysis.dataquality.TrackingResiduals">
-            <runNumber>${runNumber}</runNumber>
+      <driver name="TrackingResidualsDQM" type="org.hps.analysis.dataquality.TrackingResiduals">         
             <overwriteDB>false</overwriteDB>
         </driver>
-        <driver name="FinalStateMonitoring" type="org.hps.analysis.dataquality.FinalStateMonitoring">
-            <runNumber>${runNumber}</runNumber>
+ <driver name="FinalStateDQM" type="org.hps.analysis.dataquality.FinalStateMonitoring">         
             <overwriteDB>false</overwriteDB>
         </driver>
-        <driver name="SVTHitMCEfficiency" type="org.hps.analysis.dataquality.SVTHitMCEfficiency">
-            <overwriteDB>false</overwriteDB>
-            <printDQMStrings>false</printDQMStrings>
-        </driver>
-        <driver name="V0Monitoring" type="org.hps.analysis.dataquality.V0Monitoring">
-            <runNumber>${runNumber}</runNumber>
+        <driver name="V0DQM" type="org.hps.analysis.dataquality.V0Monitoring">         
             <overwriteDB>false</overwriteDB>
         </driver>
-        <driver name="CleanupDriver" type="org.lcsim.recon.tracking.digitization.sisim.config.ReadoutCleanupDriver" />
-        <driver name="LCIOWriter" type="org.lcsim.util.loop.LCIODriver">
-            <outputFilePath>blah.slcio</outputFilePath>
-        </driver>
-        <driver name="AxialTrackReconDriver" type="org.hps.recon.tracking.axial.AxialTrackReconDriver">
-            <debug>false</debug>
-            <strategyResource>/org/hps/recon/tracking/strategies/HPS-Axial.xml</strategyResource>
-            <trackCollectionName>StraightTracks</trackCollectionName>
-        </driver>
-        <driver name="TrackMCEfficiency" type="org.hps.analysis.dataquality.TrackMCEfficiency">
-            <overwriteDB>false</overwriteDB>
-            <trackCollectionName>StraightTracks</trackCollectionName>
-            <trackHitCollectionName>RotatedAxialTrackHits</trackHitCollectionName>
-            <trackHitMCRelationsCollectionName>RotatedAxialTrackHitsMCRelations</trackHitMCRelationsCollectionName>
-        </driver>
-        <driver name="StraightTrackAnalysis" type="org.hps.users.mgraham.StraightTrackAnalysis">
-        </driver>
+     <driver name="AidaSaveDriver" type="org.lcsim.job.AidaSaveDriver">
+                 <outputFileName>./Test-DQM-Tracking-Recon.root</outputFileName>
+        </driver>  
+        <driver name="CleanupDriver" type="org.lcsim.recon.tracking.digitization.sisim.config.ReadoutCleanupDriver" />       
     </drivers>
 </lcsim>

Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/users/mgraham/NoTimeNoTriggerRecon.lcsim
 =============================================================================
--- java/trunk/steering-files/src/main/resources/org/hps/steering/users/mgraham/NoTimeNoTriggerRecon.lcsim	(original)
+++ java/trunk/steering-files/src/main/resources/org/hps/steering/users/mgraham/NoTimeNoTriggerRecon.lcsim	Thu Mar  5 10:58:18 2015
@@ -5,33 +5,67 @@
         <printDriversDetailed>true</printDriversDetailed>
     </control>
     <execute>
-        <driver name="EventMarkerDriver" />
-        <driver name="TrackerDigiDriver" />
-        <driver name="HelicalTrackHitDriver" />
-        <driver name="AxialTrackReconDriver" />
-        <!-- <driver name="TrackerReconDriver"/> <driver name="TrackDataDriver"/> -->
-        <!-- <driver name="StraightTrackReconDriver"/> -->
-        <driver name="StraightTrackAnalysis" />
-        <driver name="SVTMonitoring" />
-        <driver name="TrackingMonitoring" />
-        <driver name="TrackingResiduals" />
-        <driver name="AidaSaveDriver" />
-        <driver name="LCIOWriter" />
-        <driver name="CleanupDriver" />
+        <driver name="EventMarkerDriver"/>
+        <driver name="SvtSensorSetup"/>
+        <driver name="TrackerDigiDriver"/>
+      <driver name="EcalEdepToTriggerConverterDriver"/>
+        <driver name="EcalReadoutConverterDriver"/>
+        <driver name="ReconClusterer"/>
+        <driver name="HelicalTrackHitDriver"/> 
+        <driver name="TrackerReconDriver"/> 
+       <driver name="TrackDataDriver"/>   
+<!--        <driver name="AxialTrackReconDriver"/>   -->
+<!--       <driver name="StraightTrackReconDriver"/>  -->
+<!--        <driver name="StraightTrackAnalysis"/>  -->
+         <driver name="ReconParticle" />  
+        <driver name="SVTMonitoring"/>  
+        <driver name="TrackingMonitoring"/> 
+       <driver name="TrackMCEfficiency"/> 
+        <driver name="TrackingResiduals"/>  
+        <driver name="FinalStateMonitoring"/>
+        <driver name="V0Monitoring"/>
+        <driver name="AidaSaveDriver"/> 
+        <driver name="LCIOWriter"/> 
+        <driver name="CleanupDriver"/> 
     </execute>
     <drivers>
         <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">
-            <eventInterval>1</eventInterval>
+            <eventInterval>100</eventInterval>
         </driver>
+
+       <driver name="EcalEdepToTriggerConverterDriver" type="org.hps.recon.ecal.EcalEdepToTriggerConverterDriver">
+            <readoutCollection>EcalCalHits</readoutCollection>
+            <applyBadCrystalMap>false</applyBadCrystalMap>
+            <truncateScale>1</truncateScale>
+            <constantGain>0.15</constantGain>
+        </driver>
+        <driver name="EcalReadoutConverterDriver" type="org.hps.recon.ecal.EcalRawConverterDriver">
+            <runBackwards>true</runBackwards>
+            <rawCollectionName>EcalReadoutHits</rawCollectionName>
+            <ecalCollectionName>EcalCalHits</ecalCollectionName>
+        </driver>
+
+      <driver name="ReconClusterer" type="org.hps.recon.ecal.cluster.ReconClusterDriver">
+            <logLevel>WARNING</logLevel>
+            <outputClusterCollectionName>EcalClusters</outputClusterCollectionName>
+            <hitEnergyThreshold>0.01</hitEnergyThreshold>
+            <seedEnergyThreshold>0.100</seedEnergyThreshold> 
+            <clusterEnergyThreshold>0.200</clusterEnergyThreshold>
+            <useTimeCut>false</useTimeCut>
+            <writeRejectedHitCollection>false</writeRejectedHitCollection>
+        </driver>
+
+       <driver name="SvtSensorSetup" type="org.hps.recon.tracking.SvtSensorSetup" />
         <driver name="TrackerDigiDriver" type="org.hps.recon.tracking.SimpleTrackerDigiDriver">
             <!-- <dropBadChannels>true</dropBadChannels> -->
+            <rawTrackerHitOutputCollectionName>SVTRawTrackerHits</rawTrackerHitOutputCollectionName>
             <debug>false</debug>
         </driver>
         <driver name="HelicalTrackHitDriver" type="org.hps.recon.tracking.HelicalTrackHitDriver">
             <debug>false</debug>
             <maxSeperation>20.0</maxSeperation>
             <tolerance>1.0</tolerance>
-            <saveAxialHits>true</saveAxialHits>
+            <saveAxialHits>false</saveAxialHits>
         </driver>
         <driver name="TrackerReconDriver" type="org.hps.recon.tracking.TrackerReconDriver">
             <debug>false</debug>
@@ -58,28 +92,41 @@
             <runNumber>${runNumber}</runNumber>
             <overwriteDB>false</overwriteDB>
         </driver>
-        <driver name="TrackingMonitoring" type="org.hps.analysis.dataquality.TrackingMonitoring">
-            <runNumber>${runNumber}</runNumber>
+       <driver name="TrackingMonitoring" type="org.hps.analysis.dataquality.TrackingMonitoring">
+            <trackCollectionName>MatchedTracks</trackCollectionName>
+             <runNumber>${runNumber}</runNumber>
             <overwriteDB>false</overwriteDB>
-        </driver>
-        <driver name="TrackingResiduals" type="org.hps.analysis.dataquality.TrackingResiduals">
-            <runNumber>${runNumber}</runNumber>
+       </driver>
+  <driver name="TrackingResiduals" type="org.hps.analysis.dataquality.TrackingResiduals">           
+             <runNumber>${runNumber}</runNumber>
             <overwriteDB>false</overwriteDB>
         </driver>
         <driver name="FinalStateMonitoring" type="org.hps.analysis.dataquality.FinalStateMonitoring">
             <runNumber>${runNumber}</runNumber>
             <overwriteDB>false</overwriteDB>
-        </driver>
-        <driver name="TrackMCEfficiency" type="org.hps.analysis.dataquality.TrackMCEfficiency">
+             <debug>false</debug>   
+       </driver>    
+      <driver name="V0Monitoring" type="org.hps.analysis.dataquality.V0Monitoring">
+              <runNumber>${runNumber}</runNumber>
             <overwriteDB>false</overwriteDB>
         </driver>
         <driver name="SVTHitMCEfficiency" type="org.hps.analysis.dataquality.SVTHitMCEfficiency">
             <overwriteDB>false</overwriteDB>
             <printDQMStrings>false</printDQMStrings>
+       </driver>     
+
+      <driver name="TrackMCEfficiency" type="org.hps.analysis.dataquality.TrackMCEfficiency">
+            <overwriteDB>false</overwriteDB>
+            <debug>true</debug>
+            <debugTrackEfficiency>true</debugTrackEfficiency>
+           </driver> 
+     <driver name="AidaSaveDriver" type="org.lcsim.job.AidaSaveDriver">
+                 <outputFileName>./HPSTracker2014-v0-ap75mev.root</outputFileName>
+        </driver>  
+     <driver name="ReconParticle" type="org.hps.recon.particle.HpsReconParticleDriver">
+            <debug>false</debug>
         </driver>
-        <driver name="AidaSaveDriver" type="org.lcsim.job.AidaSaveDriver">
-            <outputFileName>./straight-tracks.root</outputFileName>
-        </driver>
-        <driver name="CleanupDriver" type="org.lcsim.recon.tracking.digitization.sisim.config.ReadoutCleanupDriver" />
+       <driver name="CleanupDriver" type="org.lcsim.recon.tracking.digitization.sisim.config.ReadoutCleanupDriver"/>                                   
+
     </drivers>
 </lcsim>