Commit in hps-java/src/main on MAIN
java/org/lcsim/hps/users/mgraham/HitTimePlotter.java+487added 1.1
                                /DetailedAnalysisDriver.java+158-781.7 -> 1.8
                                /MainJASDriver.java+23-121.6 -> 1.7
resources/org/lcsim/hps/steering/users/mgraham/HitTimeStudies.lcsim+65added 1.1
java/org/lcsim/hps/recon/tracking/HPSRawTrackerHitFitterDriver.java+7-11.16 -> 1.17
                                 /HPSSVTCalibrationConstants.java+256-881.23 -> 1.24
                                 /HelicalTrackHitDriver.java+126-1011.1 -> 1.2
+1122-280
2 added + 5 modified, total 7 files
Added svt t0 shift correction and t0 cut implementation.

hps-java/src/main/java/org/lcsim/hps/users/mgraham
HitTimePlotter.java added at 1.1
diff -N HitTimePlotter.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ HitTimePlotter.java	11 Apr 2013 19:16:05 -0000	1.1
@@ -0,0 +1,487 @@
+package org.lcsim.hps.users.mgraham;
+
+import hep.aida.*;
+import hep.physics.vec.Hep3Vector;
+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.detector.identifier.IIdentifier;
+import org.lcsim.detector.identifier.IIdentifierHelper;
+import org.lcsim.detector.tracker.silicon.SiSensor;
+import org.lcsim.event.*;
+import org.lcsim.event.base.BaseTrack;
+import org.lcsim.fit.helicaltrack.HelicalTrackFit;
+import org.lcsim.fit.helicaltrack.HelicalTrackHit;
+import org.lcsim.geometry.Detector;
+import org.lcsim.hps.monitoring.AIDAFrame;
+import org.lcsim.hps.monitoring.Resettable;
+import org.lcsim.hps.readout.ecal.ReadoutTimestamp;
+import org.lcsim.hps.recon.tracking.HPSSVTCalibrationConstants;
+import org.lcsim.hps.recon.tracking.HPSTrack;
+import org.lcsim.hps.recon.vertexing.HelixConverter;
+import org.lcsim.hps.recon.vertexing.StraightLineTrack;
+import org.lcsim.recon.tracking.seedtracker.SeedCandidate;
+import org.lcsim.recon.tracking.seedtracker.SeedTrack;
+import org.lcsim.util.Driver;
+import org.lcsim.util.aida.AIDA;
+
+/**
+ *
+ * @author mgraham
+ */
+public class HitTimePlotter extends Driver implements Resettable {
+
+    private AIDAFrame plotterFrame;
+    private AIDA aida = AIDA.defaultInstance();
+    IPlotter plotter;
+    IPlotter plotter2;
+    IPlotter plotter3;
+    IPlotter plotter4;
+    IPlotter plotter5;
+    IPlotter plotter6;
+    IPlotter plotter7;
+    IAnalysisFactory fac = aida.analysisFactory();
+    private String trackCollectionName = "MatchedTracks";
+    private String outputPlots = null;
+    private Map<String, Integer> sensorRegionMap;
+    private String trackerName = "Tracker";
+    private List<SiSensor> sensors;
+
+    protected void detectorChanged(Detector detector) {
+        aida.tree().cd("/");
+        plotterFrame = new AIDAFrame();
+        plotterFrame.setTitle("HPS Tracking Plots");
+        sensors = detector.getSubdetector(trackerName).getDetectorElement().findDescendants(SiSensor.class);
+        sensorRegionMap = new HashMap<String, Integer>();
+        for (SiSensor sensor : sensors) {
+            int region = computePlotterRegion(sensor);
+            sensorRegionMap.put(sensor.getName(), region);
+        }
+
+        plotter = fac.createPlotterFactory().create("HPS Tracking Plots");
+        plotter.setTitle("Hit Times");
+        IPlotterStyle style = plotter.style();
+        style.dataStyle().fillStyle().setColor("yellow");
+        style.dataStyle().errorBarStyle().setVisible(false);
+        plotter.createRegions(3, 2);
+        plotterFrame.addPlotter(plotter);
+
+        IHistogram1D ecalHT = aida.histogram1D("ECAL Hit Time", 100, 0, 400);
+        IHistogram1D svtHT = aida.histogram1D("SVT Hit Time", 125, -50, 75);
+        IHistogram1D svtHTCorrected = aida.histogram1D("Trigger Corrected SVT Hit Time", 120, -240, -120);
+        IHistogram1D svtHTModCorrected = aida.histogram1D("Module Corrected SVT Hit Time", 120, -50, 70);
+        IHistogram1D svtHTCorrectedZoom = aida.histogram1D("Trigger Corrected SVT Hit Time Zoom", 80, -206, -166);
+        IHistogram1D svtHTModCorrectedZoom = aida.histogram1D("Module Corrected SVT Hit Time Zoom", 80, -20, 20);
+        plotter.region(0).plot(ecalHT);
+        plotter.region(1).plot(svtHT);
+        plotter.region(2).plot(svtHTCorrected);
+        plotter.region(3).plot(svtHTModCorrected);
+            plotter.region(4).plot(svtHTCorrectedZoom);
+        plotter.region(5).plot(svtHTModCorrectedZoom);
+        /*
+         * plotter.setTitle("Momentum"); IPlotterStyle style = plotter.style();
+         * style.dataStyle().fillStyle().setColor("yellow");
+         * style.dataStyle().errorBarStyle().setVisible(false);
+         * plotter.createRegions(2, 3); plotterFrame.addPlotter(plotter);
+         *
+         * IHistogram1D trkPx = aida.histogram1D("Track Momentum (Px)", 25,
+         * -0.25, 0.25); IHistogram1D trkPy = aida.histogram1D("Track Momentum
+         * (Py)", 25, -0.1, 0.1); IHistogram1D trkPz = aida.histogram1D("Track
+         * Momentum (Pz)", 25, 0, 3.5); IHistogram1D trkChi2 =
+         * aida.histogram1D("Track Chi2", 25, 0, 25.0); IHistogram1D xAtConvert
+         * = aida.histogram1D("X (mm) @ Converter", 50, -50, 50); IHistogram1D
+         * yAtConvert = aida.histogram1D("Y (mm) @ Converter", 50, -20, 20);
+         * plotter.region(0).plot(trkPx); plotter.region(1).plot(trkPy);
+         * plotter.region(2).plot(trkPz); plotter.region(3).plot(trkChi2);
+         * plotter.region(4).plot(xAtConvert);
+         * plotter.region(5).plot(yAtConvert);
+         */
+
+        plotter2 = fac.createPlotterFactory().create("HPS Tracking Plots");
+        plotter2.setTitle("Inner Tracker");
+        IPlotterStyle style2 = plotter2.style();
+        style2.dataStyle().fillStyle().setColor("yellow");
+        style2.dataStyle().errorBarStyle().setVisible(false);
+        plotter2.createRegions(6, 2);
+        plotterFrame.addPlotter(plotter2);
+
+        plotter3 = fac.createPlotterFactory().create("HPS Tracking Plots");
+        plotter3.setTitle("Outer Tracker");
+        plotter3.setStyle(style2);
+        plotter3.createRegions(6, 4);
+        plotterFrame.addPlotter(plotter3);
+
+        plotter4 = fac.createPlotterFactory().create("HPS Tracking Plots");
+        plotter4.setTitle("Corrected Times:  Inner Tracker");
+        IPlotterStyle style4 = plotter4.style();
+        style4.dataStyle().fillStyle().setColor("yellow");
+        style4.dataStyle().errorBarStyle().setVisible(false);
+        plotter4.createRegions(6, 2);
+        plotterFrame.addPlotter(plotter4);
+
+        plotter5 = fac.createPlotterFactory().create("HPS Tracking Plots");
+        plotter5.setTitle("Outer Tracker");
+        plotter5.setStyle(style2);
+        plotter5.createRegions(6, 4);
+        plotterFrame.addPlotter(plotter5);
+
+
+        int region = 0;
+        for (SiSensor sensor : sensors) {
+            IHistogram1D svtTimePlot = aida.histogram1D(sensor.getName() + "_Time", 60, -200, -170);
+            IHistogram1D svtCorTimePlot = aida.histogram1D(sensor.getName() + "_CorrectedTime", 100, -100, 100);
+//            int region = sensorRegionMap.get(sensor.getName());  // this doesn't work anymore...
+            IIdentifierHelper helper = sensor.getIdentifierHelper();
+            IIdentifier id = sensor.getIdentifier();
+
+            int layer = helper.getValue(id, "layer"); // 1-12; axial layers are odd layers; stereo layers are even
+            int module = helper.getValue(id, "module");
+
+            svtTimePlot.setTitle("Layer " + layer + " Module " + module);
+            if (region < 12) {
+                plotter2.region(region).plot(svtTimePlot);
+                plotter4.region(region).plot(svtCorTimePlot);
+                region++;
+            } else {
+                plotter3.region(region - 12).plot(svtTimePlot);
+                plotter5.region(region - 12).plot(svtCorTimePlot);
+                region++;
+            }
+        }
+
+
+        plotter6 = fac.createPlotterFactory().create("HPS Tracking Plots");
+        plotter6.setTitle("Tracks");
+        plotter6.setStyle(style2);
+        plotter6.createRegions(2, 2);
+        plotterFrame.addPlotter(plotter6);
+        IHistogram1D px = aida.histogram1D("Track Momentum(Px)", 50, -0.2, 0.2);
+        IHistogram1D py = aida.histogram1D("Track Momentum(Py)", 50, -0.2, 0.2);
+        IHistogram1D pz = aida.histogram1D("Track Momentum(Pz)", 50, 0, 2.2);
+        IHistogram1D chi2 = aida.histogram1D("TrackChi2", 50, 0, 25);
+        plotter6.region(0).plot(px);
+        plotter6.region(1).plot(py);
+        plotter6.region(2).plot(pz);
+        plotter6.region(3).plot(chi2);
+
+
+        plotter7 = fac.createPlotterFactory().create("HPS Tracking Plots");
+        plotter7.setTitle("Per Event");
+        plotter7.setStyle(style2);
+        plotter7.createRegions(2, 2);
+        plotterFrame.addPlotter(plotter7);
+
+        IHistogram1D nclus = aida.histogram1D("Strip Clusters per Event", 100, 0, 99);
+        IHistogram1D nhth = aida.histogram1D("Stereo Hits per Event", 100, 0, 99);
+        IHistogram1D ntrk = aida.histogram1D("Tracks per Event", 40, 0, 39);
+
+        plotter7.region(0).plot(nclus);
+        plotter7.region(1).plot(nhth);
+        plotter7.region(2).plot(ntrk);
+
+
+
+        plotterFrame.pack();
+        plotterFrame.setVisible(true);
+    }
+
+    public void process(EventHeader event) {
+        aida.tree().cd("/");
+
+        List<TrackerHit> trackerHits = event.get(TrackerHit.class, "StripClusterer_SiTrackerHitStrip1D");
+        List<CalorimeterHit> ecalHits = event.get(CalorimeterHit.class, "EcalCalHits");
+
+
+        List<HelicalTrackHit> hth = event.get(HelicalTrackHit.class, "HelicalTrackHits");
+        //        System.out.println("Event with ECal timestamp " + ReadoutTimestamp.getTimestamp(ReadoutTimestamp.SYSTEM_ECAL, event)
+//                + ", SVT timestamp " + ReadoutTimestamp.getTimestamp(ReadoutTimestamp.SYSTEM_TRACKER, event)
+//                + ", Trigger timestamp " + ReadoutTimestamp.getTimestamp(ReadoutTimestamp.SYSTEM_TRIGGER, event));
+        double t0Ecal = ReadoutTimestamp.getTimestamp(ReadoutTimestamp.SYSTEM_ECAL, event);
+        double t0Svt = ReadoutTimestamp.getTimestamp(ReadoutTimestamp.SYSTEM_TRACKER, event);
+        double t0Trig = ReadoutTimestamp.getTimestamp(ReadoutTimestamp.SYSTEM_TRIGGER, event);
+        for (CalorimeterHit hit : ecalHits) {
+            double cor = hit.getTime() + (t0Ecal - t0Trig);
+            aida.histogram1D("ECAL Hit Time").fill(hit.getTime());
+//            aida.histogram1D("Trigger Corrected ECAL Hit Time").fill(cor);
+//            System.out.println("Ecal: " + (hit.getTime()) + ";  Corrected = " + cor);
+        }
+        for (TrackerHit hit : trackerHits) {
+
+            IIdentifierHelper helper = ((RawTrackerHit) hit.getRawHits().get(0)).getIdentifierHelper();
+            IIdentifier id = ((RawTrackerHit) hit.getRawHits().get(0)).getIdentifier();
+            int layer = helper.getValue(id, "layer"); // 1-10; axial layers are odd layers; stereo layers are even
+            int module = helper.getValue(id, "module"); // 0-1; module number is top or bottom
+
+            String sensorName = ((RawTrackerHit) hit.getRawHits().get(0)).getDetectorElement().getName();
+            double cor = hit.getTime() + (t0Svt - t0Trig);
+            double corMod = cor - getT0Shift(layer, module);
+            aida.histogram1D("SVT Hit Time").fill(hit.getTime());
+            aida.histogram1D("Trigger Corrected SVT Hit Time").fill(cor);
+            aida.histogram1D("Module Corrected SVT Hit Time").fill(corMod);
+             aida.histogram1D("Trigger Corrected SVT Hit Time Zoom").fill(cor);
+            aida.histogram1D("Module Corrected SVT Hit Time Zoom").fill(corMod);
+            aida.histogram1D(sensorName + "_Time").fill(cor);
+            aida.histogram1D(sensorName + "_CorrectedTime").fill(corMod);
+
+            //System.out.println("Svt: " + (hit.getTime()) + ";  Corrected = " + cor+";  Module Corrected = " + corMod);
+        }
+        if (!event.hasCollection(Track.class, trackCollectionName)) {
+            return;
+        }
+        List<Track> tracks = event.get(Track.class, trackCollectionName);
+
+        for (Track trk : tracks) {
+            aida.histogram1D("Track Momentum(Px)").fill(trk.getPY());
+            aida.histogram1D("Track Momentum(Py)").fill(trk.getPZ());
+            aida.histogram1D("Track Momentum(Pz)").fill(trk.getPX());
+            aida.histogram1D("TrackChi2").fill(trk.getChi2());
+        }
+
+        aida.histogram1D("Strip Clusters per Event").fill(trackerHits.size());
+        aida.histogram1D("Stereo Hits per Event").fill(hth.size());
+        aida.histogram1D("Tracks per Event").fill(tracks.size());
+
+    }
+
+    private int computePlotterRegion(SiSensor sensor) {
+
+        IIdentifierHelper helper = sensor.getIdentifierHelper();
+        IIdentifier id = sensor.getIdentifier();
+
+        int layer = helper.getValue(id, "layer"); // 1-12; axial layers are odd layers; stereo layers are even
+        int module = helper.getValue(id, "module"); // 0-1; module number is top (evens) or bottom (odds)
+        int region = -99;
+        // Compute the sensor's x and y grid coordinates and then translate to region number.
+        int ix, iy;
+        if (layer < 7) {
+            ix = (layer - 1) / 2;
+            iy = 0;
+            if (module > 0) {
+                iy += 2;
+            }
+            if (layer % 2 == 0) {
+                iy += 1;
+            }
+            region = ix * 2 + iy;
+        } else {
+            ix = (layer - 7) / 2;
+            iy = module;
+
+            region = ix * 4 + iy;
+            region += 100;
+        }
+        System.out.println(sensor.getName() + "; lyr=" + layer + "; mod=" + module + " -> xy[" + ix + "][" + iy + "] -> reg=" + region);
+
+        return region;
+    }
+
+    @Override
+    public void reset() {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    public void setOutputPlots(String output) {
+        this.outputPlots = output;
+    }
+
+    public void endOfData() {
+        System.out.println("Output");
+        IFitFactory fitFactory = fac.createFitFactory();
+        IFitter fitter = fitFactory.createFitter("chi2");
+
+        for (SiSensor sensor : sensors) {
+            IHistogram1D svtTimePlot = aida.histogram1D(sensor.getName() + "_Time", 150, -250, -100);
+            IHistogram1D svtCorTimePlot = aida.histogram1D(sensor.getName() + "_CorrectedTime", 100, -100, 100);
+//            int region = sensorRegionMap.get(sensor.getName());  // this doesn't work anymore...
+            IIdentifierHelper helper = sensor.getIdentifierHelper();
+            IIdentifier id = sensor.getIdentifier();
+
+            int layer = helper.getValue(id, "layer"); // 1-12; axial layers are odd layers; stereo layers are even
+            int module = helper.getValue(id, "module");
+            IHistogram1D hist = aida.histogram1D(sensor.getName() + "_Time");
+            System.out.println("Number of entries = " + hist.allEntries());
+            IFitResult result = fitter.fit(hist, "g");
+
+//            System.out.println(sensor.getName() + " Peak Position = " + getPeakPosition(aida.histogram1D(sensor.getName() + "_Time")));
+            System.out.println(sensor.getName() + " " + result.fittedParameterNames()[0] + " = " + result.fittedParameters()[0] + " +/- " + result.errors()[0]);
+            System.out.println(sensor.getName() + " " + result.fittedParameterNames()[1] + " = " + result.fittedParameters()[1] + " +/- " + result.errors()[1]);
+            System.out.println(sensor.getName() + " " + result.fittedParameterNames()[2] + " = " + result.fittedParameters()[2] + " +/- " + result.errors()[2]);
+
+        }
+        
+          IHistogram1D hist = aida.histogram1D("Trigger Corrected SVT Hit Time Zoom");
+           System.out.println("Number of entries = " + hist.allEntries());
+            IFitResult result = fitter.fit(hist, "g");
+
+//            System.out.println(sensor.getName() + " Peak Position = " + getPeakPosition(aida.histogram1D(sensor.getName() + "_Time")));
+            System.out.println("Trigger Corrected SVT Hit Time Zoom "  + result.fittedParameterNames()[0] + " = " + result.fittedParameters()[0] + " +/- " + result.errors()[0]);
+            System.out.println("Trigger Corrected SVT Hit Time Zoom "  + result.fittedParameterNames()[1] + " = " + result.fittedParameters()[1] + " +/- " + result.errors()[1]);
+            System.out.println("Trigger Corrected SVT Hit Time Zoom "  + result.fittedParameterNames()[2] + " = " + result.fittedParameters()[2] + " +/- " + result.errors()[2]);
+
+           hist = aida.histogram1D("Module Corrected SVT Hit Time Zoom");
+           System.out.println("Number of entries = " + hist.allEntries());
+             result = fitter.fit(hist, "g");
+
+//            System.out.println(sensor.getName() + " Peak Position = " + getPeakPosition(aida.histogram1D(sensor.getName() + "_Time")));
+            System.out.println("Module Corrected SVT Hit Time Zoom "  + result.fittedParameterNames()[0] + " = " + result.fittedParameters()[0] + " +/- " + result.errors()[0]);
+            System.out.println("Module Corrected SVT Hit Time Zoom "  + result.fittedParameterNames()[1] + " = " + result.fittedParameters()[1] + " +/- " + result.errors()[1]);
+            System.out.println("Module Corrected SVT Hit Time Zoom "  + result.fittedParameterNames()[2] + " = " + result.fittedParameters()[2] + " +/- " + result.errors()[2]);
+
+        
+        if (outputPlots != null) {
+            try {
+                aida.saveAs(outputPlots);
+            } catch (IOException ex) {
+                Logger.getLogger(HitTimePlotter.class.getName()).log(Level.SEVERE, null, ex);
+            }
+        }
+    }
+
+    private double getPeakPosition(IHistogram1D hist) {
+        int nbins = hist.axis().bins();
+        int maxBin = -99;
+        int max = -99;
+        for (int i = 0; i < nbins; i++) {
+            if (hist.binEntries(i) > max) {
+                maxBin = i;
+                max = hist.binEntries(i);
+            }
+        }
+        return hist.binMean(maxBin);
+
+    }
+
+    private double getT0Shift(int layer, int module) {
+        double value = 0;
+        switch (module) {
+            case 0:
+                switch (layer) {
+                    case 1:
+                        value = -186.1;
+                        break;
+                    case 2:
+                        value = -186.1;
+                        break;
+                    case 3:
+                        value = -185.8;
+                        break;
+                    case 4:
+                        value = -185.9;
+                        break;
+                    case 5:
+                        value = -185.8;
+                        break;
+                    case 6:
+                        value = -185.8;
+                        break;
+                    case 7:
+                        value = -185.8;
+                        break;
+                    case 8:
+                        value = -185.9;
+                        break;
+                    case 9:
+                        value = -185.8;
+                        break;
+                    case 10:
+                        value = -185.8;
+                        break;
+                    case 11:
+                        value = -185.6;
+                        break;
+                    case 12:
+                        value = -186.0;
+                        break;
+                }
+                break;
+            case 1:
+                switch (layer) {
+                    case 1:
+                        value = -185.6;
+                        break;
+                    case 2:
+                        value = -185.3;
+                        break;
+                    case 3:
+                        value = -185.9;
+                        break;
+                    case 4:
+                        value = -185.7;
+                        break;
+                    case 5:
+                        value = -185.6;
+                        break;
+                    case 6:
+                        value = -185.9;
+                        break;
+                    case 7:
+                        value = -185.8;
+                        break;
+                    case 8:
+                        value = -186.1;
+                        break;
+                    case 9:
+                        value = -186.0;
+                        break;
+                    case 10:
+                        value = -185.9;
+                        break;
+                    case 11:
+                        value = -185.9;
+                        break;
+                    case 12:
+                        value = -186.1;
+                        break;
+                }
+                break;
+            case 2:
+                switch (layer) {
+                    case 7:
+                        value = -185.7;
+                        break;
+                    case 8:
+                        value = -185.7;
+                        break;
+                    case 9:
+                        value = -185.9;
+                        break;
+                    case 10:
+                        value = -186.0;
+                        break;
+                    case 11:
+                        value = -185.8;
+                        break;
+                    case 12:
+                        value = -185.9;
+                        break;
+                }
+                break;
+            case 3:
+                switch (layer) {
+                    case 7:
+                        value = -185.5;
+                        break;
+                    case 8:
+                        value = -185.6;
+                        break;
+                    case 9:
+                        value = -185.5;
+                        break;
+                    case 10:
+                        value = -185.5;
+                        break;
+                    case 11:
+                        value = -186.6;
+                        break;
+                    case 12:
+                        value = -186.7;
+                        break;
+                }
+                break;
+        }
+        return value;
+    }
+}

hps-java/src/main/java/org/lcsim/hps/users/mgraham
DetailedAnalysisDriver.java 1.7 -> 1.8
diff -u -r1.7 -r1.8
--- DetailedAnalysisDriver.java	9 Apr 2013 22:03:05 -0000	1.7
+++ DetailedAnalysisDriver.java	11 Apr 2013 19:16:05 -0000	1.8
@@ -56,8 +56,8 @@
 import org.lcsim.util.aida.AIDA;
 
 /**
-
- @author mgraham
+ *
+ * @author mgraham
  */
 public class DetailedAnalysisDriver extends Driver {
 
@@ -125,7 +125,7 @@
     PrintWriter pw;
     double[] beamsize = {0.001, 0.02, 0.02};
     int flipsign = 1;
-
+    public String _rawHitsName="SVTRawTrackerHits";
     public DetailedAnalysisDriver(int layers) {
 //        nlayers[0] = layers;
         //  Define the efficiency histograms
@@ -146,14 +146,14 @@
         d0effElectrons = hf.createProfile1D("Electrons Efficiency vs d0", "", 20, -1., 1.);
         z0effElectrons = hf.createProfile1D("Electrons Efficiency vs z0", "", 20, -1., 1.);
         /*
-         peffAxial = hf.createProfile1D("Axial Efficiency vs p", "", 20, 0.,
-         beamP); thetaeffAxial = hf.createProfile1D("Axial Efficiency vs theta",
-         "", 20, 80, 100); phieffAxial = hf.createProfile1D("Axial Efficiency vs
-         phi", "", 25, -0.25, 0.25); ctheffAxial = hf.createProfile1D("Axial
-         Efficiency vs cos(theta)", "", 25, -0.25, 0.25); d0effAxial =
-         hf.createProfile1D("Axial Efficiency vs d0", "", 20, -1., 1.);
-         z0effAxial = hf.createProfile1D("Axial Efficiency vs z0", "", 20, -1.,
-         1.);
+         * peffAxial = hf.createProfile1D("Axial Efficiency vs p", "", 20, 0.,
+         * beamP); thetaeffAxial = hf.createProfile1D("Axial Efficiency vs
+         * theta", "", 20, 80, 100); phieffAxial = hf.createProfile1D("Axial
+         * Efficiency vs phi", "", 25, -0.25, 0.25); ctheffAxial =
+         * hf.createProfile1D("Axial Efficiency vs cos(theta)", "", 25, -0.25,
+         * 0.25); d0effAxial = hf.createProfile1D("Axial Efficiency vs d0", "",
+         * 20, -1., 1.); z0effAxial = hf.createProfile1D("Axial Efficiency vs
+         * z0", "", 20, -1., 1.);
          */
         cthfake = hf.createProfile1D("Fake rate vs  cos(theta)", "", 25, -0.25, 0.25);
         phifake = hf.createProfile1D("Fake rate vs phi", "", 25, -0.25, 0.25);
@@ -179,13 +179,14 @@
         VzEffFindable = hf.createProfile1D("Aprime Efficiency vs Vz: Findable", "", 40, -0.2, 0.2);
 
         int i, j;
-        for (i = 0; i < 1; i++)
+        for (i = 0; i < 1; i++) {
             for (j = 0; j < nlayers[i]; j++) {
                 int laynum = j + 1;
                 String profname = detNames[i] + "_layer" + laynum + " cluster size vs y";
                 String key = detNames[i] + "_layer" + laynum;
                 clsizeMap.put(key, hf.createProfile1D(profname, 20, -15, 15));
             }
+        }
     }
 
     @Override
@@ -196,10 +197,14 @@
         System.out.println("Setting nlayers to " + nlayers[0]);
     }
 
+    public void setRawHitsName(String rhname){
+        _rawHitsName=rhname;
+    }
+    
     @Override
     public void process(
             EventHeader event) {
-        if (nevt == 0)
+        if (nevt == 0) {
             try {
 //open things up
                 fw = new FileWriter(outputTextName);
@@ -207,6 +212,7 @@
             } catch (IOException ex) {
                 Logger.getLogger(DetailedAnalysisDriver.class.getName()).log(Level.SEVERE, null, ex);
             }
+        }
         //  Increment the event counter
         nevt++;
         String resDir = "residualsPlots/";
@@ -224,9 +230,20 @@
             flipsign = -1;
         }
 
-        List<RawTrackerHit> rawHits = event.get(RawTrackerHit.class, "RawTrackerHitMaker_RawTrackerHits");
+        List<RawTrackerHit> rawHits = event.get(RawTrackerHit.class, _rawHitsName);
         List<SiTrackerHitStrip1D> stripHits = event.get(SiTrackerHitStrip1D.class, "StripClusterer_SiTrackerHitStrip1D");
-        // dump SThit information
+        //for (SiTrackerHitStrip1D cluster : stripHits) {
+        //    Hep3Vector measPos = cluster.getPositionAsVector();
+        //    double measdedx = cluster.getdEdx() * 1000.0;
+        //    Set<SimTrackerHit> SthFromRth = cluster.getSimHits();
+        //    if (SthFromRth.size() > 0) {
+        //        Hep3Vector mcPos = SthFromRth.iterator()
+                //then do somthing with mcPos & measPos...
+        //    }            
+        //}
+        System.out.println("RawHits Size = "+rawHits.size());
+        
+   // dump SThit information      
         String[] input_hit_collections = {"TrackerHits"};
         for (String input : input_hit_collections) {
             List<SimTrackerHit> sthits = event.getSimTrackerHits(input);
@@ -243,10 +260,12 @@
                 nhits[layer]++;
                 double hitwgt = 0;
                 double clhitwgt = 0;
+                
                 for (RawTrackerHit rth : rawHits) {
                     List<SimTrackerHit> SthFromRth = rth.getSimTrackerHits();
-                    if (SthFromRth.contains(st))
+                    if (SthFromRth!=null &&SthFromRth.contains(st)) {
                         hitwgt = 1.0;
+                    }
                 }
                 for (SiTrackerHitStrip1D cluster : stripHits) {
                     double measdedx = cluster.getdEdx() * 1000.0;
@@ -255,11 +274,12 @@
 
                     for (RawTrackerHit rth : RthFromSith) {
                         List<SimTrackerHit> SthFromRth = rth.getSimTrackerHits();
-                        if (SthFromRth.contains(st)) {
+                        if (SthFromRth!=null &&SthFromRth.contains(st)) {
                             clhitwgt = 1.0;
                             double totdedx = 0;
-                            for (SimTrackerHit sthtemp : SthFromRth)
+                            for (SimTrackerHit sthtemp : SthFromRth) {
                                 totdedx = totdedx + sthtemp.getdEdx() * 1000.0;
+                            }
                             aida.histogram1D(simDir + "delta dEdX", 50, -0.2, 0.2).fill(measdedx - totdedx);
                             aida.histogram1D(simDir + "fractional dEdX", 50, -1, 1.).fill((measdedx - totdedx) / totdedx);
                             aida.cloud1D(simDir + "fractional dEdX Cloud").fill((measdedx - totdedx) / totdedx);
@@ -290,8 +310,9 @@
             }
             int i = 0;
             while (i < nlayers[0]) {
-                if (nhits[i] > 0)
+                if (nhits[i] > 0) {
                     aida.cloud1D(simDir + input + "layer " + i + " number of ST hits").fill(nhits[i]);
+                }
                 i++;
             }
         }
@@ -315,19 +336,22 @@
             String rhDetName = rhDetE.getName();
             int rhLayer = rh.getLayerNumber();
 
-            for (String myname : detNames)
+            for (String myname : detNames) {
                 if (rhDetName.contains(myname)) {
                     String detlayer = myname + "_" + rhLayer;
                     Integer myint = occupancyMap.get(detlayer);
-                    if (myint == null)
+                    if (myint == null) {
                         myint = 1;
+                    }
                     myint++;
                     occupancyMap.put(detlayer, myint);
                 }
+            }
         }
         Set<String> mykeyset = (Set<String>) occupancyMap.keySet();
-        for (String keys : mykeyset)
+        for (String keys : mykeyset) {
             aida.cloud1D(occDir + keys + " # of hits").fill(occupancyMap.get(keys));
+        }
 
         for (SiTrackerHitStrip1D stripCluster : stripHits) {
             Hep3Vector strCluPos = stripCluster.getPositionAsVector();
@@ -343,14 +367,17 @@
             String detlayer = "Foobar";
             Hep3Vector sthPos = new BasicHep3Vector();
             for (RawTrackerHit rth : rthList) {
-                if (rth.getSimTrackerHits().size() > 0)
+                if (rth.getSimTrackerHits().size() > 0) {
                     sthPos = rth.getSimTrackerHits().get(0).getPositionVec();
+                }
                 IDetectorElement rhDetE = rth.getDetectorElement();
                 String rhDetName = rhDetE.getName();
                 int rhLayer = rth.getLayerNumber();
-                for (String myname : detNames)
-                    if (rhDetName.contains(myname))
+                for (String myname : detNames) {
+                    if (rhDetName.contains(myname)) {
                         detlayer = myname + "_layer" + rhLayer;
+                    }
+                }
             }
             Hep3Vector resid = VecOp.sub(strCluPos, sthPos);
             double magResid = resid.magnitude();
@@ -364,9 +391,11 @@
         // List<LCRelation> mcrelations = event.get(LCRelation.class, "HelicalTrackMCRelations");
         List<LCRelation> mcrelations = event.get(LCRelation.class, "RotatedHelicalTrackMCRelations");
 
-        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());
+            }
+        }
 
 //        RelationalTable hittomcAxial = new BaseRelationalTable(RelationalTable.Mode.MANY_TO_MANY, RelationalTable.Weighting.UNWEIGHTED);
 ////        List<LCRelation> mcrelations = event.get(LCRelation.class, "HelicalTrackMCRelations");
@@ -402,10 +431,13 @@
         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());
+                }
+            }
+        }
 
         Map<Track, TrackAnalysis> tkanalMap = new HashMap<Track, TrackAnalysis>();
         RelationalTable nearestHitToTrack = new BaseRelationalTable(RelationalTable.Mode.MANY_TO_MANY, RelationalTable.Weighting.UNWEIGHTED);
@@ -433,10 +465,12 @@
             double slopeErr = Math.sqrt(track.getErrorMatrix().e(HelicalTrackFit.slopeIndex, HelicalTrackFit.slopeIndex));
             double curveErr = Math.sqrt(track.getErrorMatrix().e(HelicalTrackFit.curvatureIndex, HelicalTrackFit.curvatureIndex));
             _nchRec++;
-            if (track.getCharge() * flipsign < 0)
+            if (track.getCharge() * flipsign < 0) {
                 _neleRec++;
-            if (track.getCharge() * flipsign > 0)
+            }
+            if (track.getCharge() * flipsign > 0) {
                 _nposRec++;
+            }
 
             SeedTrack stEle = (SeedTrack) track;
             SeedCandidate seedEle = stEle.getSeedCandidate();
@@ -489,20 +523,24 @@
             //  aida.cloud1D(trackdir + "Number of Axial hits for all tracks").fill(nAxial);
             aida.cloud1D(trackdir + "Number of Z hits for all tracks").fill(nZ);
 
-            for (Integer bhit : badLayers)
+            for (Integer bhit : badLayers) {
                 aida.histogram1D(trackdir + "Layer of Bad Hit", nlayers[0], 1, nlayers[0] + 1).fill(bhit);
+            }
 
             //  Generate a normalized histogram after 1000 events
             trk_count++;
-            if (nevt <= 1000)
+            if (nevt <= 1000) {
                 fakes.fill(nbad);
+            }
 
             //  Make plots for fake, non-fake, and all tracks
             if (purity < 0.5) {
-                if (track.getCharge() * flipsign < 0)
+                if (track.getCharge() * flipsign < 0) {
                     _neleFake++;
-                if (track.getCharge() * flipsign > 0)
+                }
+                if (track.getCharge() * flipsign > 0) {
                     _nposFake++;
+                }
                 cthfake.fill(cth, 1.0);
                 phifake.fill(phi, 1.0);
                 pfake.fill(p, 1.0);
@@ -510,10 +548,12 @@
                 fillTrackInfo(trackdir, "fake tracks", track.getChi2(), nhits, p, pperp, px, py, pz, phi, cth, d0, xoca, yoca, z0);
 
             } else {
-                if (track.getCharge() * flipsign < 0)
+                if (track.getCharge() * flipsign < 0) {
                     _neleTru++;
-                if (track.getCharge() * flipsign > 0)
+                }
+                if (track.getCharge() * flipsign > 0) {
                     _nposTru++;
+                }
                 cthfake.fill(cth, 0.0);
                 phifake.fill(phi, 0.0);
                 pfake.fill(p, 0.0);
@@ -524,8 +564,9 @@
 
             }
             fillTrackInfo(trackdir, "all tracks", track.getChi2(), nhits, p, pperp, px, py, pz, phi, cth, d0, xoca, yoca, z0);
-            if (nbadZ == 3)
+            if (nbadZ == 3) {
                 fillTrackInfo(trackdir, "3 Bad Z-hits", track.getChi2(), nhits, p, pperp, px, py, pz, phi, cth, d0, xoca, yoca, z0);
+            }
 
 //            System.out.println("Track info :");
 //            System.out.println("\t charge = " + track.getCharge() * flipsign);
@@ -591,8 +632,9 @@
                 String tkresid = "TrackResiduals/";
 
                 int ndaug = 0;
-                if (bestmcp != null)
+                if (bestmcp != null) {
                     ndaug = bestmcp.getDaughters().size();
+                }
 
                 double mcmom = 0;
                 double prevmom = 0;
@@ -604,8 +646,9 @@
                     HelicalTrackHit htc = (HelicalTrackHit) hit;
                     List<MCParticle> mcpsHTH = htc.getMCParticles();
                     int isbad = 0;
-                    if (mcpsHTH.isEmpty() || mcpsHTH.size() > 1 || !mcpsHTH.contains(bestmcp))
+                    if (mcpsHTH.isEmpty() || mcpsHTH.size() > 1 || !mcpsHTH.contains(bestmcp)) {
                         isbad = 1;
+                    }
                     double sHit = ht.PathMap().get(htc);
                     Hep3Vector posonhelix = HelixUtils.PointOnHelix(ht, sHit);
                     double yTr = posonhelix.y();
@@ -623,8 +666,9 @@
                     mytotchi2 += Math.pow((z - zTr) / zerr, 2);
 
                     int htlayer = htc.Layer();
-                    if (htlayer == 1)
+                    if (htlayer == 1) {
                         l1DeltaZ.put(track, z - zTr);
+                    }
 
                     if (purity == 1 && track.getCharge() * flipsign > 0 && nhits == 10) {
                         if (clusterlist.get(0).rawhits().size() == 1 && clusterlist.get(1).rawhits().size() == 1) {
@@ -671,26 +715,32 @@
                         HelicalTrackStrip nearest = getNearestHit(cl, toththits);
                         if (layer == 1) {
                             Double l1Dist = getNearestDistance(cl, toththits);
-                            if (l1Dist != null)
+                            if (l1Dist != null) {
                                 l1Isolation.put(track, l1Dist);
+                            }
                         }
-                        if (nearest != null)
+                        if (nearest != null) {
                             nearestHitToTrack.add(track, nearest);
+                        }
 
                         int badCl = 0;
-                        if (mcps.isEmpty() || mcps.size() > 1 || !mcps.contains(bestmcp))
+                        if (mcps.isEmpty() || mcps.size() > 1 || !mcps.contains(bestmcp)) {
                             badCl = 1;
-                        if (badCl == 1)
+                        }
+                        if (badCl == 1) {
                             if (mcps.size() > 0 && mcps.get(0) != null) {
                                 MCParticle tmpmc = mcps.get(0);
                                 aida.cloud1D(hitdir + layer + " Momentum of bad hit ").fill(tmpmc.getMomentum().magnitude());
                                 aida.cloud1D(hitdir + layer + " PDGID of bad hit ").fill(tmpmc.getPDGID());
-                                for (MCParticle mymc : tmpmc.getParents())
+                                for (MCParticle mymc : tmpmc.getParents()) {
                                     aida.cloud1D(hitdir + layer + " PDGID of bad hit mother ").fill(mymc.getPDGID());
+                                }
                             }
+                        }
                         String label = "False hit";
-                        if (badCl == 0)
+                        if (badCl == 0) {
                             label = "True Hit ";
+                        }
 
                         SimTrackerHit mcbesthit;
                         Set<SimTrackerHit> mchitlist = mcHittomcP.allTo(bestmcp);
@@ -714,8 +764,9 @@
 
                         double axdotu = VecOp.dot(cl.u(), axial);
                         boolean isAxial = false;
-                        if (axdotu > 0.5)
+                        if (axdotu > 0.5) {
                             isAxial = true;
+                        }
 //                    aida.cloud2D(hitdir + layer + " y vs z " + label).fill(z, y);
                         if (isAxial) {
                             aida.cloud1D(hitdir + layer + " y " + label).fill(clvec.y());
@@ -742,8 +793,9 @@
             double wgt = 1. / trk_count;
             for (int i = 0; i < 10; i++) {
                 System.out.println(" Entries: " + fakes.binEntries(i) + " for mismatches: " + i);
-                for (int j = 0; j < fakes.binHeight(i); j++)
+                for (int j = 0; j < fakes.binHeight(i); j++) {
                     nfakes.fill(i, wgt);
+                }
             }
             System.out.println("Normalization: " + nfakes.sumAllBinHeights() + " after ntrk = " + trk_count);
         }
@@ -789,8 +841,9 @@
                     for (RawTrackerHit rhit : rawhits) {
 
                         String deName = rhit.getDetectorElement().getName();
-                        if (deName.contains("sensor1"))
+                        if (deName.contains("sensor1")) {
                             stripdir = "stereo";
+                        }
                         //                           System.out.println("Layer number  " + rhit.getLayerNumber() + "  " + deName);
                         List<SimTrackerHit> sthits = rhit.getSimTrackerHits();
                         int nsthits = sthits.size();
@@ -809,14 +862,17 @@
                     //                        System.out.println("filling...");
                     if (umc != -999999) {
                         aida.histogram1D(debugDir + hit.Detector() + "dedx", 50, 0, 0.3).fill(charge);
-                        if (umc < 1 && umc > -1)
+                        if (umc < 1 && umc > -1) {
                             aida.cloud2D(debugDir + hit.Detector() + "cluster reco vs cluster mc").fill(umeas - umc, umc);
+                        }
                         aida.cloud2D(debugDir + hit.Detector() + "cluster vs STHit dedx").fill(stenergy, charge);
                         aida.cloud2D(debugDir + hit.Detector() + "cluster dedx vs delte(u)").fill(umeas - umc, charge);
-                        if (stripdir.contains("stereo"))
+                        if (stripdir.contains("stereo")) {
                             du_stereo = umeas - umc;
-                        if (stripdir.contains("axial"))
+                        }
+                        if (stripdir.contains("axial")) {
                             du_axial = umeas - umc;
+                        }
                         aida.histogram1D(debugDir + "layer=" + layer + " delta(u)", 50, -0.03, 0.03).fill(umeas - umc);
                         aida.histogram1D(debugDir + hit.Detector() + " delta(u)", 50, -0.03, 0.03).fill(umeas - umc);
                         if (nstrips == 1) {
@@ -850,8 +906,9 @@
             TrackAnalysis tkanal = tkanalMap.get(track);
             //  Calculate purity and make appropriate plots
             MCParticle mcp = tkanal.getMCParticleNew();
-            if (mcp == null)
+            if (mcp == null) {
                 continue;
+            }
             if (mcp.getParents().size() == 1 && mcp.getParents().get(0).getPDGID() == 622) {
                 int nhits = tkanal.getNHitsNew();
                 double px = track.getPX();
@@ -932,8 +989,9 @@
 
 
                     aida.cloud1D(apdir + "e+e- Invariant Mass").fill(invMassUC);
-                    if (eleMC != null && posMC != null && ele == eleID && pos == posID)
+                    if (eleMC != null && posMC != null && ele == eleID && pos == posID) {
                         aida.cloud1D(apdir + "Matched A' Invariant Mass").fill(invMassUC);
+                    }
 
 
                     BilliorVertexer bconvertexer = new BilliorVertexer(bfield);
@@ -1014,16 +1072,19 @@
                 //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.LayersHit(d) != nlayers[0])
 //                    if (!findable.InnerTrackerIsFindable(d, nlayers[0] - 2))
-                    if (!findable.InnerTrackerIsFindable(d, nlayers[0]))
+                    if (!findable.InnerTrackerIsFindable(d, nlayers[0])) {
                         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);
@@ -1039,12 +1100,14 @@
                 int nmulthits = 0;
                 for (Track trk : trklist) {
                     TrackAnalysis tkanal = tkanalMap.get(trk);
-                    if (tkanal.getNBadHits() < tkanal.getNHits() - 1)
+                    if (tkanal.getNBadHits() < tkanal.getNHits() - 1) {
                         nmulthits++;
+                    }
                 }
                 //  Flag any anomalous cases that we find
-                if (nmulthits > 1)
+                if (nmulthits > 1) {
                     System.out.println("2 tracks associated with a single MC Particle");
+                }
             }
 
 //            if (nhits == nlayers[0]) {
@@ -1052,8 +1115,9 @@
                 _nchMCP++;
                 findableTracks++;
                 double wgt = 0.;
-                if (ntrk > 0)
+                if (ntrk > 0) {
                     wgt = 1.;
+                }
                 foundTracks += wgt;
                 peffFindable.fill(p, wgt);
                 phieffFindable.fill(phi, wgt);
@@ -1083,8 +1147,9 @@
                 if (isFindable) {
                     findableelectrons++;
                     double wgt = 0.;
-                    if (ntrk > 0)
+                    if (ntrk > 0) {
                         wgt = 1.;
+                    }
                     foundelectrons += wgt;
                     peffElectrons.fill(p, wgt);
                     phieffElectrons.fill(phi, wgt);
@@ -1111,19 +1176,24 @@
 
             }
 
-            if (mcp.getGeneratorStatus() == mcp.FINAL_STATE && mcp.getCharge() != 0)
-                if (Math.abs(eta) < 6)
+            if (mcp.getGeneratorStatus() == mcp.FINAL_STATE && mcp.getCharge() != 0) {
+                if (Math.abs(eta) < 6) {
                     aida.cloud1D("findable/eta for final state particles").fill(eta);
-            if (mcp.getGeneratorStatus() != mcp.FINAL_STATE && mcp.getGeneratorStatus() != mcp.INTERMEDIATE)
-                if (Math.abs(eta) < 6)
+                }
+            }
+            if (mcp.getGeneratorStatus() != mcp.FINAL_STATE && mcp.getGeneratorStatus() != mcp.INTERMEDIATE) {
+                if (Math.abs(eta) < 6) {
                     aida.cloud1D("findable/eta for other particles").fill(eta);
+                }
+            }
             //  Select mcp that fail the final state requirement
             if (mcp.getGeneratorStatus() != mcp.FINAL_STATE) {
                 aida.cloud1D("findable/Hits for non-final state particles").fill(nhits);
                 aida.cloud1D("findable/pT for non-final state particles").fill(pt);
                 aida.cloud1D("findable/cos(theta) for non-final state particles").fill(cth);
-                if (Math.abs(eta) < 6)
+                if (Math.abs(eta) < 6) {
                     aida.cloud1D("findable/eta for non-final state particles").fill(eta);
+                }
                 aida.cloud1D("findable/d0 for non-final state particles").fill(d0);
                 aida.cloud1D("findable/z0 for non-final state particles").fill(z0);
                 aida.cloud2D("findable/Hits vs eta for non-final state particles").fill(eta, nhits);
@@ -1144,12 +1214,14 @@
             aida.cloud1D("findable/Hits for base MC selection").fill(nhits);
             aida.cloud1D("findable/pT for base MC selection").fill(pt);
             aida.cloud1D("findable/cos(theta) for base MC selection").fill(cth);
-            if (Math.abs(eta) < 6)
+            if (Math.abs(eta) < 6) {
                 aida.cloud1D("findable/eta for base MC selection").fill(eta);
+            }
             aida.cloud1D("findable/d0 for base MC selection").fill(d0);
             aida.cloud1D("findable/z0 for base MC selection").fill(z0);
-            if (Math.abs(eta) < 6)
+            if (Math.abs(eta) < 6) {
                 aida.cloud2D("findable/Hits vs eta for base MC selection").fill(eta, nhits);
+            }
 
         }
 
@@ -1210,8 +1282,9 @@
 
     private double getphi(double x, double y) {
         double phi = Math.atan2(y, x);
-        if (phi < 0.)
+        if (phi < 0.) {
             phi += 2. * Math.PI;
+        }
         return phi;
     }
 
@@ -1328,8 +1401,9 @@
         double dzdx1 = slt1.dzdx();
         double s1sq = 1 + 1 / (dydx1 * dydx1) + (dzdx1 * dzdx1) / (dydx1 * dydx1);
         double truep1y = Math.sqrt(p1mag2 / s1sq);
-        if (dydx1 < 0)
+        if (dydx1 < 0) {
             truep1y = -truep1y;
+        }
         double truep1x = truep1y / dydx1;
         double truep1z = dzdx1 * truep1x;
 
@@ -1343,8 +1417,9 @@
         double dzdx2 = slt2.dzdx();
         double s2sq = 1 + 1 / (dydx2 * dydx2) + (dzdx2 * dzdx2) / (dydx2 * dydx2);
         double truep2y = Math.sqrt(p2mag2 / s2sq);
-        if (dydx2 < 0)
+        if (dydx2 < 0) {
             truep2y = -truep2y;
+        }
         double truep2x = truep2y / dydx2;
         double truep2z = dzdx2 * truep2x;
 
@@ -1431,8 +1506,9 @@
         double dzdx1 = slt1.dzdx();
         double s1sq = 1 + 1 / (dydx1 * dydx1) + (dzdx1 * dzdx1) / (dydx1 * dydx1);
         truep[1] = Math.sqrt(p1mag2 / s1sq);
-        if (dydx1 < 0)
+        if (dydx1 < 0) {
             truep[1] = -truep[1];
+        }
         truep[0] = truep[1] / dydx1;
         truep[2] = dzdx1 * truep[0];
         return new BasicHep3Vector(truep[0], truep[1], truep[2]);
@@ -1457,7 +1533,7 @@
         double mindist = 99999999;
         for (HelicalTrackHit hth : toththits) {
             HelicalTrackCross cross = (HelicalTrackCross) hth;
-            for (HelicalTrackStrip str : cross.getStrips())
+            for (HelicalTrackStrip str : cross.getStrips()) {
                 if (str != cl) {
                     Hep3Vector strorigin = str.origin();
                     Hep3Vector stru = str.u();
@@ -1470,6 +1546,7 @@
                         nearest = str;
                     }
                 }
+            }
         }
 
         return nearest;
@@ -1486,7 +1563,7 @@
         Double mindist = 99999999.0;
         for (HelicalTrackHit hth : toththits) {
             HelicalTrackCross cross = (HelicalTrackCross) hth;
-            for (HelicalTrackStrip str : cross.getStrips())
+            for (HelicalTrackStrip str : cross.getStrips()) {
                 if (str != cl) {
                     Hep3Vector strorigin = str.origin();
                     Hep3Vector stru = str.u();
@@ -1496,19 +1573,22 @@
                     int strlayer = str.layer();
                     if (layer == strlayer && VecOp.sub(clvec, strvec).magnitude() < Math.abs(mindist)) {
                         mindist = VecOp.sub(clvec, strvec).magnitude();
-                        if (Math.abs(clvec.z()) > Math.abs(strvec.z()))
+                        if (Math.abs(clvec.z()) > Math.abs(strvec.z())) {
                             mindist = -mindist;
+                        }
                         nearest = str;
                     }
                 }
+            }
         }
         return mindist;
     }
 
     private Integer encodeBadHitList(List<Integer> badHits) {
         Integer badHitsEncoded = 0;
-        for (Integer layer : badHits)
+        for (Integer layer : badHits) {
             badHitsEncoded += (int) Math.pow(2, layer - 1);
+        }
         return badHitsEncoded;
     }
 }

hps-java/src/main/java/org/lcsim/hps/users/mgraham
MainJASDriver.java 1.6 -> 1.7
diff -u -r1.6 -r1.7
--- MainJASDriver.java	9 Apr 2013 22:03:05 -0000	1.6
+++ MainJASDriver.java	11 Apr 2013 19:16:05 -0000	1.7
@@ -1,9 +1,8 @@
 package org.lcsim.hps.users.mgraham;
 
-import org.lcsim.hps.recon.tracking.HelicalTrackHitDriver;
-import org.lcsim.hps.recon.tracking.HPSSVTSensorSetup;
-import org.lcsim.hps.recon.tracking.TrackerDigiDriver;
-import org.lcsim.hps.recon.tracking.TrackerReconDriver;
+import org.lcsim.hps.monitoring.CalibrationDriver;
+import org.lcsim.hps.recon.tracking.*;
+import org.lcsim.recon.tracking.digitization.sisim.config.RawTrackerHitSensorSetup;
 import org.lcsim.util.Driver;
 
 /**
@@ -16,23 +15,35 @@
 
 
     public MainJASDriver() {
-        add(new HPSSVTSensorSetup());
-        add(new TrackerDigiDriver());
-//        add(new TrackerReconDriver());
-//        HelicalTrackHitDriver hth = new HelicalTrackHitDriver();
+//        add(new HPSSVTSensorSetup());
+        add(new CalibrationDriver());
+        add(new RawTrackerHitSensorSetup());
+        //   Can remove HPSRawTrackerHitFitterDriver and DataTrackerHitDriver for integrated MC
+        HPSRawTrackerHitFitterDriver hitfitter=new HPSRawTrackerHitFitterDriver();
+        hitfitter.setCorrectT0Shift(true);
+        hitfitter.setFitAlgorithm("Analytic");
+        add(hitfitter);
+        add(new DataTrackerHitDriver());
         
-        SingleSensorHelicalTrackHitDriver hth = new SingleSensorHelicalTrackHitDriver();
+//        add(new TrackerDigiDriver());  //add for integrated MC
+        HelicalTrackHitDriver hth = new HelicalTrackHitDriver();
+        
+//        SingleSensorHelicalTrackHitDriver hth = new SingleSensorHelicalTrackHitDriver();
         hth.setMaxSeperation(20.0);
         hth.setTolerance(1.0);
         add(hth);
         TrackerReconDriver trd=new TrackerReconDriver();
         
-          trd.setStrategyResource("/org/lcsim/hps/recon/tracking/strategies/HPS-SingleSensors.xml");
-//        trd.setStrategyResource("/org/lcsim/hps/recon/tracking/strategies/HPS-Full.xml");
+//          trd.setStrategyResource("/org/lcsim/hps/recon/tracking/strategies/HPS-SingleSensors.xml");
+        trd.setStrategyResource("/org/lcsim/hps/recon/tracking/strategies/HPS-Full.xml");
 //    trd.setStrategyResource("/org/lcsim/hps/recon/tracking/strategies/HPS-Test-Lyr50.xml");
         trd.setDebug(true);
         add(trd);
-        add(new DetailedAnalysisDriver(10));
+//
+        DetailedAnalysisDriver dad=new DetailedAnalysisDriver(12);
+        dad.setRawHitsName("SVTRawTrackerHits");
+        add(dad);
+
 //        add(new FastTrackAnalysisDriver());
         
        

hps-java/src/main/resources/org/lcsim/hps/steering/users/mgraham
HitTimeStudies.lcsim added at 1.1
diff -N HitTimeStudies.lcsim
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ HitTimeStudies.lcsim	11 Apr 2013 19:16:05 -0000	1.1
@@ -0,0 +1,65 @@
+<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="CalibrationDriver"/>
+        <driver name="RawTrackerHitSensorSetup"/>
+        <driver name="RawTrackerHitFitterDriver" />
+        <driver name="EcalRawConverter" />
+        <driver name="EcalClusterer" />
+        <driver name="TrackerHitDriver"/>       
+        <driver name="HelicalTrackHitDriver"/>
+        <driver name="TrackerReconDriver"/>      
+<!--         <driver name="ReconParticle" />      -->  
+<!--        <driver name="LCIOWriter"/> -->
+        <driver name="HitTimeDriver" />
+         <driver name="CleanupDriver"/>
+    </execute>    
+    <drivers>    
+        <driver name="CalibrationDriver" type="org.lcsim.hps.monitoring.CalibrationDriver">
+<!--            <runNumber>${runNumber}</runNumber>-->
+        </driver>   
+        <driver name="EventMarkerDriver"
+                type="org.lcsim.job.EventMarkerDriver">
+            <eventInterval>1</eventInterval>
+        </driver>        
+        <driver name="RawTrackerHitSensorSetup" type="org.lcsim.recon.tracking.digitization.sisim.config.RawTrackerHitSensorSetup"/>
+        <driver name="RawTrackerHitFitterDriver" type="org.lcsim.hps.recon.tracking.HPSRawTrackerHitFitterDriver">
+            <fitAlgorithm>Analytic</fitAlgorithm>
+            <correctT0Shift>false</correctT0Shift>
+        </driver>
+        <driver name="TrackerHitDriver" type="org.lcsim.hps.users.mgraham.DataTrackerHitDriver" />    
+        <driver name="HitTimeDriver" type="org.lcsim.hps.users.mgraham.HitTimePlotter" />     
+<!--        <driver name="HitTimeDriver" type="org.lcsim.hps.users.meeg.HitTimePrintDriver" />      -->
+        <driver name="HelicalTrackHitDriver"
+                type="org.lcsim.hps.recon.tracking.HelicalTrackHitDriver">
+            <debug>false</debug>
+            <clusterTimeCut>4.0</clusterTimeCut>
+            <layerGeometryType>Common</layerGeometryType>
+            <maxSeperation>20.0</maxSeperation>
+            <tolerance>1.0</tolerance>
+        </driver>
+        <driver name="TrackerReconDriver"
+                type="org.lcsim.hps.recon.tracking.TrackerReconDriver">
+            <debug>true</debug>
+        </driver>        
+        <driver name="EcalRawConverter" type="org.lcsim.hps.recon.ecal.EcalRawConverterDriver">
+            <ecalCollectionName>EcalCalHits</ecalCollectionName>
+        </driver>
+        <driver name="EcalClusterer" type="org.lcsim.hps.recon.ecal.EcalClusterer">
+            <ecalName>Ecal</ecalName>
+            <ecalCollectionName>EcalCalHits</ecalCollectionName>
+        </driver>
+
+        <driver name="ReconParticle" type="org.lcsim.hps.recon.particle.ReconParticleDriver">          
+        </driver>
+<!--        
+        <driver name="LCIOWriter"
+             type="org.lcsim.util.loop.LCIODriver">
+                 <outputFilePath>${outputFile}.slcio</outputFilePath>
+        </driver> -->
+ <driver name="CleanupDriver" type="org.lcsim.recon.tracking.digitization.sisim.config.ReadoutCleanupDriver">
+            <collectionNames>TrackerHits</collectionNames>
+        </driver> 
+    </drivers> 
+</lcsim>

hps-java/src/main/java/org/lcsim/hps/recon/tracking
HPSRawTrackerHitFitterDriver.java 1.16 -> 1.17
diff -u -r1.16 -r1.17
--- HPSRawTrackerHitFitterDriver.java	15 Sep 2012 01:21:02 -0000	1.16
+++ HPSRawTrackerHitFitterDriver.java	11 Apr 2013 19:16:05 -0000	1.17
@@ -5,6 +5,7 @@
 import org.lcsim.detector.tracker.silicon.SiSensor;
 import org.lcsim.event.EventHeader;
 import org.lcsim.event.RawTrackerHit;
+import org.lcsim.hps.readout.ecal.ReadoutTimestamp;
 import org.lcsim.hps.recon.tracking.HPSSVTCalibrationConstants.ChannelConstants;
 import org.lcsim.util.Driver;
 import org.lcsim.util.lcio.LCIOConstants;
@@ -79,7 +80,12 @@
             ChannelConstants constants = HPSSVTCalibrationConstants.getChannelConstants((SiSensor) hit.getDetectorElement(), strip);
             HPSShapeFitParameters fit = _shaper.fitShape(hit, constants);
             if (correctT0Shift) {
-                fit.setT0(fit.getT0() - constants.getT0Shift());
+                double t0Svt = ReadoutTimestamp.getTimestamp(ReadoutTimestamp.SYSTEM_TRACKER, event);
+                double t0Trig = ReadoutTimestamp.getTimestamp(ReadoutTimestamp.SYSTEM_TRIGGER, event);
+                double corMod = (t0Svt - t0Trig) - constants.getT0Shift();
+                fit.setT0(fit.getT0() + corMod);
+//                fit.setT0(fit.getT0() - constants.getT0Shift());
+
             }
             if (debug) {
                 System.out.println(fit);

hps-java/src/main/java/org/lcsim/hps/recon/tracking
HPSSVTCalibrationConstants.java 1.23 -> 1.24
diff -u -r1.23 -r1.24
--- HPSSVTCalibrationConstants.java	25 Feb 2013 22:39:26 -0000	1.23
+++ HPSSVTCalibrationConstants.java	11 Apr 2013 19:16:05 -0000	1.24
@@ -13,19 +13,55 @@
 
 /**
  *
- * @author Mathew Graham <[log in to unmask]>
- * $Id: HPSSVTCalibrationConstants.java,v 1.23 2013/02/25 22:39:26 meeg Exp $
+ * @author Mathew Graham <[log in to unmask]> $Id:
+ * HPSSVTCalibrationConstants.java,v 1.23 2013/02/25 22:39:26 meeg Exp $
  */
 public class HPSSVTCalibrationConstants {
 
     // TODO: Change all map keys to type SiSensor?
     // TODO: Update everything to make it compatible new version of SVT Utils
-    private static Map<Pair<Integer /* FPGA */, Integer /* Hybrid */>, double[] /* constants */> noiseMap = new HashMap<Pair<Integer, Integer>, double[]>();
-    private static Map<Pair<Integer /* FPGA */, Integer /* Hybrid */>, double[] /* constants */> pedestalMap = new HashMap<Pair<Integer, Integer>, double[]>();
-    private static Map<Pair<Integer /* FPGA */, Integer /* Hybrid */>, double[] /* constants */> tpMap = new HashMap<Pair<Integer, Integer>, double[]>();
-    private static Map<Pair<Integer /* FPGA */, Integer /* Hybrid */>, Set<Integer> /* Bad channels */> badChannelMap = new HashMap<Pair<Integer, Integer>, Set<Integer>>();
-    private static Map<Pair<Integer /* FPGA */, Integer /* Hybrid */>, List<Double> /* channels */> gainMap = new HashMap<Pair<Integer, Integer>, List<Double>>();
-    private static Map<Pair<Integer /* FPGA */, Integer /* Hybrid */>, List<Double> /* channels */> offsetMap = new HashMap<Pair<Integer, Integer>, List<Double>>();
+    private static Map<Pair<Integer /*
+             * FPGA
+             */, Integer /*
+             * Hybrid
+             */>, double[] /*
+             * constants
+             */> noiseMap = new HashMap<Pair<Integer, Integer>, double[]>();
+    private static Map<Pair<Integer /*
+             * FPGA
+             */, Integer /*
+             * Hybrid
+             */>, double[] /*
+             * constants
+             */> pedestalMap = new HashMap<Pair<Integer, Integer>, double[]>();
+    private static Map<Pair<Integer /*
+             * FPGA
+             */, Integer /*
+             * Hybrid
+             */>, double[] /*
+             * constants
+             */> tpMap = new HashMap<Pair<Integer, Integer>, double[]>();
+    private static Map<Pair<Integer /*
+             * FPGA
+             */, Integer /*
+             * Hybrid
+             */>, Set<Integer> /*
+             * Bad channels
+             */> badChannelMap = new HashMap<Pair<Integer, Integer>, Set<Integer>>();
+    private static Map<Pair<Integer /*
+             * FPGA
+             */, Integer /*
+             * Hybrid
+             */>, List<Double> /*
+             * channels
+             */> gainMap = new HashMap<Pair<Integer, Integer>, List<Double>>();
+    private static Map<Pair<Integer /*
+             * FPGA
+             */, Integer /*
+             * Hybrid
+             */>, List<Double> /*
+             * channels
+             */> offsetMap = new HashMap<Pair<Integer, Integer>, List<Double>>();
     private static boolean pedestalLoaded = false;
     private static boolean tpLoaded = false;
     private static int totalBadChannels = 0;
@@ -180,10 +216,10 @@
     }
 
     /**
-     * Load the bad channels for the specified run.  If there are no 
-     * bad channels specified, just load those found from QA.  Channels
-     * found to be bad from QA will always be loaded.
-     * 
+     * Load the bad channels for the specified run. If there are no bad channels
+     * specified, just load those found from QA. Channels found to be bad from
+     * QA will always be loaded.
+     *
      * @param run number
      */
     public static void loadBadChannels(int runNumber) {
@@ -191,7 +227,7 @@
         // Clear the previously loaded bad channels
         badChannelMap.clear();
         System.out.println("Loading the SVT bad channels for run " + runNumber);
-        
+
         // If the calibrations are ideal (run < 0) don't load any bad channels
         if (runNumber < 0) {
             System.out.println("Running using ideal SVT calibrations. Bad channels will not be loaded.");
@@ -209,7 +245,7 @@
         } catch (IOException exception) {
             throw new RuntimeException("Unable to load bad channels for list " + filePath, exception);
         }
-        
+
         // Load the bad channels for the specified run number
         filePath = "daqmap/svt" + runNumber + ".badchannels";
         try {
@@ -223,7 +259,7 @@
 
     /**
      * Load the bad channels from a file using the specified character stream.
-     * 
+     *
      * @param reader : character stream of type Reader
      */
     private static void loadBadChannels(Reader reader) {
@@ -376,76 +412,7 @@
         IIdentifier id = sensor.getIdentifier();
         int layer = helper.getValue(id, "layer"); // 1-10; axial layers are odd layers; stereo layers are even
         int module = helper.getValue(id, "module"); // 0-1; module number is top or bottom
-        switch (module) {
-            case 0:
-                switch (layer) {
-                    case 1:
-                        value = 1.5;
-                        break;
-                    case 2:
-                        value = 1.6;
-                        break;
-                    case 3:
-                        value = -2.8;
-                        break;
-                    case 4:
-                        value = 2.0;
-                        break;
-                    case 5:
-                        value = -1.9;
-                        break;
-                    case 6:
-                        value = -2.2;
-                        break;
-                    case 7:
-                        value = 1.8;
-                        break;
-                    case 8:
-                        value = 1.2;
-                        break;
-                    case 9:
-                        value = 2.5;
-                        break;
-                    case 10:
-                        value = 0.0;
-                        break;
-                }
-                break;
-            case 1:
-                switch (layer) {
-                    case 1:
-                        value = 1.0;
-                        break;
-                    case 2:
-                        value = 1.3;
-                        break;
-                    case 3:
-                        value = -3.0;
-                        break;
-                    case 4:
-                        value = 3.5;
-                        break;
-                    case 5:
-                        value = 0.0;
-                        break;
-                    case 6:
-                        value = -0.5;
-                        break;
-                    case 7:
-                        value = -0.8;
-                        break;
-                    case 8:
-                        value = -1.1;
-                        break;
-                    case 9:
-                        value = 3.5;
-                        break;
-                    case 10:
-                        value = -2.7;
-                        break;
-                }
-                break;
-        }
+        value = lookupT0Shift(layer, module);
         constants.setT0Shift(value);
 
         return constants;
@@ -453,9 +420,9 @@
 
     /**
      * Checks if a channel has been tagged as bad
-     * 
-     * @param daqPair : a FPGA/Hybrid pair defining which sensor the 
-     * 					channels in located on
+     *
+     * @param daqPair : a FPGA/Hybrid pair defining which sensor the channels in
+     * located on
      * @param channel : The channel to be checked
      * @return true if the channel is bad, false otherwise
      */
@@ -521,4 +488,205 @@
             this.t0Shift = t0Shift;
         }
     }
+
+    static private double lookupT0Shift(int layer, int module) {
+        double value = -999;
+//        switch (module) {
+//            case 0:
+//                switch (layer) {
+//                    case 1:
+//                        value = 1.5;
+//                        break;
+//                    case 2:
+//                        value = 1.6;
+//                        break;
+//                    case 3:
+//                        value = -2.8;
+//                        break;
+//                    case 4:
+//                        value = 2.0;
+//                        break;
+//                    case 5:
+//                        value = -1.9;
+//                        break;
+//                    case 6:
+//                        value = -2.2;
+//                        break;
+//                    case 7:
+//                        value = 1.8;
+//                        break;
+//                    case 8:
+//                        value = 1.2;
+//                        break;
+//                    case 9:
+//                        value = 2.5;
+//                        break;
+//                    case 10:
+//                        value = 0.0;
+//                        break;
+//                }
+//                break;
+//            case 1:
+//                switch (layer) {
+//                    case 1:
+//                        value = 1.0;
+//                        break;
+//                    case 2:
+//                        value = 1.3;
+//                        break;
+//                    case 3:
+//                        value = -3.0;
+//                        break;
+//                    case 4:
+//                        value = 3.5;
+//                        break;
+//                    case 5:
+//                        value = 0.0;
+//                        break;
+//                    case 6:
+//                        value = -0.5;
+//                        break;
+//                    case 7:
+//                        value = -0.8;
+//                        break;
+//                    case 8:
+//                        value = -1.1;
+//                        break;
+//                    case 9:
+//                        value = 3.5;
+//                        break;
+//                    case 10:
+//                        value = -2.7;
+//                        break;
+//                }
+//                break;
+//        } 
+        switch (module) {
+            case 0:
+                switch (layer) {
+                    case 1:
+                        value = -186.1;
+                        break;
+                    case 2:
+                        value = -186.1;
+                        break;
+                    case 3:
+                        value = -185.8;
+                        break;
+                    case 4:
+                        value = -185.9;
+                        break;
+                    case 5:
+                        value = -185.8;
+                        break;
+                    case 6:
+                        value = -185.8;
+                        break;
+                    case 7:
+                        value = -185.8;
+                        break;
+                    case 8:
+                        value = -185.9;
+                        break;
+                    case 9:
+                        value = -185.8;
+                        break;
+                    case 10:
+                        value = -185.8;
+                        break;
+                    case 11:
+                        value = -185.6;
+                        break;
+                    case 12:
+                        value = -186.0;
+                        break;
+                }
+                break;
+            case 1:
+                switch (layer) {
+                    case 1:
+                        value = -185.6;
+                        break;
+                    case 2:
+                        value = -185.3;
+                        break;
+                    case 3:
+                        value = -185.9;
+                        break;
+                    case 4:
+                        value = -185.7;
+                        break;
+                    case 5:
+                        value = -185.6;
+                        break;
+                    case 6:
+                        value = -185.9;
+                        break;
+                    case 7:
+                        value = -185.8;
+                        break;
+                    case 8:
+                        value = -186.1;
+                        break;
+                    case 9:
+                        value = -186.0;
+                        break;
+                    case 10:
+                        value = -185.9;
+                        break;
+                    case 11:
+                        value = -185.9;
+                        break;
+                    case 12:
+                        value = -186.1;
+                        break;
+                }
+                break;
+            case 2:
+                switch (layer) {
+                    case 7:
+                        value = -185.7;
+                        break;
+                    case 8:
+                        value = -185.7;
+                        break;
+                    case 9:
+                        value = -185.9;
+                        break;
+                    case 10:
+                        value = -186.0;
+                        break;
+                    case 11:
+                        value = -185.8;
+                        break;
+                    case 12:
+                        value = -185.9;
+                        break;
+                }
+                break;
+            case 3:
+                switch (layer) {
+                    case 7:
+                        value = -185.5;
+                        break;
+                    case 8:
+                        value = -185.6;
+                        break;
+                    case 9:
+                        value = -185.5;
+                        break;
+                    case 10:
+                        value = -185.5;
+                        break;
+                    case 11:
+                        value = -186.6;
+                        break;
+                    case 12:
+                        value = -186.7;
+                        break;
+                }
+                break;
+        }
+        return value;
+    }
 }

hps-java/src/main/java/org/lcsim/hps/recon/tracking
HelicalTrackHitDriver.java 1.1 -> 1.2
diff -u -r1.1 -r1.2
--- HelicalTrackHitDriver.java	26 Nov 2012 18:12:01 -0000	1.1
+++ HelicalTrackHitDriver.java	11 Apr 2013 19:16:06 -0000	1.2
@@ -34,16 +34,17 @@
  */
 public class HelicalTrackHitDriver extends org.lcsim.fit.helicaltrack.HelicalTrackHitDriver {
     private boolean _debug = false;
+    private double _clusterTimeCut = -99; // if negative, don't cut..otherwise, dt cut time in ns
     private String subdetectorName = "Tracker";
-    private Map<String,String> _stereomap = new HashMap<String,String>();
+    private Map<String, String> _stereomap = new HashMap<String, String>();
     private List<String> _colnames = new ArrayList<String>();
     private boolean _doTransformToTracking = true;
     private HPSTransformations _detToTrk = new HPSTransformations();
-    public enum LayerGeometryType { 
+    public enum LayerGeometryType {
         /*
          * Each Layer in the geometry is a separate sensor
          */
-        Split, 
+        Split,
         /*
          * Each layer in the geometry comprises top and bottom sensor
          */
@@ -58,19 +59,23 @@
     public void setLayerGeometryType(String geomType) {
         this._layerGeometryType = LayerGeometryType.valueOf(geomType);
     }
-    
+
+    public void setClusterTimeCut(double dtCut) {
+        this._clusterTimeCut = dtCut;
+    }
+
     public void setSubdetectorName(String subdetectorName) {
         this.subdetectorName = subdetectorName;
     }
-    
+
     public void setDebug(boolean debug) {
         this._debug = debug;
     }
-    
+
     public void setTransformToTracking(boolean trans) {
         this._doTransformToTracking = trans;
     }
-    
+
     public void setStripHitsCollectionName(String stripHitsCollectionName) {
         HitRelationName(stripHitsCollectionName);
     }
@@ -86,8 +91,7 @@
     public void setOutputHitCollectionName(String outputHitCollectionName) {
         OutputCollection(outputHitCollectionName);
     }
-   
-    
+
     @Override
     public void process(EventHeader event) {
         //super.process(event);
@@ -95,42 +99,44 @@
         //  Initialize the list of HelicalTrackHits
         List<HelicalTrackCross> stereoCrosses = new ArrayList<HelicalTrackCross>();
         List<HelicalTrackHit> helhits = new ArrayList<HelicalTrackHit>();
-        
+
         //  Create a List of LCRelations to relate HelicalTrackHits to the original hits
         List<LCRelation> hitrelations = new ArrayList<LCRelation>();
         //  Create a List of LCRelations to relate HelicalTrackHits to the MC particle
         List<LCRelation> mcrelations = new ArrayList<LCRelation>();
 
-        
-        
-        for(String _colname : this._colnames) {
-            
+
+
+        for (String _colname : this._colnames) {
+
             if (!event.hasCollection(SiTrackerHit.class, _colname)) {
                 continue;
             }
 
             //  Get the list of SiTrackerHits for this collection
             List<SiTrackerHit> hitlist = (List<SiTrackerHit>) event.get(_colname);
-            if (_debug) System.out.printf("%s: found %d SiTrackerHits = ",this.getClass().getSimpleName(),hitlist.size());
-            
+            if (_debug) {
+                System.out.printf("%s: found %d SiTrackerHits = ", this.getClass().getSimpleName(), hitlist.size());
+            }
+
             //  Create collections for strip hits by layer and hit cross references
             Map<String, List<HelicalTrackStrip>> striplistmap = new HashMap<String, List<HelicalTrackStrip>>();
             Map<HelicalTrackStrip, SiTrackerHitStrip1D> stripmap = new HashMap<HelicalTrackStrip, SiTrackerHitStrip1D>();
-            
-            for(SiTrackerHit hit : hitlist) {
-                
-                if( hit instanceof SiTrackerHitStrip1D) {
-                    
+
+            for (SiTrackerHit hit : hitlist) {
+
+                if (hit instanceof SiTrackerHitStrip1D) {
+
                     //  Cast the hit as a 1D strip hit and find the identifier for the detector/layer combo
                     SiTrackerHitStrip1D h = (SiTrackerHitStrip1D) hit;
                     IDetectorElement de = h.getSensor();
                     String id = this.makeID(_ID.getName(de), _ID.getLayer(de));
 
                     //  This hit should be a on a stereo pair!
-                    if (!_stereomap.containsKey(id) &&_stereomap.containsValue(id)) {
+                    if (!_stereomap.containsKey(id) && !_stereomap.containsValue(id)) {
                         throw new RuntimeException(this.getClass().getSimpleName() + ": this " + id + " was not among the stereo modules!");
                     }
-                    
+
                     //  Create a HelicalTrackStrip for this hit
                     HelicalTrackStrip strip = makeDigiStrip(h);
 
@@ -140,15 +146,17 @@
                         lyrhits = new ArrayList<HelicalTrackStrip>();
                         striplistmap.put(id, lyrhits);
                     }
+                    if ((_clusterTimeCut > 0 && Math.abs(h.getTime()) < _clusterTimeCut)||_clusterTimeCut<0) {
+                        //  Add the strip to the list of strips on this sensor
+                        lyrhits.add(strip);
 
-                    //  Add the strip to the list of strips on this sensor
-                    lyrhits.add(strip);
+                        //  Map a reference back to the hit needed to create the stereo hit LC relations
+                        stripmap.put(strip, h);
 
-                    //  Map a reference back to the hit needed to create the stereo hit LC relations
-                    stripmap.put(strip, h);
-
-                    if(_debug) System.out.printf("%s: added strip (org=%s,umeas=%.3f) at layer %d ",this.getClass().getSimpleName(),strip.origin().toString(),strip.umeas(),strip.layer());
-                    
+                        if (_debug) {
+                            System.out.printf("%s: added strip (org=%s,umeas=%.3f) at layer %d with time %.3f\n", this.getClass().getSimpleName(), strip.origin().toString(), strip.umeas(), strip.layer(),strip.time());
+                        }
+                    }
                 } else {
 
                     //  If not a 1D strip hit, make a pixel hit
@@ -156,15 +164,17 @@
                     helhits.add(hit3d);
                     hitrelations.add(new MyLCRelation(hit3d, hit));
                 }
-                
+
             } // Loop over SiTrackerHits
-            
-            
+
+
             //  Create a list of stereo hits
             //List<HelicalTrackCross> stereohits = new ArrayList<HelicalTrackCross>();
-            
-            if (_debug) System.out.println(this.getClass().getSimpleName() + ": Create stereo hits from " + striplistmap.size() + " strips (map size)");
-                        
+
+            if (_debug) {
+                System.out.println(this.getClass().getSimpleName() + ": Create stereo hits from " + striplistmap.size() + " strips (map size)");
+            }
+
             //  Loop over the stereo layer pairs
             for (String id1 : _stereomap.keySet()) {
 
@@ -178,132 +188,148 @@
                         //for(HelicalTrackStrip strip: striplistmap.get(id2)) System.out.printf("%s: stripid2 at origin %s\n",this.getClass().getSimpleName(),strip.origin().toString());
                     }
                 }
-                
+
                 /*
-                 * Form the stereo hits and add them to our hit list
-                 * Add LC relations for stereo hit to SiTrackHitStrip1D object 
-                 * Add LC relation between MC particle and stereo hit
+                 * Form the stereo hits and add them to our hit list Add LC
+                 * relations for stereo hit to SiTrackHitStrip1D object Add LC
+                 * relation between MC particle and stereo hit
                  */
-                
-                List<HelicalTrackCross> cross_list =  _crosser.MakeHits(striplistmap.get(id1), striplistmap.get(id2));
-                
-                for(HelicalTrackCross cross : cross_list) {
+
+                List<HelicalTrackCross> cross_list = _crosser.MakeHits(striplistmap.get(id1), striplistmap.get(id2));
+
+                for (HelicalTrackCross cross : cross_list) {
                     stereoCrosses.add(cross);
-                    if(cross.getMCParticles()!=null) {
-                        for(MCParticle mcp : cross.getMCParticles()) {
-                            mcrelations.add(new MyLCRelation((HelicalTrackHit)cross,mcp));
+                    if (cross.getMCParticles() != null) {
+                        for (MCParticle mcp : cross.getMCParticles()) {
+                            mcrelations.add(new MyLCRelation((HelicalTrackHit) cross, mcp));
                         }
                     }
-                    for(HelicalTrackStrip strip : cross.getStrips()) {
-                        hitrelations.add(new MyLCRelation(cross,stripmap.get(strip)));
+                    for (HelicalTrackStrip strip : cross.getStrips()) {
+                        hitrelations.add(new MyLCRelation(cross, stripmap.get(strip)));
                     }
-                    
+
                 }
-                
+
             } // Loop over stereo pairs
 
             if (_debug) {
-                System.out.printf("%s: added %d stereo hits from %s collection ",this.getClass().getSimpleName(),stereoCrosses.size(),_colname);
+                System.out.printf("%s: added %d stereo hits from %s collection ", this.getClass().getSimpleName(), stereoCrosses.size(), _colname);
             }
-            
-            
+
+
         } // Loop over collection names
-        
-        
-        
+
+
+
         // Add things to the event
         // Cast crosses to HTH
         helhits.addAll(stereoCrosses);
         event.put(_outname, helhits, HelicalTrackHit.class, 0);
-        event.put(_hitrelname,hitrelations,LCRelation.class,0);
-        event.put(_mcrelname,mcrelations,LCRelation.class,0);       
-        if(_doTransformToTracking) addRotatedHitsToEvent(event, stereoCrosses);
-        
-        
-        
+        event.put(_hitrelname, hitrelations, LCRelation.class, 0);
+        event.put(_mcrelname, mcrelations, LCRelation.class, 0);
+        if (_doTransformToTracking) {
+            addRotatedHitsToEvent(event, stereoCrosses);
+        }
+
+
+
     } //Process()
-    
 
     public void addCollection(String colname) {
         _colnames.add(colname);
     }
+
     public void setCollection(String colname) {
         _colnames.clear();
         this.addCollection(colname);
     }
+
     private String makeID(String detname, int lyr) {
         return detname + lyr;
     }
-    
+
     public void setStereoPair(String detname, int lyr1, int lyr2) {
         this._stereomap.put(this.makeID(detname, lyr1), this.makeID(detname, lyr2));
     }
-    
+
     @Override
     protected void detectorChanged(Detector detector) {
         /*
          * Setup default pairing
          */
-        if (_debug) System.out.printf("%s: Setup stereo hit pair modules ",this.getClass().getSimpleName());
-        
+        if (_debug) {
+            System.out.printf("%s: Setup stereo hit pair modules ", this.getClass().getSimpleName());
+        }
+
         List<SiTrackerModule> modules = detector.getSubdetector(this.subdetectorName).getDetectorElement().findDescendants(SiTrackerModule.class);
         if (modules.isEmpty()) {
             throw new RuntimeException(this.getClass().getName() + ": No SiTrackerModules found in detector.");
         }
         int nLayersTotal = detector.getSubdetector(subdetectorName).getLayering().getLayers().getNumberOfLayers();
-        if (_debug) System.out.printf("%s: %d layers ",this.getClass().getSimpleName(),nLayersTotal);
+        if (_debug) {
+            System.out.printf("%s: %d layers ", this.getClass().getSimpleName(), nLayersTotal);
+        }
         if (nLayersTotal % 2 != 0) {
             throw new RuntimeException(this.getClass().getName() + ": Don't know how to do stereo pairing for odd number of modules.");
         }
-        if(this._layerGeometryType==LayerGeometryType.Split) {
-            int nLayers = nLayersTotal/2;
-            for(int i=1;i<=nLayers;++i) {
+        if (this._layerGeometryType == LayerGeometryType.Split) {
+            int nLayers = nLayersTotal / 2;
+            for (int i = 1; i <= nLayers; ++i) {
                 int ly1 = i;
-                int ly2 = i+10;
-                if (_debug) System.out.printf("%s: adding stereo pair from layer %d and %d ",this.getClass().getSimpleName(),ly1,ly2);
+                int ly2 = i + 10;
+                if (_debug) {
+                    System.out.printf("%s: adding stereo pair from layer %d and %d ", this.getClass().getSimpleName(), ly1, ly2);
+                }
                 this.setStereoPair(subdetectorName, ly1, ly2);
-            }            
-        } else if(this._layerGeometryType==LayerGeometryType.Common) {
+            }
+        } else if (this._layerGeometryType == LayerGeometryType.Common) {
             List<int[]> pairs = new ArrayList<int[]>();
             for (int i = 1; i <= (nLayersTotal) - 1; i += 2) {
                 int[] pair = {i, i + 1};
-                if (_debug)
+                if (_debug) {
                     System.out.println("Adding stereo pair: " + pair[0] + ", " + pair[1]);
+                }
                 pairs.add(pair);
             }
             for (int[] pair : pairs) {
-                if (_debug) System.out.printf("%s: adding stereo pair from layer %d and %d ",this.getClass().getSimpleName(),pair[0],pair[1]);
+                if (_debug) {
+                    System.out.printf("%s: adding stereo pair from layer %d and %d ", this.getClass().getSimpleName(), pair[0], pair[1]);
+                }
                 setStereoPair(subdetectorName, pair[0], pair[1]);
             }
         } else {
             throw new RuntimeException(this.getClass().getSimpleName() + ": this layer geometry is not implemented!");
         }
 
-        if (_debug) System.out.printf("%s: %d stereo modules added",this.getClass().getSimpleName(),this._stereomap.size());
-        
+        if (_debug) {
+            System.out.printf("%s: %d stereo modules added", this.getClass().getSimpleName(), this._stereomap.size());
+        }
+
     }
-    
-     private HelicalTrackStrip makeDigiStrip(SiTrackerHitStrip1D h) {
-        
-        if(_debug) System.out.println(this.getClass().getSimpleName() + ": makeDigiStrip--");
-        
+
+    private HelicalTrackStrip makeDigiStrip(SiTrackerHitStrip1D h) {
+
+        if (_debug) {
+            System.out.println(this.getClass().getSimpleName() + ": makeDigiStrip--");
+        }
+
         SiTrackerHitStrip1D local = h.getTransformedHit(TrackerHitType.CoordinateSystem.SENSOR);
         SiTrackerHitStrip1D global = h.getTransformedHit(TrackerHitType.CoordinateSystem.GLOBAL);
-    
+
         ITransform3D trans = local.getLocalToGlobal();
         Hep3Vector org = trans.transformed(_orgloc);
         Hep3Vector u = global.getMeasuredCoordinate();
         Hep3Vector v = global.getUnmeasuredCoordinate();
-         
-       
-        
+
+
+
         double umeas = local.getPosition()[0];
         double vmin = VecOp.dot(local.getUnmeasuredCoordinate(), local.getHitSegment().getStartPoint());
         double vmax = VecOp.dot(local.getUnmeasuredCoordinate(), local.getHitSegment().getEndPoint());
         double du = Math.sqrt(local.getCovarianceAsMatrix().diagonal(0));
 
-       
-        
+
+
         IDetectorElement de = h.getSensor();
         String det = _ID.getName(de);
         int lyr = _ID.getLayer(de);
@@ -324,15 +350,15 @@
         } catch (RuntimeException e) {
             // Okay when MC info not present.
         }
-       
-        if(_debug) {
+
+        if (_debug) {
             System.out.println(this.getClass().getSimpleName() + ": produced HelicalTrackStrip with origin " + strip.origin().toString());
         }
 
         return strip;
     }
 
-     private void addRotatedHitsToEvent(EventHeader event, List<HelicalTrackCross> stereohits) {
+    private void addRotatedHitsToEvent(EventHeader event, List<HelicalTrackCross> stereohits) {
 
         List<HelicalTrackHit> rotatedhits = new ArrayList<HelicalTrackHit>();
         List<LCRelation> hthrelations = new ArrayList<LCRelation>();
@@ -370,14 +396,13 @@
                 mcrelations.add(new MyLCRelation(newhit, mcp));
             }
         }
-        
-        event.put("Rotated"+_outname, rotatedhits, HelicalTrackHit.class, 0);
-        event.put("Rotated"+_hitrelname, hthrelations, LCRelation.class, 0);
-        event.put("Rotated"+_mcrelname, mcrelations, LCRelation.class, 0);
-        
-        
+
+        event.put("Rotated" + _outname, rotatedhits, HelicalTrackHit.class, 0);
+        event.put("Rotated" + _hitrelname, hthrelations, LCRelation.class, 0);
+        event.put("Rotated" + _mcrelname, mcrelations, LCRelation.class, 0);
+
+
         //  Create the LCRelations between HelicalTrackHits and MC particles
 
     }
-    
 }
CVSspam 0.2.12


Use REPLY-ALL to reply to list

To unsubscribe from the LCD-CVS list, click the following link:
https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=LCD-CVS&A=1