LISTSERV mailing list manager LISTSERV 16.5

Help for HPS-SVN Archives


HPS-SVN Archives

HPS-SVN Archives


HPS-SVN@LISTSERV.SLAC.STANFORD.EDU


View:

Message:

[

First

|

Previous

|

Next

|

Last

]

By Topic:

[

First

|

Previous

|

Next

|

Last

]

By Author:

[

First

|

Previous

|

Next

|

Last

]

Font:

Proportional Font

LISTSERV Archives

LISTSERV Archives

HPS-SVN Home

HPS-SVN Home

HPS-SVN  June 2015

HPS-SVN June 2015

Subject:

r3143 - in /java/branches/HPSJAVA-488: ./ analysis/ analysis/src/main/java/org/hps/analysis/dataquality/ analysis/src/main/java/org/hps/analysis/ecal/ analysis/src/main/java/org/hps/analysis/examples/ analysis/src/main/java/org/hps/analysis/trigger/ conditions/ conditions/src/main/java/org/hps/conditions/api/ conditions/src/main/java/org/hps/conditions/database/ conditions/src/main/java/org/hps/conditions/run/ conditions/src/main/java/org/hps/conditions/svt/ conditions/src/test/java/org/hps/conditions/ conditions/src/test/java/org/hps/conditions/svt/ datacat/ detector-data/ detector-data/detectors/HPS-EngRun2015-1_5mm-v0/SamplingFractions/ detector-data/detectors/HPS-EngRun2015-1_5mm-v1/ detector-data/detectors/HPS-EngRun2015-2_5mm-v0/SamplingFractions/ detector-data/detectors/HPS-EngRun2015-2_5mm-v1/ detector-data/detectors/HPS-EngRun2015-2mm-v0/SamplingFractions/ detector-data/detectors/HPS-EngRun2015-2mm-v1/ detector-data/detectors/HPS-EngRun2015-2mmPreRun5216-v1/ detector-data/detectors/HPS-EngRun2015-3_5mm-v0/ detector-data/detectors/HPS-EngRun2015-3mm-v0/SamplingFractions/ detector-data/detectors/HPS-EngRun2015-3mm-v1/ detector-data/detectors/HPS-EngRun2015-4mm-v0/SamplingFractions/ detector-data/detectors/HPS-EngRun2015-4mm-v1/ detector-data/detectors/HPS-EngRun2015-Nominal-v1-dev/ detector-data/detectors/HPS-EngRun2015-Nominal-v1/ detector-data/detectors/HPS-EngRun2015-Open-v0/SamplingFractions/ detector-data/detectors/HPS-EngRun2015-Open-v1/ detector-model/ distribution/ ecal-event-display/ ecal-readout-sim/ ecal-readout-sim/src/main/java/org/hps/readout/ecal/ ecal-recon/ ecal-recon/src/main/java/org/hps/recon/ecal/ ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ ecal-recon/src/main/java/org/hps/recon/ecal/triggerbank/ ecal-recon/src/test/java/org/hps/recon/ecal/cluster/ evio/ evio/src/main/java/org/hps/evio/ evio/src/test/java/org/hps/evio/ integration-tests/ integration-tests/src/main/java/org/ integration-tests/src/test/java/org/hps/test/ monitoring-app/ monitoring-app/src/main/java/org/hps/monitoring/application/ monitoring-app/src/main/scripts/ monitoring-drivers/ monitoring-drivers/src/main/java/org/hps/monitoring/drivers/ecal/ monitoring-drivers/src/main/java/org/hps/monitoring/drivers/example/ monitoring-drivers/src/main/java/org/hps/monitoring/drivers/scalars/ monitoring-drivers/src/main/java/org/hps/monitoring/drivers/scalers/ monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/ monitoring-drivers/src/main/java/org/hps/monitoring/drivers/trackrecon/ monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/ monitoring-util/ monitoring-util/src/main/java/org/hps/monitoring/plotting/ monitoring-util/src/main/java/org/hps/monitoring/subsys/et/ monitoring-util/src/main/java/org/hps/monitoring/trigger/ parent/ plugin/ recon/ recon/src/main/java/org/hps/recon/particle/ record-util/ record-util/src/main/java/org/hps/record/epics/ record-util/src/main/java/org/hps/record/evio/ record-util/src/main/java/org/hps/record/evio/crawler/ record-util/src/main/java/org/hps/record/scalars/ record-util/src/main/java/org/hps/record/scalers/ steering-files/ steering-files/src/main/resources/org/hps/steering/monitoring/ steering-files/src/main/resources/org/hps/steering/production/ steering-files/src/main/resources/org/hps/steering/readout/ steering-files/src/main/resources/org/hps/steering/recon/ steering-files/src/main/resources/org/hps/steering/users/baltzell/ steering-files/src/main/resources/org/hps/steering/users/holly/ steering-files/src/main/resources/org/hps/steering/users/meeg/ steering-files/src/main/resources/org/hps/steering/users/mgraham/ steering-files/src/main/resources/org/hps/steering/users/phansson/ tracking/ tracking/src/main/java/org/hps/readout/svt/ tracking/src/main/java/org/hps/recon/tracking/ tracking/src/main/java/org/hps/recon/tracking/gbl/ tracking/src/main/java/org/hps/svt/alignment/ tracking/src/main/resources/org/hps/recon/tracking/strategies/ users/ users/src/main/java/org/hps/users/baltzell/ users/src/main/java/org/hps/users/celentan/ users/src/main/java/org/hps/users/holly/ users/src/main/java/org/hps/users/jeremym/ users/src/main/java/org/hps/users/luca/ users/src/main/java/org/hps/users/meeg/ users/src/main/java/org/hps/users/mgraham/ users/src/main/java/org/hps/users/omoreno/ users/src/main/java/org/hps/users/phansson/ util/ util/src/main/java/org/hps/util/

From:

[log in to unmask]

Reply-To:

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

Date:

Fri, 12 Jun 2015 22:30:04 -0000

Content-Type:

text/plain

Parts/Attachments:

Parts/Attachments

text/plain (19802 lines)

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<BaseStructure> eventBanks = new ArrayList<BaseStructure>();
 
     // 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<BaseStructure> rocBanks = new ArrayList<BaseStructure>();

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))

Top of Message | Previous Page | Permalink

Advanced Options


Options

Log In

Log In

Get Password

Get Password


Search Archives

Search Archives


Subscribe or Unsubscribe

Subscribe or Unsubscribe


Archives

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

ATOM RSS1 RSS2



LISTSERV.SLAC.STANFORD.EDU

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

Privacy Notice, Security Notice and Terms of Use