Print

Print


Author: [log in to unmask]
Date: Fri Jun 12 15:27:10 2015
New Revision: 3143

Log:
Merge trunk changes into conditions branch.

Added:
    java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/PlotAndFitUtilities.java
      - copied unchanged from r3142, java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/PlotAndFitUtilities.java
    java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/SVTOpeningStudies.java
      - copied unchanged from r3142, java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/SVTOpeningStudies.java
    java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/examples/StripGoldenEventsDriver.java
      - copied unchanged from r3142, java/trunk/analysis/src/main/java/org/hps/analysis/examples/StripGoldenEventsDriver.java
    java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/examples/StripMollerEventsDriver.java
      - copied unchanged from r3142, java/trunk/analysis/src/main/java/org/hps/analysis/examples/StripMollerEventsDriver.java
    java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/run/
      - copied from r3142, java/trunk/conditions/src/main/java/org/hps/conditions/run/
    java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/svt/MotorPositionLoader.java
      - copied unchanged from r3142, java/trunk/conditions/src/main/java/org/hps/conditions/svt/MotorPositionLoader.java
    java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/svt/OpeningAngleLoader.java
      - copied unchanged from r3142, java/trunk/conditions/src/main/java/org/hps/conditions/svt/OpeningAngleLoader.java
    java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/svt/SvtBiasConditionsLoader.java
      - copied unchanged from r3142, java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtBiasConditionsLoader.java
    java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/svt/SvtBiasConstant.java
      - copied unchanged from r3142, java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtBiasConstant.java
    java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/svt/SvtBiasMyaDumpReader.java
      - copied unchanged from r3142, java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtBiasMyaDumpReader.java
    java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/svt/SvtTimingConstants.java
      - copied unchanged from r3142, java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtTimingConstants.java
    java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/svt/SvtTimingConstantsLoader.java
      - copied unchanged from r3142, java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtTimingConstantsLoader.java
    java/branches/HPSJAVA-488/conditions/src/test/java/org/hps/conditions/svt/SvtTimingConstantsTest.java
      - copied unchanged from r3142, java/trunk/conditions/src/test/java/org/hps/conditions/svt/SvtTimingConstantsTest.java
    java/branches/HPSJAVA-488/detector-data/detectors/HPS-EngRun2015-1_5mm-v0/SamplingFractions/Ecal.properties
      - copied unchanged from r3142, java/trunk/detector-data/detectors/HPS-EngRun2015-1_5mm-v0/SamplingFractions/Ecal.properties
    java/branches/HPSJAVA-488/detector-data/detectors/HPS-EngRun2015-1_5mm-v1/
      - copied from r3142, java/trunk/detector-data/detectors/HPS-EngRun2015-1_5mm-v1/
    java/branches/HPSJAVA-488/detector-data/detectors/HPS-EngRun2015-2_5mm-v0/SamplingFractions/Ecal.properties
      - copied unchanged from r3142, java/trunk/detector-data/detectors/HPS-EngRun2015-2_5mm-v0/SamplingFractions/Ecal.properties
    java/branches/HPSJAVA-488/detector-data/detectors/HPS-EngRun2015-2_5mm-v1/
      - copied from r3142, java/trunk/detector-data/detectors/HPS-EngRun2015-2_5mm-v1/
    java/branches/HPSJAVA-488/detector-data/detectors/HPS-EngRun2015-2mm-v0/SamplingFractions/Ecal.properties
      - copied unchanged from r3142, java/trunk/detector-data/detectors/HPS-EngRun2015-2mm-v0/SamplingFractions/Ecal.properties
    java/branches/HPSJAVA-488/detector-data/detectors/HPS-EngRun2015-2mm-v1/
      - copied from r3142, java/trunk/detector-data/detectors/HPS-EngRun2015-2mm-v1/
    java/branches/HPSJAVA-488/detector-data/detectors/HPS-EngRun2015-2mmPreRun5216-v1/
      - copied from r3142, java/trunk/detector-data/detectors/HPS-EngRun2015-2mmPreRun5216-v1/
    java/branches/HPSJAVA-488/detector-data/detectors/HPS-EngRun2015-3mm-v0/SamplingFractions/Ecal.properties
      - copied unchanged from r3142, java/trunk/detector-data/detectors/HPS-EngRun2015-3mm-v0/SamplingFractions/Ecal.properties
    java/branches/HPSJAVA-488/detector-data/detectors/HPS-EngRun2015-3mm-v1/
      - copied from r3142, java/trunk/detector-data/detectors/HPS-EngRun2015-3mm-v1/
    java/branches/HPSJAVA-488/detector-data/detectors/HPS-EngRun2015-4mm-v0/SamplingFractions/Ecal.properties
      - copied unchanged from r3142, java/trunk/detector-data/detectors/HPS-EngRun2015-4mm-v0/SamplingFractions/Ecal.properties
    java/branches/HPSJAVA-488/detector-data/detectors/HPS-EngRun2015-4mm-v1/
      - copied from r3142, java/trunk/detector-data/detectors/HPS-EngRun2015-4mm-v1/
    java/branches/HPSJAVA-488/detector-data/detectors/HPS-EngRun2015-Nominal-v1/
      - copied from r3142, java/trunk/detector-data/detectors/HPS-EngRun2015-Nominal-v1/
    java/branches/HPSJAVA-488/detector-data/detectors/HPS-EngRun2015-Nominal-v1-dev/
      - copied from r3142, java/trunk/detector-data/detectors/HPS-EngRun2015-Nominal-v1-dev/
    java/branches/HPSJAVA-488/detector-data/detectors/HPS-EngRun2015-Open-v0/SamplingFractions/Ecal.properties
      - copied unchanged from r3142, java/trunk/detector-data/detectors/HPS-EngRun2015-Open-v0/SamplingFractions/Ecal.properties
    java/branches/HPSJAVA-488/detector-data/detectors/HPS-EngRun2015-Open-v1/
      - copied from r3142, java/trunk/detector-data/detectors/HPS-EngRun2015-Open-v1/
    java/branches/HPSJAVA-488/detector-model/
      - copied from r3142, java/trunk/detector-model/
    java/branches/HPSJAVA-488/ecal-readout-sim/src/main/java/org/hps/readout/ecal/ReadoutTrigger.java
      - copied unchanged from r3142, java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/ReadoutTrigger.java
    java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/Ecal3PoleFunction.java
      - copied unchanged from r3142, java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/Ecal3PoleFunction.java
    java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/EcalPulseFitter.java
      - copied unchanged from r3142, java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalPulseFitter.java
    java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/CopyClusterCollectionDriver.java
      - copied unchanged from r3142, java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/CopyClusterCollectionDriver.java
    java/branches/HPSJAVA-488/evio/src/test/java/org/hps/evio/EpicsDataTest.java
      - copied unchanged from r3142, java/trunk/evio/src/test/java/org/hps/evio/EpicsDataTest.java
    java/branches/HPSJAVA-488/evio/src/test/java/org/hps/evio/ScalersTest.java
      - copied unchanged from r3142, java/trunk/evio/src/test/java/org/hps/evio/ScalersTest.java
    java/branches/HPSJAVA-488/integration-tests/src/main/java/org/
      - copied from r3142, java/trunk/integration-tests/src/main/java/org/
    java/branches/HPSJAVA-488/integration-tests/src/test/java/org/hps/test/
      - copied from r3142, java/trunk/integration-tests/src/test/java/org/hps/test/
    java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/scalers/
      - copied from r3142, java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/scalers/
    java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SvtClusterPlots.java
      - copied unchanged from r3142, java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SvtClusterPlots.java
    java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SvtPlotUtils.java
      - copied unchanged from r3142, java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SvtPlotUtils.java
    java/branches/HPSJAVA-488/monitoring-util/src/main/java/org/hps/monitoring/trigger/ShifterTrigPanel.java
      - copied unchanged from r3142, java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/ShifterTrigPanel.java
    java/branches/HPSJAVA-488/monitoring-util/src/main/java/org/hps/monitoring/trigger/ShifterTrigWindow.java
      - copied unchanged from r3142, java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/ShifterTrigWindow.java
    java/branches/HPSJAVA-488/record-util/src/main/java/org/hps/record/epics/EpicsData.java
      - copied unchanged from r3142, java/trunk/record-util/src/main/java/org/hps/record/epics/EpicsData.java
    java/branches/HPSJAVA-488/record-util/src/main/java/org/hps/record/evio/EventTagBitMask.java
      - copied unchanged from r3142, java/trunk/record-util/src/main/java/org/hps/record/evio/EventTagBitMask.java
    java/branches/HPSJAVA-488/record-util/src/main/java/org/hps/record/evio/EventTagConstant.java
      - copied unchanged from r3142, java/trunk/record-util/src/main/java/org/hps/record/evio/EventTagConstant.java
    java/branches/HPSJAVA-488/record-util/src/main/java/org/hps/record/evio/EvioEventSkimmer.java
      - copied unchanged from r3142, java/trunk/record-util/src/main/java/org/hps/record/evio/EvioEventSkimmer.java
    java/branches/HPSJAVA-488/record-util/src/main/java/org/hps/record/evio/crawler/
      - copied from r3142, java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/
    java/branches/HPSJAVA-488/record-util/src/main/java/org/hps/record/scalers/
      - copied from r3142, java/trunk/record-util/src/main/java/org/hps/record/scalers/
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/monitoring/EcalLedSequenceMonitoringApp.lcsim
      - copied unchanged from r3142, java/trunk/steering-files/src/main/resources/org/hps/steering/monitoring/EcalLedSequenceMonitoringApp.lcsim
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/monitoring/EcalLedSequenceStandalone.lcsim
      - copied unchanged from r3142, java/trunk/steering-files/src/main/resources/org/hps/steering/monitoring/EcalLedSequenceStandalone.lcsim
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/monitoring/EcalMonitoringOnly.lcsim
      - copied unchanged from r3142, java/trunk/steering-files/src/main/resources/org/hps/steering/monitoring/EcalMonitoringOnly.lcsim
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/monitoring/SvtOnlineMonitoring.lcsim
      - copied unchanged from r3142, java/trunk/steering-files/src/main/resources/org/hps/steering/monitoring/SvtOnlineMonitoring.lcsim
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/monitoring/SvtTimingInMonitoring.lcsim
      - copied unchanged from r3142, java/trunk/steering-files/src/main/resources/org/hps/steering/monitoring/SvtTimingInMonitoring.lcsim
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/production/DataQualityReconMC.lcsim
      - copied unchanged from r3142, java/trunk/steering-files/src/main/resources/org/hps/steering/production/DataQualityReconMC.lcsim
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/readout/EngineeringRun2015TrigPairs1.lcsim
      - copied unchanged from r3142, java/trunk/steering-files/src/main/resources/org/hps/steering/readout/EngineeringRun2015TrigPairs1.lcsim
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/readout/EngineeringRun2015TrigSingles1.lcsim
      - copied unchanged from r3142, java/trunk/steering-files/src/main/resources/org/hps/steering/readout/EngineeringRun2015TrigSingles1.lcsim
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullReconGbl2.lcsim
      - copied unchanged from r3142, java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullReconGbl2.lcsim
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullReconMC.lcsim
      - copied unchanged from r3142, java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullReconMC.lcsim
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullReconOutsideIn.lcsim
      - copied unchanged from r3142, java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullReconOutsideIn.lcsim
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015HitRecon.lcsim
      - copied unchanged from r3142, java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015HitRecon.lcsim
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/recon/TriggerDiagnosticsAnalysis.lcsim
      - copied unchanged from r3142, java/trunk/steering-files/src/main/resources/org/hps/steering/recon/TriggerDiagnosticsAnalysis.lcsim
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/users/baltzell/EcalReconPulseFit.lcsim
      - copied unchanged from r3142, java/trunk/steering-files/src/main/resources/org/hps/steering/users/baltzell/EcalReconPulseFit.lcsim
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/users/baltzell/EngineeringRun2014EcalRecon_FitPulses.lcsim
      - copied unchanged from r3142, java/trunk/steering-files/src/main/resources/org/hps/steering/users/baltzell/EngineeringRun2014EcalRecon_FitPulses.lcsim
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/users/holly/EcalReadoutNoPileUp.lcsim
      - copied unchanged from r3142, java/trunk/steering-files/src/main/resources/org/hps/steering/users/holly/EcalReadoutNoPileUp.lcsim
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/users/holly/EngineeringRun2015EcalOnly.lcsim
      - copied unchanged from r3142, java/trunk/steering-files/src/main/resources/org/hps/steering/users/holly/EngineeringRun2015EcalOnly.lcsim
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/users/meeg/SmallHits.lcsim
      - copied unchanged from r3142, java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/SmallHits.lcsim
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/users/mgraham/AlignmentStudies.lcsim
      - copied unchanged from r3142, java/trunk/steering-files/src/main/resources/org/hps/steering/users/mgraham/AlignmentStudies.lcsim
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/users/mgraham/PlotsOnRecon.lcsim
      - copied unchanged from r3142, java/trunk/steering-files/src/main/resources/org/hps/steering/users/mgraham/PlotsOnRecon.lcsim
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/users/mgraham/ReadoutAndTrackingAndReconMonitoring.lcsim
      - copied unchanged from r3142, java/trunk/steering-files/src/main/resources/org/hps/steering/users/mgraham/ReadoutAndTrackingAndReconMonitoring.lcsim
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/users/mgraham/TestReadoutEngRun2015.lcsim
      - copied unchanged from r3142, java/trunk/steering-files/src/main/resources/org/hps/steering/users/mgraham/TestReadoutEngRun2015.lcsim
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/users/mgraham/TrackTriggerStudy.lcsim
      - copied unchanged from r3142, java/trunk/steering-files/src/main/resources/org/hps/steering/users/mgraham/TrackTriggerStudy.lcsim
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/users/phansson/GenericTrackingAndReconMonitoring.lcsim
      - copied unchanged from r3142, java/trunk/steering-files/src/main/resources/org/hps/steering/users/phansson/GenericTrackingAndReconMonitoring.lcsim
    java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/TrackData.java
      - copied unchanged from r3142, java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackData.java
    java/branches/HPSJAVA-488/tracking/src/main/resources/org/hps/recon/tracking/strategies/HPS-Full-OutsideIn.xml
      - copied unchanged from r3142, java/trunk/tracking/src/main/resources/org/hps/recon/tracking/strategies/HPS-Full-OutsideIn.xml
    java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/baltzell/Ecal3PoleFunction.java
      - copied unchanged from r3142, java/trunk/users/src/main/java/org/hps/users/baltzell/Ecal3PoleFunction.java
    java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/baltzell/EcalPulseFitter.java
      - copied unchanged from r3142, java/trunk/users/src/main/java/org/hps/users/baltzell/EcalPulseFitter.java
    java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/baltzell/EcalRawConverter.java
      - copied unchanged from r3142, java/trunk/users/src/main/java/org/hps/users/baltzell/EcalRawConverter.java
    java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/baltzell/EcalRawConverterDriver.java
      - copied unchanged from r3142, java/trunk/users/src/main/java/org/hps/users/baltzell/EcalRawConverterDriver.java
    java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/holly/ClusterDriver.java
      - copied unchanged from r3142, java/trunk/users/src/main/java/org/hps/users/holly/ClusterDriver.java
    java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/holly/EcalRawConverter.java
      - copied unchanged from r3142, java/trunk/users/src/main/java/org/hps/users/holly/EcalRawConverter.java
    java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/jeremym/EvioFileScanner.java
      - copied unchanged from r3142, java/trunk/users/src/main/java/org/hps/users/jeremym/EvioFileScanner.java
    java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/jeremym/PatchLcioFile.java
      - copied unchanged from r3142, java/trunk/users/src/main/java/org/hps/users/jeremym/PatchLcioFile.java
    java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/luca/FeeCalibHistCreator.java
      - copied unchanged from r3142, java/trunk/users/src/main/java/org/hps/users/luca/FeeCalibHistCreator.java
    java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/meeg/EcalTruthMatchingDriver.java
      - copied unchanged from r3142, java/trunk/users/src/main/java/org/hps/users/meeg/EcalTruthMatchingDriver.java
    java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/meeg/SVTSmallHitsDriver.java
      - copied unchanged from r3142, java/trunk/users/src/main/java/org/hps/users/meeg/SVTSmallHitsDriver.java
    java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/mgraham/PositronDebug.java
      - copied unchanged from r3142, java/trunk/users/src/main/java/org/hps/users/mgraham/PositronDebug.java
    java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/mgraham/ProfileDriver.java
      - copied unchanged from r3142, java/trunk/users/src/main/java/org/hps/users/mgraham/ProfileDriver.java
    java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/mgraham/SplitHitsOnTracks.java
      - copied unchanged from r3142, java/trunk/users/src/main/java/org/hps/users/mgraham/SplitHitsOnTracks.java
Removed:
    java/branches/HPSJAVA-488/detector-data/detectors/HPS-EngRun2015-3_5mm-v0/
    java/branches/HPSJAVA-488/evio/src/test/java/org/hps/evio/EpicsScalarDataTest.java
    java/branches/HPSJAVA-488/evio/src/test/java/org/hps/evio/ScalarsTest.java
    java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/ecal/
    java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/scalars/
    java/branches/HPSJAVA-488/record-util/src/main/java/org/hps/record/epics/EpicsScalarData.java
    java/branches/HPSJAVA-488/record-util/src/main/java/org/hps/record/scalars/
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/monitoring/EcalLedSequenceMonitor.lcsim
Modified:
    java/branches/HPSJAVA-488/   (props changed)
    java/branches/HPSJAVA-488/analysis/pom.xml
    java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/DataQualityMonitor.java
    java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/EcalMonitoring.java
    java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/FinalStateMonitoring.java
    java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/SvtMonitoring.java
    java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/TrackingMonitoring.java
    java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/TrackingResiduals.java
    java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/TridentMonitoring.java
    java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/V0Monitoring.java
    java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/ecal/EcalHitPlots.java
    java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/examples/EcalScoringMatchDriver.java
    java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/examples/StripEventDriver.java
    java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/trigger/TriggerDiagnosticDriver.java
    java/branches/HPSJAVA-488/conditions/   (props changed)
    java/branches/HPSJAVA-488/conditions/pom.xml
    java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/api/ConditionsRecord.java
    java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/database/ConnectionParameters.java
    java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/svt/SvtAlignmentConstant.java
    java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/svt/SvtDetectorSetup.java
    java/branches/HPSJAVA-488/conditions/src/test/java/org/hps/conditions/EngRunConditionsTest.java
    java/branches/HPSJAVA-488/conditions/src/test/java/org/hps/conditions/svt/TestRunSvtBadChannelsTest.java
    java/branches/HPSJAVA-488/datacat/pom.xml
    java/branches/HPSJAVA-488/detector-data/pom.xml
    java/branches/HPSJAVA-488/distribution/   (props changed)
    java/branches/HPSJAVA-488/distribution/pom.xml
    java/branches/HPSJAVA-488/ecal-event-display/pom.xml
    java/branches/HPSJAVA-488/ecal-readout-sim/pom.xml
    java/branches/HPSJAVA-488/ecal-readout-sim/src/main/java/org/hps/readout/ecal/FADCEcalReadoutDriver.java
    java/branches/HPSJAVA-488/ecal-readout-sim/src/main/java/org/hps/readout/ecal/FADCPrimaryTriggerDriver.java
    java/branches/HPSJAVA-488/ecal-recon/pom.xml
    java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/EcalEdepToTriggerConverterDriver.java
    java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverter.java
    java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverterDriver.java
    java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRunningPedestalDriver.java
    java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ClusterDriver.java
    java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ClusterUtilities.java
    java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPClusterDriver.java
    java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPClusterer.java
    java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/LegacyClusterer.java
    java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/triggerbank/SSPData.java
    java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/triggerbank/SSPSinglesTrigger.java
    java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/triggerbank/TestRunTriggerData.java
    java/branches/HPSJAVA-488/ecal-recon/src/test/java/org/hps/recon/ecal/cluster/ClustererTest.java
    java/branches/HPSJAVA-488/evio/pom.xml
    java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/AbstractSvtEvioReader.java
    java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/BasicEvioFileReader.java
    java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/EcalEvioReader.java
    java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/EcalHitWriter.java
    java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/EventConstants.java
    java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/EvioToLcio.java
    java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/LCSimEngRunEventBuilder.java
    java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/LCSimTestRunEventBuilder.java
    java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/SvtEvioReader.java
    java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/TestRunTriggeredReconToEvio.java
    java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/TestRunTriggeredReconToLcio.java
    java/branches/HPSJAVA-488/integration-tests/   (props changed)
    java/branches/HPSJAVA-488/integration-tests/pom.xml
    java/branches/HPSJAVA-488/monitoring-app/   (props changed)
    java/branches/HPSJAVA-488/monitoring-app/pom.xml
    java/branches/HPSJAVA-488/monitoring-app/src/main/java/org/hps/monitoring/application/MonitoringApplication.java
    java/branches/HPSJAVA-488/monitoring-app/src/main/java/org/hps/monitoring/application/MonitoringApplicationFrame.java
    java/branches/HPSJAVA-488/monitoring-app/src/main/java/org/hps/monitoring/application/PlotPanel.java
    java/branches/HPSJAVA-488/monitoring-app/src/main/java/org/hps/monitoring/application/SystemStatusPanel.java
    java/branches/HPSJAVA-488/monitoring-app/src/main/scripts/evio_file_producer.sh
    java/branches/HPSJAVA-488/monitoring-drivers/pom.xml
    java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/example/ExamplePlotDriver.java
    java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/GblTrackingReconstructionPlots.java
    java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/PedestalPlots.java
    java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/PopupPlotterListener.java
    java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SamplesPlots.java
    java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SensorOccupancyPlotsDriver.java
    java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SvtHitPlots.java
    java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/trackrecon/TrackTimePlots.java
    java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/trackrecon/TrackingReconPlots.java
    java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalHitPlots.java
    java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalLedSequenceMonitor.java
    java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalMonitoringPlots.java
    java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalMonitoringUtilities.java
    java/branches/HPSJAVA-488/monitoring-util/pom.xml
    java/branches/HPSJAVA-488/monitoring-util/src/main/java/org/hps/monitoring/plotting/ExportPdf.java
    java/branches/HPSJAVA-488/monitoring-util/src/main/java/org/hps/monitoring/plotting/PlotterRegistry.java
    java/branches/HPSJAVA-488/monitoring-util/src/main/java/org/hps/monitoring/subsys/et/EtSystemMonitor.java
    java/branches/HPSJAVA-488/monitoring-util/src/main/java/org/hps/monitoring/trigger/AbstractTablePanel.java
    java/branches/HPSJAVA-488/monitoring-util/src/main/java/org/hps/monitoring/trigger/AbstractTriggerTablePanel.java
    java/branches/HPSJAVA-488/monitoring-util/src/main/java/org/hps/monitoring/trigger/EfficiencyTablePanel.java
    java/branches/HPSJAVA-488/parent/pom.xml
    java/branches/HPSJAVA-488/plugin/pom.xml
    java/branches/HPSJAVA-488/pom.xml
    java/branches/HPSJAVA-488/recon/pom.xml
    java/branches/HPSJAVA-488/recon/src/main/java/org/hps/recon/particle/ReconParticleDriver.java
    java/branches/HPSJAVA-488/record-util/pom.xml
    java/branches/HPSJAVA-488/record-util/src/main/java/org/hps/record/epics/EpicsEtProcessor.java
    java/branches/HPSJAVA-488/record-util/src/main/java/org/hps/record/epics/EpicsEvioProcessor.java
    java/branches/HPSJAVA-488/record-util/src/main/java/org/hps/record/epics/EpicsGenericObject.java
    java/branches/HPSJAVA-488/record-util/src/main/java/org/hps/record/evio/EvioEventConstants.java
    java/branches/HPSJAVA-488/record-util/src/main/java/org/hps/record/evio/EvioEventUtilities.java
    java/branches/HPSJAVA-488/record-util/src/main/java/org/hps/record/evio/EvioFileProducer.java
    java/branches/HPSJAVA-488/record-util/src/main/java/org/hps/record/evio/EvioFileSource.java
    java/branches/HPSJAVA-488/steering-files/pom.xml
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/monitoring/DeadtimeMonitor.lcsim
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/monitoring/Layers4to6TrackingMonitoring.lcsim
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/monitoring/LooseTrackingAndReconMonitoring.lcsim
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/monitoring/TrackingAndReconMonitoring.lcsim
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/production/DataQualityRecon.lcsim
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/readout/HPS2014ReadoutNoPileup.lcsim
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/readout/HPS2014ReadoutToEvio.lcsim
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/readout/HPS2014ReadoutToLcio.lcsim
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/readout/HPS2014TruthReadoutToLcio.lcsim
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullRecon.lcsim
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/recon/HPS2014OfflineNoPileupRecon.lcsim
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/recon/HPS2014OfflineRecon.lcsim
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/recon/HPS2014OfflineTruthRecon.lcsim
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/recon/HPSTrackingDefaultsRecon.lcsim
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/users/mgraham/TrackingAndReconMonitoring.lcsim
    java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/users/phansson/HPSTrackingDefaults.lcsim
    java/branches/HPSJAVA-488/tracking/pom.xml
    java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/readout/svt/SimpleSvtReadout.java
    java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/BeamlineConstants.java
    java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/DataTrackerHitDriver.java
    java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/HelicalTrackHitDriver.java
    java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/MaterialSupervisor.java
    java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/RawTrackerHitFitterDriver.java
    java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/ShaperAnalyticFitAlgorithm.java
    java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/TrackDataDriver.java
    java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/TrackTimeData.java
    java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/TrackUtils.java
    java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/TrackerReconDriver.java
    java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLFileIO.java
    java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutput.java
    java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutputDriver.java
    java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblRefitter.java
    java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/gbl/MakeGblTracks.java
    java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/svt/alignment/BuildMillepedeCompact.java
    java/branches/HPSJAVA-488/tracking/src/main/resources/org/hps/recon/tracking/strategies/HPS-Full-L1-3.xml
    java/branches/HPSJAVA-488/tracking/src/main/resources/org/hps/recon/tracking/strategies/HPS-Full-L4-6.xml
    java/branches/HPSJAVA-488/users/pom.xml
    java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/celentan/DummyDriverRaw.java
    java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/luca/CalibClusterAnalyzerEngRun.java
    java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/luca/rate.java
    java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/luca/ratetest.java
    java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/omoreno/SvtClusterAnalysis.java
    java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/omoreno/SvtHitEfficiency.java
    java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/omoreno/SvtTrackAnalysis.java
    java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/phansson/TrackingReconstructionPlots.java
    java/branches/HPSJAVA-488/util/pom.xml
    java/branches/HPSJAVA-488/util/src/main/java/org/hps/util/BasicLogFormatter.java

Modified: java/branches/HPSJAVA-488/analysis/pom.xml
 =============================================================================
--- java/branches/HPSJAVA-488/analysis/pom.xml	(original)
+++ java/branches/HPSJAVA-488/analysis/pom.xml	Fri Jun 12 15:27:10 2015
@@ -8,7 +8,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>../parent/pom.xml</relativePath>
-        <version>3.3.1-SNAPSHOT</version>
+        <version>3.3.3-SNAPSHOT</version>
     </parent>
     <scm>
         <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/analysis/</url>

Modified: java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/DataQualityMonitor.java
 =============================================================================
--- java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/DataQualityMonitor.java	(original)
+++ java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/DataQualityMonitor.java	Fri Jun 12 15:27:10 2015
@@ -3,9 +3,14 @@
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import org.hps.recon.ecal.triggerbank.AbstractIntData;
+import org.hps.recon.ecal.triggerbank.TIData;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.GenericObject;
 import org.lcsim.util.Driver;
 import org.lcsim.util.aida.AIDA;
 
@@ -26,18 +31,24 @@
     protected boolean connectToDB = false;
     protected boolean printDQMStrings = false;
     protected Map<String, Double> monitoredQuantityMap = new HashMap<>();
-    protected boolean debug=false;
+    protected boolean debug = false;
     protected boolean outputPlots = false;
     protected String outputPlotDir = "DQMOutputPlots/";
-    
+
+    String triggerType = "all";//allowed types are "" (blank) or "all", singles0, singles1, pairs0,pairs1
+
+    public void setTriggerType(String type) {
+        this.triggerType = type;
+    }
+
     public void setRecoVersion(String recoVersion) {
         this.recoVersion = recoVersion;
     }
 
-    public void setDebug(boolean debug){
-        this.debug=debug;
-    }
-    
+    public void setDebug(boolean debug) {
+        this.debug = debug;
+    }
+
     public void setRunNumber(int run) {
         this.runNumber = run;
     }
@@ -54,14 +65,14 @@
         this.printDQMStrings = print;
     }
 
-    public void setOutputPlots(boolean out){
-        this.outputPlots=out;
-    }
-    public void setOutputPlotDir(String dir){
-        this.outputPlotDir=dir;
-    }
-
-    
+    public void setOutputPlots(boolean out) {
+        this.outputPlots = out;
+    }
+
+    public void setOutputPlotDir(String dir) {
+        this.outputPlotDir = dir;
+    }
+
     public void DataQualityMonitor() {
 
     }
@@ -114,13 +125,13 @@
     }
 
     public boolean checkSelectionIsNULL(String var) throws SQLException {
-        String ins = "select "+var+" from dqm where " + getRunRecoString();
+        String ins = "select " + var + " from dqm where " + getRunRecoString();
         ResultSet res = manager.selectQuery(ins);
         res.next();
-        double result=res.getDouble(var);
-        if(res.wasNull())
-            return true;
-        System.out.println("checkSelectionIsNULL::"+var+" = "+result);
+        double result = res.getDouble(var);
+        if (res.wasNull())
+            return true;
+        System.out.println("checkSelectionIsNULL::" + var + " = " + result);
         return false;
     }
 
@@ -138,30 +149,60 @@
     public void calculateEndOfRunQuantities() {
     }
 
-  
     public void dumpDQMData() {
         for (Map.Entry<String, Double> entry : monitoredQuantityMap.entrySet()) {
             String name = entry.getKey();
             double val = entry.getValue();
-             boolean isnull=false;
-               try {
-                 isnull=checkSelectionIsNULL(name);
+            boolean isnull = false;
+            try {
+                isnull = checkSelectionIsNULL(name);
             } catch (SQLException ex) {
                 Logger.getLogger(SvtMonitoring.class.getName()).log(Level.SEVERE, null, ex);
             }
-            if (!overwriteDB&&!isnull){                
-                System.out.println("Not writing because "+name+" is already filled for this entry");
+            if (!overwriteDB && !isnull) {
+                System.out.println("Not writing because " + name + " is already filled for this entry");
                 continue; //entry exists and I don't want to overwrite                
             }
-            String put = "update dqm SET "+name+" = " + val + " WHERE " + getRunRecoString();
+            String put = "update dqm SET " + name + " = " + val + " WHERE " + getRunRecoString();
             System.out.println(put);
-            manager.updateQuery(put); 
-           
+            manager.updateQuery(put);
+
         }
     }
 
+    public boolean matchTriggerType(TIData triggerData) {
+        if (triggerType.contentEquals("") || triggerType.contentEquals("all"))
+            return true;
+        if (triggerData.isSingle0Trigger() && triggerType.contentEquals("singles0"))
+            return true;
+        if (triggerData.isSingle1Trigger() && triggerType.contentEquals("singles1"))
+            return true;
+        if (triggerData.isPair0Trigger() && triggerType.contentEquals("pairs0"))
+            return true;
+        if (triggerData.isPair1Trigger() && triggerType.contentEquals("pairs1"))
+            return true;
+        return false;
+
+    }
+
+    public boolean matchTrigger(EventHeader event) {
+        boolean match = true;
+        if (event.hasCollection(GenericObject.class, "TriggerBank")) {
+            List<GenericObject> triggerList = event.get(GenericObject.class, "TriggerBank");
+            for (GenericObject data : triggerList)
+                if (AbstractIntData.getTag(data) == TIData.BANK_TAG) {
+                    TIData triggerData = new TIData(data);
+                    if (!matchTriggerType(triggerData))//only process singles0 triggers...
+                        match = false;
+                }
+        } else if (debug)
+            System.out.println(this.getClass().getSimpleName() + ":  No trigger bank found...running over all trigger types");
+        return match;
+    }
+
     //override this method to do something interesting   
     //like print the DQM data log file
+
     public void printDQMData() {
     }
 

Modified: java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/EcalMonitoring.java
 =============================================================================
--- java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/EcalMonitoring.java	(original)
+++ java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/EcalMonitoring.java	Fri Jun 12 15:27:10 2015
@@ -6,9 +6,13 @@
 import java.util.List;
 import java.util.Map;
 import org.apache.commons.math.stat.StatUtils;
+import org.hps.recon.ecal.triggerbank.AbstractIntData;
+import org.hps.recon.ecal.triggerbank.TIData;
+import org.hps.recon.ecal.triggerbank.TestRunTriggerData;
 import org.lcsim.event.CalorimeterHit;
 import org.lcsim.event.Cluster;
 import org.lcsim.event.EventHeader;
+import org.lcsim.event.GenericObject;
 import org.lcsim.geometry.Detector;
 
 /**
@@ -51,21 +55,24 @@
     IHistogram2D fiducialenergyVsX;
     IHistogram2D energyVsY;
     IHistogram2D energyVsX;
-
-     int nEvents = 0;
+    IHistogram2D xVsY;
+    IHistogram2D pairsE1vsE2;
+
+    int nEvents = 0;
     int nTotHits = 0;
-    int nTotClusters = 0; 
-    double sumHitE = 0;   
+    int nTotClusters = 0;
+    double sumHitE = 0;
     double sumHitPerCluster = 0;
     double sumClusterEnergy = 0;
-    double sumClusterTime=0;
+    double sumClusterTime = 0;
     boolean fillHitPlots = true;
     private Map<String, Double> monitoredQuantityMap = new HashMap<>();
-    String[] ecalQuantNames = {"avg_N_hits","avg_Hit_Energy",
-           "avg_N_clusters", "avg_N_hitsPerCluster","avg_Cluster_Energy","avg_ClusterTime"};
-    double maxE = 2.5;
+    String[] ecalQuantNames = {"avg_N_hits", "avg_Hit_Energy",
+        "avg_N_clusters", "avg_N_hitsPerCluster", "avg_Cluster_Energy", "avg_ClusterTime"};
+    double maxE = 1.1;
     private final String plotHitsDir = "EcalHits/";
     private final String plotClustersDir = "EcalClusters/";
+    private final String plotFidCutDir = "FiducialCut/";
 
     public void setReadoutHitCollectionName(String readoutHitCollectionName) {
         this.readoutHitCollectionName = readoutHitCollectionName;
@@ -88,33 +95,36 @@
         aida.tree().cd("/");
         if (fillHitPlots) {
             // Setup hit plots.
-            hitCountPlot = aida.histogram1D(plotHitsDir + calibratedHitCollectionName + " Hit Count In Event", 40, -0.5, 39.5);
-            hitTimePlot = aida.histogram1D(plotHitsDir + calibratedHitCollectionName + " Hit Time", 50, 0 * 4.0, 50 * 4.0);
-            hitEnergyPlot = aida.histogram1D(plotHitsDir + calibratedHitCollectionName + " Hit Energy", 100, -0.1, maxE);
-            fiducialHitCountPlot = aida.histogram1D(plotHitsDir + calibratedHitCollectionName + " Hit Count with Fiducial Cut", 10, -0.5, 9.5);
-            fiducialEnergyPlot = aida.histogram1D(plotHitsDir + calibratedHitCollectionName + " Hit Energy with Fiducial Cut", 100, -0.1, maxE);
+            hitCountPlot = aida.histogram1D(plotHitsDir + triggerType + "/"+ calibratedHitCollectionName + " Hit Count In Event", 40, -0.5, 39.5);
+            hitTimePlot = aida.histogram1D(plotHitsDir + triggerType + "/"+calibratedHitCollectionName + " Hit Time", 50, 0 * 4.0, 50 * 4.0);
+            hitEnergyPlot = aida.histogram1D(plotHitsDir + triggerType + "/"+calibratedHitCollectionName + " Hit Energy", 100, -0.1, maxE);
+            fiducialHitCountPlot = aida.histogram1D(plotHitsDir + triggerType + "/"+calibratedHitCollectionName + " Hit Count with Fiducial Cut", 10, -0.5, 9.5);
+            fiducialEnergyPlot = aida.histogram1D(plotHitsDir + triggerType + "/"+calibratedHitCollectionName + " Hit Energy with Fiducial Cut", 100, -0.1, maxE);
         }
         // Setup cluster plots
-        clusterCountPlot = aida.histogram1D(plotClustersDir + clusterCollectionName + " Cluster Count per Event", 10, -0.5, 9.5);
-        clusterSizePlot = aida.histogram1D(plotClustersDir + clusterCollectionName + " Cluster Size", 10, -0.5, 9.5);
-        clusterEnergyPlot = aida.histogram1D(plotClustersDir + clusterCollectionName + " Cluster Energy", 100, -0.1, maxE);
-        clusterTimes = aida.histogram1D(plotClustersDir + clusterCollectionName + " Cluster Time Mean", 200, 0, 4.0 * 50);
-        clusterTimeSigma = aida.histogram1D(plotClustersDir + clusterCollectionName + " Cluster Time Sigma", 100, 0, 10);
-        twoclusterTotEnergy = aida.histogram1D(plotClustersDir + clusterCollectionName + " Two Cluster Energy Sum", 100, 0, maxE);
-        twoclusterEnergyAsymmetry = aida.histogram1D(plotClustersDir + clusterCollectionName + " Two Cluster Energy Asymmetry", 100, 0, 1.0);
-        energyVsX = aida.histogram2D(plotClustersDir + clusterCollectionName + " Energy vs X", 50, 0, 1.6, 50, .0, 200.0);
-        energyVsY = aida.histogram2D(plotClustersDir + clusterCollectionName + " Energy vs Y", 50, 0, 1.6, 50, 20.0, 85.0);
-
-        fiducialClusterCountPlot = aida.histogram1D(plotClustersDir + clusterCollectionName + " Cluster Count with Fiducal Cut", 10, -0.5, 9.5);
-        fiducialClusterSizePlot = aida.histogram1D(plotClustersDir + clusterCollectionName + " Cluster Size with Fiducal Cut", 10, -0.5, 9.5);
-        fiducialClusterEnergyPlot = aida.histogram1D(plotClustersDir + clusterCollectionName + " Cluster Energy with Fiducal Cut", 100, -0.1, maxE);
-        fiducialenergyVsY = aida.histogram2D(plotClustersDir + clusterCollectionName + " Energy vs Y with Fiducial Cuts", 50, 0, 1.6, 50, 45.0, 85.0);
-        fiducialenergyVsX = aida.histogram2D(plotClustersDir + clusterCollectionName + " Energy vs X with Fiducial Cuts", 50, 0, 1.6, 50, 0.0, 200.0);
+        clusterCountPlot = aida.histogram1D(plotClustersDir +  triggerType + "/"+clusterCollectionName + " Cluster Count per Event", 10, -0.5, 9.5);
+        clusterSizePlot = aida.histogram1D(plotClustersDir +  triggerType + "/"+clusterCollectionName + " Cluster Size", 10, -0.5, 9.5);
+        clusterEnergyPlot = aida.histogram1D(plotClustersDir +  triggerType + "/"+clusterCollectionName + " Cluster Energy", 100, -0.1, maxE);
+        clusterTimes = aida.histogram1D(plotClustersDir +  triggerType + "/"+clusterCollectionName + " Cluster Time Mean", 200, 0, 4.0 * 50);
+        clusterTimeSigma = aida.histogram1D(plotClustersDir +  triggerType + "/"+clusterCollectionName + " Cluster Time Sigma", 100, 0, 10);
+        twoclusterTotEnergy = aida.histogram1D(plotClustersDir +  triggerType + "/"+clusterCollectionName + " Two Cluster Energy Sum", 100, 0, maxE);
+        twoclusterEnergyAsymmetry = aida.histogram1D(plotClustersDir +  triggerType + "/"+clusterCollectionName + " Two Cluster Energy Asymmetry", 100, 0, 1.0);
+        xVsY = aida.histogram2D(plotClustersDir +  triggerType + "/"+clusterCollectionName + "X vs Y (NHits >1)", 200, -200.0, 200.0, 85, -85.0, 85.0);
+        energyVsX = aida.histogram2D(plotClustersDir +  triggerType + "/"+clusterCollectionName + " Energy vs X", 50, 0, 1.6, 50, .0, 200.0);
+        energyVsY = aida.histogram2D(plotClustersDir +  triggerType + "/"+clusterCollectionName + " Energy vs Y", 50, 0, 1.6, 50, 20.0, 85.0);
+        pairsE1vsE2 = aida.histogram2D(plotClustersDir +  triggerType + "/"+clusterCollectionName + "Pair E1 vs E2", 50, 0, 2, 50, 0, 2);
+
+        fiducialClusterCountPlot = aida.histogram1D(plotClustersDir +  triggerType + "/"+plotFidCutDir + clusterCollectionName + " Cluster Count with Fiducal Cut", 10, -0.5, 9.5);
+        fiducialClusterSizePlot = aida.histogram1D(plotClustersDir+  triggerType + "/" +plotFidCutDir + clusterCollectionName + " Cluster Size with Fiducal Cut", 10, -0.5, 9.5);
+        fiducialClusterEnergyPlot = aida.histogram1D(plotClustersDir +  triggerType + "/"+plotFidCutDir  + clusterCollectionName + " Cluster Energy with Fiducal Cut", 100, -0.1, maxE);
+        fiducialenergyVsY = aida.histogram2D(plotClustersDir +  triggerType + "/"+plotFidCutDir + clusterCollectionName + " Energy vs Y with Fiducial Cuts", 50, 0, 1.6, 50, 45.0, 85.0);
+        fiducialenergyVsX = aida.histogram2D(plotClustersDir+  triggerType + "/" +plotFidCutDir + clusterCollectionName + " Energy vs X with Fiducial Cuts", 50, 0, 1.6, 50, 0.0, 200.0);
 
     }
 
     @Override
     public void process(EventHeader event) {
+                
         /*  make sure everything is there */
         List<CalorimeterHit> hits;
         if (event.hasCollection(CalorimeterHit.class, calibratedHitCollectionName))
@@ -122,6 +132,10 @@
         else
             return; //this might be a non-data event
 
+          //check to see if this event is from the correct trigger (or "all");
+        if (!matchTrigger(event))
+            return;
+    
         if (fillHitPlots) {
             hitCountPlot.fill(hits.size());
             int fidHitCount = 0;
@@ -136,9 +150,9 @@
                     fiducialEnergyPlot.fill(hit.getCorrectedEnergy());
                 }
                 fiducialHitCountPlot.fill(fidHitCount);
-                sumHitE+=hit.getCorrectedEnergy();
-            }
-            nTotHits+=hits.size();
+                sumHitE += hit.getCorrectedEnergy();
+            }
+            nTotHits += hits.size();
 
         }
 
@@ -155,11 +169,11 @@
         }
         nEvents++;
         clusterCountPlot.fill(clusters.size());
-        nTotClusters+=clusters.size();
+        nTotClusters += clusters.size();
         int fidcnt = 0;
         for (Cluster cluster : clusters) {
             clusterEnergyPlot.fill(cluster.getEnergy());
-            sumClusterEnergy+=cluster.getEnergy();
+            sumClusterEnergy += cluster.getEnergy();
             double[] times = new double[cluster.getCalorimeterHits().size()];
             double[] energies = new double[cluster.getCalorimeterHits().size()];
             CalorimeterHit seed = cluster.getCalorimeterHits().get(0);
@@ -168,13 +182,16 @@
             if (cluster.getCalorimeterHits().size() > 1) {
                 energyVsX.fill(cluster.getEnergy(), Math.abs(cluster.getPosition()[0]));
                 energyVsY.fill(cluster.getEnergy(), Math.abs(cluster.getPosition()[1]));
+                xVsY.fill(cluster.getPosition()[0], cluster.getPosition()[1]);
             }
             if (Math.abs(iy) > 2 && cluster.getCalorimeterHits().size() > 1) {
                 fidcnt++;
                 fiducialClusterSizePlot.fill(cluster.getCalorimeterHits().size());
                 fiducialClusterEnergyPlot.fill(cluster.getEnergy());
-                if (cluster.getCalorimeterHits().size() > 1)
+                if (cluster.getCalorimeterHits().size() > 1) {
                     fiducialenergyVsY.fill(cluster.getEnergy(), Math.abs(cluster.getPosition()[1]));
+                    fiducialenergyVsX.fill(cluster.getEnergy(), Math.abs(cluster.getPosition()[0]));
+                }
             }
 
             int size = 0;
@@ -186,9 +203,9 @@
             clusterTimes.fill(StatUtils.mean(times, 0, size));
             clusterSizePlot.fill(size); //The number of "hits" in a "cluster"
             clusterTimeSigma.fill(Math.sqrt(StatUtils.variance(times, 0, size)));
-            sumHitPerCluster+=size;
-            sumClusterTime+=StatUtils.mean(times, 0, size);
-            
+            sumHitPerCluster += size;
+            sumClusterTime += StatUtils.mean(times, 0, size);
+
         }
         fiducialClusterCountPlot.fill(fidcnt);
         //make some interesting 2-cluster plots
@@ -201,6 +218,8 @@
             double e2 = cl2.getEnergy();
             twoclusterTotEnergy.fill(e1 + e2);
             twoclusterEnergyAsymmetry.fill(Math.abs(e1 - e2) / (e1 + e2));
+            pairsE1vsE2.fill(e1, e2);
+
         }
 
     }
@@ -213,9 +232,8 @@
     @Override
     public void printDQMData() {
         System.out.println("EcalMonitoring::printDQMData");
-        for (Map.Entry<String, Double> entry : monitoredQuantityMap.entrySet()) {
+        for (Map.Entry<String, Double> entry : monitoredQuantityMap.entrySet())
             System.out.println(entry.getKey() + " = " + entry.getValue());
-        }
         System.out.println("*******************************");
     }
 
@@ -224,14 +242,14 @@
      */
     @Override
     public void calculateEndOfRunQuantities() {
-         if(fillHitPlots){
-            monitoredQuantityMap.put(calibratedHitCollectionName+" " +ecalQuantNames[0], (double) nTotHits / nEvents);
-            monitoredQuantityMap.put(calibratedHitCollectionName+" " +ecalQuantNames[1], (double) sumHitE / nTotHits);
-         }
-         monitoredQuantityMap.put(clusterCollectionName+" " +ecalQuantNames[2], (double) nTotClusters / nEvents);
-         monitoredQuantityMap.put(clusterCollectionName+" " +ecalQuantNames[3], (double) sumHitPerCluster / nTotClusters);
-         monitoredQuantityMap.put(clusterCollectionName+" " +ecalQuantNames[4], (double) sumClusterEnergy / nTotClusters);
-         monitoredQuantityMap.put(clusterCollectionName+" " +ecalQuantNames[5], (double) sumClusterTime / nTotClusters);                 
+        if (fillHitPlots) {
+            monitoredQuantityMap.put(calibratedHitCollectionName + " " + triggerType+" " + ecalQuantNames[0], (double) nTotHits / nEvents);
+            monitoredQuantityMap.put(calibratedHitCollectionName + " " + triggerType+" " + ecalQuantNames[1], (double) sumHitE / nTotHits);
+        }
+        monitoredQuantityMap.put(clusterCollectionName + " " + triggerType+" "+ ecalQuantNames[2], (double) nTotClusters / nEvents);
+        monitoredQuantityMap.put(clusterCollectionName + " " + triggerType+" "+ ecalQuantNames[3], (double) sumHitPerCluster / nTotClusters);
+        monitoredQuantityMap.put(clusterCollectionName + " " + triggerType+" "+ ecalQuantNames[4], (double) sumClusterEnergy / nTotClusters);
+        monitoredQuantityMap.put(clusterCollectionName + " " + triggerType+" "+ ecalQuantNames[5], (double) sumClusterTime / nTotClusters);
     }
 
     @Override

Modified: java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/FinalStateMonitoring.java
 =============================================================================
--- java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/FinalStateMonitoring.java	(original)
+++ java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/FinalStateMonitoring.java	Fri Jun 12 15:27:10 2015
@@ -15,9 +15,12 @@
 import java.util.Map.Entry;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import org.hps.recon.ecal.triggerbank.AbstractIntData;
+import org.hps.recon.ecal.triggerbank.TIData;
 import org.hps.recon.tracking.TrackUtils;
 import org.lcsim.event.Cluster;
 import org.lcsim.event.EventHeader;
+import org.lcsim.event.GenericObject;
 import org.lcsim.event.ReconstructedParticle;
 import org.lcsim.event.Track;
 import org.lcsim.geometry.Detector;
@@ -51,9 +54,16 @@
     //some summers
     double sumdelX = 0.0;
     double sumdelY = 0.0;
-    double sumEoverP = 0.0;   
+    double sumEoverP = 0.0;
     private String plotDir = "FinalStateParticles/";
-
+    double beamEnergy = 1.05; //GeV
+    double maxFactor = 2.5;
+    double feeMomentumCut = 0.8; //GeV
+
+   public void setFinalStateParticlesColName(String fsp){
+       this.finalStateParticlesColName=fsp;
+   }
+    
     @Override
     protected void detectorChanged(Detector detector) {
         System.out.println("FinalStateMonitoring::detectorChanged  Setting up the plotter");
@@ -61,39 +71,52 @@
 
         /*  Final State Particle Quantities   */
         /*  plot electron & positron momentum separately  */
-        IHistogram1D elePx = aida.histogram1D(plotDir + "Electron Px (GeV)", 50, -0.1, 0.200);
-        IHistogram1D elePy = aida.histogram1D(plotDir + "Electron Py (GeV)", 50, -0.1, 0.1);
-        IHistogram1D elePz = aida.histogram1D(plotDir + "Electron Pz (GeV)", 50, 0, 2.5);
-        IHistogram1D elePzBeam = aida.histogram1D(plotDir + "Beam Electrons Pz (GeV)", 50, 1.8, 2.5);
-
-        IHistogram1D posPx = aida.histogram1D(plotDir + "Positron Px (GeV)", 50, -0.1, 0.200);
-        IHistogram1D posPy = aida.histogram1D(plotDir + "Positron Py (GeV)", 50, -0.1, 0.1);
-        IHistogram1D posPz = aida.histogram1D(plotDir + "Positron Pz (GeV)", 50, 0, 2.5);
+        IHistogram1D elePx = aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType + "/" + "Electron Px (GeV)", 100, -0.1, 0.200);
+        IHistogram1D elePy = aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "Electron Py (GeV)", 100, -0.1, 0.1);
+        IHistogram1D elePz = aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "Electron Pz (GeV)", 100, 0, beamEnergy * maxFactor);
+        IHistogram1D elePzBeam = aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "Beam Electrons Total P (GeV)", 100, feeMomentumCut, beamEnergy * maxFactor);
+        IHistogram1D elePzBeamTop = aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "Beam Electrons Total P (GeV):  Top", 100, feeMomentumCut, beamEnergy * maxFactor);
+        IHistogram1D elePzBeamBottom = aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "Beam Electrons Total P (GeV):  Bottom", 100, feeMomentumCut, beamEnergy * maxFactor);
+        IHistogram1D elePTop = aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "Electron Total P (GeV):  Top", 100, 0, beamEnergy * maxFactor);
+        IHistogram1D elePBottom = aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "Electron Total P (GeV):  Bottom", 100, 0, beamEnergy * maxFactor);
+
+        IHistogram1D posPx = aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "Positron Px (GeV)", 50, -0.1, 0.200);
+        IHistogram1D posPy = aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "Positron Py (GeV)", 50, -0.1, 0.1);
+        IHistogram1D posPz = aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "Positron Pz (GeV)", 50, 0, beamEnergy * maxFactor);
+       IHistogram1D posPTop = aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "Positron Total P (GeV):  Top", 100, 0, beamEnergy * maxFactor);
+        IHistogram1D posPBottom = aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "Positron Total P (GeV):  Bottom", 100, 0, beamEnergy * maxFactor);
+
         /*  photon quanties (...right now, just unassociated clusters) */
-        IHistogram1D nPhotonsHisto = aida.histogram1D(plotDir + "Number of photons per event", 15, 0, 15);
-        IHistogram1D enePhoton = aida.histogram1D(plotDir + "Photon Energy (GeV)", 50, 0, 2.4);
-        IHistogram1D xPhoton = aida.histogram1D(plotDir + "Photon X position (mm)", 50, -100, 100);
-        IHistogram1D yPhoton = aida.histogram1D(plotDir + "Photon Y position (mm)", 50, -100, 100);
+        IHistogram1D nPhotonsHisto = aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "Number of photons per event", 15, 0, 15);
+        IHistogram1D enePhoton = aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "Photon Energy (GeV)", 50, 0, 2.4);
+        IHistogram1D xPhoton = aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "Photon X position (mm)", 50, -200, 200);
+        IHistogram1D yPhoton = aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "Photon Y position (mm)", 50, -100, 100);
 
         /*  tracks with associated clusters */
-        IHistogram1D eneOverp = aida.histogram1D(plotDir + "Cluster Energy Over TrackMomentum", 50, 0, 2.0);
-        IHistogram1D deltaXAtCal = aida.histogram1D(plotDir + "delta X @ ECal (mm)", 50, -100, 100.0);
-        IHistogram1D deltaYAtCal = aida.histogram1D(plotDir + "delta Y @ ECal (mm)", 50, -100, 100.0);
-        //IHistogram2D trackXvsECalX = aida.histogram2D(plotDir + "track X vs ECal X", 50, -300, 300.0, 50, -300, 300.0);
-        //IHistogram2D trackYvsECalY = aida.histogram2D(plotDir + "track Y vs ECal Y", 50, -100, 100.0, 50, -100, 100.0);
-        IHistogram2D trackPvsECalE = aida.histogram2D(plotDir + "track mom vs ECal E", 50, 0, 2.5, 50, 0, 2.5);
+        IHistogram1D eneOverp = aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "Cluster Energy Over TrackMomentum", 50, 0, 2.0);
+        IHistogram1D deltaXAtCal = aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "delta X @ ECal (mm)", 50, -50, 50.0);
+        IHistogram1D deltaYAtCal = aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "delta Y @ ECal (mm)", 50, -50, 50.0);
+        //IHistogram2D trackXvsECalX = aida.histogram2D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "track X vs ECal X", 50, -300, 300.0, 50, -300, 300.0);
+        //IHistogram2D trackYvsECalY = aida.histogram2D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "track Y vs ECal Y", 50, -100, 100.0, 50, -100, 100.0);
+        IHistogram2D trackPvsECalE = aida.histogram2D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "track mom vs ECal E", 50, 0.1, beamEnergy * maxFactor, 50, 0.1, beamEnergy * maxFactor);
         /* number of unassocaited tracks/event */
-        IHistogram1D nUnAssTracksHisto = aida.histogram1D(plotDir + "Number of unassociated tracks per event", 5, 0, 5);
+        IHistogram1D nUnAssTracksHisto = aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "Number of unassociated tracks per event", 5, 0, 5);
     }
 
     @Override
     public void process(EventHeader event) {
         /*  make sure everything is there */
-        if (!event.hasCollection(ReconstructedParticle.class, finalStateParticlesColName)){
-            if(debug)
-                    System.out.println(finalStateParticlesColName+" collection not found???");
+
+        if (!event.hasCollection(ReconstructedParticle.class, finalStateParticlesColName)) {
+            if (debug)
+                System.out.println(finalStateParticlesColName + " collection not found???");
             return;
         }
+
+        //check to see if this event is from the correct trigger (or "all");
+        if (!matchTrigger(event))
+            return;
+
         nRecoEvents++;
         int nPhotons = 0;  //number of photons 
         int nUnAssTracks = 0; //number of tracks w/o clusters
@@ -111,7 +134,6 @@
             Cluster fsCluster = null;
             //TODO:  mg-May 14, 2014 use PID to do this instead...not sure if that's implemented yet
             if (fsPart.getTracks().size() == 1)//should always be 1 or zero for final state particles
-
                 fsTrack = fsPart.getTracks().get(0);
             else
                 isPhoton = true;
@@ -127,15 +149,27 @@
                 Hep3Vector mom = fsPart.getMomentum();
                 if (charge < 0) {
                     nTotEle++;
-                    aida.histogram1D(plotDir + "Electron Px (GeV)").fill(mom.x());
-                    aida.histogram1D(plotDir + "Electron Py (GeV)").fill(mom.y());
-                    aida.histogram1D(plotDir + "Electron Pz (GeV)").fill(mom.z());
-                    aida.histogram1D(plotDir + "Beam Electrons Pz (GeV)").fill(mom.z());
+                    aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "Electron Px (GeV)").fill(mom.x());
+                    aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "Electron Py (GeV)").fill(mom.y());
+                    aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "Electron Pz (GeV)").fill(mom.z());
+                    aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "Beam Electrons Total P (GeV)").fill(mom.magnitude());
+                    if (mom.y() > 0){
+                        aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "Beam Electrons Total P (GeV):  Top").fill(mom.magnitude());
+                        aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "Electron Total P (GeV):  Top").fill(mom.magnitude());
+                }            else{
+                        aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "Beam Electrons Total P (GeV):  Bottom").fill(mom.magnitude());
+                        aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "Electron Total P (GeV):  Bottom").fill(mom.magnitude());
+                }
                 } else {
                     nTotPos++;
-                    aida.histogram1D(plotDir + "Positron Px (GeV)").fill(mom.x());
-                    aida.histogram1D(plotDir + "Positron Py (GeV)").fill(mom.y());
-                    aida.histogram1D(plotDir + "Positron Pz (GeV)").fill(mom.z());
+                    aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "Positron Px (GeV)").fill(mom.x());
+                    aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "Positron Py (GeV)").fill(mom.y());
+                    aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "Positron Pz (GeV)").fill(mom.z());
+                      if (mom.y() > 0){
+                        aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "Positron Total P (GeV):  Top").fill(mom.magnitude());
+                }            else{
+                        aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "Positron Total P (GeV):  Bottom").fill(mom.magnitude());
+                }
                 }
 
             }
@@ -151,9 +185,9 @@
                 double ypos = clusterPosition.y();
                 nPhotons++;
                 nTotPhotons++;
-                aida.histogram1D(plotDir + "Photon Energy (GeV)").fill(ene);
-                aida.histogram1D(plotDir + "Photon X position (mm)").fill(xpos);
-                aida.histogram1D(plotDir + "Photon Y position (mm)").fill(ypos);
+                aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "Photon Energy (GeV)").fill(ene);
+                aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "Photon X position (mm)").fill(xpos);
+                aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "Photon Y position (mm)").fill(ypos);
             }
 
             if (hasCluster && !isPhoton) {
@@ -170,13 +204,13 @@
                 sumdelY += dy;
                 sumEoverP += eOverP;
 
-                aida.histogram1D(plotDir + "Cluster Energy Over TrackMomentum").fill(eOverP);
-                aida.histogram1D(plotDir + "delta X @ ECal (mm)").fill(dx);
-                aida.histogram1D(plotDir + "delta Y @ ECal (mm)").fill(dy);
+                aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "Cluster Energy Over TrackMomentum").fill(eOverP);
+                aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "delta X @ ECal (mm)").fill(dx);
+                aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "delta Y @ ECal (mm)").fill(dy);
                 /* here are some plots for debugging track-cluster matching */
-                // aida.histogram2D(plotDir + "track X vs ECal X").fill(trackPosAtEcal.x(), clusterPosition.x());
-                // aida.histogram2D(plotDir + "track Y vs ECal Y").fill(trackPosAtEcal.y(), clusterPosition.y());
-                aida.histogram2D(plotDir + "track mom vs ECal E").fill(fsPart.getMomentum().magnitude(), fsPart.getEnergy());
+                // aida.histogram2D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "track X vs ECal X").fill(trackPosAtEcal.x(), clusterPosition.x());
+                // aida.histogram2D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "track Y vs ECal Y").fill(trackPosAtEcal.y(), clusterPosition.y());
+                aida.histogram2D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "track mom vs ECal E").fill(fsPart.getMomentum().magnitude(), fsPart.getEnergy());
                 //          if(dy<-20)
                 //              System.out.println("Big deltaY...")
 
@@ -186,8 +220,8 @@
                 nTotUnAss++; //and keep a running total for averaging
             }
         }
-        aida.histogram1D(plotDir + "Number of unassociated tracks per event").fill(nUnAssTracks);
-        aida.histogram1D(plotDir + "Number of photons per event").fill(nPhotons);
+        aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "Number of unassociated tracks per event").fill(nUnAssTracks);
+        aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "Number of photons per event").fill(nPhotons);
     }
 
     @Override
@@ -206,21 +240,23 @@
         IAnalysisFactory analysisFactory = IAnalysisFactory.create();
         IFitFactory fitFactory = analysisFactory.createFitFactory();
         IFitter fitter = fitFactory.createFitter("chi2");
-        IHistogram1D beamE = aida.histogram1D(plotDir + "Beam Electrons Pz (GeV)");
+        IHistogram1D beamE = aida.histogram1D(plotDir + finalStateParticlesColName + "/" + triggerType+ "/" + "Beam Electrons Total P (GeV)");
         IFitResult result = fitBeamEnergyPeak(beamE, fitter, "range=\"(-10.0,10.0)\"");
-        double[] pars = result.fittedParameters();
-        for (int i = 0; i < 5; i++)
-            System.out.println("Beam Energy Peak:  " + result.fittedParameterNames()[i] + " = " + pars[i]);
-
-        monitoredQuantityMap.put(fpQuantNames[0], (double) nTotEle / nRecoEvents);
-        monitoredQuantityMap.put(fpQuantNames[1], (double) nTotPos / nRecoEvents);
-        monitoredQuantityMap.put(fpQuantNames[2], (double) nTotPhotons / nRecoEvents);
-        monitoredQuantityMap.put(fpQuantNames[3], (double) nTotUnAss / nRecoEvents);
-        monitoredQuantityMap.put(fpQuantNames[4], (double) sumdelX / nTotAss);
-        monitoredQuantityMap.put(fpQuantNames[5], (double) sumdelY / nTotAss);
-        monitoredQuantityMap.put(fpQuantNames[6], (double) sumEoverP / nTotAss);
-        monitoredQuantityMap.put(fpQuantNames[7], (double) pars[1]);
-        monitoredQuantityMap.put(fpQuantNames[8], (double) pars[2]);
+        if (result != null) {
+            double[] pars = result.fittedParameters();
+            for (int i = 0; i < 5; i++)
+                System.out.println("Beam Energy Peak:  " + result.fittedParameterNames()[i] + " = " + pars[i]);
+            monitoredQuantityMap.put(finalStateParticlesColName + " " + triggerType + " " + fpQuantNames[7], (double) pars[1]);
+            monitoredQuantityMap.put(finalStateParticlesColName + " " + triggerType + " " + fpQuantNames[8], (double) pars[2]);
+        }
+        monitoredQuantityMap.put(finalStateParticlesColName + " " + triggerType + " " + fpQuantNames[0], (double) nTotEle / nRecoEvents);
+        monitoredQuantityMap.put(finalStateParticlesColName + " " + triggerType + " " + fpQuantNames[1], (double) nTotPos / nRecoEvents);
+        monitoredQuantityMap.put(finalStateParticlesColName + " " + triggerType + " " + fpQuantNames[2], (double) nTotPhotons / nRecoEvents);
+        monitoredQuantityMap.put(finalStateParticlesColName + " " + triggerType + " " + fpQuantNames[3], (double) nTotUnAss / nRecoEvents);
+        monitoredQuantityMap.put(finalStateParticlesColName + " " + triggerType + " " + fpQuantNames[4], (double) sumdelX / nTotAss);
+        monitoredQuantityMap.put(finalStateParticlesColName + " " + triggerType + " " + fpQuantNames[5], (double) sumdelY / nTotAss);
+        monitoredQuantityMap.put(finalStateParticlesColName + " " + triggerType + " " + fpQuantNames[6], (double) sumEoverP / nTotAss);
+
         IPlotter plotter = analysisFactory.createPlotterFactory().create("Beam Energy Electrons");
 
         IPlotterStyle pstyle = plotter.style();
@@ -228,7 +264,7 @@
         pstyle.dataStyle().fillStyle().setColor("green");
         pstyle.dataStyle().lineStyle().setColor("black");
         plotter.region(0).plot(beamE);
-        plotter.region(0).plot(result.fittedFunction());
+//        plotter.region(0).plot(result.fittedFunction());
         if (outputPlots)
             try {
                 plotter.writeToFile(outputPlotDir + "beamEnergyElectrons.png");
@@ -249,7 +285,14 @@
 //        return fitter.fit(h1d, "g+p1", init, range);
         double[] init = {20.0, 2.2, 0.12, 10, 0.0};
 //        double[] init = {20.0, 2.2, 0.1};
-        return fitter.fit(h1d, "g+p1", init);
+        IFitResult ifr = null;
+        try {
+            ifr = fitter.fit(h1d, "g+p1", init);
+        } catch (RuntimeException ex) {
+            System.out.println(this.getClass().getSimpleName() + ":  caught exception in fitGaussian");
+        }
+
+        return ifr;
     }
 
 }

Modified: java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/SvtMonitoring.java
 =============================================================================
--- java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/SvtMonitoring.java	(original)
+++ java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/SvtMonitoring.java	Fri Jun 12 15:27:10 2015
@@ -8,14 +8,11 @@
 import hep.aida.IHistogram2D;
 import hep.aida.IPlotter;
 import hep.aida.IPlotterStyle;
-import hep.physics.vec.BasicHep3Vector;
-import hep.physics.vec.Hep3Vector;
 import java.io.IOException;
 import java.sql.SQLException;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import org.hps.recon.tracking.FittedRawTrackerHit;
@@ -26,7 +23,6 @@
 import org.lcsim.event.LCRelation;
 import org.lcsim.event.RawTrackerHit;
 import org.lcsim.event.RelationalTable;
-import org.lcsim.event.SimTrackerHit;
 import org.lcsim.event.TrackerHit;
 import org.lcsim.event.base.BaseRelationalTable;
 import org.lcsim.geometry.Detector;
@@ -90,22 +86,22 @@
         aida.tree().cd("/");
         for (HpsSiSensor sensor : sensors) {
             //IHistogram1D occupancyPlot = aida.histogram1D(sensor.getName().replaceAll("Tracker_TestRunModule_", ""), 640, 0, 639);
-            IHistogram1D occupancyPlot = createSensorPlot(plotDir + "occupancy_", sensor, maxChannels, 0, maxChannels - 1);
-            IHistogram1D t0Plot = createSensorPlot(plotDir + "t0Hit_", sensor, 400, -100., 100.);
-            IHistogram1D nHits = createSensorPlot(plotDir + "nHitsPerEvent_", sensor, 100, -0.5, 99.5);
-            IHistogram1D pileup = createSensorPlot(plotDir + "nFitsPerHit_", sensor, 3, 0.5, 3.5);
-
-            IHistogram1D amplitudePlot = createSensorPlot(plotDir + "amplitude_", sensor, 50, 0, 4000.0);
-            IHistogram2D t0AmpPlot = createSensorPlot2D(plotDir + "t0AmpHit_", sensor, 200, -100., 100., 50, 0, 4000.0);
-            IHistogram2D t0ChanPlot = createSensorPlot2D(plotDir + "t0ChanBigHit_", sensor, 640, -0.5, 639.5, 200, -100., 100.);
-            IHistogram2D ampChanPlot = createSensorPlot2D(plotDir + "ampChanHit_", sensor, 640, -0.5, 639.5, 50, 0, 4000);
-            IHistogram2D chiprobChanPlot = createSensorPlot2D(plotDir + "chiprobChanBigHit_", sensor, 640, -0.5, 639.5, 50, 0, 1.0);
-            IHistogram2D t0TrigTimeHitPlot = createSensorPlot2D(plotDir + "t0BigHitTrigTime_", sensor, 400, -100., 100., 6, -2, 22);
-
-            IHistogram1D chiProbPlot = createSensorPlot(plotDir + "chiProb_", sensor, 50, 0, 1.0);
-            IHistogram1D t0ClusterPlot = createSensorPlot(plotDir + "t0Cluster_", sensor, 400, -100., 100.);
-            IHistogram2D t0TrigTimePlot = createSensorPlot2D(plotDir + "t0ClusterTrigTime_", sensor, 400, -100., 100., 6, -2, 22);
-            IHistogram1D dedxClusterPlot = createSensorPlot(plotDir + "electrons_", sensor, 50, 0., 10.);
+            IHistogram1D occupancyPlot = createSensorPlot(plotDir + triggerType + "/"+"occupancy_", sensor, maxChannels, 0, maxChannels - 1);
+            IHistogram1D t0Plot = createSensorPlot(plotDir + triggerType + "/"+"t0Hit_", sensor, 400, -100., 100.);
+            IHistogram1D nHits = createSensorPlot(plotDir + triggerType + "/"+"nHitsPerEvent_", sensor, 100, -0.5, 99.5);
+            IHistogram1D pileup = createSensorPlot(plotDir + triggerType + "/"+"nFitsPerHit_", sensor, 3, 0.5, 3.5);
+
+            IHistogram1D amplitudePlot = createSensorPlot(plotDir + triggerType + "/"+"amplitude_", sensor, 50, 0, 4000.0);
+            IHistogram2D t0AmpPlot = createSensorPlot2D(plotDir + triggerType + "/"+"t0AmpHit_", sensor, 200, -100., 100., 50, 0, 4000.0);
+            IHistogram2D t0ChanPlot = createSensorPlot2D(plotDir + triggerType + "/"+"t0ChanBigHit_", sensor, 640, -0.5, 639.5, 200, -100., 100.);
+            IHistogram2D ampChanPlot = createSensorPlot2D(plotDir + triggerType + "/"+"ampChanHit_", sensor, 640, -0.5, 639.5, 50, 0, 4000);
+            IHistogram2D chiprobChanPlot = createSensorPlot2D(plotDir + triggerType + "/"+"chiprobChanBigHit_", sensor, 640, -0.5, 639.5, 50, 0, 1.0);
+            IHistogram2D t0TrigTimeHitPlot = createSensorPlot2D(plotDir + triggerType + "/"+"t0BigHitTrigTime_", sensor, 400, -100., 100., 6, 0, 24);
+
+            IHistogram1D chiProbPlot = createSensorPlot(plotDir + triggerType + "/"+"chiProb_", sensor, 50, 0, 1.0);
+            IHistogram1D t0ClusterPlot = createSensorPlot(plotDir + triggerType + "/"+"t0Cluster_", sensor, 400, -100., 100.);
+            IHistogram2D t0TrigTimePlot = createSensorPlot2D(plotDir + triggerType + "/"+"t0ClusterTrigTime_", sensor, 400, -100., 100., 6, 0, 24);
+            IHistogram1D dedxClusterPlot = createSensorPlot(plotDir + triggerType + "/"+"electrons_", sensor, 50, 0., 10.);
             occupancyPlot.reset();
         }
 
@@ -115,6 +111,11 @@
     }
 
     public void process(EventHeader event) {
+
+          //check to see if this event is from the correct trigger (or "all");
+        if (!matchTrigger(event))
+            return;
+        
         /*  increment the strip occupancy arrays */
         Map<String, Integer> hitsPerSensor = new HashMap<String, Integer>();
 
@@ -135,7 +136,7 @@
             ++eventCountRaw;
         }
         for (HpsSiSensor sensor : sensors) {
-            IHistogram1D sensorHist = getSensorPlot(plotDir + "nHitsPerEvent_", sensor);
+            IHistogram1D sensorHist = getSensorPlot(plotDir + triggerType + "/"+"nHitsPerEvent_", sensor);
             Integer nHits = hitsPerSensor.get(sensor.getName());
             if (nHits == null) {
                 sensorHist.fill(0);
@@ -162,16 +163,16 @@
                 double amp = ShapeFitParameters.getAmp(pars);
                 double chiProb = ShapeFitParameters.getChiProb(pars);
                 int channel = rth.getIdentifierFieldValue("strip");
-                getSensorPlot(plotDir + "nFitsPerHit_", sensorName).fill(rthtofit.allFrom(rth).size());
-                getSensorPlot(plotDir + "t0Hit_", sensorName).fill(t0);
-                getSensorPlot(plotDir + "amplitude_", sensorName).fill(amp);
-                getSensorPlot2D(plotDir + "t0AmpHit_", sensorName).fill(t0, amp);
-                getSensorPlot(plotDir + "chiProb_", sensorName).fill(chiProb);
-                getSensorPlot2D(plotDir + "ampChanHit_", sensorName).fill(channel, amp);
+                getSensorPlot(plotDir + triggerType + "/"+"nFitsPerHit_", sensorName).fill(rthtofit.allFrom(rth).size());
+                getSensorPlot(plotDir + triggerType + "/"+"t0Hit_", sensorName).fill(t0);
+                getSensorPlot(plotDir + triggerType + "/"+"amplitude_", sensorName).fill(amp);
+                getSensorPlot2D(plotDir + triggerType + "/"+"t0AmpHit_", sensorName).fill(t0, amp);
+                getSensorPlot(plotDir + triggerType + "/"+"chiProb_", sensorName).fill(chiProb);
+                getSensorPlot2D(plotDir + triggerType + "/"+"ampChanHit_", sensorName).fill(channel, amp);
                 if (amp > 1000.0) {
-                    getSensorPlot2D(plotDir + "t0ChanBigHit_", sensorName).fill(channel, t0);
-                    getSensorPlot2D(plotDir + "chiprobChanBigHit_", sensorName).fill(channel, chiProb);
-                    getSensorPlot2D(plotDir + "t0BigHitTrigTime_", sensorName).fill(t0, event.getTimeStamp() % 24);
+                    getSensorPlot2D(plotDir + triggerType + "/"+"t0ChanBigHit_", sensorName).fill(channel, t0);
+                    getSensorPlot2D(plotDir + triggerType + "/"+"chiprobChanBigHit_", sensorName).fill(channel, chiProb);
+                    getSensorPlot2D(plotDir + triggerType + "/"+"t0BigHitTrigTime_", sensorName).fill(t0, event.getTimeStamp() % 24);
                 }
             }
             ++eventCountFit;
@@ -185,9 +186,9 @@
                 double t0 = cluster.getTime();
                 double dedx = cluster.getdEdx() * 1e6;
 //                System.out.println("dedx = "+dedx);
-                getSensorPlot(plotDir + "t0Cluster_", sensorName).fill(t0);
-                getSensorPlot2D(plotDir + "t0ClusterTrigTime_", sensorName).fill(t0, event.getTimeStamp() % 24);
-                getSensorPlot(plotDir + "electrons_", sensorName).fill(dedx);
+                getSensorPlot(plotDir + triggerType + "/"+"t0Cluster_", sensorName).fill(t0);
+                getSensorPlot2D(plotDir + triggerType + "/"+"t0ClusterTrigTime_", sensorName).fill(t0, event.getTimeStamp() % 24);
+                getSensorPlot(plotDir + triggerType + "/"+"electrons_", sensorName).fill(dedx);
             }
         }
     }
@@ -274,7 +275,7 @@
         for (HpsSiSensor sensor : sensors) {
             Double avg = 0.0;
             //IHistogram1D sensorHist = aida.histogram1D(sensor.getName());
-            IHistogram1D sensorHist = getSensorPlot(plotDir + "occupancy_", sensor);
+            IHistogram1D sensorHist = getSensorPlot(plotDir + triggerType + "/"+"occupancy_", sensor);
             sensorHist.reset();
             int[] strips = occupancyMap.get(sensor.getName());
             for (int i = 0; i < strips.length; i++) {
@@ -309,7 +310,7 @@
         int irTop = 0;
         int irBot = 0;
         for (HpsSiSensor sensor : sensors) {
-            IHistogram1D sensPlot = getSensorPlot(plotDir + "t0Hit_", sensor);
+            IHistogram1D sensPlot = getSensorPlot(plotDir + triggerType + "/"+"t0Hit_", sensor);
             IFitResult result = fitGaussian(sensPlot, fitter, "range=\"(-8.0,8.0)\"");
 
             boolean isTop = sensor.isTopLayer();
@@ -357,9 +358,9 @@
     @Override
     public void printDQMData() {
         for (HpsSiSensor sensor : sensors) {
-            System.out.println(avgOccupancyNames.get(sensor.getName()) + ":  " + avgOccupancyMap.get(sensor.getName()));
-            System.out.println(avgt0Names.get(sensor.getName()) + ":  " + avgt0Map.get(sensor.getName()));
-            System.out.println(sigt0Names.get(sensor.getName()) + ":  " + sigt0Map.get(sensor.getName()));
+            System.out.println(avgOccupancyNames.get(sensor.getName()) + "  " +triggerType+" " + avgOccupancyMap.get(sensor.getName()));
+            System.out.println(avgt0Names.get(sensor.getName()) + "  " +triggerType+" " + avgt0Map.get(sensor.getName()));
+            System.out.println(sigt0Names.get(sensor.getName()) + "  " +triggerType+" " + sigt0Map.get(sensor.getName()));
         }
     }
 

Modified: java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/TrackingMonitoring.java
 =============================================================================
--- java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/TrackingMonitoring.java	(original)
+++ java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/TrackingMonitoring.java	Fri Jun 12 15:27:10 2015
@@ -1,10 +1,15 @@
 package org.hps.analysis.dataquality;
 
+import hep.aida.IFitFactory;
+import hep.aida.IFitResult;
+import hep.aida.IFitter;
 import hep.aida.IHistogram1D;
 import hep.aida.IHistogram2D;
+import hep.physics.vec.Hep3Vector;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
+import org.hps.recon.tracking.TrackUtils;
 import org.lcsim.detector.tracker.silicon.HpsSiSensor;
 import org.lcsim.event.EventHeader;
 import org.lcsim.event.LCRelation;
@@ -15,6 +20,7 @@
 import org.lcsim.event.base.BaseRelationalTable;
 import org.lcsim.geometry.Detector;
 import org.lcsim.geometry.IDDecoder;
+import org.lcsim.util.aida.AIDA;
 
 /**
  * DQM driver for reconstructed track quantities plots things like number of
@@ -46,7 +52,92 @@
     double sumslope = 0;
     double sumchisq = 0;
     private final String plotDir = "Tracks/";
+    private final String positronDir = "Positrons/";
+    private final String electronDir = "Electrons/";
+    private final String topDir = "Top/";
+    private final String botDir = "Bottom/";
+    private final String hthplotDir = "HelicalTrackHits/";
+    private final String timeresidDir = "HitTimeResiduals/";
     String[] trackingQuantNames = {"avg_N_tracks", "avg_N_hitsPerTrack", "avg_d0", "avg_z0", "avg_absslope", "avg_chi2"};
+    int nmodules = 6;
+    IHistogram1D[] hthTop = new IHistogram1D[nmodules];
+    IHistogram1D[] hthBot = new IHistogram1D[nmodules];
+    IHistogram2D[] xvsyTop = new IHistogram2D[nmodules];
+    IHistogram2D[] xvsyBot = new IHistogram2D[nmodules];
+    IHistogram2D[] xvsyOnTrackTop = new IHistogram2D[nmodules];
+    IHistogram2D[] xvsyOnTrackBot = new IHistogram2D[nmodules];
+    IHistogram2D[] timevstimeTop = new IHistogram2D[nmodules];
+    IHistogram2D[] timevstimeBot = new IHistogram2D[nmodules];
+    IHistogram2D[] timevstimeOnTrackTop = new IHistogram2D[nmodules];
+    IHistogram2D[] timevstimeOnTrackBot = new IHistogram2D[nmodules];
+    IHistogram1D[] deltaTOnTrackTop = new IHistogram1D[nmodules];
+    IHistogram1D[] deltaTOnTrackBot = new IHistogram1D[nmodules];
+
+    IHistogram1D trkYAtECALTop;
+    IHistogram1D trkYAtECALBot;
+
+    IHistogram1D trkChi2Pos;
+    IHistogram1D trkChi2Ele;
+    IHistogram1D trkChi2Top;
+    IHistogram1D trkChi2Bot;
+
+    IHistogram1D nTracksPos;
+    IHistogram1D nTracksEle;
+    IHistogram1D nTracksTop;
+    IHistogram1D nTracksBot;
+
+    IHistogram1D trkd0Pos;
+    IHistogram1D trkd0Ele;
+    IHistogram1D trkd0Top;
+    IHistogram1D trkd0Bot;
+
+    IHistogram1D trkphiPos;
+    IHistogram1D trkphiEle;
+    IHistogram1D trkphiTop;
+    IHistogram1D trkphiBot;
+
+    IHistogram1D trkomegaPos;
+    IHistogram1D trkomegaEle;
+    IHistogram1D trkomegaTop;
+    IHistogram1D trkomegaBot;
+
+    IHistogram1D trklamPos;
+    IHistogram1D trklamEle;
+    IHistogram1D trklamTop;
+    IHistogram1D trklamBot;
+
+    IHistogram1D trkz0Pos;
+    IHistogram1D trkz0Ele;
+    IHistogram1D trkz0Top;
+    IHistogram1D trkz0Bot;
+
+    IHistogram1D nHitsPos;
+    IHistogram1D nHitsEle;
+    IHistogram1D nHitsTop;
+    IHistogram1D nHitsBot;
+
+    IHistogram1D trkTimePos;
+    IHistogram1D trkTimeEle;
+    IHistogram1D trkTimeTop;
+    IHistogram1D trkTimeBot;
+
+    IHistogram2D d0VsPhi0;
+    IHistogram2D d0Vsomega;
+    IHistogram2D d0Vslambda;
+    IHistogram2D d0Vsz0;
+    IHistogram2D phi0Vsomega;
+    IHistogram2D phi0Vslambda;
+    IHistogram2D phi0Vsz0;
+    IHistogram2D omegaVslambda;
+    IHistogram2D omegaVsz0;
+    IHistogram2D lamdbaVsz0;
+
+    double d0Cut = 5.0;
+    double phiCut = 0.2;
+    double omegaCut = 0.0005;
+    double lambdaCut = 0.1;
+    double z0Cut = 1.0;
+    double timeCut=24.0;
 
     public void setHelicalTrackHitCollectionName(String helicalTrackHitCollectionName) {
         this.helicalTrackHitCollectionName = helicalTrackHitCollectionName;
@@ -61,18 +152,89 @@
         this.detector = detector;
         aida.tree().cd("/");
 
-        IHistogram1D trkChi2 = aida.histogram1D(plotDir + "Track Chi2", 25, 0, 25.0);
-        IHistogram1D nTracks = aida.histogram1D(plotDir + "Tracks per Event", 6, 0, 6);
-        IHistogram1D trkd0 = aida.histogram1D(plotDir + "d0 ", 25, -5.0, 5.0);
-        IHistogram1D trkphi = aida.histogram1D(plotDir + "sinphi ", 25, -0.2, 0.2);
-        IHistogram1D trkomega = aida.histogram1D(plotDir + "omega ", 25, -0.00025, 0.00025);
-        IHistogram1D trklam = aida.histogram1D(plotDir + "tan(lambda) ", 25, -0.1, 0.1);
-        IHistogram1D trkz0 = aida.histogram1D(plotDir + "z0 ", 25, -1.0, 1.0);
-        IHistogram1D nHits = aida.histogram1D(plotDir + "Hits per Track", 2, 5, 7);
-        IHistogram1D trackMeanTime = aida.histogram1D(plotDir + "Mean time of hits on track", 400, -100., 100.);
-        IHistogram1D trackRMSTime = aida.histogram1D(plotDir + "RMS time of hits on track", 200, 0., 15.);
-        IHistogram2D trackChi2RMSTime = aida.histogram2D(plotDir + "Track chi2 vs. RMS time of hits", 200, 0., 15., 25, 0, 25.0);
-        IHistogram1D seedRMSTime = aida.histogram1D(plotDir + "RMS time of hits on seed layers", 200, 0., 15.);
+        IHistogram1D trkChi2 = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "Track Chi2", 50, 0, 25.0);
+        IHistogram1D nTracks = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "Tracks per Event", 6, 0, 6);
+        IHistogram1D trkd0 = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "d0 ", 50, -d0Cut, d0Cut);
+        IHistogram1D trkphi = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "sinphi ", 50, -phiCut, phiCut);
+        IHistogram1D trkomega = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "omega ", 50, -omegaCut, omegaCut);
+        IHistogram1D trklam = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "tan(lambda) ", 50, -lambdaCut, lambdaCut);
+        IHistogram1D trkz0 = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "z0 ", 50, -z0Cut, z0Cut);
+        IHistogram1D nHits = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "Hits per Track", 4, 3, 7);
+        IHistogram1D trackMeanTime = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "Mean time of hits on track", 100, -timeCut, timeCut);
+        IHistogram1D trackRMSTime = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "RMS time of hits on track", 100, 0., 15.);
+        IHistogram2D trackChi2RMSTime = aida.histogram2D(plotDir + trackCollectionName + "/" + triggerType + "/" + "Track chi2 vs. RMS time of hits", 100, 0., 15., 25, 0, 25.0);
+        IHistogram1D seedRMSTime = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "RMS time of hits on seed layers", 100, 0., 15.);
+        trkYAtECALTop = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "Track Y at ECAL: Top", 100, 0, 100);
+        trkYAtECALBot = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "Track Y at ECAL: Bot", 100, 0, 100);
+        for (int i = 1; i <= nmodules; i++) {
+            xvsyTop[i - 1] = aida.histogram2D(plotDir + triggerType + "/" + hthplotDir + "Module " + i + " Top", 250, -100, 150, 30, 0, 60);
+            xvsyBot[i - 1] = aida.histogram2D(plotDir + triggerType + "/" + hthplotDir + "Module " + i + " Bottom", 250, -100, 150, 30, 0, 60);
+            xvsyOnTrackTop[i - 1] = aida.histogram2D(plotDir + triggerType + "/" + hthplotDir + "Module " + i + " Top, Hits On Tracks", 250, -100, 150, 30, 0, 60);
+            xvsyOnTrackBot[i - 1] = aida.histogram2D(plotDir + triggerType + "/" + hthplotDir + "Module " + i + " Bottom, Hits On Tracks", 250, -100, 150, 30, 0, 60);
+            timevstimeTop[i - 1] = aida.histogram2D(plotDir + triggerType + "/" + hthplotDir + "Module " + i + " Top: Hit Times", 30, -15, 15, 30, -15, 15);
+            timevstimeBot[i - 1] = aida.histogram2D(plotDir + triggerType + "/" + hthplotDir + "Module " + i + " Bottom: Hit Times", 30, -15, 15, 30, -15, 15);
+            hthTop[i - 1] = aida.histogram1D(plotDir + triggerType + "/" + hthplotDir + "Module " + i + " Top: Track Hits", 25, 0, 25);
+            hthBot[i - 1] = aida.histogram1D(plotDir + triggerType + "/" + hthplotDir + "Module " + i + " Bottom: Track Hits", 25, 0, 25);
+            timevstimeOnTrackTop[i - 1] = aida.histogram2D(plotDir + triggerType + "/" + hthplotDir + "Module " + i + " Top: Hit Times, Hits On Tracks", 30, -15, 15, 30, -15, 15);
+            timevstimeOnTrackBot[i - 1] = aida.histogram2D(plotDir + triggerType + "/" + hthplotDir + "Module " + i + " Bottom: Hit Times, Hits On Tracks", 30, -15, 15, 30, -15, 15);
+            deltaTOnTrackTop[i - 1] = aida.histogram1D(plotDir + triggerType + "/" + hthplotDir + "Module " + i + " Top: Hit Time Differences, Hits On Tracks", 50, -25, 25);
+            deltaTOnTrackBot[i - 1] = aida.histogram1D(plotDir + triggerType + "/" + hthplotDir + "Module " + i + " Bottom: Hit Time Differences, Hits On Tracks", 50, -25, 25);
+        }
+
+        trkChi2Pos = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + positronDir + "Track Chi2", 25, 0, 25.0);
+        nTracksPos = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + positronDir + "Tracks per Event", 6, 0, 6);
+        trkd0Pos = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + positronDir + "d0 ", 50, -d0Cut, d0Cut);
+        trkphiPos = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + positronDir + "sinphi ", 50, -phiCut, phiCut);
+        trkomegaPos = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + positronDir + "omega ", 50, -omegaCut, omegaCut);
+        trklamPos = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + positronDir + "tan(lambda) ", 50, -lambdaCut, lambdaCut);
+        trkz0Pos = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + positronDir + "z0 ", 50, -z0Cut, z0Cut);
+        nHitsPos = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + positronDir + "Hits per Track", 4, 3, 7);
+        trkTimePos = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + positronDir + "Mean time of hits on track", 100, -timeCut, timeCut);
+
+        trkChi2Ele = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + electronDir + "Track Chi2", 25, 0, 25.0);
+        nTracksEle = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + electronDir + "Tracks per Event", 6, 0, 6);
+        trkd0Ele = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + electronDir + "d0 ", 50, -d0Cut, d0Cut);
+        trkphiEle = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + electronDir + "sinphi ", 50, -phiCut, phiCut);
+        trkomegaEle = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + electronDir + "omega ", 50, -omegaCut, omegaCut);
+        trklamEle = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + electronDir + "tan(lambda) ", 50, -lambdaCut, lambdaCut);
+        trkz0Ele = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + electronDir + "z0 ", 50, -z0Cut, z0Cut);
+        nHitsEle = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + electronDir + "Hits per Track", 4, 3, 7);
+        trkTimeEle = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + electronDir + "Mean time of hits on track", 100, -timeCut, timeCut);
+
+        trkChi2Top = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + topDir + "Track Chi2", 25, 0, 25.0);
+        nTracksTop = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + topDir + "Tracks per Event", 6, 0, 6);
+        trkd0Top = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + topDir + "d0 ", 50, -d0Cut, d0Cut);
+        trkphiTop = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + topDir + "sinphi ", 50, -phiCut, phiCut);
+        trkomegaTop = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + topDir + "omega ", 50, -omegaCut, omegaCut);
+        trklamTop = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + topDir + "tan(lambda) ", 50, 0.0, lambdaCut);
+        trkz0Top = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + topDir + "z0 ", 50, -z0Cut, z0Cut);
+        nHitsTop = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + topDir + "Hits per Track", 4, 3, 7);
+        trkTimeTop = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + topDir + "Mean time of hits on track", 100, -timeCut, timeCut);
+
+        trkChi2Bot = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + botDir + "Track Chi2", 25, 0, 25.0);
+        nTracksBot = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + botDir + "Tracks per Event", 6, 0, 6);
+        trkd0Bot = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + botDir + "d0 ", 50, -d0Cut, d0Cut);
+        trkphiBot = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + botDir + "sinphi ", 50, -phiCut, phiCut);
+        trkomegaBot = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + botDir + "omega ", 50, -omegaCut, omegaCut);
+        trklamBot = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + botDir + "tan(lambda) ", 50, 0, lambdaCut);
+        trkz0Bot = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + botDir + "z0 ", 50, -z0Cut, z0Cut);
+        nHitsBot = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + botDir + "Hits per Track", 4, 3, 7);
+        trkTimeBot = aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + botDir + "Mean time of hits on track", 100, -timeCut, timeCut);
+
+        //correlation plots
+        d0VsPhi0 = aida.histogram2D(plotDir + trackCollectionName + "/" + triggerType + "/" + "d0 vs sinphi", 50, -d0Cut, d0Cut, 50, -phiCut, phiCut);
+        d0Vsomega = aida.histogram2D(plotDir + trackCollectionName + "/" + triggerType + "/" + "d0 vs omega", 50, -d0Cut, d0Cut, 50, -omegaCut, omegaCut);
+        d0Vslambda = aida.histogram2D(plotDir + trackCollectionName + "/" + triggerType + "/" + "d0 vs tan(lambda)", 50, -d0Cut, d0Cut, 50, -lambdaCut, lambdaCut);
+        d0Vsz0 = aida.histogram2D(plotDir + trackCollectionName + "/" + triggerType + "/" + "d0 vs z0", 50, -d0Cut, d0Cut, 50, -z0Cut, z0Cut);
+
+        phi0Vsomega = aida.histogram2D(plotDir + trackCollectionName + "/" + triggerType + "/" + "phi0 vs omega", 50, -phiCut, phiCut, 50, -omegaCut, omegaCut);
+        phi0Vslambda = aida.histogram2D(plotDir + trackCollectionName + "/" + triggerType + "/" + "phi0 vs tan(lambda)", 50, -phiCut, phiCut, 50, -lambdaCut, lambdaCut);
+        phi0Vsz0 = aida.histogram2D(plotDir + trackCollectionName + "/" + triggerType + "/" + "phi0 vs z0", 50, -phiCut, phiCut, 50, -z0Cut, z0Cut);
+
+        omegaVslambda = aida.histogram2D(plotDir + trackCollectionName + "/" + triggerType + "/" + "omega vs tan(lambda)", 50, -omegaCut, omegaCut, 50, -lambdaCut, lambdaCut);
+        omegaVsz0 = aida.histogram2D(plotDir + trackCollectionName + "/" + triggerType + "/" + "omega vs z0", 50, -omegaCut, omegaCut, 50, -z0Cut, z0Cut);
+
+        lamdbaVsz0 = aida.histogram2D(plotDir + trackCollectionName + "/" + triggerType + "/" + "lambda vs z0", 50, -lambdaCut, lambdaCut, 50, -z0Cut, z0Cut);
 
         // Make a list of SiSensors in the SVT.
         sensors = this.detector.getSubdetector(trackerName).getDetectorElement().findDescendants(HpsSiSensor.class);
@@ -81,7 +243,7 @@
         aida.tree().cd("/");
         for (HpsSiSensor sensor : sensors) {
             //IHistogram1D occupancyPlot = aida.histogram1D(sensor.getName().replaceAll("Tracker_TestRunModule_", ""), 640, 0, 639);
-            IHistogram1D hitTimeResidual = createSensorPlot(plotDir + "hitTimeResidual_", sensor, 100, -20, 20);
+            IHistogram1D hitTimeResidual = createSensorPlot(plotDir + trackCollectionName + "/" + triggerType + "/" + timeresidDir + "hitTimeResidual_", sensor, 100, -20, 20);
         }
 
     }
@@ -91,51 +253,115 @@
 
         aida.tree().cd("/");
 
+        if (!event.hasCollection(LCRelation.class, helicalTrackHitRelationsCollectionName) || !event.hasCollection(LCRelation.class, rotatedHelicalTrackHitRelationsCollectionName))
+            return;
         RelationalTable hittostrip = new BaseRelationalTable(RelationalTable.Mode.MANY_TO_MANY, RelationalTable.Weighting.UNWEIGHTED);
         List<LCRelation> hitrelations = event.get(LCRelation.class, helicalTrackHitRelationsCollectionName);
-        for (LCRelation relation : hitrelations) {
-            if (relation != null && relation.getFrom() != null && relation.getTo() != null) {
+        for (LCRelation relation : hitrelations)
+            if (relation != null && relation.getFrom() != null && relation.getTo() != null)
                 hittostrip.add(relation.getFrom(), relation.getTo());
-            }
-        }
 
         RelationalTable hittorotated = new BaseRelationalTable(RelationalTable.Mode.ONE_TO_ONE, RelationalTable.Weighting.UNWEIGHTED);
         List<LCRelation> rotaterelations = event.get(LCRelation.class, rotatedHelicalTrackHitRelationsCollectionName);
-        for (LCRelation relation : rotaterelations) {
-            if (relation != null && relation.getFrom() != null && relation.getTo() != null) {
+        for (LCRelation relation : rotaterelations)
+            if (relation != null && relation.getFrom() != null && relation.getTo() != null)
                 hittorotated.add(relation.getFrom(), relation.getTo());
+
+        if (!event.hasCollection(TrackerHit.class, helicalTrackHitCollectionName))
+            return;
+
+        //check to see if this event is from the correct trigger (or "all");
+        if (!matchTrigger(event))
+            return;
+        /*  This doesn't work on reco'ed files...fix me! */
+        int[] topHits = {0, 0, 0, 0, 0, 0};
+        int[] botHits = {0, 0, 0, 0, 0, 0};
+        List<TrackerHit> hth = event.get(TrackerHit.class, helicalTrackHitCollectionName);
+        for (TrackerHit hit : hth) {
+            int module = -99;
+            int layer = ((RawTrackerHit) hit.getRawHits().get(0)).getLayerNumber();
+            module = layer/2 + 1;
+
+            Collection<TrackerHit> htsList = hittostrip.allFrom(hit);
+            double hitTimes[] = new double[2];
+            for (TrackerHit hts : htsList) {
+                int stripLayer = ((HpsSiSensor) ((RawTrackerHit) hts.getRawHits().get(0)).getDetectorElement()).getLayerNumber();
+                hitTimes[stripLayer%2] = hts.getTime();
             }
+
+            if (hit.getPosition()[1] > 0) {
+                topHits[module - 1]++;
+                xvsyTop[module - 1].fill(hit.getPosition()[0], hit.getPosition()[1]);
+                timevstimeTop[module - 1].fill(hitTimes[0],hitTimes[1]);
+            } else {
+                botHits[module - 1]++;
+                xvsyBot[module - 1].fill(hit.getPosition()[0], Math.abs(hit.getPosition()[1]));
+                timevstimeBot[module - 1].fill(hitTimes[0],hitTimes[1]);
+            }
+        }
+
+        for (int i = 0; i < nmodules; i++) {
+            hthTop[i].fill(topHits[i]);
+            hthBot[i].fill(botHits[i]);
         }
 
         if (!event.hasCollection(Track.class, trackCollectionName)) {
-            aida.histogram1D(plotDir + "Tracks per Event").fill(0);
+            aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "Tracks per Event").fill(0);
             return;
         }
         nEvents++;
         List<Track> tracks = event.get(Track.class, trackCollectionName);
         nTotTracks += tracks.size();
-        aida.histogram1D(plotDir + "Tracks per Event").fill(tracks.size());
+        aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "Tracks per Event").fill(tracks.size());
+        int cntEle = 0;
+        int cntPos = 0;
+        int cntTop = 0;
+        int cntBot = 0;
+        double ecalFace = 1393.0;//mm
         for (Track trk : tracks) {
+            Hep3Vector trackPosAtEcalFace = TrackUtils.extrapolateTrack(trk, ecalFace);
+            double yAtECal = trackPosAtEcalFace.y();
+            if (yAtECal > 0)
+                trkYAtECALTop.fill(yAtECal);
+            else
+                trkYAtECALBot.fill(Math.abs(yAtECal));
             nTotHits += trk.getTrackerHits().size();
-            aida.histogram1D(plotDir + "Track Chi2").fill(trk.getChi2());
-            aida.histogram1D(plotDir + "Hits per Track").fill(trk.getTrackerHits().size());
-            aida.histogram1D(plotDir + "d0 ").fill(trk.getTrackStates().get(0).getD0());
-            aida.histogram1D(plotDir + "sinphi ").fill(Math.sin(trk.getTrackStates().get(0).getPhi()));
-            aida.histogram1D(plotDir + "omega ").fill(trk.getTrackStates().get(0).getOmega());
-            aida.histogram1D(plotDir + "tan(lambda) ").fill(trk.getTrackStates().get(0).getTanLambda());
-            aida.histogram1D(plotDir + "z0 ").fill(trk.getTrackStates().get(0).getZ0());
-            sumd0 += trk.getTrackStates().get(0).getD0();
-            sumz0 += trk.getTrackStates().get(0).getZ0();
-            sumslope += Math.abs(trk.getTrackStates().get(0).getTanLambda());
-            sumchisq += trk.getChi2();
-
+
+            double d0 = trk.getTrackStates().get(0).getD0();
+            double sinphi0 = Math.sin(trk.getTrackStates().get(0).getPhi());
+            double omega = trk.getTrackStates().get(0).getOmega();
+            double lambda = trk.getTrackStates().get(0).getTanLambda();
+            double z0 = trk.getTrackStates().get(0).getZ0();
+            aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "Track Chi2").fill(trk.getChi2());
+            aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "Hits per Track").fill(trk.getTrackerHits().size());
+            aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "d0 ").fill(trk.getTrackStates().get(0).getD0());
+            aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "sinphi ").fill(Math.sin(trk.getTrackStates().get(0).getPhi()));
+            aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "omega ").fill(trk.getTrackStates().get(0).getOmega());
+            aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "tan(lambda) ").fill(trk.getTrackStates().get(0).getTanLambda());
+            aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "z0 ").fill(trk.getTrackStates().get(0).getZ0());
+            d0VsPhi0.fill(d0, sinphi0);
+            d0Vsomega.fill(d0, omega);
+            d0Vslambda.fill(d0, lambda);
+            d0Vsz0.fill(d0, z0);
+            phi0Vsomega.fill(sinphi0, omega);
+            phi0Vslambda.fill(sinphi0, lambda);
+            phi0Vsz0.fill(sinphi0, z0);
+            omegaVslambda.fill(omega, lambda);
+            omegaVsz0.fill(omega, z0);
+            lamdbaVsz0.fill(lambda, z0);
+
+            //below does not work on recon'ed files            
             int nStrips = 0;
             int nSeedStrips = 0;
             double meanTime = 0;
             double meanSeedTime = 0;
             for (TrackerHit hit : trk.getTrackerHits()) {
                 Collection<TrackerHit> htsList = hittostrip.allFrom(hittorotated.from(hit));
+                double hitTimes[] = new double[2];
                 for (TrackerHit hts : htsList) {
+                    int stripLayer = ((HpsSiSensor) ((RawTrackerHit) hts.getRawHits().get(0)).getDetectorElement()).getLayerNumber();
+                    hitTimes[stripLayer % 2] = hts.getTime();
+
                     nStrips++;
                     meanTime += hts.getTime();
                     int layer = ((HpsSiSensor) ((RawTrackerHit) hts.getRawHits().get(0)).getDetectorElement()).getLayerNumber();
@@ -144,6 +370,17 @@
                         meanSeedTime += hts.getTime();
                     }
                 }
+                int module = ((RawTrackerHit) hit.getRawHits().get(0)).getLayerNumber() / 2 + 1;
+
+                if (hit.getPosition()[2] > 0) {
+                    xvsyOnTrackTop[module - 1].fill(hit.getPosition()[1], hit.getPosition()[2]);
+                    timevstimeOnTrackTop[module - 1].fill(hitTimes[0], hitTimes[1]);
+                    deltaTOnTrackTop[module - 1].fill(hitTimes[0] - hitTimes[1]);
+                } else {
+                    xvsyOnTrackBot[module - 1].fill(hit.getPosition()[1], Math.abs(hit.getPosition()[2]));
+                    timevstimeOnTrackBot[module - 1].fill(hitTimes[0], hitTimes[1]);
+                    deltaTOnTrackBot[module - 1].fill(hitTimes[0] - hitTimes[1]);
+                }
             }
             meanTime /= nStrips;
             meanSeedTime /= nSeedStrips;
@@ -156,50 +393,125 @@
                     rmsTime += Math.pow(hts.getTime() - meanTime, 2);
                     HpsSiSensor sensor = (HpsSiSensor) ((RawTrackerHit) hts.getRawHits().get(0)).getDetectorElement();
                     int layer = sensor.getLayerNumber();
-                    if (layer <= 6) {
+                    if (layer <= 6)
                         rmsSeedTime += Math.pow(hts.getTime() - meanSeedTime, 2);
-                    }
                     String sensorName = getNiceSensorName(sensor);
-                    getSensorPlot(plotDir + "hitTimeResidual_", sensorName).fill(hts.getTime() - meanTime);
+                    getSensorPlot(plotDir + trackCollectionName + "/" + triggerType + "/" + timeresidDir + "hitTimeResidual_", sensorName).fill((hts.getTime() - meanTime) * nStrips / (nStrips - 1)); //correct residual for bias
                 }
             }
             rmsTime = Math.sqrt(rmsTime / nStrips);
-            aida.histogram1D(plotDir + "Mean time of hits on track").fill(meanTime);
-            aida.histogram1D(plotDir + "RMS time of hits on track").fill(rmsTime);
-            aida.histogram2D(plotDir + "Track chi2 vs. RMS time of hits").fill(rmsTime, trk.getChi2());
+            aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "Mean time of hits on track").fill(meanTime);
+            aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "RMS time of hits on track").fill(rmsTime);
+            aida.histogram2D(plotDir + trackCollectionName + "/" + triggerType + "/" + "Track chi2 vs. RMS time of hits").fill(rmsTime, trk.getChi2());
 
             rmsSeedTime = Math.sqrt(rmsSeedTime / nSeedStrips);
-            aida.histogram1D(plotDir + "RMS time of hits on seed layers").fill(rmsSeedTime);
+            aida.histogram1D(plotDir + trackCollectionName + "/" + triggerType + "/" + "RMS time of hits on seed layers").fill(rmsSeedTime);
+
+            if (trk.getTrackStates().get(0).getOmega() < 0) {//positrons
+                trkChi2Pos.fill(trk.getChi2());
+                nHitsPos.fill(trk.getTrackerHits().size());
+                trkd0Pos.fill(trk.getTrackStates().get(0).getD0());
+                trkphiPos.fill(Math.sin(trk.getTrackStates().get(0).getPhi()));
+                trkomegaPos.fill(trk.getTrackStates().get(0).getOmega());
+                trklamPos.fill(trk.getTrackStates().get(0).getTanLambda());
+                trkz0Pos.fill(trk.getTrackStates().get(0).getZ0());
+                trkTimePos.fill(meanTime);
+                cntPos++;
+            } else {
+                trkChi2Ele.fill(trk.getChi2());
+                nHitsEle.fill(trk.getTrackerHits().size());
+                trkd0Ele.fill(trk.getTrackStates().get(0).getD0());
+                trkphiEle.fill(Math.sin(trk.getTrackStates().get(0).getPhi()));
+                trkomegaEle.fill(trk.getTrackStates().get(0).getOmega());
+                trklamEle.fill(trk.getTrackStates().get(0).getTanLambda());
+                trkz0Ele.fill(trk.getTrackStates().get(0).getZ0());
+                trkTimeEle.fill(meanTime);
+                cntEle++;
+            }
+
+            if (trk.getTrackStates().get(0).getTanLambda() < 0) {
+                trkChi2Bot.fill(trk.getChi2());
+                nHitsBot.fill(trk.getTrackerHits().size());
+                trkd0Bot.fill(trk.getTrackStates().get(0).getD0());
+                trkphiBot.fill(Math.sin(trk.getTrackStates().get(0).getPhi()));
+                trkomegaBot.fill(trk.getTrackStates().get(0).getOmega());
+                trklamBot.fill(Math.abs(trk.getTrackStates().get(0).getTanLambda()));
+                trkz0Bot.fill(trk.getTrackStates().get(0).getZ0());
+                trkTimeBot.fill(meanTime);
+
+                cntBot++;
+            } else {
+                trkChi2Top.fill(trk.getChi2());
+                nHitsTop.fill(trk.getTrackerHits().size());
+                trkd0Top.fill(trk.getTrackStates().get(0).getD0());
+                trkphiTop.fill(Math.sin(trk.getTrackStates().get(0).getPhi()));
+                trkomegaTop.fill(trk.getTrackStates().get(0).getOmega());
+                trklamTop.fill(Math.abs(trk.getTrackStates().get(0).getTanLambda()));
+                trkz0Top.fill(trk.getTrackStates().get(0).getZ0());
+                trkTimeTop.fill(meanTime);
+                cntTop++;
+            }
+
+            sumd0 += trk.getTrackStates().get(0).getD0();
+            sumz0 += trk.getTrackStates().get(0).getZ0();
+            sumslope += Math.abs(trk.getTrackStates().get(0).getTanLambda());
+            sumchisq += trk.getChi2();
+
 //            System.out.format("%d seed strips, RMS time %f\n", nSeedStrips, rmsSeedTime);
-
 //            System.out.format("%d strips, mean time %f, RMS time %f\n", nStrips, meanTime, rmsTime);
         }
+        nTracksTop.fill(cntTop);
+        nTracksBot.fill(cntBot);
+        nTracksPos.fill(cntPos);
+        nTracksEle.fill(cntEle);
     }
 
     @Override
     public void calculateEndOfRunQuantities() {
-        monitoredQuantityMap.put(trackingQuantNames[0], (double) nTotTracks / nEvents);
-        monitoredQuantityMap.put(trackingQuantNames[1], (double) nTotHits / nTotTracks);
-        monitoredQuantityMap.put(trackingQuantNames[2], sumd0 / nTotTracks);
-        monitoredQuantityMap.put(trackingQuantNames[3], sumz0 / nTotTracks);
-        monitoredQuantityMap.put(trackingQuantNames[4], sumslope / nTotTracks);
-        monitoredQuantityMap.put(trackingQuantNames[5], sumchisq / nTotTracks);
+        IFitFactory fitFactory = AIDA.defaultInstance().analysisFactory().createFitFactory();
+        IFitter fitter = fitFactory.createFitter("chi2");
+
+        for (HpsSiSensor sensor : sensors) {
+            //IHistogram1D occupancyPlot = aida.histogram1D(sensor.getName().replaceAll("Tracker_TestRunModule_", ""), 640, 0, 639);
+            IHistogram1D hitTimeResidual = getSensorPlot(plotDir + trackCollectionName + "/" + triggerType + "/" + timeresidDir + "hitTimeResidual_", getNiceSensorName(sensor));
+            IFitResult result = fitGaussian(hitTimeResidual, fitter, "range=\"(-20.0,20.0)\"");
+            if (result != null)
+                System.out.format("%s\t%f\t%f\t%d\t%d\n", getNiceSensorName(sensor), result.fittedParameters()[1], result.fittedParameters()[2], sensor.getFebID(), sensor.getFebHybridID());
+        }
+
+        monitoredQuantityMap.put(trackCollectionName + " " + triggerType + " " + trackingQuantNames[0], (double) nTotTracks / nEvents);
+        monitoredQuantityMap.put(trackCollectionName + " " + triggerType + " " + trackingQuantNames[1], (double) nTotHits / nTotTracks);
+        monitoredQuantityMap.put(trackCollectionName + " " + triggerType + " " + trackingQuantNames[2], sumd0 / nTotTracks);
+        monitoredQuantityMap.put(trackCollectionName + " " + triggerType + " " + trackingQuantNames[3], sumz0 / nTotTracks);
+        monitoredQuantityMap.put(trackCollectionName + " " + triggerType + " " + trackingQuantNames[4], sumslope / nTotTracks);
+        monitoredQuantityMap.put(trackCollectionName + " " + triggerType + " " + trackingQuantNames[5], sumchisq / nTotTracks);
+    }
+
+    IFitResult fitGaussian(IHistogram1D h1d, IFitter fitter, String range) {
+        double[] init = {h1d.maxBinHeight(), h1d.mean(), h1d.rms()};
+        IFitResult ifr = null;
+        try {
+            ifr = fitter.fit(h1d, "g", init, range);
+        } catch (RuntimeException ex) {
+            System.out.println(this.getClass().getSimpleName() + ":  caught exception in fitGaussian");
+        }
+        return ifr;
+//        double[] init = {20.0, 0.0, 1.0, 20, -1};
+//        return fitter.fit(h1d, "g+p1", init, range);
     }
 
     @Override
     public void printDQMData() {
         System.out.println("ReconMonitoring::printDQMData");
-        for (Map.Entry<String, Double> entry : monitoredQuantityMap.entrySet()) {
+        for (Map.Entry<String, Double> entry : monitoredQuantityMap.entrySet())
             System.out.println(entry.getKey() + " = " + entry.getValue());
-        }
         System.out.println("*******************************");
     }
 
     @Override
     public void printDQMStrings() {
-        for (Map.Entry<String, Double> entry : monitoredQuantityMap.entrySet()) {
+        for (Map.Entry<String, Double> entry : monitoredQuantityMap.entrySet())
             System.out.println("ALTER TABLE dqm ADD " + entry.getKey() + " double;");
-        }
     }
 
     private IHistogram1D getSensorPlot(String prefix, HpsSiSensor sensor) {

Modified: java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/TrackingResiduals.java
 =============================================================================
--- java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/TrackingResiduals.java	(original)
+++ java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/TrackingResiduals.java	Fri Jun 12 15:27:10 2015
@@ -55,16 +55,16 @@
         aida.tree().cd("/");
         resetOccupancyMap();
         for (int i = 1; i <= nmodules; i++) {
-            IHistogram1D xresid = aida.histogram1D(plotDir + posresDir + "Module " + i + " Top x Residual", 50, -getRange(i, true), getRange(i, true));
-            IHistogram1D yresid = aida.histogram1D(plotDir + posresDir + "Module " + i + " Top y Residual", 50, -getRange(i, false), getRange(i, false));
-            IHistogram1D xresidbot = aida.histogram1D(plotDir + posresDir + "Module " + i + " Bot x Residual", 50, -getRange(i, true), getRange(i, true));
-            IHistogram1D yresidbot = aida.histogram1D(plotDir + posresDir + "Module " + i + " Bot y Residual", 50, -getRange(i, false), getRange(i, false));
+            IHistogram1D xresid = aida.histogram1D(plotDir + triggerType + "/"+posresDir + "Module " + i + " Top x Residual", 50, -getRange(i, true), getRange(i, true));
+            IHistogram1D yresid = aida.histogram1D(plotDir + triggerType + "/"+posresDir + "Module " + i + " Top y Residual", 50, -getRange(i, false), getRange(i, false));
+            IHistogram1D xresidbot = aida.histogram1D(plotDir + triggerType + "/"+posresDir + "Module " + i + " Bot x Residual", 50, -getRange(i, true), getRange(i, true));
+            IHistogram1D yresidbot = aida.histogram1D(plotDir + triggerType + "/"+posresDir + "Module " + i + " Bot y Residual", 50, -getRange(i, false), getRange(i, false));
         }
 
         for (int i = 1; i <= nmodules * 2; i++) {
-            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));
+            IHistogram1D tresid = aida.histogram1D(plotDir + triggerType + "/"+timeresDir + "HalfModule " + i + " t Residual", 50, -20, 20);
+            IHistogram1D utopresid = aida.histogram1D(plotDir + triggerType + "/"+uresDir + "HalfModule " + i + " Top u Residual", 50, -getRange((i + 1) / 2, false), getRange((i + 1) / 2, false));
+            IHistogram1D ubotresid = aida.histogram1D(plotDir + triggerType + "/"+uresDir + "HalfModule " + i + " Bot u Residual", 50, -getRange((i + 1) / 2, false), getRange((i + 1) / 2, false));
         }
     }
 
@@ -75,7 +75,10 @@
             return;
         if (!event.hasCollection(GenericObject.class, trackResidualsCollectionName))
             return;
-        nEvents++;
+          //check to see if this event is from the correct trigger (or "all");
+        if (!matchTrigger(event))
+            return;
+        nEvents++;        
         List<GenericObject> trdList = event.get(GenericObject.class, trackResidualsCollectionName);
         for (GenericObject trd : trdList) {
             int nResid = trd.getNDouble();
@@ -83,11 +86,11 @@
             for (int i = 1; i <= nResid; i++)
 
                 if (isBot == 1) {
-                    aida.histogram1D(plotDir + posresDir + "Module " + i + " Bot x Residual").fill(trd.getDoubleVal(i - 1));//x is the double value in the generic object
-                    aida.histogram1D(plotDir + posresDir + "Module " + i + " Bot y Residual").fill(trd.getFloatVal(i - 1));//y is the float value in the generic object
+                    aida.histogram1D(plotDir + triggerType + "/"+posresDir + "Module " + i + " Bot x Residual").fill(trd.getDoubleVal(i - 1));//x is the double value in the generic object
+                    aida.histogram1D(plotDir + triggerType + "/"+posresDir + "Module " + i + " Bot y Residual").fill(trd.getFloatVal(i - 1));//y is the float value in the generic object
                 } else {
-                    aida.histogram1D(plotDir + posresDir + "Module " + i + " Top x Residual").fill(trd.getDoubleVal(i - 1));//x is the double value in the generic object
-                    aida.histogram1D(plotDir + posresDir + "Module " + i + " Top y Residual").fill(trd.getFloatVal(i - 1));//y is the float value in the generic object                    
+                    aida.histogram1D(plotDir + triggerType + "/"+posresDir + "Module " + i + " Top x Residual").fill(trd.getDoubleVal(i - 1));//x is the double value in the generic object
+                    aida.histogram1D(plotDir + triggerType + "/"+posresDir + "Module " + i + " Top y Residual").fill(trd.getFloatVal(i - 1));//y is the float value in the generic object                    
                 }
         }
 
@@ -95,7 +98,7 @@
         for (GenericObject ttd : ttdList) {
             int nResid = ttd.getNDouble();
             for (int i = 1; i <= nResid; i++)
-                aida.histogram1D(plotDir + timeresDir + "HalfModule " + i + " t Residual").fill(ttd.getDoubleVal(i - 1));//x is the double value in the generic object               
+                aida.histogram1D(plotDir + triggerType + "/"+timeresDir + "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;
@@ -108,9 +111,9 @@
 
             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                 
+                aida.histogram1D(plotDir + triggerType + "/"+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                 
+                aida.histogram1D(plotDir + triggerType + "/"+uresDir + "HalfModule " + i + " Bot u Residual").fill(resid);//x is the double value in the generic object                 
 
         }
     }
@@ -150,54 +153,61 @@
         int irYTop = 0;
         int irYBot = 0;
         for (int i = 1; i <= nmodules; i++) {
-            IHistogram1D xresidTop = aida.histogram1D(plotDir + posresDir + "Module " + i + " Top x Residual");
-            IHistogram1D yresidTop = aida.histogram1D(plotDir + posresDir + "Module " + i + " Top y Residual");
-            IHistogram1D xresidBot = aida.histogram1D(plotDir + posresDir + "Module " + i + " Bot x Residual");
-            IHistogram1D yresidBot = aida.histogram1D(plotDir + posresDir + "Module " + i + " Bot y Residual");
+            IHistogram1D xresidTop = aida.histogram1D(plotDir + triggerType + "/"+posresDir + "Module " + i + " Top x Residual");
+            IHistogram1D yresidTop = aida.histogram1D(plotDir + triggerType + "/"+posresDir + "Module " + i + " Top y Residual");
+            IHistogram1D xresidBot = aida.histogram1D(plotDir + triggerType + "/"+posresDir + "Module " + i + " Bot x Residual");
+            IHistogram1D yresidBot = aida.histogram1D(plotDir + triggerType + "/"+posresDir + "Module " + i + " Bot y Residual");
             IFitResult xresultTop = fitGaussian(xresidTop, fitter, "range=\"(-1.0,1.0)\"");
             IFitResult yresultTop = fitGaussian(yresidTop, fitter, "range=\"(-0.5,0.5)\"");
             IFitResult xresultBot = fitGaussian(xresidBot, fitter, "range=\"(-1.0,1.0)\"");
             IFitResult yresultBot = fitGaussian(yresidBot, fitter, "range=\"(-8.0,8.0)\"");
-            double[] parsXTop = xresultTop.fittedParameters();
-            double[] parsYTop = yresultTop.fittedParameters();
-            double[] parsXBot = xresultBot.fittedParameters();
-            double[] parsYBot = yresultBot.fittedParameters();
-
-            plotterXTop.region(irXTop).plot(xresidTop);
-            plotterXTop.region(irXTop).plot(xresultTop.fittedFunction());
-            irXTop++;
-            plotterXBottom.region(irXBot).plot(xresidBot);
-            plotterXBottom.region(irXBot).plot(xresultBot.fittedFunction());
-            irXBot++;
-
-            plotterYTop.region(irYTop).plot(yresidTop);
-            plotterYTop.region(irYTop).plot(yresultTop.fittedFunction());
-            irYTop++;
-            plotterYBottom.region(irYBot).plot(yresidBot);
-            plotterYBottom.region(irYBot).plot(yresultBot.fittedFunction());
-            irYBot++;
-
-            xposTopMeanResidMap.put(getQuantityName(0, 0, 1, i) + "_x", parsXTop[1]);
-            xposTopSigmaResidMap.put(getQuantityName(0, 1, 1, i) + "_x", parsXTop[2]);
-            yposTopMeanResidMap.put(getQuantityName(0, 0, 1, i) + "_y", parsYTop[1]);
-            yposTopSigmaResidMap.put(getQuantityName(0, 1, 1, i) + "_y", parsYTop[2]);
-            xposBotMeanResidMap.put(getQuantityName(0, 0, 0, i) + "_x", parsXBot[1]);
-            xposBotSigmaResidMap.put(getQuantityName(0, 1, 0, i) + "_x", parsXBot[2]);
-            yposBotMeanResidMap.put(getQuantityName(0, 0, 0, i) + "_y", parsYBot[1]);
-            yposBotSigmaResidMap.put(getQuantityName(0, 1, 0, i) + "_y", parsYBot[2]);
+            if (xresultTop != null) {
+                double[] parsXTop = xresultTop.fittedParameters();
+                plotterXTop.region(irXTop).plot(xresidTop);
+                plotterXTop.region(irXTop).plot(xresultTop.fittedFunction());
+                irXTop++;
+                xposTopMeanResidMap.put(trackResidualsCollectionName+" " +triggerType+" " +getQuantityName(0, 0, 1, i) + "_x", parsXTop[1]);
+                xposTopSigmaResidMap.put(trackResidualsCollectionName+" " +triggerType+" " +getQuantityName(0, 1, 1, i) + "_x", parsXTop[2]);
+            }
+            if (yresultTop != null) {
+                double[] parsYTop = yresultTop.fittedParameters();
+
+                plotterYTop.region(irYTop).plot(yresidTop);
+                plotterYTop.region(irYTop).plot(yresultTop.fittedFunction());
+                irYTop++;
+                yposTopMeanResidMap.put(trackResidualsCollectionName+" " +triggerType+" " +getQuantityName(0, 0, 1, i) + "_y", parsYTop[1]);
+                yposTopSigmaResidMap.put(trackResidualsCollectionName+" " +triggerType+" " +getQuantityName(0, 1, 1, i) + "_y", parsYTop[2]);
+            }
+            if (xresultBot != null) {
+                double[] parsXBot = xresultBot.fittedParameters();
+                plotterXBottom.region(irXBot).plot(xresidBot);
+                plotterXBottom.region(irXBot).plot(xresultBot.fittedFunction());
+                irXBot++;
+                xposBotMeanResidMap.put(trackResidualsCollectionName+" " +triggerType+" " +getQuantityName(0, 0, 0, i) + "_x", parsXBot[1]);
+                xposBotSigmaResidMap.put(trackResidualsCollectionName+" " +triggerType+" " +getQuantityName(0, 1, 0, i) + "_x", parsXBot[2]);
+            }
+            if (yresultBot != null) {
+                double[] parsYBot = yresultBot.fittedParameters();
+                plotterYBottom.region(irYBot).plot(yresidBot);
+                plotterYBottom.region(irYBot).plot(yresultBot.fittedFunction());
+                irYBot++;
+                yposBotMeanResidMap.put(trackResidualsCollectionName+" " +triggerType+" " +getQuantityName(0, 0, 0, i) + "_y", parsYBot[1]);
+                yposBotSigmaResidMap.put(trackResidualsCollectionName+" " +triggerType+" " +getQuantityName(0, 1, 0, i) + "_y", parsYBot[2]);
+            }
 
         }
         int iTime = 0;
         for (int i = 1; i <= nmodules * 2; i++) {
-            IHistogram1D tresid = aida.histogram1D(plotDir + timeresDir + "HalfModule " + i + " t Residual");
+            IHistogram1D tresid = aida.histogram1D(plotDir + triggerType + "/"+timeresDir + "HalfModule " + i + " t Residual");
             IFitResult tresult = fitGaussian(tresid, fitter, "range=\"(-15.0,15.0)\"");
-            double[] parsTime = tresult.fittedParameters();
-            plotterTime.region(iTime).plot(tresid);
-            plotterTime.region(iTime).plot(tresult.fittedFunction());
-            iTime++;
-
-            timeMeanResidMap.put(getQuantityName(1, 0, 2, i) + "_dt", parsTime[1]);
-            timeSigmaResidMap.put(getQuantityName(1, 1, 2, i) + "_dt", parsTime[2]);
+            if (tresult != null) {
+                double[] parsTime = tresult.fittedParameters();
+                plotterTime.region(iTime).plot(tresid);
+                plotterTime.region(iTime).plot(tresult.fittedFunction());
+                iTime++;
+                timeMeanResidMap.put(trackTimeDataCollectionName+" " +triggerType+" " +getQuantityName(1, 0, 2, i) + "_dt", parsTime[1]);
+                timeSigmaResidMap.put(trackTimeDataCollectionName+" " +triggerType+" " +getQuantityName(1, 1, 2, i) + "_dt", parsTime[2]);
+            }
 
         }
 
@@ -331,7 +341,13 @@
 
     IFitResult fitGaussian(IHistogram1D h1d, IFitter fitter, String range) {
         double[] init = {20.0, 0.0, 0.2};
-        return fitter.fit(h1d, "g", init, range);
+        IFitResult ifr = null;
+        try {
+            ifr = fitter.fit(h1d, "g", init, range);
+        } catch (RuntimeException ex) {
+            System.out.println(this.getClass().getSimpleName() + ":  caught exception in fitGaussian");
+        }
+        return ifr;
 //        double[] init = {20.0, 0.0, 1.0, 20, -1};
 //        return fitter.fit(h1d, "g+p1", init, range);
     }

Modified: java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/TridentMonitoring.java
 =============================================================================
--- java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/TridentMonitoring.java	(original)
+++ java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/TridentMonitoring.java	Fri Jun 12 15:27:10 2015
@@ -6,6 +6,8 @@
 import hep.aida.IFitter;
 import hep.aida.IHistogram1D;
 import hep.aida.IHistogram2D;
+import hep.physics.vec.Hep3Vector;
+import hep.physics.vec.VecOp;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -31,21 +33,13 @@
 
     private final String helicalTrackHitRelationsCollectionName = "HelicalTrackHitRelations";
     private final String rotatedHelicalTrackHitRelationsCollectionName = "RotatedHelicalTrackHitRelations";
-    private double ebeam = 2.2;
+    private double ebeam = 1.05;
     String finalStateParticlesColName = "FinalStateParticles";
     String unconstrainedV0CandidatesColName = "UnconstrainedV0Candidates";
     String beamConV0CandidatesColName = "BeamspotConstrainedV0Candidates";
     String targetV0ConCandidatesColName = "TargetConstrainedV0Candidates";
+    String trackListName = "MatchedTracks";
     String[] fpQuantNames = {"nV0_per_Event", "avg_BSCon_mass", "avg_BSCon_Vx", "avg_BSCon_Vy", "avg_BSCon_Vz", "sig_BSCon_Vx", "sig_BSCon_Vy", "sig_BSCon_Vz", "avg_BSCon_Chi2"};
-    //some counters
-    int nRecoEvents = 0;
-    int nTotV0 = 0;
-    //some summers
-    double sumMass = 0.0;
-    double sumVx = 0.0;
-    double sumVy = 0.0;
-    double sumVz = 0.0;
-    double sumChi2 = 0.0;
 
     boolean debug = false;
     private String plotDir = "TridentMonitoring/";
@@ -53,8 +47,54 @@
     IHistogram1D trackTimeDiff;
     IHistogram2D vertexMassMomentum;
     IHistogram2D vertexedTrackMomentum2D;
+    IHistogram2D pyEleVspyPos;
+    IHistogram2D pxEleVspxPos;
     IHistogram2D vertexPxPy;
     IHistogram1D goodVertexMass;
+    IHistogram1D vertexX;
+    IHistogram1D vertexY;
+    IHistogram1D vertexZ;
+
+    IHistogram1D deltaP;
+    IHistogram1D deltaPRad;
+    IHistogram1D sumP;
+    IHistogram2D vertexedTrackMomentum2DRad;
+
+    //clean up event first
+    int nTrkMax = 3;
+    int nPosMax = 1;
+    //v0 cuts   
+    double v0Chi2 = 10;
+    double v0PzMax = 1.25 * ebeam;//GeV 
+    double v0PzMin = 0.1;// GeV
+    double v0PyMax = 0.2;//GeV absolute value
+    double v0PxMax = 0.2;//GeV absolute value
+    double v0VzMax = 25.0;// mm from target...someday make mass dependent
+    double v0VyMax = 1.0;// mm from target...someday make mass dependent
+    double v0VxMax = 2.0;// mm from target...someday make mass dependent
+    //  track quality cuts
+    double trkChi2 = 10;
+    double trkPzMax = 0.9 * ebeam;//GeV
+    double trkPzMin = 0.1;//GeV
+    double trkPyMax = 0.2;//GeV absolute value
+    double trkPxMax = 0.2;//GeV absolute value
+    double trkTimeDiff = 5.0;
+//cut for the radiative-enhanced sample    
+    double radCut = 0.8 * ebeam;
+//cluster matching
+    boolean reqCluster = false;
+    int nClustMax = 3;
+    double eneLossFactor = 0.7; //average E/p roughly
+    double eneOverPCut = 0.3; //|(E/p)_meas - (E/p)_mean|<eneOverPCut
+
+//counters
+    int nRecoEvents = 0;
+    int nPassBasicCuts = 0;
+    int nPassV0PCuts = 0;
+    int nPassV0VCuts = 0;
+    int nPassTrkCuts = 0;
+
+    int nPassClusterCuts = 0;
 
     @Override
     protected void detectorChanged(Detector detector) {
@@ -64,100 +104,115 @@
         /*  V0 Quantities   */
         /*  Mass, vertex, chi^2 of fit */
         /* beamspot constrained */
-//        IHistogram1D nV0 = aida.histogram1D(plotDir + "Number of V0 per event", 10, 0, 10);
-//        IHistogram1D bsconMass = aida.histogram1D(plotDir + "BS Constrained Mass (GeV)", 100, 0, 0.200);
-//        IHistogram1D bsconVx = aida.histogram1D(plotDir + "BS Constrained Vx (mm)", 50, -1, 1);
-//        IHistogram1D bsconVy = aida.histogram1D(plotDir + "BS Constrained Vy (mm)", 50, -1, 1);
-//        IHistogram1D bsconVz = aida.histogram1D(plotDir + "BS Constrained Vz (mm)", 50, -10, 10);
-//        IHistogram1D bsconChi2 = aida.histogram1D(plotDir + "BS Constrained Chi2", 25, 0, 25);
+//        IHistogram1D nV0 = aida.histogram1D(plotDir +  triggerType + "/"+"Number of V0 per event", 10, 0, 10);
+//        IHistogram1D bsconMass = aida.histogram1D(plotDir +  triggerType + "/"+"BS Constrained Mass (GeV)", 100, 0, 0.200);
+//        IHistogram1D bsconVx = aida.histogram1D(plotDir +  triggerType + "/"+"BS Constrained Vx (mm)", 50, -1, 1);
+//        IHistogram1D bsconVy = aida.histogram1D(plotDir +  triggerType + "/"+"BS Constrained Vy (mm)", 50, -1, 1);
+//        IHistogram1D bsconVz = aida.histogram1D(plotDir +  triggerType + "/"+"BS Constrained Vz (mm)", 50, -10, 10);
+//        IHistogram1D bsconChi2 = aida.histogram1D(plotDir +  triggerType + "/"+"BS Constrained Chi2", 25, 0, 25);
 //        /* target constrained */
-//        IHistogram1D tarconMass = aida.histogram1D(plotDir + "Target Constrained Mass (GeV)", 100, 0, 0.200);
-//        IHistogram1D tarconVx = aida.histogram1D(plotDir + "Target Constrained Vx (mm)", 50, -1, 1);
-//        IHistogram1D tarconVy = aida.histogram1D(plotDir + "Target Constrained Vy (mm)", 50, -1, 1);
-//        IHistogram1D tarconVz = aida.histogram1D(plotDir + "Target Constrained Vz (mm)", 50, -10, 10);
-//        IHistogram1D tarconChi2 = aida.histogram1D(plotDir + "Target Constrained Chi2", 25, 0, 25);
-        trackTimeDiff = aida.histogram1D(plotDir + "Track time difference", 100, -25, 25);
-        trackTime2D = aida.histogram2D(plotDir + "Track time vs. track time", 100, -50, 100, 100, -50, 100);
-        vertexMassMomentum = aida.histogram2D(plotDir + "Vertex mass vs. vertex momentum", 100, 0, 4.0, 100, 0, 1.0);
-        vertexedTrackMomentum2D = aida.histogram2D(plotDir + "Positron vs. electron momentum", 100, 0, 2.5, 100, 0, 2.5);
-        vertexPxPy = aida.histogram2D(plotDir + "Vertex Py vs. Px", 100, -0.1, 0.2, 100, -0.1, 0.1);
-        goodVertexMass = aida.histogram1D(plotDir + "Good vertex mass", 100, 0, 0.5);
-
+//        IHistogram1D tarconMass = aida.histogram1D(plotDir +  triggerType + "/"+"Target Constrained Mass (GeV)", 100, 0, 0.200);
+//        IHistogram1D tarconVx = aida.histogram1D(plotDir +  triggerType + "/"+ triggerType + "/"+"Target Constrained Vx (mm)", 50, -1, 1);
+//        IHistogram1D tarconVy = aida.histogram1D(plotDir +  triggerType + "/"+ triggerType + "/"+"Target Constrained Vy (mm)", 50, -1, 1);
+//        IHistogram1D tarconVz = aida.histogram1D(plotDir +  triggerType + "/"+ triggerType + "/"+"Target Constrained Vz (mm)", 50, -10, 10);
+//        IHistogram1D tarconChi2 = aida.histogram1D(plotDir +  triggerType + "/"+ triggerType + "/"+"Target Constrained Chi2", 25, 0, 25);
+        pyEleVspyPos = aida.histogram2D(plotDir + triggerType + "/" + "Py(e) vs Py(p)", 50, -0.04, 0.04, 50, -0.04, 0.04);
+        pxEleVspxPos = aida.histogram2D(plotDir + triggerType + "/" + "Px(e) vs Px(p)", 50, -0.02, 0.06, 50, -0.02, 0.06);
+        trackTimeDiff = aida.histogram1D(plotDir + triggerType + "/" + "Track time difference", 100, -10, 10);
+        trackTime2D = aida.histogram2D(plotDir + triggerType + "/" + "Track time vs. track time", 100, -10, 10, 100, -10, 10);
+        vertexMassMomentum = aida.histogram2D(plotDir + triggerType + "/" + "Vertex mass vs. vertex momentum", 100, 0, 1.1, 100, 0, 0.1);
+        vertexedTrackMomentum2D = aida.histogram2D(plotDir + triggerType + "/" + "Positron vs. electron momentum", 100, 0, 1.1, 100, 0, 1.1);
+        vertexedTrackMomentum2DRad = aida.histogram2D(plotDir + triggerType + "/" + "Positron vs. electron momentum: Radiative", 100, 0, 1.1, 100, 0, 1.1);
+        vertexPxPy = aida.histogram2D(plotDir + triggerType + "/" + "Vertex Py vs. Px", 100, -0.02, 0.06, 100, -0.04, 0.04);
+        goodVertexMass = aida.histogram1D(plotDir + triggerType + "/" + "Good vertex mass", 100, 0, 0.11);
+        deltaP = aida.histogram1D(plotDir + triggerType + "/" + "Positron - electron momentum", 100, -1., 1.0);
+        deltaPRad = aida.histogram1D(plotDir + triggerType + "/" + "Positron - electron momentum", 100, -1., 1.0);
+        sumP = aida.histogram1D(plotDir + triggerType + "/" + "Positron + electron momentum", 100, 0.2, 1.25);
+        vertexX = aida.histogram1D(plotDir + triggerType + "/" + "Vertex X Position (mm)", 100, -v0VxMax, v0VxMax);
+        vertexY = aida.histogram1D(plotDir + triggerType + "/" + "Vertex Y Position (mm)", 100, -v0VyMax, v0VyMax);
+        vertexZ = aida.histogram1D(plotDir + triggerType + "/" + "Vertex Z Position (mm)", 100, -v0VzMax, v0VzMax);
     }
 
     @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;
-        }
+        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;
+        if (!event.hasCollection(Track.class, trackListName))
+            return;
+
+        //check to see if this event is from the correct trigger (or "all");
+        if (!matchTrigger(event))
+            return;
+
         nRecoEvents++;
 
         RelationalTable hittostrip = new BaseRelationalTable(RelationalTable.Mode.MANY_TO_MANY, RelationalTable.Weighting.UNWEIGHTED);
         List<LCRelation> hitrelations = event.get(LCRelation.class, helicalTrackHitRelationsCollectionName);
-        for (LCRelation relation : hitrelations) {
-            if (relation != null && relation.getFrom() != null && relation.getTo() != null) {
+        for (LCRelation relation : hitrelations)
+            if (relation != null && relation.getFrom() != null && relation.getTo() != null)
                 hittostrip.add(relation.getFrom(), relation.getTo());
-            }
-        }
 
         RelationalTable hittorotated = new BaseRelationalTable(RelationalTable.Mode.ONE_TO_ONE, RelationalTable.Weighting.UNWEIGHTED);
         List<LCRelation> rotaterelations = event.get(LCRelation.class, rotatedHelicalTrackHitRelationsCollectionName);
-        for (LCRelation relation : rotaterelations) {
-            if (relation != null && relation.getFrom() != null && relation.getTo() != null) {
+        for (LCRelation relation : rotaterelations)
+            if (relation != null && relation.getFrom() != null && relation.getTo() != null)
                 hittorotated.add(relation.getFrom(), relation.getTo());
-            }
-        }
-
-        List<ReconstructedParticle> beamConstrainedV0List = event.get(ReconstructedParticle.class, beamConV0CandidatesColName);
-//        aida.histogram1D(plotDir + "Number of V0 per event").fill(beamConstrainedV0List.size());
-        for (ReconstructedParticle bsV0 : beamConstrainedV0List) {
-            nTotV0++;
-            Vertex bsVert = bsV0.getStartVertex();
-//            aida.histogram1D(plotDir + "BS Constrained Vx (mm)").fill(bsVert.getPosition().x());
-//            aida.histogram1D(plotDir + "BS Constrained Vy (mm)").fill(bsVert.getPosition().y());
-//            aida.histogram1D(plotDir + "BS Constrained Vz (mm)").fill(bsVert.getPosition().z());
-//            aida.histogram1D(plotDir + "BS Constrained Mass (GeV)").fill(bsV0.getMass());
-//            aida.histogram1D(plotDir + "BS Constrained Chi2").fill(bsVert.getChi2());
-            sumMass += bsV0.getMass();
-            sumVx += bsVert.getPosition().x();
-            sumVy += bsVert.getPosition().y();
-            sumVz += bsVert.getPosition().z();
-            sumChi2 += bsVert.getChi2();
-        }
-
-        List<ReconstructedParticle> targetConstrainedV0List = event.get(ReconstructedParticle.class, targetV0ConCandidatesColName);
-        for (ReconstructedParticle tarV0 : targetConstrainedV0List) {
-            Vertex tarVert = tarV0.getStartVertex();
-//            aida.histogram1D(plotDir + "Target Constrained Vx (mm)").fill(tarVert.getPosition().x());
-//            aida.histogram1D(plotDir + "Target Constrained Vy (mm)").fill(tarVert.getPosition().y());
-//            aida.histogram1D(plotDir + "Target Constrained Vz (mm)").fill(tarVert.getPosition().z());
-//            aida.histogram1D(plotDir + "Target Constrained Mass (GeV)").fill(tarV0.getMass());
-//            aida.histogram1D(plotDir + "Target Constrained Chi2").fill(tarVert.getChi2());
+
+        List<Track> trks = event.get(Track.class, trackListName);
+        int ntracks = trks.size();
+        if (ntracks > nTrkMax || ntracks < 2)
+            return;
+        List<ReconstructedParticle> fspList = event.get(ReconstructedParticle.class, finalStateParticlesColName);
+        int npos = 0;
+        for (ReconstructedParticle fsp : fspList)
+            if (fsp.getCharge() > 0)
+                npos++;
+        if (npos < 1 || npos > nPosMax)
+            return;
+
+        nPassBasicCuts++;//passed some basic event-level cuts...
+
+        List<ReconstructedParticle> unConstrainedV0List = event.get(ReconstructedParticle.class, unconstrainedV0CandidatesColName);
+        for (ReconstructedParticle uncV0 : unConstrainedV0List) {
+            Vertex uncVert = uncV0.getStartVertex();
+//  v0 & vertex-quality cuts
+//            Hep3Vector v0Mom = uncV0.getMomentum();
+            Hep3Vector v0Mom = VecOp.add(uncV0.getParticles().get(1).getMomentum(), uncV0.getParticles().get(0).getMomentum());
+            if (v0Mom.z() > v0PzMax || v0Mom.z() < v0PzMin)
+                break;
+            if (Math.abs(v0Mom.y()) > v0PyMax)
+                break;
+            if (Math.abs(v0Mom.x()) > v0PxMax)
+                break;
+            Hep3Vector v0Vtx = uncVert.getPosition();
+            if (Math.abs(v0Vtx.z()) > v0VzMax)
+                break;
+            if (Math.abs(v0Vtx.y()) > v0VyMax)
+                break;
+            if (Math.abs(v0Vtx.x()) > v0VxMax)
+                break;
+
             List<Track> tracks = new ArrayList<Track>();
             ReconstructedParticle electron = null, positron = null;
-            for (ReconstructedParticle particle : tarV0.getParticles()) {
-                tracks.addAll(particle.getTracks());
-                if (particle.getCharge() > 0) {
+            for (ReconstructedParticle particle : uncV0.getParticles())
+//                tracks.addAll(particle.getTracks());  //add add electron first, then positron...down below
+                if (particle.getCharge() > 0)
                     positron = particle;
-                } else if (particle.getCharge() < 0) {
+                else if (particle.getCharge() < 0)
                     electron = particle;
-                } else {
+                else
                     throw new RuntimeException("expected only electron and positron in vertex, got something with charge 0");
-                }
-            }
-            if (tracks.size() != 2) {
+            tracks.add(electron.getTracks().get(0));
+            tracks.add(positron.getTracks().get(0));
+            if (tracks.size() != 2)
                 throw new RuntimeException("expected two tracks in vertex, got " + tracks.size());
-            }
             List<Double> trackTimes = new ArrayList<Double>();
             for (Track track : tracks) {
                 int nStrips = 0;
@@ -174,15 +229,26 @@
             }
             trackTime2D.fill(trackTimes.get(0), trackTimes.get(1));
             trackTimeDiff.fill(trackTimes.get(0) - trackTimes.get(1));
-            boolean trackTimeDiffCut = Math.abs(trackTimes.get(0) - trackTimes.get(1)) < 5.0;
-            boolean pCut = electron.getMomentum().magnitude() > 0.4 && positron.getMomentum().magnitude() > 0.4;
-            boolean pTotCut = tarV0.getMomentum().magnitude() > 0.8 * 2.2 && tarV0.getMomentum().magnitude() < 2.2;
+            boolean trackTimeDiffCut = Math.abs(trackTimes.get(0) - trackTimes.get(1)) < trkTimeDiff;
+            boolean pCut = electron.getMomentum().magnitude() > trkPzMin && positron.getMomentum().magnitude() > trkPzMin;
+            boolean pTotCut = uncV0.getMomentum().magnitude() > v0PzMin && uncV0.getMomentum().magnitude() < v0PzMax;
             if (trackTimeDiffCut) {
-                vertexMassMomentum.fill(tarV0.getMomentum().magnitude(), tarV0.getMass());
+                vertexMassMomentum.fill(uncV0.getMomentum().magnitude(), uncV0.getMass());
                 vertexedTrackMomentum2D.fill(electron.getMomentum().magnitude(), positron.getMomentum().magnitude());
+                pyEleVspyPos.fill(electron.getMomentum().y(), positron.getMomentum().y());
+                pxEleVspxPos.fill(electron.getMomentum().x(), positron.getMomentum().x());
+                sumP.fill(uncV0.getMomentum().magnitude());
+                deltaP.fill(positron.getMomentum().magnitude() - electron.getMomentum().magnitude());
+                if (uncV0.getMomentum().magnitude() > radCut) {
+                    vertexedTrackMomentum2DRad.fill(electron.getMomentum().magnitude(), positron.getMomentum().magnitude());
+                    deltaPRad.fill(positron.getMomentum().magnitude() - electron.getMomentum().magnitude());
+                }
                 if (pCut && pTotCut) {
-                    vertexPxPy.fill(tarV0.getMomentum().x(), tarV0.getMomentum().y());
-                    goodVertexMass.fill(tarV0.getMass());
+                    vertexPxPy.fill(uncV0.getMomentum().x(), uncV0.getMomentum().y());
+                    goodVertexMass.fill(uncV0.getMass());
+                    vertexX.fill(v0Vtx.x());
+                    vertexY.fill(v0Vtx.y());
+                    vertexZ.fill(v0Vtx.z());
                 }
             }
 //            System.out.println(tarV0.getTracks())
@@ -192,9 +258,8 @@
     @Override
     public void printDQMData() {
         System.out.println("TridentMonitoring::printDQMData");
-        for (Entry<String, Double> entry : monitoredQuantityMap.entrySet()) {
+        for (Entry<String, Double> entry : monitoredQuantityMap.entrySet())
             System.out.println(entry.getKey() + " = " + entry.getValue());
-        }
         System.out.println("*******************************");
     }
 
@@ -207,66 +272,14 @@
         IAnalysisFactory analysisFactory = IAnalysisFactory.create();
         IFitFactory fitFactory = analysisFactory.createFitFactory();
         IFitter fitter = fitFactory.createFitter("chi2");
-//        IHistogram1D bsconVx = aida.histogram1D(plotDir + "BS Constrained Vx (mm)");
-//        IHistogram1D bsconVy = aida.histogram1D(plotDir + "BS Constrained Vy (mm)");
-//        IHistogram1D bsconVz = aida.histogram1D(plotDir + "BS Constrained Vz (mm)");
-//        double[] init = {50.0, 0.0, 0.2, 1.0, 0.0};
-//        IFitResult resVx = fitVertexPosition(bsconVx, fitter, init, "range=\"(-0.5,0.5)\"");
-//        double[] init2 = {50.0, 0.0, 0.04, 1.0, 0.0};
-//        IFitResult resVy = fitVertexPosition(bsconVy, fitter, init2, "range=\"(-0.2,0.2)\"");
-//        double[] init3 = {50.0, 0.0, 3.0, 1.0, 0.0};
-//        IFitResult resVz = fitVertexPosition(bsconVz, fitter, init3, "range=\"(-6,6)\"");
-//
-//        double[] parsVx = resVx.fittedParameters();
-//        double[] parsVy = resVy.fittedParameters();
-//        double[] parsVz = resVz.fittedParameters();
-//
-//        for (int i = 0; i < 5; i++) {
-//            System.out.println("Vertex Fit Parameters:  " + resVx.fittedParameterNames()[i] + " = " + parsVx[i] + "; " + parsVy[i] + "; " + parsVz[i]);
-//        }
-//
-//        IPlotter plotter = analysisFactory.createPlotterFactory().create("Vertex Position");
-//        plotter.createRegions(1, 3);
-//        IPlotterStyle pstyle = plotter.style();
-//        pstyle.legendBoxStyle().setVisible(false);
-//        pstyle.dataStyle().fillStyle().setColor("green");
-//        pstyle.dataStyle().lineStyle().setColor("black");
-//        plotter.region(0).plot(bsconVx);
-//        plotter.region(0).plot(resVx.fittedFunction());
-//        plotter.region(1).plot(bsconVy);
-//        plotter.region(1).plot(resVy.fittedFunction());
-//        plotter.region(2).plot(bsconVz);
-//        plotter.region(2).plot(resVz.fittedFunction());
-//        if (outputPlots) {
-//            try {
-//                plotter.writeToFile(outputPlotDir + "vertex.png");
-//            } catch (IOException ex) {
-//                Logger.getLogger(TridentMonitoring.class.getName()).log(Level.SEVERE, null, ex);
-//            }
-//        }
-//
-//        monitoredQuantityMap.put(fpQuantNames[0], (double) nTotV0 / nRecoEvents);
-//        monitoredQuantityMap.put(fpQuantNames[1], sumMass / nTotV0);
-////        monitoredQuantityMap.put(fpQuantNames[2], sumVx / nTotV0);
-////        monitoredQuantityMap.put(fpQuantNames[3], sumVy / nTotV0);
-////        monitoredQuantityMap.put(fpQuantNames[4], sumVz / nTotV0);
-//        monitoredQuantityMap.put(fpQuantNames[2], parsVx[1]);
-//        monitoredQuantityMap.put(fpQuantNames[3], parsVy[1]);
-//        monitoredQuantityMap.put(fpQuantNames[4], parsVz[1]);
-//        monitoredQuantityMap.put(fpQuantNames[5], parsVx[2]);
-//        monitoredQuantityMap.put(fpQuantNames[6], parsVy[2]);
-//        monitoredQuantityMap.put(fpQuantNames[7], parsVz[2]);
-//
-//        monitoredQuantityMap.put(fpQuantNames[8], sumChi2 / nTotV0);
 
     }
 
     @Override
     public void printDQMStrings() {
         for (int i = 0; i < 9; i++)//TODO:  do this in a smarter way...loop over the map
-        {
+
             System.out.println("ALTER TABLE dqm ADD " + fpQuantNames[i] + " double;");
-        }
     }
 
     IFitResult fitVertexPosition(IHistogram1D h1d, IFitter fitter, double[] init, String range) {

Modified: java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/V0Monitoring.java
 =============================================================================
--- java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/V0Monitoring.java	(original)
+++ java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/V0Monitoring.java	Fri Jun 12 15:27:10 2015
@@ -5,19 +5,29 @@
 import hep.aida.IFitResult;
 import hep.aida.IFitter;
 import hep.aida.IHistogram1D;
+import hep.aida.IHistogram2D;
 import hep.aida.IPlotter;
 import hep.aida.IPlotterStyle;
+import hep.physics.vec.BasicHep3Vector;
+import hep.physics.vec.Hep3Vector;
+import hep.physics.vec.VecOp;
 import java.io.IOException;
-import java.util.HashMap;
+import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 import java.util.Map.Entry;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import org.hps.recon.particle.HpsReconParticleDriver;
+import org.hps.recon.tracking.TrackUtils;
+import org.hps.recon.vertexing.BilliorTrack;
+import org.hps.recon.vertexing.BilliorVertex;
+import org.hps.recon.vertexing.BilliorVertexer;
 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.recon.tracking.seedtracker.SeedTrack;
 
 /**
  * DQM driver V0 particles (i.e. e+e- pars) plots
@@ -36,6 +46,7 @@
     //some counters
     int nRecoEvents = 0;
     int nTotV0 = 0;
+    int nTot2Ele = 0;
     //some summers
     double sumMass = 0.0;
     double sumVx = 0.0;
@@ -43,8 +54,57 @@
     double sumVz = 0.0;
     double sumChi2 = 0.0;
 
+    IHistogram2D pEleVspPos;
+    IHistogram2D pEleVspPosWithCut;
+    IHistogram2D pyEleVspyPos;
+    IHistogram2D pxEleVspxPos;
+
+    IHistogram2D massVsVtxZ;
+    IHistogram2D VtxYVsVtxZ;
+    IHistogram2D VtxXVsVtxZ;
+    IHistogram2D VtxXVsVtxY;
+
+    IHistogram2D pEleVspEle;
+    IHistogram2D pyEleVspyEle;
+    IHistogram2D pxEleVspxEle;
+    IHistogram2D pEleVspEleNoBeam;
+    IHistogram2D pyEleVspyEleNoBeam;
+    IHistogram2D pxEleVspxEleNoBeam;
+    IHistogram2D pEleVspEleMoller;
+    IHistogram2D pEleVsthetaMoller;
+    IHistogram2D thetaEleVsthetaMoller;
+    IHistogram2D pEleVspEleBeamBeam;
+    IHistogram2D pEleVsthetaBeamBeam;
+    IHistogram2D thetaEleVsthetaBeamBeam;
+
+    IHistogram1D mollerMass;
+    IHistogram1D mollerMassVtxCut;
+    IHistogram1D mollerVx;
+    IHistogram1D mollerVy;
+    IHistogram1D mollerVz;
+    IHistogram1D mollerVzVtxCut;
+    IHistogram2D mollerXVsVtxZ;
+    IHistogram2D mollerYVsVtxZ;
+    IHistogram2D mollerXVsVtxY;
+
+    IHistogram1D sumChargeHisto;
+    IHistogram1D numChargeHisto;
+
     boolean debug = false;
     private String plotDir = "V0Monitoring/";
+
+    double beamEnergy = 1.05; //GeV
+    double maxFactor = 1.25;
+    double feeMomentumCut = 0.8; //GeV
+
+    double v0ESumMinCut = 0.8 * beamEnergy;
+    double v0ESumMaxCut = 1.25 * beamEnergy;
+    double v0MaxPCut = 1.1;//GeV
+    double molPSumMin = 0.85;
+    double molPSumMax = 1.3;
+    double beambeamCut = 0.85;
+    double thetaMax = 0.06;
+    double thetaMin = 0.015;
 
     @Override
     protected void detectorChanged(Detector detector) {
@@ -53,20 +113,59 @@
 
         /*  V0 Quantities   */
         /*  Mass, vertex, chi^2 of fit */
+        /*  unconstrained */
+        IHistogram1D unconMass = aida.histogram1D(plotDir + triggerType + "/" + "Unconstrained Mass (GeV)", 100, 0, 0.200);
+        IHistogram1D unconVx = aida.histogram1D(plotDir + triggerType + "/" + "Unconstrained Vx (mm)", 50, -10, 10);
+        IHistogram1D unconVy = aida.histogram1D(plotDir + triggerType + "/" + "Unconstrained Vy (mm)", 50, -10, 10);
+        IHistogram1D unconVz = aida.histogram1D(plotDir + triggerType + "/" + "Unconstrained Vz (mm)", 50, -50, 50);
+        IHistogram1D unconChi2 = aida.histogram1D(plotDir + triggerType + "/" + "Unconstrained Chi2", 25, 0, 25);
         /* beamspot constrained */
-        IHistogram1D nV0 = aida.histogram1D(plotDir + "Number of V0 per event", 10, 0, 10);
-        IHistogram1D bsconMass = aida.histogram1D(plotDir + "BS Constrained Mass (GeV)", 100, 0, 0.200);
-        IHistogram1D bsconVx = aida.histogram1D(plotDir + "BS Constrained Vx (mm)", 200, -5, 5);
-        IHistogram1D bsconVy = aida.histogram1D(plotDir + "BS Constrained Vy (mm)", 200, -5, 5);
-        IHistogram1D bsconVz = aida.histogram1D(plotDir + "BS Constrained Vz (mm)", 200, -50, 50);
-        IHistogram1D bsconChi2 = aida.histogram1D(plotDir + "BS Constrained Chi2", 100, 0, 100);
+
+        IHistogram1D nV0 = aida.histogram1D(plotDir + triggerType + "/" + "Number of V0 per event", 10, 0, 10);
+        IHistogram1D bsconMass = aida.histogram1D(plotDir + triggerType + "/" + "BS Constrained Mass (GeV)", 100, 0, 0.200);
+        IHistogram1D bsconVx = aida.histogram1D(plotDir + triggerType + "/" + "BS Constrained Vx (mm)", 50, -10, 10);
+        IHistogram1D bsconVy = aida.histogram1D(plotDir + triggerType + "/" + "BS Constrained Vy (mm)", 50, -10, 10);
+        IHistogram1D bsconVz = aida.histogram1D(plotDir + triggerType + "/" + "BS Constrained Vz (mm)", 50, -50, 50);
+        IHistogram1D bsconChi2 = aida.histogram1D(plotDir + triggerType + "/" + "BS Constrained Chi2", 25, 0, 25);
         /* target constrained */
-        IHistogram1D tarconMass = aida.histogram1D(plotDir + "Target Constrained Mass (GeV)", 100, 0, 0.200);
-        IHistogram1D tarconVx = aida.histogram1D(plotDir + "Target Constrained Vx (mm)", 200, -5, 5);
-        IHistogram1D tarconVy = aida.histogram1D(plotDir + "Target Constrained Vy (mm)", 200, -5, 5);
-        IHistogram1D tarconVz = aida.histogram1D(plotDir + "Target Constrained Vz (mm)", 200, -50, 50);
-        IHistogram1D tarconChi2 = aida.histogram1D(plotDir + "Target Constrained Chi2", 100, 0, 100);
-
+        IHistogram1D tarconMass = aida.histogram1D(plotDir + triggerType + "/" + "Target Constrained Mass (GeV)", 100, 0, 0.200);
+        IHistogram1D tarconVx = aida.histogram1D(plotDir + triggerType + "/" + "Target Constrained Vx (mm)", 50, -1, 1);
+        IHistogram1D tarconVy = aida.histogram1D(plotDir + triggerType + "/" + "Target Constrained Vy (mm)", 50, -1, 1);
+        IHistogram1D tarconVz = aida.histogram1D(plotDir + triggerType + "/" + "Target Constrained Vz (mm)", 50, -10, 10);
+        IHistogram1D tarconChi2 = aida.histogram1D(plotDir + triggerType + "/" + "Target Constrained Chi2", 25, 0, 25);
+        pEleVspPos = aida.histogram2D(plotDir + triggerType + "/" + "P(e) vs P(p)", 50, 0, beamEnergy * maxFactor, 50, 0, beamEnergy * maxFactor);
+        pEleVspPosWithCut = aida.histogram2D(plotDir + triggerType + "/" + "P(e) vs P(p): Radiative", 50, 0, beamEnergy * maxFactor, 50, 0, beamEnergy * maxFactor);
+        pyEleVspyPos = aida.histogram2D(plotDir + triggerType + "/" + "Py(e) vs Py(p)", 50, -0.04, 0.04, 50, -0.04, 0.04);
+        pxEleVspxPos = aida.histogram2D(plotDir + triggerType + "/" + "Px(e) vs Px(p)", 50, -0.02, 0.06, 50, -0.02, 0.06);
+        massVsVtxZ = aida.histogram2D(plotDir + triggerType + "/" + "Mass vs Vz", 50, 0, 0.15, 50, -50, 80);
+        VtxXVsVtxZ = aida.histogram2D(plotDir + triggerType + "/" + "Vx vs Vz", 100, -10, 10, 100, -50, 80);
+        VtxYVsVtxZ = aida.histogram2D(plotDir + triggerType + "/" + "Vy vs Vz", 100, -5, 5, 100, -50, 80);
+        VtxXVsVtxY = aida.histogram2D(plotDir + triggerType + "/" + "Vx vs Vy", 100, -10, 10, 100, -5, 5);
+        pEleVspEle = aida.histogram2D(plotDir + triggerType + "/" + "2 Electron/P(e) vs P(e)", 50, 0, beamEnergy * maxFactor, 50, 0, beamEnergy * maxFactor);
+        pyEleVspyEle = aida.histogram2D(plotDir + triggerType + "/" + "2 Electron/Py(e) vs Py(e)", 50, -0.04, 0.04, 50, -0.04, 0.04);
+        pxEleVspxEle = aida.histogram2D(plotDir + triggerType + "/" + "2 Electron/Px(e) vs Px(e)", 50, -0.02, 0.06, 50, -0.02, 0.06);
+        pEleVspEleNoBeam = aida.histogram2D(plotDir + triggerType + "/" + "2 Electron/P(e) vs P(e) NoBeam", 50, 0, beambeamCut, 50, 0, beambeamCut);
+        pEleVspEleMoller = aida.histogram2D(plotDir + triggerType + "/" + "2 Electron/P(e) vs P(e) Moller", 50, 0, beambeamCut, 50, 0, beambeamCut);
+        pEleVspEleBeamBeam = aida.histogram2D(plotDir + triggerType + "/" + "2 Electron/P(e) vs P(e) BeamBeam", 50, beambeamCut, beamEnergy * maxFactor, 50, beambeamCut, beamEnergy * maxFactor);
+        pyEleVspyEleNoBeam = aida.histogram2D(plotDir + triggerType + "/" + "2 Electron/Py(e) vs Py(e) NoBeam", 50, -0.04, 0.04, 50, -0.04, 0.04);
+        pxEleVspxEleNoBeam = aida.histogram2D(plotDir + triggerType + "/" + "2 Electron/Px(e) vs Px(e) NoBeam", 50, -0.02, 0.06, 50, -0.02, 0.06);
+        sumChargeHisto = aida.histogram1D(plotDir + triggerType + "/" + "Total Charge of  Event", 5, -2, 3);
+        numChargeHisto = aida.histogram1D(plotDir + triggerType + "/" + "Number of Charged Particles", 6, 0, 6);
+
+        pEleVsthetaMoller = aida.histogram2D(plotDir + triggerType + "/" + "2 Electron/P(e) vs Theta Moller", 50, 0, beambeamCut, 50, thetaMin, thetaMax);
+        thetaEleVsthetaMoller = aida.histogram2D(plotDir + triggerType + "/" + "2 Electron/Theta vs Theta Moller", 50, thetaMin, thetaMax, 50, thetaMin, thetaMax);
+        pEleVsthetaBeamBeam = aida.histogram2D(plotDir + triggerType + "/" + "2 Electron/P(e) vs Theta BeamBeam", 50, beambeamCut, beamEnergy * maxFactor, 50, thetaMin, thetaMax);
+        thetaEleVsthetaBeamBeam = aida.histogram2D(plotDir + triggerType + "/" + "2 Electron/Theta vs Theta BeamBeam", 50, thetaMin, thetaMax, 50, thetaMin, thetaMax);
+
+        mollerMass = aida.histogram1D(plotDir + triggerType + "/" + "2 Electron/Moller Mass (GeV)", 100, 0, 0.100);
+        mollerMassVtxCut = aida.histogram1D(plotDir + triggerType + "/" + "2 Electron/Moller Mass (GeV): VtxCut", 100, 0, 0.100);
+        mollerVx = aida.histogram1D(plotDir + triggerType + "/" + "2 Electron/Moller Vx (mm)", 50, -10, 10);
+        mollerVy = aida.histogram1D(plotDir + triggerType + "/" + "2 Electron/Moller Vy (mm)", 50, -2, 2);
+        mollerVz = aida.histogram1D(plotDir + triggerType + "/" + "2 Electron/Moller Vz (mm)", 50, -50, 50);
+        mollerVzVtxCut = aida.histogram1D(plotDir + triggerType + "/" + "2 Electron/Moller Vz (mm): VtxCut", 50, -50, 50);
+        mollerXVsVtxZ = aida.histogram2D(plotDir + triggerType + "/" + "2 Electron/Moller Vx vs Vz", 100, -5, 5, 100, -50, 50);
+        mollerYVsVtxZ = aida.histogram2D(plotDir + triggerType + "/" + "2 Electron/Moller Vy vs Vz", 100, -2, 2, 100, -50, 50);
+        mollerXVsVtxY = aida.histogram2D(plotDir + triggerType + "/" + "2 Electron/Moller Vx vs Vy", 100, -5, 5, 100, -2, 2);
     }
 
     @Override
@@ -80,18 +179,66 @@
             return;
         if (!event.hasCollection(ReconstructedParticle.class, targetV0ConCandidatesColName))
             return;
+
+        //check to see if this event is from the correct trigger (or "all");
+        if (!matchTrigger(event))
+            return;
+
         nRecoEvents++;
 
+        List<ReconstructedParticle> unonstrainedV0List = event.get(ReconstructedParticle.class, unconstrainedV0CandidatesColName);
+        for (ReconstructedParticle uncV0 : unonstrainedV0List) {
+            Vertex uncVert = uncV0.getStartVertex();
+            aida.histogram1D(plotDir + triggerType + "/" + "Unconstrained Vx (mm)").fill(uncVert.getPosition().x());
+            aida.histogram1D(plotDir + triggerType + "/" + "Unconstrained Vy (mm)").fill(uncVert.getPosition().y());
+            aida.histogram1D(plotDir + triggerType + "/" + "Unconstrained Vz (mm)").fill(uncVert.getPosition().z());
+            aida.histogram1D(plotDir + triggerType + "/" + "Unconstrained Mass (GeV)").fill(uncV0.getMass());
+            aida.histogram1D(plotDir + triggerType + "/" + "Unconstrained Chi2").fill(uncVert.getChi2());
+
+            aida.histogram2D(plotDir + triggerType + "/" + "Mass vs Vz").fill(uncV0.getMass(), uncVert.getPosition().z());
+            VtxXVsVtxZ.fill(uncVert.getPosition().x(), uncVert.getPosition().z());
+            VtxYVsVtxZ.fill(uncVert.getPosition().y(), uncVert.getPosition().z());
+            VtxXVsVtxY.fill(uncVert.getPosition().x(), uncVert.getPosition().y());
+
+            //this always has 2 tracks. 
+            List<ReconstructedParticle> trks = uncV0.getParticles();
+//            Track ele = trks.get(0).getTracks().get(0);
+//            Track pos = trks.get(1).getTracks().get(0);
+//            //if track #0 has charge>0 it's the electron!  This seems mixed up, but remember the track 
+//            //charge is assigned assuming a positive B-field, while ours is negative
+//            if (trks.get(0).getCharge() > 0) {
+//                pos = trks.get(0).getTracks().get(0);
+//                ele = trks.get(1).getTracks().get(0);
+//            }
+//            aida.histogram2D(plotDir + triggerType + "/" + "P(e) vs P(p)").fill(getMomentum(ele), getMomentum(pos));
+//            aida.histogram2D(plotDir + triggerType + "/" + "Px(e) vs Px(p)").fill(ele.getTrackStates().get(0).getMomentum()[1], pos.getTrackStates().get(0).getMomentum()[1]);
+//            aida.histogram2D(plotDir + triggerType + "/" + "Py(e) vs Py(p)").fill(ele.getTrackStates().get(0).getMomentum()[2], pos.getTrackStates().get(0).getMomentum()[2]);
+            ReconstructedParticle ele = trks.get(0);
+            ReconstructedParticle pos = trks.get(1);
+            //ReconParticles have the charge correct. 
+            if (trks.get(0).getCharge() > 0) {
+                pos = trks.get(0);
+                ele = trks.get(1);
+            }
+            double pe = ele.getMomentum().magnitude();
+            double pp = pos.getMomentum().magnitude();
+            aida.histogram2D(plotDir + triggerType + "/" + "P(e) vs P(p)").fill(pe, pp);
+            aida.histogram2D(plotDir + triggerType + "/" + "Px(e) vs Px(p)").fill(ele.getMomentum().x(), pos.getMomentum().x());
+            aida.histogram2D(plotDir + triggerType + "/" + "Py(e) vs Py(p)").fill(ele.getMomentum().y(), pos.getMomentum().y());
+            if (pe < v0MaxPCut && pp < v0MaxPCut && (pe + pp) > v0ESumMinCut && (pe + pp) < v0ESumMaxCut)//enrich radiative-like events
+                aida.histogram2D(plotDir + triggerType + "/" + "P(e) vs P(p): Radiative").fill(pe, pp);
+        }
+
         List<ReconstructedParticle> beamConstrainedV0List = event.get(ReconstructedParticle.class, beamConV0CandidatesColName);
-        aida.histogram1D(plotDir + "Number of V0 per event").fill(beamConstrainedV0List.size());
+        aida.histogram1D(plotDir + triggerType + "/" + "Number of V0 per event").fill(beamConstrainedV0List.size());
         for (ReconstructedParticle bsV0 : beamConstrainedV0List) {
             nTotV0++;
             Vertex bsVert = bsV0.getStartVertex();
-            aida.histogram1D(plotDir + "BS Constrained Vx (mm)").fill(bsVert.getPosition().x());
-            aida.histogram1D(plotDir + "BS Constrained Vy (mm)").fill(bsVert.getPosition().y());
-            aida.histogram1D(plotDir + "BS Constrained Vz (mm)").fill(bsVert.getPosition().z());
-            aida.histogram1D(plotDir + "BS Constrained Mass (GeV)").fill(bsV0.getMass());
-            aida.histogram1D(plotDir + "BS Constrained Chi2").fill(bsVert.getChi2());
+            aida.histogram1D(plotDir + triggerType + "/" + "BS Constrained Vx (mm)").fill(bsVert.getPosition().x());
+            aida.histogram1D(plotDir + triggerType + "/" + "BS Constrained Vy (mm)").fill(bsVert.getPosition().y());
+            aida.histogram1D(plotDir + triggerType + "/" + "BS Constrained Vz (mm)").fill(bsVert.getPosition().z());
+            aida.histogram1D(plotDir + triggerType + "/" + "BS Constrained Mass (GeV)").fill(bsV0.getMass());
+            aida.histogram1D(plotDir + triggerType + "/" + "BS Constrained Chi2").fill(bsVert.getChi2());
             sumMass += bsV0.getMass();
             sumVx += bsVert.getPosition().x();
             sumVy += bsVert.getPosition().y();
@@ -102,11 +249,90 @@
         List<ReconstructedParticle> targetConstrainedV0List = event.get(ReconstructedParticle.class, targetV0ConCandidatesColName);
         for (ReconstructedParticle tarV0 : targetConstrainedV0List) {
             Vertex tarVert = tarV0.getStartVertex();
-            aida.histogram1D(plotDir + "Target Constrained Vx (mm)").fill(tarVert.getPosition().x());
-            aida.histogram1D(plotDir + "Target Constrained Vy (mm)").fill(tarVert.getPosition().y());
-            aida.histogram1D(plotDir + "Target Constrained Vz (mm)").fill(tarVert.getPosition().z());
-            aida.histogram1D(plotDir + "Target Constrained Mass (GeV)").fill(tarV0.getMass());
-            aida.histogram1D(plotDir + "Target Constrained Chi2").fill(tarVert.getChi2());
+            aida.histogram1D(plotDir + triggerType + "/" + "Target Constrained Vx (mm)").fill(tarVert.getPosition().x());
+            aida.histogram1D(plotDir + triggerType + "/" + "Target Constrained Vy (mm)").fill(tarVert.getPosition().y());
+            aida.histogram1D(plotDir + triggerType + "/" + "Target Constrained Vz (mm)").fill(tarVert.getPosition().z());
+            aida.histogram1D(plotDir + triggerType + "/" + "Target Constrained Mass (GeV)").fill(tarV0.getMass());
+            aida.histogram1D(plotDir + triggerType + "/" + "Target Constrained Chi2").fill(tarVert.getChi2());
+        }
+        List<ReconstructedParticle> finalStateParticles = event.get(ReconstructedParticle.class, finalStateParticlesColName);
+        if (debug)
+            System.out.println("This events has " + finalStateParticles.size() + " final state particles");
+
+        ReconstructedParticle ele1 = null;
+        ReconstructedParticle ele2 = null;
+        int sumCharge = 0;
+        int numChargedParticles = 0;
+        for (ReconstructedParticle fsPart : finalStateParticles) {
+            if (debug)
+                System.out.println("PDGID = " + fsPart.getParticleIDUsed() + "; charge = " + fsPart.getCharge() + "; pz = " + fsPart.getMomentum().x());
+            double charge = fsPart.getCharge();
+            sumCharge += charge;
+            if (charge != 0) {
+                numChargedParticles++;
+                if (charge < 1)
+                    if (ele1 == null)
+                        ele1 = fsPart;
+                    else
+                        ele2 = fsPart;
+            }
+        }
+        sumChargeHisto.fill(sumCharge);
+        numChargeHisto.fill(numChargedParticles);
+
+        if (ele1 != null && ele2 != null) {
+            Hep3Vector p1 = ele1.getMomentum();
+            Hep3Vector p2 = ele2.getMomentum();
+            Hep3Vector beamAxis = new BasicHep3Vector(Math.sin(0.0305), 0, Math.cos(0.0305));
+            double theta1 = Math.acos(VecOp.dot(p1, beamAxis) / p1.magnitude());
+            double theta2 = Math.acos(VecOp.dot(p2, beamAxis) / p2.magnitude());
+            pEleVspEle.fill(ele1.getMomentum().magnitude(), ele2.getMomentum().magnitude());
+            pyEleVspyEle.fill(ele1.getMomentum().y(), ele2.getMomentum().y());
+            pxEleVspxEle.fill(ele1.getMomentum().x(), ele2.getMomentum().x());
+            //remove beam electrons
+            if (ele1.getMomentum().magnitude() < beambeamCut && ele2.getMomentum().magnitude() < beambeamCut) {
+                pEleVspEleNoBeam.fill(ele1.getMomentum().magnitude(), ele2.getMomentum().magnitude());
+                pyEleVspyEleNoBeam.fill(ele1.getMomentum().y(), ele2.getMomentum().y());
+                pxEleVspxEleNoBeam.fill(ele1.getMomentum().x(), ele2.getMomentum().x());
+            }
+            //look at beam-beam events
+            if (ele1.getMomentum().magnitude() > beambeamCut && ele2.getMomentum().magnitude() > beambeamCut) {
+                pEleVspEleBeamBeam.fill(ele1.getMomentum().magnitude(), ele2.getMomentum().magnitude());
+                pEleVsthetaBeamBeam.fill(p1.magnitude(), theta1);
+                pEleVsthetaBeamBeam.fill(p2.magnitude(), theta2);
+                thetaEleVsthetaBeamBeam.fill(theta1, theta2);
+            }
+
+            //look at "Moller" events (if that's what they really are
+            if (ele1.getMomentum().magnitude() + ele2.getMomentum().magnitude() > molPSumMin
+                    && ele1.getMomentum().magnitude() + ele2.getMomentum().magnitude() < molPSumMax
+                    && (p1.magnitude() < beambeamCut && p2.magnitude() < beambeamCut)) {
+
+                Track ele1trk = ele1.getTracks().get(0);
+                Track ele2trk = ele2.getTracks().get(0);
+                SeedTrack stEle1 = TrackUtils.makeSeedTrackFromBaseTrack(ele1trk);
+                SeedTrack stEle2 = TrackUtils.makeSeedTrackFromBaseTrack(ele2trk);
+                BilliorTrack btEle1 = new BilliorTrack(stEle1.getSeedCandidate().getHelix());
+                BilliorTrack btEle2 = new BilliorTrack(stEle2.getSeedCandidate().getHelix());
+                BilliorVertex bv = fitVertex(btEle1, btEle2);
+//                System.out.println("ee vertex: "+bv.toString());
+                mollerMass.fill(bv.getParameters().get("invMass"));
+                mollerVx.fill(bv.getPosition().x());
+                mollerVy.fill(bv.getPosition().y());
+                mollerVz.fill(bv.getPosition().z());
+                mollerXVsVtxZ.fill(bv.getPosition().x(), bv.getPosition().z());
+                mollerYVsVtxZ.fill(bv.getPosition().y(), bv.getPosition().z());
+                mollerXVsVtxY.fill(bv.getPosition().x(), bv.getPosition().y());
+                if (Math.abs(bv.getPosition().x()) < 2
+                        && Math.abs(bv.getPosition().y()) < 0.5) {
+                    mollerMassVtxCut.fill(bv.getParameters().get("invMass"));
+                    mollerVzVtxCut.fill(bv.getPosition().z());
+                }
+                pEleVspEleMoller.fill(p1.magnitude(), p2.magnitude());
+                pEleVsthetaMoller.fill(p1.magnitude(), theta1);
+                pEleVsthetaMoller.fill(p2.magnitude(), theta2);
+                thetaEleVsthetaMoller.fill(theta1, theta2);
+            }
         }
     }
 
@@ -127,9 +353,9 @@
         IAnalysisFactory analysisFactory = IAnalysisFactory.create();
         IFitFactory fitFactory = analysisFactory.createFitFactory();
         IFitter fitter = fitFactory.createFitter("chi2");
-        IHistogram1D bsconVx = aida.histogram1D(plotDir + "BS Constrained Vx (mm)");
-        IHistogram1D bsconVy = aida.histogram1D(plotDir + "BS Constrained Vy (mm)");
-        IHistogram1D bsconVz = aida.histogram1D(plotDir + "BS Constrained Vz (mm)");
+        IHistogram1D bsconVx = aida.histogram1D(plotDir + triggerType + "/" + "BS Constrained Vx (mm)");
+        IHistogram1D bsconVy = aida.histogram1D(plotDir + triggerType + "/" + "BS Constrained Vy (mm)");
+        IHistogram1D bsconVz = aida.histogram1D(plotDir + triggerType + "/" + "BS Constrained Vz (mm)");
         double[] init = {50.0, 0.0, 0.2, 1.0, 0.0};
         IFitResult resVx = fitVertexPosition(bsconVx, fitter, init, "range=\"(-0.5,0.5)\"");
         double[] init2 = {50.0, 0.0, 0.04, 1.0, 0.0};
@@ -137,46 +363,46 @@
         double[] init3 = {50.0, 0.0, 3.0, 1.0, 0.0};
         IFitResult resVz = fitVertexPosition(bsconVz, fitter, init3, "range=\"(-6,6)\"");
 
-        double[] parsVx = resVx.fittedParameters();
-        double[] parsVy = resVy.fittedParameters();
-        double[] parsVz = resVz.fittedParameters();
-
-        for (int i = 0; i < 5; i++)
-            System.out.println("Vertex Fit Parameters:  " + resVx.fittedParameterNames()[i] + " = " + parsVx[i] + "; " + parsVy[i] + "; " + parsVz[i]);
-
-        IPlotter plotter = analysisFactory.createPlotterFactory().create("Vertex Position");
-        plotter.createRegions(1, 3);
-        IPlotterStyle pstyle = plotter.style();
-        pstyle.legendBoxStyle().setVisible(false);
-        pstyle.dataStyle().fillStyle().setColor("green");
-        pstyle.dataStyle().lineStyle().setColor("black");
-        plotter.region(0).plot(bsconVx);
-        plotter.region(0).plot(resVx.fittedFunction());
-        plotter.region(1).plot(bsconVy);
-        plotter.region(1).plot(resVy.fittedFunction());
-        plotter.region(2).plot(bsconVz);
-        plotter.region(2).plot(resVz.fittedFunction());
-        if(outputPlots){
-        try {
-            plotter.writeToFile(outputPlotDir +"vertex.png");
-        } catch (IOException ex) {
-            Logger.getLogger(V0Monitoring.class.getName()).log(Level.SEVERE, null, ex);
-        }
-        }
-
-        monitoredQuantityMap.put(fpQuantNames[0], (double) nTotV0 / nRecoEvents);
-        monitoredQuantityMap.put(fpQuantNames[1], sumMass / nTotV0);
+        if (resVx != null && resVy != null & resVz != null) {
+            double[] parsVx = resVx.fittedParameters();
+            double[] parsVy = resVy.fittedParameters();
+            double[] parsVz = resVz.fittedParameters();
+
+            for (int i = 0; i < 5; i++)
+                System.out.println("Vertex Fit Parameters:  " + resVx.fittedParameterNames()[i] + " = " + parsVx[i] + "; " + parsVy[i] + "; " + parsVz[i]);
+
+            IPlotter plotter = analysisFactory.createPlotterFactory().create("Vertex Position");
+            plotter.createRegions(1, 3);
+            IPlotterStyle pstyle = plotter.style();
+            pstyle.legendBoxStyle().setVisible(false);
+            pstyle.dataStyle().fillStyle().setColor("green");
+            pstyle.dataStyle().lineStyle().setColor("black");
+            plotter.region(0).plot(bsconVx);
+            plotter.region(0).plot(resVx.fittedFunction());
+            plotter.region(1).plot(bsconVy);
+            plotter.region(1).plot(resVy.fittedFunction());
+            plotter.region(2).plot(bsconVz);
+            plotter.region(2).plot(resVz.fittedFunction());
+            if (outputPlots)
+                try {
+                    plotter.writeToFile(outputPlotDir + "vertex.png");
+                } catch (IOException ex) {
+                    Logger.getLogger(V0Monitoring.class.getName()).log(Level.SEVERE, null, ex);
+                }
+
 //        monitoredQuantityMap.put(fpQuantNames[2], sumVx / nTotV0);
 //        monitoredQuantityMap.put(fpQuantNames[3], sumVy / nTotV0);
 //        monitoredQuantityMap.put(fpQuantNames[4], sumVz / nTotV0);
-        monitoredQuantityMap.put(fpQuantNames[2], parsVx[1]);
-        monitoredQuantityMap.put(fpQuantNames[3], parsVy[1]);
-        monitoredQuantityMap.put(fpQuantNames[4], parsVz[1]);
-        monitoredQuantityMap.put(fpQuantNames[5], parsVx[2]);
-        monitoredQuantityMap.put(fpQuantNames[6], parsVy[2]);
-        monitoredQuantityMap.put(fpQuantNames[7], parsVz[2]);
-
-        monitoredQuantityMap.put(fpQuantNames[8], sumChi2 / nTotV0);
+            monitoredQuantityMap.put(beamConV0CandidatesColName + " " + triggerType + " " + fpQuantNames[2], parsVx[1]);
+            monitoredQuantityMap.put(beamConV0CandidatesColName + " " + triggerType + " " + fpQuantNames[3], parsVy[1]);
+            monitoredQuantityMap.put(beamConV0CandidatesColName + " " + triggerType + " " + fpQuantNames[4], parsVz[1]);
+            monitoredQuantityMap.put(beamConV0CandidatesColName + " " + triggerType + " " + fpQuantNames[5], parsVx[2]);
+            monitoredQuantityMap.put(beamConV0CandidatesColName + " " + triggerType + " " + fpQuantNames[6], parsVy[2]);
+            monitoredQuantityMap.put(beamConV0CandidatesColName + " " + triggerType + " " + fpQuantNames[7], parsVz[2]);
+        }
+        monitoredQuantityMap.put(beamConV0CandidatesColName + " " + triggerType + " " + fpQuantNames[0], (double) nTotV0 / nRecoEvents);
+        monitoredQuantityMap.put(beamConV0CandidatesColName + " " + triggerType + " " + fpQuantNames[1], sumMass / nTotV0);
+        monitoredQuantityMap.put(beamConV0CandidatesColName + " " + triggerType + " " + fpQuantNames[8], sumChi2 / nTotV0);
 
     }
 
@@ -186,8 +412,46 @@
             System.out.println("ALTER TABLE dqm ADD " + fpQuantNames[i] + " double;");
     }
 
-    IFitResult fitVertexPosition(IHistogram1D h1d, IFitter fitter, double[] init, String range) {
-        return fitter.fit(h1d, "g+p1", init, range);
+    IFitResult fitVertexPosition(IHistogram1D h1d, IFitter fitter, double[] init, String range
+    ) {
+        IFitResult ifr = null;
+        try {
+            ifr = fitter.fit(h1d, "g+p1", init, range);
+        } catch (RuntimeException ex) {
+            System.out.println(this.getClass().getSimpleName() + ":  caught exception in fitGaussian");
+        }
+        return ifr;
+    }
+
+    private double getMomentum(Track trk) {
+
+        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);
+    }
+
+    private BilliorVertex fitVertex(BilliorTrack electron, BilliorTrack positron) {
+        // Create a vertex fitter from the magnetic field.
+        double bField = 0.24;
+        double[] beamSize = {0.001, 0.2, 0.02};
+        BilliorVertexer vtxFitter = new BilliorVertexer(bField);
+        // TODO: The beam size should come from the conditions database.
+        vtxFitter.setBeamSize(beamSize);
+
+        // Perform the vertexing based on the specified constraint.
+        vtxFitter.doBeamSpotConstraint(false);
+
+        // Add the electron and positron tracks to a track list for
+        // the vertex fitter.
+        List<BilliorTrack> billiorTracks = new ArrayList<BilliorTrack>();
+
+        billiorTracks.add(electron);
+
+        billiorTracks.add(positron);
+
+        // Find and return a vertex based on the tracks.
+        return vtxFitter.fitVertex(billiorTracks);
     }
 
 }

Modified: java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/ecal/EcalHitPlots.java
 =============================================================================
--- java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/ecal/EcalHitPlots.java	(original)
+++ java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/ecal/EcalHitPlots.java	Fri Jun 12 15:27:10 2015
@@ -157,7 +157,7 @@
             for (GenericObject data : triggerList) {
                 if (AbstractIntData.getTag(data) == TestRunTriggerData.BANK_TAG) {
                     TestRunTriggerData triggerData = new TestRunTriggerData(data);
-
+                    
                     int orTrig = triggerData.getOrTrig();
                     if (orTrig != 0) {
                         for (int i = 0; i < 32; i++) {
@@ -190,10 +190,12 @@
                     }
                     break;
                 } else if (AbstractIntData.getTag(data) == SSPData.BANK_TAG) {
-                    SSPData triggerData = new SSPData(data);
-
-                    int orTrig = triggerData.getOrTrig();
-                    if (orTrig != 0) {
+                    //SSPData triggerData = new SSPData(data);
+                    // TODO: TOP, BOTTOM, AND, and OR trigger are test
+                	// run-specific parameters and are not supported by
+                	// SSPData.
+                    int orTrig = 0; //triggerData.getOrTrig();
+                    if(orTrig != 0) {
                         for (int i = 0; i < 32; i++) {
                             if ((1 << (31 - i) & orTrig) != 0) {
                                 orTrigTime = i;
@@ -202,7 +204,7 @@
                             }
                         }
                     }
-                    int topTrig = triggerData.getTopTrig();
+                    int topTrig = 1; //triggerData.getTopTrig();
                     if (topTrig != 0) {
                         for (int i = 0; i < 32; i++) {
                             if ((1 << (31 - i) & topTrig) != 0) {
@@ -212,7 +214,7 @@
                             }
                         }
                     }
-                    int botTrig = triggerData.getBotTrig();
+                    int botTrig = 0; //triggerData.getBotTrig();
                     if (botTrig != 0) {
                         for (int i = 0; i < 32; i++) {
                             if ((1 << (31 - i) & botTrig) != 0) {
@@ -235,13 +237,15 @@
             double botTime = Double.POSITIVE_INFINITY;
             double orTime = Double.POSITIVE_INFINITY;
             for (CalorimeterHit hit : hits) {
-//                if (hit.getIdentifierFieldValue("iy") > 0) {
-//                    topX.fill(hit.getIdentifierFieldValue("ix"),hit.getPosition()[0]);
-//                    topY.fill(hit.getIdentifierFieldValue("iy"),hit.getPosition()[1]);
-//                } else {
-//                    botX.fill(hit.getIdentifierFieldValue("ix"),hit.getPosition()[0]);
-//                    botY.fill(hit.getIdentifierFieldValue("iy"),hit.getPosition()[1]);                    
-//                }
+            	/*
+                if (hit.getIdentifierFieldValue("iy") > 0) {
+                    topX.fill(hit.getIdentifierFieldValue("ix"),hit.getPosition()[0]);
+                    topY.fill(hit.getIdentifierFieldValue("iy"),hit.getPosition()[1]);
+                } else {
+                    botX.fill(hit.getIdentifierFieldValue("ix"),hit.getPosition()[0]);
+                    botY.fill(hit.getIdentifierFieldValue("iy"),hit.getPosition()[1]);                    
+                }
+                */
                 hitEnergyPlot.fill(hit.getRawEnergy());
                 hitTimePlot.fill(hit.getTime());
                 if (hit.getTime() < orTime) {

Modified: java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/examples/EcalScoringMatchDriver.java
 =============================================================================
--- java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/examples/EcalScoringMatchDriver.java	(original)
+++ java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/examples/EcalScoringMatchDriver.java	Fri Jun 12 15:27:10 2015
@@ -31,42 +31,46 @@
         if (hits == null) {
             throw new RuntimeException("Missing ECal hit collection!");
         }
-        List<SimTrackerHit> scoringHits = event.get(SimTrackerHit.class, "TrackerHitsECal");
-        if (scoringHits == null) {
-            throw new RuntimeException("Missing ECal scoring plane hit collection!");
-        }
-        List<SimTrackerHit> fieldHits = event.get(SimTrackerHit.class, "TrackerHitsFieldDef");
-        if (fieldHits == null) {
-            throw new RuntimeException("Missing field boundary scoring plane hit collection!");
-        }
 
         Map<MCParticle, SimTrackerHit> scoringHitMap = new HashMap<MCParticle, SimTrackerHit>();
         Map<MCParticle, SimTrackerHit> fieldHitMap = new HashMap<MCParticle, SimTrackerHit>();
         Map<MCParticle, Double> edepMap = new HashMap<MCParticle, Double>(); //sum of all ECal hit energy contributions from each MCParticle
 
-        for (SimTrackerHit scoringHit : scoringHits) {
-            SimTrackerHit keyHit = scoringHitMap.get(scoringHit.getMCParticle());
+        if (!event.hasCollection(SimTrackerHit.class, "TrackerHitsECal")) {
+            System.out.println("Missing ECal scoring plane hit collection!");
+        } else {
+            List<SimTrackerHit> scoringHits = event.get(SimTrackerHit.class, "TrackerHitsECal");
+            for (SimTrackerHit scoringHit : scoringHits) {
+                SimTrackerHit keyHit = scoringHitMap.get(scoringHit.getMCParticle());
 
-            if (keyHit == null) {
-                scoringHitMap.put(scoringHit.getMCParticle(), scoringHit);
-            } else if (scoringHit.getTime() < keyHit.getTime()) { //keep only the earliest hit from each particle
-                System.out.println("Multiple scoring hits from same particle");
-                scoringHitMap.put(scoringHit.getMCParticle(), scoringHit);
+                if (keyHit == null) {
+                    scoringHitMap.put(scoringHit.getMCParticle(), scoringHit);
+                } else if (scoringHit.getTime() < keyHit.getTime()) { //keep only the earliest hit from each particle
+                    System.out.println("Multiple scoring hits from same particle");
+                    scoringHitMap.put(scoringHit.getMCParticle(), scoringHit);
+                }
             }
         }
-        for (SimTrackerHit fieldHit : fieldHits) {
-            if (fieldHit.getIdentifierFieldValue("layer") != 2) { //reject hits at the -Z end of the magnet
-                continue;
-            }
-            SimTrackerHit keyHit = fieldHitMap.get(fieldHit.getMCParticle());
 
-            if (keyHit == null) {
-                fieldHitMap.put(fieldHit.getMCParticle(), fieldHit);
-            } else if (fieldHit.getTime() < keyHit.getTime()) { //keep only the earliest hit from each particle
-                System.out.println("Multiple scoring hits from same particle");
-                fieldHitMap.put(fieldHit.getMCParticle(), fieldHit);
+        if (!event.hasCollection(SimTrackerHit.class, "TrackerHitsFieldDef")) {
+            System.out.println("Missing field boundary scoring plane hit collection!");
+        } else {
+            List<SimTrackerHit> fieldHits = event.get(SimTrackerHit.class, "TrackerHitsFieldDef");
+            for (SimTrackerHit fieldHit : fieldHits) {
+                if (fieldHit.getIdentifierFieldValue("layer") != 2) { //reject hits at the -Z end of the magnet
+                    continue;
+                }
+                SimTrackerHit keyHit = fieldHitMap.get(fieldHit.getMCParticle());
+
+                if (keyHit == null) {
+                    fieldHitMap.put(fieldHit.getMCParticle(), fieldHit);
+                } else if (fieldHit.getTime() < keyHit.getTime()) { //keep only the earliest hit from each particle
+                    System.out.println("Multiple scoring hits from same particle");
+                    fieldHitMap.put(fieldHit.getMCParticle(), fieldHit);
+                }
             }
         }
+
         for (SimCalorimeterHit hit : hits) {
             for (int i = 0; i < hit.getMCParticleCount(); i++) {
                 MCParticle mcParticle = hit.getMCParticle(i);

Modified: java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/examples/StripEventDriver.java
 =============================================================================
--- java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/examples/StripEventDriver.java	(original)
+++ java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/examples/StripEventDriver.java	Fri Jun 12 15:27:10 2015
@@ -3,6 +3,7 @@
 import java.util.List;
 import org.lcsim.event.EventHeader;
 import org.lcsim.event.Track;
+import org.lcsim.event.Vertex;
 import org.lcsim.util.Driver;
 
 /**
@@ -17,6 +18,7 @@
     private int _minNumberOfTracks = 0;
     private int _minNumberOfHitsOnTrack = 0;
     private int _numberOfEventsWritten = 0;
+    private int _minNumberOfUnconstrainedV0Vertices = 0;
 
     @Override
     protected void process(EventHeader event)
@@ -35,6 +37,12 @@
                     }
                 }
             } else {
+                skipEvent = true;
+            }
+        }
+        if (event.hasCollection(Vertex.class, "UnconstrainedV0Vertices")) {
+            int nVertices = event.get(Vertex.class, "UnconstrainedV0Vertices").size();
+            if (nVertices < _minNumberOfUnconstrainedV0Vertices) {
                 skipEvent = true;
             }
         }
@@ -61,4 +69,9 @@
         _minNumberOfHitsOnTrack = nHits;
     }
 
+    public void setMinNumberOfUnconstrainedV0Vertices(int nVertices)
+    {
+        _minNumberOfUnconstrainedV0Vertices = nVertices;
+    }
+
 }

Modified: java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/trigger/TriggerDiagnosticDriver.java
 =============================================================================
--- java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/trigger/TriggerDiagnosticDriver.java	(original)
+++ java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/trigger/TriggerDiagnosticDriver.java	Fri Jun 12 15:27:10 2015
@@ -1,5 +1,6 @@
 package org.hps.analysis.trigger;
 
+import hep.aida.ICloud2D;
 import hep.aida.IHistogram1D;
 import hep.aida.IHistogram2D;
 
@@ -45,6 +46,9 @@
 import org.lcsim.event.Cluster;
 import org.lcsim.event.EventHeader;
 import org.lcsim.event.GenericObject;
+import org.lcsim.event.LCRelation;
+import org.lcsim.event.base.MyLCRelation;
+import org.lcsim.lcio.LCIOConstants;
 import org.lcsim.util.Driver;
 import org.lcsim.util.aida.AIDA;
 
@@ -54,12 +58,15 @@
 	private String bankCollectionName = "TriggerBank";
 	private String clusterCollectionName = "EcalClusters";
 	private String diagnosticCollectionName = "DiagnosticSnapshot";
+	private static final int clusterCollectionFlag = 1 << LCIOConstants.CLBIT_HITS;
+	private String[] singlesCandidateCollectionName = { "Singles0TriggerCandidates", "Singles1TriggerCandidates" };
+	private String[] pairCandidateCollectionName = { "Pair0TriggerCandidates", "Pair1TriggerCandidates" };
 	
 	// Store the lists of parsed objects.
 	private TIData tiBank;
 	private SSPData sspBank;
+	private List<SSPCluster> sspClusters;
 	private List<Cluster> reconClusters = new ArrayList<Cluster>();
-	private List<SSPCluster> sspClusters;
 	private List<List<PairTrigger<Cluster[]>>> reconPairsTriggers = new ArrayList<List<PairTrigger<Cluster[]>>>(2);
 	private List<List<PairTrigger<SSPCluster[]>>> sspPairsTriggers = new ArrayList<List<PairTrigger<SSPCluster[]>>>(2);
 	private List<List<SinglesTrigger<Cluster>>> reconSinglesTriggers = new ArrayList<List<SinglesTrigger<Cluster>>>(2);
@@ -93,6 +100,10 @@
 	private RunDiagStats localStats = new RunDiagStats();
 	private RunDiagStats globalStats = new RunDiagStats();
     
+	// Track which clusters/pairs are trigger candidates.
+	private List<List<Cluster>> singlesCandidates = new ArrayList<List<Cluster>>(2);
+	private List<List<LCRelation>> pairCandidates = new ArrayList<List<LCRelation>>(2);
+	
     // Verbose settings.
     private boolean clusterFail = false;
     private boolean singlesEfficiencyFail = false;
@@ -136,56 +147,63 @@
 	private AIDA aida = AIDA.defaultInstance();
 	private IHistogram1D[][] clusterHitPlot = {
 			{
-				aida.histogram1D("cluster/Recon Cluster Hit Count (All)",     9, 0.5, 9.5),
-				aida.histogram1D("cluster/Recon Cluster Hit Count (Matched)", 9, 0.5, 9.5),
-				aida.histogram1D("cluster/Recon Cluster Hit Count (Failed)",  9, 0.5, 9.5)
+				aida.histogram1D("Clustering/Recon Cluster Hit Count (All)",     9, 0.5, 9.5),
+				aida.histogram1D("Clustering/Recon Cluster Hit Count (Matched)", 9, 0.5, 9.5),
+				aida.histogram1D("Clustering/Recon Cluster Hit Count (Failed)",  9, 0.5, 9.5)
 			},
 			{
-				aida.histogram1D("cluster/SSP Cluster Hit Count (All)",     9, 0.5, 9.5),
-				aida.histogram1D("cluster/SSP Cluster Hit Count (Matched)", 9, 0.5, 9.5),
-				aida.histogram1D("cluster/SSP Cluster Hit Count (Failed)",  9, 0.5, 9.5)
+				aida.histogram1D("Clustering/SSP Cluster Hit Count (All)",     9, 0.5, 9.5),
+				aida.histogram1D("Clustering/SSP Cluster Hit Count (Matched)", 9, 0.5, 9.5),
+				aida.histogram1D("Clustering/SSP Cluster Hit Count (Failed)",  9, 0.5, 9.5)
 			}
 	};
 	private IHistogram1D[][] clusterEnergyPlot = {
 			{
-				aida.histogram1D("cluster/Recon Cluster Energy (All)",     300, 0.0, 3.0),
-				aida.histogram1D("cluster/Recon Cluster Energy (Matched)", 300, 0.0, 3.0),
-				aida.histogram1D("cluster/Recon Cluster Energy (Failed)",  300, 0.0, 3.0)
+				aida.histogram1D("Clustering/Recon Cluster Energy (All)",     300, 0.0, 3.0),
+				aida.histogram1D("Clustering/Recon Cluster Energy (Matched)", 300, 0.0, 3.0),
+				aida.histogram1D("Clustering/Recon Cluster Energy (Failed)",  300, 0.0, 3.0)
 			},
 			{
-				aida.histogram1D("cluster/SSP Cluster Energy (All)",     300, 0.0, 3.0),
-				aida.histogram1D("cluster/SSP Cluster Energy (Matched)", 300, 0.0, 3.0),
-				aida.histogram1D("cluster/SSP Cluster Energy (Failed)",  300, 0.0, 3.0)
+				aida.histogram1D("Clustering/SSP Cluster Energy (All)",     300, 0.0, 3.0),
+				aida.histogram1D("Clustering/SSP Cluster Energy (Matched)", 300, 0.0, 3.0),
+				aida.histogram1D("Clustering/SSP Cluster Energy (Failed)",  300, 0.0, 3.0)
 			}
 	};
 	private IHistogram1D[][] clusterTimePlot = {
 			{
-				aida.histogram1D("cluster/Recon Cluster Time (All)",     115, 0, 460),
-				aida.histogram1D("cluster/Recon Cluster Time (Matched)", 115, 0, 460),
-				aida.histogram1D("cluster/Recon Cluster Time (Failed)",  115, 0, 460)
+				aida.histogram1D("Clustering/Recon Cluster Time (All)",     115, 0, 460),
+				aida.histogram1D("Clustering/Recon Cluster Time (Matched)", 115, 0, 460),
+				aida.histogram1D("Clustering/Recon Cluster Time (Failed)",  115, 0, 460)
 			},
 			{
-				aida.histogram1D("cluster/SSP Cluster Time (All)",     115, 0, 460),
-				aida.histogram1D("cluster/SSP Cluster Time (Matched)", 115, 0, 460),
-				aida.histogram1D("cluster/SSP Cluster Time (Failed)",  115, 0, 460)
+				aida.histogram1D("Clustering/SSP Cluster Time (All)",     115, 0, 460),
+				aida.histogram1D("Clustering/SSP Cluster Time (Matched)", 115, 0, 460),
+				aida.histogram1D("Clustering/SSP Cluster Time (Failed)",  115, 0, 460)
 			}
 	};
 	private IHistogram2D[][] clusterPositionPlot = {
 			{
-				aida.histogram2D("cluster/Recon Cluster Position (All)",     47, -23.5, 23.5, 11, -5.5, 5.5),
-				aida.histogram2D("cluster/Recon Cluster Position (Matched)", 47, -23.5, 23.5, 11, -5.5, 5.5),
-				aida.histogram2D("cluster/Recon Cluster Position (Failed)",  47, -23.5, 23.5, 11, -5.5, 5.5)
+				aida.histogram2D("Clustering/Recon Cluster Position (All)",     47, -23.5, 23.5, 11, -5.5, 5.5),
+				aida.histogram2D("Clustering/Recon Cluster Position (Matched)", 47, -23.5, 23.5, 11, -5.5, 5.5),
+				aida.histogram2D("Clustering/Recon Cluster Position (Failed)",  47, -23.5, 23.5, 11, -5.5, 5.5)
 			},
 			{
-				aida.histogram2D("cluster/SSP Cluster Position (All)",     47, -23.5, 23.5, 11, -5.5, 5.5),
-				aida.histogram2D("cluster/SSP Cluster Position (Matched)", 47, -23.5, 23.5, 11, -5.5, 5.5),
-				aida.histogram2D("cluster/SSP Cluster Position (Failed)",  47, -23.5, 23.5, 11, -5.5, 5.5)
+				aida.histogram2D("Clustering/SSP Cluster Position (All)",     47, -23.5, 23.5, 11, -5.5, 5.5),
+				aida.histogram2D("Clustering/SSP Cluster Position (Matched)", 47, -23.5, 23.5, 11, -5.5, 5.5),
+				aida.histogram2D("Clustering/SSP Cluster Position (Failed)",  47, -23.5, 23.5, 11, -5.5, 5.5)
 			}
 	};
 	private IHistogram2D[] energyhitDiffPlot = {
-		aida.histogram2D("cluster/Recon-SSP Energy-Hit Difference (All)",     21, -0.010, 0.010, 6, -3, 3),
-		aida.histogram2D("cluster/Recon-SSP Energy-Hit Difference (Matched)", 21, -0.010, 0.010, 6, -3, 3),
-		aida.histogram2D("cluster/Recon-SSP Energy-Hit Difference (Failed)",  21, -0.010, 0.010, 6, -3, 3)
+		aida.histogram2D("Clustering/Recon-SSP Energy-Hit Difference (All)",     21, -0.010, 0.010, 6, -3, 3),
+		aida.histogram2D("Clustering/Recon-SSP Energy-Hit Difference (Matched)", 21, -0.010, 0.010, 6, -3, 3),
+		aida.histogram2D("Clustering/Recon-SSP Energy-Hit Difference (Failed)",  21, -0.010, 0.010, 6, -3, 3)
+	};
+	private ICloud2D[] efficiencyTimeHist = {
+			aida.cloud2D("Clustering/Cluster Efficiency vs. Time"),
+			aida.cloud2D("Singles Trigger 0/Cluster Efficiency vs. Time"),
+			aida.cloud2D("Singles Trigger 1/Cluster Efficiency vs. Time"),
+			aida.cloud2D("Pair Trigger 0/Cluster Efficiency vs. Time"),
+			aida.cloud2D("Pair Trigger 1/Cluster Efficiency vs. Time")
 	};
 	
 	/**
@@ -355,6 +373,14 @@
 			}
 		}
 		
+		// Reset the candidate cluster lists.
+		singlesCandidates.clear();
+		singlesCandidates.add(new ArrayList<Cluster>());
+		singlesCandidates.add(new ArrayList<Cluster>());
+		pairCandidates.clear();
+		pairCandidates.add(new ArrayList<LCRelation>());
+		pairCandidates.add(new ArrayList<LCRelation>());
+		
 		// Increment the total event count.
 		localStats.sawEvent(event.getTimeStamp());
 		globalStats.sawEvent(event.getTimeStamp());
@@ -633,9 +659,41 @@
 			// Push the snapshot to the data stream.
 			event.put(diagnosticCollectionName, snapshotList);
 			
+			// Record the efficiencies in this time snapshot.
+			double[] efficiency = new double[5];
+			efficiency[0] = 1.0 * localStats.getClusterStats().getMatches()
+					/ localStats.getClusterStats().getReconClusterCount();
+			efficiency[1] = 1.0 * localStats.getTriggerStats().getSingles0Stats().getMatchedReconSimulatedTriggers()
+					/ localStats.getTriggerStats().getSingles0Stats().getReconSimulatedTriggers();
+			efficiency[2] = 1.0 * localStats.getTriggerStats().getSingles1Stats().getMatchedReconSimulatedTriggers()
+					/ localStats.getTriggerStats().getSingles1Stats().getReconSimulatedTriggers();
+			efficiency[3] = 1.0 * localStats.getTriggerStats().getPair0Stats().getMatchedReconSimulatedTriggers()
+					/ localStats.getTriggerStats().getPair0Stats().getReconSimulatedTriggers();
+			efficiency[4] = 1.0 * localStats.getTriggerStats().getPair1Stats().getMatchedReconSimulatedTriggers()
+					/ localStats.getTriggerStats().getPair1Stats().getReconSimulatedTriggers();
+			
+			// Get the time for the current snapshot. This is the total
+			// run time before the snapshot plus half of the snapshot.
+			long time = globalStats.getDuration() - (localStats.getDuration() / 2);
+			
+			// Add them to the appropriate cloud plot.
+			for(int i = 0; i < 5; i++) { efficiencyTimeHist[i].fill(time, efficiency[i]); }
+			
 			// Clear the local statistical data.
 			localStats.clear();
 		}
+		
+		
+		
+		// ==========================================================
+		// ==== Write the Candidate Triggers ========================
+		// ==========================================================
+		
+		// Write the candidates to a collection.
+		event.put(pairCandidateCollectionName[0], pairCandidates.get(0), LCRelation.class, 0);
+		event.put(pairCandidateCollectionName[1], pairCandidates.get(1), LCRelation.class, 0);
+		event.put(singlesCandidateCollectionName[0], singlesCandidates.get(0), Cluster.class, clusterCollectionFlag);
+		event.put(singlesCandidateCollectionName[1], singlesCandidates.get(1), Cluster.class, clusterCollectionFlag);
 	}
 
 	public void setPrintResultsEveryNEvents(int n) {
@@ -1706,6 +1764,13 @@
 				trigger.setStateClusterEnergyHigh(passClusterHigh);
 				trigger.setStateHitCount(passHitCount);
 				
+				// If all the trigger cuts passed, plot this trigger
+				// in the "triggered" plots.
+				if(trigger.getTriggerState()) {
+					globalTriggerPlots.passedTrigger(trigger);
+					singlesCandidates.get(triggerNum).add(trigger.getTriggerSource());
+				}
+				
 				// A trigger will only be reported by the SSP if it
 				// passes all of the enabled cuts for that trigger.
 				// Check whether this trigger meets these conditions.
@@ -1715,12 +1780,6 @@
 					continue triggerLoop;
 				} if(singlesCutsEnabled[triggerNum][HIT_COUNT] && !trigger.getStateHitCount()) {
 					continue triggerLoop;
-				}
-				
-				// If all the trigger cuts passed, plot this trigger
-				// in the "triggered" plots.
-				if(trigger.getTriggerState()) {
-					globalTriggerPlots.passedTrigger(trigger);
 				}
 				
 				// Store the trigger.
@@ -1851,6 +1910,8 @@
 				// in the "triggered" plots.
 				if(trigger.getTriggerState()) {
 					globalTriggerPlots.passedTrigger(trigger);
+					LCRelation lcPair = new MyLCRelation(trigger.getTriggerSource()[0], trigger.getTriggerSource()[1]);
+					pairCandidates.get(triggerIndex).add(lcPair);
 				}
 				
 				// Add the trigger to the list.
@@ -1907,6 +1968,12 @@
 				trigger.setStateEnergySlope(passPairEnergySlope);
 				trigger.setStateCoplanarity(passPairCoplanarity);
 				trigger.setStateTimeCoincidence(passTimeCoincidence);
+				
+				// If all the trigger cuts passed, plot this trigger
+				// in the "triggered" plots.
+				if(trigger.getTriggerState()) {
+					globalTriggerPlots.passedTrigger(trigger);
+				}
 				
 				// A trigger will only be reported by the SSP if it
 				// passes all of the enabled cuts for that trigger.
@@ -1925,12 +1992,6 @@
 					continue pairTriggerLoop;
 				} if(pairCutsEnabled[triggerIndex][3 + COPLANARITY] && !trigger.getStateCoplanarity()) {
 					continue pairTriggerLoop;
-				}
-				
-				// If all the trigger cuts passed, plot this trigger
-				// in the "triggered" plots.
-				if(trigger.getTriggerState()) {
-					globalTriggerPlots.passedTrigger(trigger);
 				}
 				
 				// Add the trigger to the list.

Modified: java/branches/HPSJAVA-488/conditions/pom.xml
 =============================================================================
--- java/branches/HPSJAVA-488/conditions/pom.xml	(original)
+++ java/branches/HPSJAVA-488/conditions/pom.xml	Fri Jun 12 15:27:10 2015
@@ -8,7 +8,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>../parent/pom.xml</relativePath>
-        <version>3.3.1-SNAPSHOT</version>
+        <version>3.3.3-SNAPSHOT</version>
     </parent>
     <scm>
         <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/conditions/</url>
@@ -37,7 +37,7 @@
                         <exclude>org/hps/conditions/beam/BeamConditionsTest.java</exclude>
                         <exclude>org/hps/conditions/ecal/EcalHardwareConditionsTest.java</exclude>
                         <exclude>org/hps/conditions/database/CollectionIdTest.java</exclude>
-                        <exclude>org/hps/conditions/dummy/**.java</exclude>
+                        <exclude>/org/hps/conditions/svt/SvtTimingConstantsTest.java</exclude>
                     </excludes>
                 </configuration>
             </plugin>
@@ -99,5 +99,10 @@
             <groupId>org.reflections</groupId>
             <artifactId>reflections</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-csv</artifactId>
+            <version>1.1</version>    
+        </dependency>
     </dependencies>
 </project>

Modified: java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/api/ConditionsRecord.java
 =============================================================================
--- java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/api/ConditionsRecord.java	(original)
+++ java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/api/ConditionsRecord.java	Fri Jun 12 15:27:10 2015
@@ -269,6 +269,16 @@
     }
 
     /**
+     * Get the collection ID, overriding this method from the parent class.
+     *
+     * @return the collection ID
+     */
+    @Field(names = {"collection_id"})
+    public Integer getCollectionId() {
+        return getFieldValue("collection_id");
+    }
+
+    /**
      * Get the date this record was created.
      *
      * @return the date this record was created
@@ -315,7 +325,7 @@
      * @return the ending run number
      */
     @Field(names = {"run_end"})
-    public int getRunEnd() {
+    public Integer getRunEnd() {
         return getFieldValue("run_end");
     }
 
@@ -325,7 +335,7 @@
      * @return the starting run number
      */
     @Field(names = {"run_start"})
-    public int getRunStart() {
+    public Integer getRunStart() {
         return getFieldValue("run_start");
     }
 

Modified: java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/database/ConnectionParameters.java
 =============================================================================
--- java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/database/ConnectionParameters.java	(original)
+++ java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/database/ConnectionParameters.java	Fri Jun 12 15:27:10 2015
@@ -23,34 +23,101 @@
     public static final int DEFAULT_PORT = 3306;
 
     /**
+     * Configure the connection parameters from a properties file.
+     *
+     * @param file the properties file
+     * @return the connection parameters
+     */
+    public static ConnectionParameters fromProperties(final File file) {
+        FileInputStream fin = null;
+        try {
+            fin = new FileInputStream(file);
+        } catch (final FileNotFoundException e) {
+            throw new IllegalArgumentException(file.getPath() + " does not exist.", e);
+        }
+        return fromProperties(fin);
+    }
+
+    /**
+     * Configure the connection parameters from an <code>InputStream</code> of properties.
+     *
+     * @param in the InputStream of the properties
+     * @return the connection parameters
+     * @throws RuntimeException if the InputStream is invalid
+     */
+    private static ConnectionParameters fromProperties(final InputStream in) {
+        final Properties properties = new Properties();
+        try {
+            properties.load(in);
+        } catch (final IOException e) {
+            throw new RuntimeException(e);
+        }
+        final String user = properties.getProperty("user");
+        final String password = properties.getProperty("password");
+        final String database = properties.getProperty("database");
+        final String hostname = properties.getProperty("hostname");
+        int port = DEFAULT_PORT;
+        if (properties.containsKey("port")) {
+            port = Integer.parseInt(properties.getProperty("port"));
+        }
+        return new ConnectionParameters(user, password, database, hostname, port);
+    }
+
+    /**
+     * Configure the connection parameters from an embedded classpath resource which should be a properties file.
+     *
+     * @param resource the resource path
+     * @return the connection parameters
+     */
+    public static ConnectionParameters fromResource(final String resource) {
+        return fromProperties(ConnectionParameters.class.getResourceAsStream(resource));
+    }
+
+    /**
+     * The database name.
+     */
+    private String database;
+
+    /**
+     * The host name.
+     */
+    private String hostname;
+
+    /**
+     * The user's password.
+     */
+    private String password;
+
+    /**
+     * The port.
+     */
+    private int port;
+
+    /**
      * The user name.
      */
     private String user;
 
     /**
-     * The user's password.
-     */
-    private String password;
-
-    /**
-     * The port.
-     */
-    private int port;
-
-    /**
-     * The host name.
-     */
-    private String hostname;
-
-    /**
-     * The database name.
-     */
-    private String database;
-
-    /**
      * Protected constructor for sub-classes.
      */
     protected ConnectionParameters() {
+    }
+
+    /**
+     * Class constructor using default MySQL port number.
+     *
+     * @param user the user name
+     * @param password the password
+     * @param hostname the hostname
+     * @param database the database name
+     */
+    public ConnectionParameters(final String user, final String password, final String database, final String hostname) {
+        this.user = user;
+        this.password = password;
+        this.database = database;
+        this.hostname = hostname;
+        this.port = DEFAULT_PORT;
     }
 
     /**
@@ -72,74 +139,6 @@
     }
 
     /**
-     * Get Properties object for this connection.
-     *
-     * @return the Properties for this connection
-     */
-    public Properties getConnectionProperties() {
-        final Properties p = new Properties();
-        p.put("user", user);
-        p.put("password", password);
-        return p;
-    }
-
-    /**
-     * Get the hostname.
-     *
-     * @return the hostname
-     */
-    String getHostname() {
-        return hostname;
-    }
-
-    /**
-     * Get the port number.
-     *
-     * @return the port number
-     */
-    int getPort() {
-        return port;
-    }
-
-    /**
-     * Get the name of the database.
-     *
-     * @return the name of the database
-     */
-    String getDatabase() {
-        return database;
-    }
-
-    /**
-     * Get the user name.
-     *
-     * @return the user name
-     */
-    String getUser() {
-        return user;
-    }
-
-    /**
-     * Get the password.
-     *
-     * @return the password
-     */
-    String getPassword() {
-        return password;
-    }
-
-    /**
-     * Get the connection string for these parameters.
-     * <p>
-     * This is public because the DQM database manager is using it.
-     *
-     * @return the connection string
-     */
-    public String getConnectionString() {
-        return "jdbc:mysql://" + hostname + ":" + port + "/";
-    }
-
-    /**
      * Create a database connection from these parameters. The caller becomes the "owner" and is responsible for closing
      * it when finished.
      *
@@ -151,60 +150,77 @@
         try {
             connection = DriverManager.getConnection(getConnectionString(), connectionProperties);
             connection.createStatement().execute("USE " + getDatabase());
-        } catch (SQLException x) {
+        } catch (final SQLException x) {
             throw new RuntimeException("Failed to connect to database: " + getConnectionString(), x);
         }
         return connection;
     }
 
     /**
-     * Configure the connection parameters from a properties file.
-     *
-     * @param file the properties file
-     * @return the connection parameters
-     */
-    public static ConnectionParameters fromProperties(final File file) {
-        FileInputStream fin = null;
-        try {
-            fin = new FileInputStream(file);
-        } catch (FileNotFoundException e) {
-            throw new IllegalArgumentException(file.getPath() + " does not exist.", e);
-        }
-        return fromProperties(fin);
-    }
-
-    /**
-     * Configure the connection parameters from an embedded classpath resource which should be a properties file.
-     *
-     * @param resource the resource path
-     * @return the connection parameters
-     */
-    public static ConnectionParameters fromResource(final String resource) {
-        return fromProperties(ConnectionParameters.class.getResourceAsStream(resource));
-    }
-
-    /**
-     * Configure the connection parameters from an <code>InputStream</code> of properties.
-     *
-     * @param in the InputStream of the properties
-     * @return the connection parameters
-     * @throws RuntimeException if the InputStream is invalid
-     */
-    private static ConnectionParameters fromProperties(final InputStream in) {
-        final Properties properties = new Properties();
-        try {
-            properties.load(in);
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-        final String user = properties.getProperty("user");
-        final String password = properties.getProperty("password");
-        final String database = properties.getProperty("database");
-        final String hostname = properties.getProperty("hostname");
-        int port = DEFAULT_PORT;
-        if (properties.containsKey("port")) {
-            port = Integer.parseInt(properties.getProperty("port"));
-        }
-        return new ConnectionParameters(user, password, database, hostname, port);
+     * Get Properties object for this connection.
+     *
+     * @return the Properties for this connection
+     */
+    public Properties getConnectionProperties() {
+        final Properties p = new Properties();
+        p.put("user", this.user);
+        p.put("password", this.password);
+        return p;
+    }
+
+    /**
+     * Get the connection string for these parameters.
+     * <p>
+     * This is public because the DQM database manager is using it.
+     *
+     * @return the connection string
+     */
+    public String getConnectionString() {
+        return "jdbc:mysql://" + this.hostname + ":" + this.port + "/";
+    }
+
+    /**
+     * Get the name of the database.
+     *
+     * @return the name of the database
+     */
+    String getDatabase() {
+        return this.database;
+    }
+
+    /**
+     * Get the hostname.
+     *
+     * @return the hostname
+     */
+    String getHostname() {
+        return this.hostname;
+    }
+
+    /**
+     * Get the password.
+     *
+     * @return the password
+     */
+    String getPassword() {
+        return this.password;
+    }
+
+    /**
+     * Get the port number.
+     *
+     * @return the port number
+     */
+    int getPort() {
+        return this.port;
+    }
+
+    /**
+     * Get the user name.
+     *
+     * @return the user name
+     */
+    String getUser() {
+        return this.user;
     }
 }

Modified: java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/svt/SvtAlignmentConstant.java
 =============================================================================
--- java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/svt/SvtAlignmentConstant.java	(original)
+++ java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/svt/SvtAlignmentConstant.java	Fri Jun 12 15:27:10 2015
@@ -12,7 +12,6 @@
  * translation or rotation of a detector component.
  * <p>
  * The format of the keys is ABCDE where:<br>
- *
  * <pre>
  * A == half == [1,2]
  * B == alignment type == [1,2]
@@ -29,164 +28,21 @@
 public final class SvtAlignmentConstant extends BaseConditionsObject {
 
     /**
-     * The alignment constant type which is rotation or translation.
-     */
-    public enum AlignmentType {
-        /** Rotation alignment type. */
-        ROTATION(1),
-        /** Translation alignment type. */
-        TRANSLATION(2);
-
-        /**
-         * The value of the alignment type constants.
-         */
-        private final int value;
-
-        /**
-         * Constructor that has value of constant.
-         *
-         * @param value the value of the constant
-         */
-        private AlignmentType(final int value) {
-            this.value = value;
-        }
-
-        /**
-         * Get the value for the alignment constant type.
-         *
-         * @return the value of the constant
-         */
-        int getValue() {
-            return this.value;
-        }
-    }
-
-    /**
-     * Top or bottom half.
-     */
-    public enum Half {
-        /** Bottom half. */
-        BOTTOM(2),
-        /** Top half. */
-        TOP(1);
-
-        /**
-         * The integer value designating top or bottom half.
-         */
-        private final int value;
-
-        /**
-         * Create from top or bottom value.
-         *
-         * @param value the value for half
-         */
-        private Half(final int value) {
-            this.value = value;
-        }
-
-        /**
-         * Get the value for the half.
-         *
-         * @return the value
-         */
-        int getValue() {
-            return this.value;
-        }
-    };
-
-    /**
      * Collection implementation for {@link SvtAlignmentConstant}.
      */
     @SuppressWarnings("serial")
     public static class SvtAlignmentConstantCollection extends BaseConditionsObjectCollection<SvtAlignmentConstant> {
+        
+        public SvtAlignmentConstant find(int id) {
+            for (SvtAlignmentConstant constant : this) {
+                if (constant.getParameter().equals(id)) {
+                    return constant;
+                }
+            }
+            return null;
+        }
+        
     };
-
-    /**
-     * The unit axis which for translations maps to XYZ. (Convention for rotation???)
-     */
-    public enum UnitAxis {
-        /** U unit axis. */
-        U(1),
-        /** V unit axis. */
-        V(2),
-        /** W unit axis. */
-        W(3);
-
-        /**
-         * Value for the constant.
-         */
-        private final int value;
-
-        /**
-         * Create from value.
-         *
-         * @param value the value
-         */
-        private UnitAxis(final int value) {
-            this.value = value;
-        }
-
-        /**
-         * Get the value for the unit axis.
-         *
-         * @return the value
-         */
-        int getValue() {
-            return this.value;
-        }
-    };
-
-    /**
-     * Maximum value of the module number.
-     */
-    private static final int MAX_MODULE_NUMBER = 10;
-
-    /**
-     * Decode the AlignmentType value from the key.
-     *
-     * @return the AlignmentType value from the key
-     * @see AlignmentType
-     */
-    public AlignmentType getAlignmentType() {
-        final int alignmentType = Integer.parseInt(getParameter().substring(1, 2));
-        if (alignmentType == AlignmentType.TRANSLATION.getValue()) {
-            return AlignmentType.TRANSLATION;
-        } else if (alignmentType == AlignmentType.ROTATION.getValue()) {
-            return AlignmentType.ROTATION;
-        } else {
-            throw new IllegalArgumentException("Could not parse valid AlignmentType from " + getParameter());
-        }
-    }
-
-    /**
-     * Decode the Half value from the key.
-     *
-     * @return the Half value from the key
-     * @see Half
-     */
-    public Half getHalf() {
-        final int half = Integer.parseInt(getParameter().substring(0, 1));
-        if (half == Half.TOP.getValue()) {
-            return Half.TOP;
-        } else if (half == Half.BOTTOM.getValue()) {
-            return Half.BOTTOM;
-        } else {
-            throw new IllegalArgumentException("Could not parse valid Half from " + getParameter());
-        }
-    }
-
-    /**
-     * Decode the module number from the key.
-     *
-     * @return the module number from the key
-     */
-    public int getModuleNumber() {
-        final int moduleNumber = Integer.parseInt(getParameter().substring(3, 5));
-        if (moduleNumber > MAX_MODULE_NUMBER || moduleNumber == 0) {
-            throw new IllegalArgumentException("The decoded module number " + moduleNumber + " is invalid.");
-        }
-        return moduleNumber;
-    }
 
     /**
      * Get the alignment constant's encoded, raw value.
@@ -194,27 +50,9 @@
      * @return the alignment constant's key
      */
     @Field(names = {"parameter"})
-    public String getParameter() {
+    public Integer getParameter() {
+        //System.out.println("parameter = " + this.getFieldValues().get("parameter") + "; type = " + this.getFieldValues().get("parameter").getClass());
         return getFieldValue("parameter");
-    }
-
-    /**
-     * Decode the UnitAxis from the key.
-     *
-     * @return the UnitAxis v
-     * @see UnitAxis
-     */
-    public UnitAxis getUnitAxis() {
-        final int unitAxis = Integer.parseInt(getParameter().substring(2, 3));
-        if (unitAxis == UnitAxis.U.getValue()) {
-            return UnitAxis.U;
-        } else if (unitAxis == UnitAxis.V.getValue()) {
-            return UnitAxis.V;
-        } else if (unitAxis == UnitAxis.W.getValue()) {
-            return UnitAxis.W;
-        } else {
-            throw new IllegalArgumentException("Could not parse valid UnitAxis from " + getParameter());
-        }
     }
 
     /**
@@ -234,12 +72,6 @@
      */
     @Override
     public String toString() {
-        final StringBuffer buff = new StringBuffer();
-        buff.append(super.toString());
-        buff.append("half: ").append(getHalf().getValue()).append('\n');
-        buff.append("alignment_type: ").append(getAlignmentType().getValue()).append('\n');
-        buff.append("unit_axis: ").append(getUnitAxis().getValue()).append('\n');
-        buff.append("module_number: ").append(getModuleNumber()).append('\n');
-        return buff.toString();
+        return "SvtAlignmentConstant parameter = " + this.getParameter() + "; value = " + this.getValue();
     }
 }

Modified: java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/svt/SvtDetectorSetup.java
 =============================================================================
--- java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/svt/SvtDetectorSetup.java	(original)
+++ java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/svt/SvtDetectorSetup.java	Fri Jun 12 15:27:10 2015
@@ -21,7 +21,8 @@
 import org.lcsim.util.log.LogUtil;
 
 /**
- * This class puts {@link SvtConditions} data onto <code>HpsSiSensor</code> objects.
+ * This class puts {@link SvtConditions} data onto <code>HpsSiSensor</code>
+ * objects.
  *
  * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  * @author <a href="mailto:[log in to unmask]">Omar Moreno</a>
@@ -55,7 +56,7 @@
 
     /**
      * Constructor that takes name of SVT.
-     * 
+     *
      * @param svtName the name of the SVT subdetector
      */
     public SvtDetectorSetup(final String svtName) {
@@ -64,7 +65,7 @@
 
     /**
      * Set the name of the SVT in the detector model.
-     * 
+     *
      * @param svtName the name of the SVt in the detector model.
      */
     public void setSvtName(final String svtName) {
@@ -73,7 +74,7 @@
 
     /**
      * Set whether this class is enabled to be activated on conditions changes.
-     * 
+     *
      * @param enabled <code>true</code> to enable
      */
     public void setEnabled(final boolean enabled) {
@@ -82,7 +83,7 @@
 
     /**
      * Set the log level.
-     * 
+     *
      * @param level the log level
      */
     public void setLogLevel(final Level level) {
@@ -91,7 +92,8 @@
     }
 
     /**
-     * Hook that activates this class when conditions change (new detector or run number).
+     * Hook that activates this class when conditions change (new detector or
+     * run number).
      *
      * @param event the conditions event
      */
@@ -176,7 +178,6 @@
                 //
                 // Set conditions data for this channel on the sensor object:
                 //
-
                 // Check if the channel was flagged as bad
                 if (constants.isBadChannel()) {
                     sensor.setBadChannel(channelNumber);
@@ -203,13 +204,16 @@
 
             // Set the t0 shift for the sensor.
             final SvtT0Shift sensorT0Shift = t0Shifts.getT0Shift(daqPair);
+            if (sensorT0Shift == null) {
+                throw new RuntimeException("Failed to find T0 shift for sensor: " + sensor.getName() + ", FEB hybrid ID " + daqPair.getFirstElement() + ", FEB ID " + daqPair.getSecondElement());
+            }
             sensor.setT0Shift(sensorT0Shift.getT0Shift());
         }
     }
 
     /**
      * Load conditions from Test Run detector.
-     * 
+     *
      * @param subdetector the SVT subdetector object
      * @param conditions the Test Run conditions
      */
@@ -264,7 +268,6 @@
                 //
                 // Set conditions data for this channel on the sensor object:
                 //
-
                 // Check if the channel was flagged as bad
                 if (constants.isBadChannel()) {
                     sensor.setBadChannel(channelNumber);

Modified: java/branches/HPSJAVA-488/conditions/src/test/java/org/hps/conditions/EngRunConditionsTest.java
 =============================================================================
--- java/branches/HPSJAVA-488/conditions/src/test/java/org/hps/conditions/EngRunConditionsTest.java	(original)
+++ java/branches/HPSJAVA-488/conditions/src/test/java/org/hps/conditions/EngRunConditionsTest.java	Fri Jun 12 15:27:10 2015
@@ -109,6 +109,16 @@
          * Answer for pedestal value check of single channel.
          */
         private static final double PEDESTAL_ANSWER = 105.78;
+
+        /**
+         * Collection ID of calibrations.
+         */
+        private static final Integer CALIBRATIONS_COLLECTION_ID = 4;
+
+        /**
+         * Collection ID of gains.
+         */
+        private static final Integer GAINS_COLLECTION_ID = 4;
 
         /**
          * Flag if {@link #detectorChanged(Detector)} is activated.

Modified: java/branches/HPSJAVA-488/conditions/src/test/java/org/hps/conditions/svt/TestRunSvtBadChannelsTest.java
 =============================================================================
--- java/branches/HPSJAVA-488/conditions/src/test/java/org/hps/conditions/svt/TestRunSvtBadChannelsTest.java	(original)
+++ java/branches/HPSJAVA-488/conditions/src/test/java/org/hps/conditions/svt/TestRunSvtBadChannelsTest.java	Fri Jun 12 15:27:10 2015
@@ -86,7 +86,7 @@
                 //System.out.println(collection.getConditionsRecord());
                 totalBadChannels += collection.size();
             }
-            System.out.println("found " + totalBadChannels + " total bad chanenls");
+            System.out.println("found " + totalBadChannels + " total bad channels");
 
             // The run 0 channels are for all runs.
             int expectedBadChannels = BAD_CHANNEL_COUNTS[0];

Modified: java/branches/HPSJAVA-488/datacat/pom.xml
 =============================================================================
--- java/branches/HPSJAVA-488/datacat/pom.xml	(original)
+++ java/branches/HPSJAVA-488/datacat/pom.xml	Fri Jun 12 15:27:10 2015
@@ -38,11 +38,6 @@
             <groupId>org.lcsim</groupId>
             <artifactId>lcio</artifactId>
             <version>2.4.4-SNAPSHOT</version>
-        </dependency>
-        <dependency>
-            <groupId>org.jlab.coda</groupId>
-            <artifactId>jevio</artifactId>
-            <version>4.3.1</version>
         </dependency>
         <dependency>
             <groupId>srs</groupId>

Modified: java/branches/HPSJAVA-488/detector-data/pom.xml
 =============================================================================
--- java/branches/HPSJAVA-488/detector-data/pom.xml	(original)
+++ java/branches/HPSJAVA-488/detector-data/pom.xml	Fri Jun 12 15:27:10 2015
@@ -8,7 +8,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>../parent/pom.xml</relativePath>
-        <version>3.3.1-SNAPSHOT</version>
+        <version>3.3.3-SNAPSHOT</version>
     </parent>
     <scm>
         <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/detector-data/</url>

Modified: java/branches/HPSJAVA-488/distribution/pom.xml
 =============================================================================
--- java/branches/HPSJAVA-488/distribution/pom.xml	(original)
+++ java/branches/HPSJAVA-488/distribution/pom.xml	Fri Jun 12 15:27:10 2015
@@ -13,7 +13,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>../parent/pom.xml</relativePath>
-        <version>3.3.1-SNAPSHOT</version>
+        <version>3.3.3-SNAPSHOT</version>
     </parent>    
     <scm>
         <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/distribution/</url>
@@ -84,5 +84,9 @@
             <groupId>org.hps</groupId>
             <artifactId>hps-evio</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.hps</groupId>
+            <artifactId>hps-detector-model</artifactId>
+        </dependency>
     </dependencies>
 </project>

Modified: java/branches/HPSJAVA-488/ecal-event-display/pom.xml
 =============================================================================
--- java/branches/HPSJAVA-488/ecal-event-display/pom.xml	(original)
+++ java/branches/HPSJAVA-488/ecal-event-display/pom.xml	Fri Jun 12 15:27:10 2015
@@ -7,7 +7,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>../parent/pom.xml</relativePath>
-        <version>3.3.1-SNAPSHOT</version>
+        <version>3.3.3-SNAPSHOT</version>
     </parent>
     <scm>
         <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/ecal-event-display/</url>

Modified: java/branches/HPSJAVA-488/ecal-readout-sim/pom.xml
 =============================================================================
--- java/branches/HPSJAVA-488/ecal-readout-sim/pom.xml	(original)
+++ java/branches/HPSJAVA-488/ecal-readout-sim/pom.xml	Fri Jun 12 15:27:10 2015
@@ -8,7 +8,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>../parent/pom.xml</relativePath>
-        <version>3.3.1-SNAPSHOT</version>
+        <version>3.3.3-SNAPSHOT</version>
     </parent>
     <scm>
         <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/ecal-readout-sim/</url>

Modified: java/branches/HPSJAVA-488/ecal-readout-sim/src/main/java/org/hps/readout/ecal/FADCEcalReadoutDriver.java
 =============================================================================
--- java/branches/HPSJAVA-488/ecal-readout-sim/src/main/java/org/hps/readout/ecal/FADCEcalReadoutDriver.java	(original)
+++ java/branches/HPSJAVA-488/ecal-readout-sim/src/main/java/org/hps/readout/ecal/FADCEcalReadoutDriver.java	Fri Jun 12 15:27:10 2015
@@ -42,48 +42,33 @@
 public class FADCEcalReadoutDriver extends EcalReadoutDriver<RawCalorimeterHit> {
 
     // Repeated here from EventConstants in evio module to avoid depending on it.
-    private static final int ECAL_WINDOW_MODE = 1;
+    private static final int ECAL_RAW_MODE = 1;
     private static final int ECAL_PULSE_MODE = 2;
     private static final int ECAL_PULSE_INTEGRAL_MODE = 3;
     private String ecalName = "Ecal";
     private Subdetector ecal;
     private EcalConditions ecalConditions = null;
     //buffer for preamp signals (units of volts, no pedestal)
-    private Map<Long, RingBuffer> signalMap = null;
+    private Map<Long, RingBuffer> analogPipelines = null;
     //ADC pipeline for readout (units of ADC counts)
-    private Map<Long, FADCPipeline> pipelineMap = null;
+    private Map<Long, FADCPipeline> digitalPipelines = null;
     //buffer for window sums
-    private Map<Long, Integer> sumMap = null;
+    private Map<Long, Integer> triggerPathHitSums = null;
     //buffer for timestamps
-    private Map<Long, Integer> timeMap = null;
+    private Map<Long, Integer> triggerPathHitTimes = null;
     //queue for hits to be output to clusterer
-    private PriorityQueue<RawCalorimeterHit> outputQueue = null;
-    //length of ring buffer (in readout cycles)
+    private PriorityQueue<RawCalorimeterHit> triggerPathDelayQueue = null;
+    //output buffer for hits
+    private LinkedList<RawCalorimeterHit> triggerPathCoincidenceQueue = new LinkedList<RawCalorimeterHit>();
     private int bufferLength = 100;
-    //length of readout pipeline (in readout cycles)
     private int pipelineLength = 2000;
-    //shaper time constant in ns
-    private double tp = 6.95;
-    //delay (number of readout periods) between start of summing window and output of hit to clusterer
+    private double tp = 9.6;
     private int delay0 = 32;
-    //start of readout window relative to trigger time (in readout cycles)
-    //in FADC documentation, "Programmable Latency" or PL
     private int readoutLatency = 100;
-    //number of ADC samples to read out
-    //in FADC documentation, "Programmable Trigger Window" or PTW
     private int readoutWindow = 100;
-    //number of ADC samples to read out before each rising threshold crossing
-    //in FADC documentation, "number of samples before" or NSB
     private int numSamplesBefore = 5;
-    //number of ADC samples to read out after each rising threshold crossing
-    //in FADC documentation, "number of samples before" or NSA
     private int numSamplesAfter = 30;
-//    private HPSEcalConverter converter = null;
-    //output buffer for hits
-    private LinkedList<RawCalorimeterHit> buffer = new LinkedList<RawCalorimeterHit>();
-    //number of readout periods for which a given hit stays in the buffer
     private int coincidenceWindow = 2;
-    //output collection name for hits read out from trigger
     private String ecalReadoutCollectionName = "EcalReadoutHits";
     private int mode = ECAL_PULSE_INTEGRAL_MODE;
     private int readoutThreshold = 10;
@@ -92,17 +77,8 @@
     private double fixedGain = -1;
     private boolean constantTriggerWindow = true;
     private boolean addNoise = false;
-   
-    // 32.8 p.e./MeV = New detector in 2014
-    // 2 p.e./MeV = Test Run detector
-    private double pePerMeV = 32.8; //photoelectrons per MeV, used to calculate noise
-    
-    //switch between test run and 2014 definitions of gain constants
-    // true = ONLY simulation studies in 2014
-    // false = Test Run data/simulations and 2014+ Detector's real data 
+    private double pePerMeV = 32.8;
     private boolean use2014Gain = false;
-    
-    //switch between three pulse shape functions
     private PulseShape pulseShape = PulseShape.ThreePole;
 
     public enum PulseShape {
@@ -118,14 +94,34 @@
 //        converter = new HPSEcalConverter(null);
     }
 
+    /**
+     * Add noise (photoelectron statistics and readout/preamp noise) to hits
+     * before adding them to the analog pipeline.
+     *
+     * @param addNoise True to add noise, default of false.
+     */
     public void setAddNoise(boolean addNoise) {
         this.addNoise = addNoise;
     }
 
+    /**
+     * Sets the trigger-path hit processing algorithm.
+     *
+     * @param constantTriggerWindow True for 2014+ FADC behavior, false for test
+     * run behavior. True by default.
+     */
     public void setConstantTriggerWindow(boolean constantTriggerWindow) {
         this.constantTriggerWindow = constantTriggerWindow;
     }
 
+    /**
+     * Override the ECal gains set in the conditions system with a single
+     * uniform value.
+     *
+     * @param fixedGain Units of MeV/(ADC counts in pulse integral). Negative
+     * value causes the conditions system to be used for gains. Default is
+     * negative.
+     */
     public void setFixedGain(double fixedGain) {
         this.fixedGain = fixedGain;
     }
@@ -134,81 +130,179 @@
         this.ecalName = ecalName;
     }
 
+    /**
+     * Threshold for readout-path hits. For 2014+ running this should always
+     * equal the trigger threshold.
+     *
+     * @param readoutThreshold Units of ADC counts, default of 10.
+     */
     public void setReadoutThreshold(int readoutThreshold) {
         this.readoutThreshold = readoutThreshold;
     }
 
+    /**
+     * Scale factor for trigger-path hit amplitudes. Only used for test run.
+     *
+     * @param scaleFactor Default of 1.
+     */
     public void setScaleFactor(double scaleFactor) {
         this.scaleFactor = scaleFactor;
     }
 
+    /**
+     * Threshold for trigger-path hits. For 2014+ running this should always
+     * equal the readout threshold.
+     *
+     * @param triggerThreshold Units of ADC counts, default of 10.
+     */
     public void setTriggerThreshold(int triggerThreshold) {
         this.triggerThreshold = triggerThreshold;
     }
 
+    /**
+     * Output collection name for readout-path hits.
+     *
+     * @param ecalReadoutCollectionName
+     */
     public void setEcalReadoutCollectionName(String ecalReadoutCollectionName) {
         this.ecalReadoutCollectionName = ecalReadoutCollectionName;
     }
 
+    /**
+     * Number of ADC samples to process after each rising threshold crossing. In
+     * FADC documentation, "number of samples after" or NSA.
+     *
+     * @param numSamplesAfter Units of 4 ns FADC clock cycles, default of 30.
+     */
     public void setNumSamplesAfter(int numSamplesAfter) {
         this.numSamplesAfter = numSamplesAfter;
     }
 
+    /**
+     * Number of ADC samples to process before each rising threshold crossing.
+     * In FADC documentation, "number of samples before" or NSB.
+     *
+     * @param numSamplesBefore Units of 4 ns FADC clock cycles, default of 5.
+     */
     public void setNumSamplesBefore(int numSamplesBefore) {
         this.numSamplesBefore = numSamplesBefore;
     }
 
+    /**
+     * Start of readout window relative to trigger time (in readout cycles). In
+     * FADC documentation, "Programmable Latency" or PL.
+     *
+     * @param readoutLatency Units of 4 ns FADC clock cycles, default of 100.
+     */
     public void setReadoutLatency(int readoutLatency) {
         this.readoutLatency = readoutLatency;
     }
 
+    /**
+     * Number of ADC samples to read out. In FADC documentation, "Programmable
+     * Trigger Window" or PTW.
+     *
+     * @param readoutWindow Units of 4 ns FADC clock cycles, default of 100.
+     */
     public void setReadoutWindow(int readoutWindow) {
         this.readoutWindow = readoutWindow;
     }
 
+    /**
+     * Number of clock cycles for which the same trigger-path hit is sent to the
+     * clusterer. Only used for old clusterer simulations (CTPClusterDriver).
+     * Otherwise this should be set to 1.
+     *
+     * @param coincidenceWindow Units of 4 ns FADC clock cycles, default of 1.
+     */
     public void setCoincidenceWindow(int coincidenceWindow) {
         this.coincidenceWindow = coincidenceWindow;
     }
 
+    /**
+     * Switch between test run and 2014 definitions of gain constants. True for
+     * MC studies and mock data in 2014. For all real data (test run and 2014+),
+     * test run MC, and 2015+ production MC, this should be false.
+     *
+     *
+     * @param use2014Gain True ONLY for simulation studies in 2014. Default of
+     * false.
+     */
     public void setUse2014Gain(boolean use2014Gain) {
         this.use2014Gain = use2014Gain;
     }
 
+    /**
+     * Model used for the preamp pulse shape.
+     *
+     * @param pulseShape ThreePole, DoubleGaussian, or CRRC. Default is
+     * ThreePole.
+     */
     public void setPulseShape(String pulseShape) {
         this.pulseShape = PulseShape.valueOf(pulseShape);
     }
 
+    /**
+     * Shaper time constant. Definition depends on the pulse shape. For the
+     * three-pole function, this is equal to RC, or half the peaking time.
+     *
+     * @param tp Units of ns, default of 9.6.
+     */
     public void setTp(double tp) {
         this.tp = tp;
     }
 
-//    public void setFallTime(double fallTime) {
-//        this.fallTime = fallTime;
-//    }
+    /**
+     * Photoelectrons per MeV, used to calculate noise due to photoelectron
+     * statistics. Test run detector had a value of 2 photoelectrons/MeV; new
+     * 2014 detector has a value of 32.8 photoelectrons/MeV.
+     *
+     * @param pePerMeV Units of photoelectrons/MeV, default of 32.8.
+     */
     public void setPePerMeV(double pePerMeV) {
         this.pePerMeV = pePerMeV;
     }
 
-//    public void setRiseTime(double riseTime) {
-//        this.riseTime = riseTime;
-//    }
+    /**
+     * Latency between threshold crossing and output of trigger-path hit to
+     * clusterer.
+     *
+     * @param delay0 Units of 4 ns FADC clock cycles, default of 32.
+     */
     public void setDelay0(int delay0) {
         this.delay0 = delay0;
     }
 
+    /**
+     * Length of analog pipeline.
+     *
+     * @param bufferLength Units of 4 ns FADC clock cycles, default of 100.
+     */
     public void setBufferLength(int bufferLength) {
         this.bufferLength = bufferLength;
         resetFADCBuffers();
     }
 
+    /**
+     * Length of digital pipeline. The digital pipeline in the FADC is 2000
+     * cells long.
+     *
+     * @param pipelineLength Units of 4 ns FADC clock cycles, default of 2000.
+     */
     public void setPipelineLength(int pipelineLength) {
         this.pipelineLength = pipelineLength;
         resetFADCBuffers();
     }
 
+    /**
+     * Mode for readout-path hits.
+     *
+     * @param mode 1, 2 or 3. Values correspond to the standard FADC mode
+     * numbers (1=raw, 2=pulse, 3=pulse integral).
+     */
     public void setMode(int mode) {
         this.mode = mode;
-        if (mode != ECAL_WINDOW_MODE && mode != ECAL_PULSE_MODE && mode != ECAL_PULSE_INTEGRAL_MODE) {
+        if (mode != ECAL_RAW_MODE && mode != ECAL_PULSE_MODE && mode != ECAL_PULSE_INTEGRAL_MODE) {
             throw new IllegalArgumentException("invalid mode " + mode);
         }
     }
@@ -219,7 +313,7 @@
      * @return
      */
     public Map<Long, RingBuffer> getSignalMap() {
-        return signalMap;
+        return analogPipelines;
     }
 
     /**
@@ -228,18 +322,25 @@
      * @return
      */
     public Map<Long, FADCPipeline> getPipelineMap() {
-        return pipelineMap;
-    }
-
+        return digitalPipelines;
+    }
+
+    /**
+     * Digitize values in the analog pipelines and append them to the digital
+     * pipelines. Integrate trigger-path hits and add them to the trigger path
+     * queues. Read out trigger-path hits to the list sent to the clusterer.
+     *
+     * @param hits List to be filled by this method.
+     */
     @Override
     protected void readHits(List<RawCalorimeterHit> hits) {
 
-        for (Long cellID : signalMap.keySet()) {
-            RingBuffer signalBuffer = signalMap.get(cellID);
-
-            FADCPipeline pipeline = pipelineMap.get(cellID);
+        for (Long cellID : analogPipelines.keySet()) {
+            RingBuffer signalBuffer = analogPipelines.get(cellID);
+
+            FADCPipeline pipeline = digitalPipelines.get(cellID);
             pipeline.step();
-            
+
             // Get the channel data.
             EcalChannelConstants channelData = findChannel(cellID);
 
@@ -250,9 +351,9 @@
             int pedestalSubtractedValue = digitizedValue - pedestal;
             //System.out.println(signalBuffer.currentValue() + "   " + currentValue + "   " + pipeline.currentValue());
 
-            Integer sum = sumMap.get(cellID);
+            Integer sum = triggerPathHitSums.get(cellID);
             if (sum == null && pedestalSubtractedValue > triggerThreshold) {
-                timeMap.put(cellID, readoutCounter);
+                triggerPathHitTimes.put(cellID, readoutCounter);
                 if (constantTriggerWindow) {
                     int sumBefore = 0;
                     for (int i = 0; i < numSamplesBefore; i++) {
@@ -261,57 +362,57 @@
                         }
                         sumBefore += pipeline.getValue(numSamplesBefore - i - 1);
                     }
-                    sumMap.put(cellID, sumBefore);
+                    triggerPathHitSums.put(cellID, sumBefore);
                 } else {
-                    sumMap.put(cellID, pedestalSubtractedValue);
+                    triggerPathHitSums.put(cellID, pedestalSubtractedValue);
                 }
             }
             if (sum != null) {
                 if (constantTriggerWindow) {
-                    if (timeMap.get(cellID) + numSamplesAfter >= readoutCounter) {
+                    if (triggerPathHitTimes.get(cellID) + numSamplesAfter >= readoutCounter) {
                         if (debug) {
-                            System.out.format("trigger %d, %d: %d\n", cellID, readoutCounter - timeMap.get(cellID) + numSamplesBefore - 1, pipeline.getValue(0));
+                            System.out.format("trigger %d, %d: %d\n", cellID, readoutCounter - triggerPathHitTimes.get(cellID) + numSamplesBefore - 1, pipeline.getValue(0));
                         }
-                        sumMap.put(cellID, sum + pipeline.getValue(0));
-                    } else if (timeMap.get(cellID) + delay0 <= readoutCounter) {
+                        triggerPathHitSums.put(cellID, sum + pipeline.getValue(0));
+                    } else if (triggerPathHitTimes.get(cellID) + delay0 <= readoutCounter) {
 //                        System.out.printf("sum = %f\n", sum);
-                        outputQueue.add(new BaseRawCalorimeterHit(cellID,
+                        triggerPathDelayQueue.add(new BaseRawCalorimeterHit(cellID,
                                 (int) Math.round(sum / scaleFactor),
-                                64 * timeMap.get(cellID)));
-                        sumMap.remove(cellID);
+                                64 * triggerPathHitTimes.get(cellID)));
+                        triggerPathHitSums.remove(cellID);
                     }
                 } else {
-                    if (pedestalSubtractedValue < triggerThreshold || timeMap.get(cellID) + delay0 == readoutCounter) {
+                    if (pedestalSubtractedValue < triggerThreshold || triggerPathHitTimes.get(cellID) + delay0 == readoutCounter) {
 //					System.out.printf("sum = %f\n",sum);
-                        outputQueue.add(new BaseRawCalorimeterHit(cellID,
+                        triggerPathDelayQueue.add(new BaseRawCalorimeterHit(cellID,
                                 (int) Math.round((sum + pedestalSubtractedValue) / scaleFactor),
-                                64 * timeMap.get(cellID)));
-                        sumMap.remove(cellID);
+                                64 * triggerPathHitTimes.get(cellID)));
+                        triggerPathHitSums.remove(cellID);
                     } else {
-                        sumMap.put(cellID, sum + pedestalSubtractedValue);
+                        triggerPathHitSums.put(cellID, sum + pedestalSubtractedValue);
                     }
                 }
             }
             signalBuffer.step();
         }
-        while (outputQueue.peek() != null && outputQueue.peek().getTimeStamp() / 64 <= readoutCounter - delay0) {
-            if (outputQueue.peek().getTimeStamp() / 64 < readoutCounter - delay0) {
+        while (triggerPathDelayQueue.peek() != null && triggerPathDelayQueue.peek().getTimeStamp() / 64 <= readoutCounter - delay0) {
+            if (triggerPathDelayQueue.peek().getTimeStamp() / 64 < readoutCounter - delay0) {
                 System.out.println(this.getName() + ": Stale hit in output queue");
-                outputQueue.poll();
+                triggerPathDelayQueue.poll();
             } else {
-                buffer.add(outputQueue.poll());
-            }
-        }
-        while (!buffer.isEmpty() && buffer.peek().getTimeStamp() / 64 <= readoutCounter - delay0 - coincidenceWindow) {
-            buffer.remove();
+                triggerPathCoincidenceQueue.add(triggerPathDelayQueue.poll());
+            }
+        }
+        while (!triggerPathCoincidenceQueue.isEmpty() && triggerPathCoincidenceQueue.peek().getTimeStamp() / 64 <= readoutCounter - delay0 - coincidenceWindow) {
+            triggerPathCoincidenceQueue.remove();
         }
         if (debug) {
-            for (RawCalorimeterHit hit : buffer) {
+            for (RawCalorimeterHit hit : triggerPathCoincidenceQueue) {
                 System.out.format("new hit: energy %d\n", hit.getAmplitude());
             }
         }
 
-        hits.addAll(buffer);
+        hits.addAll(triggerPathCoincidenceQueue);
     }
 
     @Override
@@ -325,9 +426,9 @@
     @Override
     protected void processTrigger(EventHeader event) {
         switch (mode) {
-            case ECAL_WINDOW_MODE:
+            case ECAL_RAW_MODE:
                 if (debug) {
-                    System.out.println("Reading out ECal in window mode");
+                    System.out.println("Reading out ECal in raw mode");
                 }
                 event.put(ecalReadoutCollectionName, readWindow(), RawTrackerHit.class, 0, ecalReadoutName);
                 break;
@@ -355,7 +456,7 @@
     }
 
     protected short[] getWindow(long cellID) {
-        FADCPipeline pipeline = pipelineMap.get(cellID);
+        FADCPipeline pipeline = digitalPipelines.get(cellID);
         short[] adcValues = new short[readoutWindow];
         for (int i = 0; i < readoutWindow; i++) {
             adcValues[i] = (short) pipeline.getValue(readoutLatency - i - 1);
@@ -369,9 +470,19 @@
     protected List<RawTrackerHit> readWindow() {
 //		System.out.println("Reading FADC data");
         List<RawTrackerHit> hits = new ArrayList<RawTrackerHit>();
-        for (Long cellID : pipelineMap.keySet()) {
+        for (Long cellID : digitalPipelines.keySet()) {
             short[] adcValues = getWindow(cellID);
-            hits.add(new BaseRawTrackerHit(cellID, 0, adcValues));
+            EcalChannelConstants channelData = findChannel(cellID);
+            boolean isAboveThreshold = false;
+            for (int i = 0; i < adcValues.length; i++) {
+                if (adcValues[i] > channelData.getCalibration().getPedestal() + readoutThreshold) {
+                    isAboveThreshold = true;
+                    break;
+                }
+            }
+            if (isAboveThreshold) {
+                hits.add(new BaseRawTrackerHit(cellID, 0, adcValues));
+            }
         }
         return hits;
     }
@@ -379,18 +490,21 @@
     protected List<RawTrackerHit> readPulses() {
 //		System.out.println("Reading FADC data");
         List<RawTrackerHit> hits = new ArrayList<RawTrackerHit>();
-        for (Long cellID : pipelineMap.keySet()) {
+        for (Long cellID : digitalPipelines.keySet()) {
             short[] window = getWindow(cellID);
             short[] adcValues = null;
             int pointerOffset = 0;
             int numSamplesToRead = 0;
             int thresholdCrossing = 0;
-            
+
             // Get the channel data.
             EcalChannelConstants channelData = findChannel(cellID);
-            
+
             for (int i = 0; i < readoutWindow; i++) {
                 if (numSamplesToRead != 0) {
+                    if (adcValues == null) {
+                        throw new RuntimeException("expected a pulse buffer, none found (this should never happen)");
+                    }
                     adcValues[adcValues.length - numSamplesToRead] = window[i - pointerOffset];
                     numSamplesToRead--;
                     if (numSamplesToRead == 0) {
@@ -410,16 +524,16 @@
     protected List<RawCalorimeterHit> readIntegrals() {
 //		System.out.println("Reading FADC data");
         List<RawCalorimeterHit> hits = new ArrayList<RawCalorimeterHit>();
-        for (Long cellID : pipelineMap.keySet()) {
+        for (Long cellID : digitalPipelines.keySet()) {
             short[] window = getWindow(cellID);
             int adcSum = 0;
             int pointerOffset = 0;
             int numSamplesToRead = 0;
             int thresholdCrossing = 0;
-            
+
             // Get the channel data.
             EcalChannelConstants channelData = findChannel(cellID);
-            
+
             if (window != null) {
                 for (int i = 0; i < readoutWindow; i++) {
                     if (numSamplesToRead != 0) {
@@ -443,11 +557,17 @@
         return hits;
     }
 
+    /**
+     * Fill the analog pipelines with the preamp pulses generated by hits in the
+     * ECal.
+     *
+     * @param hits ECal hits from SLIC/Geant4.
+     */
     @Override
     protected void putHits(List<CalorimeterHit> hits) {
         //fill the readout buffers
         for (CalorimeterHit hit : hits) {
-            RingBuffer eDepBuffer = signalMap.get(hit.getCellID());
+            RingBuffer eDepBuffer = analogPipelines.get(hit.getCellID());
             double energyAmplitude = hit.getRawEnergy();
             // Get the channel data.
             EcalChannelConstants channelData = findChannel(hit.getCellID());
@@ -455,13 +575,16 @@
                 //add preamp noise and photoelectron Poisson noise in quadrature
                 double noise;
                 if (use2014Gain) {
-                    noise = Math.sqrt(Math.pow(channelData.getCalibration().getNoise() * channelData.getGain().getGain() * EcalUtils.gainFactor * EcalUtils.ecalReadoutPeriod, 2) 
-                    		+ hit.getRawEnergy() / (EcalUtils.lightYield * EcalUtils.quantumEff * EcalUtils.surfRatio));
+                    noise = Math.sqrt(Math.pow(channelData.getCalibration().getNoise() * channelData.getGain().getGain() * EcalUtils.gainFactor * EcalUtils.ecalReadoutPeriod, 2)
+                            + hit.getRawEnergy() / (EcalUtils.lightYield * EcalUtils.quantumEff * EcalUtils.surfRatio));
                 } else {
-                    noise = Math.sqrt(Math.pow(channelData.getCalibration().getNoise() * channelData.getGain().getGain() * EcalUtils.MeV, 2) 
-                    		+ hit.getRawEnergy() * EcalUtils.MeV / pePerMeV);
+                    noise = Math.sqrt(Math.pow(channelData.getCalibration().getNoise() * channelData.getGain().getGain() * EcalUtils.MeV, 2)
+                            + hit.getRawEnergy() * EcalUtils.MeV / pePerMeV);
                 }
                 energyAmplitude += RandomGaussian.getGaussian(0, noise);
+            }
+            if ((1) * readoutPeriod + readoutTime() - (ClockSingleton.getTime() + hit.getTime()) >= readoutPeriod) {
+                throw new RuntimeException("trying to add a hit to the analog pipeline, but time seems incorrect");
             }
             for (int i = 0; i < bufferLength; i++) {
                 eDepBuffer.addToCell(i, energyAmplitude * pulseAmplitude((i + 1) * readoutPeriod + readoutTime() - (ClockSingleton.getTime() + hit.getTime()), hit.getCellID()));
@@ -472,9 +595,9 @@
     @Override
     protected void initReadout() {
         //initialize buffers
-        sumMap = new HashMap<Long, Integer>();
-        timeMap = new HashMap<Long, Integer>();
-        outputQueue = new PriorityQueue(20, new TimeComparator());
+        triggerPathHitSums = new HashMap<Long, Integer>();
+        triggerPathHitTimes = new HashMap<Long, Integer>();
+        triggerPathDelayQueue = new PriorityQueue(20, new TimeComparator());
         resetFADCBuffers();
     }
 
@@ -482,10 +605,10 @@
     public void detectorChanged(Detector detector) {
         // Get the Subdetector.
         ecal = detector.getSubdetector(ecalName);
-        
+
         // ECAL combined conditions object.
         ecalConditions = DatabaseConditionsManager.getInstance().getEcalConditions();
-        
+
         resetFADCBuffers();
     }
 
@@ -493,21 +616,30 @@
         if (ecal == null) {
             return false;
         }
-        signalMap = new HashMap<Long, RingBuffer>();
-        pipelineMap = new HashMap<Long, FADCPipeline>();
+        analogPipelines = new HashMap<Long, RingBuffer>();
+        digitalPipelines = new HashMap<Long, FADCPipeline>();
         Set<Long> cells = ((HPSEcal3) ecal).getNeighborMap().keySet();
         for (Long cellID : cells) {
-        	EcalChannelConstants channelData = findChannel(cellID);
-            signalMap.put(cellID, new RingBuffer(bufferLength));
-            pipelineMap.put(cellID, new FADCPipeline(pipelineLength, (int) Math.round(channelData.getCalibration().getPedestal())));
+            EcalChannelConstants channelData = findChannel(cellID);
+            analogPipelines.put(cellID, new RingBuffer(bufferLength));
+            digitalPipelines.put(cellID, new FADCPipeline(pipelineLength, (int) Math.round(channelData.getCalibration().getPedestal())));
         }
         return true;
     }
 
+    /**
+     * Returns pulse amplitude at the given time (relative to hit time). Gain is
+     * applied.
+     *
+     * @param time Units of ns. Relative to hit time (negative=before the start
+     * of the pulse).
+     * @param cellID Crystal ID as returned by hit.getCellID().
+     * @return Amplitude, units of volts/GeV.
+     */
     private double pulseAmplitude(double time, long cellID) {
         // Get the channel data.
         EcalChannelConstants channelData = findChannel(cellID);
-    	
+
         if (use2014Gain) {
             //if fixedGain is set, multiply the default gain by this factor
             double corrGain;
@@ -533,10 +665,11 @@
 
     /**
      * Returns pulse amplitude at the given time (relative to hit time).
-     * Amplitude is normalized so the pulse integral is 1.
-     *
-     * @param time
-     * @return
+     *
+     * @param time Units of ns. Relative to hit time (negative=before the start
+     * of the pulse).
+     * @return Amplitude, units of inverse ns. Normalized so the pulse integral
+     * is 1.
      */
     public static double pulseAmplitude(double time, PulseShape shape, double shapingTime) {
         if (time <= 0.0) {
@@ -615,22 +748,22 @@
             return array[((ptr - pos) % size + size) % size];
         }
     }
-    
-    /** 
+
+    /**
      * Convert physical ID to gain value.
+     *
      * @param cellID (long)
      * @return channel constants (EcalChannelConstants)
      */
     private EcalChannelConstants findChannel(long cellID) {
         return ecalConditions.getChannelConstants(ecalConditions.getChannelCollection().findGeometric(cellID));
     }
-    
-    
-	public static class TimeComparator implements Comparator<RawCalorimeterHit> {
+
+    public static class TimeComparator implements Comparator<RawCalorimeterHit> {
 
         @Override
-		public int compare(RawCalorimeterHit o1, RawCalorimeterHit o2) {
-			return o1.getTimeStamp() - o2.getTimeStamp();
-		}
-	}
+        public int compare(RawCalorimeterHit o1, RawCalorimeterHit o2) {
+            return o1.getTimeStamp() - o2.getTimeStamp();
+        }
+    }
 }

Modified: java/branches/HPSJAVA-488/ecal-readout-sim/src/main/java/org/hps/readout/ecal/FADCPrimaryTriggerDriver.java
 =============================================================================
--- java/branches/HPSJAVA-488/ecal-readout-sim/src/main/java/org/hps/readout/ecal/FADCPrimaryTriggerDriver.java	(original)
+++ java/branches/HPSJAVA-488/ecal-readout-sim/src/main/java/org/hps/readout/ecal/FADCPrimaryTriggerDriver.java	Fri Jun 12 15:27:10 2015
@@ -70,6 +70,7 @@
     private IHistogram1D[] pairCoplanarity;
     private IHistogram1D[] pairEnergySlope;
     private IHistogram2D[] clusterDistribution;
+    private IHistogram2D[] pairEnergySum2DDistribution;
     
     /**
      * Initializes the cluster pair queues and other variables.
@@ -106,6 +107,7 @@
     	pairEnergyDifference = new IHistogram1D[PLOT_COUNT - 1];
     	pairCoplanarity = new IHistogram1D[PLOT_COUNT - 1];
     	pairEnergySlope = new IHistogram1D[PLOT_COUNT - 1];
+    	pairEnergySum2DDistribution = new IHistogram2D[PLOT_COUNT - 1];
     	
     	// Instantiate the plots.
     	for(int i = 0; i < PLOT_COUNT; i++) {
@@ -120,6 +122,7 @@
     			pairEnergyDifference[i] = aida.histogram1D(plotDir[i] + "Pair Energy Difference" + plotType[i], 176, 0.0, 2.2);
     			pairCoplanarity[i] = aida.histogram1D(plotDir[i] + "Pair Coplanarity" + plotType[i], 180, 0.0, 180.0);
     			pairEnergySlope[i] = aida.histogram1D(plotDir[i] + "Pair Energy Slope" + plotType[i], 200, 0.0, 4.0);
+    			pairEnergySum2DDistribution[i] = aida.histogram2D(plotDir[i] + "Pair Energy Sum 2D" + plotType[i], 176, 0.0, 4.4, 176, 0.0, 4.4);
     		}
     	}
     	
@@ -629,6 +632,7 @@
             pairEnergyDifference[NO_CUTS].fill(energyDifference);
             pairEnergySlope[NO_CUTS].fill(energySlope);
             pairCoplanarity[NO_CUTS].fill(coplanarity);
+            pairEnergySum2DDistribution[NO_CUTS].fill(clusterPair[0].getEnergy(), clusterPair[1].getEnergy());
             
             // Fill the hit count plots for N > 1.
             if(clusterPair[0].getCalorimeterHits().size() > 1 && clusterPair[1].getCalorimeterHits().size() > 1) {
@@ -637,6 +641,7 @@
                 pairEnergyDifference[OVER_1HIT].fill(energyDifference);
                 pairEnergySlope[OVER_1HIT].fill(energySlope);
                 pairCoplanarity[OVER_1HIT].fill(coplanarity);
+                pairEnergySum2DDistribution[OVER_1HIT].fill(clusterPair[0].getEnergy(), clusterPair[1].getEnergy());
             	
                 // Fill the hit count plots for N > 2.
                 if(clusterPair[0].getCalorimeterHits().size() > 2 && clusterPair[1].getCalorimeterHits().size() > 2) {
@@ -645,6 +650,7 @@
                     pairEnergyDifference[OVER_2HIT].fill(energyDifference);
                     pairEnergySlope[OVER_2HIT].fill(energySlope);
                     pairCoplanarity[OVER_2HIT].fill(coplanarity);
+                    pairEnergySum2DDistribution[OVER_2HIT].fill(clusterPair[0].getEnergy(), clusterPair[1].getEnergy());
                 }
             }
             
@@ -716,8 +722,12 @@
             pairEnergyDifference[ALL_CUTS].fill(energyDifference, 1);
             pairEnergySlope[ALL_CUTS].fill(energySlope, 1);
             pairCoplanarity[ALL_CUTS].fill(coplanarity, 1);
+            pairEnergySum2DDistribution[ALL_CUTS].fill(clusterPair[0].getEnergy(), clusterPair[1].getEnergy());
             
             // Clusters that pass all of the pair cuts produce a trigger.
+            if (verbose) {
+                System.out.format("Passed trigger cuts: cluster 0 (energy %f, ix %d, iy %d, size %d) and cluster 1 (energy %f, ix %d, iy %d, size %d)\n", clusterPair[0].getEnergy(), clusterPair[0].getCalorimeterHits().get(0).getIdentifierFieldValue("ix"), clusterPair[0].getCalorimeterHits().get(0).getIdentifierFieldValue("iy"), clusterPair[0].getSize(), clusterPair[1].getEnergy(), clusterPair[1].getCalorimeterHits().get(0).getIdentifierFieldValue("ix"), clusterPair[1].getCalorimeterHits().get(0).getIdentifierFieldValue("iy"), clusterPair[1].getSize());
+            }
             return true;
         }
         

Modified: java/branches/HPSJAVA-488/ecal-recon/pom.xml
 =============================================================================
--- java/branches/HPSJAVA-488/ecal-recon/pom.xml	(original)
+++ java/branches/HPSJAVA-488/ecal-recon/pom.xml	Fri Jun 12 15:27:10 2015
@@ -8,7 +8,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>../parent/pom.xml</relativePath>
-        <version>3.3.1-SNAPSHOT</version>
+        <version>3.3.3-SNAPSHOT</version>
     </parent>
     <scm>
         <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/ecal-recon/</url>

Modified: java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/EcalEdepToTriggerConverterDriver.java
 =============================================================================
--- java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/EcalEdepToTriggerConverterDriver.java	(original)
+++ java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/EcalEdepToTriggerConverterDriver.java	Fri Jun 12 15:27:10 2015
@@ -15,9 +15,18 @@
 
 
 /**
- *
- * @version $Id: HPSEcalRawConverterDriver.java,v 1.2 2012/05/03 00:17:54
- * phansson Exp $
+ * This file can be used on Monte Carlo and excludes pile up. This makes
+ * it useful to study sampling fractions and energy resolution when firing single
+ * energy particles at the detector. This file takes the geant4 energy deposition,
+ * and converts it to uits of FADC using the pulse integral value and gain (amplitude).
+ * The amplitude can include noise if desired. This value is then compared to the 
+ * readout/trigger thresholds in FADC. Finally,this value is converted back into GeV 
+ * energy output which can be used for clustering, etc. 
+ * 
+ * Original author for test run:
+ * @author phansson 
+ * Modified from test run to Spring 2015 running: 
+ * @author Holly Szumila <[log in to unmask]>
  */
 public class EcalEdepToTriggerConverterDriver extends Driver {
 	
@@ -30,16 +39,16 @@
     private String readoutCollection = "EcalCalHits";
     private String triggerCollection = "EcalTriggerHits";
     private boolean applyBadCrystalMap = true;
-    private double tp = 14.0;
+    private double tp = 6.95; //14.0 for test run;
     private final double readoutPeriod = 4.0;
-    private final int readoutThreshold = 50;
-    private final int triggerThreshold = 80;
+    private final int readoutThreshold = 12;//FADC units; 50 for test run;
+    private final int triggerThreshold = 12;//FADC units; 80;
     private int truncateScale = 128;
-    private final double pulseIntegral = tp * Math.E / readoutPeriod;
+    private final double pulseIntegral = tp * Math.E * Math.E /(2*readoutPeriod);//tp * Math.E / readoutPeriod (test run);
     private final double gainScale = 1.0; //gain miscalibration factor
     private double _gain = -1.0; //constant gain, activated if >0
     private boolean addNoise = false;
-    private final double pePerMeV = 2.0; //photoelectrons per MeV, used to calculate noise
+    private final double pePerMeV = 32.8; //photoelectrons per MeV, used to calculate noise
 
     public EcalEdepToTriggerConverterDriver() {
     }

Modified: java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverter.java
 =============================================================================
--- java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverter.java	(original)
+++ java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverter.java	Fri Jun 12 15:27:10 2015
@@ -1,4 +1,6 @@
 package org.hps.recon.ecal;
+
+import hep.aida.IFitResult;
 
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
@@ -27,8 +29,11 @@
  * @author Sho Uemura <[log in to unmask]>
  * @author Andrea Celentano <[log in to unmask]>
  * @author Nathan Baltzell <[log in to unmask]>
+ * @author Holly Szumila <[log in to unmask]>
  *
- * baltzell:  New in 2015:  (default behavior is still unchanged)
+ * baltzell: May 2015:  Pulse Fitting. (default behavior unchanged)
+ *
+ * baltzell:  Early 2015:  (default behavior is still unchanged)
  *
  * Implemented conversion of Mode-1 to Mode-3.
  * 
@@ -54,6 +59,9 @@
     private boolean useDAQConfig = false;
     private FADCConfig config = null;
 
+    private boolean useFit = false;
+    private EcalPulseFitter pulseFitter = new EcalPulseFitter();
+    
     /*
      * The time for one FADC sample (units = ns).
      */
@@ -141,6 +149,19 @@
     	});
     }
   
+    public void setUseFit(boolean useFit) { this.useFit=useFit; }
+    public void setFixShapeParameter(boolean fix) { pulseFitter.fixShapeParameter=fix; }
+    public void setGlobalFixedPulseWidth(double width) { 
+        pulseFitter.globalThreePoleWidth=width; 
+        pulseFitter.fixShapeParameter=true;
+    }
+    public void setFitThresholdTimeLo(int sample) { pulseFitter.threshRange[0]=sample; }
+    public void setFitThresholdTimeHi(int sample) { pulseFitter.threshRange[1]=sample; }
+    public void setFitLimitTimeLo(int sample) { pulseFitter.t0limits[0]=sample; }
+    public void setFitLimitTimeHi(int sample) { pulseFitter.t0limits[1]=sample; }
+    
+    
+
     public void setLeadingEdgeThreshold(double thresh) {
         leadingEdgeThreshold=thresh;
     }
@@ -195,6 +216,8 @@
     public void setUseDAQConfig(boolean state) {
     	useDAQConfig = state;
     }
+    
+
 
     /*
      * This should probably be deprecated.  It just integrates the entire window.
@@ -286,8 +309,11 @@
      * given a time for threshold crossing.
      */
     public double[] convertWaveformToPulse(RawTrackerHit hit,int thresholdCrossing,boolean mode7) {
+       
+        double fitQuality = -1;
+        
         short samples[] = hit.getADCValues();
-        
+        //System.out.println("NewEvent");
         // choose integration range:
         int firstSample,lastSample;
         if ((NSA+NSB)/nsPerSample >= samples.length) {
@@ -303,14 +329,17 @@
         double minADC=0;
         for (int jj=0; jj<4; jj++) minADC += samples[jj];
         // does the firmware's conversion of min to int occur before or after time calculation?  undocumented.
-        minADC=(int)(minADC/4); 
+        //minADC=(int)(minADC/4); 
+        minADC = (minADC/4);
+        
+        //System.out.println("Avg pedestal:\t"+minADC);
         
         // mode-7's max pulse height:
         double maxADC=0;
         int sampleMaxADC=0;
         
         // mode-3/7's pulse integral:
-        short sumADC = 0;
+        double sumADC = 0;
         
         for (int jj=firstSample; jj<=lastSample; jj++) {
         
@@ -319,19 +348,22 @@
             
             // integrate pulse:
             sumADC += samples[jj];
-           
-            // find pulse maximum:
-            if (jj>firstSample && jj<samples.length-5) { // The "5" here is a firmware constant.
-                if (samples[jj+1]<samples[jj]) {
-                    sampleMaxADC=jj;
-                    maxADC=samples[jj];
-                }
-            }
-        }
-       
+        }
+
+        // find pulse maximum:
+        //if (jj>firstSample && jj<samples.length-5) { // The "5" here is a firmware constant.
+        for (int jj=thresholdCrossing; jj<samples.length-5; jj++) { // The "5" here is a firmware constant.
+            if (samples[jj+1]<samples[jj]){ 
+                sampleMaxADC=jj;
+                maxADC=samples[jj];
+                break;                
+            }
+        }
+
+
         // pulse time with 4ns resolution:
         double pulseTime=thresholdCrossing*nsPerSample;
-        
+
         // calculate Mode-7 high-resolution time:
         if (mode7) {
             if (thresholdCrossing < 4) {
@@ -341,22 +373,45 @@
             else if (maxADC>0) {
                 // linear interpolation between threshold crossing and
                 // pulse maximum to find time at pulse half-height:
-                double t0 = thresholdCrossing*nsPerSample;
-                double a0 = samples[thresholdCrossing];
-                double t1 = sampleMaxADC*nsPerSample;
-                double a1 = maxADC;
-                double slope = (a1-a0)/(t1-t0);
-                double halfMax = (maxADC+minADC)/2;
-                // this is not rigorously firmware-correct, need to find halfMax-crossing.
-                double tmpTime = t1 - (a1 - halfMax) / slope;
-                if (slope>0 && tmpTime>0) {
-                    pulseTime = tmpTime;
+
+                final double halfMax = (maxADC+minADC)/2;
+                int t0 = -1;
+                for (int ii=thresholdCrossing-1; ii<lastSample; ii++)
+                {
+                    if (ii>=samples.length-1) break;
+                    if (samples[ii]<=halfMax && samples[ii+1]>halfMax)
+                    {
+                        t0 = ii;
+                        break;
+                    }
                 }
-                // else another special firmware case
-            }
-        }
-        
-        return new double []{pulseTime,sumADC,minADC,maxADC};
+                if (t0 > 0)
+                {
+                    final int t1 = t0 + 1;
+                    final int a0 = samples[t0];
+                    final int a1 = samples[t1];
+                    final double slope = (a1 - a0); // units = ADC/sample
+                    final double yint = a1 - slope * t1;  // units = ADC 
+                    pulseTime = ((halfMax - a0)/(a1-a0) + t0)* nsPerSample;
+                }
+            }
+        }
+        
+        if (useFit)
+        {
+          IFitResult fitResult = pulseFitter.fitPulse(hit,thresholdCrossing,maxADC);
+          if (fitResult!=null) {
+            fitQuality = fitResult.quality();
+            if (fitQuality > 0) {
+                pulseTime = fitResult.fittedParameter("time0")*nsPerSample;
+                sumADC = fitResult.fittedParameter("integral");
+                minADC = fitResult.fittedParameter("pedestal");
+                maxADC = ((Ecal3PoleFunction)fitResult.fittedFunction()).maximum();
+            } 
+          }
+        }
+        
+        return new double []{pulseTime,sumADC,minADC,maxADC,fitQuality};
     }
    
     
@@ -428,9 +483,12 @@
             double sum = data[1];
             final double min = data[2]; // TODO: stick min and max in a GenericObject with an 
             final double max = data[3]; // LCRelation to finish mode-7 emulation
+            final double fitQuality = data[4];
             
-            // do pedestal subtraction:
-            sum -= getPulsePedestal(event, cellID, samples.length, thresholdCrossing);
+            if (!useFit || fitQuality<=0) {
+              // do pedestal subtraction:
+              sum -= getPulsePedestal(event, cellID, samples.length, thresholdCrossing);
+            }
           
             // do gain scaling:
             double energy = adcToEnergy(sum, cellID);
@@ -530,6 +588,7 @@
     public void setDetector(Detector detector) {
         // ECAL combined conditions object.
         ecalConditions = DatabaseConditionsManager.getInstance().getEcalConditions();
+        pulseFitter.setDetector(detector);
     }
 
     /**

Modified: java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverterDriver.java
 =============================================================================
--- java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverterDriver.java	(original)
+++ java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverterDriver.java	Fri Jun 12 15:27:10 2015
@@ -18,17 +18,7 @@
 import org.lcsim.util.Driver;
 
 /**
- * 
- * 
- * baltzell New in 2015:  (default behavior is unchanged)
- * Added firmware emulation for converting from Mode-1 readout (RawTrackerHit)
- * to Mode-3 pulse (CalorimeterHit).  Turn it on with "emulateFirmware", else
- * defaults to previous behavior.  
- *  
- * Removed integralWindow in favor of NSA/NSB to allow treating all Modes uniformly.
- * (New) NSA+NSB == (Old) integralWindow*4(ns) 
- * 
- * Implemented finding multiple peaks for Mode-1.
+ * baltzell June 2015: removed outdated javadoc comments in the class header
  */
 public class EcalRawConverterDriver extends Driver {
 
@@ -57,6 +47,33 @@
         converter = new EcalRawConverter();
     }
 
+    /*
+     * Set to <code>true</code> to use pulse fitting instead of arithmetic integration:<br/>
+     */
+    public void setUseFit(boolean useFit) { converter.setUseFit(useFit); }
+    
+    /*
+     * Fix 3-pole function width to be the same for all 442 ECal channels.  Units=samples.
+     */
+    public void setGlobalFixedPulseWidth(double width) { converter.setGlobalFixedPulseWidth(width); }
+    
+    /*
+     * Set to <code>true</code> to fix fitted pulse widths to their channel's mean value:<br/>
+     */
+    public void setFixShapeParameter(boolean fix) { converter.setFixShapeParameter(fix); }
+   
+    /*
+     * Limit threshold crossing range that is candidate for pulse-fitting.   Units=samples.
+     */
+    public void setFitThresholdTimeLo(int sample) { converter.setFitThresholdTimeLo(sample); }
+    public void setFitThresholdTimeHi(int sample) { converter.setFitThresholdTimeHi(sample); }
+    
+    /*
+     * Constrain pulse fit time0 parameter.  Units=samples. 
+     */
+    public void setFitLimitTimeLo(int sample) { converter.setFitLimitTimeLo(sample); }
+    public void setFitLimitTimeHi(int sample) { converter.setFitLimitTimeHi(sample); }
+    
     /**
      * Set to <code>true</code> to use the "2014" gain formula:<br/>
      * <pre>channelGain * adcSum * gainFactor * readoutPeriod</pre>

Modified: java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRunningPedestalDriver.java
 =============================================================================
--- java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRunningPedestalDriver.java	(original)
+++ java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRunningPedestalDriver.java	Fri Jun 12 15:27:10 2015
@@ -12,12 +12,15 @@
 import org.lcsim.event.GenericObject;
 import org.lcsim.event.LCRelation;
 import org.lcsim.event.RawCalorimeterHit;
+import org.lcsim.event.RawTrackerHit;
 import org.lcsim.geometry.Detector;
 import org.lcsim.util.Driver;
 
 /**
  * Calculate a running pedestal average for every channel from Mode7 FADCs. Uses
  * pedestals from the database if not available from the data.
+ * 
+ * May 2015:  Updated to also work on Mode1 data.
  * 
  * TODO: Use Logger.
  * 
@@ -49,6 +52,9 @@
     private static final String extraDataRelationsName = "EcalReadoutExtraDataRelations";
     private static final String runningPedestalsName = "EcalRunningPedestals";
 
+    // number of samples from the beginning of the time window used to calculate the pedestal:
+    private static final int nSamples = 4;
+    
     // TODO:  Get this from somewhere else.
     private final int nChannels = 442;
 
@@ -57,7 +63,7 @@
             nChannels);
 
     // recent event-by-event pedestals and timestamps:
-    private Map<EcalChannel, List<Integer>> eventPedestals = new HashMap<EcalChannel, List<Integer>>();
+    private Map<EcalChannel, List<Double>> eventPedestals = new HashMap<EcalChannel, List<Double>>();
     private Map<EcalChannel, List<Long>> eventTimestamps = new HashMap<EcalChannel, List<Long>>();
 
     private boolean debug = false;
@@ -82,7 +88,7 @@
         for (int ii = 0; ii < nChannels; ii++) {
             EcalChannel chan = findChannel(ii + 1);
             runningPedestals.put(chan,getStaticPedestal(chan));
-            eventPedestals.put(chan,new ArrayList<Integer>());
+            eventPedestals.put(chan,new ArrayList<Double>());
             eventTimestamps.put(chan,new ArrayList<Long>());
         }
         if (debug) {
@@ -127,9 +133,21 @@
         System.out.printf("\n");
     }
 
+    private double getNSampleMinimum(short samples[]) {
+        double min=99999999;
+        for (int ii=0; ii<samples.length-nSamples; ii++) {
+            double tmp=0;
+            for (int jj=ii; jj<ii+nSamples; jj++) tmp += samples[jj];
+            tmp /= nSamples;
+            if (tmp < min) min=tmp;
+        }
+        return min;
+    }
+    
     @Override
     protected void process(EventHeader event) {
 
+        // Mode-7 Input Data:
         if (event.hasCollection(RawCalorimeterHit.class, rawCollectionName)) {
             if (event.hasCollection(LCRelation.class, extraDataRelationsName)) {
                 for (LCRelation rel : event.get(LCRelation.class,
@@ -140,7 +158,38 @@
                 }
             }
         }
+        
+        // Mode-1 Input Data:
+        else if (event.hasCollection(RawTrackerHit.class, rawCollectionName)) {
+            List<RawTrackerHit> hits = event.get(RawTrackerHit.class, rawCollectionName);
+            for (RawTrackerHit hit : hits) {
+               short samples[] = hit.getADCValues();
+               if (nSamples > samples.length) {
+                   System.err.println("NOT ENGOUTH SAMPLES FOR ECAL RUNNING PEDETSAL.");
+                   System.exit(0);
+               }
+              
+               //double ped = getNSampleMinimum(samples);
+              
+               boolean good=true;
+               double ped=0;
+               for (int ii=0; ii<nSamples; ii++) {
+                   // reject pulses from pedestal calculation:
+                   if (samples[ii] > getStaticPedestal(findChannel(hit))+12) {
+                       good=false;
+                       break;
+                   }
+                   ped += samples[ii];
+               }
+               if (good) {
+                   ped /= nSamples;
+                   updatePedestal(event,findChannel(hit),ped);
+               }
+            }
+        }
+       
         event.put(runningPedestalsName, runningPedestals);
+        
         if (debug) {
             printPedestals();
         }
@@ -149,7 +198,6 @@
     private void updatePedestal(EventHeader event, RawCalorimeterHit hit,
             GenericObject mode7data) {
 
-        final long timestamp = event.getTimeStamp();
         final int min = ((HitExtraData.Mode7Data) mode7data).getAmplLow();
         final int max = ((HitExtraData.Mode7Data) mode7data).getAmplHigh();
 
@@ -162,7 +210,15 @@
             System.err.println("hit doesn't correspond to ecalchannel");
             return;
         }
-        List<Integer> peds = eventPedestals.get(chan);
+        
+        updatePedestal(event,chan,(double)min);
+    }
+    
+    private void updatePedestal(EventHeader event,EcalChannel chan,double min) {
+
+        final long timestamp = event.getTimeStamp();
+        
+        List<Double> peds = eventPedestals.get(chan);
         List<Long> times = eventTimestamps.get(chan);
 
         if (maxLookbackTime > 0) {
@@ -214,8 +270,8 @@
         } else {
             ped = getStaticPedestal(chan);
         }
+        
         runningPedestals.put(chan, ped);
-
     }
 
     public double getStaticPedestal(EcalChannel chan) {
@@ -227,6 +283,10 @@
         return ecalConditions.getChannelCollection().findChannel(channel_id);
     }
 
+    public EcalChannel findChannel(RawTrackerHit hit) {
+        return ecalConditions.getChannelCollection().findGeometric(
+                hit.getCellID());
+    }
     public EcalChannel findChannel(RawCalorimeterHit hit) {
         return ecalConditions.getChannelCollection().findGeometric(
                 hit.getCellID());

Modified: java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ClusterDriver.java
 =============================================================================
--- java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ClusterDriver.java	(original)
+++ java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ClusterDriver.java	Fri Jun 12 15:27:10 2015
@@ -249,7 +249,7 @@
                 }
             }
         } else {
-            getLogger().info("The input hit collection " + this.inputHitCollectionName + " is missing from the event.");
+//            getLogger().info("The input hit collection " + this.inputHitCollectionName + " is missing from the event.");
             if (this.raiseErrorNoHitCollection) {
                 throw new RuntimeException("The expected input hit collection is missing from the event.");
             }

Modified: java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ClusterUtilities.java
 =============================================================================
--- java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ClusterUtilities.java	(original)
+++ java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ClusterUtilities.java	Fri Jun 12 15:27:10 2015
@@ -471,5 +471,64 @@
         return cluster.getType() == ClusterType.CTP.getType() || 
                 cluster.getType() == ClusterType.GTP.getType() || 
                 cluster.getType() == ClusterType.GTP_ONLINE.getType();
-    }       
+    }
+    
+    /**
+     * Comparator of cluster energies.
+     */
+    static final class ClusterEnergyComparator implements Comparator<Cluster> {
+
+        /**
+         * Compare cluster energies.
+         * 
+         * @return -1, 0, or 1 if first cluster's energy is less than, equal to, or greater than the first's
+         */
+        @Override
+        public int compare(Cluster o1, Cluster o2) {
+            if (o1.getEnergy() < o2.getEnergy()) {
+                return -1;
+            } else if (o1.getEnergy() > o2.getEnergy()) {
+                return 1;
+            } else {
+                return 0;
+            }
+        }       
+    }
+    
+    /**
+     * Sort a list of clusters.
+     * 
+     * @param clusters the list of clusters
+     * @param comparator the comparator to use for sorting
+     * @param inPlace <code>true</code> to sort the list in-place and not make a new list
+     * @param reverse <code>true</code> to use reverse comparator (results in list ordered highest to lowest energy)
+     * @return the sorted list of clusters
+     */
+    public static List<Cluster> sort(final List<Cluster> clusters, final Comparator<Cluster> comparator, boolean inPlace, boolean reverse) {
+        List<Cluster> sortedList = null;
+        if (inPlace) {
+            sortedList = clusters;
+        } else {
+            sortedList = new ArrayList<Cluster>(clusters);
+        }
+        if (reverse) {
+            Collections.sort(clusters, Collections.reverseOrder(comparator));
+        } else {
+            Collections.sort(clusters, comparator);
+        }
+        return sortedList;
+    }
+        
+    /**
+     * Find the highest energy cluster from the list.
+     * 
+     * @param clusters the list of clusters
+     * @return the highest energy cluster
+     */
+    public static Cluster findHighestEnergyCluster(final List<Cluster> clusters) {
+        if (clusters.isEmpty()) {
+            throw new IllegalArgumentException("The cluster list is empty.");
+        }
+        return sort(clusters, new ClusterEnergyComparator(), true, true).get(0);
+    }
 }

Modified: java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPClusterDriver.java
 =============================================================================
--- java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPClusterDriver.java	(original)
+++ java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPClusterDriver.java	Fri Jun 12 15:27:10 2015
@@ -23,7 +23,7 @@
     public GTPClusterDriver() {
         clusterer = ClustererFactory.create("GTPClusterer");
         gtp = (GTPClusterer) clusterer;
-        setWriteClusterCollection(false);
+        setWriteClusterCollection(true);
     }
     
     /**
@@ -36,7 +36,7 @@
      * false</code> that the symmetric window should be used.
      */
     @Deprecated
-    void setLimitClusterRange(boolean limitClusterRange) {
+    public void setLimitClusterRange(boolean limitClusterRange) {
         gtp.setLimitClusterRange(limitClusterRange);
     }
     
@@ -86,4 +86,14 @@
     public void setVerbose(boolean verbose) {
         gtp.setVerbose(verbose);
     }
+    
+    @Override
+    public void setWriteClusterCollection(boolean state) {
+    	// Set the flag as appropriate with the superclass.
+    	super.setWriteClusterCollection(state);
+    	
+    	// Also tell the clusterer whether it should persist its hit
+    	// collection or not.
+    	gtp.setWriteHitCollection(state);
+    }
 }

Modified: java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPClusterer.java
 =============================================================================
--- java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPClusterer.java	(original)
+++ java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPClusterer.java	Fri Jun 12 15:27:10 2015
@@ -2,6 +2,7 @@
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -33,7 +34,7 @@
  * @author Sho Uemura
  */
 public class GTPClusterer extends AbstractClusterer {
-        
+	
     /**
      * The minimum energy required for a hit to be considered as a
      * cluster center. Hits with energy less than this value will be
@@ -54,7 +55,7 @@
      * clustering.
      */
     private LinkedList<Map<Long, CalorimeterHit>> hitBuffer;
-
+    
     /**
      * Whether an asymmetric or symmetric window should be used for
      * adding hits to a cluster.
@@ -66,9 +67,19 @@
      */
     private boolean verbose = false;
     
+    /**
+     * Sets whether the clusterer should store the collection of hits
+     * that are part of clusters. This needs to be true if the clusters
+     * are to be written out to LCIO.
+     */
+    private boolean writeHitCollection = true;
+    
+    /**
+     * Instantiates the clusterer.
+     */
     GTPClusterer() {
         super(new String[] { "seedEnergyThreshold", "clusterWindow" }, new double[] { 0.00, 2.});
-    }    
+    }
     
     /**
      * Sets the clustering algorithm parameters.
@@ -276,20 +287,45 @@
         // Store each hit in a set by its cell ID so that it may be
         // easily acquired later.
         HashMap<Long, CalorimeterHit> hitMap = new HashMap<Long, CalorimeterHit>();
-        for (CalorimeterHit hit : hits) {
+        for(CalorimeterHit hit : hits) {
             hitMap.put(hit.getCellID(), hit);
         }
-
+        
         // Remove the last event from the hit buffer and add the new one.
         hitBuffer.removeLast();
         hitBuffer.addFirst(hitMap);
-
+        
         // Run the clustering algorithm on the buffer.
         List<Cluster> clusterList = getClusters();
-
+        
+        // The MC GTP algorithm collects hits from across events; to be
+        // stored in LCIO format properly, it needs to separately store
+        // its clusters' hits in a collection.
+        if(writeHitCollection) {
+        	// Create a set to store the hits so that each one may be
+        	// stored only once.
+	        Set<CalorimeterHit> hitSet = new HashSet<CalorimeterHit>();
+	        
+	        // Loop over all clusters and add their hits to the set.
+	        for(Cluster cluster : clusterList) {
+	        	for(CalorimeterHit hit : cluster.getCalorimeterHits()) {
+	        		hitSet.add(hit);
+	        	}
+	        }
+	        
+	        // Convert the set into a List object so that it can be stored
+	        // in LCIO.
+	        List<CalorimeterHit> clusterHits = new ArrayList<CalorimeterHit>(hitSet.size());
+	        clusterHits.addAll(hitSet);
+	        
+	        // Place the list of hits into the event stream.
+	        event.put("GTPHits", hits, CalorimeterHit.class, 0);
+        }
+        
+        // Return the clusters.
         return clusterList;
     }
-               
+    
     /**
      * Sets the number of clock cycles before and after a given cycle
      * that will be used when checking whether a given hit is a local
@@ -352,6 +388,17 @@
     }
     
     /**
+     * Sets whether the set of hits associated with an event's clusters
+     * should be written to the data stream and persisted in LCIO. This
+     * must be true if the clusters are to be persisted.
+     * @param state - <code>true</code> indicates that the hits will be
+     * persisted and <code>false</code> that they will not.
+     */
+    void setWriteHitCollection(boolean state) {
+    	writeHitCollection = state;
+    }
+    
+    /**
      * Indicates the type of cluster that is generated by this algorithm.
      * @return Returns the type of cluster as a <code>ClusterType</code>
      * object, specifically, <code>ClusterType.GTP</code>.
@@ -359,5 +406,5 @@
     @Override
     public ClusterType getClusterType() {
         return ClusterType.GTP;
-    }     
+    }
 }

Modified: java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/LegacyClusterer.java
 =============================================================================
--- java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/LegacyClusterer.java	(original)
+++ java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/LegacyClusterer.java	Fri Jun 12 15:27:10 2015
@@ -5,7 +5,6 @@
 import java.util.Map;
 import java.util.Set;
 
-import org.hps.recon.ecal.EcalUtils;
 import org.lcsim.event.CalorimeterHit;
 import org.lcsim.event.Cluster;
 import org.lcsim.event.EventHeader;

Modified: java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/triggerbank/SSPData.java
 =============================================================================
--- java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/triggerbank/SSPData.java	(original)
+++ java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/triggerbank/SSPData.java	Fri Jun 12 15:27:10 2015
@@ -197,22 +197,6 @@
     }
     
     /**
-     * Gets the list of triggers reported by the SSP.<br/>
-     * <br/>
-     * <b>Note:</b> This method is now deprecated. Singles triggers
-     * can be obtained with <code>getSinglesTriggers</code>, pair
-     * triggers with <code>getPairTriggers</code>, and cosmic triggers
-     * with <code>getCosmicTriggers</code>.
-     * @return Returns the triggers as a <code>List</code> collection
-     * of <code>SSPTrigger</code> objects. These can vary in which
-     * subclass they are, as appropriate to their type code.
-     */
-    @Deprecated
-    public List<SSPTrigger> getTriggers() {
-        return triggerList;
-    }
-    
-    /**
      * Gets the trigger time reported by the SSP.
      * @return Returns the trigger time as a <code>long</code>.
      */
@@ -223,99 +207,4 @@
      * @return Returns the event number as an <code>int</code>.
      */
     public int getEventNumber() { return eventNumber; }
-    
-    // TODO: Get information from Andrea on what this is for. It seems
-    //       to be something specialized. Maybe it should be placed in
-    //       the analysis driver in which it is used?
-    /**
-     * Gets the first singles trigger that occurred in either crate.
-     * If no singles triggered occurred, a value of <code>1025 * 4 =
-     * 4100</code> will be returned.
-     * @return Returns the time in nanoseconds of the earliest singles
-     * trigger that occurred, or <code>4100</code> if no singles trigger
-     * has occurred.
-     */
-    @Deprecated
-    public int getOrTrig() {
-        // Get the earliest time for both the top and bottom triggers.
-        int topTime = getTopTrig();
-        int bottomTime = getBotTrig();
-        
-        // Return whichever crate had the earliest trigger.
-        if (topTime <= bottomTime) { return topTime; }
-        else { return bottomTime; }
-    }
-    
-    // TODO: Get information from Andrea on what this is for. It seems
-    //       to be something specialized. Maybe it should be placed in
-    //       the analysis driver in which it is used?
-    /**
-     * Gets the first singles trigger that occurred in the top crate.
-     * If no singles triggered occurred, a value of <code>1025 * 4 =
-     * 4100</code> will be returned.
-     * @return Returns the time in nanoseconds of the earliest singles
-     * trigger that occurred, or <code>4100</code> if no singles trigger
-     * has occurred.
-     */
-    @Deprecated
-    public int getTopTrig() {
-        // Store the smallest found time. The time is a 10 bit value,
-        // so it must always be less than 1024. Multiply by 4 to convert
-        // from clock-cycles to nanoseconds.
-        int topTime = 1025 * 4;
-        
-        // Iterate over all triggers.
-        for(SSPTrigger trigger : triggerList) {
-            // Select only singles triggers from the top crate.
-            if(trigger instanceof SSPSinglesTrigger && ((SSPSinglesTrigger) trigger).isTop()) {
-                // Store the smallest trigger time found.
-                if(trigger.getTime() < topTime) {
-                    topTime = trigger.getTime();
-                }
-            }
-        }
-        
-        // Return the smallest found time.
-        return topTime;
-    }
-    
-    // TODO: Get information from Andrea on what this is for. It seems
-    //       to be something specialized. Maybe it should be placed in
-    //       the analysis driver in which it is used?
-    /**
-     * Gets the first singles trigger that occurred in the bottom crate.
-     * If no singles triggered occurred, a value of <code>1025 * 4 =
-     * 4100</code> will be returned.
-     * @return Returns the time in nanoseconds of the earliest singles
-     * trigger that occurred, or <code>4100</code> if no singles trigger
-     * has occurred.
-     */
-    @Deprecated
-    public int getBotTrig() {
-        // Store the smallest found time. The time is a 10 bit value,
-        // so it must always be less than 1024. Multiply by 4 to convert
-        // from clock-cycles to nanoseconds.
-        int bottomTime = 1025 * 4;
-        
-        // Iterate over all triggers.
-        for(SSPTrigger trigger : triggerList) {
-            // Select only singles triggers from the bottom crate.
-            if(trigger instanceof SSPSinglesTrigger && ((SSPSinglesTrigger) trigger).isBottom()) {
-                // Store the smallest trigger time found.
-                if(trigger.getTime() < bottomTime) {
-                    bottomTime = trigger.getTime();
-                }
-            }
-        }
-        
-        // Return the smallest found time.
-        return bottomTime;
-    }
-    
-    // TODO: This does not seem to do anything. Can it be deleted? It
-    //        is also not used anywhere.
-    @Deprecated
-    public int getAndTrig() {
-        return 0;
-    }
 }

Modified: java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/triggerbank/SSPSinglesTrigger.java
 =============================================================================
--- java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/triggerbank/SSPSinglesTrigger.java	(original)
+++ java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/triggerbank/SSPSinglesTrigger.java	Fri Jun 12 15:27:10 2015
@@ -25,17 +25,6 @@
                 time, data);
     }
     
-    /**
-     * Indicates whether the trigger was reported by the bottom SSP
-     * crate or not.
-     * @return Returns <code>true</code> if the trigger was reported
-     * by the bottom crate and <code>false</code> if it was reported
-     * by the top crate.
-     */
-    public boolean isBottom() {
-        return (type == SSPData.TRIG_TYPE_SINGLES0_BOT) || (type == SSPData.TRIG_TYPE_SINGLES1_BOT);
-    }
-    
     @Override
     public boolean isFirstTrigger() {
     	return (type == SSPData.TRIG_TYPE_SINGLES0_BOT) || (type == SSPData.TRIG_TYPE_SINGLES0_TOP);
@@ -44,17 +33,6 @@
     @Override
     public boolean isSecondTrigger() {
     	return (type == SSPData.TRIG_TYPE_SINGLES1_BOT) || (type == SSPData.TRIG_TYPE_SINGLES1_TOP);
-    }
-    
-    /**
-     * Indicates whether the trigger was reported by the top SSP
-     * crate or not.
-     * @return Returns <code>true</code> if the trigger was reported
-     * by the top crate and <code>false</code> if it was reported by
-     * the bottom crate.
-     */
-    public boolean isTop() {
-        return (type == SSPData.TRIG_TYPE_SINGLES0_TOP || type == SSPData.TRIG_TYPE_SINGLES1_TOP);
     }
     
     /**

Modified: java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/triggerbank/TestRunTriggerData.java
 =============================================================================
--- java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/triggerbank/TestRunTriggerData.java	(original)
+++ java/branches/HPSJAVA-488/ecal-recon/src/main/java/org/hps/recon/ecal/triggerbank/TestRunTriggerData.java	Fri Jun 12 15:27:10 2015
@@ -8,75 +8,72 @@
  * @version $Id: TriggerData.java,v 1.3 2012/08/03 23:14:39 meeg Exp $
  */
 public class TestRunTriggerData extends AbstractIntData {
-
+    
     public static final int BANK_TAG = 0xe106;
     public static final int BANK_SIZE = 8;
-
+    
     public static final int OR_TRIG = 3;
     public static final int TOP_TRIG = 4;
     public static final int BOT_TRIG = 5;
     public static final int AND_TRIG = 6;
     public static final int TIME = 7;
     public static final String TRIG_COLLECTION = "TriggerBank";
-
-//    protected TestRunTriggerData() {
-//        super(null);
-//    }
+    
     public TestRunTriggerData(int[] bank) {
         super(bank);
         decodeData();
     }
-
+    
     public TestRunTriggerData(GenericObject data) {
         super(data, BANK_TAG);
         decodeData();
     }
-
+    
     public long getTime() {
         return bank[TIME] & 0xffffffffL;
     }
-
+    
     public int getOrTrig() {
         return bank[OR_TRIG];
     }
-
+    
     public int getTopTrig() {
         return bank[TOP_TRIG];
     }
-
+    
     public int getBotTrig() {
         return bank[BOT_TRIG];
     }
-
+    
     public int getAndTrig() {
         return bank[AND_TRIG];
     }
-
+    
     public static long getTime(GenericObject object) {
         return AbstractIntData.getBankInt(object, TIME) & 0xffffffffL;
     }
-
+    
     public static int getOrTrig(GenericObject object) {
         return AbstractIntData.getBankInt(object, OR_TRIG);
     }
-
+    
     public static int getTopTrig(GenericObject object) {
         return AbstractIntData.getBankInt(object, TOP_TRIG);
     }
-
+    
     public static int getBotTrig(GenericObject object) {
         return AbstractIntData.getBankInt(object, BOT_TRIG);
     }
-
+    
     public static int getAndTrig(GenericObject object) {
         return AbstractIntData.getBankInt(object, AND_TRIG);
     }
-
+    
     @Override
     public int getTag() {
         return BANK_TAG;
     }
-
+    
     @Override
     protected final void decodeData() { //doesn't actually do anything since there is no decoding done on the ints
         if (this.bank.length != BANK_SIZE) {

Modified: java/branches/HPSJAVA-488/ecal-recon/src/test/java/org/hps/recon/ecal/cluster/ClustererTest.java
 =============================================================================
--- java/branches/HPSJAVA-488/ecal-recon/src/test/java/org/hps/recon/ecal/cluster/ClustererTest.java	(original)
+++ java/branches/HPSJAVA-488/ecal-recon/src/test/java/org/hps/recon/ecal/cluster/ClustererTest.java	Fri Jun 12 15:27:10 2015
@@ -58,7 +58,8 @@
         boolean checkPropCalc;
         boolean checkClusterPosition;
         boolean checkNullHits;
-        boolean checkHitPositions;        
+        boolean checkHitPositions;    
+        boolean checkHitTime;
         double[] cuts = null;
         ClusterType clusterType;
         String clustererName;
@@ -87,6 +88,11 @@
 
         ClustererTestConfig checkHitEnergy() {
             checkHitEnergy = true;
+            return this;
+        }
+        
+        ClustererTestConfig checkHitTime() {
+            checkHitTime = true;
             return this;
         }
 
@@ -148,7 +154,8 @@
             .checkHitEnergy()
             .checkClusterPosition()
             .checkNullHits()
-            .checkHitPositions());
+            .checkHitPositions()
+            .checkHitTime());
     }
 
     /**
@@ -162,7 +169,8 @@
             .checkHitEnergy()
             .checkClusterPosition()
             .checkNullHits()
-            .checkHitPositions());
+            .checkHitPositions()
+            .checkHitTime());
     }
 
     /**
@@ -175,7 +183,8 @@
             .checkHitEnergy()
             .checkClusterPosition()
             .checkHitPositions()
-            .checkNullHits());
+            .checkNullHits()
+            .checkHitTime());
     }
 
     /**
@@ -188,7 +197,8 @@
             .checkHitEnergy()
             .checkClusterPosition()
             .checkHitPositions()
-            .checkNullHits());
+            .checkNullHits()
+            .checkHitTime());
     }
 
     /**
@@ -352,8 +362,10 @@
                     if (config.checkHitEnergy) {    
                         assertTrue("Hit energy " + hit.getCorrectedEnergy() + " is <= 0.", hit.getCorrectedEnergy() > 0.);
                     }
-                    double time = hit.getTime();
-                    assertTrue("Hit time is invalid.", time != 0.);
+                    if (config.checkHitTime) {
+                        double time = hit.getTime();
+                        assertTrue("Hit time is invalid.", time != 0.);
+                    }                    
                 }
             }
         }

Modified: java/branches/HPSJAVA-488/evio/pom.xml
 =============================================================================
--- java/branches/HPSJAVA-488/evio/pom.xml	(original)
+++ java/branches/HPSJAVA-488/evio/pom.xml	Fri Jun 12 15:27:10 2015
@@ -8,7 +8,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>../parent/pom.xml</relativePath>
-        <version>3.3.1-SNAPSHOT</version>
+        <version>3.3.3-SNAPSHOT</version>
     </parent>
     <scm>
         <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/evio/</url>

Modified: java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/AbstractSvtEvioReader.java
 =============================================================================
--- java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/AbstractSvtEvioReader.java	(original)
+++ java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/AbstractSvtEvioReader.java	Fri Jun 12 15:27:10 2015
@@ -46,6 +46,9 @@
     protected Map<Pair<Integer /* FPGA */, Integer /* Hybrid */>,
                   HpsSiSensor /* Sensor */> daqPairToSensor 
                       = new HashMap<Pair<Integer, Integer>, HpsSiSensor>();
+    
+    // A collection of banks that should be processed after all hits have been made
+    protected List<BassStructure> eventBanks = new ArrayList<BassStructure>();
 
     // Flag indicating whether the DAQ map has been setup
     protected boolean isDaqMapSetup = false;
@@ -112,15 +115,14 @@
      */
     abstract protected HpsSiSensor getSensor(int[] data);
 
-
     /**
      *  Check whether a data bank is valid i.e. contains SVT samples only.
      * 
      *  @param dataBank - An EVIO bank containing integer data
      *  @return true if the bank is valid, false otherwise
      */
-    abstract protected boolean isValidDataBank(BaseStructure dataBank); 
-
+    abstract protected boolean isValidDataBank(BaseStructure dataBank);
+    
     /**
      * Check whether the samples are valid
      * 
@@ -151,6 +153,8 @@
      */
     public boolean makeHits(EvioEvent event, EventHeader lcsimEvent) {
 
+        logger.fine("Physics Event: " + event.toString());
+        
         // Retrieve the ROC banks encapsulated by the physics bank.  The ROC
         // bank range is set in the subclass.
         List<BassStructure> rocBanks = new ArrayList<BassStructure>();

Modified: java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/BasicEvioFileReader.java
 =============================================================================
--- java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/BasicEvioFileReader.java	(original)
+++ java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/BasicEvioFileReader.java	Fri Jun 12 15:27:10 2015
@@ -20,7 +20,7 @@
             throw new RuntimeException("File " + evioFileName + " does not exist.");
         }
         try {
-            org.jlab.coda.jevio.EvioReader reader = new org.jlab.coda.jevio.EvioReader(evioFile);
+            org.jlab.coda.jevio.EvioReader reader = new org.jlab.coda.jevio.EvioReader(evioFile,true,false);
             int eventN = 1;
             int badEvents = 0;
             fileLoop:

Modified: java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/EcalEvioReader.java
 =============================================================================
--- java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/EcalEvioReader.java	(original)
+++ java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/EcalEvioReader.java	Fri Jun 12 15:27:10 2015
@@ -39,6 +39,7 @@
  * @author Sho Uemura <[log in to unmask]>
  * @version $Id: ECalEvioReader.java,v 1.23 2013/04/18 20:59:16 meeg Exp $
  */
+// TODO: use a logger
 public class EcalEvioReader extends EvioReader {
     // Names of subdetectors.
 
@@ -259,7 +260,7 @@
                 }
 
                 if (id == null) {
-                    FADCGenericHit hit = makeGenericRawHit(EventConstants.ECAL_WINDOW_MODE, crate, slot, channel, cdata, nSamples);
+                    FADCGenericHit hit = makeGenericRawHit(EventConstants.ECAL_RAW_MODE, crate, slot, channel, cdata, nSamples);
                     processUnrecognizedChannel(hit);
                 } else {
                     BaseRawTrackerHit hit = makeECalRawHit(0, id, cdata, nSamples);

Modified: java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/EcalHitWriter.java
 =============================================================================
--- java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/EcalHitWriter.java	(original)
+++ java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/EcalHitWriter.java	Fri Jun 12 15:27:10 2015
@@ -69,7 +69,7 @@
 
     public void setMode(int mode) {
         this.mode = mode;
-        if (mode != EventConstants.ECAL_WINDOW_MODE && mode != EventConstants.ECAL_PULSE_MODE && mode != EventConstants.ECAL_PULSE_INTEGRAL_MODE) {
+        if (mode != EventConstants.ECAL_RAW_MODE && mode != EventConstants.ECAL_PULSE_MODE && mode != EventConstants.ECAL_PULSE_INTEGRAL_MODE) {
             throw new IllegalArgumentException("invalid mode " + mode);
         }
     }
@@ -77,7 +77,7 @@
     @Override
     public boolean hasData(EventHeader event) {
         switch (mode) {
-            case EventConstants.ECAL_WINDOW_MODE:
+            case EventConstants.ECAL_RAW_MODE:
                 return event.hasCollection(RawTrackerHit.class, hitCollectionName);
             case EventConstants.ECAL_PULSE_MODE:
                 return event.hasCollection(RawTrackerHit.class, hitCollectionName);
@@ -92,7 +92,7 @@
     public void writeData(EventHeader event, EventBuilder builder) {
         List<Object> hits = new ArrayList<Object>();
         switch (mode) {
-            case EventConstants.ECAL_WINDOW_MODE:
+            case EventConstants.ECAL_RAW_MODE:
                 hits.addAll(event.get(RawTrackerHit.class, hitCollectionName));
                 writeHits(hits, builder, mode);
                 break;
@@ -160,7 +160,7 @@
         }
 
         switch (mode) {
-            case EventConstants.ECAL_WINDOW_MODE:
+            case EventConstants.ECAL_RAW_MODE:
                 // Write the two collections for top and bottom hits to separate EVIO banks.
                 writeWindowHitCollection(topHits, topBank, builder);
                 writeWindowHitCollection(bottomHits, botBank, builder);
@@ -415,7 +415,7 @@
     public void writeData(EventHeader event, EventHeader toEvent) {
         String readoutName = ((org.lcsim.geometry.compact.Subdetector) subDetector).getReadout().getName();
         switch (mode) {
-            case EventConstants.ECAL_WINDOW_MODE:
+            case EventConstants.ECAL_RAW_MODE:
             case EventConstants.ECAL_PULSE_MODE:
                 List<RawTrackerHit> rawTrackerHits = event.get(RawTrackerHit.class, hitCollectionName);
                 if (verbosity >= 1) {

Modified: java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/EventConstants.java
 =============================================================================
--- java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/EventConstants.java	(original)
+++ java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/EventConstants.java	Fri Jun 12 15:27:10 2015
@@ -16,7 +16,7 @@
     public static final int SVT_BANK_NUMBER = 1;
     public static final int ECAL_BANK_NUMBER = 1;
     public static final int TRIGGER_BANK_NUMBER = 1;
-    public static final int ECAL_WINDOW_MODE = 1;
+    public static final int ECAL_RAW_MODE = 1;
     public static final int ECAL_PULSE_MODE = 2;
     public static final int ECAL_PULSE_INTEGRAL_MODE = 3; //FADC mode 3
     public static final int ECAL_PULSE_INTEGRAL_HIGHRESTDC_MODE = 4; //FADC mode 7

Modified: java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/EvioToLcio.java
 =============================================================================
--- java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/EvioToLcio.java	(original)
+++ java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/EvioToLcio.java	Fri Jun 12 15:27:10 2015
@@ -36,12 +36,13 @@
 import org.lcsim.conditions.ConditionsManager.ConditionsNotFoundException;
 import org.lcsim.event.EventHeader;
 import org.lcsim.lcio.LCIOWriter;
+import org.lcsim.util.log.DefaultLogFormatter;
 import org.lcsim.util.log.LogUtil;
 
 /**
  * <p>
- * This class converts EVIO to LCIO, performing an LCSim job in the same session. The processed
- * events are then (optionally) written to disk using an LCIOWriter.
+ * This class converts EVIO to LCIO, performing an LCSim job in the same session. The processed events are then (optionally) written to disk using an
+ * LCIOWriter.
  * <p>
  * To run this class from the command line:<br>
  * java -cp hps-distribution-bin.jar EvioToLcio [options] [evioFiles]
@@ -51,9 +52,8 @@
  * <p>
  * Extra arguments are treated as paths to EVIO files.
  * <p>
- * This class attempts to automatically configure itself for Test Run or Engineering Run based on
- * the run numbers in the EVIO file. It will use an appropriate default detector unless one is given
- * on the command line, and it will also use the correct event builder. It will not handle jobs
+ * This class attempts to automatically configure itself for Test Run or Engineering Run based on the run numbers in the EVIO file. It will use an
+ * appropriate default detector unless one is given on the command line, and it will also use the correct event builder. It will not handle jobs
  * correctly with files from both the Test and Engineering Run, so don't do this!
  * <p>
  * The conditions system can be initialized in one of three ways.<br/>
@@ -63,77 +63,183 @@
  * <li>run number from a header bank in an event</li>
  * </ol>
  * <p>
- * In the case where a file has no pre start event and there are header banks present, 
- * the "-m" command line option can be used to buffer a number of EVIO events.  If there is a
- * head bank found while adding these events to queue, the conditions system will be initialized
- * from it.
+ * In the case where a file has no pre start event and there are header banks present, the "-m" command line option can be used to buffer a number of
+ * EVIO events. If there is a head bank found while adding these events to queue, the conditions system will be initialized from it.
  *
  * @author Jeremy McCormick <[log in to unmask]>
  * @author Sho Uemura <[log in to unmask]>
  */
-// TODO: Logger should print tracebacks.  See Driver's setup for example of this.
 public class EvioToLcio {
 
-    // The default steering resource, which basically does nothing except print event numbers.
+    /**
+     * The default steering resource, which basically does nothing except print event numbers.
+     */
     private static final String DEFAULT_STEERING_RESOURCE = "/org/hps/steering/EventMarker.lcsim";
 
-    // The command line options which will be defined in the constructor.
-    Options options = null;
-
-    // The class's logger.
-    static Logger logger = LogUtil.create(EvioToLcio.class);
-    static {
-        logger.setLevel(Level.INFO);
+    /**
+     * Setup logging for this class.
+     */
+    private static Logger LOGGER = LogUtil.create(EvioToLcio.class, new DefaultLogFormatter(), Level.INFO);
+
+    /**
+     * Run the EVIO to LCIO converter from the command line.
+     *
+     * @param args The command line arguments.
+     */
+    public static void main(final String[] args) {
+        final EvioToLcio evioToLcio = new EvioToLcio();
+        evioToLcio.run(args);
     }
 
-    // The LCSim event builder used to convert from EVIO.
-    LCSimEventBuilder eventBuilder = null;
-
-    // The detector name for conditions.
-    String detectorName;
-
-    // The run number for conditions.
-    Integer runNumber = null;
-
-    /**
-     * The default constructor, which defines command line arguments and sets the log level.
+    /**
+     * The detector name for conditions.
+     */
+    private String detectorName;
+
+    /**
+     * The LCSim event builder used to convert from EVIO.
+     */
+    private LCSimEventBuilder eventBuilder = null;
+
+    /** 
+     * The command line options which will be defined in the constructor.
+     */
+    private Options options = null;
+
+    /**
+     * The run number for conditions.
+     */
+    private Integer runNumber = null;
+
+    /**
+     * The default constructor, which defines command line arguments and sets the default log level.
      */
     protected EvioToLcio() {
-        logger.config("initializing EVIO to LCIO converter");
+        LOGGER.config("initializing EVIO to LCIO converter ...");
         options = new Options();
-        options.addOption(new Option("d", true, "name of the detector to use for LCSim conditions (required)"));
+        options.addOption(new Option("d", true, "detector name (required)"));
         options.getOption("d").setRequired(true);
-        options.addOption(new Option("f", true, "path to a text file containing a list of EVIO files to process"));
-        options.addOption(new Option("L", true, "log level (INFO, FINE, FINEST, etc.)"));
-        options.addOption(new Option("x", true, "XML steeering file for processing LCIO events"));
+        options.addOption(new Option("f", true, "text file containing a list of EVIO files"));
+        options.addOption(new Option("L", true, "log level (INFO, FINE, etc.)"));
+        options.addOption(new Option("x", true, "LCSim steeering file for processing the LCIO events"));
         options.addOption(new Option("r", false, "interpret steering from -x argument as a resource instead of a file"));
-        options.addOption(new Option("D", true, "pass a variable to the steering file with format -Dname=value"));
+        options.addOption(new Option("D", true, "define a steering file variable with format -Dname=value"));
         options.addOption(new Option("l", true, "path of output LCIO file"));
         options.addOption(new Option("R", true, "fixed run number which will override run numbers of input files"));
         options.addOption(new Option("n", true, "maximum number of events to process in the job"));
-        options.addOption(new Option("b", false, "enable headless mode which will not show plots OR allow writing them to graphics files"));
+        options.addOption(new Option("b", false, "enable headless mode in which plots will not show"));
         options.addOption(new Option("v", false, "print EVIO XML for each event"));
         options.addOption(new Option("m", true, "set the max event buffer size"));
-        options.addOption(new Option("t", true, "specify a conditions system tag to use"));
-        logger.setLevel(Level.FINE);
+        options.addOption(new Option("t", true, "specify a conditions tag to use"));
+        options.addOption(new Option("M", false, "use memory mapping instead of sequential reading"));
     }
 
     /**
-     * Run the EVIO to LCIO converter from the command line.
+     * Buffer up to <code>maxBufferSize</code> events in the <code>eventQueue</code>. This method will also initialize the conditions system using a
+     * run number if a header bank is found.
+     *
+     * @param reader the EVIO reader
+     * @param eventQueue the event queue
+     * @param maxBufferSize the maximum number of records to buffer
+     */
+    private void bufferEvents(final EvioReader reader, final EvioEventQueue eventQueue, final int maxBufferSize) {
+        EvioEvent evioEvent = null;
+        while (eventQueue.size() < maxBufferSize) {
+            try {
+                // Read the next event.
+                evioEvent = reader.nextEvent();
+
+                if (evioEvent == null) { // This catches an end of file or bad event.
+                    break;
+                }
+
+                // Add the event to the queue.
+                eventQueue.addRecord(evioEvent);
+
+            } catch (IOException | EvioException e) {
+                LOGGER.log(Level.SEVERE, e.getMessage(), e);
+            }
+
+            if (evioEvent != null) {
+
+                // Parse the event.
+                try {
+                    reader.parseEvent(evioEvent);
+                } catch (final EvioException e) {
+                    LOGGER.log(Level.SEVERE, e.getMessage(), e);
+                    continue;
+                }
+
+                // Is conditions system not frozen?
+                if (!DatabaseConditionsManager.getInstance().isFrozen()) {
+
+                    // Get head bank from event.
+                    final BaseStructure headBank = EvioEventUtilities.getHeadBank(evioEvent);
+
+                    // Is head bank available in this event?
+                    if (headBank != null) {
+
+                        // Get the run number from the head bank.
+                        runNumber = headBank.getIntData()[1];
+                        LOGGER.finer("got head bank with run number " + runNumber);
+
+                        // Check if the conditions system needs to be updated from the head bank.
+                        this.checkConditions(runNumber, false);
+                        
+                    } else {
+                        LOGGER.finest("event " + evioEvent.getEventNumber() + " does not have a head bank");
+                    }
+                }
+            }
+        }
+        LOGGER.finer("buffered " + eventQueue.size() + " events");
+    }
+
+    /**
+     * Check if the conditions system and event builder need to be initialized or updated given a run number.
+     *
+     * @param runNumber The run number.
+     * @param freeze True to freeze conditions system after it is setup.
+     */
+    private void checkConditions(final int runNumber, final boolean freeze) {
+
+        // Is the event builder uninitialized?
+        if (eventBuilder == null) {
+            // Setup event builder.
+            this.setupEventBuilder(runNumber);
+        }
+
+        // Update the conditions system with the new run number.
+        try {
+            // This call may be ignored by the conditions system if the run number is not new.
+            ConditionsManager.defaultInstance().setDetector(detectorName, runNumber);
+        } catch (final ConditionsNotFoundException e) {
+            throw new RuntimeException("Error initializing conditions system.", e);
+        }
+
+        if (freeze) {
+            // Freeze the conditions system so subsequent run numbers are ignored.
+            DatabaseConditionsManager.getInstance().freeze();
+        }
+    }
+
+    /**
+     * Print the CLI usage and exit.
+     */
+    private void printUsage() {
+        System.out.println("EvioToLcio [options] [evioFiles]");
+        final HelpFormatter help = new HelpFormatter();
+        help.printHelp(" ", options);
+        System.exit(1);
+    }
+
+    /**
+     * This method will execute the EVIO to LCIO conversion and optionally process the events with LCSim Drivers from a steering file. Then the
+     * resultant LCIO events will be written to disk if this option is enabled in the command line arguments.
+     *
      * @param args The command line arguments.
      */
-    public static void main(String[] args) {
-        EvioToLcio evioToLcio = new EvioToLcio();
-        evioToLcio.run(args);
-    }
-
-    /**
-     * This method will execute the EVIO to LCIO conversion and optionally process the events with
-     * LCSim Drivers from a steering file. Then the resultant LCIO events will be written to disk if
-     * this option is enabled in the command line arguments.
-     * @param args The command line arguments.
-     */
-    public void run(String[] args) {
+    public void run(final String[] args) {
 
         int maxEvents = -1;
         int nEvents = 0;
@@ -141,47 +247,47 @@
 
         // Parse the command line options.
         if (args.length == 0) {
-            printUsage();
-        }
-        CommandLineParser parser = new PosixParser();
+            this.printUsage();
+        }
+        final CommandLineParser parser = new PosixParser();
         CommandLine cl = null;
         try {
             cl = parser.parse(options, args);
-        } catch (ParseException e) {
+        } catch (final ParseException e) {
             throw new RuntimeException("Problem parsing command line options.", e);
         }
 
         // Set the log level.
         if (cl.hasOption("L")) {
-            Level level = Level.parse(cl.getOptionValue("L").toUpperCase());
-            
+            final Level level = Level.parse(cl.getOptionValue("L").toUpperCase());
+
             // Set log level on this class.
-            logger.config("setting log level to " + level);
-            logger.setLevel(level);
-            
+            LOGGER.config("setting log level to " + level);
+            LOGGER.setLevel(level);
+
             // Set log level on conditions manager.
             DatabaseConditionsManager.getInstance().setLogLevel(level);
         }
 
         // Add all extra arguments to the EVIO file list.
-        List<String> evioFileList = new ArrayList<String>(Arrays.asList(cl.getArgs()));
+        final List<String> evioFileList = new ArrayList<String>(Arrays.asList(cl.getArgs()));
 
         // Process text file containing list of EVIO file paths, one per line.
         if (cl.hasOption("f")) {
             // Add additional EVIO files to process from text file.
-            File file = new File(cl.getOptionValue("f"));
+            final File file = new File(cl.getOptionValue("f"));
             if (!file.exists()) {
                 throw new RuntimeException("The file " + file.getPath() + " does not exist.");
             }
-            Path filePath = file.toPath();
+            final Path filePath = file.toPath();
             List<String> lines = null;
             try {
                 lines = Files.readAllLines(filePath, Charset.defaultCharset());
-            } catch (IOException e) {
+            } catch (final IOException e) {
                 throw new RuntimeException(e);
             }
-            for (String line : lines) {
-                File evioFile = new File(line);
+            for (final String line : lines) {
+                final File evioFile = new File(line);
                 if (evioFile.exists()) {
                     evioFileList.add(evioFile.getPath());
                 } else {
@@ -193,8 +299,8 @@
         // Is the EVIO file list empty?
         if (evioFileList.isEmpty()) {
             // There weren't any EVIO files provided on the command line so exit.
-            logger.severe("No EVIO files were provided with command line arguments or -f option.");
-            printUsage();
+            LOGGER.severe("No EVIO files were provided with command line arguments or -f option.");
+            this.printUsage();
         }
 
         String lcioFileName = null;
@@ -203,26 +309,27 @@
 
         // Get the LCIO output file.
         if (cl.hasOption("l")) {
-            logger.config("set LCIO file to " + lcioFileName);
+            LOGGER.config("set LCIO file to " + lcioFileName);
             lcioFileName = cl.getOptionValue("l");
         }
 
         // Get the steering file or resource for the LCSim job.
         if (cl.hasOption("x")) {
-            String lcsimXmlName = cl.getOptionValue("x");
+            final String lcsimXmlName = cl.getOptionValue("x");
             if (cl.hasOption("r")) {
                 steeringStream = EvioToLcio.class.getResourceAsStream(lcsimXmlName);
                 if (steeringStream == null) {
-                    logger.severe("LCSim steering resource " + lcsimXmlName + " was not found.");
-                    throw new IllegalArgumentException("XML steering resource was not found.");
-                }
-                logger.config("using steering resource " + lcsimXmlName);
+                    IllegalArgumentException e = new IllegalArgumentException("XML steering resource was not found.");
+                    LOGGER.log(Level.SEVERE, "LCSim steering resource " + lcsimXmlName + " was not found.", e);
+                    throw e;
+                }
+                LOGGER.config("using steering resource " + lcsimXmlName);
             } else {
                 try {
                     steeringStream = new FileInputStream(lcsimXmlName);
-                    logger.config("using steering file " + lcsimXmlName);
-                } catch (FileNotFoundException e) {
-                    logger.severe("The XML steering file " + lcsimXmlName + " does not exist.");
+                    LOGGER.config("using steering file " + lcsimXmlName);
+                } catch (final FileNotFoundException e) {
+                    LOGGER.severe("The XML steering file " + lcsimXmlName + " does not exist.");
                     throw new IllegalArgumentException("Steering file does not exist.", e);
                 }
             }
@@ -231,7 +338,7 @@
         // Setup the default steering which just prints event numbers.
         if (steeringStream == null) {
             steeringStream = EvioToLcio.class.getResourceAsStream(DEFAULT_STEERING_RESOURCE);
-            logger.config("using default steering resource " + DEFAULT_STEERING_RESOURCE);
+            LOGGER.config("using default steering resource " + DEFAULT_STEERING_RESOURCE);
         }
 
         // Get the max number of events to process.
@@ -240,52 +347,53 @@
             if (maxEvents <= 0) {
                 throw new IllegalArgumentException("Value of -n option is invalid: " + maxEvents);
             }
-            logger.config("set max events to " + maxEvents);
+            LOGGER.config("set max events to " + maxEvents);
         }
 
         // Setup the LCIO writer.
         if (lcioFileName != null) {
             try {
-                writer = new LCIOWriter(new File(lcioFileName));
-                logger.config("initialized LCIO writer with file " + lcioFileName);
-            } catch (IOException e) {
-                logger.severe("Problem initializing the LCIO writer.");
+                writer = new LCIOWriter(lcioFileName);
+                LOGGER.config("initialized LCIO writer with file " + lcioFileName);
+            } catch (final IOException e) {
+                LOGGER.severe("Problem initializing the LCIO writer.");
                 throw new RuntimeException(e);
             }
         }
 
         // Process the LCSim job variable definitions, if any.
-        JobManager jobManager = new JobManager();
+        final JobManager jobManager = new JobManager();
         if (cl.hasOption("D")) {
-            String[] steeringOptions = cl.getOptionValues("D");
-            for (String def : steeringOptions) {
-                String[] s = def.split("=");
+            final String[] steeringOptions = cl.getOptionValues("D");
+            for (final String def : steeringOptions) {
+                final String[] s = def.split("=");
                 if (s.length != 2) {
-                    logger.severe("bad variable format: " + def);
-                    throw new IllegalArgumentException("Bad variable format: " + def);
-                }
-                String key = s[0];
-                String value = s[1];
+                    IllegalArgumentException e = new IllegalArgumentException("Bad variable format: " + def);
+                    LOGGER.log(Level.SEVERE, "bad variable format: " + def, e);
+                    throw e;
+                }
+                final String key = s[0];
+                final String value = s[1];
                 jobManager.addVariableDefinition(key, value);
-                logger.config("set steering variable: " + key + "=" + value);
+                LOGGER.config("set steering variable: " + key + "=" + value);
             }
         }
 
         // Enable headless mode so no plots are shown.
         if (cl.hasOption("b")) {
-            logger.config("Headless mode is enabled.  No plots will be shown.");
+            LOGGER.config("Headless mode is enabled.  No plots will be shown.");
             jobManager.enableHeadlessMode();
         }
 
         // Configure the LCSim job manager.
         jobManager.setup(steeringStream);
         jobManager.configure();
-        logger.config("LCSim job manager was successfully configured.");
+        LOGGER.config("LCSim job manager was successfully configured.");
 
         // Get the user specified detector name.
         if (cl.hasOption("d")) {
             detectorName = cl.getOptionValue("d");
-            logger.config("User set detector to " + detectorName + " with command option.");
+            LOGGER.config("User set detector to " + detectorName + " with command option.");
         } else {
             throw new RuntimeException("Missing -d argument with name of detector.");
         }
@@ -293,30 +401,30 @@
         // Get the user specified run number.
         if (cl.hasOption("R")) {
             runNumber = Integer.parseInt(cl.getOptionValue("R"));
-            logger.config("User set run number to " + runNumber + " with command option.");
-        }
-        
+            LOGGER.config("User set run number to " + runNumber + " with command option.");
+        }
+
         // Set the conditions system tag.
         if (cl.hasOption("t")) {
-            String tag = cl.getOptionValue("t");
+            final String tag = cl.getOptionValue("t");
             DatabaseConditionsManager.getInstance().setTag(tag);
         }
 
         // Is there a run number from the command line options?
         if (runNumber != null) {
             // Initialize the conditions system before the job starts and freeze it.
-            checkConditions(runNumber, true);
+            this.checkConditions(runNumber, true);
         }
 
         // Print out the EVIO file list before the job starts.
-        StringBuffer buff = new StringBuffer();
+        final StringBuffer buff = new StringBuffer();
         buff.append("The job will include the following EVIO files ...");
         buff.append('\n');
-        for (String evioFileName : evioFileList) {            
+        for (final String evioFileName : evioFileList) {
             buff.append(evioFileName);
             buff.append('\n');
         }
-        logger.config(buff.toString());
+        LOGGER.config(buff.toString());
 
         // Get whether to debug print XML from the EVIO events.
         boolean printXml = false;
@@ -331,19 +439,19 @@
 
         // Loop over the input EVIO files.
         EvioReader reader = null;
-        fileLoop: for (String evioFileName : evioFileList) {
+        fileLoop: for (final String evioFileName : evioFileList) {
 
             // Get the next EVIO input file.
-            File evioFile = new File(evioFileName);
+            final File evioFile = new File(evioFileName);
             if (!evioFile.exists()) {
                 throw new RuntimeException("EVIO file " + evioFile.getPath() + " does not exist.");
             }
-            logger.info("Opening EVIO file " + evioFileName + " ...");
+            LOGGER.info("Opening EVIO file " + evioFileName + " ...");
 
             // Open the EVIO reader.
             try {
-                reader = new EvioReader(evioFile);
-            } catch (Exception e) {
+                reader = new EvioReader(evioFile, false, !cl.hasOption("M"));
+            } catch (final Exception e) {
                 throw new RuntimeException("Error opening the EVIO file reader.", e);
             }
 
@@ -351,11 +459,11 @@
             long eventTime = 0; // in ms
 
             // Loop over events.
-            EvioEventQueue eventQueue = new EvioEventQueue(-1L, maxBufferSize);
+            final EvioEventQueue eventQueue = new EvioEventQueue(-1L, maxBufferSize);
             eventLoop: for (;;) {
 
                 // Buffer the EVIO events into the queue.
-                bufferEvents(reader, eventQueue, maxBufferSize);
+                this.bufferEvents(reader, eventQueue, maxBufferSize);
 
                 // Is the event queue empty?
                 if (eventQueue.size() == 0) {
@@ -370,70 +478,68 @@
                     EvioEvent evioEvent = null;
                     try {
                         eventQueue.next();
-                        evioEvent = (EvioEvent) eventQueue.getCurrentRecord();         
+                        evioEvent = (EvioEvent) eventQueue.getCurrentRecord();
                         // The parseEvent method does not need to be called here.
                         // The events were already parsed when buffering.
                         if (evioEvent == null) {
-                            new RuntimeException().printStackTrace();
+                            new RuntimeException("Failed to read EVIO event.").printStackTrace();
                             continue recordLoop;
                         }
-                    } catch (IOException e) {
-                        // This means the EVIO event has bad data.  
-                        logger.severe(e.getMessage());
-                        e.printStackTrace();
+                    } catch (final IOException e) {
+                        // This means the EVIO event has bad data.
+                        LOGGER.log(Level.SEVERE, e.getMessage(), e);
                         continue recordLoop;
-                    } catch (NoSuchRecordException e) {
+                    } catch (final NoSuchRecordException e) {
                         // This means the queue does not have any more events.
                         // We checked hasNext() already so it should not happen.
-                        logger.severe(e.getMessage());
-                        e.printStackTrace();
+                        LOGGER.log(Level.SEVERE, e.getMessage(), e);
                         break recordLoop;
                     }
-                    
+
                     // Print out event XML if enabled.
                     if (printXml) {
-                        logger.info(evioEvent.toXML());
+                        LOGGER.info(evioEvent.toXML());
                     }
 
                     // Is this a pre start event?
                     if (EvioEventUtilities.isPreStartEvent(evioEvent)) {
 
                         // Get the pre start event's data bank.
-                        int[] data = EvioEventUtilities.getControlEventData(evioEvent);
+                        final int[] data = EvioEventUtilities.getControlEventData(evioEvent);
 
                         if (data == null) {
                             // This should never happen but just ignore it.
-                            logger.severe("Pre start event is missing a data bank.");
+                            LOGGER.severe("Pre start event is missing a data bank.");
                         } else {
                             // Check if conditions system needs to be updated from the pre start data.
-                            checkConditions(data[1], false);                        
+                            this.checkConditions(data[1], false);
                         }
-                    } 
+                    }
 
                     // Is this an end event?
                     if (EvioEventUtilities.isEndEvent(evioEvent)) {
-                        int[] data = EvioEventUtilities.getControlEventData(evioEvent);
+                        final int[] data = EvioEventUtilities.getControlEventData(evioEvent);
                         if (data == null) {
                             // This should never happen but just ignore it.
-                            logger.severe("The end event is missing a data bank.");
+                            LOGGER.severe("The end event is missing a data bank.");
                         } else {
-                            int seconds = data[0];
-                            int totalEvents = data[2];
-                            logger.info("EVIO end event with " + totalEvents + " events and " + seconds + " seconds");
+                            final int seconds = data[0];
+                            final int totalEvents = data[2];
+                            LOGGER.info("EVIO end event with " + totalEvents + " events and " + seconds + " seconds");
                         }
-                    } 
+                    }
 
                     // Setup state in the LCSimEventBuilder based on the EVIO control event.
                     if (eventBuilder != null) {
                         eventBuilder.readEvioEvent(evioEvent);
-                    } 
+                    }
 
                     // Is this a physics event?
                     if (EvioEventUtilities.isPhysicsEvent(evioEvent)) {
 
                         // Print physics event number, which is actually a sequence number from
                         // the reader, not the actual event number from the data.
-                        logger.finest("physics event seq #" + evioEvent.getEventNumber());
+                        LOGGER.finest("physics event " + evioEvent.getEventNumber());
 
                         // Is the event builder initialized?
                         if (eventBuilder == null) {
@@ -441,64 +547,64 @@
                             throw new RuntimeException("The LCSimEventBuilder was never initialized.");
                         }
 
-                        // Build the LCIO event.                        
-                        EventHeader lcioEvent = eventBuilder.makeLCSimEvent(evioEvent);
-                        eventTime = (lcioEvent.getTimeStamp() / 1000000);                           
-                        logger.finest("created LCIO event #" + lcioEvent.getEventNumber() + " with time " + new Date(eventTime));
+                        // Build the LCIO event.
+                        final EventHeader lcioEvent = eventBuilder.makeLCSimEvent(evioEvent);
+                        eventTime = lcioEvent.getTimeStamp() / 1000000;
+                        LOGGER.finest("created LCIO event " + lcioEvent.getEventNumber() + " with time " + new Date(eventTime));
                         if (firstEvent) {
-                            logger.info("first physics event time: " + eventTime / 1000 + " - " + new Date(eventTime));
+                            LOGGER.info("first physics event time: " + eventTime / 1000 + " - " + new Date(eventTime));
                             firstEvent = false;
                         }
 
                         // Activate Driver process methods.
-                        logger.finest("jobManager processing event " + lcioEvent.getEventNumber());
+                        LOGGER.finest("jobManager processing event " + lcioEvent.getEventNumber());
                         jobManager.processEvent(lcioEvent);
 
                         // Write out this LCIO event.
                         if (writer != null) {
-                            try {
+                            try {                                
                                 writer.write(lcioEvent);
                                 writer.flush();
-                            } catch (IOException e) {
+                                LOGGER.finest("wrote LCSim event " + lcioEvent.getEventNumber());
+                            } catch (final IOException e) {
                                 throw new RuntimeException("Error writing LCIO file.", e);
                             }
-                            logger.finest("wrote event #" + lcioEvent.getEventNumber());
+                            LOGGER.finest("wrote event #" + lcioEvent.getEventNumber());
                         }
 
                         // Increment number of events processed.
-                        nEvents++;                        
+                        nEvents++;
 
                         // Check if max events was reached and end job if this is true.
                         if (maxEvents != -1 && nEvents >= maxEvents) {
-                            logger.info("maxEvents " + maxEvents + " was reached");
+                            LOGGER.info("maxEvents " + maxEvents + " was reached");
                             break fileLoop;
                         }
                     }
                 }
             } // eventLoop
-            logger.info("Last physics event time: " + eventTime / 1000 + " - " + new Date(eventTime));
+            LOGGER.info("Last physics event time: " + eventTime / 1000 + " - " + new Date(eventTime));
 
             // Close the EVIO reader.
             try {
                 reader.close();
-                logger.fine("EVIO reader closed.");
-            } catch (IOException e) {
-                logger.warning(e.getMessage());
+                LOGGER.fine("EVIO reader closed.");
+            } catch (final IOException e) {
+                LOGGER.warning(e.getMessage());
                 e.printStackTrace();
             }
         } // fileLoop
-        
+
         // If the processing stopped because of max events then need to cleanup the reader.
         if (reader != null) {
             if (!reader.isClosed()) {
                 // Close the EVIO reader.
                 try {
                     reader.close();
-                    logger.fine("EVIO reader closed.");
-                } catch (IOException e) {
-                    logger.warning(e.getMessage());
-                    e.printStackTrace();
-                }   
+                    LOGGER.fine("EVIO reader closed.");
+                } catch (final IOException e) {
+                    LOGGER.log(Level.WARNING, e.getMessage(), e);
+                }
             }
         }
 
@@ -509,139 +615,35 @@
         if (writer != null) {
             try {
                 writer.close();
-                logger.info("LCIO output writer closed okay.");
-            } catch (IOException e) {
+                LOGGER.info("LCIO output writer closed okay.");
+            } catch (final IOException e) {
                 e.printStackTrace();
-                logger.warning(e.getMessage());
-            }
-        }
-
-        logger.info("Job finished successfully!");
+                LOGGER.warning(e.getMessage());
+            }
+        }
+
+        LOGGER.info("Job finished successfully!");
     }
 
     /**
-     * Buffer up to <code>maxBufferSize</code> events in the <code>eventQueue</code>.
-     * This method will also initialize the conditions system using a run number
-     * if a header bank is found.
-     * @param reader The EVIO reader.
-     * @param eventQueue The event queue.
-     * @param maxBufferSize The maximum number of records to buffer.
-     */
-    private void bufferEvents(EvioReader reader, EvioEventQueue eventQueue, int maxBufferSize) {
-        EvioEvent evioEvent = null;
-        while (eventQueue.size() < maxBufferSize) {
-            try {
-                // Break if no more events from reader.
-                if (reader.getNumEventsRemaining() == 0) {
-                    break;
-                }
-
-                // Read the next event.
-                evioEvent = reader.nextEvent();
-
-                if (evioEvent == null) {
-                    break;
-                }
-
-                // Add the event to the queue.
-                eventQueue.addRecord(evioEvent); 
-
-            } catch (IOException | EvioException e) {
-                logger.severe(e.getMessage());
-                e.printStackTrace();
-            }
-
-            if (evioEvent != null) {
-                
-                // Parse the event.
-                try {
-                    reader.parseEvent(evioEvent);
-                } catch (EvioException e) {
-                    logger.severe(e.getMessage());
-                    e.printStackTrace();
-                    continue;
-                }
-
-                // Is conditions system not frozen?
-                if (!DatabaseConditionsManager.getInstance().isFrozen()) {
-                
-                    // Get head bank from event.
-                    BaseStructure headBank = EvioEventUtilities.getHeadBank(evioEvent);
-                
-                    // Is head bank available in this event?
-                    if (headBank != null) { 
-                                        
-                        // Get the run number from the head bank.
-                        runNumber = headBank.getIntData()[1];                    
-                        logger.finer("got head bank with run number " + runNumber);
-
-                        // Check if the conditions system needs to be updated from the head bank.
-                        checkConditions(runNumber, false);                    
-                    } else {
-                        logger.finest("event " + evioEvent.getEventNumber() + " does not have a head bank");
-                    }
-                }
-            } 
-        }
-        logger.finer("buffered " + eventQueue.size() + " events");
-    }
-
-    /**
-     * Print the CLI usage and exit.
-     */
-    private void printUsage() {
-        System.out.println("EvioToLcio [options] [evioFiles]");
-        HelpFormatter help = new HelpFormatter();
-        help.printHelp(" ", options);
-        System.exit(1);
-    }
-
-    /**
      * Setup the LCSimEventBuilder based on the current detector name and run number.
+     *
      * @param detectorName The detector name to be assigned to the event builder.
      * @param runNumber The run number which determines which event builder to use.
      * @return The LCSimEventBuilder for the Test Run or Engineering Run.
      */
-    private void setupEventBuilder(int runNumber) {
+    private void setupEventBuilder(final int runNumber) {
         // Is this run number from the Test Run?
         if (DatabaseConditionsManager.isTestRun(runNumber)) {
             // Configure conditions system for Test Run.
-            logger.info("using Test Run event builder");
+            LOGGER.info("using Test Run event builder");
             eventBuilder = new LCSimTestRunEventBuilder();
         } else {
             // Configure conditions system for Eng Run or default.
-            logger.info("using Eng Run event builder");
+            LOGGER.info("using Eng Run event builder");
             eventBuilder = new LCSimEngRunEventBuilder();
         }
-        ConditionsManager conditions = ConditionsManager.defaultInstance();
-        conditions.addConditionsListener(eventBuilder);        
-    }
-    
-    /**
-     * Check if the conditions system and event builder need to be initialized 
-     * or updated given a run number.
-     * @param runNumber The run number.
-     * @param freeze True to freeze conditions system after it is setup.
-     */
-    private void checkConditions(int runNumber, boolean freeze) {
-                        
-        // Is the event builder uninitialized?
-        if (eventBuilder == null) {
-            // Setup event builder.
-            setupEventBuilder(runNumber);
-        }
-                
-        // Update the conditions system with the new run number.       
-        try {
-            // This call may be ignored by the conditions system if the run number is not new.
-            ConditionsManager.defaultInstance().setDetector(detectorName, runNumber);
-        } catch (ConditionsNotFoundException e) {
-            throw new RuntimeException("Error initializing conditions system.", e);
-        }     
-        
-        if (freeze) {
-            // Freeze the conditions system so subsequent run numbers are ignored.
-            DatabaseConditionsManager.getInstance().freeze();
-        }
+        final ConditionsManager conditions = ConditionsManager.defaultInstance();
+        conditions.addConditionsListener(eventBuilder);
     }
 }

Modified: java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/LCSimEngRunEventBuilder.java
 =============================================================================
--- java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/LCSimEngRunEventBuilder.java	(original)
+++ java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/LCSimEngRunEventBuilder.java	Fri Jun 12 15:27:10 2015
@@ -7,39 +7,39 @@
 
 import org.hps.recon.ecal.triggerbank.AbstractIntData;
 import org.hps.recon.ecal.triggerbank.SSPData;
+import org.hps.recon.ecal.triggerbank.TDCData;
 import org.hps.recon.ecal.triggerbank.TIData;
-import org.hps.recon.ecal.triggerbank.TDCData;
+import org.hps.record.epics.EpicsData;
 import org.hps.record.epics.EpicsEvioProcessor;
-import org.hps.record.epics.EpicsScalarData;
 import org.hps.record.evio.EvioEventUtilities;
-import org.hps.record.scalars.ScalarData;
-import org.hps.record.scalars.ScalarsEvioProcessor;
+import org.hps.record.scalers.ScalersEvioProcessor;
 import org.jlab.coda.jevio.EvioEvent;
 import org.lcsim.event.EventHeader;
+import org.lcsim.util.log.DefaultLogFormatter;
+import org.lcsim.util.log.LogUtil;
 
 /**
- * This is the {@link org.hps.record.LCSimEventBuilder} implementation for the
- * Engineering Run and the Commissioning Run.
+ * This is the {@link org.hps.record.LCSimEventBuilder} implementation for the Engineering Run and the Commissioning Run.
  * <p>
- * It has several modifications from the Test Run builder including different
- * values for certain bank tags.
+ * It has several modifications from the Test Run builder including different values for certain bank tags.
  * <p>
- * Additionally, this builder will write DAQ config information, EPICS control
- * data, and scalar bank data into the output LCSim events if these banks are
- * present in the EVIO data.
+ * Additionally, this builder will write DAQ config information, EPICS control data, and scalar bank data into the output LCSim events if these banks
+ * are present in the EVIO data.
  *
  * @author Sho Uemura <[log in to unmask]>
  * @author Jeremy McCormick <[log in to unmask]>
  */
 public class LCSimEngRunEventBuilder extends LCSimTestRunEventBuilder {
 
-    TriggerConfigEvioReader triggerConfigReader = null;
+    private static final Logger LOGGER = LogUtil.create(LCSimEngRunEventBuilder.class, new DefaultLogFormatter(), Level.INFO);
 
-    EpicsEvioProcessor epicsProcessor = new EpicsEvioProcessor();
-    EpicsScalarData epicsData;
+    private EpicsData epicsData;
 
-    ScalarsEvioProcessor scalarProcessor = new ScalarsEvioProcessor();
-    ScalarData scalarData;
+    private final EpicsEvioProcessor epicsProcessor = new EpicsEvioProcessor();
+
+    private final ScalersEvioProcessor scalerProcessor = new ScalersEvioProcessor();
+
+    private TriggerConfigEvioReader triggerConfigReader = null;
 
     public LCSimEngRunEventBuilder() {
         ecalReader.setTopBankTag(0x25);
@@ -49,18 +49,28 @@
         sspCrateBankTag = 0x2E; // A.C. modification after Sergey's confirmation
         sspBankTag = 0xe10c;
         intBanks = new ArrayList<IntBankDefinition>();
-        intBanks.add(new IntBankDefinition(SSPData.class, new int[]{sspCrateBankTag, sspBankTag}));
-        intBanks.add(new IntBankDefinition(TIData.class, new int[]{sspCrateBankTag, 0xe10a}));
-        intBanks.add(new IntBankDefinition(TDCData.class, new int[]{0x3a, 0xe107}));
+        intBanks.add(new IntBankDefinition(SSPData.class, new int[] {sspCrateBankTag, sspBankTag}));
+        intBanks.add(new IntBankDefinition(TIData.class, new int[] {sspCrateBankTag, 0xe10a}));
+        intBanks.add(new IntBankDefinition(TDCData.class, new int[] {0x3a, 0xe107}));
         // ecalReader = new ECalEvioReader(0x25, 0x27);
         triggerConfigReader = new TriggerConfigEvioReader();
     }
 
+    /**
+     * Create and cache an {@link org.hps.record.epics.EpicsData} object.
+     *
+     * @param evioEvent The EVIO event data.
+     */
+    void createEpicsData(final EvioEvent evioEvent) {
+        epicsProcessor.process(evioEvent);
+        epicsData = epicsProcessor.getEpicsData();
+    }
+
     @Override
-    protected long getTime(List<AbstractIntData> triggerList) {
-        for (AbstractIntData data : triggerList) {
+    protected long getTime(final List<AbstractIntData> triggerList) {
+        for (final AbstractIntData data : triggerList) {
             if (data instanceof TIData) {
-                TIData tiData = (TIData) data;
+                final TIData tiData = (TIData) data;
                 return tiData.getTime();
             }
         }
@@ -68,46 +78,17 @@
     }
 
     @Override
-    public void readEvioEvent(EvioEvent evioEvent) {
-        super.readEvioEvent(evioEvent);
+    public EventHeader makeLCSimEvent(final EvioEvent evioEvent) {
 
-        // Create EPICS data if this is an EPICS control event.
-        if (EvioEventUtilities.isEpicsEvent(evioEvent)) {
-            createEpicsScalarData(evioEvent);
-        }
-    }
+        LOGGER.finest("creating LCSim event from EVIO event " + evioEvent.getEventNumber());
 
-    /**
-     * Create and cache an {@link org.hps.record.epics.EpicsScalarData} object.
-     *
-     * @param evioEvent The EVIO event data.
-     */
-    void createEpicsScalarData(EvioEvent evioEvent) {
-        epicsProcessor.process(evioEvent);
-        epicsData = epicsProcessor.getEpicsScalarData();
-    }
-
-    /**
-     * Write EVIO scalar data into the LCSim event, if it exists.
-     *
-     * @param evioEvent The EVIO event data.
-     * @param lcsimEvent The output LCSim event.
-     */
-    void writeScalarData(EvioEvent evioEvent, EventHeader lcsimEvent) {
-        scalarProcessor.process(evioEvent);
-        if (scalarProcessor.getScalarData() != null) {
-            scalarProcessor.getScalarData().write(lcsimEvent);
-        }
-    }
-
-    @Override
-    public EventHeader makeLCSimEvent(EvioEvent evioEvent) {
         if (!EvioEventUtilities.isPhysicsEvent(evioEvent)) {
             throw new RuntimeException("Not a physics event: event tag " + evioEvent.getHeader().getTag());
         }
 
         // Create a new LCSimEvent.
-        EventHeader lcsimEvent = getEventData(evioEvent);
+        final EventHeader lcsimEvent = this.getEventData(evioEvent);
+        LOGGER.finest("created new LCSim event " + lcsimEvent.getEventNumber());
 
         // Put DAQ Configuration info into lcsimEvent.
         triggerConfigReader.getDAQConfig(evioEvent, lcsimEvent);
@@ -116,26 +97,52 @@
         // of ECal into one list.
         try {
             ecalReader.makeHits(evioEvent, lcsimEvent);
-        } catch (Exception e) {
-            Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, "Error making ECal hits", e);
+        } catch (final Exception e) {
+            LOGGER.log(Level.SEVERE, "Error making ECal hits", e);
         }
 
         // Make SVT RawTrackerHits.
         try {
             svtReader.makeHits(evioEvent, lcsimEvent);
-        } catch (Exception e) {
-            Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, "Error making SVT hits", e);
+        } catch (final Exception e) {
+            LOGGER.log(Level.SEVERE, "Error making SVT hits", e);
         }
-        
+
         // Write the current EPICS data into this event.
         if (epicsData != null) {
+            LOGGER.finest("writing EPICS data to lcsim event " + lcsimEvent.getEventNumber());
             epicsData.write(lcsimEvent);
             epicsData = null;
         }
 
-        // Write scalars into the event, if they exist in this EVIO data.
-        writeScalarData(evioEvent, lcsimEvent);
+        // Write scalers into the event, if they exist in this EVIO data.
+        this.writeScalerData(evioEvent, lcsimEvent);
 
         return lcsimEvent;
     }
+
+    @Override
+    public void readEvioEvent(final EvioEvent evioEvent) {
+        super.readEvioEvent(evioEvent);
+
+        // Create EPICS data if this is an EPICS control event.
+        if (EvioEventUtilities.isEpicsEvent(evioEvent)) {
+            LOGGER.finest("creating data from EPICS event");
+            this.createEpicsData(evioEvent);
+        }
+    }
+
+    /**
+     * Write EVIO scaler data into the LCSim event, if it exists.
+     *
+     * @param evioEvent The EVIO event data.
+     * @param lcsimEvent The output LCSim event.
+     */
+    void writeScalerData(final EvioEvent evioEvent, final EventHeader lcsimEvent) {
+        scalerProcessor.process(evioEvent);
+        if (scalerProcessor.getScalerData() != null) {
+            LOGGER.finest("writing scaler data to lcsim event " + lcsimEvent.getEventNumber() + " from EVIO event " + evioEvent.getEventNumber());
+            scalerProcessor.getScalerData().write(lcsimEvent);
+        }
+    }
 }

Modified: java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/LCSimTestRunEventBuilder.java
 =============================================================================
--- java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/LCSimTestRunEventBuilder.java	(original)
+++ java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/LCSimTestRunEventBuilder.java	Fri Jun 12 15:27:10 2015
@@ -18,6 +18,7 @@
 import org.lcsim.conditions.ConditionsManager;
 import org.lcsim.event.EventHeader;
 import org.lcsim.event.base.BaseLCSimEvent;
+import org.lcsim.util.log.DefaultLogFormatter;
 import org.lcsim.util.log.LogUtil;
 
 /**
@@ -33,7 +34,7 @@
     protected long time = 0; //most recent event time (ns), taken from prestart and end events, and trigger banks (if any)
     protected int sspCrateBankTag = 0x1; //bank ID of the crate containing the SSP
     protected int sspBankTag = 0xe106; //SSP bank's tag
-    protected static Logger logger = LogUtil.create(LCSimTestRunEventBuilder.class);
+    protected static Logger LOGGER = LogUtil.create(LCSimTestRunEventBuilder.class, new DefaultLogFormatter(), Level.INFO);
     protected List<IntBankDefinition> intBanks = null;
 
     public LCSimTestRunEventBuilder() {
@@ -41,7 +42,7 @@
         svtReader = new TestRunSvtEvioReader();
         intBanks = new ArrayList<IntBankDefinition>();
         intBanks.add(new IntBankDefinition(TestRunTriggerData.class, new int[]{sspCrateBankTag, sspBankTag}));
-        logger.setLevel(Level.FINE);
+        LOGGER.setLevel(Level.FINE);
     }
 
     public void setEcalHitCollectionName(String ecalHitCollectionName) {
@@ -53,33 +54,33 @@
         if (EvioEventUtilities.isSyncEvent(evioEvent)) {
             int[] data = EvioEventUtilities.getControlEventData(evioEvent);
             int seconds = data[0];
-            logger.info("Sync event: time " + seconds + " - " + new Date(((long) seconds) * 1000) + ", event count since last sync " + data[1] + ", event count so far " + data[2] + ", status " + data[3]);
+            LOGGER.info("Sync event: time " + seconds + " - " + new Date(((long) seconds) * 1000) + ", event count since last sync " + data[1] + ", event count so far " + data[2] + ", status " + data[3]);
         } else if (EvioEventUtilities.isPreStartEvent(evioEvent)) {
             int[] data = EvioEventUtilities.getControlEventData(evioEvent);
             if (data != null) {
                 int seconds = data[0];
                 time = ((long) seconds) * 1000000000;
                 int run = data[1];
-                logger.info("Prestart event: time " + seconds + " - " + new Date(((long) seconds) * 1000) + ", run " + run + ", run type " + data[2]);
+                LOGGER.info("Prestart event: time " + seconds + " - " + new Date(((long) seconds) * 1000) + ", run " + run + ", run type " + data[2]);
             }
         } else if (EvioEventUtilities.isGoEvent(evioEvent)) {
             int[] data = EvioEventUtilities.getControlEventData(evioEvent);
             if (data != null) {
                 int seconds = data[0];
                 time = ((long) seconds) * 1000000000;
-                logger.info("Go event: time " + seconds + " - " + new Date(((long) seconds) * 1000) + ", event count so far " + data[2]);
+                LOGGER.info("Go event: time " + seconds + " - " + new Date(((long) seconds) * 1000) + ", event count so far " + data[2]);
             }
         } else if (EvioEventUtilities.isPauseEvent(evioEvent)) {
             int[] data = EvioEventUtilities.getControlEventData(evioEvent);
             int seconds = data[0];
             time = ((long) seconds) * 1000000000;
-            logger.info("Pause event: time " + seconds + " - " + new Date(((long) seconds) * 1000) + ", event count so far " + data[2]);
+            LOGGER.info("Pause event: time " + seconds + " - " + new Date(((long) seconds) * 1000) + ", event count so far " + data[2]);
         } else if (EvioEventUtilities.isEndEvent(evioEvent)) {
             int[] data = EvioEventUtilities.getControlEventData(evioEvent);
             int seconds = data[0];
             time = ((long) seconds) * 1000000000;
             //run = 0;
-            logger.info("End event: time " + seconds + " - " + new Date(((long) seconds) * 1000) + ", event count " + data[2]);
+            LOGGER.info("End event: time " + seconds + " - " + new Date(((long) seconds) * 1000) + ", event count " + data[2]);
         }
     }
 
@@ -124,29 +125,34 @@
         }
 
         if (eventID == null) {
-            logger.warning("No event ID bank found");
+            // FIXME: Should be a fatal error if this happens?  JM
+            LOGGER.warning("no event ID bank found");
             eventID = new int[3];
         } else {
-            logger.finest("Read EVIO event number " + eventID[0]);
+            LOGGER.finest("read EVIO event number " + eventID[0]);
             // Stop hardcoding event tags.
-            //if (eventID[1] != 1) {
-            //    logger.warning("Trigger code is usually 1; got " + eventID[1]);
-            //}
             if (eventID[2] != 0) {
-                logger.warning("Readout status is usually 0; got " + eventID[2]);
+                LOGGER.warning("Readout status is usually 0 but got " + eventID[2]);
             }
         }
 
         time = getTime(triggerList);
-
+        
+        if (eventID[0] != evioEvent.getEventNumber()) {
+            LOGGER.finest("EVIO event number " + evioEvent.getEventNumber() + " does not match " + eventID[0] + " from event ID bank");
+        }
+        
         // Create a new LCSimEvent.
         EventHeader lcsimEvent = new BaseLCSimEvent(
                 ConditionsManager.defaultInstance().getRun(),
                 eventID[0],
+                // FIXME: This should be used instead for event number.  JM
+                // evioEvent.getEventNumber(),
                 ConditionsManager.defaultInstance().getDetector(),
                 time);
 
         lcsimEvent.put("TriggerBank", triggerList, AbstractIntData.class, 0);
+        
         return lcsimEvent;
     }
 
@@ -169,10 +175,10 @@
                     AbstractIntData data = (AbstractIntData) def.dataClass.getConstructor(int[].class).newInstance(bank.getIntData());
                     triggerList.add(data);
                 } catch (Exception ex) {
-                    Logger.getLogger(LCSimTestRunEventBuilder.class.getName()).log(Level.SEVERE, null, ex);
+                    LOGGER.log(Level.SEVERE, ex.getMessage(), ex);
                 }
             } else {
-                logger.finest("No trigger bank found of type " + def.dataClass.getSimpleName());
+                LOGGER.finest("No trigger bank found of type " + def.dataClass.getSimpleName());
             }
         }
         return triggerList;
@@ -203,14 +209,17 @@
             searchLoop:
             for (int bankTag : bankTags) {
                 if (currentBank.getChildCount() > 0) {
-                    for (BaseStructure childBank : currentBank.getChildren()) {
-                        if (childBank.getHeader().getTag() == bankTag) { //found a bank with the right tag; step inside this bank and conitnue searching
+                    for (BaseStructure childBank : currentBank.getChildrenList()) {
+                        if (childBank.getHeader().getTag() == bankTag) { 
+                            // Found a bank with the right tag; step inside this bank and continue searching.
                             currentBank = childBank;
                             continue searchLoop;
                         }
                     }
-                    return null; //didn't find a bank with the right tag, give up
-                } else { //bank has no children, give up
+                    // Didn't find a bank with the right tag so stop.
+                    return null; 
+                } else { 
+                    // Bank has no children so stop.
                     return null;
                 }
             }

Modified: java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/SvtEvioReader.java
 =============================================================================
--- java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/SvtEvioReader.java	(original)
+++ java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/SvtEvioReader.java	Fri Jun 12 15:27:10 2015
@@ -3,10 +3,13 @@
 import java.util.List;
 
 import org.jlab.coda.jevio.BaseStructure;
+import org.jlab.coda.jevio.EvioEvent;
 
 import org.lcsim.detector.tracker.silicon.HpsSiSensor;
+import org.lcsim.event.EventHeader;
 import org.lcsim.event.RawTrackerHit;
 import org.lcsim.geometry.Subdetector;
+
 import org.hps.util.Pair;
 
 /**
@@ -111,8 +114,8 @@
     @Override
     protected HpsSiSensor getSensor(int[] data) {
         
-        logger.fine("FEB ID: " + SvtEvioUtils.getFebID(data) 
-                  + " Hybrid ID: " + SvtEvioUtils.getFebHybridID(data));
+        //logger.fine("FEB ID: " + SvtEvioUtils.getFebID(data) 
+        //          + " Hybrid ID: " + SvtEvioUtils.getFebHybridID(data));
         
         Pair<Integer, Integer> daqPair 
             = new Pair<Integer, Integer>(SvtEvioUtils.getFebID(data), 
@@ -123,7 +126,7 @@
     
     /**
      *  Check whether a data bank is valid i.e. contains SVT samples only.  For
-     *  the engineering run, a valid data bank has a tag of 1.
+     *  the engineering run, a valid data bank has a tag of 3.
      * 
      *  @param dataBank - An EVIO bank containing integer data
      *  @return true if the bank is valid, false otherwise
@@ -131,7 +134,17 @@
      */
     @Override
     protected boolean isValidDataBank(BaseStructure dataBank) { 
-        if (dataBank.getHeader().getTag() != 3) return false; 
+        
+        // The SVT configuration is stored in a bank with tag equal to 57614.
+        // All other event banks are invalid
+        if (dataBank.getHeader().getTag() == 57614) { 
+            
+            // Store the event bank for processing later.
+            eventBanks.add(dataBank);
+            
+            return false;
+        } else if (dataBank.getHeader().getTag() != 3) return false; 
+        
         return true; 
     }
     
@@ -145,6 +158,41 @@
     protected boolean isValidSampleSet(int[] data) {
         return !(SvtEvioUtils.isApvHeader(data) || SvtEvioUtils.isApvTail(data));        
     }
+   
+    /**
+     *  Process an EVIO event and extract all information relevant to the SVT.
+     *  
+     *  @param event - EVIO event to process
+     *  @param lcsimEvent - LCSim event to put collections into 
+     *  @return true if the EVIO was processed successfully, false otherwise 
+     */
+    @Override
+    public boolean processEvent(EvioEvent event, EventHeader lcsimEvent) {
+        
+        // Make RawTrackerHits.  This will also search for and store banks containing
+        // the configuration of the SVT.
+        boolean success = super.processEvent(event, lcsimEvent);
+        
+        /*logger.fine("Event contains " + eventBanks.size() + " event banks");
+        // Loop through all of the event banks and process them
+        for (BaseStructure eventBank : eventBanks) { 
+           logger.fine(eventBank.toString());
+           if (eventBank.getHeader().getTag() == 57614) { 
+               logger.fine("Configuration bank found");
+               String[] stringData = eventBank.getStringData();
+               logger.fine("String data size: " + stringData.length);
+               System.out.println("Configuration: ");
+               for (String stringDatum : stringData) {
+                  System.out.println("Data: " + stringDatum); 
+               }
+           }
+        }*/
+        
+        // Clear out the event banks after they have been processed
+        eventBanks.clear();
+        
+        return success;
+    }
     
     /**
      *  Make a {@linkplain RawTrackerHit} from a set of samples.
@@ -155,7 +203,7 @@
     @Override
     protected RawTrackerHit makeHit(int[] data) {
          
-        logger.fine("Channel: " + SvtEvioUtils.getPhysicalChannelNumber(data));
+        //logger.fine("Channel: " + SvtEvioUtils.getPhysicalChannelNumber(data));
         return makeHit(data, SvtEvioUtils.getPhysicalChannelNumber(data));
     }
 }

Modified: java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/TestRunTriggeredReconToEvio.java
 =============================================================================
--- java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/TestRunTriggeredReconToEvio.java	(original)
+++ java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/TestRunTriggeredReconToEvio.java	Fri Jun 12 15:27:10 2015
@@ -58,7 +58,7 @@
 
     public void setEcalMode(int ecalMode) {
         this.ecalMode = ecalMode;
-        if (ecalMode != EventConstants.ECAL_WINDOW_MODE && ecalMode != EventConstants.ECAL_PULSE_MODE && ecalMode != EventConstants.ECAL_PULSE_INTEGRAL_MODE) {
+        if (ecalMode != EventConstants.ECAL_RAW_MODE && ecalMode != EventConstants.ECAL_PULSE_MODE && ecalMode != EventConstants.ECAL_PULSE_INTEGRAL_MODE) {
             throw new IllegalArgumentException("invalid mode " + ecalMode);
         }
         if (ecalWriter != null) {

Modified: java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/TestRunTriggeredReconToLcio.java
 =============================================================================
--- java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/TestRunTriggeredReconToLcio.java	(original)
+++ java/branches/HPSJAVA-488/evio/src/main/java/org/hps/evio/TestRunTriggeredReconToLcio.java	Fri Jun 12 15:27:10 2015
@@ -77,7 +77,7 @@
 
     public void setEcalMode(int ecalMode) {
         this.ecalMode = ecalMode;
-        if (ecalMode != EventConstants.ECAL_WINDOW_MODE && ecalMode != EventConstants.ECAL_PULSE_MODE && ecalMode != EventConstants.ECAL_PULSE_INTEGRAL_MODE) {
+        if (ecalMode != EventConstants.ECAL_RAW_MODE && ecalMode != EventConstants.ECAL_PULSE_MODE && ecalMode != EventConstants.ECAL_PULSE_INTEGRAL_MODE) {
             throw new IllegalArgumentException("invalid mode " + ecalMode);
         }
         if (ecalWriter != null) {
@@ -287,7 +287,7 @@
     @Override
     protected void processTrigger(EventHeader event) {
         // Create an LCSim event and pass a flag so that conditions updates are disabled. --JM
-        EventHeader lcsimEvent = new BaseLCSimEvent(DatabaseConditionsManager.getInstance().getRun(), event.getEventNumber(), event.getDetectorName(), System.currentTimeMillis() * 1000000, false);
+        EventHeader lcsimEvent = new BaseLCSimEvent(DatabaseConditionsManager.getInstance().getRun(), event.getEventNumber(), event.getDetectorName(), (long) 4 * (Math.round(ClockSingleton.getTime() / 4)), false);
         events.add(lcsimEvent);
         if (verbosity >= 1) {
             System.out.println("Creating LCIO event " + eventNum);

Modified: java/branches/HPSJAVA-488/integration-tests/pom.xml
 =============================================================================
--- java/branches/HPSJAVA-488/integration-tests/pom.xml	(original)
+++ java/branches/HPSJAVA-488/integration-tests/pom.xml	Fri Jun 12 15:27:10 2015
@@ -7,7 +7,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>../parent/pom.xml</relativePath>
-        <version>3.3.1-SNAPSHOT</version>
+        <version>3.3.3-SNAPSHOT</version>
     </parent>
     <scm>
         <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/integration-tests/</url>
@@ -35,11 +35,16 @@
                         <exclude>org/hps/HPSTestRunTracker2014GeometryTrackReconTest.java</exclude>
                         <exclude>org/hps/HPSTracker2014GeometryTrackReconTest.java</exclude>
                         <exclude>org/hps/MCFilteredReconTest.java</exclude>
+                        <exclude>org/hps/MockDataReconTest.java</exclude>
                         <exclude>org/hps/ReadoutToEvioTest.java</exclude>
                         <exclude>org/hps/ReadoutToLcioTest.java</exclude>
                         <exclude>org/hps/SimpleSvtReadoutTest.java</exclude>
                         <exclude>org/hps/TestRunReadoutToEvioTest.java</exclude>
                         <exclude>org/hps/ReadoutNoPileupTest.java</exclude>
+                        <exclude>org/hps/SteeringFilesTest.java</exclude>
+                        <exclude>org/hps/TestRunEvioToLcioTest.java</exclude>
+                        <exclude>org/hps/TestRunReconTest.java</exclude>
+                        <exclude>org/hps/test/it/EcalSimReconTest.java</exclude>
                     </excludes>
 <!--                    <redirectTestOutputToFile>true</redirectTestOutputToFile> -->
                     <trimStackTrace>false</trimStackTrace>

Modified: java/branches/HPSJAVA-488/monitoring-app/pom.xml
 =============================================================================
--- java/branches/HPSJAVA-488/monitoring-app/pom.xml	(original)
+++ java/branches/HPSJAVA-488/monitoring-app/pom.xml	Fri Jun 12 15:27:10 2015
@@ -7,7 +7,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>../parent/pom.xml</relativePath>
-        <version>3.3.1-SNAPSHOT</version>
+        <version>3.3.3-SNAPSHOT</version>
     </parent>
     <scm>
         <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/monitoring-app/</url>

Modified: java/branches/HPSJAVA-488/monitoring-app/src/main/java/org/hps/monitoring/application/MonitoringApplication.java
 =============================================================================
--- java/branches/HPSJAVA-488/monitoring-app/src/main/java/org/hps/monitoring/application/MonitoringApplication.java	(original)
+++ java/branches/HPSJAVA-488/monitoring-app/src/main/java/org/hps/monitoring/application/MonitoringApplication.java	Fri Jun 12 15:27:10 2015
@@ -658,8 +658,8 @@
     private void openFile() {
         final JFileChooser fc = new JFileChooser(System.getProperty("user.dir"));
         fc.setAcceptAllFileFilterUsed(false);
+        fc.addChoosableFileFilter(EVIO_FILTER);
         fc.addChoosableFileFilter(LCIO_FILTER);
-        fc.addChoosableFileFilter(EVIO_FILTER);
         fc.setDialogTitle("Select Data File");
         final int r = fc.showDialog(this.frame, "Select ...");
         if (r == JFileChooser.APPROVE_OPTION) {
@@ -753,9 +753,9 @@
     private void savePlots() {
         final JFileChooser fc = new JFileChooser();
         fc.addChoosableFileFilter(new FileNameExtensionFilter("ROOT file", "root"));
-        final FileFilter filter = new FileNameExtensionFilter("AIDA file", "aida");
+        final FileFilter filter = new FileNameExtensionFilter("PDF file", "pdf");
         fc.addChoosableFileFilter(filter);
-        fc.addChoosableFileFilter(new FileNameExtensionFilter("PDF file", "pdf"));
+        fc.addChoosableFileFilter(new FileNameExtensionFilter("AIDA file", "aida"));
         fc.setAcceptAllFileFilterUsed(false);
         fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
         fc.setFileFilter(filter);
@@ -770,8 +770,10 @@
                 }
                 try {
                     if ("pdf".equals(extension)) {
-                        // Write to a single PDF file.
-                        ExportPdf.write(MonitoringPlotFactory.getPlotterRegistry().getPlotters(), fileName,
+                        // Write out all plot graphics from the tabs to a single PDF file.
+                        ExportPdf.write( 
+                                MonitoringPlotFactory.getPlotterRegistry().getPlotters(),
+                                fileName, 
                                 getRunData());
                     } else {
                         // Save plot object data to AIDA or ROOT file.

Modified: java/branches/HPSJAVA-488/monitoring-app/src/main/java/org/hps/monitoring/application/MonitoringApplicationFrame.java
 =============================================================================
--- java/branches/HPSJAVA-488/monitoring-app/src/main/java/org/hps/monitoring/application/MonitoringApplicationFrame.java	(original)
+++ java/branches/HPSJAVA-488/monitoring-app/src/main/java/org/hps/monitoring/application/MonitoringApplicationFrame.java	Fri Jun 12 15:27:10 2015
@@ -136,15 +136,15 @@
         // Create the tabbed pane for content in bottom of left panel such as log table and system monitor.
         final JTabbedPane tableTabbedPane = new JTabbedPane();
 
-        // Create the log table and add it to the tabs.
-        this.logPanel = new LogPanel(application.getConfigurationModel(), application);
-        tableTabbedPane.addTab("Log Messages", this.logPanel);
-
         // Create the system monitor.
         // systemStatusTable = new SystemStatusTable();
         this.systemStatusPanel = new SystemStatusPanel();
         tableTabbedPane.addTab("System Status Monitor", this.systemStatusPanel);
 
+        // Create the log table and add it to the tabs.
+        this.logPanel = new LogPanel(application.getConfigurationModel(), application);
+        tableTabbedPane.addTab("Log Messages", this.logPanel);
+
         // Add the trigger diagnostics tables.
         this.triggerPanel = new TriggerDiagnosticsPanel();
         tableTabbedPane.addTab("Trigger Diagnostics", this.triggerPanel);
@@ -172,11 +172,13 @@
         // Create the right panel vertical split pane for displaying plots and their information and statistics.
         this.rightSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, this.plotPanel, this.plotInfoPanel);
         this.rightSplitPane.setDividerLocation(680);
+        this.rightSplitPane.setOneTouchExpandable(true);
         rightPanel.add(this.rightSplitPane, BorderLayout.CENTER);
 
         // Create the main horizontal split pane for dividing the left and right panels.
         this.mainSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPanel, rightPanel);
         this.mainSplitPane.setDividerLocation(600);
+        this.mainSplitPane.setOneTouchExpandable(true);
         bottomPanel.add(this.mainSplitPane, BorderLayout.CENTER);
 
         // Create the menu bar.

Modified: java/branches/HPSJAVA-488/monitoring-app/src/main/java/org/hps/monitoring/application/PlotPanel.java
 =============================================================================
--- java/branches/HPSJAVA-488/monitoring-app/src/main/java/org/hps/monitoring/application/PlotPanel.java	(original)
+++ java/branches/HPSJAVA-488/monitoring-app/src/main/java/org/hps/monitoring/application/PlotPanel.java	Fri Jun 12 15:27:10 2015
@@ -1,6 +1,4 @@
 package org.hps.monitoring.application;
-
-import hep.aida.IPlotter;
 
 import java.awt.BorderLayout;
 import java.awt.Component;
@@ -18,7 +16,6 @@
 
 import org.hps.monitoring.application.util.DialogUtil;
 import org.hps.monitoring.plotting.ExportPdf;
-import org.hps.monitoring.plotting.MonitoringPlotFactory;
 
 /**
  * This is the panel containing the tabs with the monitoring plots.
@@ -50,14 +47,8 @@
      */
     @Override
     public void actionPerformed(final ActionEvent event) {
-        if (event.getActionCommand().equals(Commands.SAVE_SELECTED_PLOTS)) {
-            final int[] indices = this.getSelectedTabIndices();
-            final IPlotter plotter = MonitoringPlotFactory.getPlotterRegistry().find(indices[0], indices[1]);
-            if (plotter != null) {
-                this.savePlotter(plotter);
-            } else {
-                DialogUtil.showErrorDialog(this, "Error Finding Plots", "No plots found in selected tab.");
-            }
+        if (event.getActionCommand().equals(Commands.SAVE_SELECTED_PLOTS)) {            
+            saveCurrentPlot();                       
         }
     }
 
@@ -75,7 +66,7 @@
      *
      * @return the currently selected plot tab
      */
-    Component getSelectedTab() {
+    Component getSelectedComponent() {
         return ((JTabbedPane) this.plotPane.getSelectedComponent()).getSelectedComponent();
     }
 
@@ -84,15 +75,15 @@
      *
      * @return The indices of the current tabs.
      */
-    private int[] getSelectedTabIndices() {
-        final int[] indices = new int[2];
-        indices[0] = this.plotPane.getSelectedIndex();
-        final Component component = this.plotPane.getSelectedComponent();
-        if (component instanceof JTabbedPane) {
-            indices[1] = ((JTabbedPane) component).getSelectedIndex();
-        }
-        return indices;
-    }
+    //private int[] getSelectedTabIndices() {
+    //    final int[] indices = new int[2];
+    //    indices[0] = this.plotPane.getSelectedIndex();
+    //    final Component component = this.plotPane.getSelectedComponent();
+    //    if (component instanceof JTabbedPane) {
+    //        indices[1] = ((JTabbedPane) component).getSelectedIndex();
+    //    }
+    //    return indices;
+    //}
 
     /**
      * Remove all tabs from the plot pane.
@@ -106,10 +97,10 @@
      *
      * @param plotter the plotter to save
      */
-    private void savePlotter(final IPlotter plotter) {
+    private void saveCurrentPlot() {
         final JFileChooser fc = new JFileChooser();
         fc.setAcceptAllFileFilterUsed(false);
-        fc.setDialogTitle("Save Plots - " + plotter.title());
+        fc.setDialogTitle("Save Plot");
         fc.setCurrentDirectory(new File("."));
         fc.setAcceptAllFileFilterUsed(false);
         fc.setFileFilter(new FileNameExtensionFilter("PNG file", "png"));
@@ -122,8 +113,8 @@
             if (!path.endsWith("." + filter.getExtensions()[0])) {
                 path += "." + filter.getExtensions()[0];
             }
-            final BufferedImage image = ExportPdf.getImage(this.getSelectedTab());
             try {
+                final BufferedImage image = ExportPdf.getImage(this.getSelectedComponent());
                 ImageIO.write(image, filter.getExtensions()[0], new File(path));
                 DialogUtil.showInfoDialog(this, "Plots Saved", "Plots from panel were saved to" + '\n' + path);
             } catch (final IOException e) {

Modified: java/branches/HPSJAVA-488/monitoring-app/src/main/java/org/hps/monitoring/application/SystemStatusPanel.java
 =============================================================================
--- java/branches/HPSJAVA-488/monitoring-app/src/main/java/org/hps/monitoring/application/SystemStatusPanel.java	(original)
+++ java/branches/HPSJAVA-488/monitoring-app/src/main/java/org/hps/monitoring/application/SystemStatusPanel.java	Fri Jun 12 15:27:10 2015
@@ -4,17 +4,24 @@
 package org.hps.monitoring.application;
 
 import java.awt.BorderLayout;
+import java.awt.Toolkit;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Timer;
+import java.util.TimerTask;
 
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
 import javax.swing.JSplitPane;
 
 import org.hps.monitoring.application.SystemStatusEventsTable.SystemStatusEventsTableModel;
+import org.hps.monitoring.subsys.StatusCode;
 import org.hps.monitoring.subsys.SystemStatus;
 
 /**
- * This is a panel showing the two tables for viewing the system statuses, one showing the current state of all system
- * status monitors and the other with all system status change events.
+ * This is a panel showing the two tables for viewing the system statuses, one
+ * showing the current state of all system status monitors and the other with
+ * all system status change events.
  *
  * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
@@ -32,14 +39,22 @@
     private final SystemStatusTable statusTable = new SystemStatusTable();
 
     /**
+     * The list of statuses to check.
+     */
+    private final List<SystemStatus> statuses = new ArrayList<SystemStatus>();
+
+    private final Timer timer = new Timer("System Status Beeper");
+
+    /**
      * Class constructor.
      */
     SystemStatusPanel() {
         super(new BorderLayout());
         final JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, new JScrollPane(this.statusTable),
                 new JScrollPane(this.eventsTable));
-        splitPane.setDividerLocation(50);
+        splitPane.setDividerLocation(150);
         this.add(splitPane, BorderLayout.CENTER);
+        timer.scheduleAtFixedRate(new SystemStatusBeeper(), 0, 1000);
     }
 
     /**
@@ -51,6 +66,7 @@
         // Register listeners of table models on this status.
         this.statusTable.getTableModel().addSystemStatus(status);
         this.eventsTable.getSystemStatusEventsTableModel().addSystemStatus(status);
+        this.statuses.add(status);
     }
 
     /**
@@ -62,5 +78,23 @@
 
         // Clear the system status events table.
         ((SystemStatusEventsTableModel) this.eventsTable.getModel()).clear();
+        
+        this.statuses.clear();
+    }
+
+    private class SystemStatusBeeper extends TimerTask {
+
+        @Override
+        public void run() {
+            boolean isAlarming = false;
+            for (SystemStatus status : statuses) {
+                if (status.isActive() && status.getStatusCode() == StatusCode.ALARM) {
+                    isAlarming = true;
+                }
+            }
+            if (isAlarming) {
+                System.out.println("beep\007");
+            }
+        }
     }
 }

Modified: java/branches/HPSJAVA-488/monitoring-app/src/main/scripts/evio_file_producer.sh
 =============================================================================
--- java/branches/HPSJAVA-488/monitoring-app/src/main/scripts/evio_file_producer.sh	(original)
+++ java/branches/HPSJAVA-488/monitoring-app/src/main/scripts/evio_file_producer.sh	Fri Jun 12 15:27:10 2015
@@ -3,14 +3,10 @@
 # First argument, with no command switch, is name of EVIO file.
 eviofile=$1
 
-# Subsequent arguments are appended to the end of the command.
-shift
-
 # Classpath pointing to the hps-evio jar.
 classpath=${project.build.directory}/${project.artifactId}-${project.version}-bin.jar
 
 # Run the file producer, sending any additional arguments to the command.
-#prod="java -classpath $classpath org.hps.evio.EvioFileProducer -e ${eviofile} -f ETBuffer -host localhost -s 10000 -d 100 $@"
-prod="java -classpath $classpath org.hps.record.evio.EvioFileProducer -e ${eviofile} -f ETBuffer -host localhost -s 200000 $@"
+prod="java -classpath $classpath org.hps.record.evio.EvioFileProducer $@"
 echo $prod
 exec $prod

Modified: java/branches/HPSJAVA-488/monitoring-drivers/pom.xml
 =============================================================================
--- java/branches/HPSJAVA-488/monitoring-drivers/pom.xml	(original)
+++ java/branches/HPSJAVA-488/monitoring-drivers/pom.xml	Fri Jun 12 15:27:10 2015
@@ -7,7 +7,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>../parent/pom.xml</relativePath>
-        <version>3.3.1-SNAPSHOT</version>
+        <version>3.3.3-SNAPSHOT</version>
     </parent>
     <scm>
         <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/monitoring-drivers/</url>

Modified: java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/example/ExamplePlotDriver.java
 =============================================================================
--- java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/example/ExamplePlotDriver.java	(original)
+++ java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/example/ExamplePlotDriver.java	Fri Jun 12 15:27:10 2015
@@ -77,9 +77,9 @@
 FADCGenericHits - class org.hps.recon.ecal.FADCGenericHit                                               
 TriggerConfig - class org.hps.recon.ecal.daqconfig.EvioDAQParser                                        
 EcalReadoutHits - class org.lcsim.event.base.BaseRawCalorimeterHit                                      
-EpicsScalarData - interface org.lcsim.event.GenericObject                                               
+EpicsData - interface org.lcsim.event.GenericObject                                               
 EcalCalHits - interface org.lcsim.event.CalorimeterHit                                                  
-ScalarData - interface org.lcsim.event.GenericObject                                                    
+ScalerData - interface org.lcsim.event.GenericObject                                                    
 TriggerBank - class org.hps.recon.ecal.triggerbank.AbstractIntData                                      
 EcalClusters - interface org.lcsim.event.Cluster
 */  
@@ -372,4 +372,4 @@
         return fitResult;
     }
     
-}   
+}   

Modified: java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/GblTrackingReconstructionPlots.java
 =============================================================================
--- java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/GblTrackingReconstructionPlots.java	(original)
+++ java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/GblTrackingReconstructionPlots.java	Fri Jun 12 15:27:10 2015
@@ -2,7 +2,9 @@
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -10,15 +12,29 @@
 import hep.aida.IHistogram1D;
 import hep.aida.IPlotter;
 import hep.aida.IPlotterStyle;
-
+import hep.physics.vec.BasicHep3Vector;
+import hep.physics.vec.Hep3Vector;
+
+import org.hps.analysis.ecal.HPSMCParticlePlotsDriver;
+import org.hps.recon.tracking.TrackUtils;
+import org.hps.recon.tracking.gbl.HpsGblRefitter;
+import org.hps.util.BasicLogFormatter;
+import org.lcsim.constants.Constants;
 import org.lcsim.event.EventHeader;
+import org.lcsim.event.MCParticle;
 import org.lcsim.event.Track;
+import org.lcsim.event.base.ParticleTypeClassifier;
+import org.lcsim.fit.helicaltrack.HelicalTrackFit;
 import org.lcsim.geometry.Detector;
+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;
+import org.lcsim.util.log.LogUtil;
 
 public class GblTrackingReconstructionPlots extends Driver {
-    private Logger logger = getLogger();
+    private double _bfield;
+    private static Logger logger = LogUtil.create(GblTrackingReconstructionPlots.class, new BasicLogFormatter());
     private AIDA aida = AIDA.defaultInstance();
     private String outputPlots = null;
     private final String trackCollectionName = "MatchedTracks";
@@ -26,12 +42,34 @@
     IHistogram1D nTracks;
     IHistogram1D nTracksGbl;
     IHistogram1D nTracksDiff;
+    IHistogram1D d0Diff;
+    IHistogram1D z0Diff;
+    IHistogram1D phiDiff;
+    IHistogram1D slopeDiff;
+    IHistogram1D rDiff;
+    IHistogram1D pDiff;
+    IHistogram1D d0Diff2;
+    IHistogram1D z0Diff2;
+    IHistogram1D phiDiff2;
+    IHistogram1D slopeDiff2;
+    IHistogram1D rDiff2;
+    IHistogram1D pDiff2;
+    IHistogram1D d0DiffGbl;
+    IHistogram1D z0DiffGbl;
+    IHistogram1D phiDiffGbl;
+    IHistogram1D slopeDiffGbl;
+    IHistogram1D rDiffGbl;
+    IHistogram1D pDiffGbl;
     IPlotter plotter1;
+    IPlotter plotter2;
+    IPlotter plotter3;
+    IPlotter plotter4;
+    
     
     
     public GblTrackingReconstructionPlots() {
         // TODO Auto-generated constructor stub
-        logger.setLevel(Level.WARNING);
+        logger.setLevel(Level.INFO);
     }
 
     public void setOutputPlots(String output) {
@@ -41,6 +79,11 @@
     protected void detectorChanged(Detector detector) {
         aida.tree().cd("/");
         IAnalysisFactory fac = aida.analysisFactory();
+        
+        Hep3Vector bfieldvec = detector.getFieldMap().getField(new BasicHep3Vector(0., 0., 1.));
+        _bfield = bfieldvec.y();
+        //double bfac = 0.0002998 * bfield;
+        //double bfac = Constants.fieldConversion * bfield;
         
         nTracks = aida.histogram1D("Seed tracks per event", 3, 0, 3);
         nTracksGbl = aida.histogram1D("Gbl tracks per event", 3, 0, 3);
@@ -56,7 +99,66 @@
         plotter1.region(1).plot(nTracksGbl);
         plotter1.region(2).plot(nTracksDiff);
         plotter1.show();
-
+        
+        d0Diff = aida.histogram1D("d0Diff", 25, -1.1, 1.1);
+        z0Diff = aida.histogram1D("z0Diff", 25, -0.8, 0.8);
+        slopeDiff = aida.histogram1D("slopeDiff", 25, -0.01, 0.01);
+        phiDiff = aida.histogram1D("phiDiff", 25, -0.01, 0.01);
+        rDiff = aida.histogram1D("rDiff", 25, -0.0001, 0.0001);
+        pDiff = aida.histogram1D("pDiff", 25, -0.1, 0.1);
+
+        plotter2 = fac.createPlotterFactory().create("Truth comparison");
+        plotter2.setStyle(style1);
+        plotter2.createRegions(3, 2);
+        plotter2.region(0).plot(d0Diff);
+        plotter2.region(1).plot(z0Diff);
+        plotter2.region(2).plot(phiDiff);
+        plotter2.region(3).plot(slopeDiff);
+        plotter2.region(4).plot(rDiff);
+        plotter2.region(5).plot(pDiff);
+        plotter2.show();
+        
+        
+        d0DiffGbl = aida.histogram1D("d0DiffGbl", 25, -1.1, 1.1);
+        z0DiffGbl = aida.histogram1D("z0DiffGbl", 25, -0.8, 0.8);
+        slopeDiffGbl = aida.histogram1D("slopeDiffGbl", 25, -0.01, 0.01);
+        phiDiffGbl = aida.histogram1D("phiDiffGbl", 25, -0.01, 0.01);
+        rDiffGbl = aida.histogram1D("rDiffGbl", 25, -0.0001, 0.0001);
+        pDiffGbl = aida.histogram1D("pDiffGbl", 25, -0.1, 0.1);
+
+        
+        plotter3 = fac.createPlotterFactory().create("Truth comparison GBL");
+        plotter3.setStyle(style1);
+        plotter3.createRegions(3, 2);
+        plotter3.region(0).plot(d0DiffGbl);
+        plotter3.region(1).plot(z0DiffGbl);
+        plotter3.region(2).plot(phiDiffGbl);
+        plotter3.region(3).plot(slopeDiffGbl);
+        plotter3.region(4).plot(rDiffGbl);
+        plotter3.region(5).plot(pDiffGbl);
+        plotter3.show();
+        
+        
+        d0Diff2 = aida.histogram1D("d0Diff2", 25, -1.1, 1.1);
+        z0Diff2 = aida.histogram1D("z0Diff2", 25, -0.8, 0.8);
+        slopeDiff2 = aida.histogram1D("slopeDiff2", 25, -0.01, 0.01);
+        phiDiff2 = aida.histogram1D("phiDiff2", 25, -0.01, 0.01);
+        rDiff2 = aida.histogram1D("rDiff2", 25, -0.0001, 0.0001);
+        pDiff2 = aida.histogram1D("pDiff2", 25, -0.1, 0.1);
+
+        
+        plotter4 = fac.createPlotterFactory().create("Seed vs GBL");
+        plotter4.setStyle(style1);
+        plotter4.createRegions(3, 2);
+        plotter4.region(0).plot(d0Diff2);
+        plotter4.region(1).plot(z0Diff2);
+        plotter4.region(2).plot(phiDiff2);
+        plotter4.region(3).plot(slopeDiff2);
+        plotter4.region(4).plot(rDiff2);
+        plotter4.region(5).plot(pDiff2);
+        plotter4.show();
+        
+        
         
     }
     
@@ -76,13 +178,130 @@
            logger.warning("no gbl track collection");
            gblTracks = new ArrayList<Track>();
         }
+        
+        List<MCParticle> mcparticles;
+        List<MCParticle> fsParticles;
+        if( event.hasCollection(MCParticle.class) ) {
+            mcparticles = event.get(MCParticle.class).get(0);
+            fsParticles = HPSMCParticlePlotsDriver.makeGenFSParticleList(mcparticles);
+        } else {
+            logger.warning("no gbl track collection");
+            mcparticles = new ArrayList<MCParticle>();
+            fsParticles = new ArrayList<MCParticle>();
+        }
+
+        
+        
+        
+        logger.info("Number of Tracks = " + tracks.size());
+        logger.info("Number of GBL Tracks = " + gblTracks.size());
+        logger.info("Number of MC particles = " + mcparticles.size());
+        logger.info("Number of FS MC particles = " + fsParticles.size());
+        
+        
+        
+        Map<Track, MCParticle> trackTruthMatch = new HashMap<Track,MCParticle>();
+        
+        for(Track track : gblTracks) {
+            MCParticle part = TrackUtils.getMatchedTruthParticle(track);
+            trackTruthMatch.put(track, part);
+            if(part!=null) {
+                logger.info("Match track with q " + track.getCharge() + " p " + track.getMomentum()[0] + "," + track.getMomentum()[1] + ","  + track.getMomentum()[2]);
+            } else {
+                logger.info("no match for track with q " + track.getCharge() + " p " + track.getMomentum()[0] + "," + track.getMomentum()[1] + ","  + track.getMomentum()[2]);
+            }
+        }
+        
+        for(Track track : gblTracks) {
+            
+            logger.info("Track:");
+            SeedTrack st = (SeedTrack)track;
+            SeedCandidate seed = st.getSeedCandidate();
+            HelicalTrackFit htf = seed.getHelix(); 
+            logger.info(htf.toString());
+            HelicalTrackFit pHTF = null;
+            double pTruth = -1.;
+            double pTrackTruth = -1.;
+            if(trackTruthMatch.get(track)==null) {
+                logger.info("no truth mc particle for this track");
+            } else {
+                MCParticle part = trackTruthMatch.get(track);
+                pTruth = part.getMomentum().magnitude();
+                pHTF = TrackUtils.getHTF(part,Math.abs(_bfield));
+                pTrackTruth = pHTF.p(Math.abs(_bfield));
+                logger.info("part: " + trackTruthMatch.get(track).getPDGID());
+                logger.info("pHTF:");
+                logger.info(pHTF.toString());
+                logger.info("pTruth="+pTruth+" pTrackTruth="+pTrackTruth);
+            }
+            
+            
+            
+            
+            double d0 = htf.dca();
+            double z0 = htf.z0();
+            double C = htf.curvature();
+            double phi = htf.phi0();
+            double slope = htf.slope();
+            double p = htf.p(Math.abs(_bfield));
+            double d0Gbl = track.getTrackStates().get(0).getD0();
+            double z0Gbl = track.getTrackStates().get(0).getZ0();
+            double CGbl = track.getTrackStates().get(0).getOmega();
+            double phiGbl = track.getTrackStates().get(0).getPhi();
+            double slopeGbl = track.getTrackStates().get(0).getTanLambda();
+            double pGbl = getMag(track.getTrackStates().get(0).getMomentum());
+            logger.info("pGbl="+pGbl);
+
+            if(pHTF!=null) {
+                double d0Truth = pHTF.dca();
+                double z0Truth = pHTF.z0();
+                double CTruth = pHTF.curvature();
+                double phiTruth = pHTF.phi0();
+                double slopeTruth = pHTF.slope();
+                logger.info("d0 " + d0 + " d0 trugh " + d0Truth);
+                d0Diff.fill(d0-d0Truth);
+                z0Diff.fill(z0-z0Truth);
+                phiDiff.fill(phi-phiTruth);
+                rDiff.fill(C-CTruth);
+                slopeDiff.fill(slope-slopeTruth);
+                pDiff.fill(p-pTruth);
+
+                d0DiffGbl.fill(d0Gbl-d0Truth);
+                z0DiffGbl.fill(z0Gbl-z0Truth);
+                phiDiffGbl.fill(phiGbl-phiTruth);
+                rDiffGbl.fill(CGbl-CTruth);
+                slopeDiffGbl.fill(slopeGbl-slopeTruth);
+                pDiffGbl.fill(pGbl-pTruth);
+            }
+
+
+            d0Diff2.fill(d0-d0Gbl);
+            z0Diff2.fill(z0-z0Gbl);
+            phiDiff2.fill(phi-phiGbl);
+            rDiff2.fill(C-CGbl);
+            slopeDiff2.fill(slope-slopeGbl);
+            pDiff2.fill(p-pGbl);
+            
+
+        }
+    
+        
+        
+        
+        
         nTracks.fill(tracks.size());
         nTracksGbl.fill(gblTracks.size());
         nTracksDiff.fill(tracks.size()-gblTracks.size());
         
         
-    }
-    
+        
+        
+    }
+    
+    
+    private double getMag(double p[]) {
+        return Math.sqrt(p[0]*p[0] + p[1]*p[1] + p[2]*p[2]);
+    }
     
     public void endOfData() {
         if (outputPlots != null) {

Modified: java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/PedestalPlots.java
 =============================================================================
--- java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/PedestalPlots.java	(original)
+++ java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/PedestalPlots.java	Fri Jun 12 15:27:10 2015
@@ -1,11 +1,18 @@
 package org.hps.monitoring.drivers.svt;
 
+import hep.aida.IAnalysisFactory;
 import hep.aida.IDataPoint;
 import hep.aida.IDataPointSet;
 import hep.aida.IFitResult;
 import hep.aida.IFitter;
 import hep.aida.IHistogram1D;
 import hep.aida.IHistogram2D;
+import hep.aida.IHistogramFactory;
+import hep.aida.IPlotter;
+import hep.aida.IPlotterFactory;
+import hep.aida.ITree;
+import hep.aida.jfree.plotter.Plotter;
+import hep.aida.jfree.plotter.PlotterRegion;
 import hep.aida.ref.histogram.DataPoint;
 
 import java.io.FileNotFoundException;
@@ -15,7 +22,6 @@
 import java.util.Map;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-
 
 //===> import org.hps.conditions.deprecated.HPSSVTCalibrationConstants;
 //===> import org.hps.conditions.deprecated.SvtUtils;
@@ -33,18 +39,31 @@
  */
 public class PedestalPlots extends Driver {
 
+    static {
+        hep.aida.jfree.AnalysisFactory.register();
+    }
+
+    // Plotting
+    private static ITree tree = null;
+
+    // Histogram maps
+    private static Map<String, IPlotter> plotters = new HashMap<String, IPlotter>();
+    private static Map<String, IHistogram1D> occupancyPlots = new HashMap<String, IHistogram1D>();
+
     private AIDA aida = AIDA.defaultInstance();
-    private Map<SiSensor, IHistogram2D> hists;
-    private Map<SiSensor, int[]> counts;
-    private Map<SiSensor, double[]> means;
-    private Map<SiSensor, double[]> sumsqs;
-    private Map<SiSensor, IDataPointSet[]> plots;
+    List<HpsSiSensor> sensors;
+    private Map<HpsSiSensor, IHistogram2D> hists;
+    private Map<HpsSiSensor, int[]> counts;
+    private Map<HpsSiSensor, double[]> means;
+    private Map<HpsSiSensor, double[]> sumsqs;
+    private Map<HpsSiSensor, IDataPointSet[]> plots;
     private String rawTrackerHitCollectionName = "SVTRawTrackerHits";
     private String fitFile = null;
     private boolean plotTimeSeries = false;
     private static final String subdetectorName = "Tracker";
-    
-    
+    private int eventCount = 0;
+    private int eventRefreshRate = 1;
+
     public void setFitFile(String fitFile) {
         this.fitFile = fitFile;
     }
@@ -53,22 +72,34 @@
         this.plotTimeSeries = plotTimeSeries;
     }
 
+    public void setEventRefreshRate(int eventRefreshRate) {
+        this.eventRefreshRate = eventRefreshRate;
+    }
+
     @Override
     protected void detectorChanged(Detector detector) {
+        IAnalysisFactory analysisFactory = AIDA.defaultInstance().analysisFactory();
+        IPlotterFactory plotterFactory = analysisFactory.createPlotterFactory("SVT Pedestals");
+        IHistogramFactory histogramFactory = null;
 
         aida.tree().cd("/");
 
-        hists = new HashMap<SiSensor, IHistogram2D>();
-        counts = new HashMap<SiSensor, int[]>();
-        means = new HashMap<SiSensor, double[]>();
-        sumsqs = new HashMap<SiSensor, double[]>();
-        plots = new HashMap<SiSensor, IDataPointSet[]>();
-
-        List<SiSensor> sensors = detector.getSubdetector(subdetectorName).getDetectorElement().findDescendants(SiSensor.class);
-        
+        hists = new HashMap<HpsSiSensor, IHistogram2D>();
+        counts = new HashMap<HpsSiSensor, int[]>();
+        means = new HashMap<HpsSiSensor, double[]>();
+        sumsqs = new HashMap<HpsSiSensor, double[]>();
+        plots = new HashMap<HpsSiSensor, IDataPointSet[]>();
+
+        sensors = detector.getSubdetector(subdetectorName).getDetectorElement().findDescendants(HpsSiSensor.class);
+
+        plotters.put("Pedestal vs. channel", plotterFactory.create("Pedestal vs. channel"));
+        plotters.get("Pedestal vs. channel").createRegions(6, 6);
+
         //===> for (SiSensor sensor : SvtUtils.getInstance().getSensors()) {
-        for (SiSensor sensor : sensors) {
-            hists.put(sensor, aida.histogram2D(sensor.getName() + " sample 1 vs. ch", 640, -0.5, 639.5, 500, -500.0, 3000.0));
+        for (HpsSiSensor sensor : sensors) {
+            hists.put(sensor, aida.histogram2D(sensor.getName() + " sample 1 vs. ch", 640, -0.5, 639.5, 100, -500.0, 500.0));
+            plotters.get("Pedestal vs. channel").region(SvtPlotUtils.computePlotterRegion(sensor)).plot(hists.get(sensor), SvtPlotUtils.createStyle(plotterFactory, sensor, "Channel", "Sample 1"));
+
             if (plotTimeSeries) {
                 counts.put(sensor, new int[640]);
                 means.put(sensor, new double[640]);
@@ -81,8 +112,16 @@
             }
         }
 
-
-
+        for (IPlotter plotter : plotters.values()) {
+            for (int regionN = 0; regionN < plotter.numberOfRegions(); regionN++) {
+                PlotterRegion region = ((PlotterRegion) ((Plotter) plotter).region(regionN));
+                if (region.getPlottedObjects().isEmpty()) {
+                    continue;
+                }
+                region.getPanel().addMouseListener(new PopupPlotterListener(region));
+            }
+            plotter.show();
+        }
     }
 
     @Override
@@ -90,12 +129,11 @@
         if (event.hasCollection(RawTrackerHit.class, rawTrackerHitCollectionName)) {
             // Get RawTrackerHit collection from event.
             List<RawTrackerHit> rawTrackerHits = event.get(RawTrackerHit.class, rawTrackerHitCollectionName);
-
+            eventCount++;
             for (RawTrackerHit hit : rawTrackerHits) {
                 HpsSiSensor sensor = (HpsSiSensor) hit.getDetectorElement();
                 int strip = hit.getIdentifierFieldValue("strip");
                 double pedestal = sensor.getPedestal(strip, 0);
-                //===> double pedestal = HPSSVTCalibrationConstants.getPedestal(sensor, strip);
                 hists.get(sensor).fill(strip, hit.getADCValues()[0] - pedestal);
 
                 if (plotTimeSeries) {
@@ -115,10 +153,52 @@
                         sumsqs.get(sensor)[strip] = 0;
                     }
                 }
-            }
-        }
-    }
-
+
+            }
+//            if (eventCount % eventRefreshRate == 0) {
+//                for (HpsSiSensor sensor : sensors) {
+//                    IHistogram2D hist = hists.get(sensor);
+////                    hist.
+//                }
+//            }
+
+        }
+    }
+
+//    private void getMean2D(IHistogram2D hist2D) {
+//        int nx = hist2D.xAxis().bins();
+//        int ny = hist2D.yAxis().bins();
+//        double[][] means = new double[nx][ny];
+//        for (int ix = 0; ix < nx; ix++) {
+//            for (int iy = 0; iy < ny; iy++) {
+//                means[ix][iy] = hist2D.binHeight(ix, iy) / hist2D.binEntries(ix, iy);
+//            }
+//        }
+//        hist2D.reset();
+//        for (int ix = 0; ix < nx; ix++) {
+//            for (int iy = 0; iy < ny; iy++) {
+//                double x = hist2D.xAxis().binCenter(ix);
+//                double y = hist2D.yAxis().binCenter(iy);
+//                hist2D.fill(x, y, means[ix][iy]);
+//            }
+//        }
+//
+//        IFitter fitter = AIDA.defaultInstance().analysisFactory().createFitFactory().createFitter("chi2");
+//
+//    }
+//
+//    IFitResult fitGaussian(IHistogram1D h1d, IFitter fitter, String range) {
+//        double[] init = {h1d.maxBinHeight(), h1d.mean(), h1d.rms()};
+//        IFitResult ifr = null;
+//        try {
+//            ifr = fitter.fit(h1d, "g", init, range);
+//        } catch (RuntimeException ex) {
+//            System.out.println(this.getClass().getSimpleName() + ":  caught exception in fitGaussian");
+//        }
+//        return ifr;
+////        double[] init = {20.0, 0.0, 1.0, 20, -1};
+////        return fitter.fit(h1d, "g+p1", init, range);
+//    }
     @Override
     public void endOfData() {
         if (fitFile == null) {

Modified: java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/PopupPlotterListener.java
 =============================================================================
--- java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/PopupPlotterListener.java	(original)
+++ java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/PopupPlotterListener.java	Fri Jun 12 15:27:10 2015
@@ -7,8 +7,8 @@
 import hep.aida.jfree.plotter.Plotter;
 import hep.aida.jfree.plotter.PlotterFactory;
 import hep.aida.jfree.AnalysisFactory;
-
 import hep.aida.IHistogram;
+import hep.aida.IPlotterStyle;
 
 /**
  *  A MouseListener used to pop up a separate window with a plotter in it when 
@@ -21,8 +21,8 @@
  */
 public class PopupPlotterListener extends ChartPanelMouseListener {
 
-    PlotterRegion plotterRegion; 
-    Plotter plotter = null; 
+    private PlotterRegion plotterRegion = null; 
+    private static Plotter plotter = null; 
     IHistogram histogram;
     PlotterFactory plotterFactory = (PlotterFactory) AnalysisFactory.create().createPlotterFactory(); 
     
@@ -41,12 +41,45 @@
      */
     @Override
     public void mouseClicked(MouseEvent e) {
-       
+     
+            if (plotter == null) {
+                plotter = (Plotter) plotterFactory.create();
+                plotter.createRegion(0);
+            } else {  
+                ((PlotterRegion) plotter.region(0)).clear();
+            }
+            
             histogram = ((IHistogram) plotterRegion.getPlottedObjects().get(0));
-            plotter = (Plotter) plotterFactory.create(); 
-            plotter.createRegion();
-            plotter.region(0).setStyle(plotterRegion.style());
-            plotter.region(0).plot(histogram);
+            plotter.region(0).plot(histogram, this.createStyle());
             plotter.show();
     }
+    
+    /**
+     *  Create a plotter style.
+     * 
+     * @return plotter style
+     */
+    IPlotterStyle createStyle() {
+        
+        // Create a default style
+        IPlotterStyle style = this.plotterFactory.createPlotterStyle();
+        
+        // Turn off the histogram grid 
+        style.gridStyle().setVisible(false);
+        
+        // Set the style of the data
+        style.dataStyle().lineStyle().setVisible(false);
+        style.dataStyle().outlineStyle().setVisible(false);
+        style.dataStyle().outlineStyle().setThickness(3);
+        style.dataStyle().fillStyle().setVisible(true);
+        style.dataStyle().fillStyle().setOpacity(.30);
+        style.dataStyle().fillStyle().setColor("31, 137, 229, 1");
+        style.dataStyle().outlineStyle().setColor("31, 137, 229, 1");
+        style.dataStyle().errorBarStyle().setVisible(false);
+        
+        // Turn off the legend
+        style.legendBoxStyle().setVisible(false);
+       
+        return style;
+    }
 }

Modified: java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SamplesPlots.java
 =============================================================================
--- java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SamplesPlots.java	(original)
+++ java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SamplesPlots.java	Fri Jun 12 15:27:10 2015
@@ -11,150 +11,151 @@
 import hep.aida.IPlotterFactory;
 import hep.aida.IPlotterStyle;
 
-import org.lcsim.util.Driver; 
+import org.lcsim.util.Driver;
 import org.lcsim.geometry.Detector;
 import org.lcsim.detector.tracker.silicon.HpsSiSensor;
 import org.lcsim.event.EventHeader;
 import org.lcsim.event.RawTrackerHit;
-
+import org.lcsim.util.aida.AIDA;
 
 /**
- *  Monitoring driver that plots the raw hit samples for each of the hits
- *  on a sensor.
- * 
- *  @author Omar Moreno <[log in to unmask]>
+ * Monitoring driver that plots the raw hit samples for each of the hits on a
+ * sensor.
+ *
+ * @author Omar Moreno <[log in to unmask]>
  */
 public class SamplesPlots extends Driver {
 
     // TODO: Add documentation
-	
     static {
         hep.aida.jfree.AnalysisFactory.register();
-    } 
+    }
 
-    static IHistogramFactory histogramFactory = IAnalysisFactory.create().createHistogramFactory(null);
-	IPlotterFactory plotterFactory = IAnalysisFactory.create().createPlotterFactory();
+    protected Map<String, IPlotter> plotters = new HashMap<String, IPlotter>();
+    protected Map<HpsSiSensor, IHistogram2D> samplesPlots = new HashMap<HpsSiSensor, IHistogram2D>();
+    private List<HpsSiSensor> sensors;
 
-	protected Map<String, IPlotter> plotters = new HashMap<String, IPlotter>();
-	protected Map<HpsSiSensor, IHistogram2D> samplesPlots = new HashMap<HpsSiSensor, IHistogram2D>();
-    private List<HpsSiSensor> sensors;
-	
     private static final String SUBDETECTOR_NAME = "Tracker";
     private String rawTrackerHitCollectionName = "SVTRawTrackerHits";
-   
+
     private int computePlotterRegion(HpsSiSensor sensor) {
 
-		if (sensor.getLayerNumber() < 7) {
-		    if (sensor.isTopLayer()) {
-		        return 2*(sensor.getLayerNumber() - 1); 
-			} else { 
-				return 2*(sensor.getLayerNumber() - 1) + 1;
-			}
-		} else { 
-		
-			if (sensor.isTopLayer()) {
-				if (sensor.getSide() == HpsSiSensor.POSITRON_SIDE) {
-					return 4*(sensor.getLayerNumber() - 7);
-				} else { 
-					return 4*(sensor.getLayerNumber() - 7) + 1;
-				}
-			} else if (sensor.isBottomLayer()) {
-				if (sensor.getSide() == HpsSiSensor.POSITRON_SIDE) {
-					return 4*(sensor.getLayerNumber() - 7) + 2;
-				} else {
-					return 4*(sensor.getLayerNumber() - 7) + 3;
-				}
-				}
-		}
-		
-		return -1; 
+        if (sensor.getLayerNumber() < 7) {
+            if (sensor.isTopLayer()) {
+                return 2 * (sensor.getLayerNumber() - 1);
+            } else {
+                return 2 * (sensor.getLayerNumber() - 1) + 1;
+            }
+        } else {
+
+            if (sensor.isTopLayer()) {
+                if (sensor.getSide() == HpsSiSensor.POSITRON_SIDE) {
+                    return 4 * (sensor.getLayerNumber() - 7);
+                } else {
+                    return 4 * (sensor.getLayerNumber() - 7) + 1;
+                }
+            } else if (sensor.isBottomLayer()) {
+                if (sensor.getSide() == HpsSiSensor.POSITRON_SIDE) {
+                    return 4 * (sensor.getLayerNumber() - 7) + 2;
+                } else {
+                    return 4 * (sensor.getLayerNumber() - 7) + 3;
+                }
+            }
+        }
+
+        return -1;
     }
-    
+
     protected void detectorChanged(Detector detector) {
-   
-		sensors 
-			= detector.getSubdetector(SUBDETECTOR_NAME).getDetectorElement().findDescendants(HpsSiSensor.class);
-   
+        IAnalysisFactory analysisFactory = AIDA.defaultInstance().analysisFactory();
+        IPlotterFactory plotterFactory = analysisFactory.createPlotterFactory("SVT Raw Samples");
+        IHistogramFactory histogramFactory = AIDA.defaultInstance().histogramFactory();
+
+        sensors
+                = detector.getSubdetector(SUBDETECTOR_NAME).getDetectorElement().findDescendants(HpsSiSensor.class);
+
         if (sensors.size() == 0) {
             throw new RuntimeException("No sensors were found in this detector.");
         }
-       
+
         plotters.put("L1-L3 Raw hit samples", plotterFactory.create("L1-L3 Raw hit samples"));
         plotters.get("L1-L3 Raw hit samples").createRegions(6, 2);
-       
+
         plotters.put("L4-L6 Raw hit samples", plotterFactory.create("L4-L6 Raw hit samples"));
         plotters.get("L4-L6 Raw hit samples").createRegions(6, 4);
 
-        for (HpsSiSensor sensor : sensors) { 
-            
-            samplesPlots.put(sensor, 
-                    histogramFactory.createHistogram2D(sensor.getName() + " - Samples", 6, 0, 6, 1000, 1000, 7000));
-            
+        for (HpsSiSensor sensor : sensors) {
+
+            samplesPlots.put(sensor,
+                    histogramFactory.createHistogram2D(sensor.getName() + " - Samples", 6, 0, 6, 1000, -200.0, 3000));
+
             if (sensor.getLayerNumber() < 7) {
                 plotters.get("L1-L3 Raw hit samples").region(this.computePlotterRegion(sensor))
-                                                     .plot(samplesPlots.get(sensor), this.createStyle("Sample Number", "Amplitude [ADC Counts]"));
-            } else { 
+                        .plot(samplesPlots.get(sensor), this.createStyle(plotterFactory, "Sample Number", "Amplitude [ADC Counts]"));
+            } else {
                 plotters.get("L4-L6 Raw hit samples").region(this.computePlotterRegion(sensor))
-                                                     .plot(samplesPlots.get(sensor), this.createStyle("Sample Number", "Amplitude [ADC Counts]"));
+                        .plot(samplesPlots.get(sensor), this.createStyle(plotterFactory, "Sample Number", "Amplitude [ADC Counts]"));
             }
         }
-        
-		for (IPlotter plotter : plotters.values()) { 
-			plotter.show();
-		}
+
+        for (IPlotter plotter : plotters.values()) {
+            plotter.show();
+        }
     }
 
     public void process(EventHeader event) {
-    
-    	if (!event.hasCollection(RawTrackerHit.class, rawTrackerHitCollectionName))
-    		return;
-    
+
+        if (!event.hasCollection(RawTrackerHit.class, rawTrackerHitCollectionName)) {
+            return;
+        }
+
         // Get RawTrackerHit collection from event.
         List<RawTrackerHit> rawHits = event.get(RawTrackerHit.class, rawTrackerHitCollectionName);
-    	
-    	for (RawTrackerHit rawHit : rawHits) { 
-    	    
-    	    HpsSiSensor sensor = (HpsSiSensor) rawHit.getDetectorElement();
-    	    short[] adcValues = rawHit.getADCValues();
-    	    
-    	    for (int sampleN = 0; sampleN < 6; sampleN++) { 
-    	        samplesPlots.get(sensor).fill(sampleN, adcValues[sampleN]);
-    	    }
-    	}
+
+        for (RawTrackerHit rawHit : rawHits) {
+
+            HpsSiSensor sensor = (HpsSiSensor) rawHit.getDetectorElement();
+            short[] adcValues = rawHit.getADCValues();
+            int strip = rawHit.getIdentifierFieldValue("strip");
+            double pedestal = sensor.getPedestal(strip, 0);
+            for (int sampleN = 0; sampleN < 6; sampleN++) {
+                samplesPlots.get(sensor).fill(sampleN, adcValues[sampleN] - pedestal);
+            }
+        }
     }
-    
-    IPlotterStyle createStyle(String xAxisTitle, String yAxisTitle) { 
-       
+
+    IPlotterStyle createStyle(IPlotterFactory plotterFactory, String xAxisTitle, String yAxisTitle) {
+
         // Create a default style
-        IPlotterStyle style = this.plotterFactory.createPlotterStyle();
-        
+        IPlotterStyle style = plotterFactory.createPlotterStyle();
+
         // Set the style of the X axis
         style.xAxisStyle().setLabel(xAxisTitle);
         style.xAxisStyle().labelStyle().setFontSize(14);
         style.xAxisStyle().setVisible(true);
-        
+
         // Set the style of the Y axis
         style.yAxisStyle().setLabel(yAxisTitle);
         style.yAxisStyle().labelStyle().setFontSize(14);
         style.yAxisStyle().setVisible(true);
-        
+
         // Set the z axis to log scale
         style.zAxisStyle().setScaling("log");
-        
+
         // Turn off the histogram grid 
         style.gridStyle().setVisible(false);
-        
+
         // Set the style of the data
         style.dataStyle().lineStyle().setVisible(false);
         style.dataStyle().outlineStyle().setVisible(false);
         style.dataStyle().outlineStyle().setThickness(3);
         style.dataStyle().fillStyle().setVisible(false);
         style.dataStyle().errorBarStyle().setVisible(false);
-        
+
         // Turn off the legend
         style.legendBoxStyle().setVisible(true);
-       
+
         return style;
     }
-    
+
 }

Modified: java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SensorOccupancyPlotsDriver.java
 =============================================================================
--- java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SensorOccupancyPlotsDriver.java	(original)
+++ java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SensorOccupancyPlotsDriver.java	Fri Jun 12 15:27:10 2015
@@ -1,5 +1,4 @@
 package org.hps.monitoring.drivers.svt;
-
 
 import java.io.IOException;
 import java.util.HashMap;
@@ -11,61 +10,105 @@
 import hep.aida.IHistogramFactory;
 import hep.aida.IPlotter;
 import hep.aida.IPlotterFactory;
+import hep.aida.IPlotterRegion;
 import hep.aida.IPlotterStyle;
 import hep.aida.ITree;
-import hep.aida.ref.rootwriter.RootFileStore;
 import hep.aida.jfree.plotter.Plotter;
 import hep.aida.jfree.plotter.PlotterRegion;
-
+import hep.aida.ref.rootwriter.RootFileStore;
 import hep.physics.vec.Hep3Vector;
+import java.util.HashSet;
+import java.util.Set;
+import org.hps.monitoring.subsys.StatusCode;
+import org.hps.monitoring.subsys.Subsystem;
+import org.hps.monitoring.subsys.SystemStatus;
+import org.hps.monitoring.subsys.SystemStatusImpl;
 
 import org.lcsim.detector.tracker.silicon.HpsSiSensor;
 import org.lcsim.detector.tracker.silicon.ChargeCarrier;
 import org.lcsim.detector.tracker.silicon.SiStrips;
 import org.lcsim.detector.ITransform3D;
 import org.lcsim.event.EventHeader;
+import org.lcsim.event.GenericObject;
 import org.lcsim.event.RawTrackerHit;
 import org.lcsim.geometry.Detector;
 import org.lcsim.util.Driver;
 
+import org.hps.recon.ecal.triggerbank.AbstractIntData;
+import org.hps.recon.ecal.triggerbank.TIData;
+import org.lcsim.util.aida.AIDA;
+
 /**
- * This Driver makes plots of sensor occupancies across a run. It is intended to
- * be used with the monitoring system.
- * 
+ * This Driver makes plots of SVT sensor occupancies across a run.
+ *
  * @author Omar Moreno <[log in to unmask]>
  */
 public class SensorOccupancyPlotsDriver extends Driver {
 
     // TODO: Add documentation
-   static {
+    static {
         hep.aida.jfree.AnalysisFactory.register();
-    } 
-   
-    ITree tree; 
-    IHistogramFactory histogramFactory;
-    IPlotterFactory plotterFactory = IAnalysisFactory.create().createPlotterFactory();
-
-    protected Map<String, IPlotter> plotters = new HashMap<String, IPlotter>();
-    protected Map<HpsSiSensor, IHistogram1D> occupancyPlots = new HashMap<HpsSiSensor, IHistogram1D>();
-    protected Map<HpsSiSensor, IHistogram1D> occupancyVPositionPlots = new HashMap<HpsSiSensor, IHistogram1D>();
-    protected Map<HpsSiSensor, int[]> occupancyMap = new HashMap<HpsSiSensor, int[]>();
+    }
+
+    // Plotting
+    private static ITree tree = null;
+    private IAnalysisFactory analysisFactory = AIDA.defaultInstance().analysisFactory();
+    private IPlotterFactory plotterFactory = analysisFactory.createPlotterFactory("SVT Occupancy");
+    private IHistogramFactory histogramFactory = null;
+
+    // Histogram maps
+    private static Map<String, IPlotter> plotters = new HashMap<String, IPlotter>();
+    private static Map<String, IHistogram1D> occupancyPlots = new HashMap<String, IHistogram1D>();
+    private static Map<String, IHistogram1D> positionPlots = new HashMap<String, IHistogram1D>();
+    private static Map<String, int[]> occupancyMap = new HashMap<String, int[]>();
+    private static Map<String, IHistogram1D> maxSamplePositionPlots = new HashMap<String, IHistogram1D>();
+
     private List<HpsSiSensor> sensors;
-    private Map<HpsSiSensor, Map<Integer, Hep3Vector>> stripPositions = new HashMap<HpsSiSensor, Map<Integer, Hep3Vector>>(); 
+    private Map<HpsSiSensor, Map<Integer, Hep3Vector>> stripPositions = new HashMap<HpsSiSensor, Map<Integer, Hep3Vector>>();
 
     private static final String SUBDETECTOR_NAME = "Tracker";
     private String rawTrackerHitCollectionName = "SVTRawTrackerHits";
-    
+    private String triggerBankCollectionName = "TriggerBank";
+
     String rootFile = null;
 
     private int maxSamplePosition = -1;
-    private int timeWindowWeight = 1; 
+    private int timeWindowWeight = 1;
     private int eventCount = 0;
     private int eventRefreshRate = 1;
     private int runNumber = -1;
-    
+    private int resetPeriod = -1;
+
     private boolean enablePositionPlots = false;
-    
+    private boolean enableMaxSamplePlots = false;
+    private boolean enableTriggerFilter = false;
+    private boolean filterPulserTriggers = false;
+    private boolean filterSingle0Triggers = false;
+    private boolean filterSingle1Triggers = false;
+    private boolean filterPair0Triggers = false;
+    private boolean filterPair1Triggers = false;
+
+    SystemStatus maxSampleStatus;
+    private int maxSampleMonitorStart = 1000;
+    private int maxSampleMonitorPeriod = 100;
+
+    SystemStatus occupancyStatus;
+    private int occupancyMonitorStart = 5000;
+    private int occupancyMonitorPeriod = 100;
+    private double minPeakOccupancy = 0.0001;
+    private double maxPeakOccupancy = 0.01;
+
+    private boolean dropSmallHitEvents = true;
+
     public SensorOccupancyPlotsDriver() {
+        maxSampleStatus = new SystemStatusImpl(Subsystem.SVT, "Checks that SVT is timed in (max sample plot)", true);
+        maxSampleStatus.setStatus(StatusCode.UNKNOWN, "Status is unknown.");
+        occupancyStatus = new SystemStatusImpl(Subsystem.SVT, "Checks SVT occupancy", true);
+        occupancyStatus.setStatus(StatusCode.UNKNOWN, "Status is unknown.");
+    }
+
+    public void setDropSmallHitEvents(boolean dropSmallHitEvents) {
+        this.dropSmallHitEvents = dropSmallHitEvents;
     }
 
     public void setRawTrackerHitCollectionName(String rawTrackerHitCollectionName) {
@@ -75,227 +118,585 @@
     public void setEventRefreshRate(int eventRefreshRate) {
         this.eventRefreshRate = eventRefreshRate;
     }
- 
-    public void setEnablePositionPlots(boolean enablePositionPlots) { 
-        this.enablePositionPlots = enablePositionPlots; 
-    }
-    
-    public void setMaxSamplePosition(int maxSamplePosition) { 
+
+    public void setResetPeriod(int resetPeriod) {
+        this.resetPeriod = resetPeriod;
+    }
+
+    public void setEnablePositionPlots(boolean enablePositionPlots) {
+        this.enablePositionPlots = enablePositionPlots;
+    }
+
+    public void setEnableMaxSamplePlots(boolean enableMaxSamplePlots) {
+        this.enableMaxSamplePlots = enableMaxSamplePlots;
+    }
+
+    public void setEnableTriggerFilter(boolean enableTriggerFilter) {
+        this.enableTriggerFilter = enableTriggerFilter;
+    }
+
+    public void setFilterPulserTriggers(boolean filterPulserTriggers) {
+        this.filterPulserTriggers = filterPulserTriggers;
+    }
+
+    public void setFilterSingle0Triggers(boolean filterSingle0Triggers) {
+        this.filterSingle0Triggers = filterSingle0Triggers;
+    }
+
+    public void setFilterSingle1Triggers(boolean filterSingle1Triggers) {
+        this.filterSingle1Triggers = filterSingle1Triggers;
+    }
+
+    public void setFilterPair0Triggers(boolean filterPair0Triggers) {
+        this.filterPair0Triggers = filterPair0Triggers;
+    }
+
+    public void setFilterPair1Triggers(boolean filterPair1Triggers) {
+        this.filterPair1Triggers = filterPair1Triggers;
+    }
+
+    public void setMaxSamplePosition(int maxSamplePosition) {
         this.maxSamplePosition = maxSamplePosition;
     }
-   
-    public void setTimeWindowWeight(int timeWindowWeight) { 
-       this.timeWindowWeight = timeWindowWeight;   
-    }
-    
-    private int computePlotterRegion(HpsSiSensor sensor) {
-
-        if (sensor.getLayerNumber() < 7) {
-            if (sensor.isTopLayer()) {
-                return 6 * (sensor.getLayerNumber() - 1);
-            } else {
-                return 6 * (sensor.getLayerNumber() - 1) + 1;
-            }
+
+    public void setTimeWindowWeight(int timeWindowWeight) {
+        this.timeWindowWeight = timeWindowWeight;
+    }
+
+    public void setMaxSampleMonitorStart(int maxSampleMonitorStart) {
+        this.maxSampleMonitorStart = maxSampleMonitorStart;
+    }
+
+    public void setMaxSampleMonitorPeriod(int maxSampleMonitorPeriod) {
+        this.maxSampleMonitorPeriod = maxSampleMonitorPeriod;
+    }
+
+    public void setOccupancyMonitorStart(int occupancyMonitorStart) {
+        this.occupancyMonitorStart = occupancyMonitorStart;
+    }
+
+    public void setOccupancyMonitorPeriod(int occupancyMonitorPeriod) {
+        this.occupancyMonitorPeriod = occupancyMonitorPeriod;
+    }
+
+    public void setMinPeakOccupancy(double minPeakOccupancy) {
+        this.minPeakOccupancy = minPeakOccupancy;
+    }
+
+    public void setMaxPeakOccupancy(double maxPeakOccupancy) {
+        this.maxPeakOccupancy = maxPeakOccupancy;
+    }
+
+    /**
+     * Get the global strip position of a physical channel number for a given
+     * sensor.
+     *
+     * @param sensor : HpsSiSensor
+     * @param physicalChannel : physical channel number
+     * @return The strip position (mm) in the global coordinate system
+     */
+    private Hep3Vector getStripPosition(HpsSiSensor sensor, int physicalChannel) {
+        return stripPositions.get(sensor).get(physicalChannel);
+    }
+
+    /**
+     * For each sensor, create a mapping between a physical channel number and
+     * it's global strip position.
+     */
+    // TODO: Move this to a utility class
+    private void createStripPositionMap() {
+        for (HpsSiSensor sensor : sensors) {
+            stripPositions.put(sensor, createStripPositionMap(sensor));
+        }
+    }
+
+    public static Map<Integer, Hep3Vector> createStripPositionMap(HpsSiSensor sensor) {
+        Map<Integer, Hep3Vector> positionMap = new HashMap<Integer, Hep3Vector>();
+        for (ChargeCarrier carrier : ChargeCarrier.values()) {
+            if (sensor.hasElectrodesOnSide(carrier)) {
+                SiStrips strips = (SiStrips) sensor.getReadoutElectrodes(carrier);
+                ITransform3D parentToLocal = sensor.getReadoutElectrodes(carrier).getParentToLocal();
+                ITransform3D localToGlobal = sensor.getReadoutElectrodes(carrier).getLocalToGlobal();
+                for (int physicalChannel = 0; physicalChannel < 640; physicalChannel++) {
+                    Hep3Vector localStripPosition = strips.getCellPosition(physicalChannel);
+                    Hep3Vector stripPosition = parentToLocal.transformed(localStripPosition);
+                    Hep3Vector globalStripPosition = localToGlobal.transformed(stripPosition);
+                    positionMap.put(physicalChannel, globalStripPosition);
+                }
+            }
+        }
+        return positionMap;
+    }
+
+    /**
+     * Create a plotter style.
+     *
+     * @param xAxisTitle : Title of the x axis
+     * @param sensor : HpsSiSensor associated with the plot. This is used to set
+     * certain attributes based on the position of the sensor.
+     * @return plotter style
+     */
+    // TODO: Move this to a utilities class
+    IPlotterStyle createOccupancyPlotStyle(String xAxisTitle, HpsSiSensor sensor, boolean isAlarming) {
+        // Create a default style
+        IPlotterStyle style = this.plotterFactory.createPlotterStyle();
+
+        // Set the style of the X axis
+        style.xAxisStyle().setLabel(xAxisTitle);
+        style.xAxisStyle().labelStyle().setFontSize(14);
+        style.xAxisStyle().setVisible(true);
+
+        // Set the style of the Y axis
+        style.yAxisStyle().setLabel("Occupancy");
+        style.yAxisStyle().labelStyle().setFontSize(14);
+        style.yAxisStyle().setVisible(true);
+
+        // Turn off the histogram grid 
+        style.gridStyle().setVisible(false);
+
+        // Set the style of the data
+        style.dataStyle().lineStyle().setVisible(false);
+        style.dataStyle().outlineStyle().setVisible(false);
+        style.dataStyle().outlineStyle().setThickness(3);
+        style.dataStyle().fillStyle().setVisible(true);
+        style.dataStyle().fillStyle().setOpacity(.30);
+        if (sensor.isTopLayer()) {
+            style.dataStyle().fillStyle().setColor("31, 137, 229, 1");
+            style.dataStyle().outlineStyle().setColor("31, 137, 229, 1");
         } else {
-
-            if (sensor.isTopLayer()) {
-                if (sensor.getSide() == HpsSiSensor.POSITRON_SIDE) {
-                    return 6 * (sensor.getLayerNumber() - 7) + 2;
-                } else {
-                    return 6 * (sensor.getLayerNumber() - 7) + 3;
-                }
-            } else if (sensor.isBottomLayer()) {
-                if (sensor.getSide() == HpsSiSensor.POSITRON_SIDE) {
-                    return 6 * (sensor.getLayerNumber() - 7) + 4;
-                } else {
-                    return 6 * (sensor.getLayerNumber() - 7) + 5;
-                }
-            }
-        }
-
-        return -1;
-    }
-    
+            style.dataStyle().fillStyle().setColor("93, 228, 47, 1");
+            style.dataStyle().outlineStyle().setColor("93, 228, 47, 1");
+        }
+        style.dataStyle().errorBarStyle().setVisible(false);
+
+        // Turn off the legend
+        style.legendBoxStyle().setVisible(false);
+
+        style.regionBoxStyle().backgroundStyle().setOpacity(.20);
+        setBackgroundColor(style, sensor.isAxial(), isAlarming);
+
+        return style;
+    }
+
+    private void setBackgroundColor(IPlotterStyle style, boolean isAxial, boolean isAlarming) {
+        if (isAlarming) {
+            style.regionBoxStyle().backgroundStyle().setColor("246, 34, 34, 1");
+            return;
+        }
+        if (isAxial) {
+            style.regionBoxStyle().backgroundStyle().setColor("246, 246, 34, 1");
+        }
+    }
+
+    /**
+     * Clear all histograms of it's current data.
+     */
+    private void resetPlots() {
+
+        // Clear the hit counter map of all previously stored data. 
+        occupancyMap.clear();
+
+        // Since all plots are mapped to the name of a sensor, loop 
+        // through the sensors, get the corresponding plots and clear them.
+        for (HpsSiSensor sensor : sensors) {
+
+            // Clear the occupancy plots.
+            occupancyPlots.get(sensor.getName()).reset();
+
+            if (enablePositionPlots) {
+                positionPlots.get(sensor.getName()).reset();
+            }
+
+            if (enableMaxSamplePlots) {
+                maxSamplePositionPlots.get(sensor.getName()).reset();
+            }
+
+            // Reset the hit counters.
+            occupancyMap.put(sensor.getName(), new int[640]);
+        }
+    }
+
+    private static int getLayerNumber(HpsSiSensor sensor) {
+        return (int) Math.ceil(((double) sensor.getLayerNumber()) / 2);
+    }
+
+    @Override
     protected void detectorChanged(Detector detector) {
 
+        // Get the HpsSiSensor objects from the geometry
         sensors = detector.getSubdetector(SUBDETECTOR_NAME).getDetectorElement().findDescendants(HpsSiSensor.class);
 
-        if (sensors.size() == 0) {
+        // If there were no sensors found, throw an exception
+        if (sensors.isEmpty()) {
             throw new RuntimeException("There are no sensors associated with this detector");
         }
-        
-        // Create a Map from sensor to bad channels and from bad channels to
-        // strip position
-        for(ChargeCarrier carrier : ChargeCarrier.values()){
-            for(HpsSiSensor sensor : sensors){ 
-                //System.out.println("HpsSiSensor: " + sensor.toString());
-                if(sensor.hasElectrodesOnSide(carrier)){ 
-                    stripPositions.put(sensor, new HashMap<Integer, Hep3Vector>());
-                    SiStrips strips = (SiStrips) sensor.getReadoutElectrodes(carrier);     
-                    ITransform3D parentToLocal = sensor.getReadoutElectrodes(carrier).getParentToLocal();
-                    ITransform3D localToGlobal = sensor.getReadoutElectrodes(carrier).getLocalToGlobal();
-                    for(int physicalChannel = 0; physicalChannel < 640; physicalChannel++){
-                        Hep3Vector localStripPosition = strips.getCellPosition(physicalChannel);
-                        Hep3Vector stripPosition = parentToLocal.transformed(localStripPosition);
-                        Hep3Vector globalStripPosition = localToGlobal.transformed(stripPosition);
-                        //System.out.println("Channel: " + physicalChannel + " localStripPosition: " + localStripPosition.toString());
-                        //System.out.println("Channel: " + physicalChannel + " stripPosition: " + stripPosition.toString());
-                        //System.out.println("Channel: " + physicalChannel + " globalStripPosition: " + globalStripPosition.toString());
-                        stripPositions.get(sensor).put(physicalChannel, globalStripPosition);
-                    }
-                }
-            }
-        }
-
-        tree = IAnalysisFactory.create().createTreeFactory().create();
-        histogramFactory = IAnalysisFactory.create().createHistogramFactory(tree);
-
+
+        // For each sensor, create a mapping between a physical channel number
+        // and the global strip position
+        this.createStripPositionMap();
+
+//        // If the tree already exist, clear all existing plots of any old data
+//        // they might contain.
+//        if (tree != null) { 
+//            this.resetPlots();
+//            return; 
+//        }
+        tree = analysisFactory.createTreeFactory().create();
+        histogramFactory = analysisFactory.createHistogramFactory(tree);
+
+        // Create the plotter and regions.  A region is created for each
+        // sensor for a total of 36.
         plotters.put("Occupancy", plotterFactory.create("Occupancy"));
         plotters.get("Occupancy").createRegions(6, 6);
 
-        if (enablePositionPlots) { 
+        occupancyStatus.setStatus(StatusCode.UNKNOWN, "Not enough statistics yet.");
+
+        if (enablePositionPlots) {
             plotters.put("Occupancy vs Position", plotterFactory.create("Occupancy vs Position"));
             plotters.get("Occupancy vs Position").createRegions(6, 6);
         }
-        
+
+        if (enableMaxSamplePlots) {
+            plotters.put("Max Sample Number", plotterFactory.create("Max Sample Number"));
+            plotters.get("Max Sample Number").createRegions(6, 6);
+            maxSampleStatus.setStatus(StatusCode.UNKNOWN, "Not enough statistics yet.");
+        } else {
+            maxSampleStatus.setStatus(StatusCode.UNKNOWN, "Monitor disabled in steering file.");
+        }
+
         for (HpsSiSensor sensor : sensors) {
-            occupancyPlots.put(sensor, histogramFactory.createHistogram1D(sensor.getName() + " - Occupancy", 640, 0, 640));
-            plotters.get("Occupancy").region(this.computePlotterRegion(sensor))
-                                     .plot(occupancyPlots.get(sensor), this.createOccupancyPlotStyle(sensor));
-        
+            occupancyPlots.put(sensor.getName(), histogramFactory.createHistogram1D(sensor.getName() + " - Occupancy", 640, 0, 640));
+            plotters.get("Occupancy").region(SvtPlotUtils.computePlotterRegion(sensor))
+                    .plot(occupancyPlots.get(sensor.getName()), this.createOccupancyPlotStyle("Physical Channel", sensor, false));
+
             if (enablePositionPlots) {
-                occupancyVPositionPlots.put(sensor, histogramFactory.createHistogram1D(sensor.getName() + " - Occupancy vs Position", 1000, 0, 60));
-                plotters.get("Occupancy vs Position").region(this.computePlotterRegion(sensor))
-                                                     .plot(occupancyVPositionPlots.get(sensor), this.createOccupancyPlotStyle(sensor));
-            }
-            
-            occupancyMap.put(sensor, new int[640]);
+                if (sensor.isTopLayer()) {
+                    positionPlots.put(sensor.getName(),
+                            histogramFactory.createHistogram1D(sensor.getName() + " - Occupancy vs Position", 1000, 0, 60));
+                } else {
+                    positionPlots.put(sensor.getName(),
+                            histogramFactory.createHistogram1D(sensor.getName() + " - Occupancy vs Position", 1000, -60, 0));
+                }
+
+                plotters.get("Occupancy vs Position").region(SvtPlotUtils.computePlotterRegion(sensor))
+                        .plot(positionPlots.get(sensor.getName()), this.createOccupancyPlotStyle("Distance from Beam [mm]", sensor, false));
+            }
+            occupancyMap.put(sensor.getName(), new int[640]);
+
+            if (enableMaxSamplePlots) {
+                maxSamplePositionPlots.put(sensor.getName(), histogramFactory.createHistogram1D(sensor.getName() + " - Max Sample Number", 6, 0, 6));
+                plotters.get("Max Sample Number").region(SvtPlotUtils.computePlotterRegion(sensor))
+                        .plot(maxSamplePositionPlots.get(sensor.getName()),
+                                this.createOccupancyPlotStyle("Max Sample Number", sensor, false));
+            }
         }
 
         for (IPlotter plotter : plotters.values()) {
-            for (int regionN = 0; regionN < 36; regionN++) { 
+            for (int regionN = 0; regionN < plotter.numberOfRegions(); regionN++) {
                 PlotterRegion region = ((PlotterRegion) ((Plotter) plotter).region(regionN));
+                if (region.getPlottedObjects().isEmpty()) {
+                    continue;
+                }
                 region.getPanel().addMouseListener(new PopupPlotterListener(region));
             }
             plotter.show();
         }
     }
 
+    private boolean passTriggerFilter(List<GenericObject> triggerBanks) {
+
+        // Loop through the collection of banks and get the TI banks.
+        for (GenericObject triggerBank : triggerBanks) {
+
+            // If the bank contains TI data, process it
+            if (AbstractIntData.getTag(triggerBank) == TIData.BANK_TAG) {
+
+                TIData tiData = new TIData(triggerBank);
+
+                if (filterPulserTriggers && tiData.isPulserTrigger()) {
+                    return false;
+                } else if (filterSingle0Triggers && tiData.isSingle0Trigger()) {
+                    return false;
+                } else if (filterSingle1Triggers && tiData.isSingle1Trigger()) {
+                    return false;
+                } else if (filterPair0Triggers && tiData.isPair0Trigger()) {
+                    return false;
+                } else if (filterPair1Triggers && tiData.isPair1Trigger()) {
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
+    @Override
     public void process(EventHeader event) {
 
-        if (runNumber == -1) runNumber = event.getRunNumber();
-        
-        if (!event.hasCollection(RawTrackerHit.class, rawTrackerHitCollectionName))
+        // Get the run number from the event and store it.  This will be used 
+        // when writing the plots out to a ROOT file
+        if (runNumber == -1) {
+            runNumber = event.getRunNumber();
+        }
+
+        if (enableTriggerFilter && event.hasCollection(GenericObject.class, triggerBankCollectionName)) {
+
+            // Get the list of trigger banks from the event
+            List<GenericObject> triggerBanks = event.get(GenericObject.class, triggerBankCollectionName);
+
+            // Apply the trigger filter
+            if (!passTriggerFilter(triggerBanks)) {
+                return;
+            }
+        }
+
+        // If the event doesn't have a collection of RawTrackerHit's, skip it.
+        if (!event.hasCollection(RawTrackerHit.class, rawTrackerHitCollectionName)) {
             return;
-
-        eventCount++;
-
+        }
         // Get RawTrackerHit collection from event.
         List<RawTrackerHit> rawHits = event.get(RawTrackerHit.class, rawTrackerHitCollectionName);
 
+        if (dropSmallHitEvents && SvtPlotUtils.countSmallHits(rawHits) > 3) {
+            return;
+        }
+
+        if (resetPeriod > 0 && eventCount > resetPeriod) { //reset occupancy numbers after resetPeriod events
+            eventCount = 0;
+            resetPlots();
+        }
+
+        eventCount++;
+
         // Increment strip hit count.
         for (RawTrackerHit rawHit : rawHits) {
-            
+
             // Obtain the raw ADC samples for each of the six samples readout
             short[] adcValues = rawHit.getADCValues();
-            
+
             // Find the sample that has the largest amplitude.  This should
             // correspond to the peak of the shaper signal if the SVT is timed
             // in correctly.  Otherwise, the maximum sample value will default 
             // to 0.
             int maxAmplitude = 0;
             int maxSamplePositionFound = -1;
-            for (int sampleN = 0; sampleN < 6; sampleN++) { 
-                if (adcValues[sampleN] > maxAmplitude) { 
+            for (int sampleN = 0; sampleN < 6; sampleN++) {
+                if (adcValues[sampleN] > maxAmplitude) {
                     maxAmplitude = adcValues[sampleN];
-                    maxSamplePositionFound = sampleN; 
-                }
-            }
-           
-            if (maxSamplePosition == -1 || maxSamplePosition == maxSamplePositionFound) { 
-                occupancyMap.get((HpsSiSensor) rawHit.getDetectorElement())[rawHit.getIdentifierFieldValue("strip")]++;
-            }
+                    maxSamplePositionFound = sampleN;
+                }
+            }
+
+            if (maxSamplePosition == -1 || maxSamplePosition == maxSamplePositionFound) {
+                occupancyMap.get(((HpsSiSensor) rawHit.getDetectorElement()).getName())[rawHit.getIdentifierFieldValue("strip")]++;
+            }
+
+            if (enableMaxSamplePlots) {
+                maxSamplePositionPlots.get(((HpsSiSensor) rawHit.getDetectorElement()).getName()).fill(maxSamplePositionFound);
+            }
+        }
+
+        if (enableMaxSamplePlots && eventCount > maxSampleMonitorStart && eventCount % maxSampleMonitorPeriod == 0) {
+            checkMaxSample();
+        }
+
+        if (eventCount > occupancyMonitorStart && eventCount % occupancyMonitorPeriod == 0) {
+            checkOccupancy();
         }
 
         // Plot strip occupancies.
         if (eventCount % eventRefreshRate == 0) {
             for (HpsSiSensor sensor : sensors) {
-                int[] strips = occupancyMap.get(sensor);
-                occupancyPlots.get(sensor).reset();
-                if (enablePositionPlots) occupancyVPositionPlots.get(sensor).reset();
+                int[] strips = occupancyMap.get(sensor.getName());
+                occupancyPlots.get(sensor.getName()).reset();
+                if (enablePositionPlots) {
+                    positionPlots.get(sensor.getName()).reset();
+                }
                 for (int channel = 0; channel < strips.length; channel++) {
                     double stripOccupancy = (double) strips[channel] / (double) eventCount;
                     stripOccupancy /= this.timeWindowWeight;
-                    occupancyPlots.get(sensor).fill(channel, stripOccupancy);
-              
+                    occupancyPlots.get(sensor.getName()).fill(channel, stripOccupancy);
+
                     if (enablePositionPlots) {
                         double stripPosition = this.getStripPosition(sensor, channel).y();
-                        stripPosition = Math.abs(stripPosition);
-                        occupancyVPositionPlots.get(sensor).fill(stripPosition, stripOccupancy);
+                        positionPlots.get(sensor.getName()).fill(stripPosition, stripOccupancy);
                     }
                 }
             }
         }
-    }
-    
-    public void endOfData() { 
-      
+
+        if (plotters.get("Occupancy") != null) {
+            plotters.get("Occupancy").refresh();
+        }
+    }
+
+    private void checkMaxSample() {
+        StatusCode oldStatus = maxSampleStatus.getStatusCode();
+        boolean isSystemOK = true;
+        for (HpsSiSensor sensor : sensors) {
+            IHistogram1D maxSamplePlot = maxSamplePositionPlots.get(sensor.getName());
+            IPlotterRegion region = plotters.get("Max Sample Number").region(SvtPlotUtils.computePlotterRegion(sensor));
+
+            boolean isSensorOK = maxSamplePlot.binEntries(maxSamplePosition) > maxSamplePlot.binEntries(maxSamplePosition - 1)
+                    && maxSamplePlot.binEntries(maxSamplePosition) > maxSamplePlot.binEntries(maxSamplePosition + 1);
+            if (!isSensorOK) {
+                isSystemOK = false;
+                if (oldStatus != StatusCode.ALARM) {
+                    maxSampleStatus.setStatus(StatusCode.ALARM, "Sensor " + sensor.getName() + " looks out of time.");
+                }
+                IPlotterStyle plotterStyle = createOccupancyPlotStyle("Max Sample Number", sensor, true);
+//                region.clear();
+//                region.plot(maxSamplePlot, plotterStyle);
+                region.applyStyle(plotterStyle);
+//                region.style().regionBoxStyle().backgroundStyle().setColor("246, 34, 34, 1");
+//                setBackgroundColor(region.style(),sensor.isAxial(),true);
+
+            } else {
+                IPlotterStyle plotterStyle = createOccupancyPlotStyle("Max Sample Number", sensor, false);
+//                region.clear();
+//                region.plot(maxSamplePlot, plotterStyle);
+                region.applyStyle(plotterStyle);
+//                setBackgroundColor(region.style(),sensor.isAxial(),false);
+            }
+        }
+        if (isSystemOK) {
+            if (oldStatus != StatusCode.OKAY) {
+                maxSampleStatus.setStatus(StatusCode.OKAY, "All sensors are timed in.");
+            }
+        }
+    }
+
+    private void checkOccupancy() {
+        StatusCode oldStatus = occupancyStatus.getStatusCode();
+        boolean isSystemOK = true;
+        for (HpsSiSensor sensor : sensors) {
+            IHistogram1D occupancyPlot = occupancyPlots.get(sensor.getName());
+            IPlotterRegion region = plotters.get("Occupancy").region(SvtPlotUtils.computePlotterRegion(sensor));
+
+            double apvOccupancy[] = new double[5];
+            for (int i = 0; i < occupancyPlot.axis().bins(); i++) {
+                apvOccupancy[i / 128] += occupancyPlot.binHeight(i);
+            }
+            for (int i = 0; i < 5; i++) {
+                apvOccupancy[i] /= 128.0;
+            }
+
+            boolean isSensorOK = isOccupancyOK(apvOccupancy);
+            if (!isSensorOK) {
+                System.out.format("%s: %f %f %f %f %f\n", sensor.getName(), apvOccupancy[0], apvOccupancy[1], apvOccupancy[2], apvOccupancy[3], apvOccupancy[4]);
+                isSystemOK = false;
+                if (oldStatus != StatusCode.ALARM) {
+                    occupancyStatus.setStatus(StatusCode.ALARM, "Sensor " + sensor.getName() + " occupancy abnormal.");
+                }
+                IPlotterStyle plotterStyle = createOccupancyPlotStyle("Max Sample Number", sensor, true);
+//                region.clear();
+//                region.plot(occupancyPlot, plotterStyle);
+                region.applyStyle(plotterStyle);
+
+            } else {
+                IPlotterStyle plotterStyle = createOccupancyPlotStyle("Max Sample Number", sensor, false);
+//                region.clear();
+//                region.plot(occupancyPlot, plotterStyle);
+                region.applyStyle(plotterStyle);
+            }
+        }
+        if (isSystemOK) {
+            if (oldStatus != StatusCode.OKAY) {
+                occupancyStatus.setStatus(StatusCode.OKAY, "Occupancy looks OK.");
+            }
+        }
+    }
+
+    private boolean isOccupancyOK(double[] apvOccupancy) {
+        double peakOccupancy = 0;
+        int highestApv = -1;
+        for (int i = 0; i < 5; i++) {
+            if (apvOccupancy[i] > peakOccupancy) {
+                peakOccupancy = apvOccupancy[i];
+                highestApv = i;
+            }
+        }
+        if (highestApv != 0 && highestApv != 4) {
+            System.out.println("peak occupancy not at edge");
+            return false;
+        }
+        if (peakOccupancy > maxPeakOccupancy || peakOccupancy < minPeakOccupancy) {
+            System.out.println("peak occupancy out of range");
+            return false;
+        }
+        if (highestApv == 0) {
+            for (int i = 4; i > 0; i--) {
+                if (apvOccupancy[i] < 0.1 * peakOccupancy || apvOccupancy[i] < minPeakOccupancy) {
+                    continue; //skip through the tail end of the sensor
+                }
+                if (0.9 * apvOccupancy[i] > apvOccupancy[i - 1]) {
+                    System.out.println("occupancy not monotonic");
+                    return false;
+                }
+            }
+        } else if (highestApv == 4) {
+            for (int i = 0; i < 4; i++) {
+                if (apvOccupancy[i] < 0.1 * peakOccupancy || apvOccupancy[i] < minPeakOccupancy) {
+                    continue; //skip through the tail end of the sensor
+                }
+                if (0.9 * apvOccupancy[i] > apvOccupancy[i + 1]) {
+                    System.out.println("occupancy not monotonic");
+                    return false;
+                }
+            }
+        }
+
+        return true;
+    }
+
+    @Override
+    public void endOfData() {
+
         rootFile = "run" + runNumber + "_occupancy.root";
         RootFileStore store = new RootFileStore(rootFile);
         try {
             store.open();
             store.add(tree);
-            store.close(); 
+            store.close();
         } catch (IOException e) {
             e.printStackTrace();
         }
-    }
-    
-    /**
-     * .
-     */
-    private Hep3Vector getStripPosition(HpsSiSensor sensor, int physicalChannel){ 
-        return stripPositions.get(sensor).get(physicalChannel);
-    }
-
-    IPlotterStyle createOccupancyPlotStyle(HpsSiSensor sensor) {
-        // Create a default style
-        IPlotterStyle style = this.plotterFactory.createPlotterStyle();
-        
-        // Set the style of the X axis
-        style.xAxisStyle().setLabel("Channel");
-        style.xAxisStyle().labelStyle().setFontSize(14);
-        style.xAxisStyle().setVisible(true);
-        
-        // Set the style of the Y axis
-        style.yAxisStyle().setLabel("Occupancy");
-        style.yAxisStyle().labelStyle().setFontSize(14);
-        style.yAxisStyle().setVisible(true);
-        
-        // Turn off the histogram grid 
-        style.gridStyle().setVisible(false);
-        
-        // Set the style of the data
-        style.dataStyle().lineStyle().setVisible(false);
-        style.dataStyle().outlineStyle().setVisible(true);
-        style.dataStyle().outlineStyle().setThickness(3);
-        style.dataStyle().fillStyle().setVisible(true);
-        style.dataStyle().fillStyle().setOpacity(.10);
-        if (sensor.isTopLayer()) { 
-            style.dataStyle().fillStyle().setColor("31, 137, 229, 1");
-            style.dataStyle().outlineStyle().setColor("31, 137, 229, 1");
-        } else { 
-            style.dataStyle().fillStyle().setColor("93, 228, 47, 1");
-            style.dataStyle().outlineStyle().setColor("93, 228, 47, 1");
-        }
-        style.dataStyle().errorBarStyle().setVisible(false);
-        
-        // Turn off the legend
-        style.legendBoxStyle().setVisible(false);
-       
-        style.regionBoxStyle().backgroundStyle().setOpacity(.10);
-        if (sensor.isAxial()) style.regionBoxStyle().backgroundStyle().setColor("229, 114, 31, 1");
-        
-        return style;
+
+        System.out.println("%===============================================================================%");
+        System.out.println("%======================== Active Edge Sensor Occupancies =======================%");
+        System.out.println("%===============================================================================%");
+        System.out.println("% Total Events: " + eventCount);
+        // Calculate the occupancies at the sensor edge
+        int[] topActiveEdgeStripOccupancy = new int[6];
+        int[] bottomActiveEdgeStripOccupancy = new int[6];
+        for (HpsSiSensor sensor : sensors) {
+            if (sensor.isTopLayer() && sensor.isAxial()) {
+                if (sensor.getSide().equals(HpsSiSensor.ELECTRON_SIDE)) {
+                    System.out.println("% Top Layer " + getLayerNumber(sensor) + " Hit Counts: " + occupancyMap.get(sensor.getName())[1]);
+                    topActiveEdgeStripOccupancy[getLayerNumber(sensor) - 1] += occupancyMap.get(sensor.getName())[1];
+                } else {
+                    System.out.println("% Top Layer " + getLayerNumber(sensor) + " Hit Counts: " + occupancyMap.get(sensor.getName())[638]);
+                    topActiveEdgeStripOccupancy[getLayerNumber(sensor) - 1] += occupancyMap.get(sensor.getName())[638];
+                }
+            } else if (sensor.isBottomLayer() && sensor.isAxial()) {
+                if (sensor.getSide().equals(HpsSiSensor.ELECTRON_SIDE)) {
+                    System.out.println("% Bottom Layer " + getLayerNumber(sensor) + " Hit Counts: " + occupancyMap.get(sensor.getName())[1]);
+                    bottomActiveEdgeStripOccupancy[getLayerNumber(sensor) - 1] += occupancyMap.get(sensor.getName())[1];
+                } else {
+                    System.out.println("% Bottom Layer " + getLayerNumber(sensor) + " Hit Counts: " + occupancyMap.get(sensor.getName())[638]);
+                    bottomActiveEdgeStripOccupancy[getLayerNumber(sensor) - 1] += occupancyMap.get(sensor.getName())[638];
+                }
+            }
+        }
+
+        for (int layerN = 0; layerN < 6; layerN++) {
+            double topStripOccupancy = (double) topActiveEdgeStripOccupancy[layerN] / (double) eventCount;
+            topStripOccupancy /= this.timeWindowWeight;
+            System.out.println("% Top Layer " + (layerN + 1) + ": Occupancy in " + (24 / this.timeWindowWeight) + " ns window: " + topStripOccupancy);
+            double botStripOccupancy = (double) bottomActiveEdgeStripOccupancy[layerN] / (double) eventCount;
+            botStripOccupancy /= this.timeWindowWeight;
+            System.out.println("% Bottom Layer " + (layerN + 1) + ": Occupancy in " + (24 / this.timeWindowWeight) + " ns window: " + botStripOccupancy);
+        }
+        System.out.println("%===============================================================================%");
+        System.out.println("%===============================================================================%");
     }
 }

Modified: java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SvtHitPlots.java
 =============================================================================
--- java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SvtHitPlots.java	(original)
+++ java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SvtHitPlots.java	Fri Jun 12 15:27:10 2015
@@ -6,248 +6,300 @@
 import hep.aida.IPlotter;
 import hep.aida.IPlotterFactory;
 import hep.aida.IPlotterStyle;
+import hep.aida.ITree;
+import hep.aida.jfree.plotter.Plotter;
+import hep.aida.jfree.plotter.PlotterRegion;
 
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.lcsim.detector.tracker.silicon.HpsSiSensor;
-import org.lcsim.util.Driver; 
+import org.lcsim.util.Driver;
 import org.lcsim.geometry.Detector;
 import org.lcsim.event.EventHeader;
 import org.lcsim.event.RawTrackerHit;
+import org.lcsim.util.aida.AIDA;
 
 /**
- *  Monitoring driver that provides information about the number
- *  of SVT hits per event.
- *   
- *  @author Omar Moreno <[log in to unmask]>
+ * Monitoring driver that provides information about the number of SVT hits per
+ * event.
+ *
+ * @author Omar Moreno <[log in to unmask]>
  */
 public class SvtHitPlots extends Driver {
 
     // TODO: Add documentation
-	
     static {
         hep.aida.jfree.AnalysisFactory.register();
-    } 
-
-    static IHistogramFactory histogramFactory = IAnalysisFactory.create().createHistogramFactory(null);
-	IPlotterFactory plotterFactory = IAnalysisFactory.create().createPlotterFactory();
-	
-	protected Map<String, IPlotter> plotters = new HashMap<String, IPlotter>(); 
+    }
+
+    // Plotting
+    private static ITree tree = null;
+    private IAnalysisFactory analysisFactory = AIDA.defaultInstance().analysisFactory();
+    private IPlotterFactory plotterFactory = analysisFactory.createPlotterFactory("SVT Hits");
+    private IHistogramFactory histogramFactory = null;
+    protected Map<String, IPlotter> plotters = new HashMap<String, IPlotter>();
+
+    // Histogram Maps
+    private static Map<String, IHistogram1D> hitsPerSensorPlots = new HashMap<String, IHistogram1D>();
+    private static Map<String, int[]> hitsPerSensor = new HashMap<String, int[]>();
+    private static Map<String, IHistogram1D> layersHitPlots = new HashMap<String, IHistogram1D>();
+    private static Map<String, IHistogram1D> hitCountPlots = new HashMap<String, IHistogram1D>();
+    private static Map<String, IHistogram1D> firstSamplePlots = new HashMap<String, IHistogram1D>();
+
     private List<HpsSiSensor> sensors;
-    protected Map<HpsSiSensor, IHistogram1D> hitsPerSensorPlots = new HashMap<HpsSiSensor, IHistogram1D>();
-    protected Map<HpsSiSensor, int[]> hitsPerSensor = new HashMap<HpsSiSensor, int[]>();
-    protected Map<String, IHistogram1D> layersHitPlots = new HashMap<String, IHistogram1D>();
-	protected Map<String, IHistogram1D> hitCountPlots = new HashMap<String, IHistogram1D>();
-    
+
     private static final String SUBDETECTOR_NAME = "Tracker";
     private String rawTrackerHitCollectionName = "SVTRawTrackerHits";
-   
+    
     // Counters
     double eventCount = 0;
-    double totalHitCount = 0; 
-    double totalTopHitCount = 0; 
-    double totalBotHitCount = 0; 
+    double totalHitCount = 0;
+    double totalTopHitCount = 0;
+    double totalBotHitCount = 0;
+
+    private boolean dropSmallHitEvents = true;
+
+    public void setDropSmallHitEvents(boolean dropSmallHitEvents) {
+        this.dropSmallHitEvents = dropSmallHitEvents;
+    }
 
     private int computePlotterRegion(HpsSiSensor sensor) {
 
-		if (sensor.getLayerNumber() < 7) {
-			if (sensor.isTopLayer()) {
-				return 6*(sensor.getLayerNumber() - 1); 
-			} else { 
-				return 6*(sensor.getLayerNumber() - 1) + 1;
-			} 
-		} else { 
-		
-			if (sensor.isTopLayer()) {
-				if (sensor.getSide() == HpsSiSensor.POSITRON_SIDE) {
-					return 6*(sensor.getLayerNumber() - 7) + 2;
-				} else { 
-					return 6*(sensor.getLayerNumber() - 7) + 3;
-				}
-			} else if (sensor.isBottomLayer()) {
-				if (sensor.getSide() == HpsSiSensor.POSITRON_SIDE) {
-					return 6*(sensor.getLayerNumber() - 7) + 4;
-				} else {
-					return 6*(sensor.getLayerNumber() - 7) + 5;
-				}
-			}
-		}
-		
-		return -1; 
-    }
-    
-    private void clearHitMaps() { 
-        for (HpsSiSensor sensor : sensors) {
-            hitsPerSensor.get(sensor)[0] = 0; 
-        }
+        if (sensor.getLayerNumber() < 7) {
+            if (sensor.isTopLayer()) {
+                return 6 * (sensor.getLayerNumber() - 1);
+            } else {
+                return 6 * (sensor.getLayerNumber() - 1) + 1;
+            }
+        } else {
+
+            if (sensor.isTopLayer()) {
+                if (sensor.getSide() == HpsSiSensor.POSITRON_SIDE) {
+                    return 6 * (sensor.getLayerNumber() - 7) + 2;
+                } else {
+                    return 6 * (sensor.getLayerNumber() - 7) + 3;
+                }
+            } else if (sensor.isBottomLayer()) {
+                if (sensor.getSide() == HpsSiSensor.POSITRON_SIDE) {
+                    return 6 * (sensor.getLayerNumber() - 7) + 4;
+                } else {
+                    return 6 * (sensor.getLayerNumber() - 7) + 5;
+                }
+            }
+        }
+        return -1;
+    }
+
+    /**
+     * Create a plotter style.
+     *
+     * @param sensor : HpsSiSensor associated with the plot. This is used to set
+     * certain attributes based on the position of the sensor.
+     * @param xAxisTitle : Title of the x axis
+     * @param yAxisTitle : Title of the y axis
+     * @return plotter style
+     */
+    // TODO: Move this to a utilities class
+    IPlotterStyle createStyle(HpsSiSensor sensor, String xAxisTitle, String yAxisTitle) {
+        IPlotterStyle style = SvtPlotUtils.createStyle(plotterFactory, xAxisTitle, yAxisTitle);
+
+        if (sensor.isTopLayer()) {
+            style.dataStyle().fillStyle().setColor("31, 137, 229, 1");
+            style.dataStyle().outlineStyle().setColor("31, 137, 229, 1");
+        } else {
+            style.dataStyle().fillStyle().setColor("93, 228, 47, 1");
+            style.dataStyle().outlineStyle().setColor("93, 228, 47, 1");
+        }
+
+        return style;
+    }
+
+    private void clearHitMaps() {
+        for (HpsSiSensor sensor : sensors) {
+            hitsPerSensor.get(sensor.getName())[0] = 0;
+        }
+    }
+
+    /**
+     * Clear all histograms of it's current data.
+     */
+    private void resetPlots() {
+
+        // Reset all hit maps
+        this.clearHitMaps();
+
+        // Since all plots are mapped to the name of a sensor, loop 
+        // through the sensors, get the corresponding plots and clear them.
+        for (HpsSiSensor sensor : sensors) {
+            hitsPerSensorPlots.get(sensor.getName()).reset();
+            firstSamplePlots.get(sensor.getName()).reset();
+        }
+
+        for (IHistogram1D histogram : layersHitPlots.values()) {
+            histogram.reset();
+        }
+
+        for (IHistogram1D histogram : hitCountPlots.values()) {
+            histogram.reset();
+        }
+
     }
 
     protected void detectorChanged(Detector detector) {
 
-        sensors 
-			= detector.getSubdetector(SUBDETECTOR_NAME).getDetectorElement().findDescendants(HpsSiSensor.class);
-   
+        // Get the HpsSiSensor objects from the geometry
+        sensors = detector.getSubdetector(SUBDETECTOR_NAME).getDetectorElement().findDescendants(HpsSiSensor.class);
+
         if (sensors.size() == 0) {
             throw new RuntimeException("No sensors were found in this detector.");
         }
-        
-        plotters.put("Raw hits per sensor", plotterFactory.create("Raw hits per sensor")); 
-		plotters.get("Raw hits per sensor").createRegions(6,6);
-        
-		for (HpsSiSensor sensor : sensors) {
-		   hitsPerSensorPlots.put(sensor, 
-		           histogramFactory.createHistogram1D(sensor.getName() + " - Raw Hits", 25, 0, 25)); 
-		   plotters.get("Raw hits per sensor").region(this.computePlotterRegion(sensor))
-		                                      .plot(hitsPerSensorPlots.get(sensor), this.createStyle(sensor, "Number of Raw Hits", ""));
-		   hitsPerSensor.put(sensor, new int[1]);
-		}
-
-		plotters.put("Number of layers hit", plotterFactory.create("Number of layers hit"));
-		plotters.get("Number of layers hit").createRegions(1,2);
-
-		layersHitPlots.put("Top",
-		        histogramFactory.createHistogram1D("Top Layers Hit", 12, 0, 12));
-		plotters.get("Number of layers hit").region(0).plot(layersHitPlots.get("Top"), this.createStyle("Number of Top Layers Hit",""));
-		layersHitPlots.put("Bottom",
-		        histogramFactory.createHistogram1D("Bottom Layers Hit", 12, 0, 12));
-		plotters.get("Number of layers hit").region(1).plot(layersHitPlots.get("Bottom"), this.createStyle("Number of Bottom Layers Hit",""));
-	
-		plotters.put("Raw hit counts/Event", plotterFactory.create("Raw hit counts/Event")); 
-		plotters.get("Raw hit counts/Event").createRegions(2, 2);
-
-		hitCountPlots.put("Raw hit counts/Event", 
-		        histogramFactory.createHistogram1D("Raw hit counts", 100, 0, 100));
-		plotters.get("Raw hit counts/Event").region(0).plot(hitCountPlots.get("Raw hit counts/Event"), this.createStyle("Number of Raw Hits", ""));
-		hitCountPlots.put("SVT top raw hit counts/Event", 
-		        histogramFactory.createHistogram1D("SVT top raw hit counts", 100, 0, 100));
-		plotters.get("Raw hit counts/Event").region(1).plot(hitCountPlots.get("SVT top raw hit counts/Event"), this.createStyle("Number of Raw Hits in Top Volume", ""));
-		hitCountPlots.put("SVT bottom raw hit counts/Event", 
-		        histogramFactory.createHistogram1D("SVT bottom raw hit counts", 100, 0, 100));
-		plotters.get("Raw hit counts/Event").region(2).plot(hitCountPlots.get("SVT bottom raw hit counts/Event"), this.createStyle("Number of Raw Bits in the Bottom Volume", ""));
-		
-		for (IPlotter plotter : plotters.values()) { 
-			plotter.show();
-		}
-    }
-    
+
+//        // If the tree already exist, clear all existing plots of any old data
+//        // they might contain.
+//        if (tree != null) {
+//            this.resetPlots();
+//            return;
+//        }
+        tree = analysisFactory.createTreeFactory().create();
+        histogramFactory = analysisFactory.createHistogramFactory(tree);
+
+        plotters.put("Raw hits per sensor", plotterFactory.create("Raw hits per sensor"));
+        plotters.get("Raw hits per sensor").createRegions(6, 6);
+
+        for (HpsSiSensor sensor : sensors) {
+            hitsPerSensorPlots.put(sensor.getName(),
+                    histogramFactory.createHistogram1D(sensor.getName() + " - Raw Hits", 25, 0, 25));
+            plotters.get("Raw hits per sensor").region(SvtPlotUtils.computePlotterRegion(sensor))
+                    .plot(hitsPerSensorPlots.get(sensor.getName()), this.createStyle(sensor, "Number of Raw Hits", ""));
+            hitsPerSensor.put(sensor.getName(), new int[1]);
+        }
+
+        plotters.put("Number of layers hit", plotterFactory.create("Number of layers hit"));
+        plotters.get("Number of layers hit").createRegions(1, 2);
+
+        layersHitPlots.put("Top",
+                histogramFactory.createHistogram1D("Top Layers Hit", 12, 0, 12));
+        plotters.get("Number of layers hit").region(0).plot(layersHitPlots.get("Top"), SvtPlotUtils.createStyle(plotterFactory, "Number of Top Layers Hit", ""));
+        layersHitPlots.put("Bottom",
+                histogramFactory.createHistogram1D("Bottom Layers Hit", 12, 0, 12));
+        plotters.get("Number of layers hit").region(1).plot(layersHitPlots.get("Bottom"), SvtPlotUtils.createStyle(plotterFactory, "Number of Bottom Layers Hit", ""));
+
+        plotters.put("Raw hit counts/Event", plotterFactory.create("Raw hit counts/Event"));
+        plotters.get("Raw hit counts/Event").createRegions(2, 2);
+
+        hitCountPlots.put("Raw hit counts/Event",
+                histogramFactory.createHistogram1D("Raw hit counts", 100, 0, 100));
+        plotters.get("Raw hit counts/Event").region(0).plot(hitCountPlots.get("Raw hit counts/Event"), SvtPlotUtils.createStyle(plotterFactory, "Number of Raw Hits", ""));
+        hitCountPlots.put("SVT top raw hit counts/Event",
+                histogramFactory.createHistogram1D("SVT top raw hit counts", 100, 0, 100));
+        plotters.get("Raw hit counts/Event").region(2).plot(hitCountPlots.get("SVT top raw hit counts/Event"), SvtPlotUtils.createStyle(plotterFactory, "Number of Raw Hits in Top Volume", ""));
+        hitCountPlots.put("SVT bottom raw hit counts/Event",
+                histogramFactory.createHistogram1D("SVT bottom raw hit counts", 100, 0, 100));
+        plotters.get("Raw hit counts/Event").region(3).plot(hitCountPlots.get("SVT bottom raw hit counts/Event"), SvtPlotUtils.createStyle(plotterFactory, "Number of Raw Bits in the Bottom Volume", ""));
+
+        plotters.put("First sample distributions (pedestal shifts)", plotterFactory.create("First sample distributions (pedestal shifts)"));
+        plotters.get("First sample distributions (pedestal shifts)").createRegions(6, 6);
+        for (HpsSiSensor sensor : sensors) {
+            firstSamplePlots.put(sensor.getName(),
+                    histogramFactory.createHistogram1D(sensor.getName() + " - first sample", 100, -500.0, 2000.0));
+            plotters.get("First sample distributions (pedestal shifts)").region(this.computePlotterRegion(sensor))
+                    .plot(firstSamplePlots.get(sensor.getName()), this.createStyle(sensor, "First sample - pedestal [ADC counts]", ""));
+        }
+
+        for (IPlotter plotter : plotters.values()) {
+            for (int regionN = 0; regionN < plotter.numberOfRegions(); regionN++) {
+                PlotterRegion region = ((PlotterRegion) ((Plotter) plotter).region(regionN));
+                if (region.getPlottedObjects().size() == 0) {
+                    continue;
+                }
+                region.getPanel().addMouseListener(new PopupPlotterListener(region));
+            }
+            plotter.show();
+        }
+    }
+
     public void process(EventHeader event) {
-        
-    	if (!event.hasCollection(RawTrackerHit.class, rawTrackerHitCollectionName))
-    		return;
-    
-    	eventCount++;
-    	
+
+        if (!event.hasCollection(RawTrackerHit.class, rawTrackerHitCollectionName)) {
+            return;
+        }
+
+        eventCount++;
+
         // Get RawTrackerHit collection from event.
         List<RawTrackerHit> rawHits = event.get(RawTrackerHit.class, rawTrackerHitCollectionName);
-   
+
+        if (dropSmallHitEvents && SvtPlotUtils.countSmallHits(rawHits) > 3) {
+            return;
+        }
+
         this.clearHitMaps();
-        for (RawTrackerHit rawHit : rawHits) { 
+        for (RawTrackerHit rawHit : rawHits) {
             HpsSiSensor sensor = (HpsSiSensor) rawHit.getDetectorElement();
-            hitsPerSensor.get(sensor)[0]++;
-        }
-        
+            hitsPerSensor.get(sensor.getName())[0]++;
+            firstSamplePlots.get(sensor.getName()).fill(rawHit.getADCValues()[0] - sensor.getPedestal(rawHit.getIdentifierFieldValue("strip"), 0));
+        }
+
         int[] topLayersHit = new int[12];
-        int[] botLayersHit = new int[12]; 
+        int[] botLayersHit = new int[12];
         int eventHitCount = 0;
         int topEventHitCount = 0;
         int botEventHitCount = 0;
-        for (HpsSiSensor sensor : sensors) { 
-            int hitCount = hitsPerSensor.get(sensor)[0];
-            hitsPerSensorPlots.get(sensor).fill(hitCount);
-            
+        for (HpsSiSensor sensor : sensors) {
+            int hitCount = hitsPerSensor.get(sensor.getName())[0];
+            hitsPerSensorPlots.get(sensor.getName()).fill(hitCount);
+
             eventHitCount += hitCount;
-            
-            if (hitsPerSensor.get(sensor)[0] > 0) { 
-                if (sensor.isTopLayer()) { 
+
+            if (hitsPerSensor.get(sensor.getName())[0] > 0) {
+                if (sensor.isTopLayer()) {
                     topLayersHit[sensor.getLayerNumber() - 1]++;
                     topEventHitCount += hitCount;
-                }
-                else { 
-                    botLayersHit[sensor.getLayerNumber() - 1]++; 
+                } else {
+                    botLayersHit[sensor.getLayerNumber() - 1]++;
                     botEventHitCount += hitCount;
                 }
             }
         }
-      
-        totalHitCount += eventHitCount; 
-        totalTopHitCount += topEventHitCount; 
+
+        totalHitCount += eventHitCount;
+        totalTopHitCount += topEventHitCount;
         totalBotHitCount += botEventHitCount;
-    
+
         hitCountPlots.get("Raw hit counts/Event").fill(eventHitCount);
         hitCountPlots.get("SVT top raw hit counts/Event").fill(topEventHitCount);
         hitCountPlots.get("SVT bottom raw hit counts/Event").fill(botEventHitCount);
-        
-        int totalTopLayersHit = 0; 
-        int totalBotLayersHit = 0; 
-        for(int layerN = 0; layerN < 12; layerN++) { 
-            if (topLayersHit[layerN] > 0) totalTopLayersHit++;
-            if (botLayersHit[layerN] > 0) totalBotLayersHit++;
-        }
-        
+
+        int totalTopLayersHit = 0;
+        int totalBotLayersHit = 0;
+        for (int layerN = 0; layerN < 12; layerN++) {
+            if (topLayersHit[layerN] > 0) {
+                totalTopLayersHit++;
+            }
+            if (botLayersHit[layerN] > 0) {
+                totalBotLayersHit++;
+            }
+        }
+
         layersHitPlots.get("Top").fill(totalTopLayersHit);
         layersHitPlots.get("Bottom").fill(totalBotLayersHit);
-        
-    }
-   
+
+    }
+
     @Override
     protected void endOfData() {
-        
+
         System.out.println("%================================================%");
         System.out.println("%============ SVT Raw Hit Statistics ============%");
         System.out.println("%================================================%\n%");
-        System.out.println("% Total Hits/Event: " + totalHitCount/eventCount);
-        System.out.println("% Total Top SVT Hits/Event: " + totalTopHitCount/eventCount);
-        System.out.println("% Total Bottom SVT Hits/Event: " + totalBotHitCount/eventCount);
+        System.out.println("% Total Hits/Event: " + totalHitCount / eventCount);
+        System.out.println("% Total Top SVT Hits/Event: " + totalTopHitCount / eventCount);
+        System.out.println("% Total Bottom SVT Hits/Event: " + totalBotHitCount / eventCount);
         System.out.println("\n%================================================%");
     }
-    
-    IPlotterStyle createStyle(String xAxisTitle, String yAxisTitle) { 
-       
-        // Create a default style
-        IPlotterStyle style = this.plotterFactory.createPlotterStyle();
-        
-        // Set the style of the X axis
-        style.xAxisStyle().setLabel(xAxisTitle);
-        style.xAxisStyle().labelStyle().setFontSize(14);
-        style.xAxisStyle().setVisible(true);
-        
-        // Set the style of the Y axis
-        style.yAxisStyle().setLabel(yAxisTitle);
-        style.yAxisStyle().labelStyle().setFontSize(14);
-        style.yAxisStyle().setVisible(true);
-        
-        // Turn off the histogram grid 
-        style.gridStyle().setVisible(false);
-        
-        // Set the style of the data
-        style.dataStyle().lineStyle().setVisible(false);
-        style.dataStyle().outlineStyle().setVisible(false);
-        style.dataStyle().outlineStyle().setThickness(3);
-        style.dataStyle().fillStyle().setVisible(true);
-        style.dataStyle().fillStyle().setOpacity(.30);
-        style.dataStyle().fillStyle().setColor("31, 137, 229, 1");
-        style.dataStyle().outlineStyle().setColor("31, 137, 229, 1");
-        style.dataStyle().errorBarStyle().setVisible(false);
-        
-        // Turn off the legend
-        style.legendBoxStyle().setVisible(false);
-       
-        return style;
-    }
-    
-    IPlotterStyle createStyle(HpsSiSensor sensor, String xAxisTitle, String yAxisTitle) { 
-        IPlotterStyle style = this.createStyle(xAxisTitle, yAxisTitle);
-        
-        if (sensor.isTopLayer()) { 
-            style.dataStyle().fillStyle().setColor("31, 137, 229, 1");
-            style.dataStyle().outlineStyle().setColor("31, 137, 229, 1");
-        } else { 
-            style.dataStyle().fillStyle().setColor("93, 228, 47, 1");
-            style.dataStyle().outlineStyle().setColor("93, 228, 47, 1");
-        }
-        
-        return style;
-    }
+
 }

Modified: java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/trackrecon/TrackTimePlots.java
 =============================================================================
--- java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/trackrecon/TrackTimePlots.java	(original)
+++ java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/trackrecon/TrackTimePlots.java	Fri Jun 12 15:27:10 2015
@@ -48,11 +48,12 @@
     private IHistogram2D[] trackTimeMinMax = new IHistogram2D[4];
 
     private static final String subdetectorName = "Tracker";
-    int nlayers=12;
-    
-    public void setTrackCollectionName(String name){
-        this.trackCollectionName=name;
-    }
+    int nlayers = 12;
+
+    public void setTrackCollectionName(String name) {
+        this.trackCollectionName = name;
+    }
+
     @Override
     protected void detectorChanged(Detector detector) {
 
@@ -70,14 +71,13 @@
         //style2d.zAxisStyle().setParameter("scale", "log");
         style2d.zAxisStyle().setVisible(false);
         style2d.dataBoxStyle().setVisible(false);
-       
-        
+
         IPlotterStyle styleOverlay = store.getStyle("DefaultHistogram1DStyle");
         styleOverlay.dataStyle().errorBarStyle().setVisible(true);
-        styleOverlay.dataStyle().fillStyle().setVisible(false);        
+        styleOverlay.dataStyle().fillStyle().setVisible(false);
         styleOverlay.legendBoxStyle().setVisible(false);
         styleOverlay.dataStyle().outlineStyle().setVisible(false);
-         
+
         plotter = fac.create("Hit Times");
         plotter.createRegions(3, 4);
 
@@ -110,16 +110,14 @@
             plot(plotter3, trackHitT0[module][layer], styleOverlay, region);
             trackHitDt[module][layer] = aida.histogram1D(sensor.getName() + "_trackHit_dt", 50, -20, 20.0);
             plot(plotter4, trackHitDt[module][layer], styleOverlay, region);
-           
-        }
-        
-        
-        
-        for (int i=0; i<nlayers;i++) {            
-            int region = computePlotterRegion(i);                   
-            trackHit2D[i] = aida.histogram2D("Layer "+i+" trackHit vs dt", 75, -50, 100.0, 50, -20, 20.0);
+
+        }
+
+        for (int i = 0; i < nlayers; i++) {
+            int region = computePlotterRegion(i);
+            trackHit2D[i] = aida.histogram2D("Layer " + i + " trackHit vs dt", 75, -50, 100.0, 50, -20, 20.0);
             plot(plotter5, trackHit2D[i], style2d, region);
-            trackHitDtChan[i] = aida.histogram2D("Layer "+i+" dt vs position", 200, -20, 20, 50, -20, 20.0);
+            trackHitDtChan[i] = aida.histogram2D("Layer " + i + " dt vs position", 200, -20, 20, 50, -20, 20.0);
             plot(plotter6, trackHitDtChan[i], style2d, region);
         }
         plotter.show();
@@ -131,7 +129,7 @@
         for (int module = 0; module < 2; module++) {
             trackT0[module] = aida.histogram1D((module == 0 ? "Top" : "Bottom") + " Track Time", 75, -50, 100.0);
             plot(plotter2, trackT0[module], null, module);
-            trackTrigTime[module] = aida.histogram2D((module == 0 ? "Top" : "Bottom") + " Track Time vs. Trig Time", 75, -50, 100.0, 33, -1, 32);
+            trackTrigTime[module] = aida.histogram2D((module == 0 ? "Top" : "Bottom") + " Track Time vs. Trig Time", 75, -50, 100.0, 6, -2, 22);
             plot(plotter2, trackTrigTime[module], style2d, module + 2);
 
             trackTimeRange[module] = aida.histogram1D((module == 0 ? "Top" : "Bottom") + " Track Hit Time Range", 75, 0, 30.0);
@@ -148,47 +146,9 @@
         this.hitCollection = hitCollection;
     }
 
-  
-
     @Override
     public void process(EventHeader event) {
-        int orTrig = 0;
-        int topTrig = 0;
-        int botTrig = 0;
-
-        int orTrigTime = -1;
-        int topTrigTime = -1;
-        int botTrigTime = -1;
-        if (event.hasCollection(GenericObject.class, "TriggerBank")) {
-            List<GenericObject> triggerList = event.get(GenericObject.class, "TriggerBank");
-            for (GenericObject data : triggerList)
-                if (AbstractIntData.getTag(data) == TestRunTriggerData.BANK_TAG) {
-                    TestRunTriggerData triggerData = new TestRunTriggerData(data);
-
-                    orTrig = triggerData.getOrTrig();
-                    if (orTrig != 0)
-                        for (int i = 0; i < 32; i++)
-                            if ((1 << (31 - i) & orTrig) != 0) {
-                                orTrigTime = i;
-                                break;
-                            }
-                    topTrig = triggerData.getTopTrig();
-                    if (topTrig != 0)
-                        for (int i = 0; i < 32; i++)
-                            if ((1 << (31 - i) & topTrig) != 0) {
-                                topTrigTime = i;
-                                break;
-                            }
-                    botTrig = triggerData.getBotTrig();
-                    if (botTrig != 0)
-                        for (int i = 0; i < 32; i++)
-                            if ((1 << (31 - i) & botTrig) != 0) {
-                                botTrigTime = i;
-                                break;
-                            }
-                    break;
-                }
-        }
+        int trigTime = (int) (event.getTimeStamp() % 24);
 
         //===> IIdentifierHelper helper = SvtUtils.getInstance().getHelper();
         List<SiTrackerHitStrip1D> hits = event.get(SiTrackerHitStrip1D.class, hitCollection);
@@ -206,40 +166,46 @@
         List<Track> tracks = event.get(Track.class, trackCollectionName);
         for (Track track : tracks) {
             int trackModule = -1;
-            if (track.getTrackerHits().get(0).getPosition()[2] > 0)
+            if (track.getTrackerHits().get(0).getPosition()[2] > 0) {
                 trackModule = 0;
-            else
+            } else {
                 trackModule = 1;
+            }
             double minTime = Double.POSITIVE_INFINITY;
             double maxTime = Double.NEGATIVE_INFINITY;
             int hitCount = 0;
             double trackTime = 0;
-            for (TrackerHit hitCross : track.getTrackerHits())
+            for (TrackerHit hitCross : track.getTrackerHits()) {
                 for (HelicalTrackStrip hit : ((HelicalTrackCross) hitCross).getStrips()) {
                     int layer = hit.layer();
                     trackHitT0[trackModule][layer - 1].fill(hit.dEdx() / DopedSilicon.ENERGY_EHPAIR);
                     trackTime += hit.time();
                     hitCount++;
-                    if (hit.time() > maxTime)
+                    if (hit.time() > maxTime) {
                         maxTime = hit.time();
-                    if (hit.time() < minTime)
+                    }
+                    if (hit.time() < minTime) {
                         minTime = hit.time();
+                    }
                 }
+            }
             trackTimeMinMax[trackModule].fill(minTime, maxTime);
             trackTimeRange[trackModule].fill(maxTime - minTime);
             trackTime /= hitCount;
             trackT0[trackModule].fill(trackTime);
-            if (trackModule == 0)
-                trackTrigTime[trackModule].fill(trackTime, topTrigTime);
-            else
-                trackTrigTime[trackModule].fill(trackTime, botTrigTime);
-            for (TrackerHit hitCross : track.getTrackerHits())
+            if (trackModule == 0) {
+                trackTrigTime[trackModule].fill(trackTime, trigTime);
+            } else {
+                trackTrigTime[trackModule].fill(trackTime, trigTime);
+            }
+            for (TrackerHit hitCross : track.getTrackerHits()) {
                 for (HelicalTrackStrip hit : ((HelicalTrackCross) hitCross).getStrips()) {
                     int layer = hit.layer();
                     trackHitDt[trackModule][layer - 1].fill(hit.time() - trackTime);
                     trackHit2D[layer - 1].fill(trackTime, hit.time() - trackTime);
                     trackHitDtChan[layer - 1].fill(hit.umeas(), hit.time() - trackTime);
                 }
+            }
         }
     }
 
@@ -264,42 +230,57 @@
     //and assume plotter is split in 3 columns, 4 rows...L0-5 on top 2 rows; L6-11 on bottom 2
     private int computePlotterRegion(int layer) {
 
-        if (layer == 0)
+        if (layer == 0) {
             return 0;
-        if (layer == 1)
+        }
+        if (layer == 1) {
             return 1;
-        if (layer == 2)
+        }
+        if (layer == 2) {
             return 4;
-        if (layer == 3)
+        }
+        if (layer == 3) {
             return 5;
-        if (layer == 4)
+        }
+        if (layer == 4) {
             return 8;
-        if (layer == 5)
+        }
+        if (layer == 5) {
             return 9;
-
-        if (layer == 6)
+        }
+
+        if (layer == 6) {
             return 2;
-        if (layer == 7)
+        }
+        if (layer == 7) {
             return 3;
-        if (layer == 8)
+        }
+        if (layer == 8) {
             return 6;
-        if (layer == 9)
+        }
+        if (layer == 9) {
             return 7;
-        if (layer == 10)
+        }
+        if (layer == 10) {
             return 10;
-        if (layer == 11)
+        }
+        if (layer == 11) {
             return 11;
+        }
         return -1;
     }
-    
-    private String getColor(int module){
-        String color="Black";
-        if(module==1)
-            color="Green";
-        if(module==2)
-            color="Blue";
-        if(module==3)
-            color="Red";
+
+    private String getColor(int module) {
+        String color = "Black";
+        if (module == 1) {
+            color = "Green";
+        }
+        if (module == 2) {
+            color = "Blue";
+        }
+        if (module == 3) {
+            color = "Red";
+        }
         return color;
     }
 }

Modified: java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/trackrecon/TrackingReconPlots.java
 =============================================================================
--- java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/trackrecon/TrackingReconPlots.java	(original)
+++ java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/trackrecon/TrackingReconPlots.java	Fri Jun 12 15:27:10 2015
@@ -163,8 +163,8 @@
 
         for (int i = 1; i <= nmodules; i++) {
 
-            xvsyTop[i - 1] = aida.histogram2D("Module " + i + " Top", 50, -10, 10, 50, 0, 4);
-            xvsyBot[i - 1] = aida.histogram2D("Module " + i + " Bottom", 50, -10, 10, 50, 0, 4);
+            xvsyTop[i - 1] = aida.histogram2D("Module " + i + " Top", 100, -100, 150, 55, 0, 55);
+            xvsyBot[i - 1] = aida.histogram2D("Module " + i + " Bottom", 100, -100, 150, 55, 0, 55);
             hthTop[i - 1] = aida.histogram1D("Module " + i + "Top: Track Hits", 25, 0, 25);
             hthBot[i - 1] = aida.histogram1D("Module " + i + "Bot: Track Hits", 25, 0, 25);
             plot(plotterHTH, hthTop[i - 1], null, computePlotterRegion(i - 1, true));
@@ -225,10 +225,10 @@
 
             if (hit.getPosition()[1] > 0) {
                 topHits[module - 1]++;
-                xvsyTop[module - 1].fill(hit.getPosition()[0], hit.getPosition()[0]);
+                xvsyTop[module - 1].fill(hit.getPosition()[0], hit.getPosition()[1]);
             } else {
                 botHits[module - 1]++;
-                xvsyBot[module - 1].fill(hit.getPosition()[0], Math.abs(hit.getPosition()[0]));
+                xvsyBot[module - 1].fill(hit.getPosition()[0], -1*hit.getPosition()[1]);
             }
         }
 

Modified: java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalHitPlots.java
 =============================================================================
--- java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalHitPlots.java	(original)
+++ java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalHitPlots.java	Fri Jun 12 15:27:10 2015
@@ -189,10 +189,13 @@
             if (!triggerList.isEmpty()) {
                 GenericObject triggerData = triggerList.get(0);
                
-                if (triggerData instanceof SSPData){ 
-                	orTrigTime=((SSPData)triggerData).getOrTrig();
-                	topTrigTime=((SSPData)triggerData).getTopTrig();
-                	botTrigTime =((SSPData)triggerData).getBotTrig(); 
+                if (triggerData instanceof SSPData){
+                	// TODO: TOP, BOTTOM, OR, and AND triggers are test
+                	// run specific parameters and are not supported
+                	// by SSPData.
+                	orTrigTime  = 0; //((SSPData)triggerData).getOrTrig();
+                	topTrigTime = 0; //((SSPData)triggerData).getTopTrig();
+                	botTrigTime = 0; //((SSPData)triggerData).getBotTrig(); 
 
                 	
                 	orTrigTimePlot.fill(orTrigTime);

Modified: java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalLedSequenceMonitor.java
 =============================================================================
--- java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalLedSequenceMonitor.java	(original)
+++ java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalLedSequenceMonitor.java	Fri Jun 12 15:27:10 2015
@@ -128,7 +128,7 @@
     private IPlotterStyle style ;
     private int[] fitStatus = new int[NUM_CHANNELS];
     
-    private boolean doEmbedded=true;
+    private boolean doFullAnalysis=false;
     private boolean isMonitoringApp=false; 
     
     private double[] fPars;    
@@ -188,8 +188,8 @@
         this.isMonitoringApp=app;
     }
 
-    public void setDoEmbedded(boolean embedded){
-        this.doEmbedded=embedded;
+    public void setDoFullAnalysis(boolean fullAnalysis){
+        this.doFullAnalysis=fullAnalysis;
     }
     
     @Override
@@ -241,7 +241,7 @@
         factory= aida.analysisFactory().createPlotterFactory("Ecal Led Sequence");
         pPlotter= factory.create("Drivers");
         pPlotter.createRegions(4,2);
-        if (doEmbedded){
+        if (isMonitoringApp){
             pPlotter2=factory.create("Sequence Map");
             pPlotter2.createRegions(1,1);
             pPlotter2.region(0).plot(hMeanCharge2D);
@@ -258,8 +258,6 @@
             int row = EcalMonitoringUtilities.getRowFromHistoID(ii);
             int column = EcalMonitoringUtilities.getColumnFromHistoID(ii);	    
             iTuple.add(aida.analysisFactory().createTupleFactory(aida.tree()).create("nTuple"+ii,"nTuple"+ii,"int fEvn=0 , double fCharge=0.,double fTime=0.",""));
-
-
         }
 
         for (int ii=0;ii<nDrivers;ii++){
@@ -268,7 +266,7 @@
         }
 
         pPlotter.show();
-        if (doEmbedded) pPlotter2.show();
+        if (isMonitoringApp) pPlotter2.show();
 
     }		
 
@@ -297,7 +295,6 @@
                 fillTime = hit.getTime();
 
 
-
                 //find the LED
                 if (row>0){
                     ledid=LedTopMap.get(chid);
@@ -308,6 +305,8 @@
                 driverid=getDriver(ledid);
                 if (row<0) driverid+=4;
 
+
+                                
                 /*Skip the events under thr*/
                 if (energy<energyCut) continue;
 
@@ -386,9 +385,10 @@
             eMax=-9999;
             row = EcalMonitoringUtilities.getRowFromHistoID(id);
             column = EcalMonitoringUtilities.getColumnFromHistoID(id);
+            System.out.println("");
             System.out.println("Doing channel: X= "+column+" Y= "+row);
+            System.out.println("Number of entries in analysis ntuple: "+iTuple.get(id).rows());
             System.out.println("Number of recognized events: "+nEvents[id]);
-            System.out.println("Number of entries in analysis ntuple: "+iTuple.get(id).rows());
             /*Create the profile. Create it for all the channels, to keep sync.*/
             nBins=nEvents[id]/100;
             if (nBins<=0) nBins=1;
@@ -408,13 +408,14 @@
             fFunction1=fFactory.createFunctionByName("fun1","G");
 
             if (EcalMonitoringUtilities.isInHole(row,column)==true){
+            	System.out.println("Channel X= "+column+" Y= "+row+" is in hole. Skip");
                 hCharge.add(aida.histogram1D("charge_"+id,200,0.,1.)); //create here the histogram to keep sync
                 System.out.println("In hole, skip");
                 continue;
             }
             else if (nEvents[id]<nEventsMin) {
                 hCharge.add(aida.histogram1D("charge_"+id,200,0.,1.)); //create here the histogram to keep sync
-                System.err.println("LedAnalysis:: the channel X= "+column+" Y= "+row+" has not enough");
+                System.err.println("LedAnalysis:: the channel X= "+column+" Y= "+row+" has not enough events "+nEvents[id]+" "+nEventsMin);
                 
                 continue;
             }			  
@@ -438,7 +439,7 @@
             }			
             fFitter=aida.analysisFactory().createFitFactory().createFitter("chi2","","v");
             
-            if (!isMonitoringApp){ 
+            if (doFullAnalysis){ 
                 //Init function parameters
                 double[] initialPars={eMax-eMin,nEvents[id]/10.,eMin};
                 if (initialPars[0]<0) initialPars[0]=0;
@@ -541,7 +542,7 @@
 
 
 
-        if ((pPlotter2!=null)&&(doEmbedded)){
+        if ((pPlotter2!=null)&&(isMonitoringApp)){
             style = pPlotter2.region(0).style();
             style.setParameter("hist2DStyle", "colorMap");
             style.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");

Modified: java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalMonitoringPlots.java
 =============================================================================
--- java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalMonitoringPlots.java	(original)
+++ java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalMonitoringPlots.java	Fri Jun 12 15:27:10 2015
@@ -166,10 +166,10 @@
             //System.out.println("Event: "+thisEventN+" "+prevEventN);
             //System.out.println("Time: "+thisEventTime+" "+prevEventTime);
             // System.out.println("Monitor: "+thisTime+" "+prevTime+" "+NoccupancyFill);
-
+if (scale>0) {
             hitCountFillPlot.scale(scale);
             clusterCountFillPlot.scale(scale);
-            redraw();
+            redraw();}
             prevTime=thisTime;
             prevEventN=thisEventN;
             prevEventTime=thisEventTime;
@@ -188,14 +188,14 @@
         hitCountDrawPlot.add(hitCountFillPlot);
         plotter.region(0).clear();
         plotter.region(0).plot(hitCountDrawPlot);
-        plotter.region(0).refresh();
+//        plotter.region(0).refresh();
         hitCountFillPlot.reset();
 
         clusterCountDrawPlot.reset();
         clusterCountDrawPlot.add(clusterCountFillPlot);
         plotter.region(1).clear();
         plotter.region(1).plot(clusterCountDrawPlot);
-        plotter.region(1).refresh();
+//        plotter.region(1).refresh();
         clusterCountFillPlot.reset();
 
         occupancyDrawPlot.reset();
@@ -210,7 +210,7 @@
         }
         plotter.region(2).clear();
         if (occupancyDrawPlot.sumAllBinHeights()> 0) plotter.region(2).plot(occupancyDrawPlot);
-        plotter.region(2).refresh();
+//        plotter.region(2).refresh();
     }
 
     private IHistogram2D makeCopy(IHistogram2D hist) {

Modified: java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalMonitoringUtilities.java
 =============================================================================
--- java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalMonitoringUtilities.java	(original)
+++ java/branches/HPSJAVA-488/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalMonitoringUtilities.java	Fri Jun 12 15:27:10 2015
@@ -111,12 +111,16 @@
 
     public static Boolean isInHole(final int row, final int column) {
         if (row == 1 || row == -1) {
-            if (column < XHOLESTART + XHOLEWIDTH && column >= XHOLESTART) {
+            if ((column <= XHOLESTART + XHOLEWIDTH) && (column >= XHOLESTART)) {
                 return true;
             }
-        } else if (row == 0) {
+        } 
+        
+        if (row == 0) {
             return true;
-        } else if (column == 0) {
+        } 
+        
+        if (column == 0) {
             return true;
         }
         return false;

Modified: java/branches/HPSJAVA-488/monitoring-util/pom.xml
 =============================================================================
--- java/branches/HPSJAVA-488/monitoring-util/pom.xml	(original)
+++ java/branches/HPSJAVA-488/monitoring-util/pom.xml	Fri Jun 12 15:27:10 2015
@@ -7,7 +7,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>../parent/pom.xml</relativePath>
-        <version>3.3.1-SNAPSHOT</version>
+        <version>3.3.3-SNAPSHOT</version>
     </parent>
     <scm>
         <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/monitoring-util/</url>

Modified: java/branches/HPSJAVA-488/monitoring-util/src/main/java/org/hps/monitoring/plotting/ExportPdf.java
 =============================================================================
--- java/branches/HPSJAVA-488/monitoring-util/src/main/java/org/hps/monitoring/plotting/ExportPdf.java	(original)
+++ java/branches/HPSJAVA-488/monitoring-util/src/main/java/org/hps/monitoring/plotting/ExportPdf.java	Fri Jun 12 15:27:10 2015
@@ -9,6 +9,11 @@
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.lcsim.util.log.DefaultLogFormatter;
+import org.lcsim.util.log.LogUtil;
 
 import com.itextpdf.text.BadElementException;
 import com.itextpdf.text.Document;
@@ -22,35 +27,47 @@
 
 /**
  * This is a class for exporting plot graphics to PDF.
- * 
+ *
  * @author Jeremy McCormick <[log in to unmask]>
- *
  */
-public class ExportPdf {
+public final class ExportPdf {
 
-    private ExportPdf() {        
+    /**
+     * Setup logging.
+     */
+    private static Logger LOGGER = LogUtil.create(ExportPdf.class, new DefaultLogFormatter(), Level.ALL);
+
+    /**
+     * Do not allow class instantiation.
+     */
+    private ExportPdf() {
     }
-    
+
     /**
-     * Write the graphics from a list of plotters to a PDF, with one plotter per page,
-     * including a summary page with the run data.     
-     * @param plotters The list of plotters.
-     * @param fileName The output file name.
-     * @param runData A list of run data to include on the first page.
-     * @throws IOException If there is a problem opening or writing to the PDF document.
+     * Save a set of tabs containing plots to a file.
+     *
+     * @param plotTabs the top level tab component (plots are actually in a set
+     * of tabs without these tabs)
+     * @param fileName the file name
+     * @param runData the list of run data to save on the cover page
+     * @throws IOException if there is a problem with the IO (e.g. writing to
+     * PDF file)
      */
-    public static void write(List<IPlotter> plotters, String fileName, List<String> runData) throws IOException {
-        
+    public static void write(List<IPlotter> plotters, String fileName, List<String> runData)
+            throws IOException {
+
+        LOGGER.info("writing plots to " + fileName + " ...");
+
         // Open the document and the writer.
-        Document document = new Document(PageSize.A4.rotate(), 50, 50, 50, 50);
-        PdfWriter writer;
+        Document document = new Document(PageSize.LETTER.rotate(), 50, 50, 50, 50);
+        PdfWriter writer = null;
         try {
             writer = PdfWriter.getInstance(document, new FileOutputStream(fileName));
         } catch (DocumentException e) {
             throw new IOException(e);
         }
         document.open();
-        
+
         // Create 1st page with run summary data.
         try {
             writeRunData(document, runData);
@@ -58,67 +75,72 @@
             throw new IOException(e);
         }
 
-        // Write out the plots to the PDF, one page per plotter.
-        for (int i = 0; i < plotters.size(); i++) {            
-            document.newPage();            
-            IPlotter plotter = plotters.get(i);            
+        // Write the graphics from each plotter on a new page.
+        for (IPlotter plotter : plotters) {
+            plotter.refresh();
+            document.newPage();
             writePage(document, writer, plotter);
         }
-        
+
         document.close();
+
+        LOGGER.info("done writing plots to " + fileName);
     }
-    
+
     /**
-     * Get an image from a Swing component.
-     * @param component The Swing component.
-     * @return The image from the component.
+     * Write a plotter's graphics into a single PDF page.
+     *
+     * @param document the output PDF document
+     * @param writer the PDF writer
+     * @param image the buffered bitmap image
+     * @throws IOException if there is a problem writing to the PDF document
+     */
+    static void writePage(Document document, PdfWriter writer, IPlotter plotter) throws IOException {
+
+        Image image = ((Plotter) plotter).getImage();
+        String title = plotter.title();
+
+        // Add header label.
+        Paragraph p = new Paragraph(title, new Font(FontFamily.HELVETICA, 24));
+        p.setAlignment(Element.ALIGN_CENTER);
+        try {
+            document.add(p);
+        } catch (DocumentException e) {
+            throw new IOException(e);
+        }
+
+        // Write image into the document.
+        com.itextpdf.text.Image iTextImage = null;
+        try {
+            iTextImage = com.itextpdf.text.Image.getInstance(writer, image, 1f);
+        } catch (BadElementException e) {
+            throw new IOException(e);
+        }
+        iTextImage.scaleAbsolute(document.getPageSize().getWidth(), (float) 0.75 * document.getPageSize().getHeight());
+        iTextImage.setAlignment(Element.ALIGN_CENTER);
+        try {
+            document.add(iTextImage);
+        } catch (DocumentException e) {
+            throw new IOException(e);
+        }
+    }
+
+    /**
+     * Get a buffered image from a Swing component.
+     *
+     * @param component the Swing component
+     * @return the image from painting the component onto a buffered image
      */
     public static BufferedImage getImage(Component component) {
         BufferedImage image = new BufferedImage(component.getWidth(), component.getHeight(), BufferedImage.TYPE_INT_RGB);
         component.paint(image.getGraphics());
         return image;
     }
-                   
-    /**
-     * Write plotter graphics into a single PDF page.
-     * @param document The output PDF document.
-     * @param writer The PDF writer.
-     * @param plotter The plotter with the graphics.
-     * @throws IOException If there is a problem writing to the PDF document.
-     */
-    static void writePage(Document document, PdfWriter writer, IPlotter plotter) throws IOException {
-                
-        // Add header label.
-        Paragraph p = new Paragraph(plotter.title(), new Font(FontFamily.HELVETICA, 24));
-        p.setAlignment(Element.ALIGN_CENTER);
-        try {
-            document.add(p);
-        } catch (DocumentException e) {
-            throw new IOException(e);
-        }
-        
-        // Create image from panel.
-        Image awtImage = getImage(((Plotter)plotter).panel());
-        
-        // Write image into the document.
-        com.itextpdf.text.Image iTextImage = null;
-        try {
-            iTextImage = com.itextpdf.text.Image.getInstance(writer, awtImage, 1f);
-        } catch (BadElementException e) {
-            throw new IOException(e);
-        }                 
-        iTextImage.setAbsolutePosition(50, 50);
-        iTextImage.scalePercent(60);
-        try {
-            document.add(iTextImage);
-        } catch (DocumentException e) {
-            throw new IOException(e);
-        }
-    }    
-    
+
     /**
      * Add a page with the run summary data.
-     * @param runData The list of run summary information.
+     *
+     * @param runData the list of run summary information
      */
     static void writeRunData(Document document, List<String> runData) throws DocumentException {
         for (String line : runData) {

Modified: java/branches/HPSJAVA-488/monitoring-util/src/main/java/org/hps/monitoring/plotting/PlotterRegistry.java
 =============================================================================
--- java/branches/HPSJAVA-488/monitoring-util/src/main/java/org/hps/monitoring/plotting/PlotterRegistry.java	(original)
+++ java/branches/HPSJAVA-488/monitoring-util/src/main/java/org/hps/monitoring/plotting/PlotterRegistry.java	Fri Jun 12 15:27:10 2015
@@ -10,13 +10,14 @@
 import java.util.Map.Entry;
 
 /**
- * This is a global registry of plotters used by the monitoring plot factory. 
+ * This is a global registry of plotters used by the monitoring plot factory.
+ * 
  * @author Jeremy McCormick <[log in to unmask]>
  */
 public class PlotterRegistry {
-    
+
     HashMap<IPlotter, int[]> plotterMap = new HashMap<IPlotter, int[]>();
-    
+
     /**
      * Clear the list of plotters.
      */
@@ -24,9 +25,10 @@
         System.out.println("clearing PlotterRegistry");
         plotterMap.clear();
     }
-    
+
     /**
      * Find a plotter that contains the region object.
+     * 
      * @param region The plotter region object.
      * @return The plotter that contains this region or null if none.
      */
@@ -40,20 +42,31 @@
         }
         return null;
     }
-    
+
+    /**
+     * Get the tab indices of the plotter.
+     * 
+     * @param plotter the plotter to lookup
+     * @return the tab indices of the plotter or <code>null</code> if it doesn't exist
+     */
+    public int[] getTabIndices(IPlotter plotter) {
+        return plotterMap.get(plotter);
+    }
+
     /**
      * Register a plotter along with its tab indices.
+     * 
      * @param plotter The plotter to register.
      * @param index1 The top tab index.
      * @param index2 The sub-tab index.
      */
     public void register(IPlotter plotter, int index1, int index2) {
-        plotterMap.put(plotter, new int[] { index1, index2 });
+        plotterMap.put(plotter, new int[] {index1, index2});
     }
-    
+
     /**
-     * Find a plotter by its tab indices e.g. those that are currently selected
-     * in an application.
+     * Find a plotter by its tab indices e.g. those that are currently selected in an application.
+     * 
      * @param index1 The top tab index.
      * @param index2 The sub-tab index.
      * @return The plotter or null if none found.
@@ -67,9 +80,10 @@
         }
         return null;
     }
-    
+
     /**
      * Get the current collection of plotters as an unmodifiable collection.
+     * 
      * @return The current collection of plotters.
      */
     public List<IPlotter> getPlotters() {

Modified: java/branches/HPSJAVA-488/monitoring-util/src/main/java/org/hps/monitoring/subsys/et/EtSystemMonitor.java
 =============================================================================
--- java/branches/HPSJAVA-488/monitoring-util/src/main/java/org/hps/monitoring/subsys/et/EtSystemMonitor.java	(original)
+++ java/branches/HPSJAVA-488/monitoring-util/src/main/java/org/hps/monitoring/subsys/et/EtSystemMonitor.java	Fri Jun 12 15:27:10 2015
@@ -50,7 +50,7 @@
                     elapsedMillis = System.currentTimeMillis() - eventReceivedMillis;
                 if (elapsedMillis > warningIntervalMillis)
                     systemStatus.setStatus(StatusCode.WARNING, "No ET events received for " + elapsedMillis + " millis.");
-                else
+                else if (systemStatus.getStatusCode()!=StatusCode.OKAY)
                     systemStatus.setStatus(StatusCode.OKAY, "ET events received.");
             }
         };

Modified: java/branches/HPSJAVA-488/monitoring-util/src/main/java/org/hps/monitoring/trigger/AbstractTablePanel.java
 =============================================================================
--- java/branches/HPSJAVA-488/monitoring-util/src/main/java/org/hps/monitoring/trigger/AbstractTablePanel.java	(original)
+++ java/branches/HPSJAVA-488/monitoring-util/src/main/java/org/hps/monitoring/trigger/AbstractTablePanel.java	Fri Jun 12 15:27:10 2015
@@ -61,7 +61,7 @@
 		setLayout(null);
 		
 		// Create header labels for the tables.
-		localHeader = new JLabel("Local Statistics");
+		localHeader = new JLabel("Instantaneous Statistics");
 		localHeader.setHorizontalAlignment(JLabel.CENTER);
 		add(localHeader);
 		

Modified: java/branches/HPSJAVA-488/monitoring-util/src/main/java/org/hps/monitoring/trigger/AbstractTriggerTablePanel.java
 =============================================================================
--- java/branches/HPSJAVA-488/monitoring-util/src/main/java/org/hps/monitoring/trigger/AbstractTriggerTablePanel.java	(original)
+++ java/branches/HPSJAVA-488/monitoring-util/src/main/java/org/hps/monitoring/trigger/AbstractTriggerTablePanel.java	Fri Jun 12 15:27:10 2015
@@ -109,7 +109,7 @@
 			for(int i = 0; i < 2; i++) {
 				sspSimTriggers[i] = triggerStats[i][0].getSSPSimulatedTriggers() + triggerStats[i][1].getSSPSimulatedTriggers();
 				sspBankTriggers[i] = triggerStats[i][0].getReportedTriggers() + triggerStats[i][1].getReportedTriggers();
-				sspBankTriggers[i] = triggerStats[i][0].getReconSimulatedTriggers() + triggerStats[i][1].getReconSimulatedTriggers();
+				reconSimTriggers[i] = triggerStats[i][0].getReconSimulatedTriggers() + triggerStats[i][1].getReconSimulatedTriggers();
 				sspMatchedTriggers[i] = triggerStats[i][0].getMatchedSSPSimulatedTriggers() + triggerStats[i][1].getMatchedSSPSimulatedTriggers();
 				reconMatchedTriggers[i] = triggerStats[i][0].getMatchedReconSimulatedTriggers() + triggerStats[i][1].getMatchedReconSimulatedTriggers();
 			}

Modified: java/branches/HPSJAVA-488/monitoring-util/src/main/java/org/hps/monitoring/trigger/EfficiencyTablePanel.java
 =============================================================================
--- java/branches/HPSJAVA-488/monitoring-util/src/main/java/org/hps/monitoring/trigger/EfficiencyTablePanel.java	(original)
+++ java/branches/HPSJAVA-488/monitoring-util/src/main/java/org/hps/monitoring/trigger/EfficiencyTablePanel.java	Fri Jun 12 15:27:10 2015
@@ -50,7 +50,8 @@
 		"", "Singles 0", "Singles 1", "Pair 0", "Pair 1", "Count"
 	};
 	private static final String[] ROW_NAMES = {
-		"", "Random", "Cosmic", "Singles 0", "Singles 1", "Pair 0", "Pair 1"
+		"", "Singles 0", "Singles 1", "Pair 0", "Pair 1", "Pulser", "Cosmic"
+		//"", "Random", "Cosmic", "Singles 0", "Singles 1", "Pair 0", "Pair 1"
 	};
 	
 	/**
@@ -141,7 +142,7 @@
 						globalText = globalText + " (  N/A  %)";
 					} else {
 						globalText = String.format("%s (%7.3f%%)", globalText,
-								(100.0 * matched[LOCAL][seenTriggerType][tiTriggerType] / triggers[GLOBAL][seenTriggerType][tiTriggerType]));
+								(100.0 * matched[GLOBAL][seenTriggerType][tiTriggerType] / triggers[GLOBAL][seenTriggerType][tiTriggerType]));
 					}
 					globalModel.setValueAt(globalText, tiTriggerType + 1, seenTriggerType + 1);
 				}
@@ -206,4 +207,4 @@
 		return new JTable[] { localTable, globalTable };
 	}
 	
-}
+}

Modified: java/branches/HPSJAVA-488/parent/pom.xml
 =============================================================================
--- java/branches/HPSJAVA-488/parent/pom.xml	(original)
+++ java/branches/HPSJAVA-488/parent/pom.xml	Fri Jun 12 15:27:10 2015
@@ -6,13 +6,13 @@
     <groupId>org.hps</groupId>
     <artifactId>hps-parent</artifactId>
     <packaging>pom</packaging>
-    <version>3.3.1-SNAPSHOT</version>
+    <version>3.3.3-SNAPSHOT</version>
     <name>parent</name>
     <description>HPS Java parent POM</description>
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <org.lcsim.cacheDir>${user.home}</org.lcsim.cacheDir>
-        <lcsimVersion>3.1.1-SNAPSHOT</lcsimVersion>
+        <lcsimVersion>3.1.1</lcsimVersion>
         <skipSite>false</skipSite>
         <skipPlugin>false</skipPlugin>
     </properties>
@@ -31,6 +31,11 @@
             <id>lcsim-repo-public</id>
             <name>LCSIM Public Maven Repository</name>
             <url>http://srs.slac.stanford.edu/nexus/content/groups/lcsim-maven2-public/</url>
+        </repository>
+        <repository>
+            <id>jlab-coda-repo-public</id>
+            <name>JLAB CODA Maven Repository</name>
+            <url>https://coda.jlab.org/maven/</url>
         </repository>
         <repository>
             <id>maven-central-repo</id>
@@ -80,6 +85,7 @@
             <groupId>org.lcsim</groupId>
             <artifactId>lcsim-distribution</artifactId>
             <version>${lcsimVersion}</version>
+            <type>pom</type>
             <exclusions>
                 <exclusion>
                     <groupId>jdom</groupId>
@@ -88,6 +94,39 @@
                 <exclusion>
                     <groupId>commons-math</groupId>
                     <artifactId>commons-math</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>freehep-graphicsio-tests</groupId>
+                    <artifactId>org.freehep</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>aida-test</groupId>
+                    <artifactId>hep.aida</artifactId>
+                </exclusion>
+                <!-- Exclude some unneeded lcsim jars. -->
+                <exclusion>
+                    <groupId>org.lcsim</groupId>
+                    <artifactId>lcsim-analysis</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.lcsim</groupId>
+                    <artifactId>lcsim-cal-calib</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.lcsim</groupId>
+                    <artifactId>detector-data</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.lcsim</groupId>
+                    <artifactId>lcsim-mc</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.lcsim</groupId>
+                    <artifactId>lcsim-steering-files</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.lcsim</groupId>
+                    <artifactId>lcsim-users</artifactId>
                 </exclusion>
             </exclusions>
         </dependency>
@@ -98,93 +137,98 @@
             <dependency>
                 <groupId>org.hps</groupId>
                 <artifactId>hps-util</artifactId>
-                <version>3.3.1-SNAPSHOT</version>
+                <version>3.3.3-SNAPSHOT</version>
             </dependency>
             <dependency>
                 <groupId>org.hps</groupId>
                 <artifactId>hps-detector-data</artifactId>
-                <version>3.3.1-SNAPSHOT</version>
+                <version>3.3.3-SNAPSHOT</version>
+            </dependency>
+            <dependency>
+                <groupId>org.hps</groupId>
+                <artifactId>hps-detector-model</artifactId>
+                <version>3.3.3-SNAPSHOT</version>
             </dependency>
             <dependency>
                 <groupId>org.hps</groupId>
                 <artifactId>hps-conditions</artifactId>
-                <version>3.3.1-SNAPSHOT</version>
+                <version>3.3.3-SNAPSHOT</version>
             </dependency>
             <dependency>
                 <groupId>org.hps</groupId>
                 <artifactId>hps-ecal-recon</artifactId>
-                <version>3.3.1-SNAPSHOT</version>
+                <version>3.3.3-SNAPSHOT</version>
             </dependency>
             <dependency>
                 <groupId>org.hps</groupId>
                 <artifactId>hps-ecal-readout-sim</artifactId>
-                <version>3.3.1-SNAPSHOT</version>
+                <version>3.3.3-SNAPSHOT</version>
             </dependency>
             <dependency>
                 <groupId>org.hps</groupId>
                 <artifactId>hps-tracking</artifactId>
-                <version>3.3.1-SNAPSHOT</version>
+                <version>3.3.3-SNAPSHOT</version>
             </dependency>
             <dependency>
                 <groupId>org.hps</groupId>
                 <artifactId>hps-evio</artifactId>
-                <version>3.3.1-SNAPSHOT</version>
+                <version>3.3.3-SNAPSHOT</version>
             </dependency>
             <dependency>
                 <groupId>org.hps</groupId>
                 <artifactId>hps-recon</artifactId>
-                <version>3.3.1-SNAPSHOT</version>
+                <version>3.3.3-SNAPSHOT</version>
             </dependency>
             <dependency>
                 <groupId>org.hps</groupId>
                 <artifactId>hps-analysis</artifactId>
-                <version>3.3.1-SNAPSHOT</version>
+                <version>3.3.3-SNAPSHOT</version>
             </dependency>
             <dependency>
                 <groupId>org.hps</groupId>
                 <artifactId>hps-monitoring-drivers</artifactId>
-                <version>3.3.1-SNAPSHOT</version>
+                <version>3.3.3-SNAPSHOT</version>
             </dependency>
             <dependency>
                 <groupId>org.hps</groupId>
                 <artifactId>hps-monitoring-app</artifactId>
-                <version>3.3.1-SNAPSHOT</version>
+                <version>3.3.3-SNAPSHOT</version>
             </dependency>
             <dependency>
                 <groupId>org.hps</groupId>
                 <artifactId>hps-users</artifactId>
-                <version>3.3.1-SNAPSHOT</version>
+                <version>3.3.3-SNAPSHOT</version>
             </dependency>
             <dependency>
                 <groupId>org.hps</groupId>
                 <artifactId>hps-steering-files</artifactId>
-                <version>3.3.1-SNAPSHOT</version>
+                <version>3.3.3-SNAPSHOT</version>
             </dependency>
             <dependency>
                 <groupId>org.hps</groupId>
                 <artifactId>hps-distribution</artifactId>
-                <version>3.3.1-SNAPSHOT</version>
+                <version>3.3.3-SNAPSHOT</version>
             </dependency>
             <dependency>
                 <groupId>org.hps</groupId>
                 <artifactId>hps-ecal-event-display</artifactId>
-                <version>3.3.1-SNAPSHOT</version>
+                <version>3.3.3-SNAPSHOT</version>
             </dependency>
             <dependency>
                 <groupId>org.hps</groupId>
                 <artifactId>hps-record-util</artifactId>
-                <version>3.3.1-SNAPSHOT</version>
+                <version>3.3.3-SNAPSHOT</version>
             </dependency>
             <dependency>
                 <groupId>org.hps</groupId>
                 <artifactId>hps-monitoring-util</artifactId>
-                <version>3.3.1-SNAPSHOT</version>
+                <version>3.3.3-SNAPSHOT</version>
             </dependency>
             <!-- Next are external dependencies used in multiple modules. -->
             <dependency>
                 <groupId>org.jlab.coda</groupId>
                 <artifactId>jevio</artifactId>
-                <version>4.4.5</version>
+                <version>4.4.6</version>
             </dependency>
             <dependency>
                 <groupId>org.jlab.coda</groupId>
@@ -192,14 +236,24 @@
                 <version>14.1</version>
             </dependency>
             <dependency>
+                <groupId>com.google.guava</groupId>
+                <artifactId>guava</artifactId>
+                <version>18.0</version>
+            </dependency>
+            <dependency>
                 <groupId>org.reflections</groupId>
                 <artifactId>reflections</artifactId>
                 <version>0.9.9-RC1</version>
             </dependency>
             <dependency>
+                <groupId>org.apache.commons</groupId>
+                <artifactId>commons-math3</artifactId>
+                <version>3.5</version>
+            </dependency>
+            <dependency>
                 <groupId>jfreechart-aida-experimental</groupId>
                 <artifactId>jfreechart-aida-experimental</artifactId>
-                <version>1.6</version>
+                <version>1.7</version>
                 <exclusions>
                     <exclusion>
                         <groupId>jdom</groupId>

Modified: java/branches/HPSJAVA-488/plugin/pom.xml
 =============================================================================
--- java/branches/HPSJAVA-488/plugin/pom.xml	(original)
+++ java/branches/HPSJAVA-488/plugin/pom.xml	Fri Jun 12 15:27:10 2015
@@ -7,7 +7,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>../parent/pom.xml</relativePath>
-        <version>3.3.1-SNAPSHOT</version>
+        <version>3.3.3-SNAPSHOT</version>
     </parent>
     <scm>
         <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/plugin/</url>
@@ -51,24 +51,6 @@
                             <value>http://srs.slac.stanford.edu/nexus/service/local/artifact/maven/redirect?r=lcsim-maven2-public</value>
                         </property>
                     </redirectUrls>
-                    <includes>
-                        <include>org.apache.commons:commons-math3</include>
-                        <include>org.hps:hps-analysis</include>
-                        <include>org.hps:hps-conditions</include>
-                        <include>org.hps:hps-detector-data</include>
-                        <include>org.hps:hps-ecal-readout-sim</include>
-                        <include>org.hps:hps-ecal-recon</include>
-                        <include>org.hps:hps-et</include>
-                        <include>org.hps:hps-evio</include>
-                        <include>org.hps:hps-recon</include>
-                        <include>org.hps:hps-record-util</include>
-                        <include>org.hps:hps-tracking</include>
-                        <include>org.hps:hps-users</include>
-                        <include>org.hps:hps-util</include>
-                        <include>mysql:mysql-connector-java</include>
-                        <include>org.jlab.coda:jevio</include>
-                        <include>org.jlab.coda:et</include>                        
-                    </includes>
                 </configuration>
                 <executions>
                     <execution>

Modified: java/branches/HPSJAVA-488/pom.xml
 =============================================================================
--- java/branches/HPSJAVA-488/pom.xml	(original)
+++ java/branches/HPSJAVA-488/pom.xml	Fri Jun 12 15:27:10 2015
@@ -10,7 +10,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>parent/pom.xml</relativePath>
-        <version>3.3.1-SNAPSHOT</version>
+        <version>3.3.3-SNAPSHOT</version>
     </parent>   
     <scm>
         <url>svn://svn.freehep.org/hps/java/trunk/</url>
@@ -132,6 +132,7 @@
         <module>datacat</module>
 -->        
         <module>detector-data</module>
+        <module>detector-model</module>
         <module>distribution</module>
         <module>ecal-event-display</module>
         <module>ecal-readout-sim</module>

Modified: java/branches/HPSJAVA-488/recon/pom.xml
 =============================================================================
--- java/branches/HPSJAVA-488/recon/pom.xml	(original)
+++ java/branches/HPSJAVA-488/recon/pom.xml	Fri Jun 12 15:27:10 2015
@@ -8,7 +8,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>../parent/pom.xml</relativePath>
-        <version>3.3.1-SNAPSHOT</version>
+        <version>3.3.3-SNAPSHOT</version>
     </parent>
     <scm>
         <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/recon/</url>

Modified: java/branches/HPSJAVA-488/recon/src/main/java/org/hps/recon/particle/ReconParticleDriver.java
 =============================================================================
--- java/branches/HPSJAVA-488/recon/src/main/java/org/hps/recon/particle/ReconParticleDriver.java	(original)
+++ java/branches/HPSJAVA-488/recon/src/main/java/org/hps/recon/particle/ReconParticleDriver.java	Fri Jun 12 15:27:10 2015
@@ -4,6 +4,7 @@
 import hep.physics.vec.BasicHepLorentzVector;
 import hep.physics.vec.Hep3Vector;
 import hep.physics.vec.HepLorentzVector;
+import hep.physics.vec.VecOp;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -297,24 +298,13 @@
         if (!unmatchedClusters.isEmpty()) // Iterate over the remaining unmatched clusters.
         {
             for (Cluster unmatchedCluster : unmatchedClusters) {
-                // Create a reconstructed particle to represent the
-                // unmatched cluster.
+                // Create a reconstructed particle to represent the unmatched cluster.
                 ReconstructedParticle particle = new BaseReconstructedParticle();
-                HepLorentzVector fourVector = new BasicHepLorentzVector(0, 0, 0, 0);
-
-                // Add the cluster to the particle.
-                particle.addCluster(unmatchedCluster);
-
-                // Set the reconstructed particle properties based on
-                // the cluster properties.
-                ((BasicHepLorentzVector) fourVector).setT(unmatchedCluster.getEnergy());
-                ((BaseReconstructedParticle) particle).setCharge(0);
-                ((BaseReconstructedParticle) particle).set4Vector(fourVector);
-
-                // The particle is assumed to be a photon, since it
-                // did not leave any track.
+                
+                // The particle is assumed to be a photon, since it did not leave a track.
                 ((BaseReconstructedParticle) particle).setParticleIdUsed(new SimpleParticleID(22, 0, 0, 0));
                 
+                // apply cluster corrections
                 if (unmatchedCluster.getType() == ClusterType.RECON.getType()) {
                     int pid = particle.getParticleIDUsed().getPDG();
                     // If not electron....
@@ -324,6 +314,18 @@
                         ClusterUtilities.applyCorrections(unmatchedCluster);
                     }
                 }
+                //get energy and direction from the cluster
+                Hep3Vector p = new BasicHep3Vector(unmatchedCluster.getPosition());
+                double e = unmatchedCluster.getEnergy();
+                // create momentum vector from direction unit vector times the energy (massless photon)
+                HepLorentzVector fourVector = new BasicHepLorentzVector(e, VecOp.mult(e, VecOp.unit(p)));
+
+                // Add the cluster to the particle.
+                particle.addCluster(unmatchedCluster);
+
+                // Set the reconstructed particle properties based on the cluster properties.
+                ((BaseReconstructedParticle) particle).setCharge(0);
+                ((BaseReconstructedParticle) particle).set4Vector(fourVector);
 
                 // Add the particle to the reconstructed particle list.
                 particles.add(particle);

Modified: java/branches/HPSJAVA-488/record-util/pom.xml
 =============================================================================
--- java/branches/HPSJAVA-488/record-util/pom.xml	(original)
+++ java/branches/HPSJAVA-488/record-util/pom.xml	Fri Jun 12 15:27:10 2015
@@ -7,7 +7,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>../parent/pom.xml</relativePath>
-        <version>3.3.1-SNAPSHOT</version>
+        <version>3.3.3-SNAPSHOT</version>
     </parent>
     <scm>
         <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/record-util/</url>

Modified: java/branches/HPSJAVA-488/record-util/src/main/java/org/hps/record/epics/EpicsEtProcessor.java
 =============================================================================
--- java/branches/HPSJAVA-488/record-util/src/main/java/org/hps/record/epics/EpicsEtProcessor.java	(original)
+++ java/branches/HPSJAVA-488/record-util/src/main/java/org/hps/record/epics/EpicsEtProcessor.java	Fri Jun 12 15:27:10 2015
@@ -35,9 +35,9 @@
             throw new RuntimeException(e);
         }
         this.evioProcessor.process(evio);
-        if (this.evioProcessor.getEpicsScalarData() != null) {
-            System.out.println("EpicsEtProcessor created EpicsScalarData ...");
-            System.out.println(this.evioProcessor.getEpicsScalarData());
+        if (this.evioProcessor.getEpicsData() != null) {
+            System.out.println("EpicsEtProcessor created EpicsData ...");
+            System.out.println(this.evioProcessor.getEpicsData());
         }
     }
 }

Modified: java/branches/HPSJAVA-488/record-util/src/main/java/org/hps/record/epics/EpicsEvioProcessor.java
 =============================================================================
--- java/branches/HPSJAVA-488/record-util/src/main/java/org/hps/record/epics/EpicsEvioProcessor.java	(original)
+++ java/branches/HPSJAVA-488/record-util/src/main/java/org/hps/record/epics/EpicsEvioProcessor.java	Fri Jun 12 15:27:10 2015
@@ -1,34 +1,40 @@
 package org.hps.record.epics;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 import org.hps.record.evio.EvioEventConstants;
 import org.hps.record.evio.EvioEventProcessor;
 import org.jlab.coda.jevio.BaseStructure;
 import org.jlab.coda.jevio.EvioEvent;
+import org.lcsim.util.log.DefaultLogFormatter;
+import org.lcsim.util.log.LogUtil;
 
 /**
- * This is an EVIO event processor that will read EPICS events (event tag 31) and turn them into {@link EpicsScalarData}
- * objects.
+ * This is an EVIO event processor that will read EPICS events (event tag 31) and turn them into {@link EpicsData} objects.
  *
  * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
 public final class EpicsEvioProcessor extends EvioEventProcessor {
 
+    private static final Logger LOGGER = LogUtil.create(EpicsEvioProcessor.class, new DefaultLogFormatter(), Level.INFO);
+
     /**
      * The current EPICS data object.
      */
-    private EpicsScalarData data;
+    private EpicsData data;
 
     /**
-     * Get the current {@link EpicsScalarData} object created from record processing.
+     * Get the current {@link EpicsData} object created from record processing.
      *
-     * @return the {@link EpicsScalarData} object created from record processing
+     * @return the {@link EpicsData} object created from record processing
      */
-    public EpicsScalarData getEpicsScalarData() {
+    public EpicsData getEpicsData() {
         return this.data;
     }
 
     /**
-     * Process EVIO data and create a {@link EpicsScalarData} if EPICS data bank exists in the event.
+     * Process EVIO data and create a {@link EpicsData} if EPICS data bank exists in the event.
      *
      * @param evio the <code>EvioEvent</code> that possibly has EPICS data
      */
@@ -40,19 +46,22 @@
             return;
         }
 
+        LOGGER.info("processing EPICS event " + evio.getEventNumber());
+
         // Find the bank with the EPICS information.
         BaseStructure epicsBank = null;
         final BaseStructure topBank = evio.getChildrenList().get(0);
         for (final BaseStructure childBank : topBank.getChildrenList()) {
             if (childBank.getHeader().getTag() == EvioEventConstants.EPICS_BANK_TAG) {
                 epicsBank = childBank;
+                LOGGER.fine("found EPICS data bank " + childBank.getHeader().getTag());
                 break;
             }
         }
 
         if (epicsBank != null) {
             final String epicsData = epicsBank.getStringData()[0];
-            this.data = new EpicsScalarData();
+            this.data = new EpicsData();
             this.data.fromString(epicsData);
         }
     }

Modified: java/branches/HPSJAVA-488/record-util/src/main/java/org/hps/record/epics/EpicsGenericObject.java
 =============================================================================
--- java/branches/HPSJAVA-488/record-util/src/main/java/org/hps/record/epics/EpicsGenericObject.java	(original)
+++ java/branches/HPSJAVA-488/record-util/src/main/java/org/hps/record/epics/EpicsGenericObject.java	Fri Jun 12 15:27:10 2015
@@ -3,9 +3,8 @@
 import org.lcsim.event.GenericObject;
 
 /**
- * This is an implementation of GenericObject for reading and writing EPICS data. There is no functionality here
- * intended for ends users. Instead, the EPICS data should be accessed using
- * {@link EpicsScalarData#read(org.lcsim.event.EventHeader)} to create the data object from input event data.
+ * This is an implementation of GenericObject for reading and writing EPICS data. There is no functionality here intended for ends users. Instead, the
+ * EPICS data should be accessed using {@link EpicsData#read(org.lcsim.event.EventHeader)} to create the data object from input event data.
  *
  * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */

Modified: java/branches/HPSJAVA-488/record-util/src/main/java/org/hps/record/evio/EvioEventConstants.java
 =============================================================================
--- java/branches/HPSJAVA-488/record-util/src/main/java/org/hps/record/evio/EvioEventConstants.java	(original)
+++ java/branches/HPSJAVA-488/record-util/src/main/java/org/hps/record/evio/EvioEventConstants.java	Fri Jun 12 15:27:10 2015
@@ -71,14 +71,14 @@
     public static final int PRESTART_EVENT_TAG = 17;
 
     /**
-     * Tag of the scalars integer bank, which is a child of the crate bank.
+     * Tag of the scalers integer bank, which is a child of the crate bank.
      */
-    public static final int SCALARS_BANK_TAG = 57621;
+    public static final int SCALERS_BANK_TAG = 57621;
 
     /**
-     * Tag of the scalars crate bank, which is a child of the top bank.
+     * Tag of the scalers crate bank, which is a child of the top bank.
      */
-    public static final int SCALARS_CRATE_TAG = 39;
+    public static final int SCALERS_CRATE_TAG = 39;
 
     /**
      * CODA SYNC event tag.

Modified: java/branches/HPSJAVA-488/record-util/src/main/java/org/hps/record/evio/EvioEventUtilities.java
 =============================================================================
--- java/branches/HPSJAVA-488/record-util/src/main/java/org/hps/record/evio/EvioEventUtilities.java	(original)
+++ java/branches/HPSJAVA-488/record-util/src/main/java/org/hps/record/evio/EvioEventUtilities.java	Fri Jun 12 15:27:10 2015
@@ -189,6 +189,26 @@
     }
 
     /**
+     * Manually set the event number on an <code>EvioEvent</code> from its "EVENT ID" bank.
+     *
+     * @param evioEvent the input <code>EvioEvent</code>
+     */
+    public static void setEventNumber(final EvioEvent evioEvent) {
+        int eventNumber = -1;
+        if (evioEvent.getChildrenList() != null) {
+            for (final BaseStructure bank : evioEvent.getChildrenList()) {
+                if (bank.getHeader().getTag() == EvioEventConstants.EVENTID_BANK_TAG) {
+                    eventNumber = bank.getIntData()[0];
+                    break;
+                }
+            }
+        }
+        if (eventNumber != -1) {
+            evioEvent.setEventNumber(eventNumber);
+        }
+    }
+
+    /**
      * Class should not be instantiated.
      */
     private EvioEventUtilities() {

Modified: java/branches/HPSJAVA-488/record-util/src/main/java/org/hps/record/evio/EvioFileProducer.java
 =============================================================================
--- java/branches/HPSJAVA-488/record-util/src/main/java/org/hps/record/evio/EvioFileProducer.java	(original)
+++ java/branches/HPSJAVA-488/record-util/src/main/java/org/hps/record/evio/EvioFileProducer.java	Fri Jun 12 15:27:10 2015
@@ -1,13 +1,22 @@
 package org.hps.record.evio;
 
+import java.io.BufferedReader;
 import java.io.File;
-import java.net.InetAddress;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.HelpFormatter;
+import org.apache.commons.cli.Options;
+import org.apache.commons.cli.PosixParser;
 import org.jlab.coda.et.EtAttachment;
 import org.jlab.coda.et.EtConstants;
 import org.jlab.coda.et.EtEvent;
@@ -18,91 +27,143 @@
 import org.jlab.coda.jevio.EventWriter;
 import org.jlab.coda.jevio.EvioEvent;
 import org.jlab.coda.jevio.EvioReader;
+import org.lcsim.util.log.DefaultLogFormatter;
+import org.lcsim.util.log.LogUtil;
 
 /**
- * A utility class for streaming an EVIO file to an ET server.
+ * A command line utility for streaming EVIO files to an ET server.
  * <p>
- * Original version was copied from the CODA group's ET java module.
+ * The original version was copied from the CODA ET module and modified.
  *
  * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
-// TODO: Add option to set number of events in the put array.
 public final class EvioFileProducer {
 
     /**
-     * Flag to turn on/off debug print.
-     */
-    private static final boolean debug = false;
+     * Default event count for printing event sequence number.
+     */
+    private static final int DEFAULT_COUNT = 1000;
+
+    /**
+     * Default delay time in milliseconds between events.
+     */
+    private static final int DEFAULT_DELAY = 0;
+
+    /**
+     * The default ET group.
+     */
+    private static final int DEFAULT_ET_GROUP = 1;
+
+    /**
+     * Default event buffer size (200 KB).
+     */
+    private static final int DEFAULT_EVENT_SIZE = 200000;
+
+    /**
+     * Default host name.
+     */
+    private static final String DEFAULT_HOST = "localhost";
+
+    /**
+     * Default ET system name.
+     */
+    private static final String DEFAULT_NAME = "ETBuffer";
+
+    /**
+     * Maximum port number of ET server (maximum value of a TCP/IP port).
+     */
+    private static final int ET_PORT_MAX = 65535;
+
+    /**
+     * Minimum port number of ET server (lower port numbers not allowed).
+     */
+    private static final int ET_PORT_MIN = 1024;
+
+    /**
+     * Setup the logger.
+     */
+    private static final Logger LOGGER = LogUtil
+            .create(EvioFileProducer.class, new DefaultLogFormatter(), Level.CONFIG);
+
+    /**
+     * The command line options.
+     */
+    private static final Options OPTIONS = new Options();
+
+    /**
+     * Define the command line options.
+     */
+    static {
+        OPTIONS.addOption("h", "help", false, "print help");
+        OPTIONS.addOption("c", "count", true, "interval for printing event numbers");
+        OPTIONS.addOption("d", "delay", true, "delay in milliseconds between events");
+        OPTIONS.addOption("e", "file", true, "add an EVIO file");
+        OPTIONS.addOption("f", "name", true, "ET system name which should be a buffer file");
+        OPTIONS.addOption("g", "group", true, "group number of the events");
+        OPTIONS.addOption("H", "host", true, "server host name");
+        OPTIONS.addOption("l", "list", true, "text file with list of EVIO files");
+        OPTIONS.addOption("L", "log", true, "log level (INFO, FINE, etc.)");
+        OPTIONS.addOption("p", "port", true, "server port");
+        OPTIONS.addOption("s", "size", true, "event buffer size in bytes");
+    }
 
     /**
      * The externally accessible main method.
      *
-     * @param args The command line arguments.
+     * @param args the command line arguments
      */
     public static void main(final String[] args) {
-        new EvioFileProducer().doMain(args); // call wrapper method
-    }
-
-    /**
-     * Print usage statement.
+        new EvioFileProducer().run(args);
+    }
+
+    /**
+     * Print usage statement and exit.
      */
     private static void usage() {
-        System.out.println("\nUsage: java Producer -f <et name> -e <evio file> [-p <server port>] [-host <host>]"
-                + " [-d <delay in millisec>] [-g <group #>]\n\n" + "       -f     ET system's name\n"
-                + "       -s     size in bytes for requested events\n"
-                + "       -p     port number for a udp broadcast\n"
-                + "       -g     group number of new events to get\n"
-                + "       -host  host the ET system resides on (defaults to anywhere)\n\n"
-                + "        This consumer works by making a connection to the\n"
-                + "        ET system's tcp server port.\n");
+        final HelpFormatter help = new HelpFormatter();
+        help.printHelp("EvioFileProducer", OPTIONS);
         System.exit(1);
     }
 
     /**
-     * The byte buffer used to transfer data from EVIO to ET.
-     */
-    private ByteBuffer byteBuffer;
+     * Event count for printing message.
+     */
+    private int count = DEFAULT_COUNT;
 
     /**
      * A delay in milliseconds between put operations.
      */
-    private int delay = 0;
-
-    /**
-     * The ET system name which generally maps to a buffer file.
-     */
-    private String etName;
-
-    /**
-     * The list of input EVIO files.
+    private int delay = DEFAULT_DELAY;
+
+    /**
+     * The ET system name which maps to a buffer file.
+     */
+    private String etName = DEFAULT_NAME;
+
+    /**
+     * The master list of input EVIO files to stream.
      */
     private final List<File> evioFiles = new ArrayList<File>();
 
     /**
-     * This is used for a "group" value when doing put but not sure what it actually does.
-     */
-    private int group = 1;
-
-    /**
-     * The server host name.
-     */
-    private String host;
-
-    /**
-     * The server's network port.
+     * The ET group (default is 1).
+     */
+    private int group = DEFAULT_ET_GROUP;
+
+    /**
+     * The server host name (default is localhost).
+     */
+    private String host = DEFAULT_HOST;
+
+    /**
+     * The server's network port (default is standard ET server port).
      */
     private int port = EtConstants.serverPort;
 
     /**
-     * The EVIO reader used to read the input EVIO events.
-     */
-    private EvioReader reader;
-
-    /**
-     * The default ET event size.
-     */
-    // FIXME: Should be a lot bigger?
-    private int size = 10000; // Default event size.
+     * The default ET event size (default is 200 KB).
+     */
+    private int size = DEFAULT_EVENT_SIZE;
 
     /**
      * Class constructor.
@@ -111,174 +172,208 @@
     }
 
     /**
-     * Copy byte buffer to an <code>EtEvent</code>.
+     * Print the command line job configuration to the log.
+     */
+    private void logConfig() {
+        final StringBuffer sb = new StringBuffer();
+        sb.append("count = " + this.count + '\n');
+        sb.append("delay = " + this.delay + '\n');
+        sb.append("etName = " + this.etName + '\n');
+        sb.append("group = " + this.group + '\n');
+        sb.append("host = " + this.host + '\n');
+        sb.append("port = " + this.port + '\n');
+        sb.append("size = " + this.size + '\n');
+        sb.append("EVIO files ..." + '\n');
+        for (final File evioFile : this.evioFiles) {
+            sb.append(evioFile.getPath() + '\n');
+        }
+        LOGGER.config(sb.toString());
+    }
+
+    /**
+     * Run the job by streaming all the EVIO files to the ET server using the command line arguments.
      *
-     * @param event The target EtEvent.
-     */
-    public void copyToEtEvent(final EtEvent event) {
-        event.getDataBuffer().put(this.byteBuffer);
-    }
-
-    /**
-     * Wrapper method called in main.
-     *
-     * @param args The command line arguments.
-     */
-    public void doMain(final String[] args) {
+     * @param args the command line arguments
+     */
+    public void run(final String[] args) {
+
+        // Command line parser.
+        final PosixParser parser = new PosixParser();
+
         try {
-            for (int i = 0; i < args.length; i++) {
-                if (args[i].equalsIgnoreCase("-e")) {
-                    // evioFileName = new String(args[++i]);
-                    this.evioFiles.add(new File(args[++i]));
-                } else if (args[i].equalsIgnoreCase("-f")) {
-                    this.etName = args[++i];
-                } else if (args[i].equalsIgnoreCase("-host")) {
-                    this.host = args[++i];
-                } else if (args[i].equalsIgnoreCase("-p")) {
-                    try {
-                        this.port = Integer.parseInt(args[++i]);
-                        if (this.port < 1024 || this.port > 65535) {
-                            System.out.println("Port number must be between 1024 and 65535.");
-                            usage();
-                            return;
-                        }
-                    } catch (final NumberFormatException ex) {
-                        System.out.println("Did not specify a proper port number.");
-                        usage();
-                        return;
-                    }
-                } else if (args[i].equalsIgnoreCase("-s")) {
-                    try {
-                        this.size = Integer.parseInt(args[++i]);
-                        if (this.size < 1) {
-                            System.out.println("Size needs to be positive int.");
-                            usage();
-                            return;
-                        }
-                    } catch (final NumberFormatException ex) {
-                        System.out.println("Did not specify a proper size.");
-                        usage();
-                        return;
-                    }
-                } else if (args[i].equalsIgnoreCase("-g")) {
-                    try {
-                        this.group = Integer.parseInt(args[++i]);
-                        if (this.group < 1 || this.group > 10) {
-                            System.out.println("Group number must be between 0 and 10.");
-                            usage();
-                            return;
-                        }
-                    } catch (final NumberFormatException ex) {
-                        System.out.println("Did not specify a proper group number.");
-                        usage();
-                        return;
-                    }
-                } else if (args[i].equalsIgnoreCase("-d")) {
-                    try {
-                        this.delay = Integer.parseInt(args[++i]);
-                        if (this.delay < 1) {
-                            System.out.println("delay must be > 0.");
-                            usage();
-                            return;
-                        }
-                    } catch (final NumberFormatException ex) {
-                        System.out.println("Did not specify a proper delay.");
-                        usage();
-                        return;
-                    }
-                } else {
-                    usage();
-                    return;
-                }
-            }
-
-            if (this.host == null) {
-                // host = EtConstants.hostAnywhere;
-                this.host = InetAddress.getLocalHost().getHostName();
-            }
-
-            // ET name is required.
-            if (this.etName == null) {
-                System.out.println("EVIO file name argument is required");
-                usage();
-                return;
-            }
-
+
+            // Parse the command line arguments.
+            final CommandLine cl = parser.parse(OPTIONS, args);
+
+            // Set the log level of this class before doing anything else.
+            if (cl.hasOption("L")) {
+                final Level level = Level.parse(cl.getOptionValue("L"));
+                // Default level is CONFIG so this message will always show.
+                LOGGER.config("Log level will be set to " + level + ".");
+
+                // Set the new log level. This may suppress subsequent configuration print outs!
+                LOGGER.setLevel(level);
+            }
+
+            // Add EVIO files to the job.
+            if (cl.hasOption("e")) {
+                for (final String fileName : cl.getOptionValues("e")) {
+                    final File evioFile = new File(fileName);
+                    LOGGER.config("adding EVIO file " + evioFile.getPath());
+                    this.evioFiles.add(evioFile);
+                }
+            }
+
+            // Set ET name which is the buffer file.
+            if (cl.hasOption("f")) {
+                this.etName = cl.getOptionValue("f");
+            }
+
+            // Add EVIO files from a text file list, assuming one file path per line.
+            if (cl.hasOption("l")) {
+                final String filePath = cl.getOptionValue("l");
+                final File listFile = new File(filePath);
+                if (!listFile.exists()) {
+                    throw new IllegalArgumentException("The file " + listFile.getPath() + " does not exist.");
+                }
+                BufferedReader br = null;
+                try {
+                    br = new BufferedReader(new InputStreamReader(new FileInputStream(listFile)));
+                    String line;
+                    while ((line = br.readLine()) != null) {
+                        this.evioFiles.add(new File(line.trim()));
+                    }
+                } finally {
+                    if (br != null) {
+                        br.close();
+                    }
+                }
+            }
+
+            // Set host name.
+            if (cl.hasOption("H")) {
+                this.host = cl.getOptionValue("H");
+            }
+            // if (this.host == null) {
+            // host = EtConstants.hostAnywhere;
+            // this.host = InetAddress.getLocalHost().getHostName();
+            // }
+
+            // Set the port number.
+            if (cl.hasOption("p")) {
+                this.port = Integer.parseInt(cl.getOptionValue("p"));
+                if (this.port < ET_PORT_MIN || this.port > ET_PORT_MAX) {
+                    throw new IllegalArgumentException("Port number must be between 1024 and 65535.");
+                }
+            }
+            // Set the size of the event buffer in bytes.
+            if (cl.hasOption("s")) {
+                this.size = Integer.parseInt(cl.getOptionValue("s"));
+                if (this.size < 1) {
+                    throw new IllegalArgumentException("Size needs to be positive int.");
+                }
+            }
+
+            // Set the group number.
+            if (cl.hasOption("g")) {
+                this.group = Integer.parseInt(cl.getOptionValue("g"));
+                if (this.group < 1 || this.group > 10) {
+                    throw new IllegalArgumentException("Group number must be between 0 and 10.");
+                }
+            }
+
+            // Set the delay in milliseconds between putting events.
+            if (cl.hasOption("d")) {
+                this.delay = Integer.parseInt(cl.getOptionValue("d"));
+                if (this.delay < 1) {
+                    throw new IllegalArgumentException("The delay must be > 0.");
+                }
+            }
+
+            if (cl.hasOption("c")) {
+                this.count = Integer.parseInt(cl.getOptionValue("c"));
+                if (this.count < 1) {
+                    throw new IllegalArgumentException("The count must be > 0.");
+                }
+            }
+
+            // At least one EVIO file must be present.
             if (this.evioFiles.size() == 0) {
-                System.out.println("At least one input EVIO file is required.");
-                usage();
-                return;
+                throw new IllegalArgumentException("At least one input EVIO file is required.");
             }
 
             // Check existence of EVIO files.
-            System.out.println("EVIO input files ...");
+            LOGGER.info("Checking EVIO file list ... ");
             for (final File evioFile : this.evioFiles) {
-                System.out.println(evioFile.getPath());
                 if (!evioFile.exists()) {
-                    System.err.println("EVIO file does not exist: " + evioFile.getPath());
-                    throw new RuntimeException("EVIO input file does not exist.");
-                }
-            }
-
-            // Setup ET system with the command line config.
+                    throw new IllegalArgumentException("EVIO input file does not exist: " + evioFile.getPath());
+                }
+            }
+            LOGGER.info("EVIO file list was checked!");
+
+            // Print out the configuration for the job to the log.
+            logConfig();
+
+        } catch (final Exception e) { /* Catches errors in command line arguments. */
+            // If there are errors parsing or validating the command line arguments then print usage and exit.
+            LOGGER.log(Level.SEVERE, "Error while processing command line options.", e);
+            usage();
+        }
+
+        EtSystem sys = null;
+        EvioReader reader = null;
+
+        try {
+
+            // Setup ET system from the command line options.
             final EtSystemOpenConfig config = new EtSystemOpenConfig(this.etName, this.host, this.port);
-            final EtSystem sys = new EtSystem(config, EtConstants.debugInfo);
+            sys = new EtSystem(config, EtConstants.debugInfo);
             sys.open();
             final EtStation gc = sys.stationNameToObject("GRAND_CENTRAL");
             final EtAttachment att = sys.attach(gc);
 
-            // array of events
+            // Array of ET events.
             EtEvent[] mevs;
 
             // Loop over input EVIO file list.
             for (final File evioFile : this.evioFiles) {
 
-                // Open EVIO reader.
-                System.out.println("Opening next EVIO file: " + evioFile.getPath());
-                this.reader = new EvioReader(evioFile.getPath(), false);
-
-                // Print number of events.
-                if (debug) {
-                    System.out.println("EVIO file opened with " + this.reader.getEventCount() + " events.");
-                }
-
-                // Ref to current EVIO event.
+                // Open a new EVIO reader in sequential read mode so events are immediately streamed to server.
+                LOGGER.info("Opening next EVIO file " + evioFile.getPath() + " ...");
+                reader = new EvioReader(evioFile.getPath(), false, true);
+                LOGGER.info("Done opening file!");
+
+                // Reference to the current EVIO event.
                 EvioEvent event;
 
-                // Event sequence number; starts with 1.
+                // Event sequence number.
                 int eventCount = 0;
 
                 // Loop until event source is exhausted.
-                while (true) {
-
-                    // Get next event.
-                    event = this.reader.nextEvent();
+                while ((event = reader.nextEvent()) != null) {
+
+                    // Increment event count.
                     ++eventCount;
-                    if (eventCount % 1000 == 0) {
-                        System.out.println("EvioFileProducer - event <" + eventCount + ">");
-                    }
-                    if (event == null) {
-                        break;
-                    }
-
-                    // Try to parse the next event.
+
+                    // Print event sequence.
+                    if (eventCount % this.count == 0) {
+                        LOGGER.info("EVIO event " + eventCount);
+                    }
+
                     try {
-                        this.reader.parseEvent(event);
-                        if (debug) {
-                            System.out.println("event #" + event.getEventNumber() + " is " + event.getTotalBytes()
-                                    + " bytes");
-                        }
-                    } catch (final Exception e) {
+                        // Parse the next EVIO event.
+                        reader.parseEvent(event);
+                        LOGGER.finest("EVIO event " + event.getEventNumber() + " is " + event.getTotalBytes()
+                                + " bytes.");
+                    } catch (final Exception e) { /* Catches parse errors reading the EVIO events. */
                         e.printStackTrace();
-                        System.out.println("Error making EVIO event with sequence number <" + eventCount
-                                + "> in file <" + evioFile.getPath() + ">.");
+                        LOGGER.warning("Error making EVIO event with seq number " + eventCount + " in file "
+                                + evioFile.getPath());
                         // Attempt to recover from errors by skipping to next event if there are exceptions.
                         continue;
                     }
 
-                    if (debug) {
-                        System.out.println("new events - size=" + this.size + "; group=" + this.group);
-                    }
+                    LOGGER.finest("new events - size=" + this.size + "; group=" + this.group);
 
                     final int eventTag = EvioEventUtilities.getEventTag(event);
 
@@ -296,7 +391,7 @@
                     Arrays.fill(control, eventTag);
                     mevs[0].setControl(control);
 
-                    // Delay for X millis if applicable.
+                    // Apply delay in milliseconds.
                     if (this.delay > 0) {
                         Thread.sleep(this.delay);
                     }
@@ -309,36 +404,44 @@
                     try {
                         writer.close();
                     } catch (final Exception e) {
-                        System.out.println("Caught exception while closing writer.");
-                        e.printStackTrace();
+                        LOGGER.log(Level.WARNING, "Error while closing writer.", e);
                     }
                     mevs[0].setLength(buf.position());
                     mevs[0].setByteOrder(ByteOrder.nativeOrder());
-                    if (debug) {
-                        for (final EtEvent mev : mevs) {
-                            System.out.println("event length = " + mev.getLength() + ", remaining bytes: "
-                                    + mev.getDataBuffer().remaining());
-                        }
+
+                    for (final EtEvent mev : mevs) {
+                        LOGGER.finest("event length = " + mev.getLength() + ", remaining bytes: "
+                                + mev.getDataBuffer().remaining());
                     }
 
                     // Put events onto the ET ring.
                     sys.putEvents(att, mevs);
 
-                    if (debug) {
-                        System.out.println("Wrote event #" + eventCount + " to ET");
-                        System.out.println("-------------------------------");
-                        ++eventCount;
-                    }
-                }
-
-                this.reader.close();
-            }
-
-            // Cleanup.
-            sys.close();
-
-        } catch (final Exception e) {
-            throw new RuntimeException(e);
+                    LOGGER.finest("Sucessfully wrote " + eventCount + " event to ET which was EVIO event number "
+                            + event.getEventNumber() + " from file " + evioFile.getPath() + ".");
+                }
+                LOGGER.info(eventCount + " events were read from " + evioFile.getPath());
+                reader.close();
+            }
+
+        } catch (final Exception e) { /* Catches all event processing errors. */
+            // This catches and re-throws all errors from processing the EVIO events and configuring the ET system.
+            throw new RuntimeException("Error streaming EVIO events to ET system.", e);
+        } finally {
+            // Cleanup the EVIO reader if needed.
+            if (reader != null && !reader.isClosed()) {
+                try {
+                    reader.close();
+                } catch (final IOException e) {
+                    LOGGER.log(Level.WARNING, e.getMessage(), e);
+                }
+            }
+            // Cleanup the ET system.
+            if (sys != null && sys.alive()) {
+                sys.close();
+            }
         }
+
+        LOGGER.info("Done!");
     }
 }

Modified: java/branches/HPSJAVA-488/record-util/src/main/java/org/hps/record/evio/EvioFileSource.java
 =============================================================================
--- java/branches/HPSJAVA-488/record-util/src/main/java/org/hps/record/evio/EvioFileSource.java	(original)
+++ java/branches/HPSJAVA-488/record-util/src/main/java/org/hps/record/evio/EvioFileSource.java	Fri Jun 12 15:27:10 2015
@@ -151,7 +151,7 @@
     private void openReader() {
         try {
             System.out.println("Opening reader for file " + this.files.get(this.fileIndex) + " ...");
-            this.reader = new EvioReader(this.files.get(this.fileIndex), false);
+            this.reader = new EvioReader(this.files.get(this.fileIndex), false,true);
             System.out.println("Done opening file.");
         } catch (EvioException | IOException e) {
             throw new RuntimeException(e);

Modified: java/branches/HPSJAVA-488/steering-files/pom.xml
 =============================================================================
--- java/branches/HPSJAVA-488/steering-files/pom.xml	(original)
+++ java/branches/HPSJAVA-488/steering-files/pom.xml	Fri Jun 12 15:27:10 2015
@@ -8,7 +8,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>../parent/pom.xml</relativePath>
-        <version>3.3.1-SNAPSHOT</version>
+        <version>3.3.3-SNAPSHOT</version>
     </parent>
     <scm>
         <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/steering-files/</url>

Modified: java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/monitoring/DeadtimeMonitor.lcsim
 =============================================================================
--- java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/monitoring/DeadtimeMonitor.lcsim	(original)
+++ java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/monitoring/DeadtimeMonitor.lcsim	Fri Jun 12 15:27:10 2015
@@ -5,7 +5,7 @@
         <driver name="CleanupDriver" />
     </execute>
     <drivers>     
-        <driver name="DeadtimeMonitor" type="org.hps.monitoring.drivers.scalars.DeadtimePlots">
+        <driver name="DeadtimeMonitor" type="org.hps.monitoring.drivers.scalers.DeadtimePlots">
         </driver>
         <driver name="CleanupDriver" type="org.lcsim.recon.tracking.digitization.sisim.config.ReadoutCleanupDriver" />
     </drivers>

Modified: java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/monitoring/Layers4to6TrackingMonitoring.lcsim
 =============================================================================
--- java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/monitoring/Layers4to6TrackingMonitoring.lcsim	(original)
+++ java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/monitoring/Layers4to6TrackingMonitoring.lcsim	Fri Jun 12 15:27:10 2015
@@ -1,80 +1,116 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd">
-<!-- 
-  Steering file for tracking and v0 reconstruction monitoring 
-  @author Matt Graham <[log in to unmask]>
--->
-    <execute>      
-<!--  the 3 drivers below are for reading out 6-sample ADC data -->
-<!--      <driver name="RawTrackerHitSensorSetup" />  -->
-      <driver name="RawTrackerHitFitterDriver" />  
-      <driver name="TrackerHitDriver" />  
-      <driver name="HelicalTrackHitDriver" />
-       <driver name="TrackerL4to6ReconDriver"/>      
-       <driver name="TrackDataDriver"/>   
-       <driver name="EcalRawConverter" /> 
-       <driver name="EcalClusterer" />
-       <driver name="ReconParticle" /> 
-<!-- Online Monitoring Drivers -->
-       <driver name="TrackingMonitoring" />
-       <driver name="TrackingResiduals"/>  
-       <driver name="TrackTime"/>  
-       <driver name="V0Monitoring"/>   
-       <driver name="CleanupDriver" />
+    <!-- 
+      Steering file for tracking and v0 reconstruction monitoring, using L1-3 and L4-6 tracking to check SVT opening angle
+      @author Matt Graham <[log in to unmask]>
+    -->
+    <execute>     
+        <!--  the 3 drivers below are for reading out 6-sample ADC data -->
+        <!--      <driver name="RawTrackerHitSensorSetup" />  --> 
+        <driver name="RawTrackerHitFitterDriver" /> 
+        <driver name="TrackerHitDriver" />  
+        <driver name="HelicalTrackHitDriver" />
+        <!--  SVT opening angle alignment -->
+        <driver name="TrackerL1to3ReconDriver"/> 
+        <driver name="TrackerL4to6ReconDriver"/> 
+        <driver name="SVTAlignment"/> 
+        <!--  regular tracking and recon -->
+        <driver name="FullTrackerReconDriver"/> 
+        <driver name="TrackDataDriver"/>   
+        <driver name="EcalRawConverter" /> 
+        <driver name="EcalClusterer" />
+        <driver name="ReconParticle" /> 
+        <!-- Online Monitoring Drivers -->
+        <driver name="TrackingMonitoring" />
+        <driver name="TrackingResiduals"/>  
+        <driver name="TrackTime"/>  
+        <driver name="V0Monitoring"/>   
+        <driver name="CleanupDriver" />
     </execute>
-    <drivers>       
+    <drivers>
+        <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="RawTrackerHitFitterDriver" type="org.hps.recon.tracking.RawTrackerHitFitterDriver">
+        <driver name="RawTrackerHitFitterDriver" type="org.hps.recon.tracking.RawTrackerHitFitterDriver">
             <fitAlgorithm>Pileup</fitAlgorithm>
             <useTimestamps>false</useTimestamps>
-            <correctT0Shift>false</correctT0Shift>
+            <correctTimeOffset>true</correctTimeOffset>
+            <correctT0Shift>true</correctT0Shift>
             <useTruthTime>false</useTruthTime>
+            <subtractTOF>true</subtractTOF>
+            <subtractTriggerTime>true</subtractTriggerTime>
+            <correctChanT0>true</correctChanT0>
             <debug>false</debug>
         </driver>
         <driver name="TrackerHitDriver" type="org.hps.recon.tracking.DataTrackerHitDriver">
+            <neighborDeltaT>8.0</neighborDeltaT>
             <debug>false</debug>
         </driver>
         <driver name="HelicalTrackHitDriver" type="org.hps.recon.tracking.HelicalTrackHitDriver">
             <debug>false</debug>
-<!--            <clusterTimeCut>16.0</clusterTimeCut> -->
-            <maxSeperation>20.0</maxSeperation>
-            <tolerance>1.0</tolerance>
+            <clusterTimeCut>12.0</clusterTimeCut>
+            <clusterAmplitudeCut>400.0</clusterAmplitudeCut>
+            <maxDt>16.0</maxDt>
             <saveAxialHits>false</saveAxialHits>
         </driver>
-       
+        <driver name="TrackerL1to3ReconDriver" type="org.hps.recon.tracking.TrackerReconDriver">
+            <debug>false</debug>
+            <trackCollectionName>L1to3Tracks</trackCollectionName>
+            <strategyResource>/org/hps/recon/tracking/strategies/HPS-Full-L1-3.xml</strategyResource>
+            <rmsTimeCut>8.0</rmsTimeCut>
+        </driver>
         <driver name="TrackerL4to6ReconDriver" type="org.hps.recon.tracking.TrackerReconDriver">
             <debug>false</debug>
-        <trackCollectionName>L4to6Tracks</trackCollectionName>
+            <trackCollectionName>L4to6Tracks</trackCollectionName>
             <strategyResource>/org/hps/recon/tracking/strategies/HPS-Full-L4-6.xml</strategyResource>
+            <rmsTimeCut>8.0</rmsTimeCut>
         </driver>
-    
+        <driver name="FullTrackerReconDriver" type="org.hps.recon.tracking.TrackerReconDriver">
+            <debug>false</debug>
+            <trackCollectionName>MatchedTracks</trackCollectionName>
+            <strategyResource>/org/hps/recon/tracking/strategies/HPS-Full.xml</strategyResource>
+            <rmsTimeCut>8.0</rmsTimeCut>
+        </driver>
         <driver name="TrackDataDriver" type="org.hps.recon.tracking.TrackDataDriver">
-            <trackCollectionName>L4to6Tracks</trackCollectionName>           
         </driver>
-         <driver name="EcalRawConverter" type="org.hps.recon.ecal.EcalRawConverterDriver">
-              <ecalCollectionName>EcalCalHits</ecalCollectionName>
+        <driver name="EcalRawConverter" type="org.hps.recon.ecal.EcalRawConverterDriver">
+            <ecalCollectionName>EcalCalHits</ecalCollectionName>
             <use2014Gain>false</use2014Gain>
             <useTimestamps>false</useTimestamps>
-            <useTruthTime>false</useTruthTime>               
-           <debug>false</debug>
+            <useTruthTime>false</useTruthTime>
+            <useRunningPedestal>false</useRunningPedestal>
+            <useTimeWalkCorrection>false</useTimeWalkCorrection>
+            <emulateFirmware>true</emulateFirmware>
+            <emulateMode7>false</emulateMode7>
+            <leadingEdgeThreshold>12</leadingEdgeThreshold>
+            <nsa>100</nsa>
+            <nsb>20</nsb>
+            <nPeak>3</nPeak>
         </driver>
-         <driver name="EcalClusterer" type="org.hps.recon.ecal.cluster.ReconClusterDriver">              
-               <useTimeCut>true</useTimeCut>               
-        </driver>     
+        <driver name="EcalClusterer" 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>
+            <minTime>0.0</minTime>
+            <timeWindow>25.0</timeWindow>
+            <useTimeCut>true</useTimeCut>
+            <writeRejectedHitCollection>false</writeRejectedHitCollection>
+        </driver>
         <driver name="ReconParticle" type="org.hps.recon.particle.HpsReconParticleDriver">
-             <trackCollectionName>L4to6Tracks</trackCollectionName>      
             <debug>false</debug>
         </driver>   
-        <driver name="TrackingMonitoring" type="org.hps.monitoring.drivers.trackrecon.TrackingReconPlots">  
-            <trackCollectionName>L4to6Tracks</trackCollectionName>                
+        <driver name="TrackingMonitoring" type="org.hps.monitoring.drivers.trackrecon.TrackingReconPlots">                
         </driver>
-        <driver name="TrackingResiduals" type="org.hps.monitoring.drivers.trackrecon.TrackResiduals">             
+        <driver name="TrackingResiduals" type="org.hps.monitoring.drivers.trackrecon.TrackResiduals">              
         </driver>
-         <driver name="V0Monitoring" type="org.hps.monitoring.drivers.trackrecon.V0ReconPlots">         
+        <driver name="V0Monitoring" type="org.hps.monitoring.drivers.trackrecon.V0ReconPlots">               
         </driver>      
-        
-        <driver name="TrackTime" type="org.hps.monitoring.drivers.trackrecon.TrackTimePlots">                                
-              <trackCollectionName>L4to6Tracks</trackCollectionName>   
+        <driver name="SVTAlignment" type="org.hps.monitoring.drivers.trackrecon.SVTOpeningAlignment">                 
+        </driver>   
+        <driver name="TrackTime" type="org.hps.monitoring.drivers.trackrecon.TrackTimePlots">                
         </driver>
 
         <driver name="CleanupDriver" type="org.lcsim.recon.tracking.digitization.sisim.config.ReadoutCleanupDriver" />       

Modified: java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/monitoring/LooseTrackingAndReconMonitoring.lcsim
 =============================================================================
--- java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/monitoring/LooseTrackingAndReconMonitoring.lcsim	(original)
+++ java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/monitoring/LooseTrackingAndReconMonitoring.lcsim	Fri Jun 12 15:27:10 2015
@@ -1,68 +1,88 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd">
-<!-- 
-  Steering file for tracking and v0 reconstruction monitoring 
-  @author Matt Graham <[log in to unmask]>
--->
+    <!-- 
+      Steering file for tracking and v0 reconstruction monitoring, using an outside-in tracking strategy for more flexibility in opening angle
+      @author Matt Graham <[log in to unmask]>
+    -->
     <execute>     
-<!--  the 3 drivers below are for reading out 6-sample ADC data -->
-<!--      <driver name="RawTrackerHitSensorSetup" />    -->
-      <driver name="RawTrackerHitFitterDriver" /> 
-      <driver name="TrackerHitDriver" />  
-      <driver name="HelicalTrackHitDriver" />
-<!--  regular tracking and recon -->
-       <driver name="FullTrackerReconDriver"/> 
-       <driver name="TrackDataDriver"/>   
-       <driver name="EcalRawConverter" /> 
-       <driver name="EcalClusterer" />
-       <driver name="ReconParticle" /> 
-<!-- Online Monitoring Drivers -->
-       <driver name="TrackingMonitoring" />
-       <driver name="TrackingResiduals"/>  
-       <driver name="TrackTime"/>  
-       <driver name="V0Monitoring"/>   
-       <driver name="CleanupDriver" />
+        <!--  the 3 drivers below are for reading out 6-sample ADC data -->
+        <!--      <driver name="RawTrackerHitSensorSetup" />    -->
+        <driver name="RawTrackerHitFitterDriver" /> 
+        <driver name="TrackerHitDriver" />  
+        <driver name="HelicalTrackHitDriver" />
+        <!--  regular tracking and recon -->
+        <driver name="FullTrackerReconDriver"/> 
+        <driver name="TrackDataDriver"/>   
+        <driver name="EcalRawConverter" /> 
+        <driver name="EcalClusterer" />
+        <driver name="ReconParticle" /> 
+        <!-- Online Monitoring Drivers -->
+        <driver name="TrackingMonitoring" />
+        <driver name="TrackingResiduals"/>  
+        <driver name="TrackTime"/>  
+        <driver name="V0Monitoring"/>   
+        <driver name="CleanupDriver" />
     </execute>
     <drivers>
-         <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">
+        <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="RawTrackerHitFitterDriver" type="org.hps.recon.tracking.RawTrackerHitFitterDriver">
+        <driver name="RawTrackerHitFitterDriver" type="org.hps.recon.tracking.RawTrackerHitFitterDriver">
             <fitAlgorithm>Pileup</fitAlgorithm>
             <useTimestamps>false</useTimestamps>
-            <correctT0Shift>false</correctT0Shift>
+            <correctTimeOffset>true</correctTimeOffset>
+            <correctT0Shift>true</correctT0Shift>
             <useTruthTime>false</useTruthTime>
+            <subtractTOF>true</subtractTOF>
+            <subtractTriggerTime>true</subtractTriggerTime>
+            <correctChanT0>true</correctChanT0>
             <debug>false</debug>
         </driver>
         <driver name="TrackerHitDriver" type="org.hps.recon.tracking.DataTrackerHitDriver">
+            <neighborDeltaT>8.0</neighborDeltaT>
             <debug>false</debug>
         </driver>
         <driver name="HelicalTrackHitDriver" type="org.hps.recon.tracking.HelicalTrackHitDriver">
             <debug>false</debug>
-<!--            <clusterTimeCut>16.0</clusterTimeCut> -->
-            <maxSeperation>20.0</maxSeperation>
-            <tolerance>1.0</tolerance>
+            <clusterTimeCut>12.0</clusterTimeCut>
+            <clusterAmplitudeCut>400.0</clusterAmplitudeCut>
+            <maxDt>16.0</maxDt>
             <saveAxialHits>false</saveAxialHits>
         </driver>
         <driver name="FullTrackerReconDriver" type="org.hps.recon.tracking.TrackerReconDriver">
             <debug>false</debug>
             <trackCollectionName>MatchedTracks</trackCollectionName>
-            <strategyResource>/org/hps/recon/tracking/strategies/HPS-Full-Loose.xml</strategyResource>
+            <strategyResource>/org/hps/recon/tracking/strategies/HPS-Full-OutsideIn.xml</strategyResource>
+            <rmsTimeCut>8.0</rmsTimeCut>
         </driver>
         <driver name="TrackDataDriver" type="org.hps.recon.tracking.TrackDataDriver">
         </driver>
-         <driver name="EcalRawConverter" type="org.hps.recon.ecal.EcalRawConverterDriver">
-              <ecalCollectionName>EcalCalHits</ecalCollectionName>
+        <driver name="EcalRawConverter" type="org.hps.recon.ecal.EcalRawConverterDriver">
+            <ecalCollectionName>EcalCalHits</ecalCollectionName>
             <use2014Gain>false</use2014Gain>
             <useTimestamps>false</useTimestamps>
-            <useTruthTime>false</useTruthTime>               
-           <debug>false</debug>
+            <useTruthTime>false</useTruthTime>
+            <useRunningPedestal>false</useRunningPedestal>
+            <useTimeWalkCorrection>false</useTimeWalkCorrection>
+            <emulateFirmware>true</emulateFirmware>
+            <emulateMode7>false</emulateMode7>
+            <leadingEdgeThreshold>12</leadingEdgeThreshold>
+            <nsa>100</nsa>
+            <nsb>20</nsb>
+            <nPeak>3</nPeak>
         </driver>
-         <driver name="EcalClusterer" type="org.hps.recon.ecal.cluster.ReconClusterDriver">              
-               <useTimeCut>true</useTimeCut>
-               <logLevel>ALL</logLevel>
-        </driver>     
+        <driver name="EcalClusterer" 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>
+            <minTime>0.0</minTime>
+            <timeWindow>25.0</timeWindow>
+            <useTimeCut>true</useTimeCut>
+            <writeRejectedHitCollection>false</writeRejectedHitCollection>
+        </driver>
         <driver name="ReconParticle" type="org.hps.recon.particle.HpsReconParticleDriver">
             <debug>false</debug>
         </driver>   
@@ -70,7 +90,7 @@
         </driver>
         <driver name="TrackingResiduals" type="org.hps.monitoring.drivers.trackrecon.TrackResiduals">              
         </driver>
-         <driver name="V0Monitoring" type="org.hps.monitoring.drivers.trackrecon.V0ReconPlots">               
+        <driver name="V0Monitoring" type="org.hps.monitoring.drivers.trackrecon.V0ReconPlots">               
         </driver>      
         <driver name="TrackTime" type="org.hps.monitoring.drivers.trackrecon.TrackTimePlots">                
         </driver>

Modified: java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/monitoring/TrackingAndReconMonitoring.lcsim
 =============================================================================
--- java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/monitoring/TrackingAndReconMonitoring.lcsim	(original)
+++ java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/monitoring/TrackingAndReconMonitoring.lcsim	Fri Jun 12 15:27:10 2015
@@ -1,82 +1,87 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd">
-<!-- 
-  Steering file for tracking and v0 reconstruction monitoring 
-  @author Matt Graham <[log in to unmask]>
--->
+    <!-- 
+      Steering file for tracking and v0 reconstruction monitoring 
+      @author Matt Graham <[log in to unmask]>
+    -->
     <execute>     
-<!--  the 3 drivers below are for reading out 6-sample ADC data -->
-<!--      <driver name="RawTrackerHitSensorSetup" />  --> 
-      <driver name="RawTrackerHitFitterDriver" /> 
-      <driver name="TrackerHitDriver" />  
-      <driver name="HelicalTrackHitDriver" />
-<!--  SVT opening angle alignment -->
-       <driver name="TrackerL1to3ReconDriver"/> 
-       <driver name="TrackerL4to6ReconDriver"/> 
-       <driver name="SVTAlignment"/> 
-<!--  regular tracking and recon -->
-       <driver name="FullTrackerReconDriver"/> 
-       <driver name="TrackDataDriver"/>   
-       <driver name="EcalRawConverter" /> 
-       <driver name="EcalClusterer" />
-       <driver name="ReconParticle" /> 
-<!-- Online Monitoring Drivers -->
-       <driver name="TrackingMonitoring" />
-       <driver name="TrackingResiduals"/>  
-       <driver name="TrackTime"/>  
-       <driver name="V0Monitoring"/>   
-       <driver name="CleanupDriver" />
+        <!--  the 3 drivers below are for reading out 6-sample ADC data -->
+        <!--      <driver name="RawTrackerHitSensorSetup" />  --> 
+        <driver name="RawTrackerHitFitterDriver" /> 
+        <driver name="TrackerHitDriver" />  
+        <driver name="HelicalTrackHitDriver" />
+        <driver name="TrackerReconDriver"/> 
+        <driver name="TrackDataDriver"/>   
+        <driver name="EcalRawConverter" /> 
+        <driver name="EcalClusterer" />
+        <driver name="ReconParticle" /> 
+        <!-- Online Monitoring Drivers -->
+        <driver name="TrackingMonitoring" />
+        <driver name="TrackingResiduals"/>  
+        <driver name="TrackTime"/>  
+        <driver name="V0Monitoring"/>   
+        <driver name="CleanupDriver" />
     </execute>
     <drivers>
-         <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">
+        <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="RawTrackerHitFitterDriver" type="org.hps.recon.tracking.RawTrackerHitFitterDriver">
             <fitAlgorithm>Pileup</fitAlgorithm>
             <useTimestamps>false</useTimestamps>
-            <correctT0Shift>false</correctT0Shift>
+            <correctTimeOffset>true</correctTimeOffset>
+            <correctT0Shift>true</correctT0Shift>
             <useTruthTime>false</useTruthTime>
+            <subtractTOF>true</subtractTOF>
+            <subtractTriggerTime>true</subtractTriggerTime>
+            <correctChanT0>true</correctChanT0>
             <debug>false</debug>
         </driver>
         <driver name="TrackerHitDriver" type="org.hps.recon.tracking.DataTrackerHitDriver">
+            <neighborDeltaT>8.0</neighborDeltaT>
             <debug>false</debug>
         </driver>
         <driver name="HelicalTrackHitDriver" type="org.hps.recon.tracking.HelicalTrackHitDriver">
             <debug>false</debug>
-<!--            <clusterTimeCut>16.0</clusterTimeCut> -->
-            <maxSeperation>20.0</maxSeperation>
-            <tolerance>1.0</tolerance>
+            <clusterTimeCut>12.0</clusterTimeCut>
+            <clusterAmplitudeCut>400.0</clusterAmplitudeCut>
+            <maxDt>16.0</maxDt>
             <saveAxialHits>false</saveAxialHits>
         </driver>
-        <driver name="TrackerL1to3ReconDriver" type="org.hps.recon.tracking.TrackerReconDriver">
-            <debug>false</debug>
-        <trackCollectionName>L1to3Tracks</trackCollectionName>
-            <strategyResource>/org/hps/recon/tracking/strategies/HPS-Full-L1-3.xml</strategyResource>
-        </driver>
-        <driver name="TrackerL4to6ReconDriver" type="org.hps.recon.tracking.TrackerReconDriver">
-            <debug>false</debug>
-        <trackCollectionName>L4to6Tracks</trackCollectionName>
-            <strategyResource>/org/hps/recon/tracking/strategies/HPS-Full-L4-6.xml</strategyResource>
-        </driver>
-        <driver name="FullTrackerReconDriver" type="org.hps.recon.tracking.TrackerReconDriver">
+        <driver name="TrackerReconDriver" type="org.hps.recon.tracking.TrackerReconDriver">
             <debug>false</debug>
             <trackCollectionName>MatchedTracks</trackCollectionName>
             <strategyResource>/org/hps/recon/tracking/strategies/HPS-Full.xml</strategyResource>
+            <rmsTimeCut>8.0</rmsTimeCut>
         </driver>
         <driver name="TrackDataDriver" type="org.hps.recon.tracking.TrackDataDriver">
         </driver>
-         <driver name="EcalRawConverter" type="org.hps.recon.ecal.EcalRawConverterDriver">
-              <ecalCollectionName>EcalCalHits</ecalCollectionName>
+        <driver name="EcalRawConverter" type="org.hps.recon.ecal.EcalRawConverterDriver">
+            <ecalCollectionName>EcalCalHits</ecalCollectionName>
             <use2014Gain>false</use2014Gain>
             <useTimestamps>false</useTimestamps>
-            <useTruthTime>false</useTruthTime>               
-           <debug>false</debug>
-        </driver>       
-        <driver name="EcalClusterer" type="org.hps.recon.ecal.cluster.ReconClusterDriver">              
-               <useTimeCut>true</useTimeCut>
-               <logLevel>ALL</logLevel>
-        </driver>     
+            <useTruthTime>false</useTruthTime>
+            <useRunningPedestal>false</useRunningPedestal>
+            <useTimeWalkCorrection>false</useTimeWalkCorrection>
+            <emulateFirmware>true</emulateFirmware>
+            <emulateMode7>false</emulateMode7>
+            <leadingEdgeThreshold>12</leadingEdgeThreshold>
+            <nsa>100</nsa>
+            <nsb>20</nsb>
+            <nPeak>3</nPeak>
+        </driver>
+        <driver name="EcalClusterer" 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>
+            <minTime>0.0</minTime>
+            <timeWindow>25.0</timeWindow>
+            <useTimeCut>true</useTimeCut>
+            <writeRejectedHitCollection>false</writeRejectedHitCollection>
+        </driver>
         <driver name="ReconParticle" type="org.hps.recon.particle.HpsReconParticleDriver">
             <debug>false</debug>
         </driver>   
@@ -84,10 +89,8 @@
         </driver>
         <driver name="TrackingResiduals" type="org.hps.monitoring.drivers.trackrecon.TrackResiduals">              
         </driver>
-         <driver name="V0Monitoring" type="org.hps.monitoring.drivers.trackrecon.V0ReconPlots">               
+        <driver name="V0Monitoring" type="org.hps.monitoring.drivers.trackrecon.V0ReconPlots">               
         </driver>      
-      <driver name="SVTAlignment" type="org.hps.monitoring.drivers.trackrecon.SVTOpeningAlignment">                 
-        </driver>   
         <driver name="TrackTime" type="org.hps.monitoring.drivers.trackrecon.TrackTimePlots">                
         </driver>
 

Modified: java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/production/DataQualityRecon.lcsim
 =============================================================================
--- java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/production/DataQualityRecon.lcsim	(original)
+++ java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/production/DataQualityRecon.lcsim	Fri Jun 12 15:27:10 2015
@@ -8,21 +8,52 @@
         <driver name="EventMarkerDriver"/>
         <!--        <driver name="DQMDatabaseDriver"/>  -->
         <driver name="RawTrackerHitSensorSetup"/>
+        <driver name="EcalMonitoring"/>  
         <driver name="SVTMonitoring"/>  
-        <driver name="SVTHitMCEfficiency"/>  
         <driver name="TrackingMonitoring"/>  
         <driver name="TrackingResiduals"/>
-        <driver name="TrackMCEfficiency"/> 
         <driver name="FinalStateMonitoring"/>          
         <driver name="V0Monitoring"/>          
         <driver name="TridentMonitoring"/>
+<!-- Singles0 -->
+        <driver name="EcalMonitoringSingles0"/>  
+<!--        <driver name="SVTMonitoringSingles0"/>   -->
+        <driver name="TrackingMonitoringSingles0"/>  
+        <driver name="TrackingResidualsSingles0"/>
+        <driver name="FinalStateMonitoringSingles0"/>          
+        <driver name="V0MonitoringSingles0"/>          
+        <driver name="TridentMonitoringSingles0"/>
+<!-- Singles1 -->
+        <driver name="EcalMonitoringSingles1"/>  
+ <!--       <driver name="SVTMonitoringSingles1"/>  -->
+        <driver name="TrackingMonitoringSingles1"/>  
+        <driver name="TrackingResidualsSingles1"/>
+        <driver name="FinalStateMonitoringSingles1"/>          
+        <driver name="V0MonitoringSingles1"/>          
+        <driver name="TridentMonitoringSingles1"/>
+<!-- Pairs0 -->
+        <driver name="EcalMonitoringPairs0"/>  
+ <!--       <driver name="SVTMonitoringPairs0"/>  -->
+        <driver name="TrackingMonitoringPairs0"/>  
+        <driver name="TrackingResidualsPairs0"/>
+        <driver name="FinalStateMonitoringPairs0"/>          
+        <driver name="V0MonitoringPairs0"/>          
+        <driver name="TridentMonitoringPairs0"/>
+<!-- Pairs1 -->
+        <driver name="EcalMonitoringPairs1"/>  
+ <!--       <driver name="SVTMonitoringPairs1"/>  -->
+        <driver name="TrackingMonitoringPairs1"/>  
+        <driver name="TrackingResidualsPairs1"/>
+        <driver name="FinalStateMonitoringPairs1"/>          
+        <driver name="V0MonitoringPairs1"/>          
+        <driver name="TridentMonitoringPairs1"/>
         <driver name="AidaSaveDriver"/>
         <driver name="CleanupDriver"/>
     </execute>    
     <drivers>    
         <!--    <driver name="DQMDatabaseDriver" type="org.hps.analysis.dataquality.DQMDatabaseDriver"/> -->
         <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">
-            <eventInterval>1</eventInterval>
+            <eventInterval>1000</eventInterval>
         </driver>        
         <driver name="RawTrackerHitSensorSetup" type="org.lcsim.recon.tracking.digitization.sisim.config.RawTrackerHitSensorSetup">
             <readoutCollections>SVTRawTrackerHits</readoutCollections>
@@ -30,29 +61,127 @@
         <driver name="AidaSaveDriver" type="org.lcsim.job.AidaSaveDriver">
             <outputFileName>${outputFile}.root</outputFileName>
         </driver>
-        <driver name="SVTMonitoring" type="org.hps.analysis.dataquality.SvtMonitoring">
-            <overwriteDB>false</overwriteDB>
+
+<!-- all triggers  -->
+        <driver name="EcalMonitoring" type="org.hps.analysis.dataquality.EcalMonitoring">         
+            <triggerType>all</triggerType>
         </driver>
+        <driver name="SVTMonitoring" type="org.hps.analysis.dataquality.SvtMonitoring">         
+            <triggerType>all</triggerType>
+        </driver>      
         <driver name="TrackingMonitoring" type="org.hps.analysis.dataquality.TrackingMonitoring">
             <overwriteDB>false</overwriteDB>
+            <triggerType>all</triggerType>
         </driver>
         <driver name="TrackingResiduals" type="org.hps.analysis.dataquality.TrackingResiduals">
-            <overwriteDB>false</overwriteDB>
+            <triggerType>all</triggerType>
         </driver>
         <driver name="FinalStateMonitoring" type="org.hps.analysis.dataquality.FinalStateMonitoring">
-            <overwriteDB>false</overwriteDB>
+            <triggerType>all</triggerType>
         </driver>
-        <driver name="TrackMCEfficiency" type="org.hps.analysis.dataquality.TrackMCEfficiency">
-            <overwriteDB>false</overwriteDB>
-        </driver> 
-        <driver name="SVTHitMCEfficiency" type="org.hps.analysis.dataquality.SVTHitMCEfficiency">
-            <overwriteDB>false</overwriteDB>
-        </driver> 
         <driver name="V0Monitoring" type="org.hps.analysis.dataquality.V0Monitoring">
-            <overwriteDB>false</overwriteDB>
+           <triggerType>all</triggerType>
         </driver>
         <driver name="TridentMonitoring" type="org.hps.analysis.dataquality.TridentMonitoring">
+            <triggerType>all</triggerType>
+        </driver>
+
+<!-- singles0 triggers  -->
+        <driver name="EcalMonitoringSingles0" type="org.hps.analysis.dataquality.EcalMonitoring">         
+            <triggerType>singles0</triggerType>
+        </driver>
+        <driver name="SVTMonitoringSingles0" type="org.hps.analysis.dataquality.SvtMonitoring">         
+            <triggerType>singles0</triggerType>
+        </driver>      
+        <driver name="TrackingMonitoringSingles0" type="org.hps.analysis.dataquality.TrackingMonitoring">
             <overwriteDB>false</overwriteDB>
+            <triggerType>singles0</triggerType>
+        </driver>
+        <driver name="TrackingResidualsSingles0" type="org.hps.analysis.dataquality.TrackingResiduals">
+            <triggerType>singles0</triggerType>
+        </driver>
+        <driver name="FinalStateMonitoringSingles0" type="org.hps.analysis.dataquality.FinalStateMonitoring">
+            <triggerType>singles0</triggerType>
+        </driver>
+        <driver name="V0MonitoringSingles0" type="org.hps.analysis.dataquality.V0Monitoring">
+           <triggerType>singles0</triggerType>
+        </driver>
+        <driver name="TridentMonitoringSingles0" type="org.hps.analysis.dataquality.TridentMonitoring">
+            <triggerType>singles0</triggerType>
+        </driver>
+
+<!-- singles1 triggers  -->
+        <driver name="EcalMonitoringSingles1" type="org.hps.analysis.dataquality.EcalMonitoring">         
+            <triggerType>singles1</triggerType>
+        </driver>
+        <driver name="SVTMonitoringSingles1" type="org.hps.analysis.dataquality.SvtMonitoring">         
+            <triggerType>singles1</triggerType>
+        </driver>      
+        <driver name="TrackingMonitoringSingles1" type="org.hps.analysis.dataquality.TrackingMonitoring">
+            <overwriteDB>false</overwriteDB>
+            <triggerType>singles1</triggerType>
+        </driver>
+        <driver name="TrackingResidualsSingles1" type="org.hps.analysis.dataquality.TrackingResiduals">
+            <triggerType>singles1</triggerType>
+        </driver>
+        <driver name="FinalStateMonitoringSingles1" type="org.hps.analysis.dataquality.FinalStateMonitoring">
+            <triggerType>singles1</triggerType>
+        </driver>
+        <driver name="V0MonitoringSingles1" type="org.hps.analysis.dataquality.V0Monitoring">
+           <triggerType>singles1</triggerType>
+        </driver>
+        <driver name="TridentMonitoringSingles1" type="org.hps.analysis.dataquality.TridentMonitoring">
+            <triggerType>singles1</triggerType>
+        </driver>
+
+<!-- pairs0 triggers  -->
+        <driver name="EcalMonitoringPairs0" type="org.hps.analysis.dataquality.EcalMonitoring">         
+            <triggerType>pairs0</triggerType>
+        </driver>
+        <driver name="SVTMonitoringPairs0" type="org.hps.analysis.dataquality.SvtMonitoring">         
+            <triggerType>pairs0</triggerType>
+        </driver>      
+        <driver name="TrackingMonitoringPairs0" type="org.hps.analysis.dataquality.TrackingMonitoring">
+            <overwriteDB>false</overwriteDB>
+            <triggerType>pairs0</triggerType>
+        </driver>
+        <driver name="TrackingResidualsPairs0" type="org.hps.analysis.dataquality.TrackingResiduals">
+            <triggerType>pairs0</triggerType>
+        </driver>
+        <driver name="FinalStateMonitoringPairs0" type="org.hps.analysis.dataquality.FinalStateMonitoring">
+            <triggerType>pairs0</triggerType>
+        </driver>
+        <driver name="V0MonitoringPairs0" type="org.hps.analysis.dataquality.V0Monitoring">
+           <triggerType>pairs0</triggerType>
+        </driver>
+        <driver name="TridentMonitoringPairs0" type="org.hps.analysis.dataquality.TridentMonitoring">
+            <triggerType>pairs0</triggerType>
+        </driver>
+
+
+
+<!-- pairs1 triggers  -->
+        <driver name="EcalMonitoringPairs1" type="org.hps.analysis.dataquality.EcalMonitoring">         
+            <triggerType>pairs1</triggerType>
+        </driver>
+        <driver name="SVTMonitoringPairs1" type="org.hps.analysis.dataquality.SvtMonitoring">         
+            <triggerType>pairs1</triggerType>
+        </driver>      
+        <driver name="TrackingMonitoringPairs1" type="org.hps.analysis.dataquality.TrackingMonitoring">
+            <overwriteDB>false</overwriteDB>
+            <triggerType>pairs1</triggerType>
+        </driver>
+        <driver name="TrackingResidualsPairs1" type="org.hps.analysis.dataquality.TrackingResiduals">
+            <triggerType>pairs1</triggerType>
+        </driver>
+        <driver name="FinalStateMonitoringPairs1" type="org.hps.analysis.dataquality.FinalStateMonitoring">
+            <triggerType>pairs1</triggerType>
+        </driver>
+        <driver name="V0MonitoringPairs1" type="org.hps.analysis.dataquality.V0Monitoring">
+           <triggerType>pairs1</triggerType>
+        </driver>
+        <driver name="TridentMonitoringPairs1" type="org.hps.analysis.dataquality.TridentMonitoring">
+            <triggerType>pairs1</triggerType>
         </driver>
         <driver name="CleanupDriver" type="org.lcsim.recon.tracking.digitization.sisim.config.ReadoutCleanupDriver"/>
 

Modified: java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/readout/HPS2014ReadoutNoPileup.lcsim
 =============================================================================
--- java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/readout/HPS2014ReadoutNoPileup.lcsim	(original)
+++ java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/readout/HPS2014ReadoutNoPileup.lcsim	Fri Jun 12 15:27:10 2015
@@ -21,13 +21,10 @@
         <driver name="CleanupDriver"/>
     </execute>    
     <drivers>
-
-
-
-   <driver name="ConditionsDriver" type="org.hps.conditions.ConditionsDriver">
-     <runNumber>4888</runNumber>
-      <detectorName>HPS-Proposal2014-v6-2pt2</detectorName>
-     <freeze>true</freeze> 
+  <driver name="ConditionsDriver" type="org.hps.conditions.ConditionsDriver">
+         <detectorName>${detector}</detectorName>
+          <runNumber>${run}</runNumber>
+        <freeze>true</freeze>
     </driver>
         <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">
             <eventInterval>1000</eventInterval>

Modified: java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/readout/HPS2014ReadoutToEvio.lcsim
 =============================================================================
--- java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/readout/HPS2014ReadoutToEvio.lcsim	(original)
+++ java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/readout/HPS2014ReadoutToEvio.lcsim	Fri Jun 12 15:27:10 2015
@@ -25,9 +25,9 @@
             <eventInterval>1000</eventInterval>
         </driver> 
    <driver name="ConditionsDriver" type="org.hps.conditions.ConditionsDriver">
-     <runNumber>4888</runNumber>
-      <detectorName>HPS-Proposal2014-v6-2pt2</detectorName>
-     <freeze>true</freeze> 
+         <detectorName>${detector}</detectorName>
+          <runNumber>${run}</runNumber>
+        <freeze>true</freeze>
     </driver>
         <driver name="TestRunReconToEvio" type="org.hps.evio.TestRunTriggeredReconToEvio">
             <evioOutputFile>${outputFile}.evio</evioOutputFile>

Modified: java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/readout/HPS2014ReadoutToLcio.lcsim
 =============================================================================
--- java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/readout/HPS2014ReadoutToLcio.lcsim	(original)
+++ java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/readout/HPS2014ReadoutToLcio.lcsim	Fri Jun 12 15:27:10 2015
@@ -25,9 +25,9 @@
             <eventInterval>1000</eventInterval>
         </driver>
    <driver name="ConditionsDriver" type="org.hps.conditions.ConditionsDriver">
-     <runNumber>4888</runNumber>
-      <detectorName>HPS-Proposal2014-v6-2pt2</detectorName>
-     <freeze>true</freeze> 
+         <detectorName>${detector}</detectorName>
+          <runNumber>${run}</runNumber>
+        <freeze>true</freeze>
     </driver>
         <driver name="TestRunReconToLcio" type="org.hps.evio.TestRunTriggeredReconToLcio">
             <outputFile>${outputFile}.slcio</outputFile>

Modified: java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/readout/HPS2014TruthReadoutToLcio.lcsim
 =============================================================================
--- java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/readout/HPS2014TruthReadoutToLcio.lcsim	(original)
+++ java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/readout/HPS2014TruthReadoutToLcio.lcsim	Fri Jun 12 15:27:10 2015
@@ -26,10 +26,10 @@
         <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">
             <eventInterval>1000</eventInterval>
         </driver> 
-        <driver name="ConditionsDriver" type="org.hps.conditions.ConditionsDriver">
-     <runNumber>4888</runNumber>
-      <detectorName>HPS-Proposal2014-v6-2pt2</detectorName>
-     <freeze>true</freeze> 
+       <driver name="ConditionsDriver" type="org.hps.conditions.ConditionsDriver">
+         <detectorName>${detector}</detectorName>
+          <runNumber>${run}</runNumber>
+        <freeze>true</freeze>
     </driver>
         <driver name="TestRunReconToLcio" type="org.hps.evio.TestRunTriggeredReconToLcio">
             <outputFile>${outputFile}.slcio</outputFile>

Modified: java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullRecon.lcsim
 =============================================================================
--- java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullRecon.lcsim	(original)
+++ java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullRecon.lcsim	Fri Jun 12 15:27:10 2015
@@ -1,11 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd">
 <!-- 
   Offline reconstruction for 2015 (engineering run with SVT+ECal) data.
   @author Sho Uemura <[log in to unmask]>
 -->
-<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="RawTrackerHitSensorSetup"/>
         <driver name="RawTrackerHitFitterDriver" />
         <driver name="TrackerHitDriver"/>
         <driver name="HelicalTrackHitDriver"/>
@@ -14,26 +15,29 @@
         <driver name="EcalRawConverter" />
         <driver name="ReconClusterer" />
         <driver name="GTPOnlineClusterer" />
+        <driver name="CopyCluster" />
         <driver name="ReconParticle" />  
         <driver name="TrackDataDriver" />              
         <!--<driver name="GBLDriver"/>--> 
         <driver name="LCIOWriter"/>
-
         <driver name="CleanupDriver"/>
     </execute>    
     <drivers>    
         <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">
-            <eventInterval>100</eventInterval>
+            <eventInterval>1000</eventInterval>
         </driver>        
+        <driver name="RawTrackerHitSensorSetup" type="org.lcsim.recon.tracking.digitization.sisim.config.RawTrackerHitSensorSetup">
+            <readoutCollections>SVTRawTrackerHits</readoutCollections>
+        </driver>
         <driver name="RawTrackerHitFitterDriver" type="org.hps.recon.tracking.RawTrackerHitFitterDriver">
             <fitAlgorithm>Pileup</fitAlgorithm>
             <useTimestamps>false</useTimestamps>
-            <correctT0Shift>false</correctT0Shift>
+            <correctTimeOffset>true</correctTimeOffset>
+            <correctT0Shift>true</correctT0Shift>
             <useTruthTime>false</useTruthTime>
             <subtractTOF>true</subtractTOF>
             <subtractTriggerTime>true</subtractTriggerTime>
             <correctChanT0>true</correctChanT0>
-            <timeOffset>51.0</timeOffset>
             <debug>false</debug>
         </driver>
         <driver name="TrackerHitDriver" type="org.hps.recon.tracking.DataTrackerHitDriver">
@@ -43,11 +47,10 @@
             <debug>false</debug>
             <clusterTimeCut>12.0</clusterTimeCut>
             <maxDt>16.0</maxDt>
-            <maxSeperation>20.0</maxSeperation>
-            <tolerance>1.0</tolerance>
+            <clusterAmplitudeCut>400.0</clusterAmplitudeCut>
         </driver>
         <driver name="TrackerReconDriver" type="org.hps.recon.tracking.TrackerReconDriver">
-            <strategyResource>HPS-Full-Loose.xml</strategyResource>
+            <strategyResource>HPS-Full.xml</strategyResource>
             <debug>false</debug>
             <rmsTimeCut>8.0</rmsTimeCut>
         </driver>        
@@ -58,8 +61,8 @@
         </driver>
         <driver name="EcalRunningPedestal" type="org.hps.recon.ecal.EcalRunningPedestalDriver">
             <logLevel>CONFIG</logLevel>
-            <minLookbackEvents>10</minLookbackEvents>
-            <maxLookbackEvents>50</maxLookbackEvents>
+            <minLookbackEvents>5</minLookbackEvents>
+            <maxLookbackEvents>40</maxLookbackEvents>
         </driver>
         <driver name="EcalRawConverter" type="org.hps.recon.ecal.EcalRawConverterDriver">
             <ecalCollectionName>EcalCalHits</ecalCollectionName>
@@ -67,21 +70,22 @@
             <useTimestamps>false</useTimestamps>
             <useTruthTime>false</useTruthTime>
             <useRunningPedestal>true</useRunningPedestal>
-            <useTimeWalkCorrection>true</useTimeWalkCorrection>
+            <useTimeWalkCorrection>false</useTimeWalkCorrection>
             <emulateFirmware>true</emulateFirmware>
-            <emulateMode7>false</emulateMode7>
+            <emulateMode7>true</emulateMode7>
             <leadingEdgeThreshold>12</leadingEdgeThreshold>
             <nsa>100</nsa>
             <nsb>20</nsb>
-            <windowSamples>50</windowSamples>
             <nPeak>3</nPeak>
+            <useFit>true</useFit>
+            <fixShapeParameter>true</fixShapeParameter>
         </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>
+            <hitEnergyThreshold>0.0075</hitEnergyThreshold>
+            <seedEnergyThreshold>0.050</seedEnergyThreshold> 
+            <clusterEnergyThreshold>0.100</clusterEnergyThreshold>
             <minTime>0.0</minTime>
             <timeWindow>25.0</timeWindow>
             <useTimeCut>true</useTimeCut>
@@ -93,8 +97,14 @@
             <outputClusterCollectionName>EcalClustersGTP</outputClusterCollectionName>
             <!-- seedMinEnergy -->
             <cuts>0.100</cuts>
-        </driver>        
-        <driver name="ReconParticle" type="org.hps.recon.particle.HpsReconParticleDriver">          
+        </driver> 
+        <driver name="CopyCluster" type="org.hps.recon.ecal.cluster.CopyClusterCollectionDriver">
+            <inputCollectionName>EcalClusters</inputCollectionName>
+            <outputCollectionName>EcalClustersCorr</outputCollectionName>
+    		<storeHits>true</storeHits>
+        </driver>
+        <driver name="ReconParticle" type="org.hps.recon.particle.HpsReconParticleDriver">  
+            <ecalClusterCollectionName>EcalClustersCorr</ecalClusterCollectionName>        
         </driver>
         <driver name="TrackDataDriver" type="org.hps.recon.tracking.TrackDataDriver" />
         <driver name="LCIOWriter" type="org.lcsim.util.loop.LCIODriver">

Modified: java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/recon/HPS2014OfflineNoPileupRecon.lcsim
 =============================================================================
--- java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/recon/HPS2014OfflineNoPileupRecon.lcsim	(original)
+++ java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/recon/HPS2014OfflineNoPileupRecon.lcsim	Fri Jun 12 15:27:10 2015
@@ -8,6 +8,7 @@
     <execute>
         <driver name="EventMarkerDriver"/>       
         <driver name="ConditionsDriver"/>       
+        <driver name="RawTrackerHitSensorSetup"/>
         <driver name="RawTrackerHitFitterDriver" />
         <driver name="TrackerHitDriver"/>
         <driver name="HelicalTrackHitDriver"/>
@@ -31,7 +32,9 @@
         <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">
             <eventInterval>1000</eventInterval>
         </driver>        
-        <driver name="RawTrackerHitSensorSetup" type="org.lcsim.recon.tracking.digitization.sisim.config.RawTrackerHitSensorSetup"/>
+        <driver name="RawTrackerHitSensorSetup" type="org.lcsim.recon.tracking.digitization.sisim.config.RawTrackerHitSensorSetup">
+            <readoutCollections>SVTRawTrackerHits</readoutCollections>
+        </driver>
         <driver name="RawTrackerHitFitterDriver" type="org.hps.recon.tracking.RawTrackerHitFitterDriver">
             <fitAlgorithm>Analytic</fitAlgorithm>
             <useTimestamps>false</useTimestamps>
@@ -42,8 +45,6 @@
         <driver name="HelicalTrackHitDriver" type="org.hps.recon.tracking.HelicalTrackHitDriver">
             <debug>false</debug>
             <!--<clusterTimeCut>16.0</clusterTimeCut>-->
-            <maxSeperation>20.0</maxSeperation>
-            <tolerance>1.0</tolerance>
         </driver>
         <driver name="TrackerReconDriver" type="org.hps.recon.tracking.TrackerReconDriver">
             <strategyResource>HPS-Full.xml</strategyResource>

Modified: java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/recon/HPS2014OfflineRecon.lcsim
 =============================================================================
--- java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/recon/HPS2014OfflineRecon.lcsim	(original)
+++ java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/recon/HPS2014OfflineRecon.lcsim	Fri Jun 12 15:27:10 2015
@@ -6,6 +6,7 @@
        xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd">
     <execute>
         <driver name="EventMarkerDriver"/>             
+        <driver name="RawTrackerHitSensorSetup"/>
         <driver name="RawTrackerHitFitterDriver" />
         <driver name="TrackerHitDriver"/>
         <driver name="HelicalTrackHitDriver"/>
@@ -22,6 +23,9 @@
         <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">
             <eventInterval>1000</eventInterval>
               </driver>              
+        <driver name="RawTrackerHitSensorSetup" type="org.lcsim.recon.tracking.digitization.sisim.config.RawTrackerHitSensorSetup">
+            <readoutCollections>SVTRawTrackerHits</readoutCollections>
+        </driver>
         <driver name="RawTrackerHitFitterDriver" type="org.hps.recon.tracking.RawTrackerHitFitterDriver">
             <fitAlgorithm>Pileup</fitAlgorithm>
             <useTimestamps>false</useTimestamps>
@@ -37,8 +41,6 @@
             <debug>false</debug>
             <!--<clusterTimeCut>12.0</clusterTimeCut>-->
             <maxDt>16.0</maxDt>
-            <maxSeperation>20.0</maxSeperation>
-            <tolerance>1.0</tolerance>
         </driver>
         <driver name="TrackerReconDriver" type="org.hps.recon.tracking.TrackerReconDriver">
             <strategyResource>HPS-Full.xml</strategyResource>

Modified: java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/recon/HPS2014OfflineTruthRecon.lcsim
 =============================================================================
--- java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/recon/HPS2014OfflineTruthRecon.lcsim	(original)
+++ java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/recon/HPS2014OfflineTruthRecon.lcsim	Fri Jun 12 15:27:10 2015
@@ -7,7 +7,8 @@
        xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd">
     <execute>
         <driver name="EventMarkerDriver"/>
-       <driver name="ConditionsDriver"/>
+        <driver name="RawTrackerHitSensorSetup"/>
+        <driver name="ConditionsDriver"/>
         <driver name="RawTrackerHitFitterDriver" />
         <driver name="TrackerHitDriver"/>
         <driver name="HelicalTrackHitDriver"/>
@@ -29,7 +30,9 @@
             <runNumber>4888</runNumber>
             <freeze>true</freeze>
         </driver>       
-        <driver name="RawTrackerHitSensorSetup" type="org.lcsim.recon.tracking.digitization.sisim.config.RawTrackerHitSensorSetup"/>
+        <driver name="RawTrackerHitSensorSetup" type="org.lcsim.recon.tracking.digitization.sisim.config.RawTrackerHitSensorSetup">
+            <readoutCollections>SVTRawTrackerHits</readoutCollections>
+        </driver>
         <driver name="RawTrackerHitFitterDriver" type="org.hps.recon.tracking.RawTrackerHitFitterDriver">
             <fitAlgorithm>Pileup</fitAlgorithm>
             <useTimestamps>false</useTimestamps>
@@ -45,8 +48,6 @@
             <debug>false</debug>
             <!--<clusterTimeCut>12.0</clusterTimeCut>-->
             <maxDt>16.0</maxDt>
-            <maxSeperation>20.0</maxSeperation>
-            <tolerance>1.0</tolerance>
         </driver>
         <driver name="TrackerReconDriver" type="org.hps.recon.tracking.TrackerReconDriver">
             <strategyResource>HPS-Full.xml</strategyResource>

Modified: java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/recon/HPSTrackingDefaultsRecon.lcsim
 =============================================================================
--- java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/recon/HPSTrackingDefaultsRecon.lcsim	(original)
+++ java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/recon/HPSTrackingDefaultsRecon.lcsim	Fri Jun 12 15:27:10 2015
@@ -6,7 +6,8 @@
     </control>
     <execute>
         <driver name="EventMarkerDriver"/>
-       <driver name="ConditionsDriver"/>
+        <driver name="RawTrackerHitSensorSetup"/>
+        <driver name="ConditionsDriver"/>
         <driver name="RawTrackerHitFitterDriver" />
         <driver name="TrackerHitDriver" />
         <driver name="HelicalTrackHitDriver" />
@@ -24,7 +25,9 @@
             <freeze>true</freeze>
         </driver>
         <driver name="SVTBadChannelFilterDriver" type="org.hps.recon.tracking.SVTBadChannelFilterDriver"/>
-        <driver name="RawTrackerHitSensorSetup" type="org.lcsim.recon.tracking.digitization.sisim.config.RawTrackerHitSensorSetup"/>
+        <driver name="RawTrackerHitSensorSetup" type="org.lcsim.recon.tracking.digitization.sisim.config.RawTrackerHitSensorSetup">
+            <readoutCollections>SVTRawTrackerHits</readoutCollections>
+        </driver>
         <driver name="RawTrackerHitFitterDriver" type="org.hps.recon.tracking.RawTrackerHitFitterDriver">
             <fitAlgorithm>Analytic</fitAlgorithm>
             <correctT0Shift>true</correctT0Shift>
@@ -32,8 +35,6 @@
         <driver name="TrackerHitDriver" type="org.hps.recon.tracking.DataTrackerHitDriver" />        
         <driver name="HelicalTrackHitDriver" type="org.hps.recon.tracking.HelicalTrackHitDriver">
             <debug>false</debug>
-            <maxSeperation>20.0</maxSeperation>
-            <tolerance>1.0</tolerance>
         </driver>
         <driver name="TrackerReconDriver" type="org.hps.recon.tracking.TrackerReconDriver">
             <debug>false</debug>

Modified: java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/users/mgraham/TrackingAndReconMonitoring.lcsim
 =============================================================================
--- java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/users/mgraham/TrackingAndReconMonitoring.lcsim	(original)
+++ java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/users/mgraham/TrackingAndReconMonitoring.lcsim	Fri Jun 12 15:27:10 2015
@@ -1,73 +1,121 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd">
-<!-- 
-  Steering file for tracking and v0 reconstruction monitoring 
-  @author Matt Graham <[log in to unmask]>
--->
+    <!-- 
+      Steering file for tracking and v0 reconstruction monitoring 
+      @author Matt Graham <[log in to unmask]>
+    -->
     <execute>
-       <driver name="EventMarkerDriver" />
-<!--  the 3 drivers below are for reading out 6-sample ADC data -->
-      <driver name="RawTrackerHitSensorSetup" /> 
-      <driver name="RawTrackerHitFitterDriver" /> 
-      <driver name="TrackerHitDriver" />  
-      <driver name="HelicalTrackHitDriver" />
-<!--  SVT opening angle alignment -->
-       <driver name="TrackerL1to3ReconDriver"/> 
-       <driver name="TrackerL4to6ReconDriver"/> 
-       <driver name="SVTAlignment"/> 
-<!--  regular tracking and recon -->
-       <driver name="FullTrackerReconDriver"/> 
-       <driver name="TrackDataDriver"/>   
-       <driver name="EcalRawConverter" /> 
-       <driver name="EcalClusterer" />
-       <driver name="ReconParticle" /> 
-<!-- Online Monitoring Drivers -->
-       <driver name="TrackingMonitoring" />
-       <driver name="TrackingResiduals"/>  
-       <driver name="TrackTime"/>  
-       <driver name="V0Monitoring"/>   
-       <driver name="CleanupDriver" />
+        <driver name="EventMarkerDriver" />
+        <!-- Standard Reconstruction -->
+        <driver name="RawTrackerHitFitterDriver" />
+        <driver name="TrackerHitDriver"/>
+        <driver name="HelicalTrackHitDriver"/>
+        <driver name="FullTrackerReconDriver"/><!--
+                <driver name="TrackDataDriver" />    
+        -->        
+        <driver name="EcalRunningPedestal"/>
+        <driver name="EcalRawConverter" /><!--
+-->        
+        <driver name="ReconClusterer" /><!--
+-->        
+        <driver name="ReconParticle" /> <!--
+        <driver name="GTPOnlineClusterer" /> 
+          SVT opening angle alignment -->
+        <driver name="SplitHitsOnTrack"/>       
+        <driver name="TrackerL1to3ReconDriver"/> 
+        <driver name="TrackerL4to6ReconDriver"/> 
+        <driver name="TrackerL134ReconDriver"/> 
+        <driver name="ReconParticleL1to3" />
+        <driver name="ReconParticleL4to6" />
+        <driver name="ReconParticleL134" />
+        <driver name="SVTAlignment"/> 
+        <driver name="TrackingMonitoringSingles1DQM" /> 
+        <driver name="TrackingMonitoringL1to3Singles1DQM"/>
+        <driver name="TrackingMonitoringL4to6Singles1DQM"/>
+        <driver name="TrackingMonitoringL134Singles1DQM"/>
+        <driver name="FinalStateL1to3DQMSingles1"/>
+        <driver name="FinalStateL4to6DQMSingles1"/>
+        <driver name="FinalStateL134DQMSingles1"/>
+        <!-- Online Monitoring Drivers -->
+        <!--       <driver name="TrackingMonitoring" />  
+        <driver name="TrackingResiduals"/>  
+        <driver name="TrackTime"/>  
+        <driver name="V0Monitoring"/>    -->       
+        <!--        <driver name="SVTMonitoring"/>  
+                <driver name="TrackingMonitoringDQM" />  
+                <driver name="TrackingMonitoringSingles1DQM" />  
+                <driver name="TrackingMonitoringPairs1DQM" />  
+                <driver name="TrackingResidualsPairs1DQM"/>  
+                <driver name="TrackingResidualsSingles1DQM"/>  
+                <driver name="FinalStateDQM"/>  
+        -->        
+        <driver name="FinalStateDQMSingles1"/><!--
+        <driver name="FinalStateDQMPairs1"/>
+        <driver name="V0DQM"/>  
+        <driver name="V0DQMSingles1"/>
+        <driver name="V0DQMPairs1"/>
+        <driver name="TridentMonitoringPairs1"/>-->
+        <!--        <driver name="PositronDebug"/>-->
+        <driver name="AidaSaveDriver"/>     
+        <driver name="LCIOWriter"/>     
+        <driver name="CleanupDriver" /> 
     </execute>
     <drivers>
-         <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">
-            <eventInterval>10</eventInterval>
+        <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">
+            <eventInterval>1000</eventInterval>
         </driver>
         <driver name="RawTrackerHitSensorSetup" type="org.lcsim.recon.tracking.digitization.sisim.config.RawTrackerHitSensorSetup" />
-        <driver name="RawTrackerHitFitterDriver" type="org.hps.recon.tracking.RawTrackerHitFitterDriver">
+        <!--        <driver name="RawTrackerHitFitterDriver" type="org.hps.recon.tracking.RawTrackerHitFitterDriver">
             <fitAlgorithm>Analytic</fitAlgorithm>
             <useTimestamps>false</useTimestamps>
             <correctT0Shift>false</correctT0Shift>
             <useTruthTime>false</useTruthTime>
             <debug>false</debug>
-        </driver>
-        <driver name="TrackerHitDriver" type="org.hps.recon.tracking.DataTrackerHitDriver">
-            <debug>false</debug>
-        </driver>
-        <driver name="HelicalTrackHitDriver" type="org.hps.recon.tracking.HelicalTrackHitDriver">
-            <debug>false</debug>
-<!--            <clusterTimeCut>16.0</clusterTimeCut> -->
+        </driver>-->
+        <!--        <driver name="TrackerHitDriver" type="org.hps.recon.tracking.DataTrackerHitDriver">
+            <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>false</saveAxialHits>
+        </driver>-->
+        
+        <driver name="SplitHitsOnTrack" type="org.hps.users.mgraham.SplitHitsOnTracks">             
         </driver>
         <driver name="TrackerL1to3ReconDriver" type="org.hps.recon.tracking.TrackerReconDriver">
             <debug>false</debug>
-        <trackCollectionName>L1to3Tracks</trackCollectionName>
+<!--            <includeMS>false</includeMS>
+            <useHPSMaterialManager>false</useHPSMaterialManager>-->
+            <inputHitCollectionName>OnTrackHits</inputHitCollectionName>
+            <trackCollectionName>L1to3Tracks</trackCollectionName>
             <strategyResource>/org/hps/recon/tracking/strategies/HPS-Full-L1-3.xml</strategyResource>
         </driver>
         <driver name="TrackerL4to6ReconDriver" type="org.hps.recon.tracking.TrackerReconDriver">
             <debug>false</debug>
-        <trackCollectionName>L4to6Tracks</trackCollectionName>
+<!--            <includeMS>false</includeMS>
+            <useHPSMaterialManager>false</useHPSMaterialManager>-->
+            <trackCollectionName>L4to6Tracks</trackCollectionName>
+            <inputHitCollectionName>OnTrackHits</inputHitCollectionName>
             <strategyResource>/org/hps/recon/tracking/strategies/HPS-Full-L4-6.xml</strategyResource>
         </driver>
-        <driver name="FullTrackerReconDriver" type="org.hps.recon.tracking.TrackerReconDriver">
+         <driver name="TrackerL134ReconDriver" type="org.hps.recon.tracking.TrackerReconDriver">
+            <debug>false</debug>
+<!--            <includeMS>false</includeMS>
+            <useHPSMaterialManager>false</useHPSMaterialManager>-->
+            <trackCollectionName>L134Tracks</trackCollectionName>
+            <inputHitCollectionName>OnTrackHits</inputHitCollectionName>
+            <strategyResource>/org/hps/recon/tracking/strategies/HPS-Full-L134.xml</strategyResource>
+        </driver>
+        <!--        <driver name="FullTrackerReconDriver" type="org.hps.recon.tracking.TrackerReconDriver">
             <debug>false</debug>
             <trackCollectionName>MatchedTracks</trackCollectionName>
             <strategyResource>/org/hps/recon/tracking/strategies/HPS-Full.xml</strategyResource>
-        </driver>
+        </driver>-->
         <driver name="TrackDataDriver" type="org.hps.recon.tracking.TrackDataDriver">
         </driver>
-         <driver name="EcalRawConverter" type="org.hps.recon.ecal.EcalRawConverterDriver">
+        <!--         <driver name="EcalRawConverter" type="org.hps.recon.ecal.EcalRawConverterDriver">
               <ecalCollectionName>EcalCalHits</ecalCollectionName>
             <use2014Gain>false</use2014Gain>
             <useTimestamps>false</useTimestamps>
@@ -77,25 +125,259 @@
          <driver name="EcalClusterer" type="org.hps.recon.ecal.cluster.ReconClusterDriver">              
                <useTimeCut>true</useTimeCut>
                <logLevel>ALL</logLevel>
-        </driver>     
+        </driver>     -->
         <driver name="ReconParticle" type="org.hps.recon.particle.HpsReconParticleDriver">
             <debug>false</debug>
-        </driver>   
+            <dxCut>50</dxCut>
+            <dyCut>50</dyCut>
+        </driver>  
+        
+        <driver name="ReconParticleL1to3" type="org.hps.recon.particle.HpsReconParticleDriver">
+            <trackCollectionName>L1to3Tracks</trackCollectionName>
+            <targetConV0VerticesColName>TargetConstrainedV0CandidatesL1to3</targetConV0VerticesColName>
+            <finalStateParticlesColName>FinalStateParticlesL1to3</finalStateParticlesColName>
+            <unconstrainedV0CandidatesColName>UnconstrainedV0CandidatesL1to3</unconstrainedV0CandidatesColName>
+            <beamConV0CandidatesColName>BeamspotConstrainedV0CandidatesL1to3</beamConV0CandidatesColName>
+            <unconstrainedV0VerticesColName>UnconstrainedV0VerticesL1to3</unconstrainedV0VerticesColName>
+            <beamConV0VerticesColName>BeamspotConstrainedV0VerticesL1to3</beamConV0VerticesColName>   
+            <targetConV0VerticesColName>TargetConstrainedV0VerticesL1to3</targetConV0VerticesColName>     
+            <debug>false</debug>
+            <dxCut>50</dxCut>
+            <dyCut>50</dyCut>
+        </driver>  
+        <driver name="ReconParticleL4to6" type="org.hps.recon.particle.HpsReconParticleDriver">
+            <trackCollectionName>L4to6Tracks</trackCollectionName>          
+            <targetConV0VerticesColName>TargetConstrainedV0CandidatesL4to6</targetConV0VerticesColName>
+            <finalStateParticlesColName>FinalStateParticlesL4to6</finalStateParticlesColName>
+            <unconstrainedV0CandidatesColName>UnconstrainedV0CandidatesL4to6</unconstrainedV0CandidatesColName>
+            <beamConV0CandidatesColName>BeamspotConstrainedV0CandidatesL4to6</beamConV0CandidatesColName>
+            <unconstrainedV0VerticesColName>UnconstrainedV0VerticesL4to6</unconstrainedV0VerticesColName>
+            <beamConV0VerticesColName>BeamspotConstrainedV0VerticesL4to6</beamConV0VerticesColName>   
+            <targetConV0VerticesColName>TargetConstrainedV0VerticesL4to6</targetConV0VerticesColName>     
+            <debug>false</debug>
+            <dxCut>50</dxCut>
+            <dyCut>50</dyCut>
+        </driver>  
+        
+          <driver name="ReconParticleL134" type="org.hps.recon.particle.HpsReconParticleDriver">
+            <trackCollectionName>L134Tracks</trackCollectionName>          
+            <targetConV0VerticesColName>TargetConstrainedV0CandidatesL134</targetConV0VerticesColName>
+            <finalStateParticlesColName>FinalStateParticlesL134</finalStateParticlesColName>
+            <unconstrainedV0CandidatesColName>UnconstrainedV0CandidatesL134</unconstrainedV0CandidatesColName>
+            <beamConV0CandidatesColName>BeamspotConstrainedV0CandidatesL134</beamConV0CandidatesColName>
+            <unconstrainedV0VerticesColName>UnconstrainedV0VerticesL134</unconstrainedV0VerticesColName>
+            <beamConV0VerticesColName>BeamspotConstrainedV0VerticesL134</beamConV0VerticesColName>   
+            <targetConV0VerticesColName>TargetConstrainedV0VerticesL134</targetConV0VerticesColName>     
+            <debug>false</debug>
+            <dxCut>50</dxCut>
+            <dyCut>50</dyCut>
+        </driver>  
+        
+        <!-- EngineeringRun2015FullRecon from Sho --> 
+        <driver name="RawTrackerHitFitterDriver" type="org.hps.recon.tracking.RawTrackerHitFitterDriver">
+            <fitAlgorithm>Pileup</fitAlgorithm>
+            <useTimestamps>false</useTimestamps>
+            <correctT0Shift>false</correctT0Shift>
+            <useTruthTime>false</useTruthTime>
+            <subtractTOF>true</subtractTOF>
+            <subtractTriggerTime>true</subtractTriggerTime>
+            <correctChanT0>true</correctChanT0>
+            <timeOffset>51.0</timeOffset>
+            <debug>false</debug>
+        </driver>
+        <driver name="TrackerHitDriver" type="org.hps.recon.tracking.DataTrackerHitDriver">
+            <neighborDeltaT>8.0</neighborDeltaT>
+<!--            <neighborDeltaT>24.0</neighborDeltaT>-->
+        </driver>
+        <driver name="HelicalTrackHitDriver" type="org.hps.recon.tracking.HelicalTrackHitDriver">
+            <debug>false</debug>
+<!--            <clusterTimeCut>10.0</clusterTimeCut>
+            <maxDt>12.0</maxDt>-->
+            <clusterTimeCut>12.0</clusterTimeCut>
+            <maxDt>16.0</maxDt>
+<!--            <clusterTimeCut>24.0</clusterTimeCut>
+            <maxDt>24.0</maxDt>-->
+            <maxSeperation>20.0</maxSeperation>
+            <tolerance>1.0</tolerance>
+        </driver>
+        <driver name="FullTrackerReconDriver" type="org.hps.recon.tracking.TrackerReconDriver">
+            <strategyResource>HPS-Full.xml</strategyResource>
+            <debug>false</debug>             
+            <rmsTimeCut>8.0</rmsTimeCut>
+<!--            <rmsTimeCut>24.0</rmsTimeCut>-->
+        </driver>    
+        <driver name="EcalRunningPedestal" type="org.hps.recon.ecal.EcalRunningPedestalDriver">
+            <logLevel>CONFIG</logLevel>
+            <minLookbackEvents>10</minLookbackEvents>
+            <maxLookbackEvents>50</maxLookbackEvents>
+        </driver>
+        <driver name="EcalRawConverter" type="org.hps.recon.ecal.EcalRawConverterDriver">
+            <ecalCollectionName>EcalCalHits</ecalCollectionName>
+            <use2014Gain>false</use2014Gain>
+            <useTimestamps>false</useTimestamps>
+            <useTruthTime>false</useTruthTime>
+            <useRunningPedestal>true</useRunningPedestal>
+            <useTimeWalkCorrection>true</useTimeWalkCorrection>
+            <emulateFirmware>true</emulateFirmware>
+            <emulateMode7>false</emulateMode7>
+            <leadingEdgeThreshold>12</leadingEdgeThreshold>
+            <nsa>100</nsa>
+            <nsb>20</nsb>
+            <windowSamples>50</windowSamples>
+            <nPeak>3</nPeak>
+        </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>
+            <minTime>0.0</minTime>
+            <timeWindow>25.0</timeWindow>
+            <useTimeCut>true</useTimeCut>
+            <writeRejectedHitCollection>false</writeRejectedHitCollection>
+        </driver>                
+        <!-- End of EngineeringRun2015FullRecon from Sho --> 
+           
+                      
         <driver name="TrackingMonitoring" type="org.hps.monitoring.drivers.trackrecon.TrackingReconPlots">         
-        <outputPlots>tracking</outputPlots>
         </driver>
         <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="V0Monitoring" type="org.hps.monitoring.drivers.trackrecon.V0ReconPlots">                    
         </driver>      
-      <driver name="SVTAlignment" type="org.hps.monitoring.drivers.trackrecon.SVTOpeningAlignment">         
-        <outputPlots>alignment</outputPlots>
-        </driver>   
-        <driver name="TrackTime" type="org.hps.monitoring.drivers.trackrecon.TrackTimePlots">                
+          
+        <driver name="SVTAlignment" type="org.hps.analysis.dataquality.SVTOpeningStudies">         
+        </driver> 
+        <driver name="TrackTime" type="org.hps.monitoring.drivers.trackrecon.TrackTimePlots">   
+             
         </driver>
 
+        <driver name="TrackingMonitoringDQM" type="org.hps.analysis.dataquality.TrackingMonitoring">         
+            <overwriteDB>false</overwriteDB>
+            <printDQMStrings>false</printDQMStrings>
+        </driver>
+        
+            <driver name="TrackingMonitoringL1to3Singles1DQM" type="org.hps.analysis.dataquality.TrackingMonitoring">         
+                <trackCollectionName>L1to3Tracks</trackCollectionName>
+                <overwriteDB>false</overwriteDB>
+            <printDQMStrings>false</printDQMStrings>
+        </driver>
+           <driver name="TrackingMonitoringL4to6Singles1DQM" type="org.hps.analysis.dataquality.TrackingMonitoring">         
+                <trackCollectionName>L4to6Tracks</trackCollectionName>
+                <overwriteDB>false</overwriteDB>
+            <printDQMStrings>false</printDQMStrings>
+        </driver>
+        
+           <driver name="TrackingMonitoringL134Singles1DQM" type="org.hps.analysis.dataquality.TrackingMonitoring">         
+                <trackCollectionName>L134Tracks</trackCollectionName>
+                <overwriteDB>false</overwriteDB>
+            <printDQMStrings>false</printDQMStrings>
+        </driver>
+        
+        
+        <driver name="TrackingMonitoringSingles1DQM" type="org.hps.analysis.dataquality.TrackingMonitoring">         
+            <overwriteDB>false</overwriteDB>
+            <printDQMStrings>false</printDQMStrings>
+            <triggerType>singles1</triggerType>
+        </driver>
+        <driver name="TrackingMonitoringPairs1DQM" type="org.hps.analysis.dataquality.TrackingMonitoring">         
+            <overwriteDB>false</overwriteDB>
+            <printDQMStrings>false</printDQMStrings>
+            <triggerType>pairs1</triggerType>
+        </driver>
+  
+        <driver name="TrackingResidualsPairs1DQM" type="org.hps.analysis.dataquality.TrackingResiduals">           
+            <overwriteDB>false</overwriteDB>
+            <printDQMStrings>false</printDQMStrings>
+            <triggerType>pairs1</triggerType>
+        </driver>
+        <driver name="TrackingResidualsSingles1DQM" type="org.hps.analysis.dataquality.TrackingResiduals">           
+            <overwriteDB>false</overwriteDB>
+            <printDQMStrings>false</printDQMStrings>
+            <triggerType>singles1</triggerType>
+        </driver>
+        <driver name="FinalStateDQM" type="org.hps.analysis.dataquality.FinalStateMonitoring">        
+            <overwriteDB>false</overwriteDB>
+            <printDQMStrings>false</printDQMStrings>
+            <triggerType>all</triggerType>
+        </driver>
+        
+        <driver name="FinalStateL1to3DQMSingles1" type="org.hps.analysis.dataquality.FinalStateMonitoring">        
+            <finalStateParticlesColName>FinalStateParticlesL1to3</finalStateParticlesColName>
+            <overwriteDB>false</overwriteDB>
+            <printDQMStrings>false</printDQMStrings>
+            <triggerType>singles1</triggerType>
+        </driver>
+        
+        <driver name="FinalStateL4to6DQMSingles1" type="org.hps.analysis.dataquality.FinalStateMonitoring">        
+            <finalStateParticlesColName>FinalStateParticlesL4to6</finalStateParticlesColName>
+            <overwriteDB>false</overwriteDB>
+            <printDQMStrings>false</printDQMStrings>
+            <triggerType>singles1</triggerType>
+        </driver>
+         <driver name="FinalStateL134DQMSingles1" type="org.hps.analysis.dataquality.FinalStateMonitoring">        
+            <finalStateParticlesColName>FinalStateParticlesL134</finalStateParticlesColName>
+            <overwriteDB>false</overwriteDB>
+            <printDQMStrings>false</printDQMStrings>
+            <triggerType>singles1</triggerType>
+        </driver>
+        <driver name="FinalStateDQMPairs1" type="org.hps.analysis.dataquality.FinalStateMonitoring">        
+            <overwriteDB>false</overwriteDB>
+            <printDQMStrings>false</printDQMStrings>
+            <triggerType>pairs1</triggerType>
+        </driver>
+        
+        
+        <driver name="FinalStateDQMSingles1" type="org.hps.analysis.dataquality.FinalStateMonitoring">        
+            <overwriteDB>false</overwriteDB>
+            <printDQMStrings>false</printDQMStrings>
+            <triggerType>singles1</triggerType>
+        </driver>
+ 
+        <driver name="V0DQM" type="org.hps.analysis.dataquality.V0Monitoring">        
+            <overwriteDB>false</overwriteDB>
+            <printDQMStrings>false</printDQMStrings>
+            <triggerType>all</triggerType>
+        </driver>
+              
+        <driver name="V0DQMPairs1" type="org.hps.analysis.dataquality.V0Monitoring">        
+            <overwriteDB>false</overwriteDB>
+            <printDQMStrings>false</printDQMStrings>
+            <triggerType>pairs1</triggerType>
+        </driver>
+        
+        <driver name="V0DQMSingles1" type="org.hps.analysis.dataquality.V0Monitoring">        
+            <overwriteDB>false</overwriteDB>
+            <printDQMStrings>false</printDQMStrings>
+            <triggerType>singles1</triggerType>
+        </driver>
+        
+        <driver name="SVTMonitoring" type="org.hps.analysis.dataquality.SvtMonitoring">         
+            <triggerType>all</triggerType>
+        </driver>    
+        
+        <driver name="TridentMonitoringPairs1" type="org.hps.analysis.dataquality.TridentMonitoring">
+            <triggerType>pairs1</triggerType>
+        </driver>
+        
+        <driver name="PositronDebug" type="org.hps.users.mgraham.PositronDebug">                   
+        </driver>
+        <driver name="AidaSaveDriver" type="org.lcsim.job.AidaSaveDriver">
+            <outputFileName>./${outputFile}.root</outputFileName>
+        </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" />       
+
+        <driver name="GTPOnlineClusterer" type="org.hps.recon.ecal.cluster.ClusterDriver">
+            <logLevel>WARNING</logLevel>
+            <clustererName>GTPOnlineClusterer</clustererName>
+            <outputClusterCollectionName>EcalClustersGTP</outputClusterCollectionName>
+            <!-- seedMinEnergy -->
+            <cuts>0.100</cuts>
+        </driver>      
+
     </drivers>
 </lcsim>

Modified: java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/users/phansson/HPSTrackingDefaults.lcsim
 =============================================================================
--- java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/users/phansson/HPSTrackingDefaults.lcsim	(original)
+++ java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/users/phansson/HPSTrackingDefaults.lcsim	Fri Jun 12 15:27:10 2015
@@ -1,41 +1,39 @@
 
-<lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd">
-    <inputFiles>
-        <!-- -->
-    </inputFiles>
+<lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
+       xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd">
     <control>
-        <numberOfEvents>3000</numberOfEvents>
-        <printInputFiles>true</printInputFiles>
-        <printDriversDetailed>true</printDriversDetailed>
+        <printInputFiles>false</printInputFiles>
+        <printDriversDetailed>false</printDriversDetailed>
+        <numberOfEvents>1000</numberOfEvents>
     </control>
     <execute>
-        <driver name="EventMarkerDriver" />
-        <driver name="BadChannelFilter" />
-        <driver name="SimpleSVTReadout" />
-        <driver name="RawTrackerHitFitterDriver" />
-        <driver name="TrackerHitDriver" />
-        <!--  
-        <driver name="TrackerDigiDriver"/> -->
-        <driver name="HelicalTrackHitDriver" />
-        <driver name="TrackerReconDriver" />
-        <driver name="SVTHitReconstructionPlots" />
-        <driver name="LCIOWriter" />
+<!--        <driver name="ConditionsDriver"/> -->
+        <driver name="EventMarkerDriver"/>   
+        <driver name="TrackerDigiDriver"/>
+        <driver name="HelicalTrackHitDriver"/>
+        <driver name="TrackerReconDriver"/>
+        <driver name="GBLOutputDriver"/>
+        <driver name="GBLDriver"/>
+<!--        <driver name="GblTrackingReconstructionPlots"/> -->
+        <driver name="TrackingReconstructionPlots"/>
+        <driver name="AidaSaveDriverRoot" /> 
+        <driver name="LCIOWriter"/>
+        
+        <driver name="CleanupDriver"/>
     </execute>
     <drivers>
+
+    <driver name="ConditionsDriver" type="org.hps.conditions.ConditionsDriver">
+         <detectorName>${detector}</detectorName>
+          <runNumber>${run}</runNumber>
+        <freeze>true</freeze>
+    </driver>
         <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">
-            <eventInterval>100</eventInterval>
+            <eventInterval>1</eventInterval>
         </driver>
-        <driver name="BadChannelFilter" type="org.hps.recon.tracking.SVTBadChannelFilterDriver" />
-        <driver name="SimpleSVTReadout" type="org.hps.readout.svt.SimpleSvtReadout">
-            <noPileup>true</noPileup>
-        </driver>
-        <driver name="RawTrackerHitFitterDriver" type="org.hps.recon.tracking.RawTrackerHitFitterDriver">
-            <fitAlgorithm>Analytic</fitAlgorithm>
-            <correctT0Shift>true</correctT0Shift>
-        </driver>
-        <driver name="TrackerHitDriver" type="org.hps.recon.tracking.DataTrackerHitDriver" />
         <driver name="TrackerDigiDriver" type="org.hps.recon.tracking.SimpleTrackerDigiDriver">
-            <debug>true</debug>
+<!--            <dropBadChannels>true</dropBadChannels>-->
+            <debug>false</debug>
         </driver>
         <driver name="HelicalTrackHitDriver" type="org.hps.recon.tracking.HelicalTrackHitDriver">
             <debug>false</debug>
@@ -44,13 +42,39 @@
         </driver>
         <driver name="TrackerReconDriver" type="org.hps.recon.tracking.TrackerReconDriver">
             <debug>false</debug>
-            <strategyResource>/org/hps/recon/tracking/strategies/HPS-Test-All.xml</strategyResource>
+            <!--<strategyResource>HPS-Full-All.xml</strategyResource>-->
+            <strategyResource>HPS-Full.xml</strategyResource>
         </driver>
-        <driver name="SVTHitReconstructionPlots" type="org.hps.monitoring.drivers.svt.SVTHitReconstructionPlots">
-            <outputPlots>SVTHitReconstructionPlots.aida</outputPlots>
+        <driver name="GBLOutputDriver" type="org.hps.recon.tracking.gbl.GBLOutputDriver">
+            <debug>0</debug>
+            <isMC>true</isMC>
+            <gblFileName>gbl.out</gblFileName>
+        </driver>
+        <driver name="GBLDriver" type="org.hps.recon.tracking.gbl.HpsGblRefitter">
+            <debug>false</debug>
+            <logLevel>WARNING</logLevel>
+            <milleBinaryFileName>milleTest.bin</milleBinaryFileName>
+            <writeMilleBinary>true</writeMilleBinary>
         </driver>
         <driver name="LCIOWriter" type="org.lcsim.util.loop.LCIODriver">
             <outputFilePath>${outputFile}</outputFilePath>
         </driver>
+        
+        <driver name="AidaSaveDriverRoot" type="org.lcsim.job.AidaSaveDriver">
+            <outputFileName>outputfile.root</outputFileName>
+            
+        </driver>
+        
+        <driver name="GblTrackingReconstructionPlots" type="org.hps.monitoring.drivers.svt.GblTrackingReconstructionPlots">
+            <outputPlots>TrackingReconstructionPlots.aida</outputPlots>
+        </driver>
+        <driver name="TrackingReconstructionPlots" type="org.hps.users.phansson.TrackingReconstructionPlots">
+            <showPlots>True</showPlots>
+        </driver>
+        
+        <driver name="CleanupDriver" type="org.lcsim.recon.tracking.digitization.sisim.config.ReadoutCleanupDriver"/>
+        
+        
+        
     </drivers>
 </lcsim>

Modified: java/branches/HPSJAVA-488/tracking/pom.xml
 =============================================================================
--- java/branches/HPSJAVA-488/tracking/pom.xml	(original)
+++ java/branches/HPSJAVA-488/tracking/pom.xml	Fri Jun 12 15:27:10 2015
@@ -8,7 +8,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>../parent/pom.xml</relativePath>
-        <version>3.3.1-SNAPSHOT</version>
+        <version>3.3.3-SNAPSHOT</version>
     </parent>
     <scm>
         <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/tracking/</url>
@@ -36,7 +36,7 @@
     <dependencies>
         <dependency>
             <groupId>org.hps</groupId>
-            <artifactId>hps-conditions</artifactId>
+            <artifactId>hps-detector-model</artifactId>
         </dependency>
         <dependency>
             <groupId>org.hps</groupId>
@@ -45,7 +45,6 @@
         <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-math3</artifactId>
-            <version>3.2</version>
         </dependency>
     </dependencies>
 </project>

Modified: java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/readout/svt/SimpleSvtReadout.java
 =============================================================================
--- java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/readout/svt/SimpleSvtReadout.java	(original)
+++ java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/readout/svt/SimpleSvtReadout.java	Fri Jun 12 15:27:10 2015
@@ -6,6 +6,8 @@
 import java.util.Map;
 import java.util.PriorityQueue;
 import java.util.Set;
+import org.hps.conditions.database.DatabaseConditionsManager;
+import org.hps.conditions.svt.SvtTimingConstants;
 
 import org.lcsim.detector.tracker.silicon.ChargeCarrier;
 import org.lcsim.detector.tracker.silicon.HpsSiSensor;
@@ -57,6 +59,8 @@
     private boolean noPileup = false;
     private boolean addNoise = true;
 
+    private boolean useTimingConditions = false;
+
     // cut settings
     private boolean enableThresholdCut = true;
     private int samplesAboveThreshold = 3;
@@ -105,6 +109,10 @@
 
     public void setReadoutLatency(double readoutLatency) {
         this.readoutLatency = readoutLatency;
+    }
+
+    public void setUseTimingConditions(boolean useTimingConditions) {
+        this.useTimingConditions = useTimingConditions;
     }
 
     /**
@@ -150,6 +158,12 @@
                 PriorityQueue<StripHit>[] hitQueues = new PriorityQueue[HPSSVTConstants.TOTAL_STRIPS_PER_SENSOR];
                 hitMap.put(sensor, hitQueues);
             }
+        }
+
+        if (useTimingConditions) {
+            SvtTimingConstants timingConstants = DatabaseConditionsManager.getInstance().getCachedConditions(SvtTimingConstants.SvtTimingConstantsCollection.class, "svt_timing_constants").getCachedData().get(0);
+            readoutOffset = 4 * (timingConstants.getOffsetPhase() + 5);
+            readoutLatency = 240.0 + timingConstants.getOffsetTime();
         }
     }
 

Modified: java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/BeamlineConstants.java
 =============================================================================
--- java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/BeamlineConstants.java	(original)
+++ java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/BeamlineConstants.java	Fri Jun 12 15:27:10 2015
@@ -5,6 +5,7 @@
     private BeamlineConstants() {
     }
 
+    public static final double ECAL_FACE = 1394.0 ; // mm Email from Takashi Jan 15th, 2015
     public static final double ECAL_FACE_TESTRUN = 1524; // mm
     public static final double DIPOLE_EDGE_TESTRUN = 457.2 + 457.2; // 452.2 +
                                                                     // 462.2;

Modified: java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/DataTrackerHitDriver.java
 =============================================================================
--- java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/DataTrackerHitDriver.java	(original)
+++ java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/DataTrackerHitDriver.java	Fri Jun 12 15:27:10 2015
@@ -37,8 +37,8 @@
     private double clusterSeedThreshold = 4.0;
     private double clusterNeighborThreshold = 3.0;
     private double clusterThreshold = 4.0;
-    private double meanTime = 24.0;
-    private double timeWindow = 48.0;
+    private double meanTime = 0.0;
+    private double timeWindow = 72.0;
     private double neighborDeltaT = 24.0;
     private int clusterMaxSize = 10;
     private int clusterCentralStripAveragingThreshold = 4;

Modified: java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/HelicalTrackHitDriver.java
 =============================================================================
--- java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/HelicalTrackHitDriver.java	(original)
+++ java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/HelicalTrackHitDriver.java	Fri Jun 12 15:27:10 2015
@@ -14,6 +14,7 @@
 import org.lcsim.detector.ITransform3D;
 import org.lcsim.detector.converter.compact.subdetector.HpsTracker2;
 import org.lcsim.detector.converter.compact.subdetector.SvtStereoLayer;
+import org.lcsim.detector.tracker.silicon.DopedSilicon;
 import org.lcsim.detector.tracker.silicon.HpsSiSensor;
 import org.lcsim.detector.tracker.silicon.SiSensor;
 import org.lcsim.detector.tracker.silicon.SiTrackerModule;
@@ -51,6 +52,7 @@
     private double _clusterTimeCut = -99; // if negative, don't cut..otherwise,
     // dt cut time in ns
     private double maxDt = -99; // max time difference between the two hits in a cross
+    private double clusterAmplitudeCut = -99; // cluster amplitude cut
     private String _subdetectorName = "Tracker";
     private final Map<String, String> _stereomap = new HashMap<String, String>();
     private List<SvtStereoLayer> stereoLayers = null;
@@ -70,6 +72,8 @@
      * Default Ctor
      */
     public HelicalTrackHitDriver() {
+        _crosser.setMaxSeparation(20.0);
+        _crosser.setTolerance(0.1);
         _colnames.add("StripClusterer_SiTrackerHitStrip1D");
     }
 
@@ -93,6 +97,10 @@
 
     public void setMaxDt(double maxDt) {
         this.maxDt = maxDt;
+    }
+
+    public void setClusterAmplitudeCut(double clusterAmplitudeCut) {
+        this.clusterAmplitudeCut = clusterAmplitudeCut;
     }
 
     /**
@@ -169,9 +177,11 @@
         RelationalTable hittomc = new BaseRelationalTable(RelationalTable.Mode.ONE_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) {
                     hittomc.add(relation.getFrom(), relation.getTo());
+                }
+            }
         }
 
         List<HelicalTrack2DHit> axialhits = new ArrayList<>();
@@ -180,45 +190,58 @@
         // ...for HPS, probably this is just a single one...
         for (String _colname : this._colnames) {
             if (!event.hasCollection(SiTrackerHit.class, _colname)) {
-                if (_debug)
+                if (_debug) {
                     System.out.println("Event: " + event.getRunNumber() + " does not contain the collection " + _colname);
+                }
                 continue;
             }
             // Get the list of SiTrackerHits for this collection
             List<SiTrackerHit> hitlist = event.get(SiTrackerHit.class, _colname);
-            if (_debug)
+            if (_debug) {
                 System.out.printf("%s: found %d SiTrackerHits\n", this.getClass().getSimpleName(), hitlist.size());
+            }
             Map<HelicalTrackStrip, SiTrackerHitStrip1D> stripmap = new HashMap<HelicalTrackStrip, SiTrackerHitStrip1D>();
-            for (SiTrackerHit hit : hitlist)
+            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;
-
-                    if ((_clusterTimeCut > 0 && Math.abs(h.getTime()) < _clusterTimeCut) || _clusterTimeCut < 0) {
-                        // Create a HelicalTrackStrip for this hit
-                        HelicalTrackStrip strip = makeDigiStrip(h);
-                        for (RawTrackerHit rth : h.getRawHits())
-                            for (Object simHit : hittomc.allFrom(rth))
-                                strip.addMCParticle(((SimTrackerHit) simHit).getMCParticle());
-
-                        // 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 layer %d\n", this.getClass().getSimpleName(), strip.origin().toString(), strip.layer());
-
-                        if (_saveAxialHits)//                           
-                            if (((HpsSiSensor) h.getSensor()).isAxial()) {
-                                HelicalTrack2DHit haxial = makeDigiAxialHit(h);                                
-                                axialhits.add(haxial);
-                                List<RawTrackerHit> rl = haxial.getRawHits();
-                                for (RawTrackerHit rth : rl)
-                                    for (Object simHit : hittomc.allFrom(rth))
-                                        haxial.addMCParticle(((SimTrackerHit) simHit).getMCParticle());
-                                axialmcrelations.add(new MyLCRelation(haxial, haxial.getMCParticles()));
+                    if (clusterAmplitudeCut > 0 && h.getdEdx()/DopedSilicon.ENERGY_EHPAIR < clusterAmplitudeCut) {
+                        continue;
+                    }
+                    if (_clusterTimeCut > 0 && Math.abs(h.getTime()) > _clusterTimeCut) {
+                        continue;
+                    }
+
+                    // Create a HelicalTrackStrip for this hit
+                    HelicalTrackStrip strip = makeDigiStrip(h);
+                    for (RawTrackerHit rth : h.getRawHits()) {
+                        for (Object simHit : hittomc.allFrom(rth)) {
+                            strip.addMCParticle(((SimTrackerHit) simHit).getMCParticle());
+                        }
+                    }
+
+                    // 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 layer %d\n", this.getClass().getSimpleName(), strip.origin().toString(), strip.layer());
+                    }
+
+                    if (_saveAxialHits)//                           
+                    {
+                        if (((HpsSiSensor) h.getSensor()).isAxial()) {
+                            HelicalTrack2DHit haxial = makeDigiAxialHit(h);
+                            axialhits.add(haxial);
+                            List<RawTrackerHit> rl = haxial.getRawHits();
+                            for (RawTrackerHit rth : rl) {
+                                for (Object simHit : hittomc.allFrom(rth)) {
+                                    haxial.addMCParticle(((SimTrackerHit) simHit).getMCParticle());
+                                }
                             }
+                            axialmcrelations.add(new MyLCRelation(haxial, haxial.getMCParticles()));
+                        }
                     }
                 } else {
                     // If not a 1D strip hit, make a pixel hit
@@ -227,6 +250,7 @@
                     helhits.add(hit3d);
                     hitrelations.add(new MyLCRelation(hit3d, hit));
                 }
+            }
 
             List<HelicalTrackCross> helicalTrackCrosses = new ArrayList<HelicalTrackCross>();
 
@@ -242,8 +266,9 @@
 
                     // This hit should be a on a stereo pair!
                     // With our detector setup, when is this not true?
-                    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!");
+                    }
 
                     // Get the list of strips for this layer - create a new
                     // list if one doesn't already exist
@@ -258,8 +283,9 @@
                     lyrhits.add(strip);
                 }
 
-                if (_debug)
+                if (_debug) {
                     System.out.printf("%s: Create stereo hits from %d strips \n", this.getClass().getSimpleName(), striplistmap.size());
+                }
 
                 // Loop over the stereo layer pairs
                 // TODO: Change this so that it makes use of StereoPairs
@@ -267,17 +293,19 @@
                     // Get the second layer
                     String id2 = _stereomap.get(id1);
 
-                    if (_debug)
+                    if (_debug) {
                         System.out.printf("%s: Form stereo hits from sensor id %s with %d hits and %s with %d hits\n", this.getClass().getSimpleName(), id1, striplistmap.get(id1) == null ? 0 : striplistmap.get(id1).size(), id2, striplistmap.get(id2) == null ? 0 : striplistmap.get(id2).size());
+                    }
 
                     // Form the stereo hits and add them to our hit list
                     helicalTrackCrosses.addAll(_crosser.MakeHits(striplistmap.get(id1), striplistmap.get(id2)));
                 } // End of loop over stereo pairs
             } else {
 
-                if(_debug) 
+                if (_debug) {
                     System.out.printf("%s: Associate  %d strips to their sensors before pairing\n", this.getClass().getSimpleName(), stripmap.size());
-                
+                }
+
                 Map<SiSensor, List<HelicalTrackStrip>> striplistmap = new HashMap<SiSensor, List<HelicalTrackStrip>>();
 
                 for (HelicalTrackStrip strip : stripmap.keySet()) {
@@ -293,46 +321,50 @@
 
                     // Add the strip to the list of strips on this sensor
                     hitsOnSensor.add(strip);
-                    
-                    if(_debug) 
+
+                    if (_debug) {
                         System.out.printf("%s: Adding strip hit with origin %s to sensor %s\n", this.getClass().getSimpleName(), strip.origin().toString(), sensor.getName());
-                
-                }
-
-                    
-                if(_debug) {
-                    System.out.printf("%s: Form stereo hits based on %d stereo layers:\n",this.getClass().getSimpleName(), stereoLayers.size());
-                    System.out.printf("%s: %42s %42s\n",this.getClass().getSimpleName(), "<axial>", "<stereo>");
+                    }
+
+                }
+
+                if (_debug) {
+                    System.out.printf("%s: Form stereo hits based on %d stereo layers:\n", this.getClass().getSimpleName(), stereoLayers.size());
+                    System.out.printf("%s: %42s %42s\n", this.getClass().getSimpleName(), "<axial>", "<stereo>");
                     for (SvtStereoLayer stereoLayer : stereoLayers) {
-                        System.out.printf("%s: %42s %42s\n",this.getClass().getSimpleName(), stereoLayer.getAxialSensor().getName(), stereoLayer.getStereoSensor().getName());
-                    }
-                }
-
-                if(_debug) 
+                        System.out.printf("%s: %42s %42s\n", this.getClass().getSimpleName(), stereoLayer.getAxialSensor().getName(), stereoLayer.getStereoSensor().getName());
+                    }
+                }
+
+                if (_debug) {
                     System.out.printf("%s: Create crosses\n", this.getClass().getSimpleName());
-                
+                }
+
                 //===> for (StereoPair stereoPair : SvtUtils.getInstance().getStereoPairs()) {
                 for (SvtStereoLayer stereoLayer : stereoLayers) {
 
-                    if(_debug) 
+                    if (_debug) {
                         System.out.printf("%s: axial %s stereo %s \n", this.getClass().getSimpleName(), stereoLayer.getAxialSensor().getName(), stereoLayer.getStereoSensor().getName());
-                    
-                    
+                    }
+
                     // Form the stereo hits and add them to our hit list
                     List<HelicalTrackCross> newCrosses;
 
                     //===> if (stereoPair.getDetectorVolume() == detectorVolume.Top) {
                     if (stereoLayer.getAxialSensor().isTopLayer()) {
-                        if(_debug) 
+                        if (_debug) {
                             System.out.printf("%s: make hits for top\n", this.getClass().getSimpleName());
-                        
+                        }
+
                         newCrosses = _crosser.MakeHits(striplistmap.get(stereoLayer.getAxialSensor()), striplistmap.get(stereoLayer.getStereoSensor())); //===> } else if (stereoPair.getDetectorVolume() == detectorVolume.Bottom) {
                     } else if (stereoLayer.getAxialSensor().isBottomLayer()) {
-                        if(_debug) 
+                        if (_debug) {
                             System.out.printf("%s: make hits for bottom\n", this.getClass().getSimpleName());
+                        }
                         newCrosses = _crosser.MakeHits(striplistmap.get(stereoLayer.getStereoSensor()), striplistmap.get(stereoLayer.getAxialSensor()));
-                    } else
+                    } else {
                         throw new RuntimeException("stereo pair is neither top nor bottom");
+                    }
 
                     helicalTrackCrosses.addAll(newCrosses);
                 } // Loop over stereo pairs
@@ -344,25 +376,31 @@
                     iter.remove();
                     continue;
                 }
-                if (cross.getMCParticles() != null)
-                    for (MCParticle mcp : cross.getMCParticles())
+                if (cross.getMCParticles() != null) {
+                    for (MCParticle mcp : cross.getMCParticles()) {
                         mcrelations.add(new MyLCRelation((HelicalTrackHit) cross, mcp));
-                for (HelicalTrackStrip strip : cross.getStrips())
+                    }
+                }
+                for (HelicalTrackStrip strip : cross.getStrips()) {
                     hitrelations.add(new MyLCRelation(cross, stripmap.get(strip)));
-                if (_debug)
+                }
+                if (_debug) {
                     System.out.printf("%s: cross at %.2f,%.2f,%.2f \n", this.getClass().getSimpleName(), cross.getPosition()[0], cross.getPosition()[1], cross.getPosition()[2]);
+                }
             }
 
             stereoCrosses.addAll(helicalTrackCrosses);
 
-            if (_debug)
+            if (_debug) {
                 System.out.printf("%s: added %d stereo hits from %s collection \n", this.getClass().getSimpleName(), helicalTrackCrosses.size(), _colname);
+            }
         } // End of loop over collection names
 
         if (_debug) {
             System.out.printf("%s: totally added %d stereo hits:\n", this.getClass().getSimpleName(), stereoCrosses.size());
-            for (HelicalTrackCross cross : stereoCrosses)
+            for (HelicalTrackCross cross : stereoCrosses) {
                 System.out.printf("%s: %.2f,%.2f,%.2f \n", this.getClass().getSimpleName(), cross.getPosition()[0], cross.getPosition()[1], cross.getPosition()[2]);
+            }
         }
 
         // Add things to the event
@@ -378,8 +416,9 @@
         }
         if (_doTransformToTracking) {
             addRotatedHitsToEvent(event, stereoCrosses);
-            if (_saveAxialHits)
+            if (_saveAxialHits) {
                 addRotated2DHitsToEvent(event, axialhits);
+            }
         }
     } // Process()
 
@@ -409,30 +448,36 @@
         /*
          * Setup default pairing
          */
-        if (_debug)
+        if (_debug) {
             System.out.printf("%s: Setup stereo hit pair modules \n", this.getClass().getSimpleName());
+        }
 
         List<SiTrackerModule> modules = detector.getSubdetector(this._subdetectorName).getDetectorElement().findDescendants(SiTrackerModule.class);
 
-        if (modules.isEmpty())
+        if (modules.isEmpty()) {
             throw new RuntimeException(this.getClass().getName() + ": No SiTrackerModules found in detector.");
+        }
 
         if (LayerGeometryType.Common == this._layerGeometryType) {
 
             int nLayersTotal = detector.getSubdetector(_subdetectorName).getLayering().getLayers().getNumberOfLayers();
-            if (_debug)
+            if (_debug) {
                 System.out.printf("%s: %d layers \n", this.getClass().getSimpleName(), nLayersTotal);
-            if (nLayersTotal % 2 != 0)
+            }
+            if (nLayersTotal % 2 != 0) {
                 throw new RuntimeException(this.getClass().getName() + ": Don't know how to do stereo pairing for odd number of modules.");
+            }
             for (int i = 1; i <= (nLayersTotal) - 1; i += 2) {
-                if (_debug)
+                if (_debug) {
                     System.out.printf("%s: Adding stereo pair: %d,%d\n", this.getClass().getSimpleName(), i, i + 1);
+                }
                 setStereoPair(_subdetectorName, i, i + 1);
             }
         }
 
-        if (_debug)
+        if (_debug) {
             System.out.printf("%s: %d stereo modules added", this.getClass().getSimpleName(), this._stereomap.size());
+        }
 
     }
 
@@ -465,11 +510,11 @@
         Hep3Vector org = trans.transformed(_orgloc);
         Hep3Vector u = global.getMeasuredCoordinate();
         Hep3Vector v = global.getUnmeasuredCoordinate();
-        
-        if (_debug)
+
+        if (_debug) {
             System.out.println(this.getClass().getSimpleName() + ": makeDigiStrip: org " + org.toString() + " and u " + u.toString() + " v " + v.toString());
-        
-        
+        }
+
         double umeas = local.getPosition()[0];
         double vmin = VecOp.dot(local.getUnmeasuredCoordinate(), local.getHitSegment().getStartPoint());
         double vmax = VecOp.dot(local.getUnmeasuredCoordinate(), local.getHitSegment().getEndPoint());
@@ -486,15 +531,18 @@
         HelicalTrackStrip strip = new HelicalTrackStrip(org, u, v, umeas, du, vmin, vmax, dEdx, time, rawhits, det, lyr, be);
 
         try {
-            if (h.getMCParticles() != null)
-                for (MCParticle p : h.getMCParticles())
+            if (h.getMCParticles() != null) {
+                for (MCParticle p : h.getMCParticles()) {
                     strip.addMCParticle(p);
+                }
+            }
         } catch (RuntimeException e) {
             // Okay when MC info not present.
         }
 
-        if (_debug)
+        if (_debug) {
             System.out.println(this.getClass().getSimpleName() + ": makeDigiStrip: produced HelicalTrackStrip with origin " + strip.origin().toString() + " and u " + strip.u().toString() + " v " + strip.v().toString() + " w " + strip.w().toString());
+        }
 
         return strip;
     }
@@ -525,19 +573,23 @@
                 Hep3Vector newu = CoordinateTransformations.transformVectorToTracking(u);
                 Hep3Vector newv = CoordinateTransformations.transformVectorToTracking(v);
                 HelicalTrackStrip newstrip = new HelicalTrackStrip(neworigin, newu, newv, umeas, du, vmin, vmax, dedx, time, rthList, detname, layer, bec);
-                for (MCParticle p : strip.MCParticles())
+                for (MCParticle p : strip.MCParticles()) {
                     newstrip.addMCParticle(p);
+                }
                 rotatedstriphits.add(newstrip);
-                if(_debug)
-                    System.out.printf("%s: adding rotated strip with origin %s and u %s v %s w %s \n", getClass().toString(), newstrip.origin().toString(), newstrip.u().toString(),newstrip.v().toString(),  newstrip.w().toString());
+                if (_debug) {
+                    System.out.printf("%s: adding rotated strip with origin %s and u %s v %s w %s \n", getClass().toString(), newstrip.origin().toString(), newstrip.u().toString(), newstrip.v().toString(), newstrip.w().toString());
+                }
             }
             HelicalTrackCross newhit = new HelicalTrackCross(rotatedstriphits.get(0), rotatedstriphits.get(1));
-            for (MCParticle mcp : cross.getMCParticles())
+            for (MCParticle mcp : cross.getMCParticles()) {
                 newhit.addMCParticle(mcp);
+            }
             rotatedhits.add(newhit);
             hthrelations.add(new MyLCRelation(cross, newhit));
-            for (MCParticle mcp : newhit.getMCParticles())
+            for (MCParticle mcp : newhit.getMCParticles()) {
                 mcrelations.add(new MyLCRelation(newhit, mcp));
+            }
         }
 
         event.put("Rotated" + _outname, rotatedhits, HelicalTrackHit.class, 0);
@@ -567,11 +619,13 @@
             Hep3Vector newaxdir = CoordinateTransformations.transformVectorToTracking(axDir);
             SymmetricMatrix newcov = CoordinateTransformations.transformCovarianceToTracking(cov);
             HelicalTrack2DHit newhit = new HelicalTrack2DHit(newpos, newcov, dedx, time, rthList, detname, layer, bec, vmin, vmax, newaxdir);
-            for (MCParticle mcp : twodhit.getMCParticles())
+            for (MCParticle mcp : twodhit.getMCParticles()) {
                 newhit.addMCParticle(mcp);
+            }
             rotatedhits.add(newhit);
-            for (MCParticle mcp : newhit.getMCParticles())
+            for (MCParticle mcp : newhit.getMCParticles()) {
                 mcrelations.add(new MyLCRelation(newhit, mcp));
+            }
         }
         if (_debug) {
             System.out.println(this.getClass().getSimpleName() + ": " + _axialname + " size = " + rotatedhits.size());

Modified: java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/MaterialSupervisor.java
 =============================================================================
--- java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/MaterialSupervisor.java	(original)
+++ java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/MaterialSupervisor.java	Fri Jun 12 15:27:10 2015
@@ -61,25 +61,29 @@
     @Override
     public void buildModel(Detector det)
     {
+        boolean local_debug = false;
         // super.buildModel(det);
-        if (DEBUG) {
+        if (DEBUG || local_debug) {
             System.out.printf("%s: ###########################################################\n", this.getClass().getSimpleName());
             System.out.printf("%s: Build detector model\n", this.getClass().getSimpleName());
         }
         List<SiSensor> sensors = det.getSubdetector("Tracker").getDetectorElement().findDescendants(SiSensor.class);
         // List<SiTrackerModule> modules =
         // det.getDetectorElement().findDescendants(SiTrackerModule.class);
-        if (DEBUG) {
-            System.out.printf("%s: %d sensors\n", this.getClass().getSimpleName(), sensors.size());
-            System.out.printf("%s: %5s %32s %22s %15s %10s %10s\n", this.getClass().getSimpleName(), "ID", "Pos (mm)", "size(mm)", "t(mm)", "t(%R.L)", "type");
+        if (DEBUG || local_debug) {
+            System.out.printf("%s: %d SiSensors:\n", this.getClass().getSimpleName(), sensors.size());
+            System.out.printf("%s: %45s %35s %35s %35s %35s\n", this.getClass().getSimpleName(), "DE", "Origin", "u", "v", "w");
         }
         for (SiSensor module : sensors) {
 
             SiStripPlane plane = new SiStripPlane(module);
 
+            if (DEBUG || local_debug) {
+                System.out.printf("%s: %45s %35s %35s %35s %35s\n", this.getClass().getSimpleName(), plane.getDetectorElement().getName(), plane.getGeometry().getPosition().toString(), plane.getMeasuredCoordinate().toString(), plane.getUnmeasuredCoordinate().toString(),plane.getPsidePlane().getNormal().toString());
+            }
             _detectorVolumes.add(plane);
         }
-        if (DEBUG) {
+        if (DEBUG || local_debug) {
             System.out.printf("%s: ###########################################################\n", this.getClass().getSimpleName());
         }
     }

Modified: java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/RawTrackerHitFitterDriver.java
 =============================================================================
--- java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/RawTrackerHitFitterDriver.java	(original)
+++ java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/RawTrackerHitFitterDriver.java	Fri Jun 12 15:27:10 2015
@@ -2,14 +2,14 @@
 
 import java.util.ArrayList;
 import java.util.List;
-
-//===> import org.hps.conditions.deprecated.HPSSVTCalibrationConstants.ChannelConstants;
+import org.hps.conditions.database.DatabaseConditionsManager;
+import org.hps.conditions.svt.SvtTimingConstants;
 import org.hps.readout.ecal.ReadoutTimestamp;
 import org.hps.readout.svt.HPSSVTConstants;
 import org.lcsim.detector.tracker.silicon.HpsSiSensor;
-//===> import org.lcsim.detector.tracker.silicon.SiSensor;
 import org.lcsim.event.EventHeader;
 import org.lcsim.event.RawTrackerHit;
+import org.lcsim.geometry.Detector;
 import org.lcsim.lcio.LCIOConstants;
 import org.lcsim.recon.cat.util.Const;
 import org.lcsim.util.Driver;
@@ -27,15 +27,15 @@
     private String rawHitCollectionName = "SVTRawTrackerHits";
     private String fitCollectionName = "SVTShapeFitParameters";
     private String fittedHitCollectionName = "SVTFittedRawTrackerHits";
+    private SvtTimingConstants timingConstants;
     private int genericObjectFlags = 1 << LCIOConstants.GOBIT_FIXED;
     private int relationFlags = 0;
-    private double timeOffset = 0.0;
+    private boolean correctTimeOffset = false;
     private boolean correctT0Shift = false;
     private boolean useTimestamps = false;
     private boolean useTruthTime = false;
     private boolean subtractTOF = false;
     private boolean subtractTriggerTime = false;
-    private int triggerPhaseOffset = 4;
     private boolean correctChanT0 = true;
 
     /**
@@ -51,8 +51,8 @@
         this.debug = debug;
     }
 
-    public void setTimeOffset(double timeOffset) {
-        this.timeOffset = timeOffset;
+    public void setCorrectTimeOffset(boolean correctTimeOffset) {
+        this.correctTimeOffset = correctTimeOffset;
     }
 
     public void setCorrectT0Shift(boolean correctT0Shift) {
@@ -69,10 +69,6 @@
 
     public void setSubtractTriggerTime(boolean subtractTriggerTime) {
         this.subtractTriggerTime = subtractTriggerTime;
-    }
-
-    public void setTriggerPhaseOffset(int triggerPhaseOffset) {
-        this.triggerPhaseOffset = triggerPhaseOffset;
     }
 
     public void setCorrectChanT0(boolean correctChanT0) {
@@ -123,6 +119,10 @@
         }
     }
 
+    protected void detectorChanged(Detector detector) {
+        timingConstants = DatabaseConditionsManager.getInstance().getCachedConditions(SvtTimingConstants.SvtTimingConstantsCollection.class, "svt_timing_constants").getCachedData().get(0);
+    }
+
     @Override
     public void process(EventHeader event) {
         if (!event.hasCollection(RawTrackerHit.class, rawHitCollectionName)) {
@@ -144,10 +144,11 @@
             //===> ChannelConstants constants = HPSSVTCalibrationConstants.getChannelConstants((SiSensor) hit.getDetectorElement(), strip);
             //for (ShapeFitParameters fit : _shaper.fitShape(hit, constants)) {
             for (ShapeFitParameters fit : fitter.fitShape(hit, shape)) {
-                fit.setT0(fit.getT0() - timeOffset);
-
+                if (correctTimeOffset) {
+                    fit.setT0(fit.getT0() - timingConstants.getOffsetTime());
+                }
                 if (subtractTriggerTime) {
-                    fit.setT0(fit.getT0() - (((event.getTimeStamp() + 4 * triggerPhaseOffset) % 24) - 12));
+                    fit.setT0(fit.getT0() - (((event.getTimeStamp() - 4 * timingConstants.getOffsetPhase()) % 24) - 12));
                 }
                 if (correctChanT0) {
                     fit.setT0(fit.getT0() - sensor.getShapeFitParameters(strip)[HpsSiSensor.T0_INDEX]);

Modified: java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/ShaperAnalyticFitAlgorithm.java
 =============================================================================
--- java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/ShaperAnalyticFitAlgorithm.java	(original)
+++ java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/ShaperAnalyticFitAlgorithm.java	Fri Jun 12 15:27:10 2015
@@ -26,10 +26,10 @@
     @Override
     public Collection<ShapeFitParameters> fitShape(RawTrackerHit rth, PulseShape shape) {
         short[] samples = rth.getADCValues();
-        HpsSiSensor sensor =(HpsSiSensor) rth.getDetectorElement();
+        HpsSiSensor sensor = (HpsSiSensor) rth.getDetectorElement();
         int channel = rth.getIdentifierFieldValue("strip");
         return this.fitShape(channel, samples, sensor);
-    	//===> return this.fitShape(rth.getADCValues(), constants);
+        //===> return this.fitShape(rth.getADCValues(), constants);
     }
 
     public Collection<ShapeFitParameters> fitShape(int channel, short[] samples, HpsSiSensor sensor) {
@@ -60,11 +60,11 @@
         double[] y = new double[length];
         double[] t = new double[length];
 
-        double tp = sensor.getShapeFitParameters(channel)[HpsSiSensor.TP_INDEX];
+        double tp = 2.5*Math.pow(sensor.getShapeFitParameters(channel)[HpsSiSensor.TP_INDEX], 0.25) * Math.pow(sensor.getShapeFitParameters(channel)[HpsSiSensor.TP_INDEX + 1], 0.75);
 
         for (int i = 0; i < length; i++) {
             //===> y[i] = samples[start + i] - constants.getPedestal();
-        	y[i] = samples[start + i] - sensor.getPedestal(channel, i);
+            y[i] = samples[start + i] - sensor.getPedestal(channel, i);
             t[i] = HPSSVTConstants.SAMPLING_INTERVAL * i;
         }
 
@@ -74,8 +74,8 @@
             //===> p[i] = y[i] / constants.getNoise();
             p[i] = y[i] / sensor.getNoise(channel, i);
             //===> a[i] = Math.exp(1 - t[i] / constants.getTp()) / (constants.getTp() * constants.getNoise());
-            
-            a[i] = Math.exp(1 - t[i] /tp)  / (tp * sensor.getNoise(channel, i));
+
+            a[i] = Math.exp(1 - t[i] / tp) / (tp * sensor.getNoise(channel, i));
         }
 
         double pa, aatt, pat, aat, aa;

Modified: java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/TrackDataDriver.java
 =============================================================================
--- java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/TrackDataDriver.java	(original)
+++ java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/TrackDataDriver.java	Fri Jun 12 15:27:10 2015
@@ -13,50 +13,39 @@
 import org.lcsim.event.Track;
 import org.lcsim.event.TrackerHit;
 import org.lcsim.event.base.BaseLCRelation;
+import org.lcsim.event.RelationalTable;
+import org.lcsim.event.base.BaseRelationalTable;
 import org.lcsim.fit.helicaltrack.HelicalTrackCross;
 import org.lcsim.fit.helicaltrack.HelicalTrackHit;
 import org.lcsim.fit.helicaltrack.HelicalTrackStrip;
-import org.lcsim.geometry.Detector;
 import org.lcsim.util.Driver;
-import org.lcsim.event.RelationalTable;
-import org.lcsim.event.base.BaseRelationalTable;
 
 /**
  *
  * @author Omar Moreno <[log in to unmask]>
- * @version $Id$
+ * @author Sho Uemura <[log in to unmask]>
  *
  */
 public class TrackDataDriver extends Driver {
 
     // Collection Names
     String trackCollectionName = "MatchedTracks";
-    // TODO: Change this to match whatever track name is decided on
-    String trackTimeDataCollectionName = "TrackTimeData";
     String trackResidualsCollectionName = "TrackResiduals";
     String rotatedHthRelationsColName = "RotatedHelicalTrackHitRelations";
     String rotatedHthCollectionName = "RotatedHelicalTrackHits";
-    String trackTimeDataRelationsColName = "TrackTimeDataRelations";
     String trackResidualsRelationsColName = "TrackResidualsRelations";
 
     public TrackDataDriver() {
     }
     
-    public void setTrackCollectionName(String name){
+    public void setTrackCollectionName(String name) {
         this.trackCollectionName=name;
     }
 
-    protected void detectorChanged(Detector detector) {
-
-        // TODO: Add plots of all track data variables
-    }
-
     protected void process(EventHeader event) {
 
         // If the event doesn't contain a collection of tracks, skip it.
-        if (!event.hasCollection(Track.class, trackCollectionName)) {
-            return;
-        }
+        if (!event.hasCollection(Track.class, trackCollectionName)) return;
 
         // Get the collection of tracks from the event
         List<Track> tracks = event.get(Track.class, trackCollectionName);
@@ -69,31 +58,27 @@
 
         List<HelicalTrackHit> rotatedHths = event.get(HelicalTrackHit.class, rotatedHthCollectionName);
 
-        // Create a collection to hold the track time and t0 residual data
-        List<TrackTimeData> timeDataCollection = new ArrayList<TrackTimeData>();
-
-        // Create a collection of LCRelations between a track and the t0 residual data
-        List<LCRelation> trackToTrackTimeDataRelations = new ArrayList<LCRelation>();
-
+        // Create a container that will be used to store all TrackData objects.
+        List<TrackData> trackDataCollection = new ArrayList<TrackData>();
+       
+        // Create a container that will be used to store all LCRelations between
+        // a TrackData object and the corresponding Track
+        List<LCRelation> trackDataRelations = new ArrayList<LCRelation>();
+        
         // Create a collection to hold the track residuals
         List<TrackResidualsData> trackResidualsCollection = new ArrayList<TrackResidualsData>();
 
         // Create a collection of LCRelations between a track and the track residuals
         List<LCRelation> trackToTrackResidualsRelations = new ArrayList<LCRelation>();
 
-        // Create a collection to hold the track residuals
-        List<TrackQualityData> trackQualityCollection = new ArrayList<TrackQualityData>();
-
-        // Create a collection of LCRelations between a track and the track residuals
-        List<LCRelation> trackQualityDataToTrackRelations = new ArrayList<LCRelation>();
-
-        double totalT0 = 0;
-        double totalHits = 0;
-        double trackTime = 0;
-        double t0Residual = 0;
         double xResidual = 0;
         double yResidual = 0;
-        float trackerVolume = -1;
+        
+        float totalT0 = 0;
+        float totalHits = 0;
+        float trackTime = 0;
+        
+        int trackerVolume = -1;
 
         boolean isFirstHit = true;
 
@@ -118,10 +103,10 @@
             trackResidualsX.clear();
             trackResidualsY.clear();
             stereoLayers.clear();
+            isFirstHit = true;
 
             //
-            // Calculate the track time and track residuals. Also, change the 
-            // position of a HelicalTrackHit to be the corrected one.
+            // Change the position of a HelicalTrackHit to be the corrected one.
             //
             // Loop over all stereo hits comprising a track
             for (TrackerHit rotatedStereoHit : track.getTrackerHits()) {
@@ -154,20 +139,6 @@
 
                     totalT0 += cluster.time();
                     totalHits++;
-                }
-            }
-
-            // The track time is the mean t0 of hits on a track
-            trackTime = totalT0 / totalHits;
-
-            //
-            // Calculate the t0 residuals
-            //
-            isFirstHit = true;
-            // Loop over all stereo hits comprising a track
-            for (TrackerHit stereoHit : track.getTrackerHits()) {
-                // Loop over the clusters comprising the stereo hit
-                for (HelicalTrackStrip cluster : ((HelicalTrackCross) stereoHit).getStrips()) {
 
                     if (isFirstHit) {
                         sensor = (HpsSiSensor) ((RawTrackerHit) cluster.rawhits().get(0)).getDetectorElement();
@@ -176,18 +147,13 @@
                         } else if (sensor.isBottomLayer()) {
                             trackerVolume = 1;
                         }
+                        isFirstHit = false;
                     }
-
-                    // Add the layer number associated with this residual to the list of layers
-                    sensorLayers.add(sensor.getLayerNumber());
-
-                    // Find the t0 residual and add it to the list of residuals
-                    t0Residual = trackTime - cluster.time();
-                    // Apply correction to t0 residual
-                    t0Residual /= Math.sqrt((totalHits - 1) / totalHits);
-                    t0Residuals.add(t0Residual);
                 }
             }
+
+            // The track time is the mean t0 of hits on a track
+            trackTime = totalT0 / totalHits;
 
             double l1Isolation = 99999999.0;
             double l2Isolation = 99999999.0;
@@ -204,27 +170,20 @@
                 }
             }
 
-            TrackTimeData timeData = new TrackTimeData(trackerVolume, trackTime, sensorLayers, t0Residuals);
-            timeDataCollection.add(timeData);
-            trackToTrackTimeDataRelations.add(new BaseLCRelation(timeData, track));
+            double qualityArray[] = {l1Isolation, l2Isolation};
+            TrackData trackData = new TrackData(trackerVolume, trackTime, qualityArray);
+            trackDataCollection.add(trackData);
+            trackDataRelations.add(new BaseLCRelation(trackData, track));
 
             TrackResidualsData trackResiduals = new TrackResidualsData((int) trackerVolume, stereoLayers, trackResidualsX, trackResidualsY);
             trackResidualsCollection.add(trackResiduals);
             trackToTrackResidualsRelations.add(new BaseLCRelation(trackResiduals, track));
-
-            double qualityArray[] = {l1Isolation, l2Isolation};
-            TrackQualityData qualityData = new TrackQualityData(qualityArray);
-            trackQualityCollection.add(qualityData);
-            trackQualityDataToTrackRelations.add(new BaseLCRelation(qualityData, track));
         }
 
-        event.put(trackTimeDataCollectionName, timeDataCollection, TrackTimeData.class, 0);
-        event.put(trackTimeDataRelationsColName, trackToTrackTimeDataRelations, LCRelation.class, 0);
+        event.put(TrackData.TRACK_DATA_COLLECTION, trackDataCollection, TrackTimeData.class, 0);
+        event.put(TrackData.TRACK_DATA_RELATION_COLLECTION, trackDataRelations, LCRelation.class, 0);
         event.put(trackResidualsCollectionName, trackResidualsCollection, TrackResidualsData.class, 0);
         event.put(trackResidualsRelationsColName, trackToTrackResidualsRelations, LCRelation.class, 0);
-        event.put(TrackQualityData.QUALITY_COLLECTION, trackQualityCollection, TrackResidualsData.class, 0);
-        event.put(TrackQualityData.QUALITY_RELATION_COLLECTION, trackQualityDataToTrackRelations, LCRelation.class, 0);
-
     }
 
     private static Double getNearestDistance(HelicalTrackStrip cl, List<HelicalTrackHit> toththits) {

Modified: java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/TrackTimeData.java
 =============================================================================
--- java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/TrackTimeData.java	(original)
+++ java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/TrackTimeData.java	Fri Jun 12 15:27:10 2015
@@ -8,7 +8,6 @@
 /**
  * 
  * @author Omar Moreno <[log in to unmask]>
- * @version $Id$
  *
  */
 public class TrackTimeData implements GenericObject {
@@ -17,6 +16,9 @@
 	List<Double> t0Residuals = new ArrayList<Double>(); 
 	List<Integer> layers = new ArrayList<Integer>(); 
 	
+	// Constants
+	private final static int SVT_VOLUME_INDEX = 0;
+	private final static int TRACK_TIME_INDEX = 1;
 	
 	/**
 	 * Default Ctor
@@ -40,11 +42,41 @@
 	 * @param t0Residual : 
 	 * 
 	 */
-	public void addResidual(int layer, double t0Residual){
+	private void addResidual(int layer, double t0Residual) {
 		layers.add(layer); 
 		t0Residuals.add(t0Residual);
 	}
 
+	/**
+	 * 
+	 */
+	public double getTrackTime() { 
+	    return trackTimeData.get(TRACK_TIME_INDEX); 
+	}
+	
+	/**
+	 * 
+	 * 
+	 */
+	public double getT0Residual(int layer) { 
+	    return this.getDoubleVal(layer);
+	}
+
+	/**
+	 * 
+	 */
+	public double getClusterTime(int layer) {
+	   return this.getTrackTime() - this.getT0Residual(layer); 
+	}
+	
+	/**
+	 * 
+	 * 
+	 */
+	public boolean isTopSvtVolume() { 
+	    return (trackTimeData.get(SVT_VOLUME_INDEX) == 0) ? true : false;
+	}
+	
 	/**
 	 * 
 	 */

Modified: java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/TrackUtils.java
 =============================================================================
--- java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/TrackUtils.java	(original)
+++ java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/TrackUtils.java	Fri Jun 12 15:27:10 2015
@@ -23,6 +23,7 @@
 import org.lcsim.event.MCParticle;
 import org.lcsim.event.RawTrackerHit;
 import org.lcsim.event.Track;
+import org.lcsim.event.TrackState;
 import org.lcsim.event.TrackerHit;
 import org.lcsim.fit.helicaltrack.HelicalTrackFit;
 import org.lcsim.fit.helicaltrack.HelicalTrackHit;
@@ -31,14 +32,17 @@
 import org.lcsim.fit.helicaltrack.HelixUtils;
 import org.lcsim.fit.helicaltrack.HitUtils;
 import org.lcsim.fit.helicaltrack.MultipleScatter;
+import org.lcsim.geometry.subdetector.BarrelEndcapFlag;
 import org.lcsim.recon.tracking.seedtracker.SeedCandidate;
+import org.lcsim.recon.tracking.seedtracker.SeedStrategy;
 import org.lcsim.recon.tracking.seedtracker.SeedTrack;
 import org.lcsim.util.swim.Helix;
 
 /**
- * Assorted helper functions for the track and helix objects in lcsim. Re-use as much of HelixUtils
+ * Assorted helper functions for the track and helix objects in lcsim. Re-use as
+ * much of HelixUtils
  * as possible.
- * 
+ *
  * @author Omar Moreno <[log in to unmask]>
  */
 // TODO: Switch to tracking/LCsim coordinates for the extrapolation output!
@@ -52,8 +56,10 @@
     }
 
     /**
-     * Extrapolate track to a position along the x-axis. Turn the track into a helix object in
+     * Extrapolate track to a position along the x-axis. Turn the track into a
+     * helix object in
      * order to use HelixUtils.
+     *
      * @param track
      * @param x
      * @return
@@ -64,6 +70,7 @@
 
     /**
      * Extrapolate helix to a position along the x-axis. Re-use HelixUtils.
+     *
      * @param track
      * @param x
      * @return
@@ -75,7 +82,6 @@
 
     // ==========================================================================
     // Helper functions for track parameters and commonly used derived variables
-
     public static double getPhi(Track track, Hep3Vector position) {
         double x = Math.sin(getPhi0(track)) - (1 / getR(track)) * (position.x() - getX0(track));
         double y = Math.cos(getPhi0(track)) + (1 / getR(track)) * (position.y() - getY0(track));
@@ -119,10 +125,12 @@
     }
 
     // ==========================================================================
-
-    /**
-     * Calculate the point of interception between the helix and a plane in space. Uses an iterative procedure.
-     * This function makes assumptions on the sign and convecntion of the B-field. Be careful.
+    /**
+     * Calculate the point of interception between the helix and a plane in
+     * space. Uses an iterative procedure.
+     * This function makes assumptions on the sign and convecntion of the
+     * B-field. Be careful.
+     *
      * @param helfit - helix
      * @param unit_vec_normal_to_plane - unit vector normal to the plane
      * @param point_on_plane - point on the plane
@@ -144,8 +152,10 @@
     }
 
     /**
-     * Calculate the point of interception between the helix and a plane in space. Uses an
+     * Calculate the point of interception between the helix and a plane in
+     * space. Uses an
      * iterative procedure.
+     *
      * @param helfit - helix
      * @param strip - strip cluster that will define the plane
      * @param bfield - magnetic field value
@@ -174,11 +184,11 @@
         // y_int = k*x_int + m
         // R^2 = (y_int-y_c)^2 + (x_int-x_c)^2
         // solve for x_int
-
     }
 
     /**
      * Get position of a track extrapolated to the HARP in the HPS test run 2012
+     *
      * @param track
      * @return position at HARP
      */
@@ -187,18 +197,22 @@
     }
 
     /**
-     * Get position of a track extrapolated to the ECAL face in the HPS test run 2012
+     * Get position of a track extrapolated to the ECAL face in the HPS test run
+     * 2012
+     *
      * @param track
      * @return position at ECAL
      */
     public static Hep3Vector getTrackPositionAtEcal(Track track) {
-        return extrapolateTrack(track, BeamlineConstants.ECAL_FACE_TESTRUN);
+        return extrapolateTrack(track, BeamlineConstants.ECAL_FACE);
     }
 
     /**
      * Extrapolate track to given position.
+     *
      * @param helix - to be extrapolated
-     * @param track - position along the x-axis of the helix in lcsim coordiantes
+     * @param track - position along the x-axis of the helix in lcsim
+     * coordiantes
      * @return
      */
     public static Hep3Vector extrapolateTrack(Track track, double z) {
@@ -234,6 +248,7 @@
 
     /**
      * Extrapolate helix to given position
+     *
      * @param helix - to be extrapolated
      * @param z - position along the x-axis of the helix in lcsim coordiantes
      * @return
@@ -254,7 +269,8 @@
      * @param helix input helix object
      * @param origin of the plane to intercept
      * @param normal of the plane to intercept
-     * @param eps criteria on the distance to the plane before stopping iteration
+     * @param eps criteria on the distance to the plane before stopping
+     * iteration
      * @return position in space at the intercept of the plane
      */
     public static Hep3Vector getHelixPlanePositionIter(HelicalTrackFit helix, Hep3Vector origin, Hep3Vector normal, double eps) {
@@ -314,79 +330,67 @@
         // System.out.printf("pos %s xc %f phi_at_x %f dphi_at_x %f s_at_x %f\n",
         // pos.toString(),xc,phi_at_x,dphi_at_x,s_at_x);
         Hep3Vector posXCheck = TrackUtils.extrapolateHelixToXPlane(helix, x);
-        if (VecOp.sub(pos, posXCheck).magnitude() > 0.0000001) {
+        if (VecOp.sub(pos, posXCheck).magnitude() > 0.0000001)
             throw new RuntimeException(String.format("ERROR the helix propagation equations do not agree? (%f,%f,%f) vs (%f,%f,%f) in HelixUtils", pos.x(), pos.y(), pos.z(), posXCheck.x(), posXCheck.y(), posXCheck.z()));
-        }
         return pos;
     }
 
     /**
-        *
-        */
+     *
+     */
     public static double findTriangleArea(double x0, double y0, double x1, double y1, double x2, double y2) {
         return .5 * (x1 * y2 - y1 * x2 - x0 * y2 + y0 * x2 + x0 * y1 - y0 * x1);
     }
 
     /**
-        *
-        */
+     *
+     */
     public static boolean sensorContainsTrack(Hep3Vector trackPosition, SiSensor sensor) {
         boolean debug = false;
         ITransform3D localToGlobal = sensor.getGeometry().getLocalToGlobal();
 
         Box sensorSolid = (Box) sensor.getGeometry().getLogicalVolume().getSolid();
         Polygon3D sensorFace = sensorSolid.getFacesNormalTo(new BasicHep3Vector(0, 0, 1)).get(0);
-        if (debug) {
+        if (debug)
             System.out.println("sensorContainsTrack:  Track Position: " + trackPosition.toString());
-        }
 
         List<Point3D> vertices = new ArrayList<Point3D>();
-        for (int index = 0; index < 4; index++) {
+        for (int index = 0; index < 4; index++)
             vertices.add(new Point3D());
-        }
-        for (Point3D vertex : sensorFace.getVertices()) {
+        for (Point3D vertex : sensorFace.getVertices())
             if (vertex.y() < 0 && vertex.x() > 0) {
                 localToGlobal.transform(vertex);
                 // vertices.set(0, new Point3D(vertex.y() + sensorPos.x(), vertex.x() +
                 // sensorPos.y(), vertex.z() + sensorPos.z()));
                 vertices.set(0, new Point3D(vertex.x(), vertex.y(), vertex.z()));
-                if (debug) {
-                    System.out.println("sensorContainsTrack:  Vertex 1 Position: " + vertices.get(0).toString());
-                    // System.out.println("sensorContainsTrack:  Transformed Vertex 1 Position: " +
-                    // localToGlobal.transformed(vertex).toString());
-                }
+                if (debug)
+                    System.out.println("sensorContainsTrack:  Vertex 1 Position: " + vertices.get(0).toString()); // System.out.println("sensorContainsTrack:  Transformed Vertex 1 Position: " +
+                // localToGlobal.transformed(vertex).toString());
             } else if (vertex.y() > 0 && vertex.x() > 0) {
                 localToGlobal.transform(vertex);
                 // vertices.set(1, new Point3D(vertex.y() + sensorPos.x(), vertex.x() +
                 // sensorPos.y(), vertex.z() + sensorPos.z()));
                 vertices.set(1, new Point3D(vertex.x(), vertex.y(), vertex.z()));
-                if (debug) {
-                    System.out.println("sensorContainsTrack:  Vertex 2 Position: " + vertices.get(1).toString());
-                    // System.out.println("sensorContainsTrack:  Transformed Vertex 2 Position: " +
-                    // localToGlobal.transformed(vertex).toString());
-                }
+                if (debug)
+                    System.out.println("sensorContainsTrack:  Vertex 2 Position: " + vertices.get(1).toString()); // System.out.println("sensorContainsTrack:  Transformed Vertex 2 Position: " +
+                // localToGlobal.transformed(vertex).toString());
             } else if (vertex.y() > 0 && vertex.x() < 0) {
                 localToGlobal.transform(vertex);
                 // vertices.set(2, new Point3D(vertex.y() + sensorPos.x(), vertex.x() +
                 // sensorPos.y(), vertex.z() + sensorPos.z()));
                 vertices.set(2, new Point3D(vertex.x(), vertex.y(), vertex.z()));
-                if (debug) {
-                    System.out.println("sensorContainsTrack:  Vertex 3 Position: " + vertices.get(2).toString());
-                    // System.out.println("sensorContainsTrack:  Transformed Vertex 3 Position: " +
-                    // localToGlobal.transformed(vertex).toString());
-                }
+                if (debug)
+                    System.out.println("sensorContainsTrack:  Vertex 3 Position: " + vertices.get(2).toString()); // System.out.println("sensorContainsTrack:  Transformed Vertex 3 Position: " +
+                // localToGlobal.transformed(vertex).toString());
             } else if (vertex.y() < 0 && vertex.x() < 0) {
                 localToGlobal.transform(vertex);
                 // vertices.set(3, new Point3D(vertex.y() + sensorPos.x(), vertex.x() +
                 // sensorPos.y(), vertex.z() + sensorPos.z()));
                 vertices.set(3, new Point3D(vertex.x(), vertex.y(), vertex.z()));
-                if (debug) {
-                    System.out.println("sensorContainsTrack:  Vertex 4 Position: " + vertices.get(3).toString());
-                    // System.out.println("sensorContainsTrack:  Transformed Vertex 4 Position: " +
-                    // localToGlobal.transformed(vertex).toString());
-                }
+                if (debug)
+                    System.out.println("sensorContainsTrack:  Vertex 4 Position: " + vertices.get(3).toString()); // System.out.println("sensorContainsTrack:  Transformed Vertex 4 Position: " +
+                // localToGlobal.transformed(vertex).toString());
             }
-        }
 
         double area1 = TrackUtils.findTriangleArea(vertices.get(0).x(), vertices.get(0).y(), vertices.get(1).x(), vertices.get(1).y(), trackPosition.y(), trackPosition.z());
         double area2 = TrackUtils.findTriangleArea(vertices.get(1).x(), vertices.get(1).y(), vertices.get(2).x(), vertices.get(2).y(), trackPosition.y(), trackPosition.z());
@@ -414,7 +418,6 @@
         }
 
         // Calculate the residuals that are being used in the track fit
-
         // Start with the bendplane y
         double drphi_res = hth.drphi();
         double wrphi = Math.sqrt(drphi_res * drphi_res + msdrphi * msdrphi);
@@ -465,6 +468,11 @@
         return residuals;
     }
 
+    public static Map<String, Double> calculateLocalTrackHitResiduals(Track track, HelicalTrackHit hth, HelicalTrackStrip strip, double bFieldInZ) {
+        HelicalTrackStripGbl stripGbl = new HelicalTrackStripGbl(strip, true);
+        return calculateLocalTrackHitResiduals(track, hth, stripGbl, bFieldInZ);
+    }
+    
     public static Map<String, Double> calculateLocalTrackHitResiduals(Track track, HelicalTrackHit hth, HelicalTrackStripGbl strip, double bFieldInZ) {
 
         SeedTrack st = (SeedTrack) track;
@@ -476,21 +484,34 @@
         return calculateLocalTrackHitResiduals(_trk, strip, msdrdphi, msdz, bFieldInZ);
     }
 
+    public static Map<String, Double> calculateLocalTrackHitResiduals(HelicalTrackFit _trk, HelicalTrackStrip strip, double bFieldInZ) {
+        HelicalTrackStripGbl stripGbl = new HelicalTrackStripGbl(strip, true);
+        return calculateLocalTrackHitResiduals( _trk, stripGbl, 0.0, 0.0, bFieldInZ);
+    }
+    
+    
+    
     public static Map<String, Double> calculateLocalTrackHitResiduals(HelicalTrackFit _trk, HelicalTrackStripGbl strip, double msdrdphi, double msdz, double bFieldInZ) {
 
         boolean debug = false;
         boolean includeMS = true;
 
+        if (debug) {
+            System.out.printf("calculateLocalTrackHitResiduals: for strip on sensor %s \n", 
+                    ((RawTrackerHit)strip.getStrip().rawhits().get(0)).getDetectorElement().getName());
+        }
+        
         Hep3Vector u = strip.u();
         Hep3Vector corigin = strip.origin();
 
         // Find interception with plane that the strips belongs to
-        Hep3Vector trkpos = TrackUtils.getHelixPlaneIntercept(_trk, strip, bFieldInZ);
+        Hep3Vector trkpos = TrackUtils.getHelixPlaneIntercept(_trk, strip, Math.abs(bFieldInZ));
 
         if (debug) {
-            System.out.printf("calculateLocalTrackHitResiduals: found interception point at %s \n", trkpos.toString());
-        }
-
+            System.out.printf("calculateLocalTrackHitResiduals: strip u %s origin %s \n", u.toString(),corigin.toString());
+            System.out.printf("calculateLocalTrackHitResiduals: found interception point with sensor at %s \n", trkpos.toString());
+        }
+        
         if (Double.isNaN(trkpos.x()) || Double.isNaN(trkpos.y()) || Double.isNaN(trkpos.z())) {
             System.out.printf("calculateLocalTrackHitResiduals: failed to get interception point (%s) \n", trkpos.toString());
             System.out.printf("calculateLocalTrackHitResiduals: track params\n%s\n", _trk.toString());
@@ -523,6 +544,12 @@
         double wmeas = 0;
         double wError = 10.0 / Math.sqrt(12); // 0.001;
 
+        
+        if (debug) {
+            System.out.printf("calculateLocalTrackHitResiduals: vdiffTrk %s vdiff %s umc %f umeas %f du %f\n", 
+                    vdiffTrk.toString(),vdiff.toString(),umc, umeas, umeas-umc);
+        }
+        
         Map<String, Double> res = new HashMap<String, Double>();
         res.put("ures", umeas - umc);
         res.put("ureserr", includeMS ? Math.sqrt(uError * uError + msuError * msuError) : uError);
@@ -537,17 +564,16 @@
     }
 
     public static int[] getHitsInTopBottom(Track track) {
-        int n[] = { 0, 0 };
+        int n[] = {0, 0};
         List<TrackerHit> hitsOnTrack = track.getTrackerHits();
         for (TrackerHit hit : hitsOnTrack) {
             HelicalTrackHit hth = (HelicalTrackHit) hit;
             //===> if (SvtUtils.getInstance().isTopLayer((SiSensor) ((RawTrackerHit) hth.getRawHits().get(0)).getDetectorElement())) {
             HpsSiSensor sensor = ((HpsSiSensor) ((RawTrackerHit) hth.getRawHits().get(0)).getDetectorElement());
-            if(sensor.isTopLayer()){
+            if (sensor.isTopLayer())
                 n[0] = n[0] + 1;
-            } else {
+            else
                 n[1] = n[1] + 1;
-            }
         }
         return n;
     }
@@ -562,13 +588,12 @@
 
     public static int isTopOrBottomTrack(Track track, int minhits) {
         int nhits[] = getHitsInTopBottom(track);
-        if (nhits[0] >= minhits && nhits[1] == 0) {
+        if (nhits[0] >= minhits && nhits[1] == 0)
             return 1;
-        } else if (nhits[1] >= minhits && nhits[0] == 0) {
+        else if (nhits[1] >= minhits && nhits[0] == 0)
             return 0;
-        } else {
+        else
             return -1;
-        }
     }
 
     public static boolean hasTopBotHit(Track track) {
@@ -585,10 +610,9 @@
             List<TrackerHit> hitsOnTrack = track.getTrackerHits();
             for (TrackerHit loop_hit : hitsOnTrack) {
                 HelicalTrackHit loop_hth = (HelicalTrackHit) loop_hit;
-                if (hth.equals(loop_hth)) {
+                if (hth.equals(loop_hth))
                     // System.out.printf("share hit at layer %d at %s (%s) with track w/ chi2=%f\n",hth.Layer(),hth.getCorrectedPosition().toString(),loop_hth.getCorrectedPosition().toString(),track.getChi2());
                     return true;
-                }
             }
         }
         return false;
@@ -600,20 +624,17 @@
         // System.out.printf("look for another track with chi2=%f and px=%f \n",track.getChi2(),track.getTrackStates().get(0).getMomentum()[0]);
         for (Track t : tracklist) {
             // System.out.printf("add track with chi2=%f and px=%f ?\n",t.getChi2(),t.getTrackStates().get(0).getMomentum()[0]);
-            if (t.equals(track)) {
+            if (t.equals(track))
                 // System.out.printf("NOPE\n");
                 continue;
-            }
             // System.out.printf("YEPP\n");
             tracks.add(t);
         }
         List<TrackerHit> hitsOnTrack = track.getTrackerHits();
         int n_shared = 0;
-        for (TrackerHit hit : hitsOnTrack) {
-            if (isSharedHit(hit, tracks)) {
+        for (TrackerHit hit : hitsOnTrack)
+            if (isSharedHit(hit, tracks))
                 ++n_shared;
-            }
-        }
         return n_shared;
     }
 
@@ -631,8 +652,8 @@
     }
 
     public static int passTrackSelections(Track track, List<Track> tracklist, EventQuality.Quality trk_quality) {
-        int cuts[] = { 0 };
-        if(trk_quality.compareTo(Quality.NONE) != 0) {
+        int cuts[] = {0};
+        if (trk_quality.compareTo(Quality.NONE) != 0) {
             if (track.getTrackStates().get(0).getMomentum()[0] < EventQuality.instance().getCutValue(EventQuality.Cut.PZ, trk_quality))
                 cut(cuts, EventQuality.Cut.PZ);
             if (track.getChi2() >= EventQuality.instance().getCutValue(EventQuality.Cut.CHI2, trk_quality))
@@ -656,15 +677,25 @@
     }
 
     /**
-     * Transform MCParticle into a Helix object. Note that it produces the helix parameters at
+     * Transform MCParticle into a Helix object. Note that it produces the helix
+     * parameters at
      * nominal x=0 and assumes that there is no field at x<0
-     * 
+     *
      * @param mcp MC particle to be transformed
      * @return helix object based on the MC particle
      */
     public static HelicalTrackFit getHTF(MCParticle mcp, double Bz) {
+        boolean debug = true;
+        if (debug) {
+            System.out.printf("getHTF\n");
+            System.out.printf("mcp org %s mc p %s\n", mcp.getOrigin().toString(), mcp.getMomentum().toString());
+        }
         Hep3Vector org = CoordinateTransformations.transformVectorToTracking(mcp.getOrigin());
         Hep3Vector p = CoordinateTransformations.transformVectorToTracking(mcp.getMomentum());
+
+        if (debug)
+            System.out.printf("mcp org %s mc p %s (trans)\n", org.toString(), p.toString());
+
         // Move to x=0 if needed
         double targetX = BeamlineConstants.DIPOLE_EDGELOW_TESTRUN;
         if (org.x() < targetX) {
@@ -681,7 +712,8 @@
             // old.toString(),p.toString(),org.toString());
         }
 
-        // System.out.printf("outside org %s p %s \n",p.toString(),org.toString());
+        if (debug)
+            System.out.printf("mcp org %s mc p %s (trans2)\n", org.toString(), p.toString());
 
         HelixParamCalculator helixParamCalculator = new HelixParamCalculator(p, org, -1 * ((int) mcp.getCharge()), Bz);
         double par[] = new double[5];
@@ -691,17 +723,16 @@
         par[HelicalTrackFit.curvatureIndex] = 1.0 / helixParamCalculator.getRadius();
         par[HelicalTrackFit.z0Index] = helixParamCalculator.getZ0();
         HelicalTrackFit htf = getHTF(par);
-        // System.out.printf("d0 %f z0 %f R %f phi %f lambda %s\n",
-        // htf.dca(),htf.z0(),htf.R(),htf.phi0(),htf.slope() );
+        System.out.printf("d0 %f z0 %f R %f phi %f lambda %s\n",
+                htf.dca(), htf.z0(), htf.R(), htf.phi0(), htf.slope());
         return htf;
     }
 
     public static HelicalTrackFit getHTF(Track track) {
-        if (track.getClass().isInstance(SeedTrack.class)) {
+        if (track.getClass().isInstance(SeedTrack.class))
             return ((SeedTrack) track).getSeedCandidate().getHelix();
-        } else {
+        else
             return getHTF(track.getTrackStates().get(0).getParameters());
-        }
     }
 
     public static HelicalTrackFit getHTF(double par[]) {
@@ -721,9 +752,8 @@
         if (useFringe) {
             // broken because you need ot provide the Field Map to get this...
 //            pos1 = hpstrk1.getPositionAtZMap(100.0, zVal, 5.0)[0];            
-        } else {
+        } else
             pos1 = TrackUtils.extrapolateTrack(trk1, zVal);
-        }
         // System.out.printf("%s: Position1 at edge of fringe %s\n",this.getClass().getSimpleName(),pos1.toString());
         Helix traj = (Helix) hpstrk1.getTrajectory();
         if (traj == null) {
@@ -736,4 +766,98 @@
         return slt1;
     }
 
+    public static MCParticle getMatchedTruthParticle(Track track) {
+        boolean debug = false;
+
+        Map<MCParticle, Integer> particlesOnTrack = new HashMap<MCParticle, Integer>();
+
+        if (debug)
+            System.out.printf("getMatchedTruthParticle: getmatched mc particle from %d tracker hits on the track \n", track.getTrackerHits().size());
+
+        for (TrackerHit hit : track.getTrackerHits()) {
+            List<MCParticle> mcps = ((HelicalTrackHit) hit).getMCParticles();
+            if (mcps == null)
+                System.out.printf("getMatchedTruthParticle: warning, this hit (layer %d pos=%s) has no mc particles.\n", ((HelicalTrackHit) hit).Layer(), ((HelicalTrackHit) hit).getCorrectedPosition().toString());
+            else {
+                if (debug)
+                    System.out.printf("getMatchedTruthParticle: this hit (layer %d pos=%s) has %d mc particles.\n", ((HelicalTrackHit) hit).Layer(), ((HelicalTrackHit) hit).getCorrectedPosition().toString(), mcps.size());
+                for (MCParticle mcp : mcps) {
+                    if (!particlesOnTrack.containsKey(mcp))
+                        particlesOnTrack.put(mcp, 0);
+                    int c = particlesOnTrack.get(mcp);
+                    particlesOnTrack.put(mcp, c + 1);
+                }
+            }
+        }
+        if (debug) {
+            System.out.printf("Track p=[ %f, %f, %f] \n", track.getTrackStates().get(0).getMomentum()[0], track.getTrackStates().get(0).getMomentum()[1], track.getTrackStates().get(0).getMomentum()[1]);
+            System.out.printf("Found %d particles\n", particlesOnTrack.size());
+            for (Map.Entry<MCParticle, Integer> entry : particlesOnTrack.entrySet())
+                System.out.printf("%d hits assigned to %d p=%s \n", entry.getValue(), entry.getKey().getPDGID(), entry.getKey().getMomentum().toString());
+        }
+        Map.Entry<MCParticle, Integer> maxEntry = null;
+        for (Map.Entry<MCParticle, Integer> entry : particlesOnTrack.entrySet())
+            if (maxEntry == null || entry.getValue().compareTo(maxEntry.getValue()) > 0)
+                maxEntry = entry; //if ( maxEntry != null ) {
+        //    if(entry.getValue().compareTo(maxEntry.getValue()) < 0) continue;
+        //}
+        //maxEntry = entry;
+        if (debug)
+            if (maxEntry != null)
+                System.out.printf("Matched particle with pdgId=%d and mom %s to track with charge %d and momentum [%f %f %f]\n",
+                        maxEntry.getKey().getPDGID(), maxEntry.getKey().getMomentum().toString(),
+                        track.getCharge(), track.getTrackStates().get(0).getMomentum()[0], track.getTrackStates().get(0).getMomentum()[1], track.getTrackStates().get(0).getMomentum()[2]);
+            else
+                System.out.printf("No truth particle found on this track\n");
+        return maxEntry == null ? null : maxEntry.getKey();
+    }
+
+    /*       
+     try to make a seed track from a base track
+     ...some things are irretrivable (tracking strategy)..
+     and some things I just don't care much about to dig out (det name)
+     */
+    public static SeedTrack makeSeedTrackFromBaseTrack(Track track) {
+
+        TrackState trkState = track.getTrackStates().get(0);
+        //  first make the HelicalTrackFit Object
+        double[] covArray = trkState.getCovMatrix();
+        SymmetricMatrix cov = new SymmetricMatrix(5, covArray, true);
+        double[] chisq = {track.getChi2(), 0};
+        int[] ndf = {track.getNDF(), 0};
+        Map<HelicalTrackHit, Double> smap = new HashMap<>();  // just leave these empty
+        Map<HelicalTrackHit, MultipleScatter> msmap = new HashMap<>();// just leave these empty
+        double[] pars = {trkState.getD0(), trkState.getPhi(), trkState.getOmega(), trkState.getZ0(), trkState.getTanLambda()};
+        HelicalTrackFit htf = new HelicalTrackFit(pars, cov, chisq, ndf, smap, msmap);
+        //  now get the hits and make them helicaltrackhits
+        List<TrackerHit> rth = track.getTrackerHits();
+        List<HelicalTrackHit> hth = new ArrayList<>();
+        for (TrackerHit hit : rth)
+            hth.add(makeHelicalTrackHitFromTrackerHit(hit));
+//        SeedCandidate(List<HelicalTrackHit> , SeedStrategy strategy, HelicalTrackFit helix, double bfield) ;
+        SeedCandidate scand = new SeedCandidate(hth, null, htf, 0.24);
+        SeedTrack st = new SeedTrack();
+        st.setSeedCandidate(scand);
+        return st;
+    }
+
+    /*
+        cast TrackerHit as HTH...this is pretty dumb; just a rearrangment of information
+        in TrackerHit.  The important information that's in HTH but not 
+        in Tracker hit is the HelicalTrackCrosses (and from there the individual strip clusters)
+        is lost; some work to get them back.  
+     */
+    public static HelicalTrackHit makeHelicalTrackHitFromTrackerHit(TrackerHit hit) {
+        Hep3Vector pos = new BasicHep3Vector(hit.getPosition());
+        SymmetricMatrix hitcov = new SymmetricMatrix(3, hit.getCovMatrix(), true);
+        double dedx = hit.getdEdx();
+        double time = hit.getTime();
+        int type = hit.getType();
+        List rhits = hit.getRawHits();
+        String detname = "Foobar";
+        int layer = 666;
+        BarrelEndcapFlag beflag = BarrelEndcapFlag.BARREL;
+        return new HelicalTrackHit(pos, hitcov, dedx, time, type, rhits, detname, layer, beflag);
+    }
+
 }

Modified: java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/TrackerReconDriver.java
 =============================================================================
--- java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/TrackerReconDriver.java	(original)
+++ java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/TrackerReconDriver.java	Fri Jun 12 15:27:10 2015
@@ -2,11 +2,19 @@
 
 import hep.physics.vec.BasicHep3Vector;
 import hep.physics.vec.Hep3Vector;
-
+import hep.physics.vec.VecOp;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
-
+import java.util.Map;
 import org.lcsim.event.EventHeader;
+import org.lcsim.event.LCRelation;
+import org.lcsim.event.RelationalTable;
 import org.lcsim.event.Track;
+import org.lcsim.event.TrackerHit;
+import org.lcsim.event.base.BaseRelationalTable;
 import org.lcsim.event.base.BaseTrack;
 import org.lcsim.fit.helicaltrack.HelicalTrackHit;
 import org.lcsim.geometry.Detector;
@@ -49,7 +57,9 @@
     // enable the use of sectoring using sector binning in SeedTracker
     private boolean _applySectorBinning = true;
     private double rmsTimeCut = -1;
-
+    private boolean rejectUncorrectedHits = true;
+    private boolean rejectSharedHits = false;
+    
     public TrackerReconDriver() {
     }
 
@@ -109,6 +119,14 @@
      */
     public void setRmsTimeCut(double rmsTimeCut) {
         this.rmsTimeCut = rmsTimeCut;
+    }
+
+    public void setRejectUncorrectedHits(boolean rejectUncorrectedHits) {
+        this.rejectUncorrectedHits = rejectUncorrectedHits;
+    }
+
+    public void setRejectSharedHits(boolean rejectSharedHits) {
+        this.rejectSharedHits = rejectSharedHits;
     }
 
     /**
@@ -192,6 +210,79 @@
 
         // Set the type of track to indicate B-field in Y e.g. for swimming in Wired.
         List<Track> tracks = event.get(Track.class, trackCollectionName);
+
+        if (rejectUncorrectedHits) {
+            Iterator<Track> iter = tracks.iterator();
+            trackLoop:
+            while (iter.hasNext()) {
+                Track track = iter.next();
+                for (TrackerHit hit : track.getTrackerHits()) {
+                    HelicalTrackHit hth = (HelicalTrackHit) hit;
+                    double correction = VecOp.sub(hth.getCorrectedPosition(), new BasicHep3Vector(hth.getPosition())).magnitude();
+                    double chisq = hth.chisq();
+                    if (correction < 1e-6) {
+                        this.getLogger().warning(String.format("Discarding track with bad HelicalTrackHit (correction distance %f, chisq penalty %f)", correction, chisq));
+                        iter.remove();
+                        continue trackLoop;
+                    }
+                }
+            }
+        }
+
+        if (rejectSharedHits) {
+
+            RelationalTable hittostrip = new BaseRelationalTable(RelationalTable.Mode.MANY_TO_MANY, RelationalTable.Weighting.UNWEIGHTED);
+            List<LCRelation> hitrelations = event.get(LCRelation.class, "HelicalTrackHitRelations");
+            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, "RotatedHelicalTrackHitRelations");
+            for (LCRelation relation : rotaterelations) {
+                if (relation != null && relation.getFrom() != null && relation.getTo() != null) {
+                    hittorotated.add(relation.getFrom(), relation.getTo());
+                }
+            }
+
+            Map<TrackerHit, List<Track>> stripsToTracks = new HashMap<TrackerHit, List<Track>>();
+            for (Track track : tracks) {
+                for (TrackerHit hit : track.getTrackerHits()) {
+                    Collection<TrackerHit> htsList = hittostrip.allFrom(hittorotated.from(hit));
+                    for (TrackerHit strip : htsList) {
+                        List<Track> sharedTracks = stripsToTracks.get(strip);
+                        if (sharedTracks == null) {
+                            sharedTracks = new ArrayList<Track>();
+                            stripsToTracks.put(strip, sharedTracks);
+                        }
+                        sharedTracks.add(track);
+                    }
+                }
+            }
+            Iterator<Track> iter = tracks.iterator();
+            trackLoop:
+            while (iter.hasNext()) {
+                Track track = iter.next();
+                for (TrackerHit hit : track.getTrackerHits()) {
+                    Collection<TrackerHit> htsList = hittostrip.allFrom(hittorotated.from(hit));
+                    for (TrackerHit strip : htsList) {
+                        List<Track> sharedTracks = stripsToTracks.get(strip);
+                        if (sharedTracks.size() > 1) {
+                            for (Track otherTrack : sharedTracks) {
+                                if (otherTrack.getChi2() < track.getChi2()) {
+                                    this.getLogger().warning(String.format("removing track with shared hits: chisq %f, d0 %f (other track has chisq %f)", track.getChi2(), track.getTrackStates().get(0).getD0(), otherTrack.getChi2()));
+                                    iter.remove();
+                                    continue trackLoop;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
         setTrackType(tracks);
 
         // Increment number of events.

Modified: java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLFileIO.java
 =============================================================================
--- java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLFileIO.java	(original)
+++ java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLFileIO.java	Fri Jun 12 15:27:10 2015
@@ -170,9 +170,13 @@
     void printStripTrackPos(Hep3Vector pos) {
         addLine(String.format("Strip track pos %.10f %.10f %.10f",pos.x(),pos.y(),pos.z()));
     }
-
-    void printStrip(int id, int layer) {
-        addLine(String.format("New Strip id layer %d %d", id,layer));
+    
+    void printStripTrackPosMeasFrame(Hep3Vector pos) {
+        addLine(String.format("Strip track pos meas frame %.10f %.10f %.10f",pos.x(),pos.y(),pos.z()));
+    }
+
+    void printStrip(int id, int layer, String deName) {
+        addLine(String.format("New Strip id layer %d %d %s", id,layer,deName));
     }
 
     void printStripPathLen(double s) {

Modified: java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutput.java
 =============================================================================
--- java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutput.java	(original)
+++ java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutput.java	Fri Jun 12 15:27:10 2015
@@ -59,7 +59,7 @@
 	private TrackerHitUtils _trackerHitUtils = new TrackerHitUtils();
     private MaterialSupervisor _materialmanager;
     private MultipleScattering _scattering;
-    private double _beamEnergy = 2.2; //GeV
+    private double _beamEnergy = 1.1; //GeV
 	private boolean AprimeEvent = false; // do extra checks
 	private boolean hasXPlanes = false;
     
@@ -270,7 +270,7 @@
                 if(_debug>0) System.out.printf("%s: layer %d millepede %d (DE=\"%s\", origin %s) \n",this.getClass().getSimpleName(),strip.layer(), millepedeId, sensor.getName(), strip.origin().toString());
                 
                 if(textFile != null) {
-                	textFile.printStrip(istrip,millepedeId);
+                	textFile.printStrip(istrip,millepedeId,de.getName());
                 }
                 
                 //GBLDATA
@@ -404,10 +404,15 @@
                 if(textFile != null) {
                 	textFile.printStripMeas(m_meas.x());
                 }
+
+                //if(textFile != null) {
+                //    textFile.printStripTrackPosMeasFrame(trkpos_meas);
+                //}
+
                 
                 //GBLDATA
                 stripData.setMeas(strip.umeas());
-                stripData.setTrackPos(trkpos_meas);
+                //stripData.setTrackPos(trkpos_meas);
                 
                 if(_debug>1) { 
                 System.out.printf("%s: rotation matrix to meas frame\n%s\n", getClass().getSimpleName(), VecOp.toString(trkToStripRot));

Modified: java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutputDriver.java
 =============================================================================
--- java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutputDriver.java	(original)
+++ java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutputDriver.java	Fri Jun 12 15:27:10 2015
@@ -36,7 +36,7 @@
 
     private AIDA aida = AIDA.defaultInstance();
     int nevt = 0;
-    GBLOutput gbl;
+    GBLOutput gbl = null;
     TruthResiduals truthRes = null;
     private String gblFileName = "";
     private String outputPlotFileName="";
@@ -166,7 +166,9 @@
 
     @Override
     public void endOfData() {
-        gbl.close();
+        if(gbl!=null)
+            gbl.close();
+        
         if (!"".equals(outputPlotFileName)) {
             try {
                 aida.saveAs(outputPlotFileName);

Modified: java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblRefitter.java
 =============================================================================
--- java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblRefitter.java	(original)
+++ java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblRefitter.java	Fri Jun 12 15:27:10 2015
@@ -11,6 +11,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.logging.Formatter;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -40,7 +41,8 @@
  */
 public class HpsGblRefitter extends Driver
 {
-    private static Logger logger = LogUtil.create(HpsGblRefitter.class, new BasicLogFormatter());
+    static Formatter f =  new BasicLogFormatter();
+    private static Logger logger = LogUtil.create(HpsGblRefitter.class.getSimpleName(), f,Level.WARNING);
     //private static final Logger logger = Logger.getLogger(HpsGblRefitter.class.getName());
     private boolean _debug = false;
     private final String trackCollectionName = "MatchedTracks";
@@ -71,10 +73,15 @@
     public HpsGblRefitter()
     {
         _makeTracks = new MakeGblTracks();
-        logger.setLevel(Level.INFO);
-        
-    }
-
+        logger.setLevel(Level.WARNING);
+        System.out.println("level " + logger.getLevel().toString());
+    }
+    
+    //@Override
+    //public void setLogLevel(String logLevel) {
+    //    logger.setLevel(Level.parse(logLevel));
+    //}
+    
     @Override
     protected void startOfData()
     {
@@ -423,9 +430,9 @@
              for(int i=0; i < milleParameters.size(); ++i) {
                  logders += labGlobal.get(i) + "\t" + addDer.get(0, i) + "\n";
              }
-             logger.fine("\n"+ logders);
+             logger.info("\n"+ logders);
             
-             logger.fine("uRes " + strip.getId() + " uRes " + uRes + " pred (" + strip.getTrackPos().x() + "," + strip.getTrackPos().y() + "," + strip.getTrackPos().z() + ") s(3D) " + strip.getPath3D());
+             logger.info("uRes " + strip.getId() + " uRes " + uRes + " pred (" + strip.getTrackPos().x() + "," + strip.getTrackPos().y() + "," + strip.getTrackPos().z() + ") s(3D) " + strip.getPath3D());
             
             //go to next point
             s += step;

Modified: java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/gbl/MakeGblTracks.java
 =============================================================================
--- java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/gbl/MakeGblTracks.java	(original)
+++ java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/gbl/MakeGblTracks.java	Fri Jun 12 15:27:10 2015
@@ -13,6 +13,7 @@
 
 import org.hps.recon.tracking.gbl.matrix.SymMatrix;
 import org.hps.recon.tracking.gbl.matrix.Vector;
+import org.hps.util.BasicLogFormatter;
 import org.lcsim.constants.Constants;
 import org.lcsim.event.EventHeader;
 import org.lcsim.event.Track;
@@ -22,6 +23,7 @@
 import org.lcsim.lcio.LCIOConstants;
 import org.lcsim.recon.tracking.seedtracker.SeedCandidate;
 import org.lcsim.recon.tracking.seedtracker.SeedTrack;
+import org.lcsim.util.log.LogUtil;
 
 
 /**
@@ -34,7 +36,7 @@
 
 
     private String _TrkCollectionName = "GblTracks";
-    private static final Logger logger = Logger.getLogger(MakeGblTracks.class.getName());
+    private static Logger logger = LogUtil.create(MakeGblTracks.class, new BasicLogFormatter());
     
     /**
      * Creates a new instance of MakeTracks.
@@ -44,7 +46,7 @@
          //logger.setUseParentHandlers(false);
         //Handler handler = new StreamHandler(System.out, new SimpleFormatter());
         //logger.addHandler(handler);
-        logger.setLevel(Level.WARNING);
+        logger.setLevel(Level.INFO);
 //        try {
 //            logger.addHandler(new FileHandler(MakeGblTracks.class.getSimpleName()+".log"));
 //        } catch (SecurityException | IOException e) {
@@ -152,7 +154,8 @@
         double phi0 = helix.phi0();
         double slope = helix.slope();
         double p = helix.p(bfield);
-        double qOverP = traj.get_seed().getCharge()/p;
+        double q = traj.get_seed().getCharge();
+        double qOverP = q/p;
         
         // get corrections from GBL fit
         Vector locPar = new Vector(5);
@@ -164,6 +167,8 @@
         double xTPrimeCorr = locPar.get(FittedGblTrajectory.GBLPARIDX.XTPRIME.getValue());
         double yTPrimeCorr = locPar.get(FittedGblTrajectory.GBLPARIDX.YTPRIME.getValue());
         
+        logger.info((slope>0?"top: ":"bot ") + "qOverPCorr " + qOverPCorr + " xTCorr " + xTCorr + " yTCorr " + yTCorr + " xtPrimeCorr " + xTPrimeCorr + " yTPrimeCorr " + yTPrimeCorr);
+        
         // calculate new d0 and z0
         Hep3Matrix perToClPrj = traj.get_track_data().getPrjPerToCl();
         Hep3Matrix clToPerPrj = VecOp.inverse(perToClPrj);
@@ -177,19 +182,23 @@
         double z0_corr = corrPer.z();
         double z0_gbl = z0 + z0_corr;
         
+        //calculate new phi0
+        double phi0_gbl = phi0 + xTPrimeCorr;
+        
+        //calculate new slope
+        double lambda_gbl = Math.atan(slope) + yTPrimeCorr;
+        double slope_gbl = Math.tan( lambda_gbl );
+
         // calculate new curvature
-        //      return self.track.qOverP(bfac) + self.curvCorr()
+        
         double qOverP_gbl = qOverP + qOverPCorr;
-        double pt_gbl = 1.0/qOverP_gbl * helix.sth();
+        double pt_gbl = Math.abs(1.0/qOverP_gbl) * Math.sin((Math.PI/2.0-lambda_gbl));
         double C_gbl = Constants.fieldConversion * bfield / pt_gbl;
         //make sure sign is not changed
         C_gbl = Math.signum(helix.curvature())*Math.abs(C_gbl); 
         
-        //calculate new phi0
-        double phi0_gbl = phi0 + xTPrimeCorr;
-        
-        //calculate new slope
-        double slope_gbl = Math.tan( Math.atan(helix.slope()) + yTPrimeCorr);
+        logger.info("qOverP="+qOverP+" qOverPCorr="+qOverPCorr+" qOverP_gbl="+qOverP_gbl+" ==> pGbl="+1.0/qOverP_gbl);
+        
         
         double parameters_gbl[] = new double[5];
         parameters_gbl[HelicalTrackFit.dcaIndex] = d0_gbl;

Modified: java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/svt/alignment/BuildMillepedeCompact.java
 =============================================================================
--- java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/svt/alignment/BuildMillepedeCompact.java	(original)
+++ java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/svt/alignment/BuildMillepedeCompact.java	Fri Jun 12 15:27:10 2015
@@ -176,7 +176,11 @@
 		                            if(replaceConstant) {
 		                                newValue = correction;
 		                            } else {
-		                                newValue = oldValue + correction;
+		                                if (p.getType() == MilleParameter.Type.ROTATION.getType()) {
+		                                    newValue = oldValue - correction;
+		                                } else {
+		                                    newValue = oldValue + correction;
+		                                }
 		                            }
 		                            System.out.println("Update " + p.getId() + ": " + oldValue + " (corr. " + correction + ") ->  "  + newValue );
 		                            node.setAttribute("value", String.format("%.6f",newValue));

Modified: java/branches/HPSJAVA-488/tracking/src/main/resources/org/hps/recon/tracking/strategies/HPS-Full-L1-3.xml
 =============================================================================
--- java/branches/HPSJAVA-488/tracking/src/main/resources/org/hps/recon/tracking/strategies/HPS-Full-L1-3.xml	(original)
+++ java/branches/HPSJAVA-488/tracking/src/main/resources/org/hps/recon/tracking/strategies/HPS-Full-L1-3.xml	Fri Jun 12 15:27:10 2015
@@ -9,8 +9,8 @@
         <MinHits>3</MinHits>
         <MinConfirm>0</MinConfirm>
         
-        <MaxDCA>4.0</MaxDCA>
-        <MaxZ0>4.0</MaxZ0>
+        <MaxDCA>20.0</MaxDCA>
+        <MaxZ0>20.0</MaxZ0>
 
         <MaxChisq>25.0</MaxChisq>
         <BadHitChisq>10.0</BadHitChisq>

Modified: java/branches/HPSJAVA-488/tracking/src/main/resources/org/hps/recon/tracking/strategies/HPS-Full-L4-6.xml
 =============================================================================
--- java/branches/HPSJAVA-488/tracking/src/main/resources/org/hps/recon/tracking/strategies/HPS-Full-L4-6.xml	(original)
+++ java/branches/HPSJAVA-488/tracking/src/main/resources/org/hps/recon/tracking/strategies/HPS-Full-L4-6.xml	Fri Jun 12 15:27:10 2015
@@ -9,8 +9,8 @@
         <MinHits>3</MinHits>
         <MinConfirm>0</MinConfirm>
         
-        <MaxDCA>10.0</MaxDCA>
-        <MaxZ0>10.0</MaxZ0>
+        <MaxDCA>20.0</MaxDCA>
+        <MaxZ0>20.0</MaxZ0>
 
         <MaxChisq>25.0</MaxChisq>
         <BadHitChisq>10.0</BadHitChisq>

Modified: java/branches/HPSJAVA-488/users/pom.xml
 =============================================================================
--- java/branches/HPSJAVA-488/users/pom.xml	(original)
+++ java/branches/HPSJAVA-488/users/pom.xml	Fri Jun 12 15:27:10 2015
@@ -7,7 +7,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>../parent/pom.xml</relativePath>
-        <version>3.3.1-SNAPSHOT</version>
+        <version>3.3.3-SNAPSHOT</version>
     </parent>
     <scm>
         <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/users/</url>

Modified: java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/celentan/DummyDriverRaw.java
 =============================================================================
--- java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/celentan/DummyDriverRaw.java	(original)
+++ java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/celentan/DummyDriverRaw.java	Fri Jun 12 15:27:10 2015
@@ -5,58 +5,47 @@
 import org.lcsim.event.EventHeader;
 import org.lcsim.geometry.Detector;
 import org.lcsim.util.Driver;
-import org.lcsim.util.aida.AIDA;
-import org.hps.recon.ecal.EcalUtils;
 import org.hps.recon.ecal.triggerbank.AbstractIntData;
 import org.hps.recon.ecal.triggerbank.SSPData;
-import org.lcsim.event.CalorimeterHit;
-import org.lcsim.event.EventHeader;
 import org.lcsim.event.GenericObject;
 
-public class DummyDriverRaw extends Driver{
-
-	  private Detector detector;
-
-
-
-@Override
-public void detectorChanged(Detector detector) {
-	System.out.println("Ecal event display detector changed");
-    this.detector = detector;
+public class DummyDriverRaw extends Driver {
+    @Override
+    public void detectorChanged(Detector detector) {
+        System.out.println("Ecal event display detector changed");
+    }
     
+    @Override
+    public void process(EventHeader event) {
+        double orTrigTime,topTrigTime,botTrigTime;
+        System.out.println("1");
+        if(event.hasCollection(GenericObject.class, "TriggerBank")) {
+            System.out.println("2");
+            List<GenericObject> triggerList = event.get(GenericObject.class, "TriggerBank");
+            if (!triggerList.isEmpty()) {
+                System.out.println("3");
+                GenericObject triggerData = triggerList.get(0);
+                if(triggerData instanceof SSPData){
+                    // TODO: TOP, BOTTOM, OR, and AND triggers were only
+                    // used by the test run data and are not supported by
+                    // SSP data any longer.
+                    System.out.println("4");
+                    orTrigTime  = 0; //((SSPData)triggerData).getOrTrig();
+                    topTrigTime = 0; //((SSPData)triggerData).getTopTrig();
+                    botTrigTime = 0; //((SSPData)triggerData).getBotTrig();      
+                    System.out.println(orTrigTime + " " + topTrigTime + " " + botTrigTime);
+                }
+                else if (AbstractIntData.getTag(triggerData)==SSPData.BANK_TAG){
+                    // TODO: TOP, BOTTOM, OR, and AND triggers were only
+                    // used by the test run data and are not supported by
+                    // SSP data any longer.
+                    //SSPData mData=new SSPData(triggerData);
+                    orTrigTime  = 0; //(mData).getOrTrig();
+                    topTrigTime = 0; //(mData).getTopTrig();
+                    botTrigTime = 0; //(mData).getBotTrig();      
+                    System.out.println(orTrigTime + " " + topTrigTime + " " + botTrigTime);
+                }
+            }//end if triggerList isEmpty
+        }
+    }
 }
-
-
-
-
-@Override
-public void process(EventHeader event){
-	
-	double orTrigTime,topTrigTime,botTrigTime;
-	System.out.println("1");
-    if (event.hasCollection(GenericObject.class, "TriggerBank")) {
-    	System.out.println("2");
-    	List<GenericObject> triggerList = event.get(GenericObject.class, "TriggerBank");
-        if (!triggerList.isEmpty()) {
-        	System.out.println("3");
-            GenericObject triggerData = triggerList.get(0);
-            if (triggerData instanceof SSPData){ 
-            	System.out.println("4");
-            	orTrigTime=((SSPData)triggerData).getOrTrig();
-            	topTrigTime=((SSPData)triggerData).getTopTrig();
-            	botTrigTime =((SSPData)triggerData).getBotTrig();      
-            	System.out.println(orTrigTime+" "+topTrigTime+" "+botTrigTime);
-            }         
-            else if (AbstractIntData.getTag(triggerData)==SSPData.BANK_TAG){
-            	SSPData mData=new SSPData(triggerData);
-            	orTrigTime=(mData).getOrTrig();
-            	topTrigTime=(mData).getTopTrig();
-            	botTrigTime =(mData).getBotTrig();      
-            	System.out.println(orTrigTime+" "+topTrigTime+" "+botTrigTime);
-            }
-        }//end if triggerList isEmpty
-	
-}
-
-}
-}

Modified: java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/luca/CalibClusterAnalyzerEngRun.java
 =============================================================================
--- java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/luca/CalibClusterAnalyzerEngRun.java	(original)
+++ java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/luca/CalibClusterAnalyzerEngRun.java	Fri Jun 12 15:27:10 2015
@@ -205,266 +205,5 @@
    return dbid;
 }  
     
- /*
- public int getCrystal (Cluster cluster){
- int x,y,id=0;
- x= cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("ix");
- y= cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("iy");
  
- if(y==5){
- if(x<0)
- {id=x+24;}
- else id= x+23;
- }
- 
- else if(y==4)
- {if(x<0){
-  id=x+70;}
- else id=x+69;}
- 
- else if(y==3)
- {if(x<0){
-  id=x+116;}
- else id=x+115;}
- 
- else if(y==2)
- {if(x<0){
-  id=x+162;}
- else id=x+161;}
- 
- else if(y==1)
- {x=-x;
-     if(x>0){
-  id=-x+208;}
- else if(x==-1){id=208;}
- else if(x<-1) id=-x+198;}
- 
-  else if(y==-1)
- {x=-x;
-     if(x>0){
-  id=-x+245;}
- else if(x==-1 )id=245;
- else if(x<-1){id=-x+235;}}
- 
- 
- else if(y==-2)
- {if(x<0){
-  id=x+282;}
- else id=x+281;}
- 
-  else if(y==-3)
- {if(x<0){
-  id=x+328;}
- else id=x+327;}
- 
- else if(y==-4)
- {if(x<0){
-  id=x+374;}
- else id=x+373;}
- 
- else if(y==-5)
- {if(x<0){
-  id=x+420;}
- else id=x+419;}
- 
- return id;
- 
- }   
-    public int getCrystal (CalorimeterHit hit){
- int x,y,id=0;
- x= hit.getIdentifierFieldValue("ix");
- y= hit.getIdentifierFieldValue("iy");
- 
- if(y==5){
- if(x<0)
- {id=x+24;}
- else id= x+23;
- }
- 
- else if(y==4)
- {if(x<0){
-  id=x+70;}
- else id=x+69;}
- 
- else if(y==3)
- {if(x<0){
-  id=x+116;}
- else id=x+115;}
- 
- else if(y==2)
- {if(x<0){
-  id=x+162;}
- else id=x+161;}
- 
- else if(y==1)
- {x=-x;
-     if(x>0){
-  id=-x+208;}
- else if(x==-1){id=208;}
- else if(x<-1) id=-x+198;}
- 
-  else if(y==-1)
- {x=-x;
-     if(x>0){
-  id=-x+245;}
- else if(x==-1 )id=245;
- else if(x<-1){id=-x+235;}}
- 
- 
- else if(y==-2)
- {if(x<0){
-  id=x+282;}
- else id=x+281;}
- 
-  else if(y==-3)
- {if(x<0){
-  id=x+328;}
- else id=x+327;}
- 
- else if(y==-4)
- {if(x<0){
-  id=x+374;}
- else id=x+373;}
- 
- else if(y==-5)
- {if(x<0){
-  id=x+420;}
- else id=x+419;}
- 
- return id;
- 
- } */
-    
-    /*
-    
-  public int getCrystalFront (Cluster cluster){
- int x,y,id=0;
- x= (-1)*cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("ix");
- y= cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("iy");
- 
- if(y==5){
- if(x<0)
- {id=x+24;}
- else id= x+23;
- }
- 
- else if(y==4)
- {if(x<0){
-  id=x+70;}
- else id=x+69;}
- 
- else if(y==3)
- {if(x<0){
-  id=x+116;}
- else id=x+115;}
- 
- else if(y==2)
- {if(x<0){
-  id=x+162;}
- else id=x+161;}
- 
- else if(y==1)
- {x=-x;
-     if(x>0){
-  id=-x+208;}
- else if(x==-1){id=208;}
- else if(x<-1) id=-x+198;}
- 
-  else if(y==-1)
- {x=-x;
-     if(x>0){
-  id=-x+245;}
- else if(x==-1 )id=245;
- else if(x<-1){id=-x+235;}}
- 
- 
- else if(y==-2)
- {if(x<0){
-  id=x+282;}
- else id=x+281;}
- 
-  else if(y==-3)
- {if(x<0){
-  id=x+328;}
- else id=x+327;}
- 
- else if(y==-4)
- {if(x<0){
-  id=x+374;}
- else id=x+373;}
- 
- else if(y==-5)
- {if(x<0){
-  id=x+420;}
- else id=x+419;}
- 
- return id;
- 
- }   */
-    
-    /*
-    public int getCrystalFront (CalorimeterHit hit){
- int x,y,id=0;
- x= (-1)*hit.getIdentifierFieldValue("ix");
- y= hit.getIdentifierFieldValue("iy");
- 
- if(y==5){
- if(x<0)
- {id=x+24;}
- else id= x+23;
- }
- 
- else if(y==4)
- {if(x<0){
-  id=x+70;}
- else id=x+69;}
- 
- else if(y==3)
- {if(x<0){
-  id=x+116;}
- else id=x+115;}
- 
- else if(y==2)
- {if(x<0){
-  id=x+162;}
- else id=x+161;}
- 
- else if(y==1)
- {x=-x;
-     if(x>0){
-  id=-x+208;}
- else if(x==-1){id=208;}
- else if(x<-1) id=-x+198;}
- 
-  else if(y==-1)
- {x=-x;
-     if(x>0){
-  id=-x+245;}
- else if(x==-1 )id=245;
- else if(x<-1){id=-x+235;}}
- 
- 
- else if(y==-2)
- {if(x<0){
-  id=x+282;}
- else id=x+281;}
- 
-  else if(y==-3)
- {if(x<0){
-  id=x+328;}
- else id=x+327;}
- 
- else if(y==-4)
- {if(x<0){
-  id=x+374;}
- else id=x+373;}
- 
- else if(y==-5)
- {if(x<0){
-  id=x+420;}
- else id=x+419;}
- 
- return id;
- 
- }   */
-}
+}

Modified: java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/luca/rate.java
 =============================================================================
--- java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/luca/rate.java	(original)
+++ java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/luca/rate.java	Fri Jun 12 15:27:10 2015
@@ -24,10 +24,13 @@
 import org.hps.conditions.ecal.EcalChannel.EcalChannelCollection;
 
 import org.hps.conditions.ecal.EcalConditions;
+import org.hps.recon.ecal.triggerbank.AbstractIntData;
+import org.hps.recon.ecal.triggerbank.TIData;
 
 import org.lcsim.event.CalorimeterHit;
 import org.lcsim.event.Cluster;
 import org.lcsim.event.EventHeader;
+import org.lcsim.event.GenericObject;
 import org.lcsim.geometry.Detector;
 import org.lcsim.geometry.Subdetector;
 import org.lcsim.geometry.subdetector.HPSEcal3;
@@ -69,11 +72,18 @@
     double nevents=0;
     
 double[] time=new double[6];
-double E0=1.92;
+double E0=1.1;
+/* e=1.92
 double[] Ymax={45.91,52.95,60.00,67.01,74.04,81.18};
 double[] Ymin={38.83,45.81,52.95,60.00,67.01,74.04};
 double[] Xmax={-23.59,-23.1,-22.61,-22.11,-21.62,-21.13};
 double[] Xmin={-30.1,-30.59,-31.08,-31.58,-32.07,-32.57};
+*/
+double[] Ymax={45.91,53.95,59.98,67.04,74.05,81.18};
+double[] Ymin={38.84, 45.91,53.95,59.98,67.04,74.05};
+double[] Xmax={-13.25,-12.75,-12.26,-11.77,-11.27,-10.78};
+double[] Xmin={-19.75,-20.24,-20.74,-21.23,-21.72,-22.22};
+
 
 int[] countertop=new int[6];
 int[] counterbot=new int[6];
@@ -99,7 +109,7 @@
 */
 
 //e cuts 3430
-
+/*
 double[] ecuttopmin={1.20,1.35,1.50,1.50,1.60,1.60};
 double[] ecuttopmax={1.70,1.80,1.90,2.00,2.00,2.00};
 
@@ -112,7 +122,7 @@
 
 double[] cryecutbotmax={2,2,1.9,1.9,2};
 double[] cryecutbotmin= {1.38,1.38,1.5,1.65,1.55};
-
+*/
 //e cuts 3434
 /*
 double[] ecuttopmin={1.25,1.30,1.40,1.50,1.60,1.60};
@@ -193,6 +203,68 @@
 double[] cryecutbotmin= {1.38,1.38,1.5,1.65,1.55};
 */
 
+//e cuts 4904
+/*
+double[] ecuttopmin={0.59,0.6,0.6,0.68,0.7,0.7};
+double[] ecuttopmax={1.70,1.80,1.90,2.00,2.00,2.00};
+
+double[] ecutbotmin= {0.59,0.6,0.6,0.68,0.7,0.7};
+double[] ecutbotmax={0.85,0.89,0.9,0.93,0.92,0.95};
+
+
+double[] cryecuttopmin={1.38,1.38,1.52,1.6,1.6};
+double[] cryecuttopmax={1.8,1.8,1.8,2,2};
+
+double[] cryecutbotmax={2,2,1.9,1.9,2};
+double[] cryecutbotmin= {1.38,1.38,1.5,1.65,1.55};
+*/
+
+//e cuts 5072
+
+double[] ecuttopmin={0.45,0.6,0.6,0.7,0.7,0.75};
+double[] ecuttopmax={0.8,0.9,0.9,0.9,1,1};
+
+double[] ecutbotmin= {0.45,0.5,0.6,0.7,0.67,0.65};
+double[] ecutbotmax={0.76,0.8,0.8,0.9,1,1};
+
+
+double[] cryecuttopmin={1.38,1.38,1.52,1.6,1.6};
+double[] cryecuttopmax={1.8,1.8,1.8,2,2};
+
+double[] cryecutbotmax={2,2,1.9,1.9,2};
+double[] cryecutbotmin= {1.38,1.38,1.5,1.65,1.55};
+
+
+// e cut 5181
+/*
+double[] ecuttopmin={0.49,0.6,0.6,0.65,0.69,0.7};
+double[] ecuttopmax={0.8,0.8,0.8,0.9,1,1};
+
+double[] ecutbotmin= {0.45,0.55,0.6,0.6,0.65,0.65};
+double[] ecutbotmax={0.75,0.85,0.8,0.9,0.9,0.9};
+
+
+double[] cryecuttopmin={1.38,1.38,1.52,1.6,1.6};
+double[] cryecuttopmax={1.8,1.8,1.8,2,2};
+
+double[] cryecutbotmax={2,2,1.9,1.9,2};
+double[] cryecutbotmin= {1.38,1.38,1.5,1.65,1.55};
+*/
+//e cut 5183
+/*
+double[] ecuttopmin={0.55,0.6,0.6,0.65,0.7,0.65};
+double[] ecuttopmax={0.8,0.85,0.9,0.9,0.9,0.9};
+
+double[] ecutbotmin= {0.5,0.55,0.6,0.7,0.65,0.7};
+double[] ecutbotmax={0.75,0.8,0.8,0.9,0.9,0.9};
+
+
+double[] cryecuttopmin={1.38,1.38,1.52,1.6,1.6};
+double[] cryecuttopmax={1.8,1.8,1.8,2,2};
+
+double[] cryecutbotmax={2,2,1.9,1.9,2};
+double[] cryecutbotmin= {1.38,1.38,1.5,1.65,1.55};
+*/
 double vertical;
 
 
@@ -207,7 +279,7 @@
 
 @Override
 public void startOfData(){
-    System.out.println("mo spacco tutto \n");
+    System.out.println("mo spacco tutto davero!!!\n");
  //inizializzo il file di uscita
    try{
     //initialize the writers
@@ -311,7 +383,7 @@
 int menot=-t;
 writer.append("events in row  " + menot + " = " + crycounterbot[t]+ " Rate = " + (crycounterbot[t]/timme) + "\n" );
 }
-writer.append("\n verticale = " + vertical +"\n");
+writer.append("\n TEMPO = " + timme +"\n");
 
 }
 
@@ -321,7 +393,7 @@
     System.err.println("Non ho scritto sul file");
     }
 
-System.out.println("vertical =  " + vertical + "\n");
+System.out.println("TEMPO =  " + timme + "\n");
 /*vertical=vertical-6.5;
 for(int i=0;i<7;i++)
 {double theta=Math.atan2( (vertical+i*13),1397);
@@ -347,6 +419,32 @@
      
      nevents++;
      
+     
+    	/* natha's code for trigger
+    	List <AbstractIntData> aids = event.get(AbstractIntData.class, "TriggerBank");
+    	for (AbstractIntData aid : aids) {
+    		if (aid.getTag() == TIData.BANK_TAG) {
+    			TIData tt=(TIData)aid;
+    			if (!tt.isSingle1Trigger()) return;
+                        break;
+    		}
+    	}
+     */ //nathans code for trigger end
+     
+     
+     
+  if (event.hasCollection(GenericObject.class, "TriggerBank")) {
+            List<GenericObject> triggerList = event.get(GenericObject.class, "TriggerBank");
+            for (GenericObject data : triggerList)
+                if (AbstractIntData.getTag(data) == TIData.BANK_TAG) {
+                    TIData triggerData = new TIData(data);
+                    if (!triggerData.isSingle1Trigger())//only process singles0 triggers...
+
+                        return;
+                }
+        } else //if (debug)
+            System.out.println(this.getClass().getSimpleName() + ":  No trigger bank found...running over all trigger types");
+  
      for(int i=0;i<6;i++){
     if(countertop[i]==0){timei[i]=timef;}}
         
@@ -369,6 +467,7 @@
          
          //if(cryy==1){verpos[0]=posY;}
          //da qui righe e colonne
+        /* 
         if(cryx==-5||cryx==-6){
             
             for(int i=0;i<5;i++){
@@ -390,7 +489,7 @@
                     }
                 }
             }
-        } 
+        } */
         
         
         ///da qui bin angolari 
@@ -400,7 +499,7 @@
              if(posY>Ymin[i]&&posY<=Ymax[i]){
                 if(posX<=Xmax[i] &&posX>=Xmin[i]){      
                     TopNoCut.get(i).fill(cluster.getEnergy());
-                    if(cluster.getEnergy()>ecuttopmin[i]&&cluster.getEnergy()<ecuttopmax[i]){
+                    if(cluster.getEnergy() > ecuttopmin[i] && cluster.getEnergy() < ecuttopmax[i]){
                         Top.get(i).fill(cluster.getEnergy());
                         countertop[i]++;
                         CryId.fill(ID);
@@ -413,7 +512,7 @@
              else if(posY<= -Ymin[i]&& posY> -Ymax[i]){
                 if(posX<Xmax[i] && posX>Xmin[i]){
                     BotNoCut.get(i).fill(cluster.getEnergy());
-                    if(cluster.getEnergy()>ecutbotmin[i] && cluster.getEnergy()<ecutbotmax[i]){
+                    if(cluster.getEnergy()> ecutbotmin[i] && cluster.getEnergy()<ecutbotmax[i]){
                         Bot.get(i).fill(cluster.getEnergy());
                         counterbot[i]++;
                         BotCry.get(i).fill(cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("ix"), cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("iy"));

Modified: java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/luca/ratetest.java
 =============================================================================
--- java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/luca/ratetest.java	(original)
+++ java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/luca/ratetest.java	Fri Jun 12 15:27:10 2015
@@ -24,10 +24,13 @@
 import org.hps.conditions.ecal.EcalChannel.EcalChannelCollection;
 
 import org.hps.conditions.ecal.EcalConditions;
+import org.hps.recon.ecal.triggerbank.AbstractIntData;
+import org.hps.recon.ecal.triggerbank.TIData;
 
 import org.lcsim.event.CalorimeterHit;
 import org.lcsim.event.Cluster;
 import org.lcsim.event.EventHeader;
+import org.lcsim.event.GenericObject;
 import org.lcsim.geometry.Detector;
 import org.lcsim.geometry.Subdetector;
 import org.lcsim.geometry.subdetector.HPSEcal3;
@@ -46,105 +49,16 @@
     private Subdetector ecal;
     private EcalChannelCollection channels= null;
     AIDA aida = AIDA.defaultInstance();
-    ArrayList<IHistogram1D> Top = new ArrayList<IHistogram1D>(6);
-    ArrayList<IHistogram1D> Bot = new ArrayList<IHistogram1D>(6);
-    ArrayList<IHistogram1D> TopNoCut = new ArrayList<IHistogram1D>(6);
-    ArrayList<IHistogram1D> BotNoCut = new ArrayList<IHistogram1D>(6);
-    ArrayList<IHistogram2D> TopCry=new ArrayList<IHistogram2D>(6);
-    ArrayList<IHistogram2D> BotCry=new ArrayList<IHistogram2D>(6);
-    ArrayList<IHistogram2D> CryTop=new ArrayList<IHistogram2D>(5);
-    ArrayList<IHistogram2D> CryBot=new ArrayList<IHistogram2D>(5);
-    ArrayList<IHistogram1D> TopCryEne = new ArrayList<IHistogram1D>(5);
-    ArrayList<IHistogram1D> BotCryEne = new ArrayList<IHistogram1D>(5);
     
-    IHistogram1D clusTot=aida.histogram1D("ALL", 200,0,2.5 );
     
-    IHistogram1D CryId=aida.histogram1D("cry Id",446,1,447);
-    double[] timei=new double[6];
-    double timef=0;
-    double counterTop=0;
-    double counterBot=0;
-    double counterEcut=0;
+    IHistogram1D c110=aida.histogram1D("110", 200,0,2.5 );
+    IHistogram1D c18=aida.histogram1D("18", 200,0,2.5 );
+    IHistogram1D c60=aida.histogram1D("60", 200,0,2.5 );
+    IHistogram1D c322=aida.histogram1D("322", 200,0,2.5 );
+    IHistogram1D c414=aida.histogram1D("414", 200,0,2.5 );
+    IHistogram1D c364=aida.histogram1D("364", 200,0,2.5 );
     
-    double nevents=0;
     
-double[] time=new double[6];
-double E0=1.92;
-double[] Ymax={45.91,52.95,60.00,67.01,74.04,81.18};
-double[] Ymin={38.83,45.81,52.95,60.00,67.01,74.04};
-double[] Xmax={-23.59,-23.1,-22.61,-22.11,-21.62,-21.13};
-double[] Xmin={-30.1,-30.59,-31.08,-31.58,-32.07,-32.57};
-
-int[] countertop=new int[6];
-int[] counterbot=new int[6];
-int[]crycountertop=new int[5];
-int[]crycounterbot=new int[5];
-
-double[] vertpos=new double[5];
-
-//e cuts 3393
-
-double[] ecuttopmin={1.20,1.35,1.50,1.50,1.60,1.60};
-double[] ecuttopmax={1.70,1.90,1.90,2.00,2.00,2.00};
-
-double[] ecutbotmin={1.28,1.50,1.50,1.65,1.65,1.50};
-double[] ecutbotmax={1.90,1.90,2.00,2.00,2.00,2.00};
-
-
-double[] cryecuttopmin={1.38,1.38,1.52,1.6,1.6};
-double[] cryecuttopmax={1.8,1.8,1.8,2,2};
-
-double[] cryecutbotmax={2,2,1.9,1.9,2};
-double[] cryecutbotmin= {1.38,1.38,1.5,1.65,1.55};
-
-
-//e cuts 3430
-/*
-double[] ecuttopmin={1.20,1.35,1.50,1.50,1.60,1.60};
-double[] ecuttopmax={1.70,1.80,1.90,2.00,2.00,2.00};
-
-double[] ecutbotmin= {1.20,1.50,1.50,1.55,1.60,1.50};
-double[] ecutbotmax={1.80,1.90,1.90,2.00,2.00,2.00};
-
-
-double[] cryecuttopmin={1.38,1.38,1.52,1.6,1.6};
-double[] cryecuttopmax={1.8,1.8,1.8,2,2};
-
-double[] cryecutbotmax={2,2,1.9,1.9,2};
-double[] cryecutbotmin= {1.38,1.38,1.5,1.65,1.55};
-*/
-//e cuts 3434
-/*
-double[] ecuttopmin={1.25,1.30,1.40,1.50,1.60,1.60};
-double[] ecuttopmax={1.65,1.80,1.90,1.90,2.00,2.00};
-
-double[] ecutbotmin= {1.30,1.40,1.40,1.60,1.60,1.50};
-double[] ecutbotmax={1.70,1.80,1.90,2,2,2};
-
-
-double[] cryecuttopmin={1.38,1.38,1.52,1.6,1.6};
-double[] cryecuttopmax={1.8,1.8,1.8,2,2};
-
-double[] cryecutbotmax={2,2,1.9,1.9,2};
-double[] cryecutbotmin= {1.38,1.38,1.5,1.65,1.55}; 
-*/
-//e cuts 3435 
-/*
-double[] ecuttopmin={1.28,1.30,1.40,1.50,1.50,1.60};
-double[] ecuttopmax={1.7,1.7,1.8,1.8,2,2};
-
-double[] ecutbotmin= {1.3,1.35,1.40,1.50,1.60,1.50};
-double[] ecutbotmax={1.7,1.8,1.9,2,2,2};
-
-
-double[] cryecuttopmin={1.38,1.38,1.52,1.6,1.6};
-double[] cryecuttopmax={1.8,1.8,1.8,2,2};
-
-double[] cryecutbotmax={2,2,1.9,1.9,2};
-double[] cryecutbotmin= {1.38,1.38,1.5,1.65,1.55};
-*/
-
-double vertical;
 
 
 
@@ -158,77 +72,7 @@
 
 @Override
 public void startOfData(){
-    System.out.println("mo spacco tutto \n");
- //inizializzo il file di uscita
-   try{
-    //initialize the writers
-    writer=new FileWriter(outputFileName);
-    writer.write("");
-   }
-    catch(IOException e ){
-    System.err.println("Error initializing output file for event display.");
-    } 
     
-    
-//inizializzo istogrammi
-     for(int t=0;t<5;t++){
-     String bin=String.valueOf(t+1);  
-     String crytopname="FEE in Crystal " + bin;
-     String topcryenename="CLu ene in crystal " + bin;
-     
-     String bin2=String.valueOf(-(t+1));
-     String crybotname="FEE in Crystal " + bin2;
-     String botcryenename="CLu ene in crystal " + bin2;
-     IHistogram2D crytophist=aida.histogram2D(crytopname,46,-24,25,10,-5,5 );
-     IHistogram2D crybothist=aida.histogram2D(crybotname,46,-24,25,10,-5,5 );
-     IHistogram1D Topcryenehist=aida.histogram1D(topcryenename, 250, 0.0,2.5);
-     IHistogram1D botcryenehist=aida.histogram1D(botcryenename,250,0.0,2.5);
-     TopCryEne.add(Topcryenehist);
-     BotCryEne.add(botcryenehist);
-     CryTop.add(crytophist);
-     CryBot.add(crybothist);
-     crycountertop[t]=0;
-     crycounterbot[t]=0;
-     }
-    
-    
-      for(int t=0; t<6; t++){
-      String bin=String.valueOf(t+1);  
-      String top="(TOP) FEE in Bin in " + bin;
-      String bot="(BOT) FEE in Bin in "+ bin;
-      String tope="(TOP) Cluster Energy in Bin " + bin;
-      String bote="(BOT) Cluster Energy in Bin "+ bin;
-      String topcryname="(TOP) Crystals in Bin " + bin;
-      String botcryname="(BOT) Crystals in Bin " + bin;
-      
-      
-      
-      IHistogram1D Toppe=aida.histogram1D(top, 250, 0.0,2.5);
-      IHistogram1D Botte=aida.histogram1D(bot, 250, 0.0,2.5);
-      IHistogram1D TopNoCute=aida.histogram1D(tope, 250, 0.0,2.5);
-      IHistogram1D BotNoCute=aida.histogram1D(bote, 250, 0.0,2.5);
-      IHistogram2D topcryhist=aida.histogram2D(topcryname,46,-24,25,11,-5,6 );
-      IHistogram2D botcryhist=aida.histogram2D(botcryname,46,-24,25,11,-5,6 );
-      
- 
-      Top.add(Toppe);
-      Bot.add(Botte);
-      TopNoCut.add(TopNoCute);
-      BotNoCut.add(BotNoCute);
-      TopCry.add(topcryhist);
-      BotCry.add(botcryhist);
-      }
-    
-    
-    
-for (int i =0;i<6;i++){
-    time[i]=0;
-    timei[i]=0;
-    
-    countertop[i]=0;
-    counterbot[i]=0;
-    
-}
 
 
 }
@@ -236,144 +80,42 @@
 
 @Override
 public void endOfData(){
-double timme=(timef-timei[0])/1000000000;
-
-//for(int i=0;i<6;i++){System.out.println(i + " " + time[i] + "\n");}
-
-try{
-writer.append("Total event in file " + nevents + " Total time = "+ timme  +"\n");
-writer.append("TOP \n");
-for(int i=0;i<6;i++){
- int bin=i+1;   
- time[i]=timef-timei[i];   
-writer.append("Bin " + bin + " Total event  " + countertop[i] + " Rate = " + (countertop[i]/time[i])*1000000000 + "\n" );
-}
 
 
-for(int i=0;i<6;i++){
- int bin=i+1;   
- time[i]=timef-timei[i];   
-writer.append("Bin " + bin +" Total event BOT " + counterbot[i] + " Rate = " + (counterbot[i]/time[i])*1000000000 + "\n" );
-}
-
-writer.append("\n \n \n");
-for(int t=0;t<5;t++){
-writer.append("events in row  " + t + " = " + crycountertop[t]+ " Rate = " + (crycountertop[t]/timme) + "\n" );
-int menot=-t;
-writer.append("events in row  " + menot + " = " + crycounterbot[t]+ " Rate = " + (crycounterbot[t]/timme) + "\n" );
-}
-writer.append("\n verticale = " + vertical +"\n");
-
-}
-
-
-catch(IOException e)
-    {
-    System.err.println("Non ho scritto sul file");
-    }
-
-System.out.println("vertical =  " + vertical + "\n");
-/*vertical=vertical-6.5;
-for(int i=0;i<7;i++)
-{double theta=Math.atan2( (vertical+i*13),1397);
-System.out.println("theta = " + theta + "\n");
-}
-*/
-
-    try
-    {
-//close the file writer.
-    writer.close();
-    }
-    catch(IOException e)
-    {
-    System.err.println("Error closing utput file for event display.");
-    }
+   
 }
   
     @Override
     public void process (EventHeader event){
         
-     timef=event.getTimeStamp();
+    if (event.hasCollection(GenericObject.class, "TriggerBank")) {
+            List<GenericObject> triggerList = event.get(GenericObject.class, "TriggerBank");
+            for (GenericObject data : triggerList)
+                if (AbstractIntData.getTag(data) == TIData.BANK_TAG) {
+                    TIData triggerData = new TIData(data);
+                    if (!triggerData.isSingle1Trigger())//only process singles0 triggers...
+
+                        return;
+                }
+        } else //if (debug)
+            System.out.println(this.getClass().getSimpleName() + ":  No trigger bank found...running over all trigger types");
      
-     nevents++;
-     
-     for(int i=0;i<6;i++){
-    if(countertop[i]==0){timei[i]=timef;}}
-        
-    if(event.hasCollection(Cluster.class,"EcalClusters")){
+    
+     if(event.hasCollection(Cluster.class,"EcalClusters")){
         
         
         List<Cluster> clusters= event.get(Cluster.class,"EcalClusters");
         
          for(Cluster cluster : clusters){
-         
+             int id=getDBID(cluster);
+             if(cluster.getEnergy()>0.65 && cluster.getSize()==1){
+             if(id==110){c110.fill(cluster.getEnergy());}
              
-          int ID=getDBID(cluster);   
-         clusTot.fill(cluster.getEnergy());
-         double posY=cluster.getPosition()[1];
-         double posX=cluster.getPosition()[0];
-         double cryx=cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("ix");
-         double cryy=cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("iy");
-         
-         //if(cryy==1){verpos[0]=posY;}
-         //da qui righe e colonne
-        if(cryx==-5||cryx==-6){
-            
-            for(int i=0;i<5;i++){
-                //top
-                if(cryy==i+1){
-                 if(cluster.getEnergy()>cryecuttopmin[i]&&cluster.getEnergy()<cryecuttopmax[i]){
-                     CryTop.get(i).fill(cryx, cryy);
-                     TopCryEne.get(i).fill(cluster.getEnergy());
-                     crycountertop[i]++;
-                    }
-                }
-           
-               //bottom
-                if(cryy==-(i+1)){
-                    if(cluster.getEnergy()>cryecutbotmin[i] && cluster.getEnergy()<cryecutbotmax[i]){
-                    CryBot.get(i).fill(cryx, cryy);
-                    BotCryEne.get(i).fill(cluster.getEnergy());
-                    crycounterbot[i]++;
-                    }
-                }
-            }
-        } 
-        
-        
-        ///da qui bin angolari 
-         
-         for(int i=0;i<6;i++){
-             //top
-             if(posY>Ymin[i]&&posY<=Ymax[i]){
-                if(posX<=Xmax[i] &&posX>=Xmin[i]){      
-                    TopNoCut.get(i).fill(cluster.getEnergy());
-                    if(cluster.getEnergy()>ecuttopmin[i]&&cluster.getEnergy()<ecuttopmax[i]){
-                        Top.get(i).fill(cluster.getEnergy());
-                        countertop[i]++;
-                        CryId.fill(ID);
-                        TopCry.get(i).fill(cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("ix"), cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("iy"));
-                    }//tagli energia
-                } //if su X
-             }//if pos y   
+             }
              
-            //controllo down                 
-             else if(posY<= -Ymin[i]&& posY> -Ymax[i]){
-                if(posX<Xmax[i] && posX>Xmin[i]){
-                    BotNoCut.get(i).fill(cluster.getEnergy());
-                    if(cluster.getEnergy()>ecutbotmin[i] && cluster.getEnergy()<ecutbotmax[i]){
-                        Bot.get(i).fill(cluster.getEnergy());
-                        counterbot[i]++;
-                        BotCry.get(i).fill(cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("ix"), cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("iy"));
-                        CryId.fill(ID);
-                    }//e cut bot  
-                } //xpos    
-         }// ypos bot
-        }//for sui bin
-       
-    }//end of for over clusters
-    }   //and of if has colelction  
+         }
+     }//end of if has collection
+    
     }//end pf process
     
     

Modified: java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/omoreno/SvtClusterAnalysis.java
 =============================================================================
--- java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/omoreno/SvtClusterAnalysis.java	(original)
+++ java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/omoreno/SvtClusterAnalysis.java	Fri Jun 12 15:27:10 2015
@@ -15,13 +15,17 @@
 import hep.aida.ITree;
 import hep.aida.ref.rootwriter.RootFileStore;
 
-import org.hps.recon.tracking.FittedRawTrackerHit;
 import org.lcsim.recon.tracking.digitization.sisim.SiTrackerHitStrip1D;
 import org.lcsim.util.Driver; 
+import org.lcsim.fit.helicaltrack.HelicalTrackCross;
+import org.lcsim.fit.helicaltrack.HelicalTrackStrip;
 import org.lcsim.geometry.Detector;
 import org.lcsim.detector.tracker.silicon.HpsSiSensor;
 import org.lcsim.event.EventHeader;
 import org.lcsim.event.RawTrackerHit;
+import org.lcsim.event.Track;
+import org.lcsim.event.TrackerHit;
+import org.hps.recon.tracking.FittedRawTrackerHit;
 
 /**
  * 
@@ -44,17 +48,21 @@
     ITree tree; 
     IHistogramFactory histogramFactory; 
 	IPlotterFactory plotterFactory = IAnalysisFactory.create().createPlotterFactory();
+	protected Map<String, IPlotter> plotters = new HashMap<String, IPlotter>(); 
 	
-	protected Map<String, IPlotter> plotters = new HashMap<String, IPlotter>(); 
 	private Map<HpsSiSensor, IHistogram1D> clusterChargePlots = new HashMap<HpsSiSensor, IHistogram1D>();
+	private Map<HpsSiSensor, IHistogram1D> singleHitClusterChargePlots = new HashMap<HpsSiSensor, IHistogram1D>();
+	private Map<HpsSiSensor, IHistogram1D> multHitClusterChargePlots = new HashMap<HpsSiSensor, IHistogram1D>();
+	private Map<HpsSiSensor, IHistogram1D> trackClusterChargePlots = new HashMap<HpsSiSensor, IHistogram1D>();
 	private Map<HpsSiSensor, IHistogram1D> signalToNoisePlots = new HashMap<HpsSiSensor, IHistogram1D>();
-	private Map<HpsSiSensor, IHistogram1D> singleHitClusterChargePlots = new HashMap<HpsSiSensor, IHistogram1D>();
 	private Map<HpsSiSensor, IHistogram1D> singleHitSignalToNoisePlots = new HashMap<HpsSiSensor, IHistogram1D>();
-	private Map<HpsSiSensor, IHistogram1D> multHitClusterChargePlots = new HashMap<HpsSiSensor, IHistogram1D>();
 	private Map<HpsSiSensor, IHistogram1D> multHitSignalToNoisePlots = new HashMap<HpsSiSensor, IHistogram1D>();
+	private Map<HpsSiSensor, IHistogram1D> trackHitSignalToNoisePlots = new HashMap<HpsSiSensor, IHistogram1D>();
+	private Map<HpsSiSensor, IHistogram1D> clusterMultiplicityPlots = new HashMap<HpsSiSensor, IHistogram1D>();
 	private Map<HpsSiSensor, IHistogram1D> clusterTimePlots = new HashMap<HpsSiSensor, IHistogram1D>();
+	private Map<HpsSiSensor, IHistogram1D> trackClusterTimePlots = new HashMap<HpsSiSensor, IHistogram1D>();
 	private Map<HpsSiSensor, IHistogram2D> clusterChargeVsTimePlots = new HashMap<HpsSiSensor, IHistogram2D>();
-    
+	
     // Detector name
     private static final String SUBDETECTOR_NAME = "Tracker";
     
@@ -63,6 +71,7 @@
     private String fittedHitsCollectionName = "SVTFittedRawTrackerHits";
     
     private int runNumber = -1; 
+        
     
     /**
      * Default Ctor
@@ -117,6 +126,9 @@
         plotters.put("Signal to Noise", plotterFactory.create("Signal to Noise"));
         plotters.get("Signal to Noise").createRegions(6, 6);
         
+        plotters.put("Cluster Multiplicity", plotterFactory.create("Cluster Multiplicity"));
+        plotters.get("Cluster Multiplicity").createRegions(6, 6);
+        
         plotters.put("Cluster Time", plotterFactory.create("Cluster Time"));
         plotters.get("Cluster Time").createRegions(6, 6);
         
@@ -129,7 +141,7 @@
                     histogramFactory.createHistogram1D(sensor.getName() + " - Cluster Charge", 100, 0, 5000));
             plotters.get("Cluster Amplitude").region(this.computePlotterRegion(sensor))
                                              .plot(clusterChargePlots.get(sensor), this.createStyle(1, "Cluster Amplitude [ADC Counts]", ""));
-        
+       
             singleHitClusterChargePlots.put(sensor, 
                     histogramFactory.createHistogram1D(sensor.getName() + " - Single Hit Cluster Charge", 100, 0, 5000));
             plotters.get("Cluster Amplitude").region(this.computePlotterRegion(sensor))
@@ -139,6 +151,11 @@
                     histogramFactory.createHistogram1D(sensor.getName() + " - Multiple Hit Cluster Charge", 100, 0, 5000));
             plotters.get("Cluster Amplitude").region(this.computePlotterRegion(sensor))
                                              .plot(multHitClusterChargePlots.get(sensor), this.createStyle(2, "Cluster Amplitude [ADC Counts]", ""));
+
+            trackClusterChargePlots.put(sensor, 
+                    histogramFactory.createHistogram1D(sensor.getName() + " - Tracker Cluster Charge", 100, 0, 5000));
+            plotters.get("Cluster Amplitude").region(this.computePlotterRegion(sensor))
+                                             .plot(trackClusterChargePlots.get(sensor), this.createStyle(3, "Cluster Amplitude [ADC Counts]", ""));
             
             signalToNoisePlots.put(sensor, 
                     histogramFactory.createHistogram1D(sensor.getName() + " - Signal to Noise", 50, 0, 50));
@@ -154,18 +171,31 @@
                     histogramFactory.createHistogram1D(sensor.getName() + " - Multiple Hit Signal to Noise", 50, 0, 50));
             plotters.get("Signal to Noise").region(this.computePlotterRegion(sensor))
                                            .plot(multHitSignalToNoisePlots.get(sensor), this.createStyle(2, "Signal to Noise", ""));
-        
+
+            trackHitSignalToNoisePlots.put(sensor, 
+                    histogramFactory.createHistogram1D(sensor.getName() + " - Track Signal to Noise", 50, 0, 50));
+            plotters.get("Signal to Noise").region(this.computePlotterRegion(sensor))
+                                           .plot(trackHitSignalToNoisePlots.get(sensor), this.createStyle(3, "Signal to Noise", ""));
+            
+            clusterMultiplicityPlots.put(sensor,
+                    histogramFactory.createHistogram1D(sensor.getName() + " - Cluster Multiplicity", 10, 0, 10));
+            plotters.get("Cluster Multiplicity").region(this.computePlotterRegion(sensor))
+                                                .plot(clusterMultiplicityPlots.get(sensor), this.createStyle(1, "Cluster Multiplicity", ""));
             
             clusterTimePlots.put(sensor,
                     histogramFactory.createHistogram1D(sensor.getName() + " - Cluster Time", 100, -100, 100));
             plotters.get("Cluster Time").region(this.computePlotterRegion(sensor))
                                         .plot(clusterTimePlots.get(sensor), this.createStyle(1, "Cluster Time [ns]", ""));
+
+            trackClusterTimePlots.put(sensor,
+                    histogramFactory.createHistogram1D(sensor.getName() + " - Track Cluster Time", 100, -100, 100));
+            plotters.get("Cluster Time").region(this.computePlotterRegion(sensor))
+                                        .plot(trackClusterTimePlots.get(sensor), this.createStyle(3, "Cluster Time [ns]", ""));
             
             clusterChargeVsTimePlots.put(sensor,
                     histogramFactory.createHistogram2D(sensor.getName() + " - Cluster Amplitude vs Time", 100, 0, 5000, 100, -100, 100));
             plotters.get("Cluster Amplitude vs Cluster Time").region(this.computePlotterRegion(sensor))
                                                              .plot(clusterChargeVsTimePlots.get(sensor));
-            
         }
         
 		for (IPlotter plotter : plotters.values()) { 
@@ -191,9 +221,10 @@
         
         // Get the list of clusters in the event
         List<SiTrackerHitStrip1D> clusters = event.get(SiTrackerHitStrip1D.class, clusterCollectionName);
+        System.out.println("Number of clusters: " + clusters.size()); 
        
         for (SiTrackerHitStrip1D cluster : clusters) { 
-            
+           
             // Get the sensor associated with this cluster
             HpsSiSensor sensor = (HpsSiSensor) cluster.getSensor();
             
@@ -217,7 +248,9 @@
                 
                 noise += channelNoise * this.getFittedHit(rawHit).getAmp();
             }
-       
+      
+            clusterMultiplicityPlots.get(sensor).fill(cluster.getRawHits().size());
+            
             // Calculate the signal weighted noise
             noise = noise/amplitude;
             
@@ -233,6 +266,52 @@
             } else { 
                 multHitClusterChargePlots.get(sensor).fill(amplitude);
                 multHitSignalToNoisePlots.get(sensor).fill(amplitude/noise);
+            }
+        }
+        
+        if (!event.hasCollection(Track.class, "MatchedTracks")) return;
+        
+        List<Track> tracks = event.get(Track.class, "MatchedTracks");
+        
+        for (Track track : tracks) { 
+            
+            for (TrackerHit stereoHit : track.getTrackerHits()) { 
+               
+                for (HelicalTrackStrip cluster : ((HelicalTrackCross) stereoHit).getStrips()) {
+                    
+                    // Get the raw hits composing this cluster and use them to calculate the amplitude of the hit
+                    double amplitude = 0;
+                    double noise = 0;
+                    HpsSiSensor sensor = null;
+                    for (Object hit : cluster.rawhits()) { 
+                        RawTrackerHit rawHit = (RawTrackerHit) hit;
+                   
+                        sensor = (HpsSiSensor) rawHit.getDetectorElement();
+                        
+                        // Get the channel of the raw hit
+                        int channel = rawHit.getIdentifierFieldValue("strip");
+                
+                        // Add the amplitude of that channel to the total amplitude
+                        amplitude += this.getFittedHit(rawHit).getAmp();
+                
+                        // Calculate the mean noise for the channel
+                        double channelNoise = 0;
+                        for (int sampleN = 0; sampleN < 6; sampleN++) { 
+                            channelNoise += sensor.getNoise(channel, sampleN);
+                        }
+                        channelNoise = channelNoise/6;
+                
+                        noise += channelNoise * this.getFittedHit(rawHit).getAmp();
+                    }
+                    
+                    // Calculate the signal weighted noise
+                    noise = noise/amplitude;
+                   
+                    // Fill all plots
+                    trackClusterChargePlots.get(sensor).fill(amplitude);
+                    trackHitSignalToNoisePlots.get(sensor).fill(amplitude/noise);
+                    trackClusterTimePlots.get(sensor).fill(cluster.time());
+                }
             }
         }
     }
@@ -307,6 +386,10 @@
             style.dataStyle().fillStyle().setColor("93, 228, 47, 1");
             style.dataStyle().outlineStyle().setColor("93, 228, 47, 1");
             style.dataStyle().fillStyle().setOpacity(.70);
+        } else if (color == 3) { 
+            style.dataStyle().fillStyle().setColor("255, 38, 38, 1");
+            style.dataStyle().outlineStyle().setColor("255, 38, 38, 1");
+            style.dataStyle().fillStyle().setOpacity(.70);
         }
         style.dataStyle().errorBarStyle().setVisible(false);
         

Modified: java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/omoreno/SvtHitEfficiency.java
 =============================================================================
--- java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/omoreno/SvtHitEfficiency.java	(original)
+++ java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/omoreno/SvtHitEfficiency.java	Fri Jun 12 15:27:10 2015
@@ -1,23 +1,24 @@
 package org.hps.users.omoreno;
-
-
-import hep.aida.ICloud2D;
-import hep.aida.IHistogram1D;
-import hep.aida.IHistogram2D;
-import hep.aida.IPlotter;
-import hep.aida.IPlotterStyle;
-import hep.physics.vec.BasicHep3Vector;
-import hep.physics.vec.Hep3Vector;
-import hep.physics.vec.VecOp;
 
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import org.hps.recon.tracking.TrackUtils;
-import org.hps.recon.tracking.TrackerHitUtils;
+import hep.aida.IAnalysisFactory;
+import hep.aida.IHistogramFactory;
+import hep.aida.IPlotterFactory;
+import hep.aida.IPlotter;
+import hep.aida.IHistogram1D;
+import hep.aida.ITree;
+
+import hep.physics.vec.BasicHep3Vector;
+import hep.physics.vec.Hep3Vector;
+import hep.physics.vec.VecOp;
+
 import org.lcsim.detector.ITransform3D;
+import org.lcsim.detector.converter.compact.subdetector.SvtStereoLayer;
+import org.lcsim.detector.converter.compact.subdetector.HpsTracker2;
 import org.lcsim.detector.solids.Box;
 import org.lcsim.detector.solids.Point3D;
 import org.lcsim.detector.solids.Polygon3D;
@@ -31,7 +32,10 @@
 import org.lcsim.fit.helicaltrack.HelicalTrackHit;
 import org.lcsim.geometry.Detector;
 import org.lcsim.util.Driver;
-import org.lcsim.util.aida.AIDA;
+
+import org.hps.recon.tracking.TrackUtils;
+import org.hps.recon.tracking.TrackerHitUtils;
+
 
 /**
  * Analysis driver used to calculate the hit efficiency of the SVT.
@@ -41,12 +45,25 @@
  */
 public class SvtHitEfficiency extends Driver {
 
-	private AIDA aida;
-    private List<IHistogram1D> histos1D = new ArrayList<IHistogram1D>();
-    private List<IHistogram2D> histos2D = new ArrayList<IHistogram2D>();
-    private List<IPlotter> plotters = new ArrayList<IPlotter>();
-    private Map<SiSensor, Map<Integer, Hep3Vector>> stripPositions = new HashMap<SiSensor, Map<Integer, Hep3Vector>>(); 
+
+    // Use JFreeChart as the default plotting backend
+    static { 
+        hep.aida.jfree.AnalysisFactory.register();
+    }
+
+    // Plotting
+    ITree tree; 
+    IHistogramFactory histogramFactory; 
+    IPlotterFactory plotterFactory = IAnalysisFactory.create().createPlotterFactory();
+    protected Map<String, IPlotter> plotters = new HashMap<String, IPlotter>(); 
+
+    private Map<String, IHistogram1D> trackMomentumPlots = new HashMap<String, IHistogram1D>(); 
+
+    //private Map<SiSensor, Map<Integer, Hep3Vector>> stripPositions = new HashMap<SiSensor, Map<Integer, Hep3Vector>>(); 
     private List<HpsSiSensor> sensors = null;
+    private Map<Integer, SvtStereoLayer> topStereoLayers = new HashMap<Integer, SvtStereoLayer>();
+    private Map<Integer, SvtStereoLayer> bottomStereoLayers = new HashMap<Integer, SvtStereoLayer>();
+
     TrackerHitUtils trackerHitUtils = new TrackerHitUtils();
     
     boolean debug = false;
@@ -57,8 +74,6 @@
     boolean enableChiSquaredPlots = true;
     boolean enableTrackPositionPlots = true;
     boolean maskBadChannels = false;
-    
-    int plotterIndex = 0;
     
     double numberOfTopTracks = 0;
     double numberOfBottomTracks = 0;
@@ -83,10 +98,22 @@
     public static final double SENSOR_WIDTH = 38.3399; // mm
     private static final String SUBDETECTOR_NAME = "Tracker";
 
-    /**
-     * Default Ctor
+    // By default, require that all tracks have 5 hits
+    int hitsOnTrack = 5;
+
+    /**
+     * Default Constructor
      */
     public SvtHitEfficiency(){
+    }
+
+    /**
+     *  Set the number of stereo hits associated with a track fit.
+     *
+     *  @param hitsOnTrack : Number of stereo hits associated with a track fit.
+     */
+    public void setHitsOnTrack(int hitsOnTrack) { 
+        this.hitsOnTrack = hitsOnTrack;
     }
     
     /**
@@ -100,25 +127,60 @@
      * Enable/Disable masking of bad channels
      */
     public void setMaskBadChannels(boolean maskBadChannels){
-    	this.maskBadChannels = maskBadChannels; 
+        this.maskBadChannels = maskBadChannels; 
     }
     
     public void detectorChanged(Detector detector){
-    	
-    	// Get the list of sensors
-    	sensors = detector.getSubdetector(SUBDETECTOR_NAME).getDetectorElement().findDescendants(HpsSiSensor.class);
-    	
-        // setup AIDA
-        aida = AIDA.defaultInstance();
-        aida.tree().cd("/");
-        
+    
+        tree = IAnalysisFactory.create().createTreeFactory().create();
+        histogramFactory = IAnalysisFactory.create().createHistogramFactory(tree);
+        
+        // Get the HpsSiSensor objects from the tracker detector element
+        sensors = detector.getSubdetector(SUBDETECTOR_NAME)
+                          .getDetectorElement().findDescendants(HpsSiSensor.class);
+   
+        // If the detector element had no sensors associated with it, throw
+        // an exception
+        if (sensors.size() == 0) {
+            throw new RuntimeException("No sensors were found in this detector.");
+        }
+
+        // Get the stereo layers from the geometry and build the stereo
+        // layer maps
+        List<SvtStereoLayer> stereoLayers 
+            = ((HpsTracker2) detector.getSubdetector(SUBDETECTOR_NAME).getDetectorElement()).getStereoPairs();
+        for (SvtStereoLayer stereoLayer : stereoLayers) { 
+            if (stereoLayer.getAxialSensor().isTopLayer()) { 
+                topStereoLayers.put(stereoLayer.getLayerNumber(), stereoLayer);
+            } else { 
+                bottomStereoLayers.put(stereoLayer.getLayerNumber(), stereoLayer);
+            }
+        }
+    
+        /*
         String title = null;
         IHistogram2D histo2D = null;
         IHistogram1D histo1D = null;
         ICloud2D cloud2D = null;
+        */
+
+        if (enableMomentumPlots) { 
+            
+           plotters.put("Track Momentum", plotterFactory.create("Track Momentum"));
+           plotters.get("Track Momentum").createRegions(1, 2);
+
+           trackMomentumPlots.put("Track Momentum", histogramFactory.createHistogram1D("Track Momentum", 50, 0, 5));
+           plotters.get("Track Momentum").region(0).plot(trackMomentumPlots.get("Track Momentum"));
+           
+           trackMomentumPlots.put("Track Momentum - Tracks Within Acceptance",
+                   histogramFactory.createHistogram1D("Track Momentum - Tracks Within Acceptance", 50, 0, 5));
+           plotters.get("Track Momentum").region(0)
+                                         .plot(trackMomentumPlots.get("Track Momentum - Tracks Within Acceptance"));
+        }
 
         // Create a Map from sensor to bad channels and from bad channels to
         // strip position
+        /*
         for(ChargeCarrier carrier : ChargeCarrier.values()){
             for(SiSensor sensor : sensors){ 
                 if(sensor.hasElectrodesOnSide(carrier)){ 
@@ -137,49 +199,34 @@
                     }
                 }
             }
-        }
-        
-        //--- Momentum Plots ---//
-        //----------------------//
-        if(enableMomentumPlots){
-        	plotters.add(PlotUtils.setupPlotter("Track Momentum", 0, 0));
-        	title = "Track Momentum - All Tracks";
-        	histo1D = aida.histogram1D(title, 50, 0, 5);
-        	PlotUtils.setup1DRegion(plotters.get(plotterIndex), title, 0, "Momentum [GeV]", histo1D);
-        	title = "Track Momentum - Tracks Within Acceptance";
-        	histo1D = aida.histogram1D(title, 50, 0, 5);
-        	plotters.get(plotterIndex).region(0).plot(histo1D);
-        	title = "Track Momentum - Tracks With All Layers Hit";
-        	histo1D = aida.histogram1D(title, 50, 0, 5);
-        	plotters.get(plotterIndex).region(0).plot(histo1D);
-        	plotterIndex++;
-        }
+        }*/
+        
         
         //--- Track Fit Chi Squared ---//
         //-----------------------------//
-        if(enableChiSquaredPlots){
-        	plotters.add(PlotUtils.setupPlotter("Track Chi Squared", 0, 0));
-        	title = "Chi Squared - All Tracks";
-        	histo1D = aida.histogram1D(title, 50, 0, 50);
-        	PlotUtils.setup1DRegion(plotters.get(plotterIndex), title, 0, "Chi Squared", histo1D);
-        	title = "Chi Squared - Tracks Within Acceptance";
-        	histo1D = aida.histogram1D(title, 50, 0, 50);
-        	plotters.get(plotterIndex).region(0).plot(histo1D);
-        	title = "Chi Squared - Tracks With All Layers Hit";
-        	histo1D = aida.histogram1D(title, 50, 0, 50);
-        	plotters.get(plotterIndex).region(0).plot(histo1D);
+        /*if(enableChiSquaredPlots){
+            plotters.add(PlotUtils.setupPlotter("Track Chi Squared", 0, 0));
+            title = "Chi Squared - All Tracks";
+            histo1D = aida.histogram1D(title, 50, 0, 50);
+            PlotUtils.setup1DRegion(plotters.get(plotterIndex), title, 0, "Chi Squared", histo1D);
+            title = "Chi Squared - Tracks Within Acceptance";
+            histo1D = aida.histogram1D(title, 50, 0, 50);
+            plotters.get(plotterIndex).region(0).plot(histo1D);
+            title = "Chi Squared - Tracks With All Layers Hit";
+            histo1D = aida.histogram1D(title, 50, 0, 50);
+            plotters.get(plotterIndex).region(0).plot(histo1D);
             plotterIndex++;
-        }
+        }*/
                 
         //--- Track Position Plots ---//
         //----------------------------//
-        if(enableTrackPositionPlots){
-        	int layerNumber = 1; 
-        	SiSensor sensor = null;
-        	IPlotterStyle style = aida.analysisFactory().createPlotterFactory().createPlotterStyle();
+        /*if(enableTrackPositionPlots){
+            int layerNumber = 1; 
+            SiSensor sensor = null;
+            IPlotterStyle style = aida.analysisFactory().createPlotterFactory().createPlotterStyle();
             for(int index = 1; index < 6; index++){
                 plotters.add(PlotUtils.setupPlotter("Track Position - Layer " + index, 2, 3));
-            	title = "Track Position - Layer " + index + " - Tracks Within Acceptance";
+                title = "Track Position - Layer " + index + " - Tracks Within Acceptance";
                 cloud2D = aida.cloud2D(title);
                 PlotUtils.setup2DRegion(plotters.get(plotterIndex), title, 0, "x [mm]", "y [mm]", cloud2D, style);
                 title = "Track Position - Layer " + index + " - Tracks With All Layers Hit";
@@ -191,6 +238,7 @@
                 //sensor = SvtUtils.getInstance().getBottomSensor(layerNumber, 0);
                 //title = SvtUtils.getInstance().getDescription(sensor) + " - Occupancy";
                 histo1D = aida.histogram1D(title, 640, 0, 639);
+    
                 histos1D.add(histo1D);
                 PlotUtils.setup1DRegion(plotters.get(plotterIndex), title, 2, "Channel #", histo1D);
                 //sensor = SvtUtils.getInstance().getTopSensor(layerNumber, 0);
@@ -212,9 +260,9 @@
                 layerNumber++;
                 plotterIndex++;
             }
-        }
-        
-        for (IPlotter plotter : plotters) {
+        }*/
+       
+        for (IPlotter plotter : plotters.values()) { 
             plotter.show();
         }
     }
@@ -222,9 +270,9 @@
     /**
      * .
      */
-    private Hep3Vector getStripPosition(SiSensor sensor, int physicalChannel){ 
+   /* private Hep3Vector getStripPosition(SiSensor sensor, int physicalChannel){ 
         return stripPositions.get(sensor).get(physicalChannel);
-    }
+    }*/
 
     /**
      * Print a debug message if they are enabled.
@@ -251,140 +299,153 @@
         //List<Cluster> ecalClusters = event.get(Cluster.class, ecalClustersCollectionName);
 
         for(Track track : tracks){
-        	
-            ecalClusterTrackMatch = false;
-        	
+          
+            // Check that the track has the required number of hits.  The number of hits
+            // required to make a track is set in the tracking strategy.
+            if(track.getTrackerHits().size() != this.hitsOnTrack){
+                System.out.println("This track doesn't have the required number of hits.");
+                continue;
+            }
+           
+            // Calculate the momentum of the track
+            double momentum = (new BasicHep3Vector(track.getTrackStates().get(0).getMomentum())).magnitude();
+
+            if (enableMomentumPlots) {
+                trackMomentumPlots.get("Track Momentum").fill(momentum); 
+            }
+
+            // Find which of the layers isn't being used in the track fit
+            int unusedLayer = this.getUnusedSvtLayer(track.getTrackerHits());
+
+            // Extrapolate the track to the unused layer and check that it lies
+            // within the acceptance of that layer.  If it doesn't, move on
+            // to the next event
+            if(!isWithinAcceptance(track, unusedLayer)) continue;
+
+            if (enableMomentumPlots) { 
+                trackMomentumPlots.get("Track Momentum - Tracks Within Acceptance").fill(momentum); 
+            }
+            //ecalClusterTrackMatch = false;
+            
             // Check if there is an Ecal cluster in the same detector volume as the track
-        	/*for(Cluster ecalCluster : ecalClusters){
-        		if(ecalCluster.getPosition()[1] > 0 && trkUtil.getZ0() > 0){
-        			ecalClusterTrackMatch = true;
-        			break;
-        		}
-        		else if(ecalCluster.getPosition()[1] < 0 && trkUtil.getZ0() < 0){
-        			ecalClusterTrackMatch = true;
-        			break;
-        		}
-        	}*/
-        	
-        	/*
-        	if(!ecalClusterTrackMatch){
-        		if(debug) System.out.println(this.getClass().getSimpleName() + ": No matching Ecal cluster found");
-        		continue;
-        	}*/
-            
-            // Check that the track is associated with four hits only. This should
-            // be the case since the strategy is only requiring four hits to fit
-            // a track and is not requiring an extending layer
-            if(track.getTrackerHits().size() != 4){
-                System.out.println(this.getClass().getSimpleName() + ": This track is composed of " + track.getTrackerHits().size() + ". Skipping event..." );
+            /*for(Cluster ecalCluster : ecalClusters){
+                if(ecalCluster.getPosition()[1] > 0 && trkUtil.getZ0() > 0){
+                    ecalClusterTrackMatch = true;
+                    break;
+                }
+                else if(ecalCluster.getPosition()[1] < 0 && trkUtil.getZ0() < 0){
+                    ecalClusterTrackMatch = true;
+                    break;
+                }
+            }*/
+            
+            /*
+            if(!ecalClusterTrackMatch){
+                if(debug) System.out.println(this.getClass().getSimpleName() + ": No matching Ecal cluster found");
                 continue;
-            }
-            
-        	// Apply a momentum cut? Probably ...
-        	// Calculate the track momentum
-        	double momentum = Math.sqrt(track.getTrackStates().get(0).getMomentum()[0]*track.getTrackStates().get(0).getMomentum()[0] + track.getTrackStates().get(0).getMomentum()[1]*track.getTrackStates().get(0).getMomentum()[1] + track.getTrackStates().get(0).getMomentum()[2]*track.getTrackStates().get(0).getMomentum()[2]);
-        	if(momentum < 0.5 /* GeV */) continue;
-        	if(enableMomentumPlots)
-        		aida.histogram1D("Track Momentum - All Tracks").fill(momentum);
-            
-        	if(enableChiSquaredPlots)
-        		aida.histogram1D("Chi Squared - All Tracks").fill(track.getChi2());
-        	
-            // Find which layer is not being used to fit the track
-            int layer = this.findMissingFitLayer(track.getTrackerHits());
-        	int arrayPosition = (layer - 1)/2;
-            
-        	// Find if the track is within the acceptance of the layer not being used in
-            // the fit
-            if(!isWithinAcceptance(track, layer)) continue;
-            if(TrackUtils.getZ0(track) > 0){
-            	numberOfTopTracks++;
-            	topTracksPerMissingLayer[arrayPosition]++;
-            } else {
-            	numberOfBottomTracks++;
-            	bottomTracksPerMissingLayer[arrayPosition]++;
-            }
-
-            if(enableMomentumPlots)
-    			aida.histogram1D("Track Momentum - Tracks Within Acceptance").fill(momentum);
-    		if(enableChiSquaredPlots)
-    			aida.histogram1D("Chi Squared - Tracks Within Acceptance").fill(track.getChi2());
-    		
+            }*/
+            
+            
+            //int arrayPosition = (layer - 1)/2;
+            
+            //if(TrackUtils.getZ0(track) > 0){
+                //numberOfTopTracks++;
+                //topTracksPerMissingLayer[arrayPosition]++;
+            //} else {
+                //numberOfBottomTracks++;
+                //bottomTracksPerMissingLayer[arrayPosition]++;
+            //}
+
+            //if(enableChiSquaredPlots)
+            //    aida.histogram1D("Chi Squared - Tracks Within Acceptance").fill(track.getChi2());
+            
             // Find if there is a stereo hit within that layer
-            List<HelicalTrackHit> stereoHits = event.get(HelicalTrackHit.class, stereoHitCollectionName);
+            /*List<HelicalTrackHit> stereoHits = event.get(HelicalTrackHit.class, stereoHitCollectionName);
             for(HelicalTrackHit stereoHit : stereoHits){
-            	if(layer == stereoHit.Layer()){
-            		if(debug) System.out.println(this.getClass().getSimpleName() + ": Track has five layers hit");
-            		if(TrackUtils.getZ0(track) > 0){
-            			numberOfTopTracksWithHitOnMissingLayer++;
-            			topTracksWithHitOnMissingLayer[arrayPosition]++;
-            		} else {
-            			numberOfBottomTracksWithHitOnMissingLayer++;
-            			bottomTracksWithHitOnMissingLayer[arrayPosition]++;
-            		}
-            		if(enableMomentumPlots)
-            			aida.histogram1D("Track Momentum - Tracks With All Layers Hit").fill(momentum);
-            		if(enableChiSquaredPlots)
-            			aida.histogram1D("Chi Squared - Tracks With All Layers Hit").fill(track.getChi2());
-            		
-            		return;
-            	}
-            }
-            
-	      	int layerNumber = (layer - 1)/2 + 1;
-    		if(enableTrackPositionPlots){
-            	String title = "Track Position - Layer " + layerNumber + " - Difference";
-            	//aida.histogram2D(title).fill(trackPos.y(), trackPos.z());
+                if(layer == stereoHit.Layer()){
+                    if(debug) System.out.println(this.getClass().getSimpleName() + ": Track has five layers hit");
+                    if(TrackUtils.getZ0(track) > 0){
+                        numberOfTopTracksWithHitOnMissingLayer++;
+                        topTracksWithHitOnMissingLayer[arrayPosition]++;
+                    } else {
+                        numberOfBottomTracksWithHitOnMissingLayer++;
+                        bottomTracksWithHitOnMissingLayer[arrayPosition]++;
+                    }
+                    if(enableMomentumPlots)
+                        aida.histogram1D("Track Momentum - Tracks With All Layers Hit").fill(momentum);
+                    if(enableChiSquaredPlots)
+                        aida.histogram1D("Chi Squared - Tracks With All Layers Hit").fill(track.getChi2());
+                    
+                    return;
+                }
+            }*/
+            
+            /*int layerNumber = (layer - 1)/2 + 1;
+            if(enableTrackPositionPlots){
+                String title = "Track Position - Layer " + layerNumber + " - Difference";
+                //aida.histogram2D(title).fill(trackPos.y(), trackPos.z());
                 aida.cloud2D(title).fill(frontTrackPos.y(), frontTrackPos.z());
 
                 title = "Track Position - Layer " + layerNumber + " - Tracks With All Layers Hit";
                 //aida.histogram2D(title).fill(trackPos.y(), trackPos.z());
                 aida.cloud2D(title).fill(frontTrackPos.y(), frontTrackPos.z());
             }
-    		
-    		List<SiSensor> sensors = new ArrayList<SiSensor>();
-    		if(TrackUtils.getZ0(track) > 0){
-    			//sensors.add(SvtUtils.getInstance().getTopSensor(layer, 0));
-        		//sensors.add(SvtUtils.getInstance().getTopSensor(layer+1, 0));
-    		} else { 
-    			//sensors.add(SvtUtils.getInstance().getBottomSensor(layer, 0));
-        		//sensors.add(SvtUtils.getInstance().getBottomSensor(layer+1, 0));
-    		}
-    		//aida.histogram1D(SvtUtils.getInstance().getDescription(sensors.get(0)) + " - Occupancy").fill(this.findIntersectingChannel(frontTrackPos, sensors.get(0)));
+            
+            List<SiSensor> sensors = new ArrayList<SiSensor>();
+            if(TrackUtils.getZ0(track) > 0){
+                //sensors.add(SvtUtils.getInstance().getTopSensor(layer, 0));
+                //sensors.add(SvtUtils.getInstance().getTopSensor(layer+1, 0));
+            } else { 
+                //sensors.add(SvtUtils.getInstance().getBottomSensor(layer, 0));
+                //sensors.add(SvtUtils.getInstance().getBottomSensor(layer+1, 0));
+            }
+            //aida.histogram1D(SvtUtils.getInstance().getDescription(sensors.get(0)) + " - Occupancy").fill(this.findIntersectingChannel(frontTrackPos, sensors.get(0)));
             //aida.histogram1D(SvtUtils.getInstance().getDescription(sensors.get(1)) + " - Occupancy").fill(this.findIntersectingChannel(rearTrackPos, sensors.get(1)));
-    		
+            
            if(debug)
-        	   System.out.println(this.getClass().getSimpleName() + ": Stereo hit was not found.");
-        }
-    }
-    
-    private int findMissingFitLayer(List<TrackerHit> trkHits){
-        int[] layer = new int[5];
-        for(TrackerHit trkHit : trkHits){
-            HelicalTrackHit stereoHit = (HelicalTrackHit) trkHit;
-            int arrayPosition = (stereoHit.Layer() - 1)/2;
-            layer[arrayPosition]++;
-        }
-        
-        for(int index = 0; index < layer.length; index++){
-            if(layer[index] == 0) return (2*index + 1);
+               System.out.println(this.getClass().getSimpleName() + ": Stereo hit was not found.");*/
+        }
+    }
+    
+    /**
+     *  Find which of the layers is not being used in the track fit
+     *
+     *  @param hits : List of stereo hits associated with a track
+     *  @return Layer not used in the track fit
+     */
+    private int getUnusedSvtLayer(List<TrackerHit> hits) {
+        
+        int[] svtLayer = new int[6];
+        for (TrackerHit hit : hits) {
+            HelicalTrackHit stereoHit = (HelicalTrackHit) hit;
+            int  layer = (stereoHit.Layer() - 1)/2;
+            svtLayer[layer]++;
+        }
+        
+        for(int layer = 0; layer < svtLayer.length; layer++){
+            if(svtLayer[layer] == 0) return (2*layer + 1);
         }
         
         return -1;
     }
-    
-    private boolean isWithinAcceptance(Track track, int layer){
-        
-        
-        
+   
+    /**
+     *  Check if a track lies within the acceptance of a layer.
+     *
+     */
+    // TODO: Move this to a utility class 
+    private boolean isWithinAcceptance(Track track, int layer) {
+       
+        
+
         List<HpsSiSensor> sensors = new ArrayList<HpsSiSensor>();
-        if(TrackUtils.getZ0(track) > 0){
+        /*if(TrackUtils.getZ0(track) > 0){
            //sensors.add(SvtUtils.getInstance().getTopSensor(layer, 0));
            //sensors.add(SvtUtils.getInstance().getTopSensor(layer + 1, 0));
         } else {
            //sensors.add(SvtUtils.getInstance().getBottomSensor(layer, 0));
            //sensors.add(SvtUtils.getInstance().getBottomSensor(layer + 1, 0));
-        }
+        }*/
         
         Hep3Vector frontSensorPos = sensors.get(0).getGeometry().getPosition();
         Hep3Vector rearSensorPos = sensors.get(1).getGeometry().getPosition();
@@ -393,14 +454,14 @@
         this.rearTrackPos = TrackUtils.extrapolateTrack(track,rearSensorPos.z());
         
         if(this.sensorContainsTrack(frontTrackPos, sensors.get(0)) && this.sensorContainsTrack(rearTrackPos, sensors.get(1))){
-//        	if(this.sensorContainsTrack(trackPos, sensor))
-	      	if(enableTrackPositionPlots){
-	      		int layerNumber = (layer - 1)/2 + 1;
-	      		String title = "Track Position - Layer " + layerNumber + " - Tracks Within Acceptance";
-	      		//aida.histogram2D(title).fill(trackPos.y(), trackPos.z());
-	      		aida.cloud2D(title).fill(frontTrackPos.y(), frontTrackPos.z());
-	      	}
-        	return true;
+//          if(this.sensorContainsTrack(trackPos, sensor))
+            if(enableTrackPositionPlots){
+                int layerNumber = (layer - 1)/2 + 1;
+                String title = "Track Position - Layer " + layerNumber + " - Tracks Within Acceptance";
+                //aida.histogram2D(title).fill(trackPos.y(), trackPos.z());
+                //aida.cloud2D(title).fill(frontTrackPos.y(), frontTrackPos.z());
+            }
+            return true;
         } 
         
         
@@ -411,35 +472,35 @@
      * 
      */
     public int findIntersectingChannel(Hep3Vector trackPosition, SiSensor sensor){
-		
-    	//--- Check that the track doesn't pass through a region of bad channels ---//
-		//--------------------------------------------------------------------------//
-    
-		//Rotate the track position to the JLab coordinate system
-		this.printDebug("Track position in tracking frame: " + trackPosition.toString());
-		Hep3Vector trackPositionDet = VecOp.mult(VecOp.inverse(this.trackerHitUtils.detToTrackRotationMatrix()), trackPosition);
-		this.printDebug("Track position in JLab frame " + trackPositionDet.toString());
-		// Rotate the track to the sensor coordinates
-		ITransform3D globalToLocal = sensor.getReadoutElectrodes(ChargeCarrier.HOLE).getGlobalToLocal();
-		globalToLocal.transform(trackPositionDet);
-		this.printDebug("Track position in sensor electrodes frame " + trackPositionDet.toString());
-
-		// Find the closest channel to the track position
-		double deltaY = Double.MAX_VALUE;
-		int intersectingChannel = 0;
-		for(int physicalChannel= 0; physicalChannel < 639; physicalChannel++){ 
-			/*this.printDebug(SvtUtils.getInstance().getDescription(sensor) + " : Channel " + physicalChannel 
-                	+ " : Strip Position " + stripPositions.get(sensor).get(physicalChannel));
-        	this.printDebug(SvtUtils.getInstance().getDescription(sensor) + ": Channel " + physicalChannel
-                	+ " : Delta Y: " + Math.abs(trackPositionDet.x() - stripPositions.get(sensor).get(physicalChannel).x()));*/
-			if(Math.abs(trackPositionDet.x() - stripPositions.get(sensor).get(physicalChannel).x()) < deltaY ){
-				deltaY = Math.abs(trackPositionDet.x() - stripPositions.get(sensor).get(physicalChannel).x()); 
-				intersectingChannel = physicalChannel;
-			}
-		}
-    
-		
-		return intersectingChannel;
+        
+        //--- Check that the track doesn't pass through a region of bad channels ---//
+        //--------------------------------------------------------------------------//
+    
+        //Rotate the track position to the JLab coordinate system
+        this.printDebug("Track position in tracking frame: " + trackPosition.toString());
+        Hep3Vector trackPositionDet = VecOp.mult(VecOp.inverse(this.trackerHitUtils.detToTrackRotationMatrix()), trackPosition);
+        this.printDebug("Track position in JLab frame " + trackPositionDet.toString());
+        // Rotate the track to the sensor coordinates
+        ITransform3D globalToLocal = sensor.getReadoutElectrodes(ChargeCarrier.HOLE).getGlobalToLocal();
+        globalToLocal.transform(trackPositionDet);
+        this.printDebug("Track position in sensor electrodes frame " + trackPositionDet.toString());
+
+        // Find the closest channel to the track position
+        double deltaY = Double.MAX_VALUE;
+        int intersectingChannel = 0;
+        for(int physicalChannel= 0; physicalChannel < 639; physicalChannel++){ 
+            /*this.printDebug(SvtUtils.getInstance().getDescription(sensor) + " : Channel " + physicalChannel 
+                    + " : Strip Position " + stripPositions.get(sensor).get(physicalChannel));
+            this.printDebug(SvtUtils.getInstance().getDescription(sensor) + ": Channel " + physicalChannel
+                    + " : Delta Y: " + Math.abs(trackPositionDet.x() - stripPositions.get(sensor).get(physicalChannel).x()));*/
+            /*if(Math.abs(trackPositionDet.x() - stripPositions.get(sensor).get(physicalChannel).x()) < deltaY ){
+                deltaY = Math.abs(trackPositionDet.x() - stripPositions.get(sensor).get(physicalChannel).x()); 
+                intersectingChannel = physicalChannel;
+            }*/
+        }
+    
+        
+        return intersectingChannel;
     }
 
     /**
@@ -447,64 +508,64 @@
      */
     public boolean sensorContainsTrack(Hep3Vector trackPosition, HpsSiSensor sensor){
 
-    	
-    	if(maskBadChannels){
-    		int intersectingChannel = this.findIntersectingChannel(trackPosition, sensor);
-    		if(intersectingChannel == 0 || intersectingChannel == 638) return false;
-    	    
-    		if(sensor.isBadChannel(intersectingChannel) 
-    				|| sensor.isBadChannel(intersectingChannel+1) 
-    				|| sensor.isBadChannel(intersectingChannel-1)){
-    			this.printDebug("Track intersects a bad channel!");
-    			return false;
-    		}
-    	}
+        
+        if(maskBadChannels){
+            int intersectingChannel = this.findIntersectingChannel(trackPosition, sensor);
+            if(intersectingChannel == 0 || intersectingChannel == 638) return false;
+            
+            if(sensor.isBadChannel(intersectingChannel) 
+                    || sensor.isBadChannel(intersectingChannel+1) 
+                    || sensor.isBadChannel(intersectingChannel-1)){
+                this.printDebug("Track intersects a bad channel!");
+                return false;
+            }
+        }
         
         ITransform3D localToGlobal = sensor.getGeometry().getLocalToGlobal();
-    	
+        
         Hep3Vector sensorPos = sensor.getGeometry().getPosition();   
         Box sensorSolid = (Box) sensor.getGeometry().getLogicalVolume().getSolid();
         Polygon3D sensorFace = sensorSolid.getFacesNormalTo(new BasicHep3Vector(0, 0, 1)).get(0);
         
         List<Point3D> vertices = new ArrayList<Point3D>();
         for(int index = 0; index < 4; index++){
-        	vertices.add(new Point3D());
+            vertices.add(new Point3D());
         }
         for(Point3D vertex : sensorFace.getVertices()){
             if(vertex.y() < 0 && vertex.x() > 0){
-            	localToGlobal.transform(vertex);
+                localToGlobal.transform(vertex);
                 //vertices.set(0, new Point3D(vertex.y() + sensorPos.x(), vertex.x() + sensorPos.y(), vertex.z() + sensorPos.z()));
-            	vertices.set(0, new Point3D(vertex.x(), vertex.y(), vertex.z()));
+                vertices.set(0, new Point3D(vertex.x(), vertex.y(), vertex.z()));
                 if(debug){
-                	System.out.println(this.getClass().getSimpleName() + ": Vertex 1 Position: " + vertices.get(0).toString());
-                	//System.out.println(this.getClass().getSimpleName() + ": Transformed Vertex 1 Position: " + localToGlobal.transformed(vertex).toString());
+                    System.out.println(this.getClass().getSimpleName() + ": Vertex 1 Position: " + vertices.get(0).toString());
+                    //System.out.println(this.getClass().getSimpleName() + ": Transformed Vertex 1 Position: " + localToGlobal.transformed(vertex).toString());
                 }
             } 
             else if(vertex.y() > 0 && vertex.x() > 0){
-            	localToGlobal.transform(vertex);
+                localToGlobal.transform(vertex);
                 //vertices.set(1, new Point3D(vertex.y() + sensorPos.x(), vertex.x() + sensorPos.y(), vertex.z() + sensorPos.z()));
                 vertices.set(1, new Point3D(vertex.x(), vertex.y(), vertex.z()));
                 if(debug){
                 System.out.println(this.getClass().getSimpleName() + ": Vertex 2 Position: " + vertices.get(1).toString());
-            	//System.out.println(this.getClass().getSimpleName() + ": Transformed Vertex 2 Position: " + localToGlobal.transformed(vertex).toString());
+                //System.out.println(this.getClass().getSimpleName() + ": Transformed Vertex 2 Position: " + localToGlobal.transformed(vertex).toString());
                 }
             } 
             else if(vertex.y() > 0 && vertex.x() < 0){
-            	localToGlobal.transform(vertex);
+                localToGlobal.transform(vertex);
                 //vertices.set(2, new Point3D(vertex.y() + sensorPos.x(), vertex.x() + sensorPos.y(), vertex.z() + sensorPos.z()));
                 vertices.set(2, new Point3D(vertex.x(), vertex.y(), vertex.z()));
                 if(debug){
                 System.out.println(this.getClass().getSimpleName() + ": Vertex 3 Position: " + vertices.get(2).toString());
-            	//System.out.println(this.getClass().getSimpleName() + ": Transformed Vertex 3 Position: " + localToGlobal.transformed(vertex).toString());
-            	}
+                //System.out.println(this.getClass().getSimpleName() + ": Transformed Vertex 3 Position: " + localToGlobal.transformed(vertex).toString());
+                }
             }             
             else if(vertex.y() < 0 && vertex.x() < 0){
-            	localToGlobal.transform(vertex);
+                localToGlobal.transform(vertex);
                 //vertices.set(3, new Point3D(vertex.y() + sensorPos.x(), vertex.x() + sensorPos.y(), vertex.z() + sensorPos.z()));
                 vertices.set(3, new Point3D(vertex.x(), vertex.y(), vertex.z()));
                 if(debug){
                 System.out.println(this.getClass().getSimpleName() + ": Vertex 4 Position: " + vertices.get(3).toString());
-            	//System.out.println(this.getClass().getSimpleName() + ": Transformed Vertex 4 Position: " + localToGlobal.transformed(vertex).toString());
+                //System.out.println(this.getClass().getSimpleName() + ": Transformed Vertex 4 Position: " + localToGlobal.transformed(vertex).toString());
                 }
             } 
         }
@@ -531,30 +592,30 @@
         System.out.println("%======================  Hit Efficiencies ==========================%");
         System.out.println("%===================================================================% \n%");
         if(numberOfTopTracks > 0){
-        	double topEfficiency = numberOfTopTracksWithHitOnMissingLayer/numberOfTopTracks;
-        	System.out.println("% Top Hit Efficiency: " + numberOfTopTracksWithHitOnMissingLayer + "/" + 
-        						numberOfTopTracks + " = " + topEfficiency*100 + "%");
-        	System.out.println("% Top Hit Efficiency Error: sigma poisson = " 
-        						+ topEfficiency*Math.sqrt((1/numberOfTopTracksWithHitOnMissingLayer) + (1/numberOfTopTracks))*100 + "%");
-        	System.out.println("% Top Hit Efficiency Error: sigma binomial = " 
-        						+ (1/numberOfTopTracks)*Math.sqrt(numberOfTopTracksWithHitOnMissingLayer*(1-topEfficiency))*100 + "%");
+            double topEfficiency = numberOfTopTracksWithHitOnMissingLayer/numberOfTopTracks;
+            System.out.println("% Top Hit Efficiency: " + numberOfTopTracksWithHitOnMissingLayer + "/" + 
+                                numberOfTopTracks + " = " + topEfficiency*100 + "%");
+            System.out.println("% Top Hit Efficiency Error: sigma poisson = " 
+                                + topEfficiency*Math.sqrt((1/numberOfTopTracksWithHitOnMissingLayer) + (1/numberOfTopTracks))*100 + "%");
+            System.out.println("% Top Hit Efficiency Error: sigma binomial = " 
+                                + (1/numberOfTopTracks)*Math.sqrt(numberOfTopTracksWithHitOnMissingLayer*(1-topEfficiency))*100 + "%");
         }
         if(numberOfBottomTracks > 0){
-        	double bottomEfficiency = numberOfBottomTracksWithHitOnMissingLayer/numberOfBottomTracks;
-        	System.out.println("% Bottom Hit Efficiency: " + numberOfBottomTracksWithHitOnMissingLayer + "/" 
-        						+ numberOfBottomTracks + " = " + bottomEfficiency*100 + "%");
-        	System.out.println("% Bottom Hit Efficiency Error: sigma poisson= " 
-        						+ bottomEfficiency*Math.sqrt((1/numberOfBottomTracksWithHitOnMissingLayer) + (1/numberOfBottomTracks))*100 + "%");
-        	System.out.println("% Top Hit Efficiency Error: sigma binomial = " 
-								+ (1/numberOfBottomTracks)*Math.sqrt(numberOfBottomTracksWithHitOnMissingLayer*(1-bottomEfficiency))*100 + "%");
+            double bottomEfficiency = numberOfBottomTracksWithHitOnMissingLayer/numberOfBottomTracks;
+            System.out.println("% Bottom Hit Efficiency: " + numberOfBottomTracksWithHitOnMissingLayer + "/" 
+                                + numberOfBottomTracks + " = " + bottomEfficiency*100 + "%");
+            System.out.println("% Bottom Hit Efficiency Error: sigma poisson= " 
+                                + bottomEfficiency*Math.sqrt((1/numberOfBottomTracksWithHitOnMissingLayer) + (1/numberOfBottomTracks))*100 + "%");
+            System.out.println("% Top Hit Efficiency Error: sigma binomial = " 
+                                + (1/numberOfBottomTracks)*Math.sqrt(numberOfBottomTracksWithHitOnMissingLayer*(1-bottomEfficiency))*100 + "%");
         }
 /*        for(int index = 0; index < topTracksWithHitOnMissingLayer.length; index++){
-        	if(topTracksPerMissingLayer[index] > 0)
-        		System.out.println("% Top Layer " + (index+1) + ": " + (topTracksWithHitOnMissingLayer[index]/topTracksPerMissingLayer[index])*100 + "%");
+            if(topTracksPerMissingLayer[index] > 0)
+                System.out.println("% Top Layer " + (index+1) + ": " + (topTracksWithHitOnMissingLayer[index]/topTracksPerMissingLayer[index])*100 + "%");
         }
         for(int index = 0; index < bottomTracksWithHitOnMissingLayer.length; index++){
-        	if(bottomTracksPerMissingLayer[index] > 0)
-        		System.out.println("% Bottom Layer " + (index+1) + ": " + (bottomTracksWithHitOnMissingLayer[index]/bottomTracksPerMissingLayer[index])*100 + "%");
+            if(bottomTracksPerMissingLayer[index] > 0)
+                System.out.println("% Bottom Layer " + (index+1) + ": " + (bottomTracksWithHitOnMissingLayer[index]/bottomTracksPerMissingLayer[index])*100 + "%");
         }*/
         System.out.println("% \n%===================================================================%");
     }

Modified: java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/omoreno/SvtTrackAnalysis.java
 =============================================================================
--- java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/omoreno/SvtTrackAnalysis.java	(original)
+++ java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/omoreno/SvtTrackAnalysis.java	Fri Jun 12 15:27:10 2015
@@ -1,43 +1,69 @@
 package org.hps.users.omoreno;
 
-//--- java ---//
-//--- hep ---//
-import hep.aida.IPlotter;
-import hep.physics.vec.Hep3Vector;
-
-import java.util.ArrayList;
+import java.io.IOException;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-
+import java.util.Set;
+
+import hep.aida.IAnalysisFactory;
+import hep.aida.IHistogramFactory;
+import hep.aida.IPlotterFactory;
+import hep.aida.IPlotter;
+import hep.aida.IHistogram1D;
+import hep.aida.ITree;
+import hep.aida.ref.rootwriter.RootFileStore;
+
+import org.lcsim.detector.tracker.silicon.HpsSiSensor;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.LCRelation;
+import org.lcsim.event.RawTrackerHit;
+import org.lcsim.event.RelationalTable;
+import org.lcsim.event.Track;
+import org.lcsim.event.TrackerHit;
+import org.lcsim.event.base.BaseRelationalTable;
+import org.lcsim.geometry.Detector;
+import org.lcsim.util.Driver;
+
+import org.hps.recon.tracking.FittedRawTrackerHit;
 import org.hps.recon.tracking.TrackUtils;
-import org.lcsim.event.Cluster;
-//--- org.lcsim ---//
-import org.lcsim.event.EventHeader;
-import org.lcsim.event.RawTrackerHit;
-import org.lcsim.event.Track;
-import org.lcsim.geometry.Detector;
-import org.lcsim.recon.tracking.digitization.sisim.SiTrackerHitStrip1D;
-import org.lcsim.recon.tracking.seedtracker.SeedTrack;
-import org.lcsim.util.Driver;
-import org.lcsim.util.aida.AIDA;
-//--- hps-java ---//
 
 /**
  * 
- * @author Omar Moreno
- * @version $Id: SvtTrackAnalysis.java,v 1.7 2013/11/06 19:19:55 jeremy Exp $
+ * @author Omar Moreno <[log in to unmask]>
  *
  */
-
 public class SvtTrackAnalysis extends Driver {
-	
+
+    // Use JFreeChart as the default plotting backend
+    static { 
+        hep.aida.jfree.AnalysisFactory.register();
+    }
+
+    // Plotting
+    ITree tree; 
+    IHistogramFactory histogramFactory; 
+    IPlotterFactory plotterFactory = IAnalysisFactory.create().createPlotterFactory();
+    protected Map<String, IPlotter> plotters = new HashMap<String, IPlotter>();
+    private Map<String, IHistogram1D> trackPlots = new HashMap<String, IHistogram1D>();
+	private Map<String, IHistogram1D> clusterChargePlots = new HashMap<String, IHistogram1D>();
+	private Map<String, IHistogram1D> clusterSizePlots = new HashMap<String, IHistogram1D>();
+
+    private List<HpsSiSensor> sensors;
+    private Map<RawTrackerHit, LCRelation> fittedRawTrackerHitMap 
+        = new HashMap<RawTrackerHit, LCRelation>();
+    
+    // Detector name
+    private static final String SUBDETECTOR_NAME = "Tracker";
+    
+    // Collections
     private String trackCollectionName = "MatchedTracks";
-    private String stripHitCollectionName = "StripClusterer_SiTrackerHitStrip1D";
-	private AIDA aida;
-	private List<IPlotter> plotters = new ArrayList<IPlotter>();
+    private String stereoHitRelationsColName = "HelicalTrackHitRelations";
+    private String fittedHitsCollectionName = "SVTFittedRawTrackerHits";
+    private String rotatedHthRelationsColName = "RotatedHelicalTrackHitRelations";
+
+    private int runNumber = -1; 
     
-	
 	int npositive = 0;
 	int nnegative = 0;
 	double ntracks = 0;
@@ -45,21 +71,133 @@
 	double ntracksBottom = 0;
 	double nTwoTracks = 0;
 	double nevents = 0;
-	
-	
+
+	double d0Cut = -9999;
+	
+	// Flags 
+	boolean electronCut = false;
+	boolean positronCut = false;
+	
+    /**
+     *  Default Constructor
+     */    
 	public SvtTrackAnalysis(){
 	}
-
+	
+	public void setEnableElectronCut(boolean electronCut) {
+	    this.electronCut = electronCut;
+	}
+
+	public void setEnablePositronCut(boolean positronCut) {
+	    this.positronCut = positronCut;
+	}
+
+	public void setD0Cut(double d0Cut) {
+	   this.d0Cut = d0Cut; 
+	}
+	
+	private int computePlotterRegion(HpsSiSensor sensor) {
+
+		if (sensor.getLayerNumber() < 7) {
+			if (sensor.isTopLayer()) {
+				return 6*(sensor.getLayerNumber() - 1); 
+			} else { 
+				return 6*(sensor.getLayerNumber() - 1) + 1;
+			} 
+		} else { 
+		
+			if (sensor.isTopLayer()) {
+				if (sensor.getSide() == HpsSiSensor.POSITRON_SIDE) {
+					return 6*(sensor.getLayerNumber() - 7) + 2;
+				} else { 
+					return 6*(sensor.getLayerNumber() - 7) + 3;
+				}
+			} else if (sensor.isBottomLayer()) {
+				if (sensor.getSide() == HpsSiSensor.POSITRON_SIDE) {
+					return 6*(sensor.getLayerNumber() - 7) + 4;
+				} else {
+					return 6*(sensor.getLayerNumber() - 7) + 5;
+				}
+			}
+		}
+		return -1; 
+    }
+	
 	protected void detectorChanged(Detector detector){
-		
-		aida = AIDA.defaultInstance();
-		aida.tree().cd("/");
-		
-		int nPlotters = 0;
-		
+	
+        tree = IAnalysisFactory.create().createTreeFactory().create();
+        histogramFactory = IAnalysisFactory.create().createHistogramFactory(tree);
+        
+        // Get the HpsSiSensor objects from the tracker detector element
+        sensors = detector.getSubdetector(SUBDETECTOR_NAME)
+                          .getDetectorElement().findDescendants(HpsSiSensor.class);
+   
+        // If the detector element had no sensors associated with it, throw
+        // an exception
+        if (sensors.size() == 0) {
+            throw new RuntimeException("No sensors were found in this detector.");
+        }
+
+        plotters.put("Event Information", plotterFactory.create("Event information"));
+        plotters.get("Event Information").createRegions(2, 3);
+
+        trackPlots.put("Number of tracks", histogramFactory.createHistogram1D("Number of tracks", 10, 0, 10));
+        plotters.get("Event Information").region(0).plot(trackPlots.get("Number of tracks"));
+
+        trackPlots.put("Track charge", histogramFactory.createHistogram1D("Track charge", 3, -1, 2));
+        plotters.get("Event Information").region(1).plot(trackPlots.get("Track charge"));
+
+        trackPlots.put("chi2", histogramFactory.createHistogram1D("chi2", 40, 0, 40));    
+        plotters.get("Event Information").region(2).plot(trackPlots.get("chi2"));
+
+        plotters.put("Track Parameters", plotterFactory.create("Track Parameters"));
+        plotters.get("Track Parameters").createRegions(3, 3);
+
+        trackPlots.put("doca", histogramFactory.createHistogram1D("doca", 80, -10, 10));         
+        plotters.get("Track Parameters").region(0).plot(trackPlots.get("doca")); 
+      
+        trackPlots.put("z0", histogramFactory.createHistogram1D("z0", 80, -2, 2));    
+        plotters.get("Track Parameters").region(1).plot(trackPlots.get("z0"));
+
+        trackPlots.put("sin(phi0)", histogramFactory.createHistogram1D("sin(phi0)", 40, -0.2, 0.2));    
+        plotters.get("Track Parameters").region(2).plot(trackPlots.get("sin(phi0)"));
+    
+        trackPlots.put("curvature", histogramFactory.createHistogram1D("curvature", 50, -0.001, 0.001));    
+        plotters.get("Track Parameters").region(3).plot(trackPlots.get("curvature"));
+
+        trackPlots.put("tan_lambda", histogramFactory.createHistogram1D("tan_lambda", 100, -0.1, 0.1));    
+        plotters.get("Track Parameters").region(4).plot(trackPlots.get("tan_lambda"));
+
+        trackPlots.put("cos(theta)", histogramFactory.createHistogram1D("cos(theta)", 40, -0.1, 0.1));
+        plotters.get("Track Parameters").region(5).plot(trackPlots.get("cos(theta)"));
+        
+        trackPlots.put("cluster time dt", histogramFactory.createHistogram1D("cluster time dt", 100, -20, 20));
+        plotters.get("Track Parameters").region(6).plot(trackPlots.get("cluster time dt"));
+       
+        plotters.put("Cluster Amplitude", plotterFactory.create("Cluster Amplitude"));
+        plotters.get("Cluster Amplitude").createRegions(6, 6);
+        
+        plotters.put("Cluster Size", plotterFactory.create("Cluster Size"));
+        plotters.get("Cluster Size").createRegions(6, 6);
+        
+        
+        for (HpsSiSensor sensor : sensors) { 
+       
+            clusterChargePlots.put(sensor.getName(), 
+                    histogramFactory.createHistogram1D(sensor.getName() + " - Cluster Charge", 100, 0, 5000));
+            plotters.get("Cluster Amplitude").region(this.computePlotterRegion(sensor))
+                                             .plot(clusterChargePlots.get(sensor.getName()));
+            
+            clusterSizePlots.put(sensor.getName(),
+                    histogramFactory.createHistogram1D(sensor.getName() + " - Cluster Size", 10, 0, 10));
+            plotters.get("Cluster Size").region(this.computePlotterRegion(sensor))
+                                                .plot(clusterSizePlots.get(sensor.getName()));
+            
+        }
+
 		//--- Track Extrapolation ---//
 		//---------------------------//	
-		plotters.add(aida.analysisFactory().createPlotterFactory().create("Track Position at Ecal"));
+		/*plotters.add(aida.analysisFactory().createPlotterFactory().create("Track Position at Ecal"));
 		plotters.get(nPlotters).region(0).plot(aida.histogram2D("Track Position at Ecal", 200, -350, 350, 200, -100, 100));
 		plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap");
     	plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
@@ -74,29 +212,29 @@
         plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
 		nPlotters++;
 
-        plotters.add(aida.analysisFactory().createPlotterFactory().create("Track Position at Ecal: Curvature < 0"));
-        plotters.get(nPlotters).region(0).plot(aida.histogram2D("Track Position at Ecal: Curvature < 0",200, -350, 350, 200, -100, 100));
-		plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap");
-    	plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
-        plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
-		nPlotters++;
-		
-        plotters.add(aida.analysisFactory().createPlotterFactory().create("Track Position at Harp: Curvature < 0"));
-        plotters.get(nPlotters).region(0).plot(aida.histogram2D("Track Position at Harp: Curvature < 0", 200, -200, 200, 100, -50, 50));
-		plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap");
-    	plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
-        plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
-		nPlotters++;
-		
-        plotters.add(aida.analysisFactory().createPlotterFactory().create("Track Position at Ecal: Curvature > 0"));
-        plotters.get(nPlotters).region(0).plot(aida.histogram2D("Track Position at Ecal: Curvature > 0", 200, -350, 350, 200, -100, 100));
-		plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap");
-    	plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
-        plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
-		nPlotters++;
-		
-        plotters.add(aida.analysisFactory().createPlotterFactory().create("Track Position at Harp: Curvature > 0"));
-        plotters.get(nPlotters).region(0).plot(aida.histogram2D("Track Position at Harp: Curvature > 0", 200, -200, 200, 100, -50, 50));
+        plotters.add(aida.analysisFactory().createPlotterFactory().create("Track Position at Ecal: curvature < 0"));
+        plotters.get(nPlotters).region(0).plot(aida.histogram2D("Track Position at Ecal: curvature < 0",200, -350, 350, 200, -100, 100));
+		plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap");
+    	plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+        plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
+		nPlotters++;
+		
+        plotters.add(aida.analysisFactory().createPlotterFactory().create("Track Position at Harp: curvature < 0"));
+        plotters.get(nPlotters).region(0).plot(aida.histogram2D("Track Position at Harp: curvature < 0", 200, -200, 200, 100, -50, 50));
+		plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap");
+    	plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+        plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
+		nPlotters++;
+		
+        plotters.add(aida.analysisFactory().createPlotterFactory().create("Track Position at Ecal: curvature > 0"));
+        plotters.get(nPlotters).region(0).plot(aida.histogram2D("Track Position at Ecal: curvature > 0", 200, -350, 350, 200, -100, 100));
+		plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap");
+    	plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+        plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
+		nPlotters++;
+		
+        plotters.add(aida.analysisFactory().createPlotterFactory().create("Track Position at Harp: curvature > 0"));
+        plotters.get(nPlotters).region(0).plot(aida.histogram2D("Track Position at Harp: curvature > 0", 200, -200, 200, 100, -50, 50));
 		plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap");
     	plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
         plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
@@ -118,44 +256,6 @@
 		nPlotters++;
 		
         
-        //--- Track Parameters ---//
-        //------------------------//
-        plotters.add(aida.analysisFactory().createPlotterFactory().create("DOCA"));
-        plotters.get(nPlotters).region(0).plot(aida.histogram1D("DOCA", 120, 0, 120));
-        plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
-        plotters.get(nPlotters).style().dataStyle().errorBarStyle().setVisible(false);
-		nPlotters++;
-        
-        plotters.add(aida.analysisFactory().createPlotterFactory().create("Z0"));
-        plotters.get(nPlotters).region(0).plot(aida.histogram1D("Z0", 120, 0, 120));
-        plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
-        plotters.get(nPlotters).style().dataStyle().errorBarStyle().setVisible(false);
-		nPlotters++;
-        
-        plotters.add(aida.analysisFactory().createPlotterFactory().create("phi0"));
-        plotters.get(nPlotters).region(0).plot(aida.histogram1D("phi0", 50, -Math.PI, Math.PI));
-        plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
-        plotters.get(nPlotters).style().dataStyle().errorBarStyle().setVisible(false);
-		nPlotters++;
-        
-        plotters.add(aida.analysisFactory().createPlotterFactory().create("Curvature"));
-        plotters.get(nPlotters).region(0).plot(aida.histogram1D("R", 200, -10, 10));
-        plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
-        plotters.get(nPlotters).style().dataStyle().errorBarStyle().setVisible(false);
-		nPlotters++;
-        
-        plotters.add(aida.analysisFactory().createPlotterFactory().create("Tan(Lambda)"));
-        plotters.get(nPlotters).region(0).plot(aida.histogram1D("Tan(Lambda)", 100, 0, 1));
-        plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
-        plotters.get(nPlotters).style().dataStyle().errorBarStyle().setVisible(false);
-		nPlotters++;
-		
-        plotters.add(aida.analysisFactory().createPlotterFactory().create("ChiSquared"));
-        plotters.get(nPlotters).region(0).plot(aida.histogram1D("ChiSquared", 100, 0, 100));
-        plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
-        plotters.get(nPlotters).style().dataStyle().errorBarStyle().setVisible(false);
-		nPlotters++;
-		
         //--- Momentum ---//
         //----------------//
         plotters.add(aida.analysisFactory().createPlotterFactory().create("Px"));
@@ -239,36 +339,156 @@
     	plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
         plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
 		nPlotters++;
-		
-		for(IPlotter plotter : plotters) plotter.show();
+		*/
+		for (IPlotter plotter : plotters.values()) { 
+			plotter.show();
+		}
 	}
 	
-	public void process(EventHeader event){
+	@SuppressWarnings({ "unchecked", "rawtypes" })
+    public void process(EventHeader event){
 		nevents++;
-		
-		if(event.hasCollection(SiTrackerHitStrip1D.class, stripHitCollectionName)){
-			
-			System.out.println("Found Strip Hits!");
-			List<SiTrackerHitStrip1D> stripHits = event.get(SiTrackerHitStrip1D.class, stripHitCollectionName);
-			short[] samples = new short[6];
-			for(SiTrackerHitStrip1D stripHit : stripHits){
-				for(RawTrackerHit rawHit : stripHit.getRawHits()){
-					for(int index = 0; index < samples.length; index++){
-						samples[index] += rawHit.getADCValues()[index];
-					}
-				}
-			}
-		}
-				
+
+		// Get the run number from the event
+        if (runNumber == -1) runNumber = event.getRunNumber();
+		
+        // If the event doesn't have any tracks, skip it    
 		if(!event.hasCollection(Track.class, trackCollectionName)) return;
-    	List<SeedTrack> tracks = event.get(SeedTrack.class, trackCollectionName);
-    	
-    	Map<Hep3Vector,SeedTrack> trackToEcalPosition = new HashMap<Hep3Vector, SeedTrack>();
-     	Map<SeedTrack, Cluster> trackToCluster = new HashMap<SeedTrack, Cluster>();
-    	List<Hep3Vector> ecalPos = new ArrayList<Hep3Vector>();
-    	
-    	for(SeedTrack track : tracks){
-    		ntracks++;
+    	
+        // Get the collection of tracks from the event
+        List<Track> tracks = event.get(Track.class, trackCollectionName);
+        
+        // Get the collection of LCRelations between a stereo hit and the strips making it up
+        List<LCRelation> stereoHitRelations = event.get(LCRelation.class, stereoHitRelationsColName);
+        BaseRelationalTable stereoHitToClusters = new BaseRelationalTable(RelationalTable.Mode.MANY_TO_MANY, RelationalTable.Weighting.UNWEIGHTED);
+        for (LCRelation relation : stereoHitRelations) { 
+            if (relation != null && relation.getFrom() != null && relation.getTo() != null) {
+                stereoHitToClusters.add(relation.getFrom(), relation.getTo());
+            }
+        }
+        
+        // Get the collection of LCRelations relating RotatedHelicalTrackHits to
+        // HelicalTrackHits
+        List<LCRelation> rotatedHthToHthRelations = event.get(LCRelation.class, rotatedHthRelationsColName);
+        BaseRelationalTable hthToRotatedHth = new BaseRelationalTable(RelationalTable.Mode.ONE_TO_ONE, RelationalTable.Weighting.UNWEIGHTED);
+        for (LCRelation relation : rotatedHthToHthRelations) {
+            if (relation != null && relation.getFrom() != null && relation.getTo() != null) {
+                hthToRotatedHth.add(relation.getFrom(), relation.getTo());
+            }
+        }
+        
+        // Get the list of fitted hits from the event
+        List<LCRelation> fittedHits = event.get(LCRelation.class, fittedHitsCollectionName);
+        
+        // Map the fitted hits to their corresponding raw hits
+        this.mapFittedRawHits(fittedHits);
+       
+        trackPlots.get("Number of tracks").fill(tracks.size());
+        
+        // Loop over all of the tracks in the event
+    	for(Track track : tracks){
+    	    
+    	    if (TrackUtils.getR(track) < 0 && electronCut) continue;
+    	    
+    	    if (TrackUtils.getR(track) > 0 && positronCut) continue;
+    	    
+    	    if (d0Cut != -9999 && Math.abs(TrackUtils.getDoca(track)) < d0Cut) continue;
+    	    
+    	    trackPlots.get("Track charge").fill(TrackUtils.getR(track), 1);
+    
+    	    // Fill the track parameter plots
+            trackPlots.get("doca").fill(TrackUtils.getDoca(track));
+            trackPlots.get("z0").fill(TrackUtils.getZ0(track));
+            trackPlots.get("sin(phi0)").fill(TrackUtils.getPhi0(track));
+            trackPlots.get("curvature").fill(TrackUtils.getR(track));
+            trackPlots.get("tan_lambda").fill(TrackUtils.getTanLambda(track));
+            trackPlots.get("cos(theta)").fill(TrackUtils.getCosTheta(track));
+            trackPlots.get("chi2").fill(track.getChi2());
+
+            for (TrackerHit rotatedStereoHit : track.getTrackerHits()) { 
+             
+                // Get the HelicalTrackHit corresponding to the RotatedHelicalTrackHit
+                // associated with a track
+                Set<TrackerHit> clusters = stereoHitToClusters.allFrom(hthToRotatedHth.from(rotatedStereoHit));
+                
+                int clusterIndex = 0;
+                double clusterTimeDt = 0;
+                for (TrackerHit cluster : clusters) { 
+                    
+                    if (clusterIndex == 0) { 
+                        clusterTimeDt += cluster.getTime();
+                        clusterIndex++;
+                    } else { 
+                        clusterTimeDt -= cluster.getTime();
+                    }
+                    
+                    double amplitude = 0;
+                    HpsSiSensor sensor = null;
+                    for (Object rawHitObject : cluster.getRawHits()) {
+                        RawTrackerHit rawHit = (RawTrackerHit) rawHitObject; 
+                        
+                        sensor = (HpsSiSensor) rawHit.getDetectorElement();
+                        
+                        // Get the channel of the raw hit
+                        //int channel = rawHit.getIdentifierFieldValue("strip");
+                
+                        // Add the amplitude of that channel to the total amplitude
+                        amplitude += FittedRawTrackerHit.getAmp(this.getFittedHit(rawHit));
+                    }
+                    
+                    clusterChargePlots.get(sensor.getName()).fill(amplitude);
+                    clusterSizePlots.get(sensor.getName()).fill(cluster.getRawHits().size());
+                }
+                
+                trackPlots.get("cluster time dt").fill(clusterTimeDt);
+            }
+        }
+    }
+	
+	public void endOfData() { 
+        
+        String rootFile = "run" + runNumber + "_track_analysis.root";
+        RootFileStore store = new RootFileStore(rootFile);
+        try {
+            store.open();
+            store.add(tree);
+            store.close(); 
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     *  Method that creates a map between a fitted raw hit and it's corresponding raw fit
+     *  
+     * @param fittedHits : List of fitted hits to map
+     */
+    private void mapFittedRawHits(List<LCRelation> fittedHits) { 
+        
+        // Clear the fitted raw hit map of old values
+        fittedRawTrackerHitMap.clear();
+       
+        // Loop through all fitted hits and map them to their corresponding raw hits
+        for (LCRelation fittedHit : fittedHits) { 
+            fittedRawTrackerHitMap.put(FittedRawTrackerHit.getRawTrackerHit(fittedHit), fittedHit);
+        }
+    }
+	
+    /**
+     * 
+     * @param rawHit
+     * @return
+     */
+    private LCRelation getFittedHit(RawTrackerHit rawHit) { 
+        return fittedRawTrackerHitMap.get(rawHit);
+    }
+}
+
+
+
+
+            /*
+            ntracks++;
     		Hep3Vector positionEcal = TrackUtils.getTrackPositionAtEcal(track);
     		System.out.println("Position at Ecal: " + positionEcal);
     		Hep3Vector positionConverter = TrackUtils.extrapolateTrack(track,-700);
@@ -278,29 +498,25 @@
 
     		if(positionEcal.z() > 0 ) ntracksTop++;
     		else if(positionEcal.z() < 0) ntracksBottom++;
-    		
-    		
-    		aida.histogram1D("DOCA").fill(TrackUtils.getDoca(track));
-    		aida.histogram1D("Z0").fill(TrackUtils.getZ0(track));
-    		aida.histogram1D("phi0").fill(TrackUtils.getPhi0(track));
-    		aida.histogram1D("R").fill((1/TrackUtils.getR(track))*1000);
-    		aida.histogram1D("Tan(Lambda)").fill(TrackUtils.getTanLambda(track));
-    		
+            */
+    		
+    	
+            /*    
     		aida.histogram1D("Px").fill(track.getTrackStates().get(0).getMomentum()[0]);
     		aida.histogram1D("Py").fill(track.getTrackStates().get(0).getMomentum()[1]);
     		aida.histogram1D("Pz").fill(track.getTrackStates().get(0).getMomentum()[2]);
     		aida.histogram1D("ChiSquared").fill(track.getChi2());
     		
     		if(Math.signum(TrackUtils.getR(track)) < 0){
-    			aida.histogram2D("Track Position at Ecal: Curvature < 0").fill(positionEcal.y(), positionEcal.z());
-    			aida.histogram2D("Track Position at Harp: Curvature < 0").fill(positionConverter.y(), positionConverter.z());
+    			aida.histogram2D("Track Position at Ecal: curvature < 0").fill(positionEcal.y(), positionEcal.z());
+    			aida.histogram2D("Track Position at Harp: curvature < 0").fill(positionConverter.y(), positionConverter.z());
         		aida.histogram1D("Px: C < 0").fill(track.getTrackStates().get(0).getMomentum()[0]);
         		aida.histogram1D("Py: C < 0").fill(track.getTrackStates().get(0).getMomentum()[1]);
         		aida.histogram1D("Pz: C < 0").fill(track.getTrackStates().get(0).getMomentum()[2]);
         		nnegative++;
     		} else if(Math.signum(TrackUtils.getR(track)) > 0){
-    			aida.histogram2D("Track Position at Ecal: Curvature > 0").fill(positionEcal.y(), positionEcal.z());
-    			aida.histogram2D("Track Position at Harp: Curvature > 0").fill(positionConverter.y(), positionConverter.z());
+    			aida.histogram2D("Track Position at Ecal: curvature > 0").fill(positionEcal.y(), positionEcal.z());
+    			aida.histogram2D("Track Position at Harp: curvature > 0").fill(positionConverter.y(), positionConverter.z());
         		aida.histogram1D("Px: C > 0").fill(track.getTrackStates().get(0).getMomentum()[0]);
         		aida.histogram1D("Px: C > 0").fill(track.getTrackStates().get(0).getMomentum()[1]);
         		aida.histogram1D("Px: C > 0").fill(track.getTrackStates().get(0).getMomentum()[2]);
@@ -338,9 +554,9 @@
     		aida.histogram2D("XY Difference between Ecal Cluster and Track Position").fill(xdiff, ydiff);
     	}
     	
-    	for(Map.Entry<SeedTrack, Cluster> entry : trackToCluster.entrySet()){
+    	for(Map.Entry<Track, Cluster> entry : trackToCluster.entrySet()){
     		double Energy = entry.getValue().getEnergy();
-    		SeedTrack track = entry.getKey();
+    		Track track = entry.getKey();
     		double pTotal = Math.sqrt(track.getTrackStates().get(0).getMomentum()[0]*track.getTrackStates().get(0).getMomentum()[0] + track.getTrackStates().get(0).getMomentum()[1]*track.getTrackStates().get(0).getMomentum()[1] + track.getTrackStates().get(0).getMomentum()[2]*track.getTrackStates().get(0).getMomentum()[2]);
     		
     		double ep = Energy/(pTotal*1000);
@@ -368,5 +584,6 @@
     	System.out.println("Number of top tracks per event: " + tracksTopRatio);
     	System.out.println("Number of bottom tracks per event: " + tracksBottomRatio);
     	System.out.println("Number of two track events: " + twoTrackRatio);
-	}
-}
+	}*/
+
+

Modified: java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/phansson/TrackingReconstructionPlots.java
 =============================================================================
--- java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/phansson/TrackingReconstructionPlots.java	(original)
+++ java/branches/HPSJAVA-488/users/src/main/java/org/hps/users/phansson/TrackingReconstructionPlots.java	Fri Jun 12 15:27:10 2015
@@ -7,24 +7,38 @@
 import hep.aida.IPlotterStyle;
 import hep.aida.IProfile;
 import hep.physics.matrix.SymmetricMatrix;
+import hep.physics.vec.BasicHep3Vector;
 import hep.physics.vec.Hep3Vector;
+
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+
+import org.apache.commons.lang3.tuple.Pair;
+import org.hps.readout.ecal.FADCEcalReadoutDriver.PulseShape;
 import org.hps.recon.tracking.BeamlineConstants;
 import org.hps.recon.tracking.DumbShaperFit;
+import org.hps.recon.tracking.FittedRawTrackerHit;
 import org.hps.recon.tracking.HelixConverter;
-import org.hps.recon.tracking.PulseShape;
 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.hps.recon.tracking.gbl.HelicalTrackStripGbl;
+import org.hps.recon.tracking.gbl.HpsGblRefitter;
+import org.hps.util.BasicLogFormatter;
+import org.lcsim.constants.Constants;
+import org.lcsim.detector.IDetectorElement;
 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.LCRelation;
 import org.lcsim.event.RawTrackerHit;
 import org.lcsim.event.Track;
 import org.lcsim.event.TrackerHit;
@@ -41,16 +55,19 @@
 import org.lcsim.recon.tracking.seedtracker.SeedTrack;
 import org.lcsim.util.Driver;
 import org.lcsim.util.aida.AIDA;
+import org.lcsim.util.log.LogUtil;
 
 /**
  *
- * @author mgraham
+ * @author phansson
  */
 public class TrackingReconstructionPlots extends Driver {
 
-    //private AIDAFrame plotterFrame;
-    //private AIDAFrame topFrame;
-    //private AIDAFrame bottomFrame;
+    static {
+        hep.aida.jfree.AnalysisFactory.register();
+    }
+
+    
     private AIDA aida = AIDA.defaultInstance();
     private String rawTrackerHitCollectionName = "SVTRawTrackerHits";
     private String fittedTrackerHitCollectionName = "SVTFittedRawTrackerHits";
@@ -62,51 +79,64 @@
     private String trackerName = "Tracker";
     String ecalSubdetectorName = "Ecal";
     String ecalCollectionName = "EcalClusters";
-    private Detector detector = null;
     IDDecoder dec;
-    private int eventCount;
-    private List<SiSensor> sensors;
     private String outputPlots = null;
     IPlotter plotter;
     IPlotter plotter2;
     IPlotter plotter22;
+    IPlotter plotter2221;
+    IPlotter plotter2222;
     IPlotter plotter222;
+    IPlotter plotter22299;
+    IPlotter plotter22298;
+    IPlotter plotter2224;
+    IPlotter plotter2223;
     IPlotter plotter3;
     IPlotter plotter3_1;
+    IPlotter plotter3_11;
     IPlotter plotter3_2;
     IPlotter plotter4;
     IPlotter plotter5;
     IPlotter plotter5_1;
     IPlotter plotter55;
     IPlotter plotter6;
+    IPlotter plotter66;
     IPlotter plotter7;
+    IPlotter plotter8;
+    IPlotter plotter9;
     IPlotter top1;
     IPlotter top2;
     IPlotter top3;
     IPlotter top4;
+    IPlotter top44;
     IPlotter bot1;
     IPlotter bot2;
     IPlotter bot3;
     IPlotter bot4;
-    double zEcal = 1500;
-    double zAtDownStrPairSpec = 914.0; //mm
     double zAtColl = -1500;
     IHistogram1D trkPx;
     IHistogram1D nTracks;
+    IHistogram1D nTracksTop;
+    IHistogram1D nTracksBot;
     ShaperFitAlgorithm _shaper = new DumbShaperFit();
+    HelixConverter converter = new HelixConverter(0);
+    private boolean showPlots = true;
+    private double _bfield;
+    private static Logger logger = LogUtil.create(TrackingReconstructionPlots.class, new BasicLogFormatter());
 
     @Override
     protected void detectorChanged(Detector detector) {
-        this.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");
-        sensors = detector.getSubdetector(trackerName).getDetectorElement().findDescendants(SiSensor.class);
+        List<HpsSiSensor> sensors = new ArrayList<HpsSiSensor>();
+        for(HpsSiSensor s : detector.getDetectorElement().findDescendants(HpsSiSensor.class)) {
+            if(s.getName().startsWith("module_") && s.getName().endsWith("sensor0")) {
+                sensors.add(s);
+            }
+        }
+        logger.info("Found " + sensors.size() + " SiSensors.");       
+        
+        Hep3Vector bfieldvec = detector.getFieldMap().getField(new BasicHep3Vector(0., 0., 1.));
+        _bfield = bfieldvec.y();
 
         IAnalysisFactory fac = aida.analysisFactory();
         plotter = fac.createPlotterFactory().create("HPS Tracking Plots");
@@ -119,7 +149,7 @@
 
         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 trkPz = aida.histogram1D("Track Momentum (Pz)", 25, 0, 1.5);
         IHistogram1D trkChi2 = aida.histogram1D("Track Chi2", 25, 0, 25.0);
 
         plotter.region(0).plot(trkPx);
@@ -127,7 +157,7 @@
         plotter.region(2).plot(trkPz);
         plotter.region(3).plot(trkChi2);
 
-        plotter.show();
+        if(showPlots) plotter.show();
 
 //   ******************************************************************
         top1 = fac.createPlotterFactory().create("Top Tracking Plots");
@@ -140,7 +170,7 @@
 
         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 toptrkPz = aida.histogram1D("Top Track Momentum (Pz)", 25, 0, 1.5);
         IHistogram1D toptrkChi2 = aida.histogram1D("Top Track Chi2", 25, 0, 25.0);
 
         top1.region(0).plot(toptrkPx);
@@ -148,7 +178,7 @@
         top1.region(2).plot(toptrkPz);
         top1.region(3).plot(toptrkChi2);
 
-        top1.show();
+        if(showPlots) top1.show();
 
         bot1 = fac.createPlotterFactory().create("Bottom Tracking Plots");
         bot1.setTitle("Bottom Momentum");
@@ -160,7 +190,7 @@
 
         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 bottrkPz = aida.histogram1D("Bottom Track Momentum (Pz)", 25, 0, 1.5);
         IHistogram1D bottrkChi2 = aida.histogram1D("Bottom Track Chi2", 25, 0, 25.0);
 
         bot1.region(0).plot(bottrkPx);
@@ -168,14 +198,14 @@
         bot1.region(2).plot(bottrkPz);
         bot1.region(3).plot(bottrkChi2);
 
-        bot1.show();
+        if(showPlots) bot1.show();
 
 //   ******************************************************************
-        IHistogram1D trkd0 = aida.histogram1D("d0 ", 25, -100.0, 100.0);
+        IHistogram1D trkd0 = aida.histogram1D("d0 ", 25, -10.0, 10.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);
+        IHistogram1D trkz0 = aida.histogram1D("z0 ", 25, -6.0, 6.0);
 
         plotter22 = fac.createPlotterFactory().create("HPS Track Params");
         plotter22.setTitle("Track parameters");
@@ -189,7 +219,63 @@
         plotter22.region(2).plot(trkomega);
         plotter22.region(3).plot(trklam);
         plotter22.region(4).plot(trkz0);
-
+        
+        if(showPlots) plotter22.show();
+
+ //   ******************************************************************
+
+        
+         trkd0 = aida.histogram1D("d0 Top", 25, -10.0, 10.0);
+         trkphi = aida.histogram1D("sinphi Top", 25, -0.2, 0.2);
+         trkomega = aida.histogram1D("omega Top", 25, -0.0025, 0.0025);
+         trklam = aida.histogram1D("tan(lambda) Top", 25, -0.1, 0.1);
+         trkz0 = aida.histogram1D("z0 Top", 25, -6.0, 6.0);
+
+        plotter2221 = fac.createPlotterFactory().create("HPS Track Params");
+        plotter2221.setTitle("Track parameters");
+        //plotterFrame.addPlotter(plotter22);
+        IPlotterStyle style2221 = plotter2221.style();
+        style2221.dataStyle().fillStyle().setColor("yellow");
+        style2221.dataStyle().errorBarStyle().setVisible(false);
+        plotter2221.createRegions(2, 3);
+        plotter2221.region(0).plot(trkd0);
+        plotter2221.region(1).plot(trkphi);
+        plotter2221.region(2).plot(trkomega);
+        plotter2221.region(3).plot(trklam);
+        plotter2221.region(4).plot(trkz0);
+        
+        if(showPlots) plotter2221.show();
+        
+        
+   //   ******************************************************************
+
+        
+        trkd0 = aida.histogram1D("d0 Bottom", 25, -10.0, 10.0);
+        trkphi = aida.histogram1D("sinphi Bottom", 25, -0.2, 0.2);
+        trkomega = aida.histogram1D("omega Bottom", 25, -0.0025, 0.0025);
+        trklam = aida.histogram1D("tan(lambda) Bottom", 25, -0.1, 0.1);
+        trkz0 = aida.histogram1D("z0 Bottom", 25, -6.0, 6.0);
+
+       plotter2222 = fac.createPlotterFactory().create("HPS Track Params");
+       plotter2222.setTitle("Track parameters");
+       //plotterFrame.addPlotter(plotter22);
+       IPlotterStyle style2222 = plotter2222.style();
+       style2222.dataStyle().fillStyle().setColor("yellow");
+       style2222.dataStyle().errorBarStyle().setVisible(false);
+       plotter2222.createRegions(2, 3);
+       plotter2222.region(0).plot(trkd0);
+       plotter2222.region(1).plot(trkphi);
+       plotter2222.region(2).plot(trkomega);
+       plotter2222.region(3).plot(trklam);
+       plotter2222.region(4).plot(trkz0);
+       
+       if(showPlots) plotter2222.show();
+        
+        
+        
+   //   ******************************************************************
+
+        
         plotter2 = fac.createPlotterFactory().create("HPS Tracking Plots");
         plotter2.setTitle("Track extrapolation");
         //plotterFrame.addPlotter(plotter2);
@@ -214,69 +300,204 @@
         plotter2.region(6).plot(yAtEcal);
         plotter2.region(3).plot(xAtEcal2);
         plotter2.region(7).plot(yAtEcal2);
-
+        
+        if(showPlots) plotter2.show();
+
+   //   ******************************************************************
+        
         plotter222 = fac.createPlotterFactory().create("HPS Tracking Plots");
-        plotter222.setTitle("Other");
+        plotter222.setTitle("HPS Tracking Plots");
         //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);
+        plotter222.createRegions(2, 2);
+        
+        IHistogram1D nHits = aida.histogram1D("Hits per Track", 4, 3, 7);
+        nTracks = aida.histogram1D("Tracks per Event", 3, 0, 3);
+        IHistogram1D nHitsCluster = aida.histogram1D("Hits in Cluster (HitOnTrack)", 4, 0, 4);
+
+       
+        plotter222.region(0).plot(nHits);
+        plotter222.region(1).plot(nTracks);
+        plotter222.region(2).plot(nHitsCluster);
+        
+        if(showPlots) plotter222.show();
+   
+        
+   //   ******************************************************************
+        
+        plotter22299 = fac.createPlotterFactory().create("HPS Tracking Plots Top");
+        plotter22299.setTitle("HPS Tracking Plots Top");
+        //plotterFrame.addPlotter(plotter22299);
+        IPlotterStyle style22299 = plotter22299.style();
+        style22299.dataStyle().fillStyle().setColor("yellow");
+        style22299.dataStyle().errorBarStyle().setVisible(false);
+        plotter22299.createRegions(2, 2);
+        
+        IHistogram1D nHitsTop = aida.histogram1D("Hits per Track Top", 4, 3, 7);
+        nTracksTop = aida.histogram1D("Tracks per Event Top", 3, 0, 3);
+        IHistogram1D nHitsClusterTop = aida.histogram1D("Hits in Cluster (HitOnTrack) Top", 4, 0, 4);
+
+       
+        plotter22299.region(0).plot(nHitsTop);
+        plotter22299.region(1).plot(nTracksTop);
+        plotter22299.region(2).plot(nHitsClusterTop);
+        
+        if(showPlots) plotter22299.show();
+   
+//   ******************************************************************
+        
+        plotter22298 = fac.createPlotterFactory().create("HPS Tracking Plots Bottom");
+        plotter22298.setTitle("HPS Tracking Plots Bottom");
+        //plotterFrame.addPlotter(plotter22298);
+        IPlotterStyle style22298 = plotter22298.style();
+        style22298.dataStyle().fillStyle().setColor("yellow");
+        style22298.dataStyle().errorBarStyle().setVisible(false);
+        plotter22298.createRegions(2, 2);
+        
+        IHistogram1D nHitsBot = aida.histogram1D("Hits per Track Bot", 4, 3, 7);
+        nTracksBot = aida.histogram1D("Tracks per Event Bot", 3, 0, 3);
+        IHistogram1D nHitsClusterBot = aida.histogram1D("Hits in Cluster (HitOnTrack) Bot", 4, 0, 4);
+
+       
+        plotter22298.region(0).plot(nHitsBot);
+        plotter22298.region(1).plot(nTracksBot);
+        plotter22298.region(2).plot(nHitsClusterBot);
+        
+        if(showPlots) plotter22298.show();
+   
+        
+        //   ******************************************************************
+        
+        
+        plotter2223 = fac.createPlotterFactory().create("Cluster Amp Plots");
+        plotter2223.setTitle("Other");
+        //plotterFrame.addPlotter(plotter222);
+        IPlotterStyle style2223 = plotter2223.style();
+        style2223.dataStyle().fillStyle().setColor("yellow");
+        style2223.dataStyle().errorBarStyle().setVisible(false);
+        plotter2223.createRegions(2, 2);
+        
+       
+
         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");
+        IHistogram1D ampcl = aida.histogram1D("Cluster Amp (HitOnTrack)", 50, 0, 5000);
+        IHistogram1D amp2 = aida.histogram1D("Amp Pz>0.8 (HitOnTrack)", 50, 0, 5000);
+        IHistogram1D ampcl2 = aida.histogram1D("Cluster Amp Pz>0.8 (HitOnTrack)", 50, 0, 5000);
+      
+        
+        plotter2223.region(0).plot(amp);
+        plotter2223.region(1).plot(amp2);
+        plotter2223.region(2).plot(ampcl);
+        plotter2223.region(3).plot(ampcl2);
+        
+        if(showPlots) plotter2223.show();
+   
+//   ******************************************************************
+        
+        
+        plotter2224 = fac.createPlotterFactory().create("t0 Plots");
+        plotter2224.setTitle("Other");
+        IPlotterStyle style2224 = plotter2224.style();
+        style2224.dataStyle().fillStyle().setColor("yellow");
+        style2224.dataStyle().errorBarStyle().setVisible(false);
+        plotter2224.createRegions(2, 2);
+                
+        IHistogram1D t0 = aida.histogram1D("t0 (HitOnTrack)", 50, -100, 100);
+        IHistogram1D t0cl = aida.histogram1D("Cluster t0 (HitOnTrack)", 50, -100, 100);
+        IHistogram1D t02 = aida.histogram1D("t0 Pz>0.8 (HitOnTrack)", 50, -100, 100);
+        IHistogram1D t0cl2 = aida.histogram1D("Cluster t0 Pz>0.8 (HitOnTrack)", 50, -100, 100);
+        
+        plotter2224.region(0).plot(t0);
+        plotter2224.region(1).plot(t0cl);
+        plotter2224.region(2).plot(t02);
+        plotter2224.region(3).plot(t0cl2);
+
+        if(showPlots) plotter2224.show();
+   
+        
+        //   ******************************************************************
+          
+        plotter3 = fac.createPlotterFactory().create("HPS Layer Residual Plots");
+        plotter3.setTitle("Layer Residuals");
         //plotterFrame.addPlotter(plotter3);
         IPlotterStyle style3 = plotter3.style();
         style3.dataStyle().fillStyle().setColor("yellow");
         style3.dataStyle().errorBarStyle().setVisible(false);
-        plotter3.createRegions(5, 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);
+        plotter3.createRegions(6, 2);
+
+       
+
+        IHistogram1D mod1ResX = aida.histogram1D("Layer 1 Residual X(mm)", 25, -1, 1);
+        IHistogram1D mod1ResY = aida.histogram1D("Layer 1 Residual Y(mm)", 25, -0.04, 0.04);
+
+        IHistogram1D mod2ResX = aida.histogram1D("Layer 2 Residual X(mm)", 25, -2, 2);
+        IHistogram1D mod2ResY = aida.histogram1D("Layer 2 Residual Y(mm)", 25, -1, 1);
+
+        IHistogram1D mod3ResX = aida.histogram1D("Layer 3 Residual X(mm)", 25, -2.5, 2.5);
+        IHistogram1D mod3ResY = aida.histogram1D("Layer 3 Residual Y(mm)", 25, -1.5, 1.5);
+
+        IHistogram1D mod4ResX = aida.histogram1D("Layer 4 Residual X(mm)", 25, -3.0, 3.0);
+        IHistogram1D mod4ResY = aida.histogram1D("Layer 4 Residual Y(mm)", 25, -2, 2);
+
+        IHistogram1D mod5ResX = aida.histogram1D("Layer 5 Residual X(mm)", 25, -4, 4);
+        IHistogram1D mod5ResY = aida.histogram1D("Layer 5 Residual Y(mm)", 25, -3, 3);
+
+        IHistogram1D mod6ResX = aida.histogram1D("Layer 6 Residual X(mm)", 25, -5, 5);
+        IHistogram1D mod6ResY = aida.histogram1D("Layer 6 Residual Y(mm)", 25, -3, 3);
 
         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);
+               
+        if(showPlots) plotter3.show();
+        
+        
+        
+        plotter3_11 = fac.createPlotterFactory().create("HPS Strip Residual Plots");
+        plotter3_11.setTitle("Strip Residuals (Top)");
+        //plotterFrame.addPlotter(plotter3_11);
+        IPlotterStyle style3_11 = plotter3_11.style();
+        style3_11.dataStyle().fillStyle().setColor("yellow");
+        style3_11.dataStyle().errorBarStyle().setVisible(false);
+        plotter3_11.createRegions(6, 6);
+        int i=0;
+        for(HpsSiSensor sensor : sensors) {
+            double min = 0.0;
+            double max = 0.0;
+            if(sensor.getName().contains("L1")) {
+                min=-0.04; max=0.04;
+            } else if(sensor.getName().contains("L2")) {
+                min=-1; max=1;
+            } else if(sensor.getName().contains("L3")) {
+                min=-1.5; max=1.5;
+            } else if(sensor.getName().contains("L4")) {
+                min=-3; max=3;
+            } else if(sensor.getName().contains("L5")) {
+                min=-4; max=4;
+            } else if(sensor.getName().contains("L6")) {
+                min=-5; max=5;
+            } else {
+                throw new RuntimeException("Invalid sensor name: " + sensor.getName());
+            }
+           IHistogram1D resX = aida.histogram1D(sensor.getName() + " strip residual (mm)", 50, min, max);
+            plotter3_11.region(i).plot(resX);
+            i++;
+        }
+
+        if(showPlots) plotter3_11.show();
+        
 
         plotter3_1 = fac.createPlotterFactory().create("HPS Residual Plots (Single hit per layer)");
         plotter3_1.setTitle("Residuals (Top)");
@@ -284,69 +505,84 @@
         IPlotterStyle style3_1 = plotter3_1.style();
         style3_1.dataStyle().fillStyle().setColor("yellow");
         style3_1.dataStyle().errorBarStyle().setVisible(false);
-        plotter3_1.createRegions(5, 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);
-
+        plotter3_1.createRegions(6, 2);
+        
+        IHistogram1D mod1ResX_Top = aida.histogram1D("Layer 1 Residual X(mm) Top", 25, -1, 1);
+        IHistogram1D mod1ResY_Top = aida.histogram1D("Layer 1 Residual Y(mm) Top", 25, -0.04, 0.04);
+
+        IHistogram1D mod2ResX_Top = aida.histogram1D("Layer 2 Residual X(mm) Top", 25, -2, 2);
+        IHistogram1D mod2ResY_Top = aida.histogram1D("Layer 2 Residual Y(mm) Top", 25, -1, 1);
+
+        IHistogram1D mod3ResX_Top = aida.histogram1D("Layer 3 Residual X(mm) Top", 25, -2.5, 2.5);
+        IHistogram1D mod3ResY_Top = aida.histogram1D("Layer 3 Residual Y(mm) Top", 25, -1.5, 1.5);
+
+        IHistogram1D mod4ResX_Top = aida.histogram1D("Layer 4 Residual X(mm) Top", 25, -3.0, 3.0);
+        IHistogram1D mod4ResY_Top = aida.histogram1D("Layer 4 Residual Y(mm) Top", 25, -2, 2);
+
+        IHistogram1D mod5ResX_Top = aida.histogram1D("Layer 5 Residual X(mm) Top", 25, -4, 4);
+        IHistogram1D mod5ResY_Top = aida.histogram1D("Layer 5 Residual Y(mm) Top", 25, -3, 3);
+
+        IHistogram1D mod6ResX_Top = aida.histogram1D("Layer 6 Residual X(mm) Top", 25, -5, 5);
+        IHistogram1D mod6ResY_Top = aida.histogram1D("Layer 6 Residual Y(mm) Top", 25, -3, 3);
+
+        
         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);
+
+        if(showPlots) plotter3_1.show();
+        
         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(5, 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);
+        plotter3_2.createRegions(6, 2);
+
+        IHistogram1D mod1ResX_Bottom = aida.histogram1D("Layer 1 Residual X(mm) Bottom", 25, -1, 1);
+        IHistogram1D mod1ResY_Bottom = aida.histogram1D("Layer 1 Residual Y(mm) Bottom", 25, -0.04, 0.04);
+
+        IHistogram1D mod2ResX_Bottom = aida.histogram1D("Layer 2 Residual X(mm) Bottom", 25, -2, 2);
+        IHistogram1D mod2ResY_Bottom = aida.histogram1D("Layer 2 Residual Y(mm) Bottom", 25, -1, 1);
+
+        IHistogram1D mod3ResX_Bottom = aida.histogram1D("Layer 3 Residual X(mm) Bottom", 25, -2.5, 2.5);
+        IHistogram1D mod3ResY_Bottom = aida.histogram1D("Layer 3 Residual Y(mm) Bottom", 25, -1.5, 1.5);
+
+        IHistogram1D mod4ResX_Bottom = aida.histogram1D("Layer 4 Residual X(mm) Bottom", 25, -3.0, 3.0);
+        IHistogram1D mod4ResY_Bottom = aida.histogram1D("Layer 4 Residual Y(mm) Bottom", 25, -2, 2);
+
+        IHistogram1D mod5ResX_Bottom = aida.histogram1D("Layer 5 Residual X(mm) Bottom", 25, -4, 4);
+        IHistogram1D mod5ResY_Bottom = aida.histogram1D("Layer 5 Residual Y(mm) Bottom", 25, -3, 3);
+
+        IHistogram1D mod6ResX_Bottom = aida.histogram1D("Layer 6 Residual X(mm) Bottom", 25, -5, 5);
+        IHistogram1D mod6ResY_Bottom = aida.histogram1D("Layer 6 Residual Y(mm) Bottom", 25, -3, 3);
 
         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);
+        
+        if(showPlots) plotter3_2.show();
 
         plotter4 = fac.createPlotterFactory().create("HPS Track and ECal Plots");
         plotter4.setTitle("Track and ECal Correlations");
@@ -358,14 +594,12 @@
         style4.dataStyle().errorBarStyle().setVisible(false);
         plotter4.createRegions(2, 3);
 
-        IHistogram2D eVsP = aida.histogram2D("Energy Vs Momentum", 50, 0, 500, 50, 0, 3000);
+        IHistogram2D eVsP = aida.histogram2D("Energy Vs Momentum", 50, 0, 0.50, 50, 0, 1.5);
         IHistogram1D eOverP = aida.histogram1D("Energy Over Momentum", 50, 0, 2);
 
-        IHistogram1D distX = aida.histogram1D("deltaX", 50, -400, 400);
+        IHistogram1D distX = aida.histogram1D("deltaX", 50, -100, 100);
         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);
 
@@ -375,6 +609,8 @@
         plotter4.region(4).plot(distY);
         plotter4.region(2).plot(xEcalVsTrk);
         plotter4.region(5).plot(yEcalVsTrk);
+
+        if(showPlots) plotter4.show();
 
         //   ******************************************************************
         top2 = fac.createPlotterFactory().create("Top ECal Plots");
@@ -387,13 +623,13 @@
         top2.createRegions(2, 3);
         //topFrame.addPlotter(top2);
 
-        IHistogram2D topeVsP = aida.histogram2D("Top Energy Vs Momentum", 50, 0, 500, 50, 0, 3000);
+        IHistogram2D topeVsP = aida.histogram2D("Top Energy Vs Momentum", 50, 0, 0.500, 50, 0, 1.5);
         IHistogram1D topeOverP = aida.histogram1D("Top Energy Over Momentum", 50, 0, 2);
 
-        IHistogram1D topdistX = aida.histogram1D("Top deltaX", 50, -400, 400);
+        IHistogram1D topdistX = aida.histogram1D("Top deltaX", 50, -100, 100);
         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 topxEcalVsTrk = aida.histogram2D("Top X ECal Vs Track", 100, -400, 400, 100, -100, 100);
         IHistogram2D topyEcalVsTrk = aida.histogram2D("Top Y ECal Vs Track", 100, 0, 100, 100, 0, 100);
 
         top2.region(0).plot(topeVsP);
@@ -403,6 +639,8 @@
         top2.region(2).plot(topxEcalVsTrk);
         top2.region(5).plot(topyEcalVsTrk);
 
+        if(showPlots) top2.show();
+        
         bot2 = fac.createPlotterFactory().create("Bottom ECal Plots");
         bot2.setTitle("Bottom ECal Correlations");
         IPlotterStyle sbot2 = bot2.style();
@@ -413,10 +651,10 @@
         bot2.createRegions(2, 3);
         //bottomFrame.addPlotter(bot2);
 
-        IHistogram2D BottomeVsP = aida.histogram2D("Bottom Energy Vs Momentum", 50, 0, 500, 50, 0, 3000);
+        IHistogram2D BottomeVsP = aida.histogram2D("Bottom Energy Vs Momentum", 50, 0, 0.500, 50, 0, 1.5);
         IHistogram1D BottomeOverP = aida.histogram1D("Bottom Energy Over Momentum", 50, 0, 2);
 
-        IHistogram1D BottomdistX = aida.histogram1D("Bottom deltaX", 50, -400, 400);
+        IHistogram1D BottomdistX = aida.histogram1D("Bottom deltaX", 50, -100, 100);
         IHistogram1D BottomdistY = aida.histogram1D("Bottom deltaY", 50, -40, 40);
 
         IHistogram2D BottomxEcalVsTrk = aida.histogram2D("Bottom X ECal Vs Track", 100, -400, 400, 100, -400, 400);
@@ -429,7 +667,10 @@
         bot2.region(2).plot(BottomxEcalVsTrk);
         bot2.region(5).plot(BottomyEcalVsTrk);
 
-//   ******************************************************************
+        if(showPlots) bot2.show();
+        
+        
+        //   ******************************************************************
         top3 = fac.createPlotterFactory().create("Top ECal Plots");
         top3.setTitle("Top ECal More Correlations");
         IPlotterStyle stop3 = top3.style();
@@ -440,12 +681,14 @@
         top3.createRegions(1, 2);
         //topFrame.addPlotter(top3);
 
-        IHistogram2D topdistXvsX = aida.histogram2D("Top deltaX vs X", 51, -400, 400, 25, -400, 400);
+        IHistogram2D topdistXvsX = aida.histogram2D("Top deltaX vs X", 51, -400, 400, 25, -100, 100);
         IHistogram2D topdistYvsY = aida.histogram2D("Top deltaY vs Y", 51, 0, 100, 25, -40, 40);
 
         top3.region(0).plot(topdistXvsX);
         top3.region(1).plot(topdistYvsY);
 
+        if(showPlots) top3.show();
+        
         bot3 = fac.createPlotterFactory().create("Bottom ECal Plots");
         bot3.setTitle("Bottom ECal More Correlations");
         IPlotterStyle sbot3 = bot3.style();
@@ -456,12 +699,72 @@
         bot3.createRegions(1, 2);
         //bottomFrame.addPlotter(bot3);
 
-        IHistogram2D botdistXvsX = aida.histogram2D("Bottom deltaX vs X", 51, -400, 400, 25, -400, 400);
+        IHistogram2D botdistXvsX = aida.histogram2D("Bottom deltaX vs X", 51, -400, 400, 25, -100, 100);
         IHistogram2D botdistYvsY = aida.histogram2D("Bottom deltaY vs Y", 51, -100, 0, 25, -40, 40);
 
         bot3.region(0).plot(botdistXvsX);
         bot3.region(1).plot(botdistYvsY);
 
+        if(showPlots) bot3.show();
+        
+        //   ******************************************************************
+        top4 = fac.createPlotterFactory().create("Track Matching Plots");
+        top4.setTitle("Track Matching Plots");
+        IPlotterStyle stop4 = top4.style();
+        stop4.dataStyle().fillStyle().setColor("green");
+        stop4.dataStyle().errorBarStyle().setVisible(false);
+        stop4.setParameter("hist2DStyle", "colorMap");
+        stop4.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+        top4.createRegions(2, 3);
+        //topFrame.addPlotter(top4);
+
+        IHistogram1D trackmatchN = aida.histogram1D("Tracks matched", 3, 0, 3);
+        IHistogram1D toptrackmatchN = aida.histogram1D("Tracks matched Top", 3, 0, 3);
+        IHistogram1D bottrackmatchN = aida.histogram1D("Tracks matched Bottom", 3, 0, 3);
+        IHistogram1D trackmatchN2 = aida.histogram1D("Tracks matched (Pz>0.8)", 3, 0, 3);
+        IHistogram1D toptrackmatchN2 = aida.histogram1D("Tracks matched Top (Pz>0.8)", 3, 0, 3);
+        IHistogram1D bottrackmatchN2 = aida.histogram1D("Tracks matched Bottom (Pz>0.8)", 3, 0, 3);
+        
+        top4.region(0).plot(trackmatchN);
+        top4.region(1).plot(toptrackmatchN);
+        top4.region(2).plot(bottrackmatchN);
+        top4.region(3).plot(trackmatchN2);
+        top4.region(4).plot(toptrackmatchN2);
+        top4.region(5).plot(bottrackmatchN2);
+
+        if(showPlots) top4.show();
+        
+        //   ******************************************************************
+        top44 = fac.createPlotterFactory().create("e+e- Plots");
+        top44.setTitle("e+e- Plots");
+        IPlotterStyle stop44 = top44.style();
+        stop44.dataStyle().fillStyle().setColor("green");
+        stop44.dataStyle().errorBarStyle().setVisible(false);
+        stop44.setParameter("hist2DStyle", "colorMap");
+        stop44.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+        top44.createRegions(2,4);
+        //topFrame.addPlotter(top44);
+
+        IHistogram2D trackPCorr = aida.histogram2D("p(e-) vs p(e+) max", 25, 0, 1.2, 25, 0, 1.2);
+        IHistogram1D ne = aida.histogram1D("n(e-)", 3, 0, 3);
+        IHistogram1D np = aida.histogram1D("n(e+)", 3, 0, 3);
+        IHistogram1D pem = aida.histogram1D("p(e-) max", 25, 0, 1.5);
+        IHistogram1D pe = aida.histogram1D("p(e-)", 25, 0, 1.5);
+        IHistogram1D ppm = aida.histogram1D("p(e+) max", 25, 0, 1.5);
+        IHistogram1D pp = aida.histogram1D("p(e+)", 25, 0, 1.5);
+        
+        top44.region(0).plot(trackPCorr);
+        top44.region(1).plot(ne);
+        top44.region(2).plot(np);
+        top44.region(3).plot(pe);
+        top44.region(4).plot(pp);
+        top44.region(5).plot(pem);
+        top44.region(6).plot(ppm);
+        
+        if(showPlots) top44.show();
+        
+        
+        
 //   ******************************************************************
         plotter5 = fac.createPlotterFactory().create("HPS Hit Positions");
         plotter5.setTitle("Hit Positions:  Top");
@@ -480,7 +783,9 @@
 
         plotter5.region(0).plot(l1Pos);
         plotter5.region(1).plot(l7Pos);
-
+        
+        if(showPlots) plotter5.show();
+        
         plotter5_1 = fac.createPlotterFactory().create("HPS Hit Positions");
         plotter5_1.setTitle("Hit Positions:  Bottom");
         //plotterFrame.addPlotter(plotter5_1);
@@ -491,10 +796,13 @@
         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);
+
+        if(showPlots) plotter5_1.show();
 
         plotter55 = fac.createPlotterFactory().create("HPS Hit Positions");
         plotter55.setTitle("Helical Track Hits");
@@ -510,6 +818,8 @@
 
         plotter55.region(0).plot(avgLayersTopPlot);
         plotter55.region(1).plot(avgLayersBottomPlot);
+
+        if(showPlots) plotter55.show();
 
         plotter6 = fac.createPlotterFactory().create("HPS ECAL Hit Positions");
         plotter6.setTitle("ECAL Positions");
@@ -525,10 +835,10 @@
         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);
+        IHistogram2D topECal2 = aida.histogram2D("Top ECal Cluster Position (E>0.1,>0 tracks)", 50, -400, 400, 10, 0, 100);
+        IHistogram2D botECal2 = aida.histogram2D("Bottom ECal Cluster Position (E>0.1,>0 tracks)", 50, -400, 400, 10, -100, 0);
+        IHistogram2D topECal3 = aida.histogram2D("Top ECal Cluster Position w_E (E>0.1,>0 tracks)", 50, -400, 400, 10, 0, 100);
+        IHistogram2D botECal3 = aida.histogram2D("Bottom ECal Cluster Position w_E (E>0.1,>0 tracks)", 50, -400, 400, 10, -100, 0);
 
         plotter6.region(0).plot(topECal);
         plotter6.region(1).plot(botECal);
@@ -538,13 +848,31 @@
         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);
+        
+        if(showPlots) plotter6.show();
+        
+        
+        plotter66 = fac.createPlotterFactory().create("HPS ECAL Basic Plots");
+        plotter66.setTitle("ECAL Basic Plots");
+        //plotterFrame.addPlotter(plotter6);
+        IPlotterStyle style66 = plotter66.style();
+        style66.dataStyle().fillStyle().setColor("yellow");
+        style66.dataStyle().errorBarStyle().setVisible(false);
+        plotter66.createRegions(2, 2);
+
+        IHistogram1D topECalE = aida.histogram1D("Top ECal Cluster Energy", 50, 0, 2);
+        IHistogram1D botECalE = aida.histogram1D("Bottom ECal Cluster Energy", 50, 0, 2);
+        IHistogram1D topECalN = aida.histogram1D("Number of Clusters Top", 6, 0, 6);
+        IHistogram1D botECalN = aida.histogram1D("Number of Clusters Bot", 6, 0, 6);
+        
+        plotter66.region(0).plot(topECalE);
+        plotter66.region(1).plot(botECalE);
+        plotter66.region(2).plot(botECalN);
+        plotter66.region(3).plot(topECalN);
+        
+        if(showPlots) plotter66.show();
+        
+        
         plotter7 = fac.createPlotterFactory().create("HPS ECAL Hit Positions");
         plotter7.setTitle("Basic Misc Stuff");
         //plotterFrame.addPlotter(plotter7);
@@ -557,16 +885,59 @@
 
         IHistogram2D quadrants = aida.histogram2D("Charge vs Slope", 2, -1, 1, 2, -1, 1);
         plotter7.region(0).plot(quadrants);
+        
+        if(showPlots) plotter7.show();
+        
+        plotter8 = fac.createPlotterFactory().create("HPS Strip Hit Multiplicity");
+        plotter8.setTitle("Strip Hit Multiplicity");
+        //plotterFrame.addPlotter(plotter8);
+        IPlotterStyle style8 = plotter8.style();
+        style8.dataStyle().fillStyle().setColor("yellow");
+        style8.dataStyle().errorBarStyle().setVisible(false);
+        plotter8.createRegions(6, 6);
+        i=0;
+        for(SiSensor sensor : sensors) {
+            IHistogram1D resX = aida.histogram1D(sensor.getName() + " strip hits", 10, 0, 10);
+            plotter8.region(i).plot(resX);
+            i++;
+        }
+
+        if(showPlots) plotter8.show();
+        
+        
+        plotter9 = fac.createPlotterFactory().create("HPS Strip Hit On Track Multiplicity");
+        plotter9.setTitle("Strip Hit Multiplicity");
+        //plotterFrame.addPlotter(plotter9);
+        IPlotterStyle style9 = plotter9.style();
+        style9.dataStyle().fillStyle().setColor("yellow");
+        style9.dataStyle().errorBarStyle().setVisible(false);
+        plotter9.createRegions(6, 6);
+        i=0;
+        for(SiSensor sensor : sensors) {
+            IHistogram1D resX = aida.histogram1D(sensor.getName() + " strip hits on track", 3, 0, 3);
+            plotter9.region(i).plot(resX);
+            i++;
+        }
+
+        if(showPlots) plotter9.show();
+
 
     }
 
     public TrackingReconstructionPlots() {
+        logger.setLevel(Level.WARNING);
     }
 
     public void setOutputPlots(String output) {
         this.outputPlots = output;
     }
-
+    
+    public void setShowPlots(boolean show) {
+        this.showPlots  = show;
+    }
+
+    
+    
     public void setRawTrackerHitCollectionName(String rawTrackerHitCollectionName) {
         this.rawTrackerHitCollectionName = rawTrackerHitCollectionName;
     }
@@ -594,48 +965,32 @@
 //            System.out.println(helicalTrackHitCollectionName + " does not exist; skipping event");
             return;
         }
-
-        List<HelicalTrackHit> rotList = event.get(HelicalTrackHit.class, rotatedTrackHitCollectionName);
-        for (HelicalTrackHit hth : rotList) {
-            HelicalTrackCross htc = (HelicalTrackCross) hth;
-//            System.out.println("TrackingReconstructionPlots::original helical track position = "+hth.getPosition()[0]+","+hth.getPosition()[1]+","+hth.getPosition()[2]);
-//            System.out.println("TrackingReconstructionPlots::corrected helical track position = "+htc.getCorrectedPosition().toString());
-        }
         List<HelicalTrackHit> hthList = event.get(HelicalTrackHit.class, helicalTrackHitCollectionName);
-        int[] layersTop = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-        int[] layersBot = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+        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};
+        Map<HpsSiSensor, Integer> stripHits = new HashMap<HpsSiSensor, Integer>();
         for (HelicalTrackHit hth : hthList) {
             HelicalTrackCross htc = (HelicalTrackCross) hth;
-//            System.out.println("TrackingReconstructionPlots::original helical track position = "+hth.getPosition()[0]+","+hth.getPosition()[1]+","+hth.getPosition()[2]);
-//            System.out.println("TrackingReconstructionPlots::corrected helical track position = "+htc.getCorrectedPosition().toString());
-            //These Helical Track Hits are in the JLAB frame
-//            htc.resetTrackDirection();
-            double x = htc.getPosition()[0];
-            double y = htc.getPosition()[1];
             HpsSiSensor sensor = ((HpsSiSensor) ((RawTrackerHit) htc.getRawHits().get(0)).getDetectorElement());
+            for(HelicalTrackStrip strip : htc.getStrips()) {
+                HpsSiSensor stripsensor = (HpsSiSensor) ((RawTrackerHit)strip.rawhits().get(0)).getDetectorElement();
+                if(stripHits.containsKey(stripsensor)) {
+                    stripHits.put(stripsensor, stripHits.get(stripsensor) + 1);
+                } else {
+                    stripHits.put(stripsensor, 0);
+                }
+            }
             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());
-            }
-        }
-        for (int i = 0; i < 10; i++) {
+            }
+        }
+        for(Map.Entry<HpsSiSensor,Integer> sensor : stripHits.entrySet()) {
+            aida.histogram1D(sensor.getKey().getName() + " strip hits").fill(sensor.getValue());
+        }
+        
+        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]);
         }
@@ -647,15 +1002,26 @@
 
         List<Track> tracks = event.get(Track.class, trackCollectionName);
         nTracks.fill(tracks.size());
+        int nBotClusters = 0;
+        int nTopClusters = 0;
         if (event.hasCollection(Cluster.class, ecalCollectionName)) {
             List<Cluster> clusters = event.get(Cluster.class, ecalCollectionName);
             for (Cluster cluster : clusters) {
+             // Get the ix and iy indices for the seed.
+                final int ix = cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("ix");
+                final int iy = cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("iy");
+ 
                 //System.out.println("cluser position = ("+cluster.getPosition()[0]+","+cluster.getPosition()[1]+") with energy = "+cluster.getEnergy());
                 if (cluster.getPosition()[1] > 0) {
+                    nTopClusters++;
+                    //System.out.println("cl " + cluster.getPosition()[0] + " " + cluster.getPosition()[1] + "  ix  " + ix + " iy " + iy);
                     aida.histogram2D("Top ECal Cluster Position").fill(cluster.getPosition()[0], cluster.getPosition()[1]);
+                    aida.histogram1D("Top ECal Cluster Energy").fill(cluster.getEnergy());
                 }
                 if (cluster.getPosition()[1] < 0) {
+                    nBotClusters++;
                     aida.histogram2D("Bottom ECal Cluster Position").fill(cluster.getPosition()[0], cluster.getPosition()[1]);
+                    aida.histogram1D("Bottom ECal Cluster Energy").fill(cluster.getEnergy());
                 }
 
                 if (tracks.size() > 0) {
@@ -666,30 +1032,43 @@
                         aida.histogram2D("Bottom ECal Cluster Position (>0 tracks)").fill(cluster.getPosition()[0], cluster.getPosition()[1]);
                     }
 
-                    if (cluster.getEnergy() > 100) {
+                    if (cluster.getEnergy() > 0.1) {
                         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());
+                            aida.histogram2D("Top ECal Cluster Position (E>0.1,>0 tracks)").fill(cluster.getPosition()[0], cluster.getPosition()[1]);
+                            aida.histogram2D("Top ECal Cluster Position w_E (E>0.1,>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());
+                            aida.histogram2D("Bottom ECal Cluster Position (E>0.1,>0 tracks)").fill(cluster.getPosition()[0], cluster.getPosition()[1]);
+                            aida.histogram2D("Bottom ECal Cluster Position w_E (E>0.1,>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");
+        
+        aida.histogram1D("Number of Clusters Top").fill(nTopClusters);
+        aida.histogram1D("Number of Clusters Bot").fill(nBotClusters);
+        
+
+            
+        
+
+        //List<SiTrackerHitStrip1D> stripHits = event.get(SiTrackerHitStrip1D.class, "StripClusterer_SiTrackerHitStrip1D");
+        //int stripClustersPerLayerTop[] = getStripClustersPerLayer(stripHits, "up");
         //int stripClustersPerLayerBottom[] = getStripClustersPerLayer(stripHits,"down");
 
-        boolean hasSingleStripClusterPerLayer = singleStripClusterPerLayer(stripClustersPerLayerTop);
-
+        //boolean hasSingleStripClusterPerLayer = singleStripClusterPerLayer(stripClustersPerLayerTop);
+
+        Map<Track, Cluster> eCanditates = new HashMap<Track, Cluster>();
+        Map<Track, Cluster> pCanditates = new HashMap<Track, Cluster>();
+        
+        int ntracksTop = 0;
+        int ntracksBot = 0;
+        
         for (Track trk : tracks) {
 
-            boolean isSingleHitPerLayerTrack = singleTrackHitPerLayer(trk);
+            //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]);
@@ -698,24 +1077,17 @@
 
             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);
+            SeedCandidate seedCandidate = stEle.getSeedCandidate();
+            HelicalTrackFit helicalTrackFit = seedCandidate.getHelix();
+            StraightLineTrack slt = converter.Convert(helicalTrackFit);
 
             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) {
@@ -742,39 +1114,84 @@
                 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());
+                
+                aida.histogram1D("d0 Top").fill(trk.getTrackStates().get(0).getParameter(ParameterName.d0.ordinal()));
+                aida.histogram1D("sinphi Top").fill(Math.sin(trk.getTrackStates().get(0).getParameter(ParameterName.phi0.ordinal())));
+                aida.histogram1D("omega Top").fill(trk.getTrackStates().get(0).getParameter(ParameterName.omega.ordinal()));
+                aida.histogram1D("tan(lambda) Top").fill(trk.getTrackStates().get(0).getParameter(ParameterName.tanLambda.ordinal()));
+                aida.histogram1D("z0 Top").fill(trk.getTrackStates().get(0).getParameter(ParameterName.z0.ordinal()));
+                ntracksTop++;
             } 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());
+
+                aida.histogram1D("d0 Bottom").fill(trk.getTrackStates().get(0).getParameter(ParameterName.d0.ordinal()));
+                aida.histogram1D("sinphi Bottom").fill(Math.sin(trk.getTrackStates().get(0).getParameter(ParameterName.phi0.ordinal())));
+                aida.histogram1D("omega Bottom").fill(trk.getTrackStates().get(0).getParameter(ParameterName.omega.ordinal()));
+                aida.histogram1D("tan(lambda) Bottom").fill(trk.getTrackStates().get(0).getParameter(ParameterName.tanLambda.ordinal()));
+                aida.histogram1D("z0 Bottom").fill(trk.getTrackStates().get(0).getParameter(ParameterName.z0.ordinal()));
+                ntracksBot++;
             }
             List<TrackerHit> hitsOnTrack = trk.getTrackerHits();
+            Map<HpsSiSensor, Integer> stripHitsOnTrack = new HashMap<HpsSiSensor, Integer>();
+            
             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 sHit = helicalTrackFit.PathMap().get(htc);
+                Hep3Vector posonhelix = HelixUtils.PointOnHelix(helicalTrackFit, sHit);
+                boolean isTopLayer = false;
+                
+                
+                
+                //HpsSiSensor sensor = ((HpsSiSensor) ((RawTrackerHit)  htc.getRawHits().get(0)).getDetectorElement());
+                for(HelicalTrackStrip strip : htcross.getStrips()) {
+                    HpsSiSensor sensor =  ((HpsSiSensor) ((RawTrackerHit)  strip.rawhits().get(0)).getDetectorElement());
+                    if(sensor.isTopLayer()) isTopLayer = true;
+                    else isTopLayer=false;
+                    HelicalTrackStripGbl stripGbl = new HelicalTrackStripGbl(strip, true);
+                    Map<String, Double> stripResiduals = TrackUtils.calculateLocalTrackHitResiduals(helicalTrackFit, stripGbl, 0.,0.,_bfield);
+                    logger.info("Sensor " + sensor.getName() + " ures = " + stripResiduals.get("ures"));
+                    aida.histogram1D(sensor.getName() + " strip residual (mm)").fill(stripResiduals.get("ures"));
+                    
+
+                    if(stripHitsOnTrack.containsKey(sensor)) {
+                        stripHitsOnTrack.put(sensor, stripHitsOnTrack.get(sensor) + 1);
+                    } else {
+                        stripHitsOnTrack.put(sensor, 1);
+                    }
+                }
+                
+                
+                   
+                
+                
                 double yTr = posonhelix.y();
                 double zTr = posonhelix.z();
                 int layer = htc.Layer();
-                String modNum = "Module X ";
+                String modNum = "Layer X ";
                 if (layer == 1) {
-                    modNum = "Module 1 ";
+                    modNum = "Layer 1 ";
                 }
                 if (layer == 3) {
-                    modNum = "Module 2 ";
+                    modNum = "Layer 2 ";
                 }
                 if (layer == 5) {
-                    modNum = "Module 3 ";
+                    modNum = "Layer 3 ";
                 }
                 if (layer == 7) {
-                    modNum = "Module 4 ";
+                    modNum = "Layer 4 ";
                 }
                 if (layer == 9) {
-                    modNum = "Module 5 ";
-                }
-                SymmetricMatrix cov = htc.getCorrectedCovMatrix();
+                    modNum = "Layer 5 ";
+                }
+                if (layer == 11) {
+                    modNum = "Layer 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
@@ -788,10 +1205,9 @@
                     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()) {
+                if(isTopLayer) {
                     layersTop[htc.Layer() - 1]++;
                     Hep3Vector sensorPos = ((SiSensor) ((RawTrackerHit) htc.getRawHits().get(0)).getDetectorElement()).getGeometry().getPosition();
                     if (htc.Layer() == 1) {
@@ -814,87 +1230,215 @@
                         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);
-                 }                
-                 */
-                boolean doAmplitudePlots = false;
+                
+                boolean doAmplitudePlots = true;
                 if(doAmplitudePlots) {
                     for (HelicalTrackStrip hts : htcross.getStrips()) {
                         double clusterSum = 0;
+                        double clusterT0 = 0;
+                        int nHitsCluster = 0;
+                                
                         for (RawTrackerHit rawHit : (List<RawTrackerHit>) hts.rawhits()) {
-                            for (ShapeFitParameters fit : _shaper.fitShape(rawHit,new PulseShape.CRRC())) {
-                                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);
+                            if(event.hasCollection(LCRelation.class, "SVTFittedRawTrackerHits")) {
+                                List<LCRelation> fittedHits = event.get(LCRelation.class, "SVTFittedRawTrackerHits");
+                                for(LCRelation fittedHit : fittedHits) {
+                                    if(rawHit.equals((RawTrackerHit)fittedHit.getFrom())) {
+                                        double amp = FittedRawTrackerHit.getAmp(fittedHit);
+                                        double t0 = FittedRawTrackerHit.getT0(fittedHit);
+                                        //System.out.println("to="+t0 + " amp=" + amp);
+                                        aida.histogram1D("Amp (HitOnTrack)").fill(amp);
+                                        if (trk.getTrackStates().get(0).getMomentum()[0] > 0.8) {
+                                            aida.histogram1D("Amp Pz>0.8 (HitOnTrack)").fill(amp);
+                                        }
+                                        aida.histogram1D("t0 (HitOnTrack)").fill(t0);
+                                        if (trk.getTrackStates().get(0).getMomentum()[0] > 0.8) {
+                                            aida.histogram1D("t0 Pz>0.8 (HitOnTrack)").fill(t0);
+                                        }
+                                        clusterSum += amp;
+                                        clusterT0 += t0;
+                                        nHitsCluster++;
+                                    }
+                                }     
                                 }
+                        }
+                           
+                        aida.histogram1D("Hits in Cluster (HitOnTrack)").fill(nHitsCluster);
+                        aida.histogram1D("Cluster Amp (HitOnTrack)").fill(clusterSum);
+                        if (trk.getTrackStates().get(0).getMomentum()[0] > 0.8) {
+                            aida.histogram1D("Cluster Amp Pz>0.8 (HitOnTrack)").fill(clusterSum);
+                        }
+                        if(nHitsCluster>0) {
+                            aida.histogram1D("Cluster t0 (HitOnTrack)").fill(clusterT0/nHitsCluster);
+                            if (trk.getTrackStates().get(0).getMomentum()[0] > 0.8) {
+                                aida.histogram1D("Cluster t0 Pz>0.8 (HitOnTrack)").fill(clusterT0/nHitsCluster);
                             }
                         }
-                        aida.histogram1D("Amp (CluOnTrack)").fill(clusterSum);
-                        if (trk.getTrackStates().get(0).getMomentum()[0] > 1) {
-                            aida.histogram1D("Amp Pz>1000 (CluOnTrack)").fill(clusterSum);
-                        }
-                    }
-                }
-            }
+                    
+                    }
+                }
+            }
+            
+            for(Map.Entry<HpsSiSensor,Integer> sensor : stripHitsOnTrack.entrySet()) {
+                aida.histogram1D(sensor.getKey().getName() + " strip hits on track").fill(sensor.getValue());
+            }
+            
+            
+            Cluster clust = null;
             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());
-                    }
-
-                }
-            }
-        }
+                Cluster cand_clust = findClosestCluster(posAtEcal, clusters);
+
+                if (cand_clust != null) {
+
+                    // track matching requirement
+                    if(Math.abs( posAtEcal.x() - cand_clust.getPosition()[0])<30.0 && 
+                            Math.abs( posAtEcal.y() - cand_clust.getPosition()[1])<30.0) 
+                    {
+                        clust = cand_clust;
+                        if(trk.getCharge()<0) pCanditates.put(trk, clust);
+                        else                  eCanditates.put(trk, clust);
+
+                        posAtEcal = TrackUtils.extrapolateTrack(trk, clust.getPosition()[2]);//.positionAtEcal();
+
+                        aida.histogram2D("Energy Vs Momentum").fill(clust.getEnergy(), trk.getTrackStates().get(0).getMomentum()[0]);
+                        aida.histogram1D("Energy Over Momentum").fill(clust.getEnergy() / (trk.getTrackStates().get(0).getMomentum()[0] ));
+                        aida.histogram1D("deltaX").fill(clust.getPosition()[0] - posAtEcal.x());
+                        aida.histogram1D("deltaY").fill(clust.getPosition()[1] - posAtEcal.y());
+                        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.histogram1D("Tracks matched Top").fill(1);
+                            if(trk.getTrackStates().get(0).getMomentum()[0] > 0.8){
+                                aida.histogram1D("Tracks matched Top (Pz>0.8)").fill(1);
+                            }
+
+                            aida.histogram2D("Top Energy Vs Momentum").fill(clust.getEnergy(), trk.getTrackStates().get(0).getMomentum()[0] );
+                            //                    aida.histogram2D("Top Energy Vs Momentum").fill(posAtEcal.y(), trk.getTrackStates().get(0).getMomentum()[0]);
+                            aida.histogram1D("Top Energy Over Momentum").fill(clust.getEnergy() / (trk.getTrackStates().get(0).getMomentum()[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.histogram1D("Tracks matched Bottom").fill(1);
+                            if(trk.getTrackStates().get(0).getMomentum()[0] > 0.8){
+                                aida.histogram1D("Tracks matched Bottom (Pz>0.8)").fill(1);
+                            }
+                            aida.histogram2D("Bottom Energy Vs Momentum").fill(clust.getEnergy(), trk.getTrackStates().get(0).getMomentum()[0] );
+                            aida.histogram1D("Bottom Energy Over Momentum").fill(clust.getEnergy() / (trk.getTrackStates().get(0).getMomentum()[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());
+                        }
+                    }
+                } 
+            }
+
+            if (clust != null) {
+                aida.histogram1D("Tracks matched").fill(0);
+                if(trk.getTrackStates().get(0).getMomentum()[0] > 0.8){
+                    aida.histogram1D("Tracks matched (Pz>0.8)").fill(0);
+                }
+                if(isTop == 0) {
+                    aida.histogram1D("Tracks matched Top").fill(0);
+                    if(trk.getTrackStates().get(0).getMomentum()[0] > 0.8){
+                        aida.histogram1D("Tracks matched Top (Pz>0.8)").fill(0);
+                    }
+                } else {
+                    aida.histogram1D("Tracks matched Bottom").fill(0);    
+                    if(trk.getTrackStates().get(0).getMomentum()[0] > 0.8){
+                        aida.histogram1D("Tracks matched Bottom (Pz>0.8)").fill(0);
+                    }
+                }
+            } else {
+                aida.histogram1D("Tracks matched").fill(1);
+                if(trk.getTrackStates().get(0).getMomentum()[0] > 0.8){
+                    aida.histogram1D("Tracks matched (Pz>0.8)").fill(1);
+                }
+
+                if (isTop == 0) {
+                    aida.histogram1D("Tracks matched Top").fill(1);
+                    if(trk.getTrackStates().get(0).getMomentum()[0] > 0.8){
+                        aida.histogram1D("Tracks matched Top (Pz>0.8)").fill(1);
+                    }
+                } else {
+                    aida.histogram1D("Tracks matched Bottom").fill(1);
+                    if(trk.getTrackStates().get(0).getMomentum()[0] > 0.8){
+                        aida.histogram1D("Tracks matched Bottom (Pz>0.8)").fill(1);
+                    }
+                }
+
+            }
+
+        }
+
+        nTracksBot.fill(ntracksBot);
+        nTracksTop.fill(ntracksTop);
+        
+        // e+/e-
+        Map.Entry<Track, Cluster> ecand_highestP = null;
+        double e_pmax = -1;
+        Map.Entry<Track, Cluster> pcand_highestP = null;
+        double p_pmax = -1;
+        for(Map.Entry<Track, Cluster> ecand : eCanditates.entrySet()) {
+            double p = getMomentum(ecand.getKey());
+            aida.histogram1D("p(e-)").fill(p);
+            if(ecand_highestP == null ) {
+                ecand_highestP = ecand;
+                e_pmax = getMomentum(ecand_highestP.getKey());
+             } else {
+                if(p > e_pmax) {
+                    ecand_highestP = ecand;
+                    e_pmax = getMomentum(ecand_highestP.getKey());
+                }
+             }
+        }
+        
+        for(Map.Entry<Track, Cluster> pcand : pCanditates.entrySet()) {
+            double p = getMomentum(pcand.getKey());
+            aida.histogram1D("p(e+)").fill(p);
+            if(pcand_highestP == null ) {
+                pcand_highestP = pcand;
+                p_pmax = getMomentum(pcand_highestP.getKey());
+             } else {
+                if(p > p_pmax) {
+                    pcand_highestP = pcand;
+                    p_pmax = getMomentum(pcand_highestP.getKey());
+                }
+             }
+        }
+        
+        aida.histogram1D("n(e-)").fill(eCanditates.size());
+        aida.histogram1D("n(e+)").fill(pCanditates.size());
+        if(ecand_highestP!=null) {
+            aida.histogram1D("p(e-) max").fill(e_pmax);
+        }
+        if(pcand_highestP!=null) {
+            aida.histogram1D("p(e+) max").fill(p_pmax);
+        }
+        if(ecand_highestP!=null && pcand_highestP!=null) {
+            aida.histogram2D("p(e-) vs p(e+) max").fill(e_pmax, p_pmax);
+        }
+        
+        
+    }
+    
+    private double getMomentum(Track trk) {
+        double p = Math.sqrt(trk.getTrackStates().get(0).getMomentum()[0]*trk.getTrackStates().get(0).getMomentum()[0] +
+                trk.getTrackStates().get(0).getMomentum()[1]*trk.getTrackStates().get(0).getMomentum()[1] +
+             trk.getTrackStates().get(0).getMomentum()[2]*trk.getTrackStates().get(0).getMomentum()[2]);
+        return p;
     }
 
     public int[] getTrackHitsPerLayer(Track trk) {
-        int n[] = {0, 0, 0, 0, 0};
+        int n[] = {0, 0, 0, 0, 0, 0};
         List<TrackerHit> hitsOnTrack = trk.getTrackerHits();
         int layer;
         for (TrackerHit hit : hitsOnTrack) {
@@ -935,8 +1479,8 @@
         String name;
         int l;
         int i;
-        int n[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-        boolean ddd = true;
+        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 + "\"");
@@ -1001,7 +1545,7 @@
                 System.out.println("sensor name  " + name + " --> layer " + l);
             }
 
-            if (l < 1 || l > 10) {
+            if (l < 1 || l > 12) {
                 System.out.println("This layer doesn't exist?");
                 throw new RuntimeException("SiSensor name " + name + " is invalid?");
             }
@@ -1027,6 +1571,8 @@
         //bottomFrame.dispose();
     }
 
+
+    
     private Cluster findClosestCluster(Hep3Vector posonhelix, List<Cluster> clusters) {
         Cluster closest = null;
         double minDist = 9999;
@@ -1034,16 +1580,13 @@
             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) {
+            double distX = Math.abs(clPos[0] - posonhelix.x());
+            double distY = Math.abs(clPos[1] - posonhelix.y());
+            if (dist < minDist && clEne > 0.4) {
                 closest = cluster;
                 minDist = dist;
             }
-//                    if(cluster.getEnergy()/10>500)
-        }
-//        System.out.println("Found a cluster..." + minDist);
-
+        }
         return closest;
-
     }
 }

Modified: java/branches/HPSJAVA-488/util/pom.xml
 =============================================================================
--- java/branches/HPSJAVA-488/util/pom.xml	(original)
+++ java/branches/HPSJAVA-488/util/pom.xml	Fri Jun 12 15:27:10 2015
@@ -7,7 +7,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>../parent/pom.xml</relativePath>
-        <version>3.3.1-SNAPSHOT</version>
+        <version>3.3.3-SNAPSHOT</version>
     </parent>
     <scm>
         <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/util/</url>
@@ -18,7 +18,6 @@
         <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-math3</artifactId>
-            <version>3.2</version>
         </dependency>
     </dependencies>
 </project>

Modified: java/branches/HPSJAVA-488/util/src/main/java/org/hps/util/BasicLogFormatter.java
 =============================================================================
--- java/branches/HPSJAVA-488/util/src/main/java/org/hps/util/BasicLogFormatter.java	(original)
+++ java/branches/HPSJAVA-488/util/src/main/java/org/hps/util/BasicLogFormatter.java	Fri Jun 12 15:27:10 2015
@@ -9,9 +9,10 @@
     private static final String LINE_SEPARATOR = System.getProperty("line.separator");
     public String format(LogRecord record) {
         StringBuilder sb = new StringBuilder();
-        System.out.printf("%s: format called\n",getClass().getSimpleName());
+        //System.out.printf("%s: format called\n",getClass().getSimpleName());
         //sb.append(new Date(record.getMillis()))
-            sb.append("TEST ")
+            //sb.append(getClass().getSimpleName() + " ")
+            sb.append(record.getLoggerName() + " ")
             .append(record.getLevel().getLocalizedName())
             .append(": ")
             .append(formatMessage(record))