Print

Print


Commit in hps-java on MAIN
src/main/resources/org/lcsim/hps/steering/ecal_fadc_bkgd.lcsim+6-61.13 -> 1.14
                                         /OfflineTrackingAxial.lcsim-11.5 -> 1.6
                                         /raw_triggers.lcsim+2-91.2 -> 1.3
                                         /OnlineTracking.lcsim-11.16 -> 1.17
                                         /HPS2014ReadoutToEvio.lcsim-971.4 removed
                                         /HPSTestRunPairTrigger.lcsim-751.5 removed
                                         /HPSTestRunReconToLcio.lcsim-911.11 removed
                                         /HPSTestRunReconToEvio.lcsim-911.20 removed
                                         /HPSTestRunLcioToEvio.lcsim-241.2 removed
                                         /HpsTestRunSim.lcsim-1261.5 removed
                                         /HPS2014ReadoutNoPileup.lcsim-561.1 removed
                                         /HPSTestRunNoPileup.lcsim-531.4 removed
                                         /HPS2014ReadoutToLcio.lcsim-1041.4 removed
src/main/java/org/lcsim/hps/monitoring/ecal/EcalWindowPlots.java+5-51.6 -> 1.7
                                           /EcalEvsX.java+2-21.10 -> 1.11
                                           /EcalClusterPlots.java+2-21.8 -> 1.9
                                           /EcalHitPlots.java+2-21.8 -> 1.9
                                           /EcalDaqPlots.java+9-91.6 -> 1.7
                                           /EcalPedestalPlots.java+5-51.11 -> 1.12
src/main/java/org/lcsim/hps/recon/ecal/EcalReadoutToTriggerConverterDriver.java+189added 1.1
                                      /ECalUtils.java+61added 1.1
                                      /EcalConverterDriver.java+86added 1.1
                                      /EcalRawConverterDriver.java+158added 1.1
                                      /EcalClusterer.java+171added 1.1
                                      /CTPEcalClusterer.java+308added 1.1
                                      /EcalConditions.java+342added 1.1
                                      /EcalTriggerFilterDriver.java+108added 1.1
                                      /EcalEdepToTriggerConverterDriver.java+188added 1.1
                                      /EcalRawConverter.java+101added 1.1
                                      /HPSCalorimeterHit.java+72added 1.1
                                      /EcalCrystalFilter.java+4-41.6 -> 1.7
                                      /FADCConverterDriver.java+2-21.3 -> 1.4
                                      /HPSEcalCluster.java+3-31.10 -> 1.11
                                      /HPSRawCalorimeterHit.java+45-571.8 -> 1.9
                                      /HPSEcal1BitClusterer.java-3801.20 removed
                                      /HPSEcalSimpleReadoutDriver.java-581.10 removed
                                      /HPSEcalCTPClusterer.java-3081.8 removed
                                      /HPSEcalFADCReadoutDriver.java-4661.22 removed
                                      /TestRunRateAnalysis.java-1691.4 removed
                                      /HPSEcalReadoutDriver.java-1521.21 removed
                                      /TestRunTriggerDriver.java-1001.9 removed
                                      /HPSEcalConverterDriver.java-861.6 removed
                                      /HPSEcalRawConverter.java-1011.14 removed
                                      /HPSEcalWindowDiscriminatorReadoutDriver.java-921.4 removed
                                      /HPSECalUtils.java-611.3 removed
                                      /HPS1BitTriggerDriver.java-301.3 removed
                                      /HPSFADCSingleTriggerDriver.java-1281.2 removed
                                      /HPSEcalDiscriminatorReadoutDriver.java-1191.6 removed
                                      /HPSEcalClusterer.java-1711.25 removed
                                      /HPSEcalReadoutToTriggerConverterDriver.java-1891.3 removed
                                      /HPSFADCCalorimeterHit.java-611.3 removed
                                      /HPSEcal1BitClusterVetoClusterer.java-811.4 removed
                                      /HPSEcalTimeEvolutionReadoutDriver.java-931.11 removed
                                      /HPSFADCTriggerDriver.java-4751.20 removed
                                      /HPSEcal1BitEventVetoClusterer.java-691.4 removed
                                      /HPSEcalTriggerFilterDriver.java-1081.3 removed
                                      /HPSEcalEdepToTriggerConverterDriver.java-1881.7 removed
                                      /HPSEcalConditions.java-3421.21 removed
                                      /HPSTriggerDriver.java-2221.22 removed
                                      /HPSEcalRawConverterDriver.java-1581.16 removed
                                      /HPSDummyTriggerDriver.java-301.3 removed
sandbox/HPS1BitTriggerDriver.java+32added 1.1
       /HPSEcalWindowDiscriminatorReadoutDriver.java+94added 1.1
       /HPSEcalDiscriminatorReadoutDriver.java+121added 1.1
       /HPSEcal1BitClusterer.java+380added 1.1
       /HPSEcal1BitClusterVetoClusterer.java+81added 1.1
       /HPSEcal1BitEventVetoClusterer.java+69added 1.1
       /HPSFADCSingleTriggerDriver.java+128added 1.1
src/main/java/org/lcsim/hps/evio/ECalHitWriter.java+17-171.3 -> 1.4
                                /TestRunTriggeredReconToEvio.java+6-61.21 -> 1.22
                                /TestRunTriggeredReconToLcio.java+4-41.10 -> 1.11
                                /ECalEvioReader.java+8-81.21 -> 1.22
                                /TestRunEvioToLcio.java+2-21.24 -> 1.25
src/main/resources/org/lcsim/hps/steering/readout/TestRunNoPileup.lcsim+53added 1.1
                                                 /HPS2014ReadoutNoPileup.lcsim+56added 1.1
                                                 /TestRunSim.lcsim+126added 1.1
                                                 /TestRunReadoutToEvio.lcsim+91added 1.1
                                                 /TestRunReadoutToLcio.lcsim+91added 1.1
                                                 /HPS2014ReadoutToLcio.lcsim+104added 1.1
                                                 /TestRunPairTrigger.lcsim+75added 1.1
                                                 /HPS2014ReadoutToEvio.lcsim+97added 1.1
                                                 /HPSTestRunLcioToEvio.lcsim+24added 1.1
src/main/java/org/lcsim/hps/recon/tracking/HPSSVTCalibrationConstants.java+4-41.22 -> 1.23
src/main/java/org/lcsim/hps/readout/ecal/FADCTriggerDriver.java+477added 1.1
                                        /TimeEvolutionEcalReadoutDriver.java+94added 1.1
                                        /TestRunTriggerDriver.java+102added 1.1
                                        /TriggerDriver.java+223added 1.1
                                        /FADCEcalReadoutDriver.java+469added 1.1
                                        /SimpleEcalReadoutDriver.java+59added 1.1
                                        /EcalReadoutDriver.java+152added 1.1
                                        /DummyTriggerDriver.java+31added 1.1
src/main/java/org/lcsim/hps/monitoring/CalibrationDriver.java+105added 1.1
                                      /HPSCalibrationDriver.java-1051.8 removed
src/main/java/org/lcsim/hps/users/phansson/MultScatAnalysis.java+5-51.7 -> 1.8
                                          /TrigRateDriver.java+5-51.5 -> 1.6
                                          /ecalGainAna.java+18-181.9 -> 1.10
                                          /ECalGainDriver.java+2-21.11 -> 1.12
src/main/java/org/lcsim/hps/analysis/ecal/TestRunRateAnalysis.java+170added 1.1
                                         /HPSEcalTriggerPlotsDriver.java+12-121.6 -> 1.7
                                         /HPSEcalPlotsDriver.java+7-71.15 -> 1.16
                                         /HPSEcalFADCPlotsDriver.java+4-41.3 -> 1.4
src/test/java/org/lcsim/hps/recon/tracking/MainTrackingDriver.java+2-21.1 -> 1.2
+5471-5463
37 added + 37 removed + 28 modified, total 102 files
clean up ECal classes, start organizing steering files, make a huge mess

hps-java/src/main/resources/org/lcsim/hps/steering
ecal_fadc_bkgd.lcsim 1.13 -> 1.14
diff -u -r1.13 -r1.14
--- ecal_fadc_bkgd.lcsim	20 Nov 2012 23:32:22 -0000	1.13
+++ ecal_fadc_bkgd.lcsim	25 Feb 2013 22:39:24 -0000	1.14
@@ -1,7 +1,7 @@
 <!--
     Example LCSim steering file to run trigger rate studies
     @author Sho Uemura <[log in to unmask]>
-    @version $Id: ecal_fadc_bkgd.lcsim,v 1.13 2012/11/20 23:32:22 meeg Exp $
+    @version $Id: ecal_fadc_bkgd.lcsim,v 1.14 2013/02/25 22:39:24 meeg Exp $
 -->
 <lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
        xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd">
@@ -9,7 +9,7 @@
 		<printInputFiles>true</printInputFiles>
 	</control>
 	<execute>
-        <driver name="HPSCalibrationDriver"/>   
+        <driver name="CalibrationDriver"/>   
 		<driver name="EventMarkerDriver"/>
 		<driver name="EcalReadout"/>
 		<driver name="EcalConverter"/>
@@ -24,13 +24,13 @@
 		<driver name="ClockDriver"/>
 	</execute>
 	<drivers>
-        <driver name="HPSCalibrationDriver" type="org.lcsim.hps.monitoring.HPSCalibrationDriver"/>   
+        <driver name="CalibrationDriver" type="org.lcsim.hps.monitoring.CalibrationDriver"/>   
 		<driver name="Writer"
                 type="org.lcsim.util.loop.LCIODriver">
 			<outputFilePath>${outputFile}_ecalClusters</outputFilePath>
 		</driver>
 		<driver name="EcalReadout"
-                type="org.lcsim.hps.recon.ecal.HPSEcalFADCReadoutDriver">
+                type="org.lcsim.hps.readout.ecal.FADCEcalReadoutDriver">
 			<readoutPeriod>4.0</readoutPeriod>
 			<coincidenceWindow>2</coincidenceWindow>
 			<ecalName>Ecal</ecalName>
@@ -48,12 +48,12 @@
 			<gain>0.15</gain>
 		</driver>
 		<driver name="EcalClusterer"
-                type="org.lcsim.hps.recon.ecal.HPSEcalCTPClusterer">
+                type="org.lcsim.hps.recon.ecal.CTPEcalClusterer">
 			<ecalName>Ecal</ecalName>
 			<ecalCollectionName>EcalCorrectedHits</ecalCollectionName>
 		</driver>
 		<driver name="EcalTrigger"
-                type="org.lcsim.hps.recon.ecal.HPSFADCTriggerDriver">
+                type="org.lcsim.hps.readout.ecal.FADCTriggerDriver">
 			<clusterCollectionName>EcalClusters</clusterCollectionName>
 			<outputFileName>${outputFile}.triggers</outputFileName>
 			<deadTime>10</deadTime>

hps-java/src/main/resources/org/lcsim/hps/steering
OfflineTrackingAxial.lcsim 1.5 -> 1.6
diff -u -r1.5 -r1.6
--- OfflineTrackingAxial.lcsim	26 Nov 2012 18:12:36 -0000	1.5
+++ OfflineTrackingAxial.lcsim	25 Feb 2013 22:39:24 -0000	1.6
@@ -44,7 +44,6 @@
 
         <driver name="SVTHitRecoPlots"
                 type="org.lcsim.hps.monitoring.svt.SVTHitReconstructionPlots">
-             <rawTrackerHitCollectionName>SVTRawTrackerHits</rawTrackerHitCollectionName>   
              <fittedTrackerHitCollectionName>SVTFittedRawTrackerHits</fittedTrackerHitCollectionName>   
              <outputPlots>svtHitRecoPlots.aida</outputPlots>
         </driver>

hps-java/src/main/resources/org/lcsim/hps/steering
raw_triggers.lcsim 1.2 -> 1.3
diff -u -r1.2 -r1.3
--- raw_triggers.lcsim	27 Aug 2012 22:42:19 -0000	1.2
+++ raw_triggers.lcsim	25 Feb 2013 22:39:24 -0000	1.3
@@ -1,20 +1,13 @@
 <!--
     steering file used for PAC 39 analysis
     @author Sho Uemura <[log in to unmask]>
-    @version $Id: raw_triggers.lcsim,v 1.2 2012/08/27 22:42:19 meeg Exp $
+    @version $Id: raw_triggers.lcsim,v 1.3 2013/02/25 22:39:24 meeg Exp $
 -->
 <lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
        xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd">
-	<inputFiles>
-		<file>${inputFile}</file>
-	</inputFiles>
 	<control>
-		<numberOfEvents>-1</numberOfEvents>
 		<printInputFiles>true</printInputFiles>
 	</control>
-	<classpath>
-		<jar>~/.m2/repository/org/lcsim/hps-java/1.0-SNAPSHOT/hps-java-1.0-SNAPSHOT.jar</jar>
-	</classpath>
 	<execute>
 <!--        <driver name="HPSCalibrationDriver"/>   -->
 <!--		<driver name="EventMarkerDriver"/>-->
@@ -33,7 +26,7 @@
             <addEMin>0.075</addEMin>
 		</driver>
 		<driver name="EcalTrigger"
-                type="org.lcsim.hps.recon.ecal.TestRunRateAnalysis">
+                type="org.lcsim.hps.analysis.ecal.TestRunRateAnalysis">
 			<clusterCollectionName>EcalClusters</clusterCollectionName>
             <clusterEnergyLow>0.6</clusterEnergyLow>
 		</driver>

hps-java/src/main/resources/org/lcsim/hps/steering
OnlineTracking.lcsim 1.16 -> 1.17
diff -u -r1.16 -r1.17
--- OnlineTracking.lcsim	26 Nov 2012 18:12:36 -0000	1.16
+++ OnlineTracking.lcsim	25 Feb 2013 22:39:24 -0000	1.17
@@ -55,7 +55,6 @@
 
         <driver name="SVTHitRecoPlots"
                 type="org.lcsim.hps.monitoring.svt.SVTHitReconstructionPlots">
-             <rawTrackerHitCollectionName>SVTRawTrackerHits</rawTrackerHitCollectionName>   
              <fittedTrackerHitCollectionName>SVTFittedRawTrackerHits</fittedTrackerHitCollectionName>   
              <outputPlots>svtHitRecoPlots.aida</outputPlots>
         </driver>

hps-java/src/main/resources/org/lcsim/hps/steering
HPS2014ReadoutToEvio.lcsim removed after 1.4
diff -N HPS2014ReadoutToEvio.lcsim
--- HPS2014ReadoutToEvio.lcsim	20 Dec 2012 08:31:34 -0000	1.4
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,97 +0,0 @@
-<!-- 
-  Execute full trigger+readout simulation and write the results as an EVIO file.
-  @author Sho Uemura <[log in to unmask]>
-  @version $Id: HPS2014ReadoutToEvio.lcsim,v 1.4 2012/12/20 08:31:34 omoreno Exp $
--->
-<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="HPSCalibrationDriver"/>   
-        <driver name="EcalReadout"/>
-        <driver name="EcalConverter"/>
-        <driver name="EcalClusterer"/>
-        <driver name="EcalTrigger"/>
-        
-<!--        <driver name="SimpleSVTReadout"/>-->
-
-        <driver name="SVTReadout"/>
-        <driver name="Digitization"/>
-        <driver name="DataProcessing"/>
-        <driver name="TestRunReconToEvio"/>
-
-        <driver name="ClockDriver"/>
-        <driver name="CleanupDriver"/>
-    </execute> 
-
-    <drivers>
-        <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">
-            <eventInterval>1000</eventInterval>
-        </driver> 
-        <driver name="HPSCalibrationDriver" type="org.lcsim.hps.monitoring.HPSCalibrationDriver">
-<!--            <runNumber>1351</runNumber>    -->
-        </driver>
-        <driver name="TestRunReconToEvio" type="org.lcsim.hps.evio.TestRunTriggeredReconToEvio">
-            <evioOutputFile>${outputFile}</evioOutputFile>
-        </driver>
-			
-        <driver name="EcalReadout" type="org.lcsim.hps.recon.ecal.HPSEcalFADCReadoutDriver">
-            <readoutPeriod>4.0</readoutPeriod>
-            <coincidenceWindow>2</coincidenceWindow>
-            <ecalName>Ecal</ecalName>
-            <ecalCollectionName>EcalHits</ecalCollectionName>
-            <ecalRawCollectionName>EcalRawHits</ecalRawCollectionName>
-            <triggerThreshold>50</triggerThreshold>
-            <readoutThreshold>50</readoutThreshold>
-            <constantTriggerWindow>true</constantTriggerWindow>
-            <scaleFactor>1</scaleFactor>
-            <fixedGain>0.15</fixedGain>
-<!--            <debug>true</debug>-->
-        </driver>
-
-        <driver name="EcalConverter" type="org.lcsim.hps.recon.ecal.HPSEcalRawConverterDriver">
-            <rawCollectionName>EcalRawHits</rawCollectionName>
-            <ecalCollectionName>EcalCorrectedHits</ecalCollectionName>
-            <gain>0.15</gain>
-            <applyBadCrystalMap>false</applyBadCrystalMap>
-<!--            <debug>true</debug>-->
-        </driver>	
-
-        <driver name="EcalClusterer" type="org.lcsim.hps.recon.ecal.HPSEcalCTPClusterer">
-            <ecalName>Ecal</ecalName>
-            <clusterWindow>32.0</clusterWindow>
-            <ecalCollectionName>EcalCorrectedHits</ecalCollectionName>
-        </driver>
-
-        <driver name="EcalTrigger" type="org.lcsim.hps.recon.ecal.HPSFADCTriggerDriver">
-            <clusterCollectionName>EcalClusters</clusterCollectionName>
-            <deadTime>10</deadTime>
-            <outputFileName>${outputFile}.triggers</outputFileName>
-        </driver>	
-        <driver name="SimpleSVTReadout" type="org.lcsim.hps.recon.tracking.SimpleSvtReadout">
-        </driver>
-
-        <driver name="SVTReadout" type="org.lcsim.hps.recon.tracking.apv25.SvtReadout">
-            <debug>false</debug>
-            <pedestalRun>false</pedestalRun>
-            <triggerLatencyTime>240</triggerLatencyTime>
-        </driver>
-        
-        <driver name="Digitization" type="org.lcsim.hps.recon.tracking.RearTransitionModule" />
-
-        <driver name="DataProcessing" type="org.lcsim.hps.recon.tracking.TestRunDataProcessingModule" >
-            <enablePileUpCut>true</enablePileUpCut>
-            <enableThresholdCut>true</enableThresholdCut>
-            <noiseThreshold>2</noiseThreshold>
-            <numberOfSamplesAboveThreshold>3</numberOfSamplesAboveThreshold>
-            <numberOfSamplesToReadOut>6</numberOfSamplesToReadOut>
-        </driver>
-
-        <driver name="ClockDriver" type="org.lcsim.hps.util.ClockDriver"/>
-        <driver name="CleanupDriver" type="org.lcsim.recon.tracking.digitization.sisim.config.ReadoutCleanupDriver">
-            <collectionNames>TrackerHits</collectionNames>
-        </driver> 
-    </drivers>
-</lcsim>
-	

hps-java/src/main/resources/org/lcsim/hps/steering
HPSTestRunPairTrigger.lcsim removed after 1.5
diff -N HPSTestRunPairTrigger.lcsim
--- HPSTestRunPairTrigger.lcsim	25 Nov 2012 21:57:42 -0000	1.5
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,75 +0,0 @@
-
-<lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
-       xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd">       
-    <inputFiles>
-        <!--<fileRegExp baseDir="./../data/mc/Reach-2pt2" >.*gev60.*</fileRegExp>-->
-<!--        <fileRegExp baseDir="./../data/mc/Reach-2pt2" >.*gev100.*</fileRegExp>-->
-    </inputFiles>
-    <control>
-<!--        <numberOfEvents>10000</numberOfEvents>-->
-        <printInputFiles>true</printInputFiles>
-        <printDriversDetailed>true</printDriversDetailed>
-    </control>    
-    <execute>
-        <driver name="EventMarkerDriver"/>
-        <driver name="HPSCalibrationDriver"/>
-        <driver name="EcalRawConverter"/>
-<!--        <driver name="HPSEcalRawConverterDriver"/> -->
-<!--        <driver name="EcalTriggerFilter"/> -->
-        <driver name="EcalTriggerClusterer"/>
-<!--        <driver name="SimpleSVTReadout"/> -->
-        <driver name="EcalTrigger"/>
-        <driver name="ClockDriver"/>
-<!--        <driver name="MCParticlePlots"/>-->
-<!--        <driver name="TriggerTurnOnAnalysis"/>-->
-        
-    </execute>    
-    <drivers>
-        <driver name="HPSCalibrationDriver" type="org.lcsim.hps.monitoring.HPSCalibrationDriver">
-        </driver>
-        <driver name="EcalRawConverter" type="org.lcsim.hps.recon.ecal.HPSEcalEdepToTriggerConverterDriver">
-            <readoutCollection>EcalReadoutAnalogHits</readoutCollection>
-            <applyBadCrystalMap>false</applyBadCrystalMap>
-            <truncateScale>1</truncateScale>
-            <constantGain>0.15</constantGain>
-        </driver>
-<!--        <driver name="HPSEcalRawConverterDriver" type="org.lcsim.hps.recon.ecal.HPSEcalRawConverterDriver">
-            <runBackwards>true</runBackwards>
-            <rawCollectionName>EcalReadoutHits</rawCollectionName>
-            <ecalCollectionName>EcalReadoutAnalogHits</ecalCollectionName>
-        </driver>-->
-<!--        <driver name="EcalTriggerFilter" type="org.lcsim.hps.recon.ecal.HPSEcalTriggerFilterDriver">
-            <inputCollection>EcalTriggerHits</inputCollection>
-            <outputCollection>EcalFilteredHits</outputCollection>
-        </driver>-->
-        <driver name="EcalTriggerClusterer" type="org.lcsim.hps.recon.ecal.HPSEcalCTPClusterer">
-            <ecalName>Ecal</ecalName>
-            <ecalCollectionName>EcalReadoutAnalogHits</ecalCollectionName>
-<!--            <ecalCollectionName>EcalFilteredHits</ecalCollectionName>-->
-            <clusterCollectionName>EcalTriggerClusters</clusterCollectionName>
-        </driver>
-<!--        <driver name="EcalTrigger" type="org.lcsim.hps.recon.ecal.TestRunTriggerDriver">-->
-        <driver name="EcalTrigger" type="org.lcsim.hps.recon.ecal.HPSFADCTriggerDriver">
-        <!--<driver name="EcalTrigger" type="org.lcsim.hps.recon.ecal.HPSFADCSingleTriggerDriver">-->
-            <clusterCollectionName>EcalTriggerClusters</clusterCollectionName>
-			<outputFileName>${outputFile}.triggers</outputFileName>
-            <deadTime>0</deadTime>
-            <!--<lcioFile>${outputFile}</lcioFile>-->
-        </driver>	
-        <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">
-            <eventInterval>1000</eventInterval>
-        </driver>
-        
-        <driver name="SimpleSVTReadout" type="org.lcsim.hps.recon.tracking.SimpleSvtReadout">
-            <noPileup>true</noPileup>
-        </driver>
-        <driver name="ClockDriver" type="org.lcsim.hps.util.ClockDriver"/>
-        <driver name="MCParticlePlots" type="org.lcsim.hps.analysis.ecal.HPSMCParticlePlotsDriver">
-            <hideFrame>true</hideFrame>
-        </driver>
-        <driver name="TriggerTurnOnAnalysis" type="org.lcsim.hps.users.phansson.TriggerTurnOnAnalysis">
-            <aidaFileName>${outputFile}</aidaFileName>
-            <hideFrame>true</hideFrame>
-        </driver>
-    </drivers>
-</lcsim>

hps-java/src/main/resources/org/lcsim/hps/steering
HPSTestRunReconToLcio.lcsim removed after 1.11
diff -N HPSTestRunReconToLcio.lcsim
--- HPSTestRunReconToLcio.lcsim	18 Dec 2012 23:49:29 -0000	1.11
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,91 +0,0 @@
-<!-- 
-  Execute test run full recon and write the results as an LCIO file.
--->
-<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="HPSCalibrationDriver"/>   
-        <driver name="EcalReadout"/>
-        <driver name="EcalConverter"/>
-        <driver name="EcalTriggerFilter"/>
-        <driver name="EcalClusterer"/>
-        <driver name="EcalTrigger"/>
-<!--        <driver name="SimpleSVTReadout"/>-->
-        <driver name="SVTReadout"/>
-        <driver name="Digitization"/>
-        <driver name="DataProcessing"/>
-        <driver name="ClockDriver"/>
-        <driver name="TestRunReconToLcio"/>
-        <driver name="CleanupDriver"/>
-    </execute> 
-
-    <drivers>
-<!--        <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">
-            <eventInterval>1</eventInterval>
-        </driver> -->
-        <driver name="HPSCalibrationDriver" type="org.lcsim.hps.monitoring.HPSCalibrationDriver">
-<!--            <runNumber>1351</runNumber>    -->
-        </driver>
-        <driver name="TestRunReconToLcio" type="org.lcsim.hps.evio.TestRunTriggeredReconToLcio">
-            <outputFile>${outputFile}</outputFile>
-        </driver>
-			
-        <driver name="EcalReadout" type="org.lcsim.hps.recon.ecal.HPSEcalFADCReadoutDriver">
-            <readoutPeriod>4.0</readoutPeriod>
-            <coincidenceWindow>2</coincidenceWindow>
-            <ecalName>Ecal</ecalName>
-            <ecalCollectionName>EcalHits</ecalCollectionName>
-            <ecalRawCollectionName>EcalRawHits</ecalRawCollectionName>
-            <triggerThreshold>80</triggerThreshold>
-            <readoutThreshold>50</readoutThreshold>
-        </driver>
-
-        <driver name="EcalConverter" type="org.lcsim.hps.recon.ecal.HPSEcalConverterDriver">
-            <rawCollectionName>EcalRawHits</rawCollectionName>
-            <ecalCollectionName>EcalCorrectedHits</ecalCollectionName>
-            <scale>1</scale>
-        </driver>	
-        
-        <driver name="EcalTriggerFilter" type="org.lcsim.hps.recon.ecal.HPSEcalTriggerFilterDriver">
-            <inputCollection>EcalCorrectedHits</inputCollection>
-            <outputCollection>EcalFilteredHits</outputCollection>
-        </driver>
-
-        <driver name="EcalClusterer" type="org.lcsim.hps.recon.ecal.HPSEcalCTPClusterer">
-            <ecalName>Ecal</ecalName>
-            <clusterWindow>32.0</clusterWindow>
-            <ecalCollectionName>EcalFilteredHits</ecalCollectionName>
-        </driver>
-
-        <driver name="EcalTrigger" type="org.lcsim.hps.recon.ecal.TestRunTriggerDriver">
-            <clusterCollectionName>EcalClusters</clusterCollectionName>
-            <deadTime>10</deadTime>
-			<outputFileName>${outputFile}.triggers</outputFileName>
-        </driver>	
-        <driver name="SimpleSVTReadout" type="org.lcsim.hps.recon.tracking.SimpleSvtReadout">
-        </driver>
-
-        <driver name="SVTReadout" type="org.lcsim.hps.recon.tracking.apv25.SvtReadout">
-            <debug>false</debug>
-            <pedestalRun>false</pedestalRun>
-            <triggerLatencyTime>288</triggerLatencyTime>
-        </driver>
-        
-        <driver name="Digitization" type="org.lcsim.hps.recon.tracking.RearTransitionModule" />
-
-        <driver name="DataProcessing" type="org.lcsim.hps.recon.tracking.TestRunDataProcessingModule" >
-            <enablePileUpCut>true</enablePileUpCut>
-            <enableThresholdCut>true</enableThresholdCut>
-            <noiseThreshold>2</noiseThreshold>
-            <numberOfSamplesAboveThreshold>3</numberOfSamplesAboveThreshold>
-            <numberOfSamplesToReadOut>6</numberOfSamplesToReadOut>
-        </driver>
-
-        <driver name="ClockDriver" type="org.lcsim.hps.util.ClockDriver"/>
-        <driver name="CleanupDriver" type="org.lcsim.recon.tracking.digitization.sisim.config.ReadoutCleanupDriver">
-            <collectionNames>TrackerHits</collectionNames>
-        </driver> 
-    </drivers>
-</lcsim>
-	

hps-java/src/main/resources/org/lcsim/hps/steering
HPSTestRunReconToEvio.lcsim removed after 1.20
diff -N HPSTestRunReconToEvio.lcsim
--- HPSTestRunReconToEvio.lcsim	18 Dec 2012 23:49:29 -0000	1.20
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,91 +0,0 @@
-<!-- 
-  Execute test run full recon and write the results as an EVIO file.
--->
-<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="HPSCalibrationDriver"/>   
-        <driver name="EcalReadout"/>
-        <driver name="EcalConverter"/>
-        <driver name="EcalTriggerFilter"/>
-        <driver name="EcalClusterer"/>
-        <driver name="EcalTrigger"/>
-<!--        <driver name="SimpleSVTReadout"/>-->
-        <driver name="SVTReadout"/>
-        <driver name="Digitization"/>
-        <driver name="DataProcessing"/>
-        <driver name="ClockDriver"/>
-        <driver name="TestRunReconToEvio"/>
-        <driver name="CleanupDriver"/>
-    </execute> 
-
-    <drivers>
-        <!--<driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">
-            <eventInterval>1</eventInterval>
-        </driver> -->
-        <driver name="HPSCalibrationDriver" type="org.lcsim.hps.monitoring.HPSCalibrationDriver">
-<!--            <runNumber>1351</runNumber>    -->
-        </driver>
-        <driver name="TestRunReconToEvio" type="org.lcsim.hps.evio.TestRunTriggeredReconToEvio">
-            <evioOutputFile>${evioFile}</evioOutputFile>
-        </driver>
-			
-        <driver name="EcalReadout" type="org.lcsim.hps.recon.ecal.HPSEcalFADCReadoutDriver">
-            <readoutPeriod>4.0</readoutPeriod>
-            <coincidenceWindow>2</coincidenceWindow>
-            <ecalName>Ecal</ecalName>
-            <ecalCollectionName>EcalHits</ecalCollectionName>
-            <ecalRawCollectionName>EcalRawHits</ecalRawCollectionName>
-            <triggerThreshold>80</triggerThreshold>
-            <readoutThreshold>50</readoutThreshold>
-        </driver>
-
-        <driver name="EcalConverter" type="org.lcsim.hps.recon.ecal.HPSEcalConverterDriver">
-            <rawCollectionName>EcalRawHits</rawCollectionName>
-            <ecalCollectionName>EcalCorrectedHits</ecalCollectionName>
-            <scale>1</scale>
-        </driver>	
-        
-        <driver name="EcalTriggerFilter" type="org.lcsim.hps.recon.ecal.HPSEcalTriggerFilterDriver">
-            <inputCollection>EcalCorrectedHits</inputCollection>
-            <outputCollection>EcalFilteredHits</outputCollection>
-        </driver>
-
-        <driver name="EcalClusterer" type="org.lcsim.hps.recon.ecal.HPSEcalCTPClusterer">
-            <ecalName>Ecal</ecalName>
-            <clusterWindow>32.0</clusterWindow>
-            <ecalCollectionName>EcalFilteredHits</ecalCollectionName>
-        </driver>
-
-        <driver name="EcalTrigger" type="org.lcsim.hps.recon.ecal.TestRunTriggerDriver">
-            <clusterCollectionName>EcalClusters</clusterCollectionName>
-            <deadTime>10</deadTime>
-			<outputFileName>${evioFile}.triggers</outputFileName>
-        </driver>	
-        <driver name="SimpleSVTReadout" type="org.lcsim.hps.recon.tracking.SimpleSvtReadout">
-        </driver>
-
-        <driver name="SVTReadout" type="org.lcsim.hps.recon.tracking.apv25.SvtReadout">
-            <debug>false</debug>
-            <pedestalRun>false</pedestalRun>
-            <triggerLatencyTime>288</triggerLatencyTime>
-        </driver>
-        
-        <driver name="Digitization" type="org.lcsim.hps.recon.tracking.RearTransitionModule" />
-
-        <driver name="DataProcessing" type="org.lcsim.hps.recon.tracking.TestRunDataProcessingModule" >
-            <enablePileUpCut>true</enablePileUpCut>
-            <enableThresholdCut>true</enableThresholdCut>
-            <noiseThreshold>2</noiseThreshold>
-            <numberOfSamplesAboveThreshold>3</numberOfSamplesAboveThreshold>
-            <numberOfSamplesToReadOut>6</numberOfSamplesToReadOut>
-        </driver>
-
-        <driver name="ClockDriver" type="org.lcsim.hps.util.ClockDriver"/>
-        <driver name="CleanupDriver" type="org.lcsim.recon.tracking.digitization.sisim.config.ReadoutCleanupDriver">
-            <collectionNames>TrackerHits</collectionNames>
-        </driver> 
-    </drivers>
-</lcsim>
-	

hps-java/src/main/resources/org/lcsim/hps/steering
HPSTestRunLcioToEvio.lcsim removed after 1.2
diff -N HPSTestRunLcioToEvio.lcsim
--- HPSTestRunLcioToEvio.lcsim	31 Aug 2012 01:30:47 -0000	1.2
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,24 +0,0 @@
-<!-- 
-  Convert LCIO file to EVIO file.
--->
-<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="DummyTrigger"/>
-        <driver name="TestRunReconToEvio"/>
-        <driver name="ClockDriver"/>
-    </execute> 
-
-    <drivers>
-        <driver name="DummyTrigger" type="org.lcsim.hps.recon.ecal.HPSDummyTriggerDriver">
-            <period>1</period>
-            <deadTime>0</deadTime>
-        </driver>	
-        <driver name="TestRunReconToEvio" type="org.lcsim.hps.evio.TestRunTriggeredReconToEvio">
-            <evioOutputFile>${evioFile}</evioOutputFile>
-        </driver>
-        <driver name="ClockDriver" type="org.lcsim.hps.util.ClockDriver">
-        </driver>
-    </drivers>
-</lcsim>
-	

hps-java/src/main/resources/org/lcsim/hps/steering
HpsTestRunSim.lcsim removed after 1.5
diff -N HpsTestRunSim.lcsim
--- HpsTestRunSim.lcsim	18 Dec 2012 23:49:29 -0000	1.5
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,126 +0,0 @@
-
-<lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd">
-
-    <inputFiles>
-        <file>${inputFile}</file>
-    </inputFiles>
-
-    <control>
-        <printInputFiles>true</printInputFiles>
-        <printDriversDetailed>true</printDriversDetailed>
-    </control>
-
-    <execute>
-        <driver name="HPSCalibrations"           />
-        <driver name="EventMarkerDriver"         />
-        <!-- Ecal -->
-        <driver name="EcalReadout"               />
-        <driver name="EcalConverter"             />
-        <driver name="EcalTriggerFilter"/>
-        <driver name="EcalClusterer"             />
-        <driver name="EcalTrigger"               /> 
-        <!-- SVT -->
-        <driver name="SVTReadout"                />
-        <driver name="Digitization"              />
-        <driver name="DataProcessing"            />
-        <!-- Recon -->
-        <driver name="RawTrackerHitFitterDriver" />
-        <driver name="TrackerHitDriver"          /> 
-        <driver name="HelicalTrackHitDriver"     /> 
-        <driver name="TrackerReconDriver"        />
-        <driver name="ClockDriver"               />
-        <driver name="CleanupDriver"             />    
-    </execute>
-
-    <drivers>
-
-        <driver name="HPSCalibrations" type="org.lcsim.hps.monitoring.HPSCalibrationDriver">
-            <runNumber>1351</runNumber>
-        </driver>     
-
-        <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">
-            <eventInterval>1000</eventInterval>
-        </driver>
-
-        <driver name="EcalReadout" type="org.lcsim.hps.recon.ecal.HPSEcalFADCReadoutDriver">
-            <readoutPeriod>4.0</readoutPeriod>
-            <coincidenceWindow>2</coincidenceWindow>
-            <ecalName>Ecal</ecalName>
-            <ecalCollectionName>EcalHits</ecalCollectionName>
-            <ecalRawCollectionName>EcalRawHits</ecalRawCollectionName>
-            <triggerThreshold>80</triggerThreshold>
-            <readoutThreshold>50</readoutThreshold>
-        </driver>
-
-        <driver name="EcalConverter" type="org.lcsim.hps.recon.ecal.HPSEcalConverterDriver">
-            <rawCollectionName>EcalRawHits</rawCollectionName>
-            <ecalCollectionName>EcalCorrectedHits</ecalCollectionName>
-            <scale>1</scale>
-        </driver>	
-        
-        <driver name="EcalTriggerFilter" type="org.lcsim.hps.recon.ecal.HPSEcalTriggerFilterDriver">
-            <inputCollection>EcalCorrectedHits</inputCollection>
-            <outputCollection>EcalFilteredHits</outputCollection>
-        </driver>
-
-        <driver name="EcalClusterer"
-            type="org.lcsim.hps.recon.ecal.HPSEcalCTPClusterer">
-            <ecalName>Ecal</ecalName>
-            <ecalCollectionName>EcalFilteredHits</ecalCollectionName>
-        </driver>
-
-        <driver name="EcalTrigger" type="org.lcsim.hps.recon.ecal.TestRunTriggerDriver">
-            <clusterCollectionName>EcalClusters</clusterCollectionName>
-            <deadTime>10</deadTime>
-        </driver>
-
-        <driver name="SVTReadout" type="org.lcsim.hps.recon.tracking.apv25.SvtReadout">
-            <debug>false</debug>
-            <pedestalRun>false</pedestalRun>
-            <triggerLatencyTime>288</triggerLatencyTime>
-        </driver>
-        
-        <driver name="Digitization" type="org.lcsim.hps.recon.tracking.RearTransitionModule" />
-
-        <driver name="DataProcessing" type="org.lcsim.hps.recon.tracking.TestRunDataProcessingModule" >
-            <enablePileUpCut>true</enablePileUpCut>
-            <enableThresholdCut>true</enableThresholdCut>
-            <noiseThreshold>2</noiseThreshold>
-            <numberOfSamplesAboveThreshold>3</numberOfSamplesAboveThreshold>
-            <numberOfSamplesToReadOut>6</numberOfSamplesToReadOut>
-        </driver>
-
-
-        <driver name="RawTrackerHitFitterDriver" type="org.lcsim.hps.recon.tracking.HPSRawTrackerHitFitterDriver">
-            <debug>false</debug> 
-            <rawHitCollectionName>SVTRawTrackerHits</rawHitCollectionName>  
-            <fittedHitCollectionName>SVTFittedRawTrackerHits</fittedHitCollectionName> 
-            <fitAlgorithm>Analytic</fitAlgorithm>  
-        </driver>
-
-
-        <driver name="TrackerHitDriver" type="org.lcsim.hps.users.mgraham.DataTrackerHitDriver" >
-            <debug>false</debug>    
-        </driver>
-
-        <driver name="HelicalTrackHitDriver"
-                type="org.lcsim.hps.recon.tracking.HelicalTrackHitDriver">
-            <debug>false</debug>
-            <layerGeometryType>Common</layerGeometryType>
-            <maxSeperation>20.0</maxSeperation>
-            <tolerance>1.0</tolerance>
-        </driver>
-
-        <driver name="TrackerReconDriver" type="org.lcsim.hps.recon.tracking.TrackerReconDriver">
-            <debug>false</debug>
-            <strategyResource> </strategyResource> 
-        </driver>
-        
-        <driver name="ClockDriver" type="org.lcsim.hps.util.ClockDriver" />
-
-        <driver name="CleanupDriver" type="org.lcsim.recon.tracking.digitization.sisim.config.ReadoutCleanupDriver">
-            <collectionNames>TrackerHits SVTRawTrackerHits  SVTFittedRawTrackerHits</collectionNames>
-        </driver>
-
-    </drivers>
-</lcsim>

hps-java/src/main/resources/org/lcsim/hps/steering
HPS2014ReadoutNoPileup.lcsim removed after 1.1
diff -N HPS2014ReadoutNoPileup.lcsim
--- HPS2014ReadoutNoPileup.lcsim	21 Nov 2012 00:50:08 -0000	1.1
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,56 +0,0 @@
-<!-- 
-  Execute trigger+readout simulation without pileup (event by event) and write the results as an LCIO file.
-  @author Sho Uemura <[log in to unmask]>
-  @version $Id: HPS2014ReadoutNoPileup.lcsim,v 1.1 2012/11/21 00:50:08 meeg Exp $
--->
-<lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
-       xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd">       
-    <control>
-        <printInputFiles>true</printInputFiles>
-        <printDriversDetailed>true</printDriversDetailed>
-    </control>    
-    <execute>
-        <driver name="EventMarkerDriver"/>
-        <driver name="HPSCalibrationDriver"/>
-        <driver name="EcalEdepToTriggerConverterDriver"/>
-        <driver name="HPSEcalReadoutConverterDriver"/>
-        <driver name="EcalTriggerClusterer"/>
-        <driver name="SimpleSVTReadout"/> 
-        <driver name="EcalTrigger"/>
-        <driver name="ClockDriver"/>        
-    </execute>    
-    <drivers>
-        <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">
-            <eventInterval>1000</eventInterval>
-        </driver>
-        <driver name="HPSCalibrationDriver" type="org.lcsim.hps.monitoring.HPSCalibrationDriver">
-        </driver>
-        <driver name="EcalEdepToTriggerConverterDriver" type="org.lcsim.hps.recon.ecal.HPSEcalEdepToTriggerConverterDriver">
-            <readoutCollection>EcalReadoutAnalogHits</readoutCollection>
-            <applyBadCrystalMap>false</applyBadCrystalMap>
-            <truncateScale>1</truncateScale>
-            <constantGain>0.15</constantGain>
-        </driver>
-        <driver name="HPSEcalReadoutConverterDriver" type="org.lcsim.hps.recon.ecal.HPSEcalRawConverterDriver">
-            <runBackwards>true</runBackwards>
-            <rawCollectionName>EcalReadoutHits</rawCollectionName>
-            <ecalCollectionName>EcalReadoutAnalogHits</ecalCollectionName>
-        </driver>
-        <driver name="EcalTriggerClusterer" type="org.lcsim.hps.recon.ecal.HPSEcalCTPClusterer">
-            <ecalName>Ecal</ecalName>
-            <ecalCollectionName>EcalReadoutAnalogHits</ecalCollectionName>
-            <clusterCollectionName>EcalTriggerClusters</clusterCollectionName>
-        </driver>
-        <driver name="EcalTrigger" type="org.lcsim.hps.recon.ecal.HPSFADCTriggerDriver">
-            <clusterCollectionName>EcalTriggerClusters</clusterCollectionName>
-			<outputFileName>${outputFile}.triggers</outputFileName>
-            <deadTime>0</deadTime>
-            <lcioFile>${outputFile}</lcioFile>
-        </driver>	
-        
-        <driver name="SimpleSVTReadout" type="org.lcsim.hps.recon.tracking.SimpleSvtReadout">
-            <noPileup>true</noPileup>
-        </driver>
-        <driver name="ClockDriver" type="org.lcsim.hps.util.ClockDriver"/>
-    </drivers>
-</lcsim>

hps-java/src/main/resources/org/lcsim/hps/steering
HPSTestRunNoPileup.lcsim removed after 1.4
diff -N HPSTestRunNoPileup.lcsim
--- HPSTestRunNoPileup.lcsim	20 Nov 2012 23:32:22 -0000	1.4
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,53 +0,0 @@
-
-<lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
-       xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd">       
-    <control>
-        <printInputFiles>true</printInputFiles>
-        <printDriversDetailed>true</printDriversDetailed>
-    </control>    
-    <execute>
-        <driver name="EventMarkerDriver"/>
-        <driver name="HPSCalibrationDriver"/>
-        <driver name="EcalRawConverter"/>
-        <driver name="HPSEcalRawConverterDriver"/>
-        <driver name="EcalTriggerFilter"/>
-        <driver name="EcalTriggerClusterer"/>
-        <driver name="SimpleSVTReadout"/>
-        <driver name="EcalTrigger"/>
-        <driver name="ClockDriver"/>
-    </execute>    
-    <drivers>
-        <driver name="HPSCalibrationDriver" type="org.lcsim.hps.monitoring.HPSCalibrationDriver">
-        </driver>
-        <driver name="EcalRawConverter" type="org.lcsim.hps.recon.ecal.HPSEcalEdepToTriggerConverterDriver">
-            <readoutCollection>EcalReadoutAnalogHits</readoutCollection>
-        </driver>
-        <driver name="HPSEcalRawConverterDriver" type="org.lcsim.hps.recon.ecal.HPSEcalRawConverterDriver">
-            <runBackwards>true</runBackwards>
-            <rawCollectionName>EcalReadoutHits</rawCollectionName>
-            <ecalCollectionName>EcalReadoutAnalogHits</ecalCollectionName>
-        </driver>
-        <driver name="EcalTriggerFilter" type="org.lcsim.hps.recon.ecal.HPSEcalTriggerFilterDriver">
-            <inputCollection>EcalTriggerHits</inputCollection>
-            <outputCollection>EcalFilteredHits</outputCollection>
-        </driver>
-        <driver name="EcalTriggerClusterer" type="org.lcsim.hps.recon.ecal.HPSEcalCTPClusterer">
-            <ecalName>Ecal</ecalName>
-            <ecalCollectionName>EcalFilteredHits</ecalCollectionName>
-            <clusterCollectionName>EcalTriggerClusters</clusterCollectionName>
-        </driver>
-        <driver name="EcalTrigger" type="org.lcsim.hps.recon.ecal.TestRunTriggerDriver">
-            <clusterCollectionName>EcalTriggerClusters</clusterCollectionName>
-            <deadTime>0</deadTime>
-            <lcioFile>${outputFile}</lcioFile>
-        </driver>	
-        <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">
-            <eventInterval>1000</eventInterval>
-        </driver>
-        
-        <driver name="SimpleSVTReadout" type="org.lcsim.hps.recon.tracking.SimpleSvtReadout">
-            <noPileup>true</noPileup>
-        </driver>
-        <driver name="ClockDriver" type="org.lcsim.hps.util.ClockDriver"/>
-    </drivers>
-</lcsim>

hps-java/src/main/resources/org/lcsim/hps/steering
HPS2014ReadoutToLcio.lcsim removed after 1.4
diff -N HPS2014ReadoutToLcio.lcsim
--- HPS2014ReadoutToLcio.lcsim	20 Dec 2012 08:31:35 -0000	1.4
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,104 +0,0 @@
-<!-- 
-  Execute full trigger+readout simulation and write the results as an LCIO file.
-  @author Sho Uemura <[log in to unmask]>
-  @version $Id: HPS2014ReadoutToLcio.lcsim,v 1.4 2012/12/20 08:31:35 omoreno Exp $
--->
-<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="HPSCalibrationDriver"/>   
-        <driver name="EcalReadout"/>
-        <driver name="EcalConverter"/>
-        <driver name="EcalClusterer"/>
-        <driver name="EcalTrigger"/>
-        
-<!--        <driver name="SimpleSVTReadout"/>-->
-
-        <driver name="SVTReadout"/>
-        <driver name="Digitization"/>
-        <driver name="DataProcessing"/>
-        <driver name="TestRunReconToLcio"/>
-
-		<driver name="AidaSaveDriver"/>
-
-        <driver name="ClockDriver"/>
-        <driver name="CleanupDriver"/>
-    </execute> 
-
-    <drivers>
-        <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">
-            <eventInterval>1000</eventInterval>
-        </driver> 
-        <driver name="HPSCalibrationDriver" type="org.lcsim.hps.monitoring.HPSCalibrationDriver">
-<!--            <runNumber>1351</runNumber>    -->
-        </driver>
-        <driver name="TestRunReconToLcio" type="org.lcsim.hps.evio.TestRunTriggeredReconToLcio">
-            <outputFile>${outputFile}.slcio</outputFile>
-        </driver>
-			
-        <driver name="EcalReadout" type="org.lcsim.hps.recon.ecal.HPSEcalFADCReadoutDriver">
-            <readoutPeriod>4.0</readoutPeriod>
-            <coincidenceWindow>2</coincidenceWindow>
-            <ecalName>Ecal</ecalName>
-            <ecalCollectionName>EcalHits</ecalCollectionName>
-            <ecalRawCollectionName>EcalRawHits</ecalRawCollectionName>
-            <triggerThreshold>50</triggerThreshold>
-            <readoutThreshold>50</readoutThreshold>
-            <constantTriggerWindow>true</constantTriggerWindow>
-            <scaleFactor>1</scaleFactor>
-<!--            <fixedGain>0.15</fixedGain>-->
-<!--            <debug>true</debug>-->
-        </driver>
-
-        <driver name="EcalConverter" type="org.lcsim.hps.recon.ecal.HPSEcalRawConverterDriver">
-            <rawCollectionName>EcalRawHits</rawCollectionName>
-            <ecalCollectionName>EcalCorrectedHits</ecalCollectionName>
-<!--            <gain>0.15</gain>-->
-            <applyBadCrystalMap>false</applyBadCrystalMap>
-<!--            <debug>true</debug>-->
-        </driver>	
-
-        <driver name="EcalClusterer" type="org.lcsim.hps.recon.ecal.HPSEcalCTPClusterer">
-            <ecalName>Ecal</ecalName>
-            <clusterWindow>8.0</clusterWindow>
-            <ecalCollectionName>EcalCorrectedHits</ecalCollectionName>
-        </driver>
-
-        <driver name="EcalTrigger" type="org.lcsim.hps.recon.ecal.HPSFADCTriggerDriver">
-            <clusterCollectionName>EcalClusters</clusterCollectionName>
-            <deadTime>10</deadTime>
-            <outputFileName>${outputFile}.triggers</outputFileName>
-        </driver>	
-        <driver name="SimpleSVTReadout" type="org.lcsim.hps.recon.tracking.SimpleSvtReadout">
-        </driver>
-
-        <driver name="SVTReadout" type="org.lcsim.hps.recon.tracking.apv25.SvtReadout">
-            <debug>false</debug>
-            <pedestalRun>false</pedestalRun>
-            <triggerLatencyTime>240</triggerLatencyTime>
-        </driver>
-        
-        <driver name="Digitization" type="org.lcsim.hps.recon.tracking.RearTransitionModule" />
-
-        <driver name="DataProcessing" type="org.lcsim.hps.recon.tracking.TestRunDataProcessingModule" >
-            <enablePileUpCut>true</enablePileUpCut>
-            <enableThresholdCut>true</enableThresholdCut>
-            <noiseThreshold>2</noiseThreshold>
-            <numberOfSamplesAboveThreshold>3</numberOfSamplesAboveThreshold>
-            <numberOfSamplesToReadOut>6</numberOfSamplesToReadOut>
-        </driver>
-
-		<driver name="AidaSaveDriver"
-                type="org.lcsim.job.AidaSaveDriver">
-			<outputFileName>${outputFile}_triggerPlots</outputFileName>
-		</driver>
-
-        <driver name="ClockDriver" type="org.lcsim.hps.util.ClockDriver"/>
-        <driver name="CleanupDriver" type="org.lcsim.recon.tracking.digitization.sisim.config.ReadoutCleanupDriver">
-            <collectionNames>TrackerHits</collectionNames>
-        </driver> 
-    </drivers>
-</lcsim>
-	

hps-java/src/main/java/org/lcsim/hps/monitoring/ecal
EcalWindowPlots.java 1.6 -> 1.7
diff -u -r1.6 -r1.7
--- EcalWindowPlots.java	27 Aug 2012 21:53:47 -0000	1.6
+++ EcalWindowPlots.java	25 Feb 2013 22:39:24 -0000	1.7
@@ -14,7 +14,7 @@
 import org.lcsim.event.RawTrackerHit;
 import org.lcsim.geometry.Detector;
 import org.lcsim.hps.monitoring.AIDAFrame;
-import org.lcsim.hps.recon.ecal.HPSEcalConditions;
+import org.lcsim.hps.recon.ecal.EcalConditions;
 import org.lcsim.util.Driver;
 import org.lcsim.util.aida.AIDA;
 
@@ -130,10 +130,10 @@
         if (event.hasCollection(RawTrackerHit.class, inputCollection)) {
             List<RawTrackerHit> hits = event.get(RawTrackerHit.class, inputCollection);
             for (RawTrackerHit hit : hits) {
-                Long daqId = HPSEcalConditions.physicalToDaqID(hit.getCellID());
-                int crate = HPSEcalConditions.getCrate(daqId);
-                int slot = HPSEcalConditions.getSlot(daqId);
-                int channel = HPSEcalConditions.getChannel(daqId);
+                Long daqId = EcalConditions.physicalToDaqID(hit.getCellID());
+                int crate = EcalConditions.getCrate(daqId);
+                int slot = EcalConditions.getSlot(daqId);
+                int channel = EcalConditions.getChannel(daqId);
 //				System.out.println("got hit: crate " + crate + ", slot " + slot + ", channel " + channel);
                 if (hit.getADCValues().length != window) {
                     throw new RuntimeException("Hit has unexpected window length " + hit.getADCValues().length + ", not " + window);

hps-java/src/main/java/org/lcsim/hps/monitoring/ecal
EcalEvsX.java 1.10 -> 1.11
diff -u -r1.10 -r1.11
--- EcalEvsX.java	8 Dec 2012 01:12:18 -0000	1.10
+++ EcalEvsX.java	25 Feb 2013 22:39:24 -0000	1.11
@@ -15,7 +15,7 @@
 import org.lcsim.geometry.Detector;
 import org.lcsim.geometry.subdetector.HPSEcal3;
 import org.lcsim.geometry.subdetector.HPSEcal3.NeighborMap;
-import org.lcsim.hps.recon.ecal.HPSEcalConditions;
+import org.lcsim.hps.recon.ecal.EcalConditions;
 import org.lcsim.util.Driver;
 import org.lcsim.util.aida.AIDA;
 
@@ -163,7 +163,7 @@
     }
 
     public boolean isGoodCluster(Cluster cluster) {
-        NeighborMap map = ((HPSEcal3) HPSEcalConditions.getSubdetector()).getNeighborMap();
+        NeighborMap map = ((HPSEcal3) EcalConditions.getSubdetector()).getNeighborMap();
         for (CalorimeterHit hit : cluster.getCalorimeterHits()) {
             if (map.get(hit.getCellID()).size() > 6) {
                 return true;

hps-java/src/main/java/org/lcsim/hps/monitoring/ecal
EcalClusterPlots.java 1.8 -> 1.9
diff -u -r1.8 -r1.9
--- EcalClusterPlots.java	8 Dec 2012 01:12:18 -0000	1.8
+++ EcalClusterPlots.java	25 Feb 2013 22:39:24 -0000	1.9
@@ -14,7 +14,7 @@
 import org.lcsim.hps.evio.TriggerData;
 import org.lcsim.hps.monitoring.AIDAFrame;
 import org.lcsim.hps.monitoring.Resettable;
-import org.lcsim.hps.recon.ecal.HPSECalUtils;
+import org.lcsim.hps.recon.ecal.ECalUtils;
 import org.lcsim.util.Driver;
 import org.lcsim.util.aida.AIDA;
 
@@ -32,7 +32,7 @@
     IHistogram1D clusterTimeSigma;
     IHistogram2D edgePlot;
     int eventn = 0;
-    double maxE = 5000 * HPSECalUtils.MeV;
+    double maxE = 5000 * ECalUtils.MeV;
     boolean logScale = false;
 
     public void setInputCollection(String inputCollection) {

hps-java/src/main/java/org/lcsim/hps/monitoring/ecal
EcalHitPlots.java 1.8 -> 1.9
diff -u -r1.8 -r1.9
--- EcalHitPlots.java	8 Dec 2012 01:12:18 -0000	1.8
+++ EcalHitPlots.java	25 Feb 2013 22:39:24 -0000	1.9
@@ -12,7 +12,7 @@
 import org.lcsim.hps.evio.TriggerData;
 import org.lcsim.hps.monitoring.AIDAFrame;
 import org.lcsim.hps.monitoring.Resettable;
-import org.lcsim.hps.recon.ecal.HPSECalUtils;
+import org.lcsim.hps.recon.ecal.ECalUtils;
 import org.lcsim.util.Driver;
 import org.lcsim.util.aida.AIDA;
 
@@ -32,7 +32,7 @@
 //    IHistogram2D topX, botX, topY, botY;
     IHistogram2D edgePlot;
     int eventn = 0;
-    double maxE = 5000 * HPSECalUtils.MeV;
+    double maxE = 5000 * ECalUtils.MeV;
     boolean logScale = false;
 
     public void setInputCollection(String inputCollection) {

hps-java/src/main/java/org/lcsim/hps/monitoring/ecal
EcalDaqPlots.java 1.6 -> 1.7
diff -u -r1.6 -r1.7
--- EcalDaqPlots.java	13 May 2012 21:39:24 -0000	1.6
+++ EcalDaqPlots.java	25 Feb 2013 22:39:24 -0000	1.7
@@ -15,7 +15,7 @@
 import org.lcsim.geometry.Detector;
 import org.lcsim.geometry.compact.Subdetector;
 import org.lcsim.hps.monitoring.Resettable;
-import org.lcsim.hps.recon.ecal.HPSEcalConditions;
+import org.lcsim.hps.recon.ecal.EcalConditions;
 import org.lcsim.util.Driver;
 import org.lcsim.util.aida.AIDA;
 
@@ -104,10 +104,10 @@
 		if (event.hasCollection(RawCalorimeterHit.class, inputCollection)) {
 			List<RawCalorimeterHit> hits = event.get(RawCalorimeterHit.class, inputCollection);
 			for (RawCalorimeterHit hit : hits) {
-				Long daqId = HPSEcalConditions.physicalToDaqID(hit.getCellID());
-				int crate = HPSEcalConditions.getCrate(daqId);
-				int slot = HPSEcalConditions.getSlot(daqId);
-				int channel = HPSEcalConditions.getChannel(daqId);
+				Long daqId = EcalConditions.physicalToDaqID(hit.getCellID());
+				int crate = EcalConditions.getCrate(daqId);
+				int slot = EcalConditions.getSlot(daqId);
+				int channel = EcalConditions.getChannel(daqId);
 				//System.out.println("crate="+crate+"; slot="+slot+"; channel="+channel);
 				//System.out.println("filling plot: " + "ECAL: Crate " + crate + "; Slot " + slot);
 				aida.histogram1D("ECAL: Crate " + crate + "; Slot " + slot).fill(channel);
@@ -116,10 +116,10 @@
 		if (event.hasCollection(RawTrackerHit.class, inputCollection)) {
 			List<RawTrackerHit> hits = event.get(RawTrackerHit.class, inputCollection);
 			for (RawTrackerHit hit : hits) {
-				Long daqId = HPSEcalConditions.physicalToDaqID(hit.getCellID());
-				int crate = HPSEcalConditions.getCrate(daqId);
-				int slot = HPSEcalConditions.getSlot(daqId);
-				int channel = HPSEcalConditions.getChannel(daqId);
+				Long daqId = EcalConditions.physicalToDaqID(hit.getCellID());
+				int crate = EcalConditions.getCrate(daqId);
+				int slot = EcalConditions.getSlot(daqId);
+				int channel = EcalConditions.getChannel(daqId);
 				//System.out.println("crate="+crate+"; slot="+slot+"; channel="+channel);
 				//System.out.println("filling plot: " + "ECAL: Crate " + crate + "; Slot " + slot);
 				aida.histogram1D("ECAL: Crate " + crate + "; Slot " + slot).fill(channel);

hps-java/src/main/java/org/lcsim/hps/monitoring/ecal
EcalPedestalPlots.java 1.11 -> 1.12
diff -u -r1.11 -r1.12
--- EcalPedestalPlots.java	8 Dec 2012 01:12:18 -0000	1.11
+++ EcalPedestalPlots.java	25 Feb 2013 22:39:24 -0000	1.12
@@ -18,8 +18,8 @@
 import org.lcsim.hps.monitoring.AIDAFrame;
 import org.lcsim.hps.monitoring.Redrawable;
 import org.lcsim.hps.monitoring.Resettable;
-import org.lcsim.hps.recon.ecal.HPSECalUtils;
-import org.lcsim.hps.recon.ecal.HPSEcalConditions;
+import org.lcsim.hps.recon.ecal.ECalUtils;
+import org.lcsim.hps.recon.ecal.EcalConditions;
 import org.lcsim.util.Driver;
 import org.lcsim.util.aida.AIDA;
 
@@ -46,7 +46,7 @@
     int eventn = 0;
     boolean hide = false;
     int calWindow = 0;
-    double maxE = 1000 * HPSECalUtils.MeV;
+    double maxE = 1000 * ECalUtils.MeV;
 
     public EcalPedestalPlots() {
         int count = 0;
@@ -181,8 +181,8 @@
             for (int crate = 1; crate < 3; crate++) {
                 for (short slot = 0; slot < 20; slot++) {
                     for (short ch = 0; ch < 16; ch++) {
-                        Long id = HPSEcalConditions.daqToPhysicalID(crate, slot, ch);
-                        IIdentifierHelper helper = HPSEcalConditions.getHelper();
+                        Long id = EcalConditions.daqToPhysicalID(crate, slot, ch);
+                        IIdentifierHelper helper = EcalConditions.getHelper();
                         if (id == null) {
                             continue;
                         }

hps-java/src/main/java/org/lcsim/hps/recon/ecal
EcalReadoutToTriggerConverterDriver.java added at 1.1
diff -N EcalReadoutToTriggerConverterDriver.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ EcalReadoutToTriggerConverterDriver.java	25 Feb 2013 22:39:24 -0000	1.1
@@ -0,0 +1,189 @@
+package org.lcsim.hps.recon.ecal;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.lcsim.event.CalorimeterHit;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.base.BaseRawCalorimeterHit;
+import org.lcsim.geometry.Detector;
+import org.lcsim.util.Driver;
+
+/**
+ *
+ * @version $Id: HPSEcalRawConverterDriver.java,v 1.2 2012/05/03 00:17:54
+ * phansson Exp $
+ */
+public class EcalReadoutToTriggerConverterDriver extends Driver {
+
+    String rawCollectionName = "EcalReadoutHits";
+    String ecalReadoutName = "EcalHits";
+    String ecalCollectionName = "EcalCalHits";
+    int integralWindow = 30;
+    boolean debug = false;
+    double threshold = Double.NEGATIVE_INFINITY;
+    boolean applyBadCrystalMap = true;
+    boolean dropBadFADC = false;
+    double tp = 14.0;
+    double readoutPeriod = 4.0;
+    private int readoutThreshold = 50;
+    private int triggerThreshold = 80;
+    private double timeShift = 0;
+    private int truncateScale = 128;
+
+    public EcalReadoutToTriggerConverterDriver() {
+    }
+
+    public void setTp(double tp) {
+        this.tp = tp;
+    }
+
+    public void setDropBadFADC(boolean dropBadFADC) {
+        this.dropBadFADC = dropBadFADC;
+    }
+
+    public void setThreshold(double threshold) {
+        this.threshold = threshold;
+    }
+
+    public void setIntegralWindow(int integralWindow) {
+        this.integralWindow = integralWindow;
+    }
+
+    public void setEcalCollectionName(String ecalCollectionName) {
+        this.ecalCollectionName = ecalCollectionName;
+    }
+
+    public void setRawCollectionName(String rawCollectionName) {
+        this.rawCollectionName = rawCollectionName;
+    }
+
+    public void setApplyBadCrystalMap(boolean apply) {
+        this.applyBadCrystalMap = apply;
+    }
+
+    public void setTruncateScale(int truncateScale) {
+        this.truncateScale = truncateScale;
+    }
+
+    @Override
+    public void startOfData() {
+        if (ecalCollectionName == null) {
+            throw new RuntimeException("The parameter ecalCollectionName was not set!");
+        }
+    }
+
+    @Override
+    public void detectorChanged(Detector detector) {
+    }
+
+    public boolean isBadCrystal(CalorimeterHit hit) {
+        return EcalConditions.badChannelsLoaded() ? EcalConditions.isBadChannel(hit.getCellID()) : false;
+    }
+
+    public boolean isBadFADC(CalorimeterHit hit) {
+        long daqID = EcalConditions.physicalToDaqID(hit.getCellID());
+        return (EcalConditions.getCrate(daqID) == 1 && EcalConditions.getSlot(daqID) == 3);
+    }
+
+    @Override
+    public void process(EventHeader event) {
+        ArrayList<CalorimeterHit> newHits = new ArrayList<CalorimeterHit>();
+
+        if (event.hasCollection(BaseRawCalorimeterHit.class, rawCollectionName)) {
+            List<BaseRawCalorimeterHit> hits = event.get(BaseRawCalorimeterHit.class, rawCollectionName);
+
+            for (BaseRawCalorimeterHit hit : hits) {
+                CalorimeterHit newHit = HitDtoA(hit, integralWindow);
+                if (newHit != null && newHit.getRawEnergy() > threshold) {
+                    if (applyBadCrystalMap && isBadCrystal(newHit)) {
+                        continue;
+                    }
+                    if (dropBadFADC && isBadFADC(newHit)) {
+                        continue;
+                    }
+                    newHits.add(newHit);
+                }
+            }
+        }
+        int flags = 0;
+        event.put(ecalCollectionName, newHits, CalorimeterHit.class, flags, ecalReadoutName);
+    }
+
+    public CalorimeterHit HitDtoA(BaseRawCalorimeterHit hit, int window) {
+        double integral = tp * Math.E / readoutPeriod;
+        double readoutIntegral = (hit.getAmplitude() - window * EcalConditions.physicalToPedestal(hit.getCellID()));
+        double amplitude = readoutIntegral / integral;
+
+//        double time = readoutPeriod * (Math.random() - 1);
+        double time = 0 - timeShift;
+        timeShift += 0.01;
+        if (timeShift > readoutPeriod) {
+            timeShift = 0;
+        }
+        double triggerIntegral = 0;
+        boolean overThreshold = false;
+//        double readoutTime = -1;
+//        double triggerTime = -1;
+        while (true) {
+            double currentValue = amplitude * pulseAmplitude(time);
+//            if (readoutTime < 0 && currentValue > readoutThreshold) {
+//                readoutTime = time;
+//            }
+            if (!overThreshold && currentValue > triggerThreshold) {
+                overThreshold = true;
+//                triggerTime = time;
+            }
+            if (overThreshold) {
+                triggerIntegral += amplitude * pulseAmplitude(time);
+                if (currentValue < triggerThreshold) {
+                    break;
+                }
+            }
+            time += readoutPeriod;
+
+            if (time > 200.0) {
+                break;
+            }
+        }
+
+//        System.out.format("%f %f %f\n", readoutIntegral, amplitude, triggerIntegral);
+
+        if (hit.getTimeStamp() % 64 != 0) {
+            System.out.println("unexpected timestamp " + hit.getTimeStamp());
+        }
+        int truncatedIntegral = (int) Math.floor(triggerIntegral / truncateScale) * truncateScale;
+        double hitTime = hit.getTimeStamp() / 16.0;
+//        if (readoutTime >= 0 && triggerTime >= 0) {
+//            hitTime += triggerTime - readoutTime;
+//        }
+        long id = hit.getCellID();
+//                Hep3Vector pvec = hit.getDetectorElement().getGeometry().getPosition();
+//                double [] pos = new double[3];
+//                pos[0] = pvec.x();
+//                pos[1] = pvec.y();
+//                pos[2] = pvec.z();
+//        if (truncatedIntegral<=0) return null;
+        if (truncatedIntegral <= 0) {
+            truncatedIntegral = 0;
+        }
+        CalorimeterHit h = new HPSCalorimeterHit(truncatedIntegral, hitTime, id, 0);
+//        CalorimeterHit h = new HPSRawCalorimeterHit(triggerIntegral + 0.0000001, hit.getPosition(), hitTime, id, 0);
+        //+0.0000001 is a horrible hack to ensure rawEnergy!=BaseCalorimeterHit.UNSET_CORRECTED_ENERGY
+        return h;
+    }
+
+    private double pulseAmplitude(double time) {
+        if (time <= 0.0) {
+            return 0.0;
+        }
+        if (tp > 0.0) {
+            return (time / tp) * Math.exp(1.0 - time / tp);
+        } else {
+            if (time < -tp) {
+                return 1.0;
+            } else {
+                return 0.0;
+            }
+        }
+    }
+}

hps-java/src/main/java/org/lcsim/hps/recon/ecal
ECalUtils.java added at 1.1
diff -N ECalUtils.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ECalUtils.java	25 Feb 2013 22:39:24 -0000	1.1
@@ -0,0 +1,61 @@
+package org.lcsim.hps.recon.ecal;
+
+import org.lcsim.event.CalorimeterHit;
+
+/**
+ *
+ * @author Sho Uemura <[log in to unmask]>
+ * @version $Id: ECalUtils.java,v 1.1 2013/02/25 22:39:24 meeg Exp $
+ */
+public class ECalUtils {
+
+    public static final double GeV = 1.0;
+    public static final double MeV = 0.001;
+
+    /**
+     * Returns the quadrant which contains the ECal cluster
+     *
+     * @param ecalCluster : ECal cluster
+     * @return Quadrant number
+     */
+    public static int getQuadrant(HPSEcalCluster ecalCluster) {
+        return getQuadrant(ecalCluster.getSeedHit());
+    }
+
+    public static int getQuadrant(CalorimeterHit hit) {
+        int ix = hit.getIdentifierFieldValue("ix");
+        int iy = hit.getIdentifierFieldValue("iy");
+        return getQuadrant(ix, iy);
+    }
+
+    public static int getQuadrant(int x, int y) {
+        if (x > 0) {
+            if (y > 0) {
+                return 1;
+            } else {
+                return 4;
+            }
+        } else {
+            if (y > 0) {
+                return 2;
+            } else {
+                return 3;
+            }
+        }
+    }
+
+    public static int getHVGroup(int x, int y) {
+        int absy = Math.abs(y);
+        if (x > 0 || x <= -8) {
+            return (23 - Math.abs(x)) / 2 + 1;
+        } else {
+            if (x == -7 && absy == 5) {
+                return 8;
+            } else if (x >= -4) {
+                return 12 - Math.max(x + 4, absy - 2);
+            } else {
+                return 12 - Math.max(-5 - x, absy - 2);
+            }
+        }
+    }
+}

hps-java/src/main/java/org/lcsim/hps/recon/ecal
EcalConverterDriver.java added at 1.1
diff -N EcalConverterDriver.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ EcalConverterDriver.java	25 Feb 2013 22:39:24 -0000	1.1
@@ -0,0 +1,86 @@
+package org.lcsim.hps.recon.ecal;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.lcsim.event.CalorimeterHit;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.RawCalorimeterHit;
+import org.lcsim.util.Driver;
+import org.lcsim.util.lcio.LCIOConstants;
+
+/**
+ *
+ * @author Sho Uemura <[log in to unmask]>
+ * @version $Id: EcalConverterDriver.java,v 1.1 2013/02/25 22:39:24 meeg Exp $
+ */
+public class EcalConverterDriver extends Driver {
+
+    String rawCollectionName;
+    String ecalReadoutName = "EcalHits";
+    String ecalCollectionName = "EcalCorrectedHits";
+    int flags;
+    double scale = 1.0;
+//    double pedestal = 0.0;
+    double period = 4.0;
+    double dt = 0.0;
+
+    public EcalConverterDriver() {
+        flags = 0;
+        flags += 1 << LCIOConstants.CHBIT_LONG; //store position
+        flags += 1 << LCIOConstants.RCHBIT_ID1; //store cell ID
+    }
+
+//    public void setPedestal(double pedestal) {
+//        this.pedestal = pedestal;
+//    }
+    public void setScale(double scale) {
+        this.scale = scale;
+    }
+
+    public void setEcalCollectionName(String ecalCollectionName) {
+        this.ecalCollectionName = ecalCollectionName;
+    }
+
+    public void setRawCollectionName(String rawCollectionName) {
+        this.rawCollectionName = rawCollectionName;
+    }
+
+    @Override
+    public void startOfData() {
+        if (ecalCollectionName == null) {
+            throw new RuntimeException("The parameter ecalCollectionName was not set!");
+        }
+    }
+
+    @Override
+    public void process(EventHeader event) {
+        if (event.hasCollection(HPSRawCalorimeterHit.class, rawCollectionName)) {
+            // Get the list of ECal hits.
+            List<HPSRawCalorimeterHit> hits = event.get(HPSRawCalorimeterHit.class, rawCollectionName);
+
+            ArrayList<CalorimeterHit> newHits = new ArrayList<CalorimeterHit>();
+
+            for (HPSRawCalorimeterHit hit : hits) {
+                newHits.add(HitDtoA(hit));
+            }
+
+            event.put(ecalCollectionName, newHits, CalorimeterHit.class, flags, ecalReadoutName);
+        }
+    }
+
+//    private int AtoD(double amplitude, long cellID) {
+//        return (int) Math.round(amplitude / scale);
+//    }
+
+    private double DtoA(int amplitude, long cellID) {
+        return scale * amplitude;
+    }
+
+    private CalorimeterHit HitDtoA(RawCalorimeterHit hit) {
+        return new HPSCalorimeterHit(DtoA(hit.getAmplitude(), hit.getCellID()), period * hit.getTimeStamp() + dt, hit.getCellID(), 0);
+    }
+
+//    private RawCalorimeterHit HitAtoD(CalorimeterHit hit) {
+//        return new HPSFADCCalorimeterHit(hit.getCellID(), AtoD(hit.getRawEnergy(), hit.getCellID()), (int) Math.round(hit.getTime() / period), 0);
+//    }
+}

hps-java/src/main/java/org/lcsim/hps/recon/ecal
EcalRawConverterDriver.java added at 1.1
diff -N EcalRawConverterDriver.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ EcalRawConverterDriver.java	25 Feb 2013 22:39:24 -0000	1.1
@@ -0,0 +1,158 @@
+package org.lcsim.hps.recon.ecal;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.lcsim.event.CalorimeterHit;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.RawCalorimeterHit;
+import org.lcsim.event.RawTrackerHit;
+import org.lcsim.geometry.Detector;
+import org.lcsim.util.Driver;
+
+/**
+ *
+ * @version $Id: HPSEcalRawConverterDriver.java,v 1.2 2012/05/03 00:17:54
+ * phansson Exp $
+ */
+public class EcalRawConverterDriver extends Driver {
+
+    EcalRawConverter converter = null;
+    String rawCollectionName = "EcalReadoutHits";
+    String ecalReadoutName = "EcalHits";
+    String ecalCollectionName = "EcalCalHits";
+    int integralWindow = 35;
+    boolean debug = false;
+    double threshold = Double.NEGATIVE_INFINITY;
+    boolean applyBadCrystalMap = true;
+    boolean dropBadFADC = false;
+    private boolean runBackwards = false;
+
+    public EcalRawConverterDriver() {
+        converter = new EcalRawConverter();
+    }
+
+    public void setRunBackwards(boolean runBackwards) {
+        this.runBackwards = runBackwards;
+    }
+
+    public void setDropBadFADC(boolean dropBadFADC) {
+        this.dropBadFADC = dropBadFADC;
+    }
+
+    public void setThreshold(double threshold) {
+        this.threshold = threshold;
+    }
+
+    public void setGain(double gain) {
+        converter.setGain(gain);
+    }
+
+    public void setIntegralWindow(int integralWindow) {
+        this.integralWindow = integralWindow;
+    }
+
+    public void setEcalCollectionName(String ecalCollectionName) {
+        this.ecalCollectionName = ecalCollectionName;
+    }
+
+    public void setRawCollectionName(String rawCollectionName) {
+        this.rawCollectionName = rawCollectionName;
+    }
+
+    public void setApplyBadCrystalMap(boolean apply) {
+        this.applyBadCrystalMap = apply;
+    }
+
+    public void setDebug(boolean debug) {
+        this.debug = debug;
+    }
+
+    @Override
+    public void startOfData() {
+        if (ecalCollectionName == null) {
+            throw new RuntimeException("The parameter ecalCollectionName was not set!");
+        }
+    }
+
+    @Override
+    public void detectorChanged(Detector detector) {
+    }
+
+    public static boolean isBadCrystal(CalorimeterHit hit) {
+        return EcalConditions.badChannelsLoaded() ? EcalConditions.isBadChannel(hit.getCellID()) : false;
+    }
+
+    public static boolean isBadFADC(CalorimeterHit hit) {
+        long daqID = EcalConditions.physicalToDaqID(hit.getCellID());
+        return (EcalConditions.getCrate(daqID) == 1 && EcalConditions.getSlot(daqID) == 3);
+    }
+
+    @Override
+    public void process(EventHeader event) {
+        if (!runBackwards) {
+            ArrayList<CalorimeterHit> newHits = new ArrayList<CalorimeterHit>();
+
+            // Get the list of ECal hits.
+            if (event.hasCollection(RawTrackerHit.class, rawCollectionName)) {
+                List<RawTrackerHit> hits = event.get(RawTrackerHit.class, rawCollectionName);
+
+                for (RawTrackerHit hit : hits) {
+                    CalorimeterHit newHit = converter.HitDtoA(hit);
+                    if (applyBadCrystalMap && isBadCrystal(newHit)) {
+                        continue;
+                    }
+                    if (dropBadFADC && isBadFADC(newHit)) {
+                        continue;
+                    }
+                    if (newHit.getRawEnergy() > threshold) {
+                        newHits.add(newHit);
+                    }
+                }
+            }
+            if (event.hasCollection(RawCalorimeterHit.class, rawCollectionName)) {
+                List<RawCalorimeterHit> hits = event.get(RawCalorimeterHit.class, rawCollectionName);
+
+                for (RawCalorimeterHit hit : hits) {
+                    if (debug) {
+                        System.out.format("old hit energy %d\n", hit.getAmplitude());
+                    }
+                    CalorimeterHit newHit = converter.HitDtoA(hit, integralWindow);
+                    if (newHit.getRawEnergy() > threshold) {
+                        if (applyBadCrystalMap && isBadCrystal(newHit)) {
+                            continue;
+                        }
+                        if (dropBadFADC && isBadFADC(newHit)) {
+                            continue;
+                        }
+                        if (debug) {
+                            System.out.format("new hit energy %f\n", newHit.getRawEnergy());
+                        }
+                        newHits.add(newHit);
+                    }
+                }
+            }
+            int flags = 0;
+            event.put(ecalCollectionName, newHits, CalorimeterHit.class, flags, ecalReadoutName);
+        } else {
+            ArrayList<RawCalorimeterHit> newHits = new ArrayList<RawCalorimeterHit>();
+            if (event.hasCollection(CalorimeterHit.class, ecalCollectionName)) {
+                List<CalorimeterHit> hits = event.get(CalorimeterHit.class, ecalCollectionName);
+
+                for (CalorimeterHit hit : hits) {
+                    if (debug) {
+                        System.out.format("old hit energy %f\n", hit.getRawEnergy());
+                    }
+                    RawCalorimeterHit newHit = converter.HitAtoD(hit, integralWindow);
+                    if (newHit.getAmplitude() > 0) {
+                        if (debug) {
+                            System.out.format("new hit energy %d\n", newHit.getAmplitude());
+                        }
+                        newHits.add(newHit);
+                    }
+                }
+            }
+            int flags = 0;
+            event.put(rawCollectionName, newHits, RawCalorimeterHit.class, flags, ecalReadoutName);
+        }
+    }
+}

hps-java/src/main/java/org/lcsim/hps/recon/ecal
EcalClusterer.java added at 1.1
diff -N EcalClusterer.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ EcalClusterer.java	25 Feb 2013 22:39:24 -0000	1.1
@@ -0,0 +1,171 @@
+package org.lcsim.hps.recon.ecal;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.lcsim.event.CalorimeterHit;
+import org.lcsim.event.EventHeader;
+import org.lcsim.geometry.Detector;
+import org.lcsim.geometry.subdetector.HPSEcal3.NeighborMap;
+import org.lcsim.geometry.subdetector.HPSEcal3;
+import org.lcsim.util.Driver;
+import org.lcsim.util.lcio.LCIOConstants;
+
+/**
+ * This Driver creates clusters from the CalorimeterHits of an
+ * {@link org.lcsim.geometry.subdetectur.HPSEcal3} detector.
+ *
+ * The clustering algorithm is from pages 83 and 84 of the HPS Proposal.
+ *
+ * @author Jeremy McCormick <[log in to unmask]>
+ * @author Tim Nelson <[log in to unmask]>
+ *
+ * @version $Id: EcalClusterer.java,v 1.1 2013/02/25 22:39:24 meeg Exp $
+ */
+public class EcalClusterer extends Driver {
+
+    HPSEcal3 ecal;
+    String ecalCollectionName;
+    String ecalName = "Ecal";
+    String clusterCollectionName = "EcalClusters";
+    // Minimum E for cluster seed.
+    double seedEMin = .05 * ECalUtils.GeV;
+    // Minimum E to add hit to cluster.
+    double addEMin = .03 * ECalUtils.GeV;
+    // Odd or even number of crystals in X.
+    boolean oddX;
+    // Map of crystals to their neighbors.
+    NeighborMap neighborMap = null;
+
+    public EcalClusterer() {
+    }
+
+    public void setClusterCollectionName(String clusterCollectionName) {
+        this.clusterCollectionName = clusterCollectionName;
+    }
+
+    public void setSeedEMin(double seedEMin) {
+        this.seedEMin = seedEMin;
+    }
+
+    public void setAddEMin(double addEMin) {
+        this.addEMin = addEMin;
+        if (seedEMin < addEMin) {
+            seedEMin = addEMin;
+        }
+    }
+
+    public void setEcalCollectionName(String ecalCollectionName) {
+        this.ecalCollectionName = ecalCollectionName;
+    }
+
+    public void setEcalName(String ecalName) {
+        this.ecalName = ecalName;
+    }
+
+    public void startOfData() {
+        if (ecalCollectionName == null) {
+            throw new RuntimeException("The parameter ecalCollectionName was not set!");
+        }
+
+        if (ecalName == null) {
+            throw new RuntimeException("The parameter ecalName was not set!");
+        }
+    }
+
+    public void detectorChanged(Detector detector) {
+        // Get the Subdetector.
+        ecal = (HPSEcal3) detector.getSubdetector(ecalName);
+
+        // Cache ref to neighbor map.
+        neighborMap = ecal.getNeighborMap();
+
+        //System.out.println(ecal.getName());
+        //System.out.println("  nx="+ecal.nx());
+        //System.out.println("  ny="+ecal.ny());
+        //System.out.println("  beamgap="+ecal.beamGap());
+        //System.out.println("  dface="+ecal.distanceToFace());
+
+        //System.out.println(neighborMap.toString());
+    }
+
+    public void process(EventHeader event) {
+        //System.out.println(this.getClass().getCanonicalName() + " - process");
+
+        if (event.hasCollection(CalorimeterHit.class, ecalCollectionName)) {
+            // Get the list of raw ECal hits.
+            List<CalorimeterHit> hits = event.get(CalorimeterHit.class, ecalCollectionName);
+
+            // Make a hit map for quick lookup by ID.
+            Map<Long, CalorimeterHit> hitMap = new HashMap<Long, CalorimeterHit>();
+            for (CalorimeterHit hit : hits) {
+                hitMap.put(hit.getCellID(), hit);
+            }
+
+            // Put Cluster collection into event.
+            int flag = 1 << LCIOConstants.CLBIT_HITS;
+            event.put(clusterCollectionName, createClusters(hitMap), HPSEcalCluster.class, flag);
+        }
+    }
+
+    public List<HPSEcalCluster> createClusters(Map<Long, CalorimeterHit> map) {
+
+        // New Cluster list to be added to event.
+        List<HPSEcalCluster> clusters = new ArrayList<HPSEcalCluster>();
+
+        // Loop over ECal hits to find cluster seeds.
+        for (CalorimeterHit hit : map.values()) {
+            // Cut on min seed E.
+            if (hit.getRawEnergy() < seedEMin) {
+                continue;
+            }
+
+            // Get neighbor crystal IDs.
+            Set<Long> neighbors = neighborMap.get(hit.getCellID());
+
+            if (neighbors == null) {
+                throw new RuntimeException("Oops!  Set of neighbors is null!");
+            }
+
+            // List for neighboring hits.
+            List<CalorimeterHit> neighborHits = new ArrayList<CalorimeterHit>();
+
+            // Loop over neighbors to make hit list for cluster.
+            boolean isSeed = true;
+            for (Long neighborId : neighbors) {
+                // Find the neighbor hit in the event if it exists.
+                CalorimeterHit neighborHit = map.get(neighborId);
+
+                // Was this neighbor cell hit?
+                if (neighborHit != null) {
+                    // Check if neighbor cell has more energy.
+                    if (neighborHit.getRawEnergy() > hit.getRawEnergy()) {
+                        // Neighbor has more energy, so cell is not a seed.
+                        isSeed = false;
+                        break;
+                    }
+
+                    // Add to cluster if above min E.
+                    if (neighborHit.getRawEnergy() >= addEMin) {
+                        neighborHits.add(neighborHit);
+                    }
+                }
+            }
+
+            // Did we find a seed?
+            if (isSeed) {
+                // Make a cluster from the hit list.
+                HPSEcalCluster cluster = new HPSEcalCluster(hit);
+                cluster.addHit(hit);
+                for (CalorimeterHit clusHit : neighborHits) {
+                    cluster.addHit(clusHit);
+                }
+                clusters.add(cluster);
+            }
+        }
+        return clusters;
+    }
+}
\ No newline at end of file

hps-java/src/main/java/org/lcsim/hps/recon/ecal
CTPEcalClusterer.java added at 1.1
diff -N CTPEcalClusterer.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ CTPEcalClusterer.java	25 Feb 2013 22:39:24 -0000	1.1
@@ -0,0 +1,308 @@
+package org.lcsim.hps.recon.ecal;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.PriorityQueue;
+import java.util.Set;
+
+import org.lcsim.event.CalorimeterHit;
+//import org.lcsim.event.Cluster;
+import org.lcsim.event.EventHeader;
+import org.lcsim.geometry.Detector;
+import org.lcsim.geometry.IDDecoder;
+import org.lcsim.geometry.subdetector.HPSEcal3.NeighborMap;
+import org.lcsim.geometry.subdetector.HPSEcal3;
+import org.lcsim.hps.recon.ecal.CTPEcalClusterer.TimeComparator;
+import org.lcsim.util.Driver;
+import org.lcsim.util.lcio.LCIOConstants;
+
+/**
+ * Creates clusters from CalorimeterHits in the HPSEcal detector.
+ *
+ * The clustering algorithm is from JLab Hall B 6 GeV DVCS Trigger Design doc.
+ *
+ * @author Jeremy McCormick <[log in to unmask]>
+ * @author Tim Nelson <[log in to unmask]>
+ * @author Sho Uemura <[log in to unmask]>
+ * @version $Id: CTPEcalClusterer.java,v 1.1 2013/02/25 22:39:24 meeg Exp $
+ */
+public class CTPEcalClusterer extends Driver {
+
+    HPSEcal3 ecal;
+    IDDecoder dec;
+    String ecalName;
+    String ecalCollectionName;
+    String clusterCollectionName = "EcalClusters";
+    Set<Long> clusterCenters = null;
+    Map<Long, Double> hitSums = null;
+    Map<Long, CalorimeterHit> hitMap = null;
+    // Map of crystals to their neighbors.
+    NeighborMap neighborMap = null;
+    double clusterWindow = -1;
+    double addEMin = 0;
+
+    public CTPEcalClusterer() {
+    }
+
+    public void setAddEMin(double addEMin) {
+        this.addEMin = addEMin;
+    }
+
+    public void setClusterWindow(double clusterWindow) {
+        this.clusterWindow = clusterWindow;
+    }
+
+    public void setClusterCollectionName(String clusterCollectionName) {
+        this.clusterCollectionName = clusterCollectionName;
+    }
+
+    public void setEcalCollectionName(String ecalCollectionName) {
+        this.ecalCollectionName = ecalCollectionName;
+    }
+
+    public void setEcalName(String ecalName) {
+        this.ecalName = ecalName;
+    }
+
+    @Override
+    public void startOfData() {
+        if (ecalCollectionName == null) {
+            throw new RuntimeException("The parameter ecalCollectionName was not set!");
+        }
+
+        if (ecalName == null) {
+            throw new RuntimeException("The parameter ecalName was not set!");
+        }
+    }
+
+    @Override
+    public void detectorChanged(Detector detector) {
+        // Get the Subdetector.
+        ecal = (HPSEcal3) detector.getSubdetector(ecalName);
+
+        // Get the decoder for the ECal IDs.
+        dec = ecal.getIDDecoder();
+
+        // Cache ref to neighbor map.
+        neighborMap = ecal.getNeighborMap();
+
+        clusterCenters = new HashSet<Long>();
+        //Make set of valid cluster centers.
+        for (Long cellID : neighborMap.keySet()) {
+            boolean isValidCenter = true;
+            Set<Long> neighbors = neighborMap.get(cellID);
+            for (Long neighborID : neighbors) {
+                Set<Long> neighborneighbors = new HashSet<Long>();
+                neighborneighbors.addAll(neighborMap.get(neighborID));
+                neighborneighbors.add(neighborID);
+
+                if (neighborneighbors.containsAll(neighbors)) {
+                    isValidCenter = false;
+                    break;
+                }
+            }
+            if (isValidCenter) {
+                clusterCenters.add(cellID);
+            }
+        }
+
+        //System.out.println(ecal.getName());
+        //System.out.println("  nx="+ecal.nx());
+        //System.out.println("  ny="+ecal.ny());
+        //System.out.println("  beamgap="+ecal.beamGap());
+        //System.out.println("  dface="+ecal.distanceToFace());
+
+        //System.out.println(neighborMap.toString());
+    }
+
+    @Override
+    public void process(EventHeader event) {
+        //System.out.println(this.getClass().getCanonicalName() + " - process");
+
+        if (event.hasCollection(CalorimeterHit.class, ecalCollectionName)) {
+            // Get the list of raw ECal hits.
+            List<CalorimeterHit> hits = event.get(CalorimeterHit.class, ecalCollectionName);
+
+            List<HPSEcalCluster> clusters;
+
+            if (clusterWindow >= 0) {
+                PriorityQueue<CalorimeterHit> futureHits = new PriorityQueue<CalorimeterHit>(10, new TimeComparator());
+                PriorityQueue<CalorimeterHit> pastHits = new PriorityQueue<CalorimeterHit>(10, new TimeComparator());
+                clusters = new ArrayList<HPSEcalCluster>();
+
+                for (CalorimeterHit hit : hits) {
+                    if (hit.getRawEnergy() > addEMin) {
+                        futureHits.add(hit);
+                    }
+                }
+
+                while (!futureHits.isEmpty()) {
+                    CalorimeterHit nextHit = futureHits.poll();
+                    pastHits.add(nextHit);
+                    while (!futureHits.isEmpty() && futureHits.peek().getTime() == nextHit.getTime()) {
+                        pastHits.add(futureHits.poll());
+                    }
+                    while (pastHits.peek().getTime() < nextHit.getTime() - clusterWindow) {
+                        pastHits.poll();
+                    }
+                    sumHits(pastHits);
+                    clusters.addAll(createClusters());
+                }
+            } else {
+                sumHits(hits);
+                clusters = createClusters();
+            }
+
+            // Put Cluster collection into event.
+            int flag = 1 << LCIOConstants.CLBIT_HITS;
+            event.put(clusterCollectionName, clusters, HPSEcalCluster.class, flag);
+        }
+    }
+
+    public void sumHits(Collection<CalorimeterHit> hits) {
+        // Hit map.
+        hitMap = new HashMap<Long, CalorimeterHit>();
+
+        hitSums = new HashMap<Long, Double>();
+        // Loop over ECal hits to compute energy sums
+        for (CalorimeterHit hit : hits) {
+//                System.out.format("hit: %f\n",hit.getRawEnergy());
+            // Make a hit map for quick lookup by ID.
+            hitMap.put(hit.getCellID(), hit);
+
+            // Get neighbor crystal IDs. 
+            Set<Long> neighbors = neighborMap.get(hit.getCellID());
+
+            if (neighbors == null) {
+                throw new RuntimeException("Oops!  Set of neighbors is null!");
+            }
+
+            Double hitSum;
+
+            if (clusterCenters.contains(hit.getCellID())) {
+                hitSum = hitSums.get(hit.getCellID());
+                if (hitSum == null) {
+                    hitSums.put(hit.getCellID(), hit.getRawEnergy());
+                } else {
+                    hitSums.put(hit.getCellID(), hitSum + hit.getRawEnergy());
+                }
+            }
+
+            // Loop over neighbors to make hit list for cluster.
+            for (Long neighborId : neighbors) {
+                if (!clusterCenters.contains(neighborId)) {
+                    continue;
+                }
+                hitSum = hitSums.get(neighborId);
+                if (hitSum == null) {
+                    hitSums.put(neighborId, hit.getRawEnergy());
+                } else {
+                    hitSums.put(neighborId, hitSum + hit.getRawEnergy());
+                }
+            }
+        }
+    }
+
+    public List<HPSEcalCluster> createClusters() {
+//		boolean printClusters;
+        // New Cluster list to be added to event.
+        List<HPSEcalCluster> clusters = new ArrayList<HPSEcalCluster>();
+        //System.out.println("New event");
+        //for each crystal with a nonzero hit count, test for cluster
+        for (Long possibleCluster : hitSums.keySet()) {
+            Double thisSum = hitSums.get(possibleCluster);
+
+            // Get neighbor crystal IDs.
+            Set<Long> neighbors = neighborMap.get(possibleCluster);
+
+            if (neighbors == null) {
+                throw new RuntimeException("Oops!  Set of neighbors is null!");
+            }
+
+            //Apply peak detector scheme.
+            // Set the ID.
+            dec.setID(possibleCluster);
+            int x1 = dec.getValue("ix");
+            int y1 = dec.getValue("iy");
+//			System.out.printf("\nThis cluster: E= %f, ID=%d, x=%d, y=%d, neighbors=%d\n", thisSum, possibleCluster, x1, y1, neighbors.size());
+            boolean isCluster = true;
+            for (Long neighborId : neighbors) {
+                // Set the ID.
+                dec.setID(neighborId);
+                int x2 = dec.getValue("ix");
+                int y2 = dec.getValue("iy");
+
+                Double neighborSum = hitSums.get(neighborId);
+                if (neighborSum == null) {
+                    continue;
+                }
+
+//				System.out.printf("Neighbor cluster: E= %f, ID=%d, x=%d, y=%d, neighbors=%d\n", neighborSum, neighborId, x2, y2, neighborMap.get(neighborId).size());
+
+                if (neighborSum > thisSum) {
+//					System.out.println("Reject cluster: sum cut");
+                    isCluster = false;
+                    break;
+                } //								else if (false) { //ctp
+                //								else if (neighborSum.equals(thisSum) && neighborId > possibleCluster) { //id
+                //								else if (neighborSum.equals(thisSum) && (x1<x2 || (x1==x2 && Math.abs(y1)>Math.abs(y2)))) { //right_in
+                //								else if (neighborSum.equals(thisSum) && (x1<x2 || (x1==x2 && Math.abs(y1)<Math.abs(y2)))) { //right_out
+                //								else if (neighborSum.equals(thisSum) && (x1>x2 || (x1==x2 && Math.abs(y1)>Math.abs(y2)))) { //left_in
+                else if (neighborSum.equals(thisSum) && (x1 > x2 || (x1 == x2 && Math.abs(y1) < Math.abs(y2)))) { //left_out
+//								else if (neighborSum.equals(thisSum) && (x1<x2 || (x1==x2 && y1<y2))) { //right_up
+//								else if (neighborSum.equals(thisSum) && (x1>x2 || (x1==x2 && y1<y2))) { //left_up
+//					System.out.println("Reject cluster: tie-breaker cut");
+                    isCluster = false;
+                    break;
+                }
+            }
+
+            if (isCluster) {
+                List<CalorimeterHit> hits = new ArrayList<CalorimeterHit>();
+                double clusterTime = Double.NEGATIVE_INFINITY;
+                CalorimeterHit hit = hitMap.get(possibleCluster);
+                if (hit != null) {
+                    hits.add(hit);
+                    if (hit.getTime() > clusterTime) {
+                        clusterTime = hit.getTime();
+                    }
+                }
+                for (Long neighborId : neighbors) {
+                    hit = hitMap.get(neighborId);
+                    if (hit != null) {
+                        hits.add(hit);
+                        if (hit.getTime() > clusterTime) {
+                            clusterTime = hit.getTime();
+                        }
+                    }
+                }
+                CalorimeterHit seedHit = new HPSCalorimeterHit(0.0, clusterTime, possibleCluster, hits.get(0).getType());
+                seedHit.setMetaData(hits.get(0).getMetaData());
+                HPSEcalCluster cluster = new HPSEcalCluster(seedHit);
+                for (CalorimeterHit clusterHit : hits) {
+                    cluster.addHit(clusterHit);
+                }
+                clusters.add(cluster);
+//                System.out.println(cluster.getEnergy());
+            }
+        }
+        return clusters;
+    }
+
+    static class TimeComparator implements Comparator<CalorimeterHit> {
+
+        @Override
+        public int compare(CalorimeterHit o1, CalorimeterHit o2) {
+            if (o1.getTime() == o2.getTime()) {
+                return 0;
+            } else {
+                return (o1.getTime() > o2.getTime()) ? 1 : -1;
+            }
+        }
+    }
+}

hps-java/src/main/java/org/lcsim/hps/recon/ecal
EcalConditions.java added at 1.1
diff -N EcalConditions.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ EcalConditions.java	25 Feb 2013 22:39:24 -0000	1.1
@@ -0,0 +1,342 @@
+package org.lcsim.hps.recon.ecal;
+
+import java.io.BufferedReader;
+import org.lcsim.geometry.compact.Subdetector;
+import java.io.IOException;
+import java.io.Reader;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.StringTokenizer;
+import org.lcsim.conditions.ConditionsManager;
+import org.lcsim.detector.identifier.ExpandedIdentifier;
+import org.lcsim.detector.identifier.IExpandedIdentifier;
+import org.lcsim.detector.identifier.IIdentifierHelper;
+import org.lcsim.geometry.Detector;
+import org.lcsim.util.Driver;
+
+/**
+ *
+ * @author meeg
+ * @version $Id: EcalConditions.java,v 1.1 2013/02/25 22:39:24 meeg Exp $
+ */
+public class EcalConditions extends Driver {
+
+    //DAQ channel map
+    private static HashMap<Long, Long> daqToPhysicalMap = new HashMap<Long, Long>();
+    private static HashMap<Long, Long> physicalToDaqMap = new HashMap<Long, Long>();
+    //pedestals
+    private static HashMap<Long, Double> daqToPedestalMap = new HashMap<Long, Double>();
+    private static HashMap<Long, Double> daqToNoiseMap = new HashMap<Long, Double>();
+    //set of bad channels to ignore
+    private static HashSet<Long> badChannelsSet = new HashSet<Long>();
+    private static boolean badChannelsLoaded = false;
+    private static IIdentifierHelper helper = null;
+    //gain
+    private static HashMap<Long, Double> physicalToGainMap = new HashMap<Long, Double>();
+    //subdetector name (for when this is used as a driver)
+    private String subdetectorName = "Ecal";
+    private static Subdetector subdetector;
+    private static boolean debug = false;
+    private static boolean calibrationLoaded = false;
+
+    public EcalConditions() {
+    }
+
+    @Override
+    public void detectorChanged(Detector detector) {
+        detectorChanged(detector, subdetectorName);
+    }
+
+    public static void detectorChanged(Detector detector, String ecalName) {
+        subdetector = detector.getSubdetector(ecalName);
+        if (subdetector == null) {
+            throw new RuntimeException("Subdetector " + ecalName + " not found");
+        }
+        helper = subdetector.getDetectorElement().getIdentifierHelper();
+    }
+
+    public static boolean calibrationLoaded() {
+        return calibrationLoaded;
+    }
+
+    public static void loadDaqMap(Detector detector, String ecalName) {
+        detectorChanged(detector, ecalName);
+        fillDaqCellMap(subdetector);
+    }
+
+    public static void loadCalibration() {
+        fillDaqCellMap(subdetector);
+        loadBadChannels(subdetector);
+        loadGains();
+        loadPedestals();
+        calibrationLoaded = true;
+    }
+
+    public void setSubdetectorName(String subdetectorName) {
+        this.subdetectorName = subdetectorName;
+    }
+
+    public static IIdentifierHelper getHelper() {
+        return helper;
+    }
+
+    public static Subdetector getSubdetector() {
+        return subdetector;
+    }
+
+    public static boolean badChannelsLoaded() {
+        return badChannelsLoaded;
+    }
+
+    public static void loadPedestals() {
+        ConditionsManager conditions = ConditionsManager.defaultInstance();
+        try {
+            Reader pedestalsReader = conditions.getRawConditions("calibECal/default01.ped").getReader();
+            loadPedestals(pedestalsReader, 1);
+            pedestalsReader = conditions.getRawConditions("calibECal/default02.ped").getReader();
+            loadPedestals(pedestalsReader, 2);
+        } catch (IOException e) {
+            throw new RuntimeException("couldn't get pedestals file", e);
+        }
+    }
+
+    public static void loadPedestals(Reader reader, int crate) {
+
+        System.out.println("reading pedestals for ECal");
+
+        BufferedReader bufferedReader = new BufferedReader(reader);
+        String line;
+        while (true) {
+            try {
+                line = bufferedReader.readLine();
+            } catch (IOException e) {
+                throw new RuntimeException("couldn't parse pedestals file", e);
+            }
+            if (line == null) {
+                break;
+            }
+
+            if (line.indexOf("#") != -1) {
+                line = line.substring(0, line.indexOf("#"));
+            }
+
+            StringTokenizer lineTok = new StringTokenizer(line);
+
+            if (lineTok.countTokens() != 0) {
+                if (lineTok.countTokens() != 4) {
+                    throw new RuntimeException("Invalid line in pedestals file: " + line);
+                } else {
+                    short slot = Short.valueOf(lineTok.nextToken());
+                    short channel = Short.valueOf(lineTok.nextToken());
+                    double pedestal = Double.valueOf(lineTok.nextToken());
+                    double noise = Double.valueOf(lineTok.nextToken());
+                    long daqid = getDaqID(crate, slot, channel);
+                    daqToPedestalMap.put(daqid, pedestal);
+                    daqToNoiseMap.put(daqid, noise);
+                    if (debug) {
+                        System.out.printf("Channel %d: pede %.2f noise %.2f (crate %d slot %d channel %d)\n", daqid,pedestal,noise,crate,slot,channel);
+                    }
+                }
+            }
+        }
+    }
+
+    private static void loadBadChannels(Subdetector ecal) {
+
+        System.out.println("reading ECal bad channels");
+
+        IExpandedIdentifier expId = new ExpandedIdentifier(helper.getIdentifierDictionary().getNumberOfFields());
+        expId.setValue(helper.getFieldIndex("system"), ecal.getSystemID());
+        ConditionsManager conditions = ConditionsManager.defaultInstance();
+        BufferedReader bufferedReader;
+        try {
+            bufferedReader = new BufferedReader(conditions.getRawConditions("daqmap/ecal.badchannels").getReader());
+        } catch (IOException e) {
+            throw new RuntimeException("couldn't get ECal bad channels from conditions manager", e);
+        }
+        String line;
+        while (true) {
+            try {
+                line = bufferedReader.readLine();
+            } catch (IOException e) {
+                throw new RuntimeException("couldn't parse ECal bad channels", e);
+            }
+            if (line == null) {
+                break;
+            }
+
+            if (line.indexOf("#") != -1) {
+                line = line.substring(0, line.indexOf("#"));
+            }
+
+            StringTokenizer lineTok = new StringTokenizer(line);
+
+            if (lineTok.countTokens() != 0) {
+                if (lineTok.countTokens() != 2) {
+                    throw new RuntimeException("Invalid line in ECal bad channels: " + line);
+                } else {
+                    int x = Integer.valueOf(lineTok.nextToken());
+                    int y = Integer.valueOf(lineTok.nextToken());
+                    expId.setValue(helper.getFieldIndex("ix"), x);
+                    expId.setValue(helper.getFieldIndex("iy"), y);
+                    badChannelsSet.add(helper.pack(expId).getValue());
+                    if (debug) {
+                        System.out.printf("Channel %d is bad (x=%d y=%d)\n", helper.pack(expId).getValue(),x,y);
+                    }
+                }
+            }
+        }
+        badChannelsLoaded = true;
+    }
+
+    public static void loadGains() {
+        if (debug) {
+            System.out.println("Loading gains");
+        }
+        BufferedReader bufferedReader;
+        ConditionsManager conditions = ConditionsManager.defaultInstance();
+        try {
+            bufferedReader = new BufferedReader(conditions.getRawConditions("calibECal/default.gain").getReader());
+        } catch (IOException e) {
+            throw new RuntimeException("couldn't get gain file", e);
+        }
+
+        String line;
+        while (true) {
+            try {
+                line = bufferedReader.readLine();
+            } catch (IOException e) {
+                throw new RuntimeException("couldn't parse gain file", e);
+            }
+            if (line == null) {
+                break;
+            }
+
+            if (line.indexOf("#") != -1) {
+                line = line.substring(0, line.indexOf("#"));
+            }
+
+            StringTokenizer lineTok = new StringTokenizer(line);
+
+            if (lineTok.countTokens() != 0) {
+                if (lineTok.countTokens() != 3) {
+                    throw new RuntimeException("Invalid line in gain file: " + line);
+                } else {
+                    int x = Integer.valueOf(lineTok.nextToken());
+                    int y = Integer.valueOf(lineTok.nextToken());
+                    double gain = Double.valueOf(lineTok.nextToken());
+                    physicalToGainMap.put(makePhysicalID(x, y), gain);
+                    if (debug) {
+                        System.out.printf("Channel %d: gain %.2f (x=%d y=%d)\n", makePhysicalID(x, y),gain,x,y);
+                    }
+                }
+            }
+        }
+    }
+
+    public static boolean isBadChannel(long id) {
+        return badChannelsSet.contains(id);
+    }
+
+    private static void fillDaqCellMap(Subdetector ecal) {
+
+        System.out.println("reading ECal DAQ map");
+
+        IExpandedIdentifier expId = new ExpandedIdentifier(helper.getIdentifierDictionary().getNumberOfFields());
+        expId.setValue(helper.getFieldIndex("system"), ecal.getSystemID());
+
+        ConditionsManager conditions = ConditionsManager.defaultInstance();
+        BufferedReader bufferedReader;
+        try {
+            bufferedReader = new BufferedReader(conditions.getRawConditions("daqmap/ecal.txt").getReader());
+        } catch (IOException e) {
+            throw new RuntimeException("couldn't get DAQ map from conditions manager", e);
+        }
+        String line;
+        while (true) {
+            try {
+                line = bufferedReader.readLine();
+            } catch (IOException e) {
+                throw new RuntimeException("couldn't parse ECal DAQ map", e);
+            }
+            if (line == null) {
+                break;
+            }
+
+            if (line.indexOf("#") != -1) {
+                line = line.substring(0, line.indexOf("#"));
+            }
+
+            StringTokenizer lineTok = new StringTokenizer(line);
+
+            if (lineTok.countTokens() != 0) {
+                if (lineTok.countTokens() != 5) {
+                    throw new RuntimeException("Invalid line in ECal DAQ map: " + line);
+                } else {
+                    int x = Integer.valueOf(lineTok.nextToken());
+                    int y = Integer.valueOf(lineTok.nextToken());
+//                    if (x>0 && y>0) x = 24-x;
+                    expId.setValue(helper.getFieldIndex("ix"), x);
+                    expId.setValue(helper.getFieldIndex("iy"), y);
+                    int crate = Integer.valueOf(lineTok.nextToken());
+                    short slot = Short.valueOf(lineTok.nextToken());
+                    short channel = Short.valueOf(lineTok.nextToken());
+                    addMapEntry(helper.pack(expId).getValue(), getDaqID(crate, slot, channel));
+                }
+            }
+        }
+    }
+
+    public static long makePhysicalID(int ix, int iy) {
+        IExpandedIdentifier expId = new ExpandedIdentifier(helper.getIdentifierDictionary().getNumberOfFields());
+        expId.setValue(helper.getFieldIndex("system"), subdetector.getSystemID());
+        expId.setValue(helper.getFieldIndex("ix"), ix);
+        expId.setValue(helper.getFieldIndex("iy"), iy);
+        return helper.pack(expId).getValue();
+    }
+
+    private static void addMapEntry(long physicalID, long daqID) {
+        daqToPhysicalMap.put(daqID, physicalID);
+        physicalToDaqMap.put(physicalID, daqID);
+    }
+
+    public static long getDaqID(int crate, short slot, short channel) {
+        return (((long) crate) << 32) | ((long) slot << 16) | (long) channel;
+    }
+
+    public static Long daqToPhysicalID(int crate, short slot, short channel) {
+        return daqToPhysicalMap.get(getDaqID(crate, slot, channel));
+    }
+
+    public static int getCrate(long daqID) {
+        return (int) (daqID >>> 32);
+    }
+
+    public static short getSlot(long daqID) {
+        return (short) ((daqID >>> 16) & 0xFFFF);
+    }
+
+    public static short getChannel(long daqID) {
+        return (short) (daqID & 0xFFFF);
+    }
+
+    public static Long physicalToDaqID(long physicalID) {
+        return physicalToDaqMap.get(physicalID);
+    }
+
+    public static Long daqToPhysicalID(long daqID) {
+        return daqToPhysicalMap.get(daqID);
+    }
+
+    public static Double daqToPedestal(long daqID) {
+        return daqToPedestalMap.get(daqID);
+    }
+
+    public static Double physicalToPedestal(long physicalID) {
+        return daqToPedestalMap.get(physicalToDaqMap.get(physicalID));
+    }
+
+    public static Double physicalToGain(long physicalID) {
+        return physicalToGainMap.get(physicalID);
+    }
+}

hps-java/src/main/java/org/lcsim/hps/recon/ecal
EcalTriggerFilterDriver.java added at 1.1
diff -N EcalTriggerFilterDriver.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ EcalTriggerFilterDriver.java	25 Feb 2013 22:39:24 -0000	1.1
@@ -0,0 +1,108 @@
+package org.lcsim.hps.recon.ecal;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Queue;
+import java.util.concurrent.ArrayBlockingQueue;
+import org.lcsim.event.CalorimeterHit;
+import org.lcsim.event.EventHeader;
+import org.lcsim.geometry.Detector;
+import org.lcsim.util.Driver;
+
+/**
+ * Changes ECal hit IDs to match what the test run trigger sees.
+ * @version $Id: HPSEcalRawConverterDriver.java,v 1.2 2012/05/03 00:17:54
+ * phansson Exp $
+ */
+public class EcalTriggerFilterDriver extends Driver {
+
+    private String ecalReadoutName = "EcalHits";
+    private String inputCollection = "EcalReadoutHits";
+    private String outputCollection = "EcalCalHits";
+    private int topDelay = 0;
+    private int bottomDelay = 5;
+    private Queue<List<CalorimeterHit>> topHitsQueue = null;
+    private Queue<List<CalorimeterHit>> bottomHitsQueue = null;
+
+    public EcalTriggerFilterDriver() {
+    }
+
+    public void setOutputCollection(String outputCollection) {
+        this.outputCollection = outputCollection;
+    }
+
+    public void setInputCollection(String inputCollection) {
+        this.inputCollection = inputCollection;
+    }
+
+    @Override
+    public void startOfData() {
+        if (outputCollection == null) {
+            throw new RuntimeException("The parameter ecalCollectionName was not set!");
+        }
+
+        topHitsQueue = new ArrayBlockingQueue<List<CalorimeterHit>>(topDelay + 1);
+        for (int i = 0; i < topDelay; i++) {
+            topHitsQueue.add(new ArrayList<CalorimeterHit>());
+        }
+        bottomHitsQueue = new ArrayBlockingQueue<List<CalorimeterHit>>(bottomDelay + 1);
+        for (int i = 0; i < bottomDelay; i++) {
+            bottomHitsQueue.add(new ArrayList<CalorimeterHit>());
+        }
+    }
+
+    @Override
+    public void detectorChanged(Detector detector) {
+    }
+
+    @Override
+    public void process(EventHeader event) {
+        if (event.hasCollection(CalorimeterHit.class, inputCollection)) {
+            ArrayList<CalorimeterHit> newHits = new ArrayList<CalorimeterHit>();
+
+            ArrayList<CalorimeterHit> topHits = new ArrayList<CalorimeterHit>();
+            ArrayList<CalorimeterHit> bottomHits = new ArrayList<CalorimeterHit>();
+
+            List<CalorimeterHit> hits = event.get(CalorimeterHit.class, inputCollection);
+            for (CalorimeterHit hit : hits) {
+                CalorimeterHit newHit = filterHit(hit);
+                if (newHit != null) {
+                    if (hit.getIdentifierFieldValue("iy") > 0) { //should really be checking newHit, but it doesn't have metadata yet
+                        topHits.add(newHit);
+                    } else {
+                        bottomHits.add(newHit);
+                    }
+                }
+            }
+            topHitsQueue.add(topHits);
+            bottomHitsQueue.add(bottomHits);
+            newHits.addAll(topHitsQueue.poll());
+            newHits.addAll(bottomHitsQueue.poll());
+            int flags = 0;
+            event.put(outputCollection, newHits, CalorimeterHit.class, flags, ecalReadoutName);
+        }
+    }
+
+    private CalorimeterHit filterHit(CalorimeterHit hit) {
+        int ix = hit.getIdentifierFieldValue("ix");
+        int iy = hit.getIdentifierFieldValue("iy");
+        long daqID = EcalConditions.physicalToDaqID(hit.getCellID());
+        int crate = EcalConditions.getCrate(daqID);
+        short slot = EcalConditions.getSlot(daqID);
+        short channel = EcalConditions.getChannel(daqID);
+
+        int delay = iy>0?topDelay:bottomDelay;
+        // no triggers from crate 1, slot 3 
+        if (crate == 1 && slot == 3) {
+            return null;
+        }
+
+        // flip quadrant
+        if (ix > 0 && iy > 0) {
+            ix = 24 - ix;
+        }
+        long newID = EcalConditions.makePhysicalID(ix, iy);
+        //make new hit; set position to null so it gets recalculated
+        return new HPSCalorimeterHit(hit.getRawEnergy(), hit.getTime()+delay*4, newID, hit.getType());
+    }
+}

hps-java/src/main/java/org/lcsim/hps/recon/ecal
EcalEdepToTriggerConverterDriver.java added at 1.1
diff -N EcalEdepToTriggerConverterDriver.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ EcalEdepToTriggerConverterDriver.java	25 Feb 2013 22:39:24 -0000	1.1
@@ -0,0 +1,188 @@
+package org.lcsim.hps.recon.ecal;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.lcsim.event.CalorimeterHit;
+import org.lcsim.event.EventHeader;
+import org.lcsim.geometry.Detector;
+import org.lcsim.util.Driver;
+
+/**
+ *
+ * @version $Id: HPSEcalRawConverterDriver.java,v 1.2 2012/05/03 00:17:54
+ * phansson Exp $
+ */
+public class EcalEdepToTriggerConverterDriver extends Driver {
+
+    private String ecalReadoutName = "EcalHits";
+    private String inputCollection = "EcalHits";
+    private String readoutCollection = "EcalCalHits";
+    private String triggerCollection = "EcalTriggerHits";
+    private boolean applyBadCrystalMap = true;
+    private double tp = 14.0;
+    private double readoutPeriod = 4.0;
+    private int readoutThreshold = 50;
+    private int triggerThreshold = 80;
+    private int truncateScale = 128;
+    private double pulseIntegral = tp * Math.E / readoutPeriod;
+    private double gainScale = 1.0; //gain miscalibration factor
+    private double _gain = -1.0; //constant gain, activated if >0
+
+    public EcalEdepToTriggerConverterDriver() {
+    }
+
+    public void setTp(double tp) {
+        this.tp = tp;
+    }
+
+    public void setReadoutCollection(String readoutCollection) {
+        this.readoutCollection = readoutCollection;
+    }
+
+    public void setTriggerCollection(String triggerCollection) {
+        this.triggerCollection = triggerCollection;
+    }
+
+    public void setInputCollection(String inputCollection) {
+        this.inputCollection = inputCollection;
+    }
+
+    public void setApplyBadCrystalMap(boolean apply) {
+        this.applyBadCrystalMap = apply;
+    }
+
+    public void setTruncateScale(int truncateScale) {
+        this.truncateScale = truncateScale;
+    }
+
+    public void setConstantGain(double gain) {
+        this._gain = gain;
+    }
+
+    @Override
+    public void startOfData() {
+        if (readoutCollection == null) {
+            throw new RuntimeException("The parameter ecalCollectionName was not set!");
+        }
+    }
+
+    @Override
+    public void detectorChanged(Detector detector) {
+    }
+
+    public boolean isBadCrystal(CalorimeterHit hit) {
+        return EcalConditions.badChannelsLoaded() ? EcalConditions.isBadChannel(hit.getCellID()) : false;
+    }
+
+    @Override
+    public void process(EventHeader event) {
+        ArrayList<CalorimeterHit> triggerHits = new ArrayList<CalorimeterHit>();
+        ArrayList<CalorimeterHit> readoutHits = new ArrayList<CalorimeterHit>();
+
+        if (event.hasCollection(CalorimeterHit.class, inputCollection)) {
+            List<CalorimeterHit> hits = event.get(CalorimeterHit.class, inputCollection);
+
+            for (CalorimeterHit hit : hits) {
+                if (applyBadCrystalMap && isBadCrystal(hit)) {
+                    continue;
+                }
+                CalorimeterHit triggerHit = makeTriggerHit(hit);
+                if (triggerHit != null) {
+                    triggerHits.add(triggerHit);
+                }
+                CalorimeterHit readoutHit = makeReadoutHit(hit);
+                if (readoutHit != null) {
+                    readoutHits.add(readoutHit);
+                }
+            }
+        }
+        int flags = 0;
+        event.put(triggerCollection, triggerHits, CalorimeterHit.class, flags, ecalReadoutName);
+        event.put(readoutCollection, readoutHits, CalorimeterHit.class, flags, ecalReadoutName);
+    }
+
+    public CalorimeterHit makeTriggerHit(CalorimeterHit hit) {
+        double amplitude = hitAmplitude(hit);
+
+//        double time = readoutPeriod * (Math.random() - 1);
+        double time = 0 - hit.getTime();
+        double triggerIntegral = 0;
+        boolean overThreshold = false;
+        while (true) {
+            double currentValue = amplitude * pulseAmplitude(time);
+            if (!overThreshold && currentValue > triggerThreshold) {
+                overThreshold = true;
+            }
+            if (overThreshold) {
+                triggerIntegral += amplitude * pulseAmplitude(time);
+                if (currentValue < triggerThreshold) {
+                    break;
+                }
+            }
+            time += readoutPeriod;
+
+            if (time > 200.0) {
+                break;
+            }
+        }
+
+//        System.out.format("%f %f %f\n", readoutIntegral, amplitude, triggerIntegral);
+
+        int truncatedIntegral = (int) Math.floor(triggerIntegral / truncateScale);
+        if (truncatedIntegral > 0) {
+            return new HPSCalorimeterHit(truncatedIntegral, hit.getTime(), hit.getCellID(), 0);
+        }
+        return null;
+    }
+
+    public CalorimeterHit makeReadoutHit(CalorimeterHit hit) {
+        double amplitude = hitAmplitude(hit);
+        if (amplitude < readoutThreshold) {
+            return null;
+        }
+        double integral = hit.getRawEnergy()/ECalUtils.GeV * gainScale;
+
+//        double thresholdCrossingTime = 0 - hit.getTime();
+//        while (true) {
+//            double currentValue = amplitude * pulseAmplitude(thresholdCrossingTime);
+//            if (currentValue > readoutThreshold) {
+//                break;
+//            }
+//            thresholdCrossingTime += readoutPeriod;
+//
+//            if (thresholdCrossingTime > 200.0) {
+//                break;
+//            }
+//        }
+//
+//        double readoutIntegral = 0;
+//        for (int i = 0; i < 35; i++) {
+//            readoutIntegral += amplitude * pulseAmplitude(thresholdCrossingTime + (i - 5) * readoutPeriod);
+//        }
+////        double integral = readoutIntegral * HPSEcalConditions.physicalToGain(id);
+//        System.out.format("dumb: %f, full: %f\n",hit.getRawEnergy() * 1000.0,readoutIntegral * HPSEcalConditions.physicalToGain(id));
+
+        CalorimeterHit h = new HPSCalorimeterHit(integral, hit.getTime(), hit.getCellID(), 0);
+        return h;
+    }
+
+    private double hitAmplitude(CalorimeterHit hit) {
+        double gain = _gain > 0 ? _gain : EcalConditions.physicalToGain(hit.getCellID());
+        return (hit.getRawEnergy() /ECalUtils.MeV) / (gain * pulseIntegral);
+    }
+
+    private double pulseAmplitude(double time) {
+        if (time <= 0.0) {
+            return 0.0;
+        }
+        if (tp > 0.0) {
+            return (time / tp) * Math.exp(1.0 - time / tp);
+        } else {
+            if (time < -tp) {
+                return 1.0;
+            } else {
+                return 0.0;
+            }
+        }
+    }
+}

hps-java/src/main/java/org/lcsim/hps/recon/ecal
EcalRawConverter.java added at 1.1
diff -N EcalRawConverter.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ EcalRawConverter.java	25 Feb 2013 22:39:24 -0000	1.1
@@ -0,0 +1,101 @@
+package org.lcsim.hps.recon.ecal;
+
+import org.lcsim.event.CalorimeterHit;
+import org.lcsim.event.RawCalorimeterHit;
+import org.lcsim.event.RawTrackerHit;
+import org.lcsim.event.base.BaseRawCalorimeterHit;
+
+/**
+ *
+ * @version $Id: HPSEcalRawConverterDriver.java,v 1.2 2012/05/03 00:17:54
+ * phansson Exp $
+ */
+public class EcalRawConverter {
+
+    private boolean debug = false;
+    private boolean constantGain = false;
+    private double gain;
+
+    public EcalRawConverter() {
+    }
+
+    public void setGain(double gain) {
+        constantGain = true;
+        this.gain = gain;
+    }
+
+    public short sumADC(RawTrackerHit hit) {
+        //Sum all pedestal subtracted ADC values 
+        //return scale * (amplitude + 0.5) + pedestal;
+        if (debug) {
+            System.out.println("Summing ADC for hit: " + hit.toString());
+        }
+        double pedestal = EcalConditions.physicalToPedestal(hit.getCellID());
+        short sum = 0;
+        short samples[] = hit.getADCValues();
+        for (int isample = 0; isample < samples.length; ++isample) {
+            sum += (samples[isample] - pedestal);
+            if (debug) {
+                System.out.println("Sample " + isample + " " + samples[isample] + " pedestal " + pedestal + " (" + sum + ")");
+            }
+        }
+        return sum;
+    }
+
+    public CalorimeterHit HitDtoA(RawTrackerHit hit) {
+        double time = hit.getTime();
+        long id = hit.getCellID();
+        double rawEnergy;
+        if (constantGain) {
+            rawEnergy = gain * sumADC(hit) * ECalUtils.MeV;
+        } else {
+            rawEnergy = EcalConditions.physicalToGain(id) * sumADC(hit) * ECalUtils.MeV;
+        }
+//        double[] pos = hit.getDetectorElement().getGeometry().getPosition().v();
+        CalorimeterHit h = new HPSCalorimeterHit(rawEnergy + 0.0000001, time, id, 0);
+        //+0.0000001 is a horrible hack to ensure rawEnergy!=BaseCalorimeterHit.UNSET_CORRECTED_ENERGY
+        return h;
+    }
+
+    public CalorimeterHit HitDtoA(RawCalorimeterHit hit, int window) {
+        if (hit.getTimeStamp() % 64 != 0) {
+            System.out.println("unexpected timestamp " + hit.getTimeStamp());
+        }
+        double time = hit.getTimeStamp() / 16.0;
+        long id = hit.getCellID();
+        double rawEnergy;
+        if (constantGain) {
+            rawEnergy = gain * (hit.getAmplitude() - window * EcalConditions.physicalToPedestal(id)) * ECalUtils.MeV;
+        } else {
+            rawEnergy = EcalConditions.physicalToGain(id) * (hit.getAmplitude() - window * EcalConditions.physicalToPedestal(id)) * ECalUtils.MeV;
+        }
+        CalorimeterHit h = new HPSCalorimeterHit(rawEnergy + 0.0000001, time, id, 0);
+        //+0.0000001 is a horrible hack to ensure rawEnergy!=BaseCalorimeterHit.UNSET_CORRECTED_ENERGY
+        return h;
+    }
+
+    public RawCalorimeterHit HitAtoD(CalorimeterHit hit, int window) {
+        int time = (int) (hit.getTime() * 16.0);
+        long id = hit.getCellID();
+        int amplitude;
+        if (constantGain) {
+            amplitude = (int) Math.round((hit.getRawEnergy() / ECalUtils.MeV) / gain + window * EcalConditions.physicalToPedestal(id));
+        } else {
+            amplitude = (int) Math.round((hit.getRawEnergy() / ECalUtils.MeV) / EcalConditions.physicalToGain(id) + window * EcalConditions.physicalToPedestal(id));
+        }
+        RawCalorimeterHit h = new BaseRawCalorimeterHit(id, amplitude, time);
+        return h;
+    }
+
+    public static CalorimeterHit HitDtoA(RawCalorimeterHit hit, int window, double g) {
+        if (hit.getTimeStamp() % 64 != 0) {
+            System.out.println("unexpected timestamp " + hit.getTimeStamp());
+        }
+        double time = hit.getTimeStamp() / 16.0;
+        long id = hit.getCellID();
+        double rawEnergy = g * (hit.getAmplitude() - window * EcalConditions.physicalToPedestal(id)) * ECalUtils.MeV;
+        CalorimeterHit h = new HPSCalorimeterHit(rawEnergy + 0.0000001, time, id, 0);
+        //+0.0000001 is a horrible hack to ensure rawEnergy!=BaseCalorimeterHit.UNSET_CORRECTED_ENERGY
+        return h;
+    }
+}

hps-java/src/main/java/org/lcsim/hps/recon/ecal
HPSCalorimeterHit.java added at 1.1
diff -N HPSCalorimeterHit.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ HPSCalorimeterHit.java	25 Feb 2013 22:39:24 -0000	1.1
@@ -0,0 +1,72 @@
+package org.lcsim.hps.recon.ecal;
+
+import hep.physics.vec.Hep3Vector;
+import java.util.Comparator;
+import org.lcsim.detector.IDetectorElement;
+import org.lcsim.detector.IDetectorElementContainer;
+import org.lcsim.event.CalorimeterHit;
+import org.lcsim.event.base.BaseCalorimeterHit;
+
+/**
+ * An implementation of CalorimeterHit, with a constructor that sets rawEnergy
+ * for use in ECalReadout
+ *
+ * @author Sho Uemura
+ * @version $Id: HPSCalorimeterHit.java,v 1.1 2013/02/25 22:39:24 meeg Exp $
+ */
+public class HPSCalorimeterHit extends BaseCalorimeterHit {
+
+    /**
+     * Fully qualified constructor that sets rawEnergy
+     *
+     * @param energy   Raw energy for this cell
+     * @param position Global Cartesian coordinate for this cell
+     * @param time     Time of energy deposition
+     * @param id       Cell ID
+     * @param type     Type
+     */
+    public HPSCalorimeterHit(double energy, double time, long id, int type) {
+        this.rawEnergy = energy;
+//        if (position != null) {
+//            this.positionVec = new BasicHep3Vector(position);
+//        } else {
+//            positionVec = null;
+//        }
+        this.time = time;
+        this.id = id;
+        this.type = type;
+    }
+
+    @Override
+    public IDetectorElement getDetectorElement() {
+        if (de == null) {
+//            findDetectorElementByPosition();
+            IDetectorElementContainer detectorElements = EcalConditions.getSubdetector().getDetectorElement().findDetectorElement(getIdentifier());
+            if (detectorElements.size() != 1) {
+                throw new RuntimeException("Expected exactly one DetectorElement matching ID " + getIdentifier() + ", got " + detectorElements.size());
+            } else {
+                de = detectorElements.get(0);
+            }
+        }
+        // setupDetectorElement();
+        return de;
+    }
+
+    @Override
+    public double[] getPosition() {
+        return getPositionVec().v();
+    }
+
+    @Override
+    public Hep3Vector getPositionVec() {
+        return this.getDetectorElement().getGeometry().getPosition();
+    }
+
+    static class TimeComparator implements Comparator<CalorimeterHit> {
+
+        @Override
+        public int compare(CalorimeterHit o1, CalorimeterHit o2) {
+            return Double.compare(o1.getTime(), o2.getTime());
+        }
+    }
+}

hps-java/src/main/java/org/lcsim/hps/recon/ecal
EcalCrystalFilter.java 1.6 -> 1.7
diff -u -r1.6 -r1.7
--- EcalCrystalFilter.java	8 Dec 2012 01:12:17 -0000	1.6
+++ EcalCrystalFilter.java	25 Feb 2013 22:39:24 -0000	1.7
@@ -589,7 +589,7 @@
                         }
                     }
                     if (ok) {
-                        IIdentifierHelper helper = HPSEcalConditions.getHelper();
+                        IIdentifierHelper helper = EcalConditions.getHelper();
                         IExpandedIdentifier expId = new ExpandedIdentifier(helper.getIdentifierDictionary().getNumberOfFields());
                         //expId.setValue(helper.getFieldIndex("system"), ecal.getSystemID());
                         expId.setValue(helper.getFieldIndex("ix"), x);
@@ -597,7 +597,7 @@
                         Long id = helper.pack(expId).getValue();
 
 
-                        System.out.printf("[%d,%d]\t%d\t%d\t%d\tTime:%f +- %f\tAmp:%f +- %f\n", x, y, HPSEcalConditions.getCrate(id), HPSEcalConditions.getSlot(id), HPSEcalConditions.getChannel(id), tPlots[x + 23][y + 5].mean(), tPlots[x + 23][y + 5].rms(), aPlots[x + 23][y + 5].mean(), aPlots[x + 23][y + 5].rms());
+                        System.out.printf("[%d,%d]\t%d\t%d\t%d\tTime:%f +- %f\tAmp:%f +- %f\n", x, y, EcalConditions.getCrate(id), EcalConditions.getSlot(id), EcalConditions.getChannel(id), tPlots[x + 23][y + 5].mean(), tPlots[x + 23][y + 5].rms(), aPlots[x + 23][y + 5].mean(), aPlots[x + 23][y + 5].rms());
 
                         pWriter.printf("%d %d\n", x, y);
                     }
@@ -618,8 +618,8 @@
             for (int crate = 1; crate < 3; crate++) {
                 for (short slot = 0; slot < 20; slot++) {
                     for (short ch = 0; ch < 16; ch++) {
-                        Long id = HPSEcalConditions.daqToPhysicalID(crate, slot, ch);
-                        IIdentifierHelper helper = HPSEcalConditions.getHelper();
+                        Long id = EcalConditions.daqToPhysicalID(crate, slot, ch);
+                        IIdentifierHelper helper = EcalConditions.getHelper();
                         if (id == null) {
                             continue;
                         }

hps-java/src/main/java/org/lcsim/hps/recon/ecal
FADCConverterDriver.java 1.3 -> 1.4
diff -u -r1.3 -r1.4
--- FADCConverterDriver.java	13 May 2012 21:39:24 -0000	1.3
+++ FADCConverterDriver.java	25 Feb 2013 22:39:24 -0000	1.4
@@ -10,7 +10,7 @@
 
 /**
  *
- * @version $Id: FADCConverterDriver.java,v 1.3 2012/05/13 21:39:24 meeg Exp $
+ * @version $Id: FADCConverterDriver.java,v 1.4 2013/02/25 22:39:24 meeg Exp $
  */
 public class FADCConverterDriver extends Driver {
 
@@ -73,7 +73,7 @@
                 short[] window = hit.getADCValues();
                 long id = hit.getCellID();
                 //do DAQ readout
-                double crystalThreshold = HPSEcalConditions.physicalToPedestal(id) + threshold;
+                double crystalThreshold = EcalConditions.physicalToPedestal(id) + threshold;
                 int adcSum = 0;
                 int pointerOffset = 0;
                 int numSamplesToRead = 0;

hps-java/src/main/java/org/lcsim/hps/recon/ecal
HPSEcalCluster.java 1.10 -> 1.11
diff -u -r1.10 -r1.11
--- HPSEcalCluster.java	8 Dec 2012 01:12:16 -0000	1.10
+++ HPSEcalCluster.java	25 Feb 2013 22:39:24 -0000	1.11
@@ -13,14 +13,14 @@
  * Cluster with position defined by seed hit (for 1-bit trigger)
  *
  * @author Sho Uemura <[log in to unmask]>
- * @version $Id: HPSEcalCluster.java,v 1.10 2012/12/08 01:12:16 meeg Exp $
+ * @version $Id: HPSEcalCluster.java,v 1.11 2013/02/25 22:39:24 meeg Exp $
  */
 public class HPSEcalCluster extends BasicCluster {
 
     private CalorimeterHit seedHit = null;
     private long cellID;
     
-    static final double eCriticalW = 800.0*HPSECalUtils.MeV/(74+1);
+    static final double eCriticalW = 800.0*ECalUtils.MeV/(74+1);
     static final double radLenW = 8.8; //mm
     double[] electronPosAtDepth = new double[3];
     private boolean needsElectronPosCalculation = true;
@@ -42,7 +42,7 @@
             if (hit == null) {
                 throw new RuntimeException("HPSEcalCluster has no hits");
             }
-            seedHit = new HPSRawCalorimeterHit(0.0, 0.0, cellID, hit.getType());
+            seedHit = new HPSCalorimeterHit(0.0, 0.0, cellID, hit.getType());
             seedHit.setMetaData(hit.getMetaData());
         }
         return seedHit;

hps-java/src/main/java/org/lcsim/hps/recon/ecal
HPSRawCalorimeterHit.java 1.8 -> 1.9
diff -u -r1.8 -r1.9
--- HPSRawCalorimeterHit.java	1 Oct 2012 21:22:54 -0000	1.8
+++ HPSRawCalorimeterHit.java	25 Feb 2013 22:39:24 -0000	1.9
@@ -1,72 +1,60 @@
 package org.lcsim.hps.recon.ecal;
 
-import hep.physics.vec.Hep3Vector;
 import java.util.Comparator;
-import org.lcsim.detector.IDetectorElement;
-import org.lcsim.detector.IDetectorElementContainer;
 import org.lcsim.event.CalorimeterHit;
-import org.lcsim.event.base.BaseCalorimeterHit;
+import org.lcsim.event.RawCalorimeterHit;
 
 /**
- * An implementation of CalorimeterHit, with a constructor that sets rawEnergy
- * for use in ECalReadout
  *
- * @author Sho Uemura
- * @version $Id: HPSRawCalorimeterHit.java,v 1.8 2012/10/01 21:22:54 phansson Exp $
+ * @author Sho Uemura <[log in to unmask]>
+ * @version $Id: HPSRawCalorimeterHit.java,v 1.9 2013/02/25 22:39:24 meeg Exp $
  */
-public class HPSRawCalorimeterHit extends BaseCalorimeterHit {
+public class HPSRawCalorimeterHit implements RawCalorimeterHit {
 
-    /**
-     * Fully qualified constructor that sets rawEnergy
-     *
-     * @param energy   Raw energy for this cell
-     * @param position Global Cartesian coordinate for this cell
-     * @param time     Time of energy deposition
-     * @param id       Cell ID
-     * @param type     Type
-     */
-    public HPSRawCalorimeterHit(double energy, double time, long id, int type) {
-        this.rawEnergy = energy;
-//        if (position != null) {
-//            this.positionVec = new BasicHep3Vector(position);
-//        } else {
-//            positionVec = null;
-//        }
-        this.time = time;
-        this.id = id;
-        this.type = type;
-    }
+	long cellID;
+	int amplitude;
+	int timeStamp;
+	int windowSize;
+	CalorimeterHit analogHit = null;
+
+	public HPSRawCalorimeterHit(long cellID, int amplitude, int timeStamp, int windowSize) {
+		this.cellID = cellID;
+		this.amplitude = amplitude;
+		this.timeStamp = timeStamp;
+		this.windowSize = windowSize;
+	}
 
     @Override
-    public IDetectorElement getDetectorElement() {
-        if (de == null) {
-//            findDetectorElementByPosition();
-            IDetectorElementContainer detectorElements = HPSEcalConditions.getSubdetector().getDetectorElement().findDetectorElement(getIdentifier());
-            if (detectorElements.size() != 1) {
-                throw new RuntimeException("Expected exactly one DetectorElement matching ID " + getIdentifier() + ", got " + detectorElements.size());
-            } else {
-                de = detectorElements.get(0);
-            }
-        }
-        // setupDetectorElement();
-        return de;
-    }
+	public long getCellID() {
+		return cellID;
+	}
 
     @Override
-    public double[] getPosition() {
-        return getPositionVec().v();
-    }
+	public int getAmplitude() {
+		return amplitude;
+	}
 
     @Override
-    public Hep3Vector getPositionVec() {
-        return this.getDetectorElement().getGeometry().getPosition();
-    }
-
-    static class TimeComparator implements Comparator<CalorimeterHit> {
-
-        @Override
-        public int compare(CalorimeterHit o1, CalorimeterHit o2) {
-            return Double.compare(o1.getTime(), o2.getTime());
-        }
-    }
-}
+	public int getTimeStamp() {
+		return timeStamp;
+	}
+
+	public int getWindowSize() {
+		return windowSize;
+	}
+
+	public CalorimeterHit getAnalogHit() {
+		return analogHit;
+	}
+
+	public void setAnalogHit(CalorimeterHit analogHit) {
+		this.analogHit = analogHit;
+	}
+
+	public static class TimeComparator implements Comparator<RawCalorimeterHit> {
+
+		public int compare(RawCalorimeterHit o1, RawCalorimeterHit o2) {
+			return o1.getTimeStamp() - o2.getTimeStamp();
+		}
+	}
+}
\ No newline at end of file

hps-java/src/main/java/org/lcsim/hps/recon/ecal
HPSEcal1BitClusterer.java removed after 1.20
diff -N HPSEcal1BitClusterer.java
--- HPSEcal1BitClusterer.java	8 Dec 2012 01:12:17 -0000	1.20
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,380 +0,0 @@
-package org.lcsim.hps.recon.ecal;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.lcsim.event.CalorimeterHit;
-import org.lcsim.event.Cluster;
-import org.lcsim.event.EventHeader;
-import org.lcsim.geometry.Detector;
-import org.lcsim.geometry.IDDecoder;
-import org.lcsim.geometry.subdetector.HPSEcal3.NeighborMap;
-import org.lcsim.geometry.subdetector.HPSEcal3;
-import org.lcsim.util.Driver;
-import org.lcsim.util.lcio.LCIOConstants;
-
-/**
- * Creates clusters from CalorimeterHits in the HPSEcal detector.
- *
- * The clustering algorithm is from JLab Hall B 6 GeV DVCS Trigger Design doc.
- *
- * @author Jeremy McCormick <[log in to unmask]>
- * @author Tim Nelson <[log in to unmask]>
- * @author Sho Uemura <[log in to unmask]>
- * @version $Id: HPSEcal1BitClusterer.java,v 1.20 2012/12/08 01:12:17 meeg Exp $
- */
-public class HPSEcal1BitClusterer extends Driver {
-
-    HPSEcal3 ecal;
-    IDDecoder dec;
-    String ecalName;
-    String ecalCollectionName;
-    String vetoCollectionName;
-    String clusterCollectionName = "EcalClusters";
-    //set bounds for a range of crystals to turn off in the clusterer
-    int xMin = 0;
-    int xMax = 0;
-    Map<Long, Integer> hitCounts = null;
-    Map<Long, CalorimeterHit> hitMap = null;
-    // Threshold hit count for cluster. Cluster must have more than this many hits.
-    int clusterThreshold = 5;
-    // Map of crystals to their neighbors.
-    NeighborMap neighborMap = null;
-
-    public HPSEcal1BitClusterer() {
-    }
-
-    public void setClusterCollectionName(String clusterCollectionName) {
-        this.clusterCollectionName = clusterCollectionName;
-    }
-
-    public void setEcalCollectionName(String ecalCollectionName) {
-        this.ecalCollectionName = ecalCollectionName;
-    }
-
-    public void setVetoCollectionName(String vetoCollectionName) {
-        this.vetoCollectionName = vetoCollectionName;
-    }
-
-    public void setxMax(int xMax) {
-        this.xMax = xMax;
-    }
-
-    public void setxMin(int xMin) {
-        this.xMin = xMin;
-    }
-
-    public void setClusterThreshold(int clusterThreshold) {
-        this.clusterThreshold = clusterThreshold;
-    }
-
-    public void setEcalName(String ecalName) {
-        this.ecalName = ecalName;
-    }
-
-    @Override
-    public void startOfData() {
-        if (ecalCollectionName == null) {
-            throw new RuntimeException("The parameter ecalCollectionName was not set!");
-        }
-
-        if (ecalName == null) {
-            throw new RuntimeException("The parameter ecalName was not set!");
-        }
-    }
-
-    @Override
-    public void detectorChanged(Detector detector) {
-        // Get the Subdetector.
-        ecal = (HPSEcal3) detector.getSubdetector(ecalName);
-
-        // Get the decoder for the ECal IDs.
-        dec = ecal.getIDDecoder();
-
-        // Cache ref to neighbor map.
-        neighborMap = ecal.getNeighborMap();
-
-        //System.out.println(ecal.getName());
-        //System.out.println("  nx="+ecal.nx());
-        //System.out.println("  ny="+ecal.ny());
-        //System.out.println("  beamgap="+ecal.beamGap());
-        //System.out.println("  dface="+ecal.distanceToFace());
-
-        //System.out.println(neighborMap.toString());
-    }
-
-    @Override
-    public void process(EventHeader event) {
-        //System.out.println(this.getClass().getCanonicalName() + " - process");
-
-        // Get the list of raw ECal hits.
-        List<CalorimeterHit> hits = event.get(CalorimeterHit.class, ecalCollectionName);
-        if (hits == null) {
-            throw new RuntimeException("Event is missing ECal raw hits collection!");
-        }
-        List<CalorimeterHit> vetoHits = null;
-
-        // Get the list of raw ECal hits.
-        if (vetoCollectionName != null) {
-            vetoHits = event.get(CalorimeterHit.class, vetoCollectionName);
-            if (vetoHits == null) {
-                throw new RuntimeException("Event is missing ECal veto hits collection!");
-            }
-        }
-
-        countHits(hits, vetoHits);
-
-        // Put Cluster collection into event.
-        int flag = 1 << LCIOConstants.CLBIT_HITS;
-        event.put(clusterCollectionName, createClusters(), Cluster.class, flag);
-    }
-
-    public void countHits(List<CalorimeterHit> hits, List<CalorimeterHit> vetoHits) {
-        // Hit map.
-        hitMap = new HashMap<Long, CalorimeterHit>();
-        HashMap<Long, CalorimeterHit> vetoMap = new HashMap<Long, CalorimeterHit>();
-
-        if (vetoHits != null) {
-            for (CalorimeterHit hit : vetoHits) {
-                vetoMap.put(hit.getCellID(), hit);
-            }
-        }
-
-        hitCounts = new HashMap<Long, Integer>();
-        // Loop over ECal hits to count hit towers
-        for (CalorimeterHit hit : hits) {
-            if (vetoMap.get(hit.getCellID()) != null) {
-                continue;
-            }
-
-            int ix = hit.getIdentifierFieldValue("ix");
-            if (ix >= xMin && ix <= xMax) {
-                continue;
-            }
-
-            // Make a hit map for quick lookup by ID.
-            hitMap.put(hit.getCellID(), hit);
-
-            // Get neighbor crystal IDs.
-            Set<Long> neighbors = neighborMap.get(hit.getCellID());
-
-            if (neighbors == null) {
-                throw new RuntimeException("Oops!  Set of neighbors is null!");
-            }
-
-            Integer hitCount = hitCounts.get(hit.getCellID());
-            if (hitCount == null) {
-                hitCounts.put(hit.getCellID(), 1);
-            } else {
-                hitCounts.put(hit.getCellID(), hitCount + 1);
-            }
-
-            // Loop over neighbors to make hit list for cluster.
-            for (Long neighborId : neighbors) {
-                hitCount = hitCounts.get(neighborId);
-                if (hitCount == null) {
-                    hitCounts.put(neighborId, 1);
-                } else {
-                    hitCounts.put(neighborId, hitCount + 1);
-                }
-            }
-        }
-    }
-
-    public List<Cluster> createClusters() {
-        // New Cluster list to be added to event.
-        List<Cluster> clusters = new ArrayList<Cluster>();
-
-        //for each crystal with a nonzero hit count, test for cluster
-        for (Long possibleCluster : hitCounts.keySet()) {
-            //System.out.printf("%d, %d hits\n",possibleCluster,hitCounts.get(possibleCluster));
-            if (hitCounts.get(possibleCluster) <= clusterThreshold) {
-                continue;
-            }
-
-            // Get neighbor crystal IDs.
-            Set<Long> neighbors = neighborMap.get(possibleCluster);
-
-            if (neighbors == null) {
-                throw new RuntimeException("Oops!  Set of neighbors is null!");
-            }
-
-            //Apply peak detector scheme.
-            // Set the ID.
-            dec.setID(possibleCluster);
-            // Get ID field values.
-            int x1 = dec.getValue("ix");
-            int y1 = dec.getValue("iy");
-            Integer hitCount = hitCounts.get(possibleCluster);
-
-            //System.out.printf("Possible cluster: x: %d, y: %d, hits: %d\n",x1,y1,hitCount);
-            boolean isCluster = true;
-            for (Long neighborId : neighbors) {
-                // Set the ID.
-                dec.setID(neighborId);
-                Integer neighborHitCount = hitCounts.get(neighborId);
-                if (neighborHitCount == null) {
-                    continue;
-                }
-                // Get ID field values.
-                int x2 = dec.getValue("ix");
-                int y2 = dec.getValue("iy");
-                if (y1 > 0) {
-                    if (x1 > 0) {
-                        //quadrant 1
-                        if (x1 == 1) {
-                            //special case: left edge of quadrant
-                            if (x1 > x2 && y1 < y2) {
-                                if (hitCount > neighborHitCount) {
-                                    continue;
-                                }
-                            } else if (x1 > x2) {
-                                if (hitCount >= neighborHitCount) {
-                                    continue;
-                                }
-                            } else if (x1 < x2) {
-                                if (hitCount > neighborHitCount) {
-                                    continue;
-                                }
-                            } else if (y1 < y2) {
-                                if (hitCount >= neighborHitCount) {
-                                    continue;
-                                }
-                            } else {
-                                if (hitCount > neighborHitCount) {
-                                    continue;
-                                }
-                            }
-                        } else {
-                            if (x1 > x2) {
-                                if (hitCount >= neighborHitCount) {
-                                    continue;
-                                }
-                            } else if (x1 < x2) {
-                                if (hitCount > neighborHitCount) {
-                                    continue;
-                                }
-                            } else if (y1 < y2) {
-                                if (hitCount >= neighborHitCount) {
-                                    continue;
-                                }
-                            } else {
-                                if (hitCount > neighborHitCount) {
-                                    continue;
-                                }
-                            }
-                        }
-                    } else {
-                        //quadrant 2
-                        if (y1 > y2) {
-                            if (hitCount >= neighborHitCount) {
-                                continue;
-                            }
-                        } else if (y1 < y2) {
-                            if (hitCount > neighborHitCount) {
-                                continue;
-                            }
-                        } else if (x1 > x2) {
-                            if (hitCount >= neighborHitCount) {
-                                continue;
-                            }
-                        } else {
-                            if (hitCount > neighborHitCount) {
-                                continue;
-                            }
-                        }
-                    }
-                } else {
-                    if (x1 < 0) {
-                        //quadrant 3
-                        if (x1 == 1) {
-                            //special case: left edge of quadrant
-                            if (x1 < x2 && y1 > y2) {
-                                if (hitCount > neighborHitCount) {
-                                    continue;
-                                }
-                            } else if (x1 < x2) {
-                                if (hitCount >= neighborHitCount) {
-                                    continue;
-                                }
-                            } else if (x1 > x2) {
-                                if (hitCount > neighborHitCount) {
-                                    continue;
-                                }
-                            } else if (y1 > y2) {
-                                if (hitCount >= neighborHitCount) {
-                                    continue;
-                                }
-                            } else {
-                                if (hitCount > neighborHitCount) {
-                                    continue;
-                                }
-                            }
-                        } else {
-                            if (x1 < x2) {
-                                if (hitCount >= neighborHitCount) {
-                                    continue;
-                                }
-                            } else if (x1 > x2) {
-                                if (hitCount > neighborHitCount) {
-                                    continue;
-                                }
-                            } else if (y1 > y2) {
-                                if (hitCount >= neighborHitCount) {
-                                    continue;
-                                }
-                            } else {
-                                if (hitCount > neighborHitCount) {
-                                    continue;
-                                }
-                            }
-                        }
-                    } else {
-                        //quadrant 4
-                        if (y1 < y2) {
-                            if (hitCount >= neighborHitCount) {
-                                continue;
-                            }
-                        } else if (y1 > y2) {
-                            if (hitCount > neighborHitCount) {
-                                continue;
-                            }
-                        } else if (x1 < x2) {
-                            if (hitCount >= neighborHitCount) {
-                                continue;
-                            }
-                        } else {
-                            if (hitCount > neighborHitCount) {
-                                continue;
-                            }
-                        }
-                    }
-                }
-                isCluster = false;
-                break;
-            }
-
-            if (isCluster) {
-                //System.out.printf("Cluster: x: %d, y: %d, side:%d, hits: %d\n",x1,y1,side1,hitCount);
-                HPSEcalCluster cluster = new HPSEcalCluster(possibleCluster);
-                CalorimeterHit hit = hitMap.get(possibleCluster);
-                if (hit != null /*&& hit.getRawEnergy() > hitEMin && hit.getRawEnergy() < hitEMax*/) {
-                    cluster.addHit(hit);
-                }
-
-                for (Long neighborId : neighbors) {
-                    // Find the neighbor hit in the event if it exists.
-                    hit = hitMap.get(neighborId);
-                    if (hit != null /*&& hit.getRawEnergy() > hitEMin && hit.getRawEnergy() < hitEMax*/) {
-                        cluster.addHit(hit);
-                    }
-                }
-                clusters.add(cluster);
-            }
-        }
-        return clusters;
-    }
-}

hps-java/src/main/java/org/lcsim/hps/recon/ecal
HPSEcalSimpleReadoutDriver.java removed after 1.10
diff -N HPSEcalSimpleReadoutDriver.java
--- HPSEcalSimpleReadoutDriver.java	8 Dec 2012 01:12:17 -0000	1.10
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,58 +0,0 @@
-package org.lcsim.hps.recon.ecal;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.lcsim.event.CalorimeterHit;
-
-/**
- * Performs readout of ECal hits.
- * No time evolution - this just integrates all hits in a cycle.
- *
- * @author Sho Uemura <[log in to unmask]>
- * @version $Id: HPSEcalSimpleReadoutDriver.java,v 1.10 2012/12/08 01:12:17 meeg Exp $
- */
-public class HPSEcalSimpleReadoutDriver extends HPSEcalReadoutDriver<HPSRawCalorimeterHit> {
-    //buffer for deposited energy
-    Map<Long, Double> eDepMap = null;
-
-	public HPSEcalSimpleReadoutDriver() {
-		hitClass = HPSRawCalorimeterHit.class;
-	}
-
-    @Override
-    protected void readHits(List<HPSRawCalorimeterHit> hits) {
-        for (Long cellID : eDepMap.keySet()) {
-//            int ix = dec.getValue("ix");
-//            int iy = dec.getValue("iy");
-//            //temporary hack to disable crystals and flip X coordinate
-//            int side = dec.getValue("side");
-//            if (iy == 1 && ix*side >= -10 && ix*side <= -2)
-//                continue;
-            if (eDepMap.get(cellID) > threshold)
-                hits.add(new HPSRawCalorimeterHit(eDepMap.get(cellID), readoutTime(), cellID, hitType));
-        }
-        //reset hit integration
-        eDepMap = new HashMap<Long, Double>();
-    }
-
-    @Override
-    protected void putHits(List<CalorimeterHit> hits) {
-        //fill the readout buffers
-        for (CalorimeterHit hit : hits) {
-            Double eDep = eDepMap.get(hit.getCellID());
-            if (eDep == null) {
-                eDepMap.put(hit.getCellID(), hit.getRawEnergy());
-            } else {
-                eDepMap.put(hit.getCellID(), eDep + hit.getRawEnergy());
-            }
-        }
-    }
-
-    @Override
-    protected void initReadout() {
-        //initialize buffers
-        eDepMap = new HashMap<Long, Double>();
-    }
-}

hps-java/src/main/java/org/lcsim/hps/recon/ecal
HPSEcalCTPClusterer.java removed after 1.8
diff -N HPSEcalCTPClusterer.java
--- HPSEcalCTPClusterer.java	20 Nov 2012 23:25:09 -0000	1.8
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,308 +0,0 @@
-package org.lcsim.hps.recon.ecal;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.PriorityQueue;
-import java.util.Set;
-
-import org.lcsim.event.CalorimeterHit;
-//import org.lcsim.event.Cluster;
-import org.lcsim.event.EventHeader;
-import org.lcsim.geometry.Detector;
-import org.lcsim.geometry.IDDecoder;
-import org.lcsim.geometry.subdetector.HPSEcal3.NeighborMap;
-import org.lcsim.geometry.subdetector.HPSEcal3;
-import org.lcsim.hps.recon.ecal.HPSEcalCTPClusterer.TimeComparator;
-import org.lcsim.util.Driver;
-import org.lcsim.util.lcio.LCIOConstants;
-
-/**
- * Creates clusters from CalorimeterHits in the HPSEcal detector.
- *
- * The clustering algorithm is from JLab Hall B 6 GeV DVCS Trigger Design doc.
- *
- * @author Jeremy McCormick <[log in to unmask]>
- * @author Tim Nelson <[log in to unmask]>
- * @author Sho Uemura <[log in to unmask]>
- * @version $Id: HPSEcalCTPClusterer.java,v 1.8 2012/11/20 23:25:09 meeg Exp $
- */
-public class HPSEcalCTPClusterer extends Driver {
-
-    HPSEcal3 ecal;
-    IDDecoder dec;
-    String ecalName;
-    String ecalCollectionName;
-    String clusterCollectionName = "EcalClusters";
-    Set<Long> clusterCenters = null;
-    Map<Long, Double> hitSums = null;
-    Map<Long, CalorimeterHit> hitMap = null;
-    // Map of crystals to their neighbors.
-    NeighborMap neighborMap = null;
-    double clusterWindow = -1;
-    double addEMin = 0;
-
-    public HPSEcalCTPClusterer() {
-    }
-
-    public void setAddEMin(double addEMin) {
-        this.addEMin = addEMin;
-    }
-
-    public void setClusterWindow(double clusterWindow) {
-        this.clusterWindow = clusterWindow;
-    }
-
-    public void setClusterCollectionName(String clusterCollectionName) {
-        this.clusterCollectionName = clusterCollectionName;
-    }
-
-    public void setEcalCollectionName(String ecalCollectionName) {
-        this.ecalCollectionName = ecalCollectionName;
-    }
-
-    public void setEcalName(String ecalName) {
-        this.ecalName = ecalName;
-    }
-
-    @Override
-    public void startOfData() {
-        if (ecalCollectionName == null) {
-            throw new RuntimeException("The parameter ecalCollectionName was not set!");
-        }
-
-        if (ecalName == null) {
-            throw new RuntimeException("The parameter ecalName was not set!");
-        }
-    }
-
-    @Override
-    public void detectorChanged(Detector detector) {
-        // Get the Subdetector.
-        ecal = (HPSEcal3) detector.getSubdetector(ecalName);
-
-        // Get the decoder for the ECal IDs.
-        dec = ecal.getIDDecoder();
-
-        // Cache ref to neighbor map.
-        neighborMap = ecal.getNeighborMap();
-
-        clusterCenters = new HashSet<Long>();
-        //Make set of valid cluster centers.
-        for (Long cellID : neighborMap.keySet()) {
-            boolean isValidCenter = true;
-            Set<Long> neighbors = neighborMap.get(cellID);
-            for (Long neighborID : neighbors) {
-                Set<Long> neighborneighbors = new HashSet<Long>();
-                neighborneighbors.addAll(neighborMap.get(neighborID));
-                neighborneighbors.add(neighborID);
-
-                if (neighborneighbors.containsAll(neighbors)) {
-                    isValidCenter = false;
-                    break;
-                }
-            }
-            if (isValidCenter) {
-                clusterCenters.add(cellID);
-            }
-        }
-
-        //System.out.println(ecal.getName());
-        //System.out.println("  nx="+ecal.nx());
-        //System.out.println("  ny="+ecal.ny());
-        //System.out.println("  beamgap="+ecal.beamGap());
-        //System.out.println("  dface="+ecal.distanceToFace());
-
-        //System.out.println(neighborMap.toString());
-    }
-
-    @Override
-    public void process(EventHeader event) {
-        //System.out.println(this.getClass().getCanonicalName() + " - process");
-
-        if (event.hasCollection(CalorimeterHit.class, ecalCollectionName)) {
-            // Get the list of raw ECal hits.
-            List<CalorimeterHit> hits = event.get(CalorimeterHit.class, ecalCollectionName);
-
-            List<HPSEcalCluster> clusters;
-
-            if (clusterWindow >= 0) {
-                PriorityQueue<CalorimeterHit> futureHits = new PriorityQueue<CalorimeterHit>(10, new TimeComparator());
-                PriorityQueue<CalorimeterHit> pastHits = new PriorityQueue<CalorimeterHit>(10, new TimeComparator());
-                clusters = new ArrayList<HPSEcalCluster>();
-
-                for (CalorimeterHit hit : hits) {
-                    if (hit.getRawEnergy() > addEMin) {
-                        futureHits.add(hit);
-                    }
-                }
-
-                while (!futureHits.isEmpty()) {
-                    CalorimeterHit nextHit = futureHits.poll();
-                    pastHits.add(nextHit);
-                    while (!futureHits.isEmpty() && futureHits.peek().getTime() == nextHit.getTime()) {
-                        pastHits.add(futureHits.poll());
-                    }
-                    while (pastHits.peek().getTime() < nextHit.getTime() - clusterWindow) {
-                        pastHits.poll();
-                    }
-                    sumHits(pastHits);
-                    clusters.addAll(createClusters());
-                }
-            } else {
-                sumHits(hits);
-                clusters = createClusters();
-            }
-
-            // Put Cluster collection into event.
-            int flag = 1 << LCIOConstants.CLBIT_HITS;
-            event.put(clusterCollectionName, clusters, HPSEcalCluster.class, flag);
-        }
-    }
-
-    public void sumHits(Collection<CalorimeterHit> hits) {
-        // Hit map.
-        hitMap = new HashMap<Long, CalorimeterHit>();
-
-        hitSums = new HashMap<Long, Double>();
-        // Loop over ECal hits to compute energy sums
-        for (CalorimeterHit hit : hits) {
-//                System.out.format("hit: %f\n",hit.getRawEnergy());
-            // Make a hit map for quick lookup by ID.
-            hitMap.put(hit.getCellID(), hit);
-
-            // Get neighbor crystal IDs. 
-            Set<Long> neighbors = neighborMap.get(hit.getCellID());
-
-            if (neighbors == null) {
-                throw new RuntimeException("Oops!  Set of neighbors is null!");
-            }
-
-            Double hitSum;
-
-            if (clusterCenters.contains(hit.getCellID())) {
-                hitSum = hitSums.get(hit.getCellID());
-                if (hitSum == null) {
-                    hitSums.put(hit.getCellID(), hit.getRawEnergy());
-                } else {
-                    hitSums.put(hit.getCellID(), hitSum + hit.getRawEnergy());
-                }
-            }
-
-            // Loop over neighbors to make hit list for cluster.
-            for (Long neighborId : neighbors) {
-                if (!clusterCenters.contains(neighborId)) {
-                    continue;
-                }
-                hitSum = hitSums.get(neighborId);
-                if (hitSum == null) {
-                    hitSums.put(neighborId, hit.getRawEnergy());
-                } else {
-                    hitSums.put(neighborId, hitSum + hit.getRawEnergy());
-                }
-            }
-        }
-    }
-
-    public List<HPSEcalCluster> createClusters() {
-//		boolean printClusters;
-        // New Cluster list to be added to event.
-        List<HPSEcalCluster> clusters = new ArrayList<HPSEcalCluster>();
-        //System.out.println("New event");
-        //for each crystal with a nonzero hit count, test for cluster
-        for (Long possibleCluster : hitSums.keySet()) {
-            Double thisSum = hitSums.get(possibleCluster);
-
-            // Get neighbor crystal IDs.
-            Set<Long> neighbors = neighborMap.get(possibleCluster);
-
-            if (neighbors == null) {
-                throw new RuntimeException("Oops!  Set of neighbors is null!");
-            }
-
-            //Apply peak detector scheme.
-            // Set the ID.
-            dec.setID(possibleCluster);
-            int x1 = dec.getValue("ix");
-            int y1 = dec.getValue("iy");
-//			System.out.printf("\nThis cluster: E= %f, ID=%d, x=%d, y=%d, neighbors=%d\n", thisSum, possibleCluster, x1, y1, neighbors.size());
-            boolean isCluster = true;
-            for (Long neighborId : neighbors) {
-                // Set the ID.
-                dec.setID(neighborId);
-                int x2 = dec.getValue("ix");
-                int y2 = dec.getValue("iy");
-
-                Double neighborSum = hitSums.get(neighborId);
-                if (neighborSum == null) {
-                    continue;
-                }
-
-//				System.out.printf("Neighbor cluster: E= %f, ID=%d, x=%d, y=%d, neighbors=%d\n", neighborSum, neighborId, x2, y2, neighborMap.get(neighborId).size());
-
-                if (neighborSum > thisSum) {
-//					System.out.println("Reject cluster: sum cut");
-                    isCluster = false;
-                    break;
-                } //								else if (false) { //ctp
-                //								else if (neighborSum.equals(thisSum) && neighborId > possibleCluster) { //id
-                //								else if (neighborSum.equals(thisSum) && (x1<x2 || (x1==x2 && Math.abs(y1)>Math.abs(y2)))) { //right_in
-                //								else if (neighborSum.equals(thisSum) && (x1<x2 || (x1==x2 && Math.abs(y1)<Math.abs(y2)))) { //right_out
-                //								else if (neighborSum.equals(thisSum) && (x1>x2 || (x1==x2 && Math.abs(y1)>Math.abs(y2)))) { //left_in
-                else if (neighborSum.equals(thisSum) && (x1 > x2 || (x1 == x2 && Math.abs(y1) < Math.abs(y2)))) { //left_out
-//								else if (neighborSum.equals(thisSum) && (x1<x2 || (x1==x2 && y1<y2))) { //right_up
-//								else if (neighborSum.equals(thisSum) && (x1>x2 || (x1==x2 && y1<y2))) { //left_up
-//					System.out.println("Reject cluster: tie-breaker cut");
-                    isCluster = false;
-                    break;
-                }
-            }
-
-            if (isCluster) {
-                List<CalorimeterHit> hits = new ArrayList<CalorimeterHit>();
-                double clusterTime = Double.NEGATIVE_INFINITY;
-                CalorimeterHit hit = hitMap.get(possibleCluster);
-                if (hit != null) {
-                    hits.add(hit);
-                    if (hit.getTime() > clusterTime) {
-                        clusterTime = hit.getTime();
-                    }
-                }
-                for (Long neighborId : neighbors) {
-                    hit = hitMap.get(neighborId);
-                    if (hit != null) {
-                        hits.add(hit);
-                        if (hit.getTime() > clusterTime) {
-                            clusterTime = hit.getTime();
-                        }
-                    }
-                }
-                CalorimeterHit seedHit = new HPSRawCalorimeterHit(0.0, clusterTime, possibleCluster, hits.get(0).getType());
-                seedHit.setMetaData(hits.get(0).getMetaData());
-                HPSEcalCluster cluster = new HPSEcalCluster(seedHit);
-                for (CalorimeterHit clusterHit : hits) {
-                    cluster.addHit(clusterHit);
-                }
-                clusters.add(cluster);
-//                System.out.println(cluster.getEnergy());
-            }
-        }
-        return clusters;
-    }
-
-    static class TimeComparator implements Comparator<CalorimeterHit> {
-
-        @Override
-        public int compare(CalorimeterHit o1, CalorimeterHit o2) {
-            if (o1.getTime() == o2.getTime()) {
-                return 0;
-            } else {
-                return (o1.getTime() > o2.getTime()) ? 1 : -1;
-            }
-        }
-    }
-}

hps-java/src/main/java/org/lcsim/hps/recon/ecal
HPSEcalFADCReadoutDriver.java removed after 1.22
diff -N HPSEcalFADCReadoutDriver.java
--- HPSEcalFADCReadoutDriver.java	8 Dec 2012 01:12:17 -0000	1.22
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,466 +0,0 @@
-package org.lcsim.hps.recon.ecal;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import java.util.PriorityQueue;
-import java.util.Set;
-import org.lcsim.event.CalorimeterHit;
-import org.lcsim.event.EventHeader;
-import org.lcsim.event.RawCalorimeterHit;
-import org.lcsim.event.RawTrackerHit;
-import org.lcsim.event.base.BaseRawCalorimeterHit;
-import org.lcsim.event.base.BaseRawTrackerHit;
-import org.lcsim.geometry.Detector;
-import org.lcsim.geometry.Subdetector;
-import org.lcsim.geometry.subdetector.HPSEcal3;
-import org.lcsim.hps.evio.EventConstants;
-import org.lcsim.hps.util.ClockSingleton;
-import org.lcsim.hps.util.RingBuffer;
-import org.lcsim.util.lcio.LCIOConstants;
-
-/**
- * Performs readout of ECal hits.
- * Simulates time evolution of preamp output pulse.
- *
- * @author Sho Uemura <[log in to unmask]>
- * @version $Id: HPSEcalFADCReadoutDriver.java,v 1.22 2012/12/08 01:12:17 meeg Exp $
- */
-public class HPSEcalFADCReadoutDriver extends HPSEcalReadoutDriver<RawCalorimeterHit> {
-
-    String ecalName = "Ecal";
-    Subdetector ecal;
-    //buffer for deposited energy
-    private Map<Long, RingBuffer> eDepMap = null;
-    //ADC pipeline for readout
-    private Map<Long, FADCPipeline> pipelineMap = null;
-    //buffer for window sums
-    private Map<Long, Double> sumMap = null;
-    //buffer for timestamps
-    private Map<Long, Integer> timeMap = null;
-    //queue for hits to be output to clusterer
-    private PriorityQueue<HPSFADCCalorimeterHit> outputQueue = null;
-    //length of ring buffer (in readout cycles)
-    private int bufferLength = 100;
-    //length of readout pipeline (in readout cycles)
-    private int pipelineLength = 2000;
-    //shaper time constant in ns; negative values generate square pulses of the given width
-    private double tp = 14.0;
-    //delay (number of readout periods) between start of summing window and output of hit to clusterer
-    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<HPSFADCCalorimeterHit> buffer = new LinkedList<HPSFADCCalorimeterHit>();
-    //number of readout periods for which a given hit stays in the buffer
-    private int coincidenceWindow = 2;
-    private double pulseIntegral;
-    //output collection name for hits read out from trigger
-    private String ecalReadoutCollectionName = "EcalReadoutHits";
-    private int mode = EventConstants.ECAL_PULSE_INTEGRAL_MODE;
-    private int readoutThreshold = (int) threshold;
-    private int triggerThreshold = (int) threshold;
-    //amplitude ADC counts/GeV
-//    private double gain = 0.5*1000 * 80.0 / 60;
-    private double scaleFactor = 128;
-    private double fixedGain = -1;
-    private boolean constantTriggerWindow = false;
-
-    public HPSEcalFADCReadoutDriver() {
-        flags = 0;
-        flags += 1 << LCIOConstants.RCHBIT_TIME; //store cell ID
-        hitClass = HPSFADCCalorimeterHit.class;
-//        converter = new HPSEcalConverter(null);
-    }
-
-    public void setConstantTriggerWindow(boolean constantTriggerWindow) {
-        this.constantTriggerWindow = constantTriggerWindow;
-    }
-
-    public void setFixedGain(double fixedGain) {
-        this.fixedGain = fixedGain;
-    }
-
-    public void setEcalName(String ecalName) {
-        this.ecalName = ecalName;
-    }
-
-    public void setReadoutThreshold(int readoutThreshold) {
-        this.readoutThreshold = readoutThreshold;
-    }
-
-    public void setScaleFactor(double scaleFactor) {
-        this.scaleFactor = scaleFactor;
-    }
-
-    public void setTriggerThreshold(int triggerThreshold) {
-        this.triggerThreshold = triggerThreshold;
-    }
-
-    public void setEcalReadoutCollectionName(String ecalReadoutCollectionName) {
-        this.ecalReadoutCollectionName = ecalReadoutCollectionName;
-    }
-
-    public void setNumSamplesAfter(int numSamplesAfter) {
-        this.numSamplesAfter = numSamplesAfter;
-    }
-
-    public void setNumSamplesBefore(int numSamplesBefore) {
-        this.numSamplesBefore = numSamplesBefore;
-    }
-
-    public void setReadoutLatency(int readoutLatency) {
-        this.readoutLatency = readoutLatency;
-    }
-
-    public void setReadoutWindow(int readoutWindow) {
-        this.readoutWindow = readoutWindow;
-    }
-
-    public void setCoincidenceWindow(int coincidenceWindow) {
-        this.coincidenceWindow = coincidenceWindow;
-    }
-
-    public void setTp(double tp) {
-        this.tp = tp;
-    }
-
-    public void setDelay0(int delay0) {
-        this.delay0 = delay0;
-    }
-
-    public void setBufferLength(int bufferLength) {
-        this.bufferLength = bufferLength;
-        resetFADCBuffers();
-    }
-
-    public void setPipelineLength(int pipelineLength) {
-        this.pipelineLength = pipelineLength;
-        resetFADCBuffers();
-    }
-
-    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) {
-            throw new IllegalArgumentException("invalid mode " + mode);
-        }
-    }
-
-    @Override
-    protected void readHits(List<RawCalorimeterHit> hits) {
-
-        for (Long cellID : eDepMap.keySet()) {
-            RingBuffer eDepBuffer = eDepMap.get(cellID);
-
-            FADCPipeline pipeline = pipelineMap.get(cellID);
-            pipeline.step();
-            double pedestal = HPSEcalConditions.physicalToPedestal(cellID);
-            //normalization constant from cal gain (MeV/integral bit) to amplitude gain (amplitude bit/GeV)
-            double gain;
-            if (fixedGain > 0) {
-                gain = 1.0 / (fixedGain * HPSECalUtils.MeV * pulseIntegral);
-            } else {
-                gain = 1.0 / (HPSEcalConditions.physicalToGain(cellID) * HPSECalUtils.MeV * pulseIntegral);
-            }
-
-            double currentValue = gain * eDepBuffer.currentValue();
-            pipeline.writeValue((int) Math.round(pedestal + currentValue));
-
-            Double sum = sumMap.get(cellID);
-            if (sum == null && currentValue > triggerThreshold) {
-                timeMap.put(cellID, readoutCounter);
-                if (constantTriggerWindow) {
-                    double sumBefore = 0;
-                    for (int i = 0; i < numSamplesBefore; i++) {
-                        if (debug) {
-                            System.out.format("trigger %d, %d: %d\n", cellID, i, pipeline.getValue(numSamplesBefore - i - 1));
-                        }
-                        sumBefore += pipeline.getValue(numSamplesBefore - i - 1);
-                    }
-                    sumMap.put(cellID, sumBefore);
-                } else {
-                    sumMap.put(cellID, currentValue);
-                }
-            }
-            if (sum != null) {
-                if (constantTriggerWindow) {
-                    if (timeMap.get(cellID) + numSamplesAfter >= readoutCounter) {
-                        if (debug) {
-                            System.out.format("trigger %d, %d: %d\n", cellID, readoutCounter - timeMap.get(cellID) + numSamplesBefore - 1, pipeline.getValue(0));
-                        }
-                        sumMap.put(cellID, sum + pipeline.getValue(0));
-                    } else if (timeMap.get(cellID) + delay0 <= readoutCounter) {
-//                        System.out.printf("sum = %f\n", sum);
-                        outputQueue.add(new HPSFADCCalorimeterHit(cellID,
-                                (int) Math.round(sum / scaleFactor),
-                                64 * timeMap.get(cellID),
-                                readoutCounter - timeMap.get(cellID) + 1));
-                        sumMap.remove(cellID);
-                    }
-                } else {
-                    if (currentValue < triggerThreshold || timeMap.get(cellID) + delay0 == readoutCounter) {
-//					System.out.printf("sum = %f\n",sum);
-                        outputQueue.add(new HPSFADCCalorimeterHit(cellID,
-                                (int) Math.round((sum + currentValue) / scaleFactor),
-                                64 * timeMap.get(cellID),
-                                readoutCounter - timeMap.get(cellID) + 1));
-                        sumMap.remove(cellID);
-                    } else {
-                        sumMap.put(cellID, sum + currentValue);
-                    }
-                }
-            }
-            eDepBuffer.step();
-        }
-        while (outputQueue.peek() != null && outputQueue.peek().getTimeStamp() / 64 <= readoutCounter - delay0) {
-            if (outputQueue.peek().getTimeStamp() / 64 < readoutCounter - delay0) {
-                System.out.println("Stale hit in output queue");
-                outputQueue.poll();
-            } else {
-                buffer.add(outputQueue.poll());
-            }
-        }
-        while (!buffer.isEmpty() && buffer.peek().getTimeStamp() / 64 <= readoutCounter - delay0 - coincidenceWindow) {
-            buffer.remove();
-        }
-        if (debug) {
-            for (RawCalorimeterHit hit : buffer) {
-                System.out.format("new hit: energy %d\n", hit.getAmplitude());
-            }
-        }
-
-        hits.addAll(buffer);
-    }
-
-    @Override
-    public void startOfData() {
-        super.startOfData();
-        if (ecalReadoutCollectionName == null) {
-            throw new RuntimeException("The parameter ecalReadoutCollectionName was not set!");
-        }
-    }
-
-    @Override
-    protected void processTrigger(EventHeader event) {
-        switch (mode) {
-            case EventConstants.ECAL_WINDOW_MODE:
-                if (debug) {
-                    System.out.println("Reading out ECal in window mode");
-                }
-                event.put(ecalReadoutCollectionName, readWindow(), RawTrackerHit.class, 0, ecalReadoutName);
-                break;
-            case EventConstants.ECAL_PULSE_MODE:
-                if (debug) {
-                    System.out.println("Reading out ECal in pulse mode");
-                }
-                event.put(ecalReadoutCollectionName, readPulses(), RawTrackerHit.class, 0, ecalReadoutName);
-                break;
-            case EventConstants.ECAL_PULSE_INTEGRAL_MODE:
-                if (debug) {
-                    System.out.println("Reading out ECal in integral mode");
-                }
-                event.put(ecalReadoutCollectionName, readIntegrals(), RawCalorimeterHit.class, 0, ecalReadoutName);
-                break;
-        }
-    }
-
-    protected short[] getWindow(long cellID) {
-        FADCPipeline pipeline = pipelineMap.get(cellID);
-        short[] adcValues = new short[readoutWindow];
-        for (int i = 0; i < readoutWindow; i++) {
-            adcValues[i] = (short) pipeline.getValue(readoutLatency - i - 1);
-//			if (adcValues[i] != 0) {
-//				System.out.println("getWindow: " + adcValues[i] + " at i = " + i);
-//			}
-        }
-        return adcValues;
-    }
-
-    protected List<RawTrackerHit> readWindow() {
-//		System.out.println("Reading FADC data");
-        List<RawTrackerHit> hits = new ArrayList<RawTrackerHit>();
-        for (Long cellID : pipelineMap.keySet()) {
-            short[] adcValues = getWindow(cellID);
-            hits.add(new BaseRawTrackerHit(cellID, 0, adcValues));
-        }
-        return hits;
-    }
-
-    protected List<RawTrackerHit> readPulses() {
-//		System.out.println("Reading FADC data");
-        List<RawTrackerHit> hits = new ArrayList<RawTrackerHit>();
-        for (Long cellID : pipelineMap.keySet()) {
-            short[] window = getWindow(cellID);
-            short[] adcValues = null;
-            int pointerOffset = 0;
-            int numSamplesToRead = 0;
-            int thresholdCrossing = 0;
-            for (int i = 0; i < readoutWindow; i++) {
-                if (numSamplesToRead != 0) {
-                    adcValues[adcValues.length - numSamplesToRead] = window[i - pointerOffset];
-                    numSamplesToRead--;
-                    if (numSamplesToRead == 0) {
-                        hits.add(new BaseRawTrackerHit(cellID, thresholdCrossing, adcValues));
-                    }
-                } else if ((i == 0 || window[i - 1] <= HPSEcalConditions.physicalToPedestal(cellID) + readoutThreshold) && window[i] > HPSEcalConditions.physicalToPedestal(cellID) + readoutThreshold) {
-                    thresholdCrossing = i;
-                    pointerOffset = Math.min(numSamplesBefore, i);
-                    numSamplesToRead = pointerOffset + Math.min(numSamplesAfter, readoutWindow - i - pointerOffset - 1);
-                    adcValues = new short[numSamplesToRead];
-                }
-            }
-        }
-        return hits;
-    }
-
-    protected List<RawCalorimeterHit> readIntegrals() {
-//		System.out.println("Reading FADC data");
-        List<RawCalorimeterHit> hits = new ArrayList<RawCalorimeterHit>();
-        for (Long cellID : pipelineMap.keySet()) {
-            short[] window = getWindow(cellID);
-            int adcSum = 0;
-            int pointerOffset = 0;
-            int numSamplesToRead = 0;
-            int thresholdCrossing = 0;
-            if (window != null) {
-                for (int i = 0; i < readoutWindow; i++) {
-                    if (numSamplesToRead != 0) {
-                        if (debug) {
-                            System.out.format("readout %d, %d: %d\n", cellID, numSamplesBefore + numSamplesAfter - numSamplesToRead, window[i - pointerOffset]);
-                        }
-                        adcSum += window[i - pointerOffset];
-                        numSamplesToRead--;
-                        if (numSamplesToRead == 0) {
-                            hits.add(new BaseRawCalorimeterHit(cellID, adcSum, 64 * thresholdCrossing));
-                        }
-                    } else if ((i == 0 || window[i - 1] <= HPSEcalConditions.physicalToPedestal(cellID) + readoutThreshold) && window[i] > HPSEcalConditions.physicalToPedestal(cellID) + readoutThreshold) {
-                        thresholdCrossing = i;
-                        pointerOffset = Math.min(numSamplesBefore, i);
-                        numSamplesToRead = pointerOffset + Math.min(numSamplesAfter, readoutWindow - i - pointerOffset - 1);
-                        adcSum = 0;
-                    }
-                }
-            }
-        }
-        return hits;
-    }
-
-    @Override
-    protected void putHits(List<CalorimeterHit> hits) {
-        //fill the readout buffers
-        for (CalorimeterHit hit : hits) {
-            RingBuffer eDepBuffer = eDepMap.get(hit.getCellID());
-            for (int i = 0; i < bufferLength; i++) {
-                eDepBuffer.addToCell(i, hit.getRawEnergy() * pulseAmplitude((i + 1) * readoutPeriod + readoutTime() - (ClockSingleton.getTime() + hit.getTime())));
-            }
-        }
-    }
-
-    @Override
-    protected void initReadout() {
-        //initialize buffers
-        sumMap = new HashMap<Long, Double>();
-        timeMap = new HashMap<Long, Integer>();
-        outputQueue = new PriorityQueue(20, new HPSFADCCalorimeterHit.TimeComparator());
-        pulseIntegral = tp * Math.E / readoutPeriod;
-        resetFADCBuffers();
-    }
-
-    @Override
-    public void detectorChanged(Detector detector) {
-        // Get the Subdetector.
-        ecal = detector.getSubdetector(ecalName);
-        resetFADCBuffers();
-    }
-
-    private boolean resetFADCBuffers() {
-        if (ecal == null) {
-            return false;
-        }
-        eDepMap = new HashMap<Long, RingBuffer>();
-        pipelineMap = new HashMap<Long, FADCPipeline>();
-        Set<Long> cells = ((HPSEcal3) ecal).getNeighborMap().keySet();
-        for (Long cellID : cells) {
-            eDepMap.put(cellID, new RingBuffer(bufferLength));
-            pipelineMap.put(cellID, new FADCPipeline(pipelineLength, (int) Math.round(HPSEcalConditions.physicalToPedestal(cellID))));
-        }
-        return true;
-    }
-
-    private double pulseAmplitude(double time) {
-        if (time <= 0.0) {
-            return 0.0;
-        }
-        if (tp > 0.0) {
-            return (time / tp) * Math.exp(1.0 - time / tp);
-        } else {
-            if (time < -tp) {
-                return 1.0;
-            } else {
-                return 0.0;
-            }
-        }
-    }
-
-    private class FADCPipeline {
-
-        private int[] array;
-        private int size;
-        private int ptr;
-
-        public FADCPipeline(int size) {
-            this.size = size;
-            array = new int[size]; //initialized to 0
-            ptr = 0;
-        }
-
-        //construct pipeline with a nonzero initial value
-        public FADCPipeline(int size, int init) {
-            this.size = size;
-            array = new int[size];
-            for (int i = 0; i < size; i++) {
-                array[i] = init;
-            }
-            ptr = 0;
-        }
-
-        /**
-         * Write value to current cell
-         */
-        public void writeValue(int val) {
-            array[ptr] = val;
-        }
-
-        /**
-         * Write value to current cell
-         */
-        public void step() {
-            ptr++;
-            if (ptr == size) {
-                ptr = 0;
-            }
-        }
-
-        //return content of specified cell (pos=0 for current cell)
-        public int getValue(int pos) {
-            if (pos >= size || pos < 0) {
-                throw new ArrayIndexOutOfBoundsException();
-            }
-            return array[((ptr - pos) % size + size) % size];
-        }
-    }
-}
\ No newline at end of file

hps-java/src/main/java/org/lcsim/hps/recon/ecal
TestRunRateAnalysis.java removed after 1.4
diff -N TestRunRateAnalysis.java
--- TestRunRateAnalysis.java	8 Dec 2012 01:12:17 -0000	1.4
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,169 +0,0 @@
-package org.lcsim.hps.recon.ecal;
-
-import hep.aida.IHistogram1D;
-import hep.aida.IHistogram2D;
-import java.util.List;
-import org.lcsim.event.CalorimeterHit;
-import org.lcsim.event.EventHeader;
-import org.lcsim.event.MCParticle;
-import org.lcsim.event.util.ParticleTypeClassifier;
-import org.lcsim.util.Driver;
-import org.lcsim.util.aida.AIDA;
-
-/**
- * Reads clusters and makes trigger decision using opposite quadrant criterion.
- * Prints triggers to file if file path specified.
- *
- * @author Sho Uemura <[log in to unmask]>
- * @version $Id: TestRunRateAnalysis.java,v 1.4 2012/12/08 01:12:17 meeg Exp $
- */
-public class TestRunRateAnalysis extends Driver {
-
-    AIDA aida = AIDA.defaultInstance();
-    IHistogram2D eClusterVsP, photonEClusterVsP, electronEClusterVsP, positronEClusterVsP;
-    IHistogram2D eVsP, photonEVsP, electronEVsP, positronEVsP;
-    IHistogram1D eClusterOverP, photonEClusterOverP, electronEClusterOverP, positronEClusterOverP;
-    IHistogram1D eOverP, photonEOverP, electronEOverP, positronEOverP;
-    private String clusterCollectionName;
-    private String hitCollectionName = "EcalHits";
-    int nTriggers;
-    private double clusterEnergyLow = 10;    //
-    int deadtimelessTriggerCount;
-    int[] triggersY = new int[5];
-
-    public TestRunRateAnalysis() {
-    }
-
-    @Override
-    public void startOfData() {
-        deadtimelessTriggerCount = 0;
-
-        eClusterVsP = aida.histogram2D("All Cluster E vs. Pz", 100, 0.0, 2000.0, 100, 0.0, 2000.0);
-        photonEClusterVsP = aida.histogram2D("Photon Cluster E vs. Pz", 100, 0.0, 2000.0, 100, 0.0, 2000.0);
-        electronEClusterVsP = aida.histogram2D("Electron Cluster E vs. Pz", 100, 0.0, 2000.0, 100, 0.0, 2000.0);
-        positronEClusterVsP = aida.histogram2D("Positron Cluster E vs. Pz", 100, 0.0, 2000.0, 100, 0.0, 2000.0);
-
-        eClusterOverP = aida.histogram1D("Cluster E over Pz, Pz > 0.6", 100, 0.0, 2.0);
-        photonEClusterOverP = aida.histogram1D("Photon Cluster E over Pz, Pz > 0.6", 100, 0.0, 2.0);
-        electronEClusterOverP = aida.histogram1D("Electron Cluster E over Pz, Pz > 0.6", 100, 0.0, 2.0);
-        positronEClusterOverP = aida.histogram1D("Positron Cluster E over Pz, Pz > 0.6", 100, 0.0, 2.0);
-
-        eVsP = aida.histogram2D("All Edep vs. Pz", 100, 0.0, 2000.0, 100, 0.0, 2000.0);
-        photonEVsP = aida.histogram2D("Photon Edep vs. Pz", 100, 0.0, 2000.0, 100, 0.0, 2000.0);
-        electronEVsP = aida.histogram2D("Electron Edep vs. Pz", 100, 0.0, 2000.0, 100, 0.0, 2000.0);
-        positronEVsP = aida.histogram2D("Positron Edep vs. Pz", 100, 0.0, 2000.0, 100, 0.0, 2000.0);
-
-        eOverP = aida.histogram1D("All Edep over Pz, Pz > 0.6", 100, 0.0, 2.0);
-        photonEOverP = aida.histogram1D("Photon Edep over Pz, Pz > 0.6", 100, 0.0, 2.0);
-        electronEOverP = aida.histogram1D("Electron Edep over Pz, Pz > 0.6", 100, 0.0, 2.0);
-        positronEOverP = aida.histogram1D("Positron Edep over Pz, Pz > 0.6", 100, 0.0, 2.0);
-    }
-
-    public void setClusterEnergyLow(double clusterEnergyLow) {
-        this.clusterEnergyLow = clusterEnergyLow;
-    }
-
-    public void setClusterCollectionName(String clusterCollectionName) {
-        this.clusterCollectionName = clusterCollectionName;
-    }
-
-    @Override
-    public void process(EventHeader event) {
-        //System.out.println(this.getClass().getCanonicalName() + " - process");
-
-        // MCParticles
-        List<MCParticle> mcparticles = event.get(MCParticle.class).get(0);
-
-        if (mcparticles.isEmpty()) {
-            return;
-        }
-//        if (mcparticles.size() != 1) {
-//            throw new RuntimeException("expected exactly 1 MCParticle");
-//        }
-//        MCParticle particle = mcparticles.get(0);
-
-        // Get the list of raw ECal hits.
-        List<HPSEcalCluster> clusters = event.get(HPSEcalCluster.class, clusterCollectionName);
-        if (clusters == null) {
-            throw new RuntimeException("Event is missing ECal clusters collection!");
-        }
-
-        boolean trigger = false;
-
-        for (HPSEcalCluster cluster : clusters) {
-            if (cluster.getEnergy() > clusterEnergyLow && cluster.getSeedHit().getIdentifierFieldValue("ix") < 0) {
-//            if (cluster.getEnergy() > clusterEnergyLow && cluster.getSeedHit().getIdentifierFieldValue("iy")>0 && cluster.getSeedHit().getIdentifierFieldValue("ix")<0) {
-                triggersY[Math.abs(cluster.getSeedHit().getIdentifierFieldValue("iy")) - 1]++;
-                if (Math.abs(cluster.getSeedHit().getIdentifierFieldValue("iy")) > 1) {
-                    trigger = true;
-                }
-            }
-            if (cluster.getSeedHit().getIdentifierFieldValue("ix") < 0 && Math.abs(cluster.getSeedHit().getIdentifierFieldValue("iy")) > 1) {
-                for (MCParticle particle : mcparticles) {
-                    if (ParticleTypeClassifier.isElectron(particle.getPDGID())) {
-                        electronEClusterVsP.fill(1000.0 * particle.getPZ(), 1000.0 * cluster.getEnergy());
-                        if (particle.getPZ() > 0.6) {
-                            electronEClusterOverP.fill(cluster.getEnergy() / particle.getPZ());
-                        }
-                    } else if (ParticleTypeClassifier.isPositron(particle.getPDGID())) {
-                        positronEClusterVsP.fill(1000.0 * particle.getPZ(), 1000.0 * cluster.getEnergy());
-                        if (particle.getPZ() > 0.6) {
-                            positronEClusterOverP.fill(cluster.getEnergy() / particle.getPZ());
-                        }
-                    } else if (ParticleTypeClassifier.isPhoton(particle.getPDGID())) {
-                        photonEClusterVsP.fill(1000.0 * particle.getPZ(), 1000.0 * cluster.getEnergy());
-                        if (particle.getPZ() > 0.6) {
-                            photonEClusterOverP.fill(cluster.getEnergy() / particle.getPZ());
-                        }
-                    }
-                    eClusterVsP.fill(1000.0 * particle.getPZ(), 1000.0 * cluster.getEnergy());
-                    if (particle.getPZ() > 0.6) {
-                        eClusterOverP.fill(cluster.getEnergy() / particle.getPZ());
-                    }
-                }
-            }
-        }
-        if (trigger) {
-            deadtimelessTriggerCount++;
-        }
-
-        List<CalorimeterHit> hits = event.get(CalorimeterHit.class, hitCollectionName);
-        if (hits == null) {
-            throw new RuntimeException("Event is missing ECal hits collection!");
-        }
-        double totalE = 0;
-        for (CalorimeterHit hit : hits) {
-            totalE += hit.getRawEnergy();
-        }
-
-        for (MCParticle particle : mcparticles) {
-            if (ParticleTypeClassifier.isElectron(particle.getPDGID())) {
-                electronEVsP.fill(1000.0 * particle.getPZ(), 1000.0 * totalE);
-                if (particle.getPZ() > 0.6) {
-                    electronEOverP.fill(totalE / particle.getPZ());
-                }
-            } else if (ParticleTypeClassifier.isPositron(particle.getPDGID())) {
-                positronEVsP.fill(1000.0 * particle.getPZ(), 1000.0 * totalE);
-                if (particle.getPZ() > 0.6) {
-                    positronEOverP.fill(totalE / particle.getPZ());
-                }
-            } else if (ParticleTypeClassifier.isPhoton(particle.getPDGID())) {
-                photonEVsP.fill(1000.0 * particle.getPZ(), 1000.0 * totalE);
-                if (particle.getPZ() > 0.6) {
-                    photonEOverP.fill(totalE / particle.getPZ());
-                }
-            }
-            eVsP.fill(1000.0 * particle.getPZ(), 1000.0 * totalE);
-            if (particle.getPZ() > 0.6) {
-                eOverP.fill(totalE / particle.getPZ());
-            }
-        }
-    }
-
-    @Override
-    public void endOfData() {
-        System.out.printf("Trigger count without dead time: %d\n", deadtimelessTriggerCount);
-        System.out.format("Triggers vs. Y: %d\t%d\t%d\t%d\t%d, total %d\n", triggersY[0], triggersY[1], triggersY[2], triggersY[3], triggersY[4], deadtimelessTriggerCount);
-        super.endOfData();
-    }
-}
\ No newline at end of file

hps-java/src/main/java/org/lcsim/hps/recon/ecal
HPSEcalReadoutDriver.java removed after 1.21
diff -N HPSEcalReadoutDriver.java
--- HPSEcalReadoutDriver.java	6 Nov 2012 02:06:14 -0000	1.21
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,152 +0,0 @@
-package org.lcsim.hps.recon.ecal;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.lcsim.event.CalorimeterHit;
-import org.lcsim.event.EventHeader;
-import org.lcsim.hps.util.ClockSingleton;
-import org.lcsim.util.Driver;
-import org.lcsim.util.lcio.LCIOConstants;
-
-/**
- * Performs readout of ECal hits.
- *
- * @author Sho Uemura <[log in to unmask]>
- * @version $Id: HPSEcalReadoutDriver.java,v 1.21 2012/11/06 02:06:14 meeg Exp $
- */
-public abstract class HPSEcalReadoutDriver<T> extends Driver {
-
-    String ecalCollectionName;
-    String ecalRawCollectionName = "EcalRawHits";
-    String ecalReadoutName = "EcalHits";
-    Class hitClass;
-    //hit type as in org.lcsim.recon.calorimetry.CalorimeterHitType
-    int hitType = 0;
-    //number of bunches in readout cycle
-    int readoutCycle = 1;
-    //minimum readout value to write a hit
-    double threshold = 0.0;
-    //LCIO flags
-    int flags = 0;
-    //readout period in ns
-    double readoutPeriod = 2.0;
-    //readout period time offset in ns
-    double readoutOffset = 0.0;
-    //readout period counter
-    int readoutCounter;
-    public static boolean readoutBit = false;
-    protected boolean debug = false;
-
-    public HPSEcalReadoutDriver() {
-        flags += 1 << LCIOConstants.CHBIT_LONG; //store position
-        flags += 1 << LCIOConstants.RCHBIT_ID1; //store cell ID
-
-    }
-
-    public void setDebug(boolean debug) {
-        this.debug = debug;
-    }
-
-    public void setEcalReadoutName(String ecalReadoutName) {
-        this.ecalReadoutName = ecalReadoutName;
-    }
-
-    public void setEcalRawCollectionName(String ecalRawCollectionName) {
-        this.ecalRawCollectionName = ecalRawCollectionName;
-    }
-
-    public void setEcalCollectionName(String ecalCollectionName) {
-        this.ecalCollectionName = ecalCollectionName;
-    }
-
-    public void setReadoutCycle(int readoutCycle) {
-        this.readoutCycle = readoutCycle;
-        if (readoutCycle > 0) {
-            this.readoutPeriod = readoutCycle * ClockSingleton.getDt();
-        }
-    }
-
-    public void setReadoutOffset(double readoutOffset) {
-        this.readoutOffset = readoutOffset;
-    }
-
-    public void setReadoutPeriod(double readoutPeriod) {
-        this.readoutPeriod = readoutPeriod;
-        this.readoutCycle = -1;
-    }
-
-    public void setThreshold(double threshold) {
-        this.threshold = threshold;
-    }
-
-    @Override
-    public void startOfData() {
-        if (ecalCollectionName == null) {
-            throw new RuntimeException("The parameter ecalCollectionName was not set!");
-        }
-
-        readoutCounter = 0;
-
-        initReadout();
-    }
-
-    @Override
-    public void process(EventHeader event) {
-        //System.out.println(this.getClass().getCanonicalName() + " - process");
-        // Get the list of ECal hits.        
-        if (event.hasCollection(CalorimeterHit.class, ecalCollectionName)) {
-            List<CalorimeterHit> hits = event.get(CalorimeterHit.class, ecalCollectionName);
-
-            //write hits into buffers
-            putHits(hits);
-        }
-
-        ArrayList<T> newHits = null;
-
-        //if at the end of a readout cycle, write buffers to hits
-        if (readoutCycle > 0) {
-            if ((ClockSingleton.getClock() + 1) % readoutCycle == 0) {
-                if (newHits == null) {
-                    newHits = new ArrayList<T>();
-                }
-                readHits(newHits);
-                readoutCounter++;
-            }
-        } else {
-            while (ClockSingleton.getTime() - readoutTime() + ClockSingleton.getDt() >= readoutPeriod) {
-                if (newHits == null) {
-                    newHits = new ArrayList<T>();
-                }
-                readHits(newHits);
-                readoutCounter++;
-            }
-        }
-
-        if (newHits != null) {
-            event.put(ecalRawCollectionName, newHits, hitClass, flags, ecalReadoutName);
-        }
-
-        if (readoutBit) {
-            processTrigger(event);
-            readoutBit = false;
-        }
-    }
-
-    protected double readoutTime() {
-        return readoutCounter * readoutPeriod + readoutOffset;
-    }
-
-    //read analog signal out of buffers and make hits; reset buffers
-    protected abstract void readHits(List<T> hits);
-
-    //add deposited energy to buffers
-    //must be run every event, even if the list is empty
-    protected abstract void putHits(List<CalorimeterHit> hits);
-
-    protected void processTrigger(EventHeader event) {
-    }
-
-    //initialize buffers
-    protected abstract void initReadout();
-}
\ No newline at end of file

hps-java/src/main/java/org/lcsim/hps/recon/ecal
TestRunTriggerDriver.java removed after 1.9
diff -N TestRunTriggerDriver.java
--- TestRunTriggerDriver.java	26 Sep 2012 23:31:10 -0000	1.9
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,100 +0,0 @@
-package org.lcsim.hps.recon.ecal;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.lcsim.event.EventHeader;
-import org.lcsim.hps.evio.TriggerData;
-
-/**
- * Reads clusters and makes trigger decision using opposite quadrant criterion.
- * Prints triggers to file if file path specified.
- *
- * @author Omar Moreno <[log in to unmask]>
- * @author Sho Uemura <[log in to unmask]>
- * @version $Id: TestRunTriggerDriver.java,v 1.9 2012/09/26 23:31:10 meeg Exp $
- */
-public class TestRunTriggerDriver extends HPSTriggerDriver {
-
-    boolean triggerThisCycle = false;
-    int cycleCounter = 0;
-    private double clusterEnergyLow = 10;    //
-    int deadtimelessTriggerCount;
-    private int topBits = 0, botBits = 0;
-
-    public TestRunTriggerDriver() {
-    }
-
-    @Override
-    protected void makeTriggerData(EventHeader event, String collectionName) {
-        int[] trigArray = new int[8];
-        trigArray[TriggerData.TOP_TRIG] = topBits;
-        trigArray[TriggerData.BOT_TRIG] = botBits;
-        trigArray[TriggerData.AND_TRIG] = topBits & botBits;
-        trigArray[TriggerData.OR_TRIG] = topBits | botBits;
-        TriggerData tData = new TriggerData(trigArray);
-        List<TriggerData> triggerList = new ArrayList<TriggerData>();
-        triggerList.add(tData);
-        event.put(collectionName, triggerList, TriggerData.class, 0);
-    }
-
-    @Override
-    public void startOfData() {
-        super.startOfData();
-
-        deadtimelessTriggerCount = 0;
-    }
-
-    @Override
-    protected boolean triggerDecision(EventHeader event) {
-        if (event.hasCollection(HPSEcalCluster.class, clusterCollectionName)) {
-            cycleCounter++;
-            if (testTrigger(event.get(HPSEcalCluster.class, clusterCollectionName))) {
-                triggerThisCycle = true;
-            }
-        }
-
-        if (cycleCounter % 4 == 0) {
-            boolean trigger = triggerThisCycle;
-            triggerThisCycle = false;
-            return trigger;
-        } else {
-            return false;
-        }
-    }
-
-    @Override
-    public boolean testTrigger(List<HPSEcalCluster> clusters) {
-        boolean trigger = false;
-
-        topBits <<= 1;
-        botBits <<= 1;
-        for (HPSEcalCluster cluster : clusters) {
-            if (cluster.getEnergy() > clusterEnergyLow) {
-                if (cluster.getPosition()[1] > 0) {
-                    topBits |= 1;
-                } else {
-                    botBits |= 1;
-                }
-                trigger = true;
-            }
-        }
-        if (trigger) {
-            deadtimelessTriggerCount++;
-        }
-        return trigger;
-    }
-
-    @Override
-    public void endOfData() {
-        if (outputStream != null) {
-            outputStream.printf("Number of cluster pairs after successive trigger conditions:\n");
-            outputStream.printf("Trigger count without dead time: %d\n", deadtimelessTriggerCount);
-            outputStream.printf("Trigger count: %d\n", numTriggers);
-            outputStream.close();
-        }
-        System.out.printf("Number of cluster pairs after successive trigger conditions:\n");
-        System.out.printf("Trigger count without dead time: %d\n", deadtimelessTriggerCount);
-        System.out.printf("Trigger count: %d\n", numTriggers);
-        super.endOfData();
-    }
-}
\ No newline at end of file

hps-java/src/main/java/org/lcsim/hps/recon/ecal
HPSEcalConverterDriver.java removed after 1.6
diff -N HPSEcalConverterDriver.java
--- HPSEcalConverterDriver.java	21 Nov 2012 00:29:53 -0000	1.6
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,86 +0,0 @@
-package org.lcsim.hps.recon.ecal;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.lcsim.event.CalorimeterHit;
-import org.lcsim.event.EventHeader;
-import org.lcsim.event.RawCalorimeterHit;
-import org.lcsim.util.Driver;
-import org.lcsim.util.lcio.LCIOConstants;
-
-/**
- *
- * @author Sho Uemura <[log in to unmask]>
- * @version $Id: HPSEcalConverterDriver.java,v 1.6 2012/11/21 00:29:53 meeg Exp $
- */
-public class HPSEcalConverterDriver extends Driver {
-
-    String rawCollectionName;
-    String ecalReadoutName = "EcalHits";
-    String ecalCollectionName = "EcalCorrectedHits";
-    int flags;
-    double scale = 1.0;
-//    double pedestal = 0.0;
-    double period = 4.0;
-    double dt = 0.0;
-
-    public HPSEcalConverterDriver() {
-        flags = 0;
-        flags += 1 << LCIOConstants.CHBIT_LONG; //store position
-        flags += 1 << LCIOConstants.RCHBIT_ID1; //store cell ID
-    }
-
-//    public void setPedestal(double pedestal) {
-//        this.pedestal = pedestal;
-//    }
-    public void setScale(double scale) {
-        this.scale = scale;
-    }
-
-    public void setEcalCollectionName(String ecalCollectionName) {
-        this.ecalCollectionName = ecalCollectionName;
-    }
-
-    public void setRawCollectionName(String rawCollectionName) {
-        this.rawCollectionName = rawCollectionName;
-    }
-
-    @Override
-    public void startOfData() {
-        if (ecalCollectionName == null) {
-            throw new RuntimeException("The parameter ecalCollectionName was not set!");
-        }
-    }
-
-    @Override
-    public void process(EventHeader event) {
-        if (event.hasCollection(HPSFADCCalorimeterHit.class, rawCollectionName)) {
-            // Get the list of ECal hits.
-            List<HPSFADCCalorimeterHit> hits = event.get(HPSFADCCalorimeterHit.class, rawCollectionName);
-
-            ArrayList<CalorimeterHit> newHits = new ArrayList<CalorimeterHit>();
-
-            for (HPSFADCCalorimeterHit hit : hits) {
-                newHits.add(HitDtoA(hit));
-            }
-
-            event.put(ecalCollectionName, newHits, CalorimeterHit.class, flags, ecalReadoutName);
-        }
-    }
-
-//    private int AtoD(double amplitude, long cellID) {
-//        return (int) Math.round(amplitude / scale);
-//    }
-
-    private double DtoA(int amplitude, long cellID) {
-        return scale * amplitude;
-    }
-
-    private CalorimeterHit HitDtoA(RawCalorimeterHit hit) {
-        return new HPSRawCalorimeterHit(DtoA(hit.getAmplitude(), hit.getCellID()), period * hit.getTimeStamp() + dt, hit.getCellID(), 0);
-    }
-
-//    private RawCalorimeterHit HitAtoD(CalorimeterHit hit) {
-//        return new HPSFADCCalorimeterHit(hit.getCellID(), AtoD(hit.getRawEnergy(), hit.getCellID()), (int) Math.round(hit.getTime() / period), 0);
-//    }
-}

hps-java/src/main/java/org/lcsim/hps/recon/ecal
HPSEcalRawConverter.java removed after 1.14
diff -N HPSEcalRawConverter.java
--- HPSEcalRawConverter.java	8 Dec 2012 01:12:17 -0000	1.14
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,101 +0,0 @@
-package org.lcsim.hps.recon.ecal;
-
-import org.lcsim.event.CalorimeterHit;
-import org.lcsim.event.RawCalorimeterHit;
-import org.lcsim.event.RawTrackerHit;
-import org.lcsim.event.base.BaseRawCalorimeterHit;
-
-/**
- *
- * @version $Id: HPSEcalRawConverterDriver.java,v 1.2 2012/05/03 00:17:54
- * phansson Exp $
- */
-public class HPSEcalRawConverter {
-
-    private boolean debug = false;
-    private boolean constantGain = false;
-    private double gain;
-
-    public HPSEcalRawConverter() {
-    }
-
-    public void setGain(double gain) {
-        constantGain = true;
-        this.gain = gain;
-    }
-
-    public short sumADC(RawTrackerHit hit) {
-        //Sum all pedestal subtracted ADC values 
-        //return scale * (amplitude + 0.5) + pedestal;
-        if (debug) {
-            System.out.println("Summing ADC for hit: " + hit.toString());
-        }
-        double pedestal = HPSEcalConditions.physicalToPedestal(hit.getCellID());
-        short sum = 0;
-        short samples[] = hit.getADCValues();
-        for (int isample = 0; isample < samples.length; ++isample) {
-            sum += (samples[isample] - pedestal);
-            if (debug) {
-                System.out.println("Sample " + isample + " " + samples[isample] + " pedestal " + pedestal + " (" + sum + ")");
-            }
-        }
-        return sum;
-    }
-
-    public CalorimeterHit HitDtoA(RawTrackerHit hit) {
-        double time = hit.getTime();
-        long id = hit.getCellID();
-        double rawEnergy;
-        if (constantGain) {
-            rawEnergy = gain * sumADC(hit) * HPSECalUtils.MeV;
-        } else {
-            rawEnergy = HPSEcalConditions.physicalToGain(id) * sumADC(hit) * HPSECalUtils.MeV;
-        }
-//        double[] pos = hit.getDetectorElement().getGeometry().getPosition().v();
-        CalorimeterHit h = new HPSRawCalorimeterHit(rawEnergy + 0.0000001, time, id, 0);
-        //+0.0000001 is a horrible hack to ensure rawEnergy!=BaseCalorimeterHit.UNSET_CORRECTED_ENERGY
-        return h;
-    }
-
-    public CalorimeterHit HitDtoA(RawCalorimeterHit hit, int window) {
-        if (hit.getTimeStamp() % 64 != 0) {
-            System.out.println("unexpected timestamp " + hit.getTimeStamp());
-        }
-        double time = hit.getTimeStamp() / 16.0;
-        long id = hit.getCellID();
-        double rawEnergy;
-        if (constantGain) {
-            rawEnergy = gain * (hit.getAmplitude() - window * HPSEcalConditions.physicalToPedestal(id)) * HPSECalUtils.MeV;
-        } else {
-            rawEnergy = HPSEcalConditions.physicalToGain(id) * (hit.getAmplitude() - window * HPSEcalConditions.physicalToPedestal(id)) * HPSECalUtils.MeV;
-        }
-        CalorimeterHit h = new HPSRawCalorimeterHit(rawEnergy + 0.0000001, time, id, 0);
-        //+0.0000001 is a horrible hack to ensure rawEnergy!=BaseCalorimeterHit.UNSET_CORRECTED_ENERGY
-        return h;
-    }
-
-    public RawCalorimeterHit HitAtoD(CalorimeterHit hit, int window) {
-        int time = (int) (hit.getTime() * 16.0);
-        long id = hit.getCellID();
-        int amplitude;
-        if (constantGain) {
-            amplitude = (int) Math.round((hit.getRawEnergy() / HPSECalUtils.MeV) / gain + window * HPSEcalConditions.physicalToPedestal(id));
-        } else {
-            amplitude = (int) Math.round((hit.getRawEnergy() / HPSECalUtils.MeV) / HPSEcalConditions.physicalToGain(id) + window * HPSEcalConditions.physicalToPedestal(id));
-        }
-        RawCalorimeterHit h = new BaseRawCalorimeterHit(id, amplitude, time);
-        return h;
-    }
-
-    public static CalorimeterHit HitDtoA(RawCalorimeterHit hit, int window, double g) {
-        if (hit.getTimeStamp() % 64 != 0) {
-            System.out.println("unexpected timestamp " + hit.getTimeStamp());
-        }
-        double time = hit.getTimeStamp() / 16.0;
-        long id = hit.getCellID();
-        double rawEnergy = g * (hit.getAmplitude() - window * HPSEcalConditions.physicalToPedestal(id)) * HPSECalUtils.MeV;
-        CalorimeterHit h = new HPSRawCalorimeterHit(rawEnergy + 0.0000001, time, id, 0);
-        //+0.0000001 is a horrible hack to ensure rawEnergy!=BaseCalorimeterHit.UNSET_CORRECTED_ENERGY
-        return h;
-    }
-}

hps-java/src/main/java/org/lcsim/hps/recon/ecal
HPSEcalWindowDiscriminatorReadoutDriver.java removed after 1.4
diff -N HPSEcalWindowDiscriminatorReadoutDriver.java
--- HPSEcalWindowDiscriminatorReadoutDriver.java	8 Dec 2012 01:12:17 -0000	1.4
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,92 +0,0 @@
-package org.lcsim.hps.recon.ecal;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.lcsim.event.CalorimeterHit;
-import org.lcsim.hps.util.ClockSingleton;
-import org.lcsim.hps.util.RingBuffer;
-
-/**
- * Performs readout of ECal hits.
- * Simulates time evolution of preamp output pulse and leading-edge discriminator.
- * Uses lower and upper thresholds, with upper discriminator acting as a veto.
- *
- *
- * @author Sho Uemura <[log in to unmask]>
- * @version $Id: HPSEcalWindowDiscriminatorReadoutDriver.java,v 1.4 2012/12/08 01:12:17 meeg Exp $
- */
-public class HPSEcalWindowDiscriminatorReadoutDriver extends HPSEcalDiscriminatorReadoutDriver {
-    //last time we saw a rising edge
-
-    Map<Long, Double> lowTimeMap = null;
-    //last time we saw a rising edge
-    Map<Long, Double> highTimeMap = null;
-    double highThreshold = 10.0 * HPSECalUtils.GeV;
-
-    public HPSEcalWindowDiscriminatorReadoutDriver() {
-    }
-
-    public void setHighThreshold(double highThreshold) {
-        this.highThreshold = highThreshold;
-    }
-
-    @Override
-    protected void readHits(List<HPSRawCalorimeterHit> hits) {
-        for (Long cellID : lowTimeMap.keySet()) {
-            //if there's an output pulse, make a hit
-            if (ClockSingleton.getTime() - lowTimeMap.get(cellID) < outputWidth) {
-                if (highTimeMap.containsKey(cellID) && ClockSingleton.getTime() - highTimeMap.get(cellID) < outputWidth) {
-                    continue;
-                }
-                hits.add(new HPSRawCalorimeterHit(outputEnergy, readoutTime(), cellID, hitType));
-            }
-        }
-    }
-
-    @Override
-    protected void putHits(List<CalorimeterHit> hits) {
-        //fill the readout buffers
-        for (CalorimeterHit hit : hits) {
-//            int ix = dec.getValue("ix");
-//            int iy = dec.getValue("iy");
-//            //temporary hack to disable crystals and flip X coordinate
-//            int side = dec.getValue("side");
-//            if (iy == 1 && ix * side >= -10 && ix * side <= -2)
-//                continue;
-
-            RingBuffer eDepBuffer = eDepMap.get(hit.getCellID());
-            if (eDepBuffer == null) {
-                eDepBuffer = new RingBuffer(bufferLength);
-                eDepMap.put(hit.getCellID(), eDepBuffer);
-            }
-            for (int i = 0; i < bufferLength; i++) {
-                eDepBuffer.addToCell(i, hit.getRawEnergy() * pulseAmplitude(i * ClockSingleton.getDt() - hit.getTime()));
-            }
-        }
-
-        //check for rising edges
-        for (Long cellID : eDepMap.keySet()) {
-            RingBuffer eDepBuffer = eDepMap.get(cellID);
-            //if there's a rising edge between now and the next time step, note the time
-            if ((eDepBuffer.currentValue() < threshold)
-                    && (eDepBuffer.getValue(1) > threshold)) {
-                lowTimeMap.put(cellID, ClockSingleton.getTime());
-            }
-            if ((eDepBuffer.currentValue() < highThreshold)
-                    && (eDepBuffer.getValue(1) > highThreshold)) {
-                highTimeMap.put(cellID, ClockSingleton.getTime());
-            }
-            eDepBuffer.step();
-        }
-    }
-
-    @Override
-    protected void initReadout() {
-        //initialize buffers
-        eDepMap = new HashMap<Long, RingBuffer>();
-        lowTimeMap = new HashMap<Long, Double>();
-        highTimeMap = new HashMap<Long, Double>();
-    }
-}

hps-java/src/main/java/org/lcsim/hps/recon/ecal
HPSECalUtils.java removed after 1.3
diff -N HPSECalUtils.java
--- HPSECalUtils.java	8 Dec 2012 01:12:17 -0000	1.3
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,61 +0,0 @@
-package org.lcsim.hps.recon.ecal;
-
-import org.lcsim.event.CalorimeterHit;
-
-/**
- *
- * @author Sho Uemura <[log in to unmask]>
- * @version $Id: HPSECalUtils.java,v 1.3 2012/12/08 01:12:17 meeg Exp $
- */
-public class HPSECalUtils {
-
-    public static final double GeV = 1.0;
-    public static final double MeV = 0.001;
-
-    /**
-     * Returns the quadrant which contains the ECal cluster
-     *
-     * @param ecalCluster : ECal cluster
-     * @return Quadrant number
-     */
-    public static int getQuadrant(HPSEcalCluster ecalCluster) {
-        return getQuadrant(ecalCluster.getSeedHit());
-    }
-
-    public static int getQuadrant(CalorimeterHit hit) {
-        int ix = hit.getIdentifierFieldValue("ix");
-        int iy = hit.getIdentifierFieldValue("iy");
-        return getQuadrant(ix, iy);
-    }
-
-    public static int getQuadrant(int x, int y) {
-        if (x > 0) {
-            if (y > 0) {
-                return 1;
-            } else {
-                return 4;
-            }
-        } else {
-            if (y > 0) {
-                return 2;
-            } else {
-                return 3;
-            }
-        }
-    }
-
-    public static int getHVGroup(int x, int y) {
-        int absy = Math.abs(y);
-        if (x > 0 || x <= -8) {
-            return (23 - Math.abs(x)) / 2 + 1;
-        } else {
-            if (x == -7 && absy == 5) {
-                return 8;
-            } else if (x >= -4) {
-                return 12 - Math.max(x + 4, absy - 2);
-            } else {
-                return 12 - Math.max(-5 - x, absy - 2);
-            }
-        }
-    }
-}

hps-java/src/main/java/org/lcsim/hps/recon/ecal
HPS1BitTriggerDriver.java removed after 1.3
diff -N HPS1BitTriggerDriver.java
--- HPS1BitTriggerDriver.java	23 Aug 2012 18:48:18 -0000	1.3
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,30 +0,0 @@
-package org.lcsim.hps.recon.ecal;
-
-import java.util.List;
-
-/**
- * Reads clusters and makes trigger decision using opposite quadrant criterion.
- * Prints triggers to file if file path specified.
- *
- * @author Sho Uemura <[log in to unmask]>
- * @version $Id: HPS1BitTriggerDriver.java,v 1.3 2012/08/23 18:48:18 meeg Exp $
- */
-public class HPS1BitTriggerDriver extends HPSTriggerDriver {
-
-    public HPS1BitTriggerDriver() {
-    }
-
-    @Override
-    public boolean testTrigger(List<HPSEcalCluster> clusters) {
-
-        boolean quadrants[] = new boolean[4];
-
-        for (HPSEcalCluster clus : clusters) {
-//            int ix = clus.getSeedHit().getIdentifierFieldValue("ix");
-//            int iy = clus.getSeedHit().getIdentifierFieldValue("iy");
-            //System.out.printf("ix = %d, iy = %d\n", ix, iy);
-            quadrants[HPSECalUtils.getQuadrant(clus)] = true;
-        }
-        return (quadrants[0] && quadrants[2]) || (quadrants[1] && quadrants[3]);
-    }
-}

hps-java/src/main/java/org/lcsim/hps/recon/ecal
HPSFADCSingleTriggerDriver.java removed after 1.2
diff -N HPSFADCSingleTriggerDriver.java
--- HPSFADCSingleTriggerDriver.java	8 Dec 2012 01:12:17 -0000	1.2
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,128 +0,0 @@
-package org.lcsim.hps.recon.ecal;
-
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.lcsim.event.EventHeader;
-import org.lcsim.hps.evio.TriggerData;
-import org.lcsim.hps.util.ClockSingleton;
-
-/**
- * Reads clusters and makes trigger decision using opposite quadrant criterion.
- * Prints triggers to file if file path specified.
- * TODO: Redundant with TestRunTriggerDriver.
- *
- * @author Omar Moreno <[log in to unmask]>
- * @author Sho Uemura <[log in to unmask]>
- * @author Per Hansson Adrian <[log in to unmask]>
- * @version $Id: HPSFADCSingleTriggerDriver.java,v 1.2 2012/12/08 01:12:17 meeg Exp $
- */
-public class HPSFADCSingleTriggerDriver extends HPSTriggerDriver {
-    // A list to contain all cluster pairs in an event
-    List<HPSEcalCluster[]> clusterPairs;
-    int nTriggers;
-    int totalEvents;
-    private double clusterEnergyHigh = 1.85 * HPSECalUtils.GeV; // GeV
-    private double clusterEnergyLow = .1 * HPSECalUtils.GeV;    // GeV
-    int allClusters;
-    int clusterEnergyCount;
-    int deadtimelessTriggerCount;
-
-    public HPSFADCSingleTriggerDriver() {
-        clusterPairs = new LinkedList<HPSEcalCluster[]>();
-    }
-
-    @Override
-    public void startOfData() {
-        super.startOfData();
-
-        allClusters = 0;
-        clusterEnergyCount = 0;
-        deadtimelessTriggerCount = 0;
-    }
-
-    @Override
-    public boolean testTrigger(List<HPSEcalCluster> clusters) {
-        boolean trigger = false;
-
-        //--- Apply Trigger Cuts ---//
-
-        // Iterate through all clusters present in the event.  
-        //If at least one of the clusters satisfies all of the trigger conditions,
-        // a trigger signal is sent to all other detectors.
-        for (HPSEcalCluster cluster : clusters) {
-            
-            
-            if (outputStream != null) {
-                outputStream.printf("Event %d: cluster energy %f in quadrant %d (%s)\n",
-                        ClockSingleton.getClock(),
-                        cluster.getEnergy(), HPSECalUtils.getQuadrant(cluster),cluster.getSeedHit().getPositionVec().toString());
-                        
-            }
-            
-            allClusters++;
-            
-          
-            // Require the componets of a cluster pair to have an energy in
-            // the range of 100 MeV to 1.85 GeV
-            if (!clusterECut(cluster)) {
-                if (outputStream != null) {
-                    outputStream.println("Failed cluster energy cut");
-                }
-                continue;
-            }
-            clusterEnergyCount++;
-
-            // If all cuts are pased, we have a trigger
-            if (outputStream != null) {
-                outputStream.println("Passed all cuts");
-            }
-            trigger = true;
-        }
-        if (trigger) {
-            deadtimelessTriggerCount++;
-        }
-        return trigger;
-    }
-
-    @Override
-    public void endOfData() {
-        if (outputStream != null) {
-            outputStream.printf("%s: Number of clusters: %d\n",this.getClass().getSimpleName(),allClusters);
-            outputStream.printf("%s: Number of cluster pairs after successive trigger conditions:\n",this.getClass().getSimpleName());
-            outputStream.printf("%s: Cluster energy: %d\n",this.getClass().getSimpleName(), clusterEnergyCount);
-            outputStream.printf("%s: Trigger count without dead time: %d\n",this.getClass().getSimpleName(), deadtimelessTriggerCount);
-            outputStream.printf("%s: Trigger count: %d\n",this.getClass().getSimpleName(), numTriggers);
-            outputStream.close();
-        }
-        System.out.printf("%s: Number of pairs: %d\n",this.getClass().getSimpleName(),allClusters);
-        System.out.printf("%s: Number of cluster pairs after successive trigger conditions:\n",this.getClass().getSimpleName());
-        System.out.printf("%s: Cluster energy: %d\n",this.getClass().getSimpleName(), clusterEnergyCount);
-        System.out.printf("%s: Trigger count without dead time: %d\n",this.getClass().getSimpleName(), deadtimelessTriggerCount);
-        System.out.printf("%s: Trigger count: %d\n",this.getClass().getSimpleName(), numTriggers);
-        super.endOfData();
-    }
-
-    /**
-     * Checks if the ECal clusters making up a cluster pair lie above the low
-     * energy threshold and below the high energy threshold
-     *
-     * @param clusterPair : pair of clusters
-     * @return true if a pair is found, false otherwise
-     */
-    private boolean clusterECut(HPSEcalCluster cluster) {
-        return (cluster.getEnergy() < clusterEnergyHigh && cluster.getEnergy() > clusterEnergyLow);
-    }
-
-    /**
-     * Make a dummy TriggerData
-     */
-    @Override
-    protected void makeTriggerData(EventHeader event, String collectionName) {
-        TriggerData tData = new TriggerData(new int[8]);
-        List<TriggerData> triggerList = new ArrayList<TriggerData>();
-        triggerList.add(tData);
-        event.put(collectionName, triggerList, TriggerData.class, 0);
-    }
-}
\ No newline at end of file

hps-java/src/main/java/org/lcsim/hps/recon/ecal
HPSEcalDiscriminatorReadoutDriver.java removed after 1.6
diff -N HPSEcalDiscriminatorReadoutDriver.java
--- HPSEcalDiscriminatorReadoutDriver.java	8 Dec 2012 01:12:17 -0000	1.6
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,119 +0,0 @@
-package org.lcsim.hps.recon.ecal;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.lcsim.event.CalorimeterHit;
-import org.lcsim.hps.util.ClockSingleton;
-import org.lcsim.hps.util.RingBuffer;
-
-/**
- * Performs readout of ECal hits.
- * Simulates time evolution of preamp output pulse and leading-edge discriminator.
- *
- * @author Sho Uemura <[log in to unmask]>
- * @version $Id: HPSEcalDiscriminatorReadoutDriver.java,v 1.6 2012/12/08 01:12:17 meeg Exp $
- */
-public class HPSEcalDiscriminatorReadoutDriver extends HPSEcalReadoutDriver<HPSRawCalorimeterHit> {
-
-	//buffer for deposited energy
-	Map<Long, RingBuffer> eDepMap = null;
-	//last time we saw a rising edge
-	Map<Long, Double> edgeTimeMap = null;
-	//length of ring buffer (in multiples of bunch spacing)
-	int bufferLength = 200;
-	//shaper time constant in ns
-	double t0 = 18.0;
-	//discriminator output pulse width in ns
-	double outputWidth = 32.0;
-	//output hit "energy" in GeV
-	double outputEnergy = 10.0*HPSECalUtils.GeV;
-
-	public HPSEcalDiscriminatorReadoutDriver() {
-		hitClass = HPSRawCalorimeterHit.class;
-	}
-
-	public void setBufferLength(int bufferLength) {
-		this.bufferLength = bufferLength;
-		eDepMap = new HashMap<Long, RingBuffer>();
-	}
-
-	public void setOutputWidth(double outputWidth) {
-		this.outputWidth = outputWidth;
-	}
-
-	/*
-	 * Set shaper time constant.
-	 * Positive values interpreted as shaping time of CR-RC pulse;
-	 * negative values interpreted as width of rectangular pulse.
-	 */
-	public void setT0(double t0) {
-		this.t0 = t0;
-	}
-
-    @Override
-	protected void readHits(List<HPSRawCalorimeterHit> hits) {
-		for (Long cellID : edgeTimeMap.keySet()) {
-			//if there's an output pulse, make a hit
-			if (ClockSingleton.getTime() - edgeTimeMap.get(cellID) < outputWidth) {
-				hits.add(new HPSRawCalorimeterHit(outputEnergy, readoutTime(), cellID, hitType));
-			}
-		}
-	}
-
-    @Override
-	protected void putHits(List<CalorimeterHit> hits) {
-		//fill the readout buffers
-		for (CalorimeterHit hit : hits) {
-//            int ix = dec.getValue("ix");
-//            int iy = dec.getValue("iy");
-//            //temporary hack to disable crystals and flip X coordinate
-//            int side = dec.getValue("side");
-//            if (iy == 1 && ix * side >= -10 && ix * side <= -2)
-//                continue;
-
-			RingBuffer eDepBuffer = eDepMap.get(hit.getCellID());
-			if (eDepBuffer == null) {
-				eDepBuffer = new RingBuffer(bufferLength);
-				eDepMap.put(hit.getCellID(), eDepBuffer);
-			}
-			for (int i = 0; i < bufferLength; i++) {
-				eDepBuffer.addToCell(i, hit.getRawEnergy() * pulseAmplitude(i * ClockSingleton.getDt() - hit.getTime()));
-			}
-		}
-
-		//check for rising edges
-		for (Long cellID : eDepMap.keySet()) {
-			RingBuffer eDepBuffer = eDepMap.get(cellID);
-			//if there's a rising edge between now and the next time step, note the time
-			if ((eDepBuffer.currentValue() < threshold)
-					&& (eDepBuffer.getValue(1) > threshold))
-				edgeTimeMap.put(cellID, ClockSingleton.getTime());
-			eDepBuffer.step();
-		}
-	}
-
-    @Override
-	protected void initReadout() {
-		//initialize buffers
-		eDepMap = new HashMap<Long, RingBuffer>();
-		edgeTimeMap = new HashMap<Long, Double>();
-	}
-
-	/*
-	 * Pulse shape as a function of time; normalized to have a peak height of 1.
-	 */
-	protected double pulseAmplitude(double time) {
-		if (time < 0.0)
-			return 0.0;
-		if (t0 > 0.0) {
-			return (time / t0) * Math.exp(1.0 - time / t0);
-		} else {
-			if (time < -t0)
-				return 1.0;
-			else
-				return 0.0;
-		}
-	}
-}

hps-java/src/main/java/org/lcsim/hps/recon/ecal
HPSEcalClusterer.java removed after 1.25
diff -N HPSEcalClusterer.java
--- HPSEcalClusterer.java	8 Dec 2012 01:12:17 -0000	1.25
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,171 +0,0 @@
-package org.lcsim.hps.recon.ecal;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.lcsim.event.CalorimeterHit;
-import org.lcsim.event.EventHeader;
-import org.lcsim.geometry.Detector;
-import org.lcsim.geometry.subdetector.HPSEcal3.NeighborMap;
-import org.lcsim.geometry.subdetector.HPSEcal3;
-import org.lcsim.util.Driver;
-import org.lcsim.util.lcio.LCIOConstants;
-
-/**
- * This Driver creates clusters from the CalorimeterHits of an
- * {@link org.lcsim.geometry.subdetectur.HPSEcal3} detector.
- *
- * The clustering algorithm is from pages 83 and 84 of the HPS Proposal.
- *
- * @author Jeremy McCormick <[log in to unmask]>
- * @author Tim Nelson <[log in to unmask]>
- *
- * @version $Id: HPSEcalClusterer.java,v 1.25 2012/12/08 01:12:17 meeg Exp $
- */
-public class HPSEcalClusterer extends Driver {
-
-    HPSEcal3 ecal;
-    String ecalCollectionName;
-    String ecalName = "Ecal";
-    String clusterCollectionName = "EcalClusters";
-    // Minimum E for cluster seed.
-    double seedEMin = .05 * HPSECalUtils.GeV;
-    // Minimum E to add hit to cluster.
-    double addEMin = .03 * HPSECalUtils.GeV;
-    // Odd or even number of crystals in X.
-    boolean oddX;
-    // Map of crystals to their neighbors.
-    NeighborMap neighborMap = null;
-
-    public HPSEcalClusterer() {
-    }
-
-    public void setClusterCollectionName(String clusterCollectionName) {
-        this.clusterCollectionName = clusterCollectionName;
-    }
-
-    public void setSeedEMin(double seedEMin) {
-        this.seedEMin = seedEMin;
-    }
-
-    public void setAddEMin(double addEMin) {
-        this.addEMin = addEMin;
-        if (seedEMin < addEMin) {
-            seedEMin = addEMin;
-        }
-    }
-
-    public void setEcalCollectionName(String ecalCollectionName) {
-        this.ecalCollectionName = ecalCollectionName;
-    }
-
-    public void setEcalName(String ecalName) {
-        this.ecalName = ecalName;
-    }
-
-    public void startOfData() {
-        if (ecalCollectionName == null) {
-            throw new RuntimeException("The parameter ecalCollectionName was not set!");
-        }
-
-        if (ecalName == null) {
-            throw new RuntimeException("The parameter ecalName was not set!");
-        }
-    }
-
-    public void detectorChanged(Detector detector) {
-        // Get the Subdetector.
-        ecal = (HPSEcal3) detector.getSubdetector(ecalName);
-
-        // Cache ref to neighbor map.
-        neighborMap = ecal.getNeighborMap();
-
-        //System.out.println(ecal.getName());
-        //System.out.println("  nx="+ecal.nx());
-        //System.out.println("  ny="+ecal.ny());
-        //System.out.println("  beamgap="+ecal.beamGap());
-        //System.out.println("  dface="+ecal.distanceToFace());
-
-        //System.out.println(neighborMap.toString());
-    }
-
-    public void process(EventHeader event) {
-        //System.out.println(this.getClass().getCanonicalName() + " - process");
-
-        if (event.hasCollection(CalorimeterHit.class, ecalCollectionName)) {
-            // Get the list of raw ECal hits.
-            List<CalorimeterHit> hits = event.get(CalorimeterHit.class, ecalCollectionName);
-
-            // Make a hit map for quick lookup by ID.
-            Map<Long, CalorimeterHit> hitMap = new HashMap<Long, CalorimeterHit>();
-            for (CalorimeterHit hit : hits) {
-                hitMap.put(hit.getCellID(), hit);
-            }
-
-            // Put Cluster collection into event.
-            int flag = 1 << LCIOConstants.CLBIT_HITS;
-            event.put(clusterCollectionName, createClusters(hitMap), HPSEcalCluster.class, flag);
-        }
-    }
-
-    public List<HPSEcalCluster> createClusters(Map<Long, CalorimeterHit> map) {
-
-        // New Cluster list to be added to event.
-        List<HPSEcalCluster> clusters = new ArrayList<HPSEcalCluster>();
-
-        // Loop over ECal hits to find cluster seeds.
-        for (CalorimeterHit hit : map.values()) {
-            // Cut on min seed E.
-            if (hit.getRawEnergy() < seedEMin) {
-                continue;
-            }
-
-            // Get neighbor crystal IDs.
-            Set<Long> neighbors = neighborMap.get(hit.getCellID());
-
-            if (neighbors == null) {
-                throw new RuntimeException("Oops!  Set of neighbors is null!");
-            }
-
-            // List for neighboring hits.
-            List<CalorimeterHit> neighborHits = new ArrayList<CalorimeterHit>();
-
-            // Loop over neighbors to make hit list for cluster.
-            boolean isSeed = true;
-            for (Long neighborId : neighbors) {
-                // Find the neighbor hit in the event if it exists.
-                CalorimeterHit neighborHit = map.get(neighborId);
-
-                // Was this neighbor cell hit?
-                if (neighborHit != null) {
-                    // Check if neighbor cell has more energy.
-                    if (neighborHit.getRawEnergy() > hit.getRawEnergy()) {
-                        // Neighbor has more energy, so cell is not a seed.
-                        isSeed = false;
-                        break;
-                    }
-
-                    // Add to cluster if above min E.
-                    if (neighborHit.getRawEnergy() >= addEMin) {
-                        neighborHits.add(neighborHit);
-                    }
-                }
-            }
-
-            // Did we find a seed?
-            if (isSeed) {
-                // Make a cluster from the hit list.
-                HPSEcalCluster cluster = new HPSEcalCluster(hit);
-                cluster.addHit(hit);
-                for (CalorimeterHit clusHit : neighborHits) {
-                    cluster.addHit(clusHit);
-                }
-                clusters.add(cluster);
-            }
-        }
-        return clusters;
-    }
-}
\ No newline at end of file

hps-java/src/main/java/org/lcsim/hps/recon/ecal
HPSEcalReadoutToTriggerConverterDriver.java removed after 1.3
diff -N HPSEcalReadoutToTriggerConverterDriver.java
--- HPSEcalReadoutToTriggerConverterDriver.java	27 Aug 2012 22:42:20 -0000	1.3
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,189 +0,0 @@
-package org.lcsim.hps.recon.ecal;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.lcsim.event.CalorimeterHit;
-import org.lcsim.event.EventHeader;
-import org.lcsim.event.base.BaseRawCalorimeterHit;
-import org.lcsim.geometry.Detector;
-import org.lcsim.util.Driver;
-
-/**
- *
- * @version $Id: HPSEcalRawConverterDriver.java,v 1.2 2012/05/03 00:17:54
- * phansson Exp $
- */
-public class HPSEcalReadoutToTriggerConverterDriver extends Driver {
-
-    String rawCollectionName = "EcalReadoutHits";
-    String ecalReadoutName = "EcalHits";
-    String ecalCollectionName = "EcalCalHits";
-    int integralWindow = 30;
-    boolean debug = false;
-    double threshold = Double.NEGATIVE_INFINITY;
-    boolean applyBadCrystalMap = true;
-    boolean dropBadFADC = false;
-    double tp = 14.0;
-    double readoutPeriod = 4.0;
-    private int readoutThreshold = 50;
-    private int triggerThreshold = 80;
-    private double timeShift = 0;
-    private int truncateScale = 128;
-
-    public HPSEcalReadoutToTriggerConverterDriver() {
-    }
-
-    public void setTp(double tp) {
-        this.tp = tp;
-    }
-
-    public void setDropBadFADC(boolean dropBadFADC) {
-        this.dropBadFADC = dropBadFADC;
-    }
-
-    public void setThreshold(double threshold) {
-        this.threshold = threshold;
-    }
-
-    public void setIntegralWindow(int integralWindow) {
-        this.integralWindow = integralWindow;
-    }
-
-    public void setEcalCollectionName(String ecalCollectionName) {
-        this.ecalCollectionName = ecalCollectionName;
-    }
-
-    public void setRawCollectionName(String rawCollectionName) {
-        this.rawCollectionName = rawCollectionName;
-    }
-
-    public void setApplyBadCrystalMap(boolean apply) {
-        this.applyBadCrystalMap = apply;
-    }
-
-    public void setTruncateScale(int truncateScale) {
-        this.truncateScale = truncateScale;
-    }
-
-    @Override
-    public void startOfData() {
-        if (ecalCollectionName == null) {
-            throw new RuntimeException("The parameter ecalCollectionName was not set!");
-        }
-    }
-
-    @Override
-    public void detectorChanged(Detector detector) {
-    }
-
-    public boolean isBadCrystal(CalorimeterHit hit) {
-        return HPSEcalConditions.badChannelsLoaded() ? HPSEcalConditions.isBadChannel(hit.getCellID()) : false;
-    }
-
-    public boolean isBadFADC(CalorimeterHit hit) {
-        long daqID = HPSEcalConditions.physicalToDaqID(hit.getCellID());
-        return (HPSEcalConditions.getCrate(daqID) == 1 && HPSEcalConditions.getSlot(daqID) == 3);
-    }
-
-    @Override
-    public void process(EventHeader event) {
-        ArrayList<CalorimeterHit> newHits = new ArrayList<CalorimeterHit>();
-
-        if (event.hasCollection(BaseRawCalorimeterHit.class, rawCollectionName)) {
-            List<BaseRawCalorimeterHit> hits = event.get(BaseRawCalorimeterHit.class, rawCollectionName);
-
-            for (BaseRawCalorimeterHit hit : hits) {
-                CalorimeterHit newHit = HitDtoA(hit, integralWindow);
-                if (newHit != null && newHit.getRawEnergy() > threshold) {
-                    if (applyBadCrystalMap && isBadCrystal(newHit)) {
-                        continue;
-                    }
-                    if (dropBadFADC && isBadFADC(newHit)) {
-                        continue;
-                    }
-                    newHits.add(newHit);
-                }
-            }
-        }
-        int flags = 0;
-        event.put(ecalCollectionName, newHits, CalorimeterHit.class, flags, ecalReadoutName);
-    }
-
-    public CalorimeterHit HitDtoA(BaseRawCalorimeterHit hit, int window) {
-        double integral = tp * Math.E / readoutPeriod;
-        double readoutIntegral = (hit.getAmplitude() - window * HPSEcalConditions.physicalToPedestal(hit.getCellID()));
-        double amplitude = readoutIntegral / integral;
-
-//        double time = readoutPeriod * (Math.random() - 1);
-        double time = 0 - timeShift;
-        timeShift += 0.01;
-        if (timeShift > readoutPeriod) {
-            timeShift = 0;
-        }
-        double triggerIntegral = 0;
-        boolean overThreshold = false;
-//        double readoutTime = -1;
-//        double triggerTime = -1;
-        while (true) {
-            double currentValue = amplitude * pulseAmplitude(time);
-//            if (readoutTime < 0 && currentValue > readoutThreshold) {
-//                readoutTime = time;
-//            }
-            if (!overThreshold && currentValue > triggerThreshold) {
-                overThreshold = true;
-//                triggerTime = time;
-            }
-            if (overThreshold) {
-                triggerIntegral += amplitude * pulseAmplitude(time);
-                if (currentValue < triggerThreshold) {
-                    break;
-                }
-            }
-            time += readoutPeriod;
-
-            if (time > 200.0) {
-                break;
-            }
-        }
-
-//        System.out.format("%f %f %f\n", readoutIntegral, amplitude, triggerIntegral);
-
-        if (hit.getTimeStamp() % 64 != 0) {
-            System.out.println("unexpected timestamp " + hit.getTimeStamp());
-        }
-        int truncatedIntegral = (int) Math.floor(triggerIntegral / truncateScale) * truncateScale;
-        double hitTime = hit.getTimeStamp() / 16.0;
-//        if (readoutTime >= 0 && triggerTime >= 0) {
-//            hitTime += triggerTime - readoutTime;
-//        }
-        long id = hit.getCellID();
-//                Hep3Vector pvec = hit.getDetectorElement().getGeometry().getPosition();
-//                double [] pos = new double[3];
-//                pos[0] = pvec.x();
-//                pos[1] = pvec.y();
-//                pos[2] = pvec.z();
-//        if (truncatedIntegral<=0) return null;
-        if (truncatedIntegral <= 0) {
-            truncatedIntegral = 0;
-        }
-        CalorimeterHit h = new HPSRawCalorimeterHit(truncatedIntegral, hitTime, id, 0);
-//        CalorimeterHit h = new HPSRawCalorimeterHit(triggerIntegral + 0.0000001, hit.getPosition(), hitTime, id, 0);
-        //+0.0000001 is a horrible hack to ensure rawEnergy!=BaseCalorimeterHit.UNSET_CORRECTED_ENERGY
-        return h;
-    }
-
-    private double pulseAmplitude(double time) {
-        if (time <= 0.0) {
-            return 0.0;
-        }
-        if (tp > 0.0) {
-            return (time / tp) * Math.exp(1.0 - time / tp);
-        } else {
-            if (time < -tp) {
-                return 1.0;
-            } else {
-                return 0.0;
-            }
-        }
-    }
-}

hps-java/src/main/java/org/lcsim/hps/recon/ecal
HPSFADCCalorimeterHit.java removed after 1.3
diff -N HPSFADCCalorimeterHit.java
--- HPSFADCCalorimeterHit.java	9 Dec 2011 23:40:21 -0000	1.3
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,61 +0,0 @@
-/*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
-package org.lcsim.hps.recon.ecal;
-
-import java.util.Comparator;
-import org.lcsim.event.CalorimeterHit;
-import org.lcsim.event.RawCalorimeterHit;
-
-/**
- *
- * @author Sho Uemura <[log in to unmask]>
- * @version $Id: HPSFADCCalorimeterHit.java,v 1.3 2011/12/09 23:40:21 meeg Exp $
- */
-public class HPSFADCCalorimeterHit implements RawCalorimeterHit {
-
-	long cellID;
-	int amplitude;
-	int timeStamp;
-	int windowSize;
-	CalorimeterHit analogHit = null;
-
-	public HPSFADCCalorimeterHit(long cellID, int amplitude, int timeStamp, int windowSize) {
-		this.cellID = cellID;
-		this.amplitude = amplitude;
-		this.timeStamp = timeStamp;
-		this.windowSize = windowSize;
-	}
-
-	public long getCellID() {
-		return cellID;
-	}
-
-	public int getAmplitude() {
-		return amplitude;
-	}
-
-	public int getTimeStamp() {
-		return timeStamp;
-	}
-
-	public int getWindowSize() {
-		return windowSize;
-	}
-
-	public CalorimeterHit getAnalogHit() {
-		return analogHit;
-	}
-
-	public void setAnalogHit(CalorimeterHit analogHit) {
-		this.analogHit = analogHit;
-	}
-
-	static class TimeComparator implements Comparator<RawCalorimeterHit> {
-
-		public int compare(RawCalorimeterHit o1, RawCalorimeterHit o2) {
-			return o1.getTimeStamp() - o2.getTimeStamp();
-		}
-	}
-}
\ No newline at end of file

hps-java/src/main/java/org/lcsim/hps/recon/ecal
HPSEcal1BitClusterVetoClusterer.java removed after 1.4
diff -N HPSEcal1BitClusterVetoClusterer.java
--- HPSEcal1BitClusterVetoClusterer.java	8 Dec 2012 01:12:16 -0000	1.4
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,81 +0,0 @@
-package org.lcsim.hps.recon.ecal;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Set;
-
-import org.lcsim.event.CalorimeterHit;
-
-/**
- * Creates clusters from CalorimeterHits in the HPSEcal detector.
- *
- * A veto hit vetoes clusters in the crystal with the veto hit and all its neighbors.
- *
- * The clustering algorithm is from JLab Hall B 6 GeV DVCS Trigger Design doc.
- *
- * @author Sho Uemura <[log in to unmask]>
- * @version $Id: HPSEcal1BitClusterVetoClusterer.java,v 1.4 2012/12/08 01:12:16 meeg Exp $
- */
-public class HPSEcal1BitClusterVetoClusterer extends HPSEcal1BitClusterer {
-
-    public HPSEcal1BitClusterVetoClusterer() {
-    }
-
-    @Override
-    public void countHits(List<CalorimeterHit> hits, List<CalorimeterHit> vetoHits) {
-        // Hit map.
-        hitMap = new HashMap<Long, CalorimeterHit>();
-
-        hitCounts = new HashMap<Long, Integer>();
-        // Loop over ECal hits to count hit towers
-        for (CalorimeterHit hit : hits) {
-            int ix = hit.getIdentifierFieldValue("ix");
-            if (ix >= xMin && ix <= xMax) {
-                continue;
-            }
-
-            // Make a hit map for quick lookup by ID.
-            hitMap.put(hit.getCellID(), hit);
-
-            // Get neighbor crystal IDs.
-            Set<Long> neighbors = neighborMap.get(hit.getCellID());
-
-            if (neighbors == null) {
-                throw new RuntimeException("Oops!  Set of neighbors is null!");
-            }
-
-            Integer hitCount = hitCounts.get(hit.getCellID());
-            if (hitCount == null) {
-                hitCounts.put(hit.getCellID(), 1);
-            } else {
-                hitCounts.put(hit.getCellID(), hitCount + 1);
-            }
-
-            // Loop over neighbors to make hit list for cluster.
-            for (Long neighborId : neighbors) {
-                hitCount = hitCounts.get(neighborId);
-                if (hitCount == null) {
-                    hitCounts.put(neighborId, 1);
-                } else {
-                    hitCounts.put(neighborId, hitCount + 1);
-                }
-            }
-        }
-        if (vetoHits != null) {
-            for (CalorimeterHit hit : vetoHits) {
-                //Get neighbor crystal IDs.
-                Set<Long> neighbors = neighborMap.get(hit.getCellID());
-
-                if (neighbors == null) {
-                    throw new RuntimeException("Oops!  Set of neighbors is null!");
-                }
-
-                // Veto the hit towers for the vetoed crystal and all neighbors.
-                hitCounts.remove(hit.getCellID());
-                for (Long neighborId : neighbors) {
-                    hitCounts.remove(neighborId);
-                }
-            }
-        }
-    }
-}

hps-java/src/main/java/org/lcsim/hps/recon/ecal
HPSEcalTimeEvolutionReadoutDriver.java removed after 1.11
diff -N HPSEcalTimeEvolutionReadoutDriver.java
--- HPSEcalTimeEvolutionReadoutDriver.java	27 Aug 2012 21:53:47 -0000	1.11
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,93 +0,0 @@
-package org.lcsim.hps.recon.ecal;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.lcsim.event.CalorimeterHit;
-import org.lcsim.hps.util.ClockSingleton;
-import org.lcsim.hps.util.RingBuffer;
-
-/**
- * Performs readout of ECal hits.
- * Simulates time evolution of preamp output pulse.
- *
- * @author Sho Uemura <[log in to unmask]>
- * @version $Id: HPSEcalTimeEvolutionReadoutDriver.java,v 1.11 2012/08/27 21:53:47 meeg Exp $
- */
-public class HPSEcalTimeEvolutionReadoutDriver extends HPSEcalReadoutDriver<HPSRawCalorimeterHit> {
-
-    //buffer for deposited energy
-    Map<Long, RingBuffer> eDepMap = null;
-    //length of ring buffer (in readout cycles)
-    int bufferLength = 20;
-    //shaper time constant in ns; negative values generate square pulses of the given width
-    double t0 = 18.0;
-
-    public HPSEcalTimeEvolutionReadoutDriver() {
-		hitClass = HPSRawCalorimeterHit.class;
-    }
-
-    public void setT0(double t0) {
-        this.t0 = t0;
-    }
-
-    public void setBufferLength(int bufferLength) {
-        this.bufferLength = bufferLength;
-        eDepMap = new HashMap<Long, RingBuffer>();
-    }
-
-    @Override
-    protected void readHits(List<HPSRawCalorimeterHit> hits) {
-        for (Long cellID : eDepMap.keySet()) {
-            RingBuffer eDepBuffer = eDepMap.get(cellID);
-            if (eDepBuffer.currentValue() > threshold) {
-//                int ix = dec.getValue("ix");
-//                int iy = dec.getValue("iy");
-//                if (iy == 1 && ix == -2)
-//                    System.out.printf("Time %f, output signal %f\n", ClockSingleton.getTime(), eDepBuffer.currentValue());
-                hits.add(new HPSRawCalorimeterHit(eDepBuffer.currentValue(), readoutTime(), cellID, hitType));
-            }
-            eDepBuffer.step();
-        }
-    }
-
-    @Override
-    protected void putHits(List<CalorimeterHit> hits) {
-        //fill the readout buffers
-        for (CalorimeterHit hit : hits) {
-//            int ix = dec.getValue("ix");
-//            int iy = dec.getValue("iy");
-//            if (iy == 1 && ix == -2)
-//                System.out.printf("Time %f, input hit %f)\n", ClockSingleton.getTime() + hit.getTime(), hit.getRawEnergy());
-
-            RingBuffer eDepBuffer = eDepMap.get(hit.getCellID());
-            if (eDepBuffer == null) {
-                eDepBuffer = new RingBuffer(bufferLength);
-                eDepMap.put(hit.getCellID(), eDepBuffer);
-            }
-            for (int i = 0; i < bufferLength; i++) {
-                eDepBuffer.addToCell(i, hit.getRawEnergy() * pulseAmplitude((i + 1) * readoutPeriod + readoutTime() - (ClockSingleton.getTime() + hit.getTime())));
-            }
-        }
-    }
-
-    @Override
-    protected void initReadout() {
-        //initialize buffers
-        eDepMap = new HashMap<Long, RingBuffer>();
-    }
-
-    private double pulseAmplitude(double time) {
-        if (time < 0.0)
-            return 0.0;
-        if (t0 > 0.0) {
-            return (time / t0) * Math.exp(1.0 - time / t0);
-        } else {
-            if (time < -t0)
-                return 1.0;
-            else
-                return 0.0;
-        }
-    }
-}

hps-java/src/main/java/org/lcsim/hps/recon/ecal
HPSFADCTriggerDriver.java removed after 1.20
diff -N HPSFADCTriggerDriver.java
--- HPSFADCTriggerDriver.java	22 Dec 2012 00:54:16 -0000	1.20
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,475 +0,0 @@
-package org.lcsim.hps.recon.ecal;
-
-import hep.aida.IHistogram1D;
-import hep.aida.IHistogram2D;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.EnumSet;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.lcsim.event.Cluster;
-import org.lcsim.event.EventHeader;
-import org.lcsim.geometry.Detector;
-import org.lcsim.hps.evio.TriggerData;
-import org.lcsim.hps.util.ClockSingleton;
-import org.lcsim.util.aida.AIDA;
-
-/**
- * Reads clusters and makes trigger decision using opposite quadrant criterion.
- * Prints triggers to file if file path specified.
- *
- * @author Omar Moreno <[log in to unmask]>
- * @author Sho Uemura <[log in to unmask]>
- * @version $Id: HPSFADCTriggerDriver.java,v 1.20 2012/12/22 00:54:16 meeg Exp $
- */
-public class HPSFADCTriggerDriver extends HPSTriggerDriver {
-
-    // A list to contain all cluster pairs in an event
-    List<HPSEcalCluster[]> clusterPairs;
-    int nTriggers;
-    int totalEvents;
-    private double beamEnergy = 2.2 * HPSECalUtils.GeV;
-    private double clusterEnergyHigh = 1.85 / 2.2;
-    private double clusterEnergyLow = .1 / 2.2;
-    private double energySumThreshold = 1.0;
-    private double energyDifferenceThreshold = 1.5 / 2.2;
-    private double maxCoplanarityAngle = 35; // degrees
-//    private double energyDistanceDistance = 250; // mm
-//    private double energyDistanceThreshold = 0.8 / 2.2;
-    private double energyDistanceDistance = 200; // mm
-    private double energyDistanceThreshold = 0.5;
-    int allPairs;
-    int oppositeQuadrantCount;
-    int clusterEnergyCount;
-    int energySumCount;
-    int energyDifferenceCount;
-    int energyDistanceCount;
-    int coplanarityCount;
-    AIDA aida = AIDA.defaultInstance();
-    IHistogram2D clusterEnergy2DAll, clusterSumDiff2DAll, energyDistance2DAll, clusterAngles2DAll, clusterCoplanarity2DAll;
-    IHistogram2D clusterEnergy2D, clusterSumDiff2D, energyDistance2D, clusterAngles2D, clusterCoplanarity2D;
-    IHistogram1D triggerBits1D, triggerTimes1D;
-    private boolean useQuadrants = false;
-
-    private enum Flag {
-
-        CLUSTER_ENERGY(3), ENERGY_SUM_DIFF(2), ENERGY_DISTANCE(1), COPLANARITY(0);
-        private final int index;
-
-        Flag(int i) {
-            index = i;
-        }
-
-        static int bitmask(EnumSet<Flag> flags) {
-            int mask = 0;
-            for (Flag flag : flags) {
-                mask |= 1 << flag.index;
-            }
-            return mask;
-        }
-    }
-
-    public HPSFADCTriggerDriver() {
-        clusterPairs = new LinkedList<HPSEcalCluster[]>();
-    }
-
-    public void setBeamEnergy(double beamEnergy) {
-        if (beamEnergy == 1.1) {
-            System.out.println(this.getClass().getSimpleName() + ": Setting trigger for 1.1 GeV beam");
-            maxCoplanarityAngle = 90;
-            clusterEnergyHigh = .7 / beamEnergy;
-            clusterEnergyLow = .1 / beamEnergy;
-            energySumThreshold = 0.8 / beamEnergy;
-        } else if (beamEnergy == 2.2) {
-            System.out.println(this.getClass().getSimpleName() + ": Setting trigger for 2.2 GeV beam");
-            maxCoplanarityAngle = 45;
-            clusterEnergyHigh = 1.6 / beamEnergy;
-            clusterEnergyLow = .1 / beamEnergy;
-            energySumThreshold = 1.7 / beamEnergy;
-        } else if (beamEnergy == 6.6) {
-            System.out.println(this.getClass().getSimpleName() + ": Setting trigger for 6.6 GeV beam");
-            maxCoplanarityAngle = 60;
-            clusterEnergyHigh = 5.0 / beamEnergy;
-            clusterEnergyLow = .1 / beamEnergy;
-            energySumThreshold = 5.5 / beamEnergy;
-        }
-        this.beamEnergy = beamEnergy * HPSECalUtils.GeV;
-    }
-
-    @Override
-    public void detectorChanged(Detector detector) {
-        if (detector.getName().contains("1pt1")) {
-            setBeamEnergy(1.1);
-        } else if (detector.getName().contains("2pt2")) {
-            setBeamEnergy(2.2);
-        } else if (detector.getName().contains("6pt6")) {
-            setBeamEnergy(6.6);
-        }
-
-        clusterSumDiff2DAll = aida.histogram2D("All cluster pairs: energy difference vs. sum", 100, 0.0, 2 * beamEnergy, 100, 0.0, beamEnergy);
-        clusterEnergy2DAll = aida.histogram2D("All cluster pairs: energy (less energetic vs. more energetic)", 100, 0.0, 2 * beamEnergy, 100, 0.0, beamEnergy);
-        energyDistance2DAll = aida.histogram2D("All cluster pairs: distance vs. energy (less energetic cluster)", 100, 0.0, 0.5 * beamEnergy, 25, 0.0, 400.0);
-        clusterCoplanarity2DAll = aida.histogram2D("All cluster pairs: cluster angle uncoplanarity vs. less energetic cluster angle", 100, -180.0, 180.0, 100, -180.0, 180.0);
-        clusterAngles2DAll = aida.histogram2D("All cluster pairs: cluster angle (less energetic vs. more energetic)", 100, -180.0, 180.0, 100, -180.0, 180.0);
-
-        clusterSumDiff2D = aida.histogram2D("Passed other cuts: energy difference vs. sum", 100, 0.0, 2 * beamEnergy, 100, 0.0, beamEnergy);
-        clusterEnergy2D = aida.histogram2D("Passed other cuts: energy (less energetic vs. more energetic)", 100, 0.0, 2 * beamEnergy, 100, 0.0, beamEnergy);
-        energyDistance2D = aida.histogram2D("Passed other cuts: distance vs. energy (less energetic cluster)", 100, 0.0, 0.5 * beamEnergy, 25, 0.0, 400.0);
-        clusterCoplanarity2D = aida.histogram2D("Passed other cuts: cluster angle uncoplanarity vs. less energetic cluster angle", 100, -180.0, 180.0, 100, -180.0, 180.0);
-        clusterAngles2D = aida.histogram2D("Passed other cuts: cluster angle (less energetic vs. more energetic)", 100, -180.0, 180.0, 100, -180.0, 180.0);
-
-        triggerBits1D = aida.histogram1D(detector.getDetectorName() + " : " + clusterCollectionName + " : trigger bits", 17, -1.5, 15.5);
-        triggerTimes1D = aida.histogram1D(detector.getDetectorName() + " : " + clusterCollectionName + " : trigger times", 500, -0.5, 499.5);
-    }
-
-    @Override
-    public void startOfData() {
-        super.startOfData();
-
-        allPairs = 0;
-        oppositeQuadrantCount = 0;
-        clusterEnergyCount = 0;
-        energySumCount = 0;
-        energyDifferenceCount = 0;
-        energyDistanceCount = 0;
-        coplanarityCount = 0;
-    }
-
-    @Override
-    public boolean testTrigger(List<HPSEcalCluster> clusters) {
-        boolean trigger = false;
-
-        if (useQuadrants) {
-            getClusterPairs(clusters);
-        } else {
-            getClusterPairsTopBot(clusters);
-        }
-
-        //--- Apply Trigger Cuts ---//
-
-        // Iterate through all cluster pairs present in the event.  If at least
-        // one of the cluster pairs satisfies all of the trigger conditions,
-        // a trigger signal is sent to all other detectors.
-        for (HPSEcalCluster[] clusterPair : clusterPairs) {
-
-            EnumSet<Flag> bits = EnumSet.noneOf(Flag.class);
-
-            if (outputStream != null) {
-                outputStream.printf("Event %d: cluster pair (energy %f in quadrant %d (%s), energy %f in quadrant %d (%s))\n",
-                        ClockSingleton.getClock(),
-                        clusterPair[0].getEnergy(), HPSECalUtils.getQuadrant(clusterPair[0]), clusterPair[0].getSeedHit().getPositionVec().toString(),
-                        clusterPair[1].getEnergy(), HPSECalUtils.getQuadrant(clusterPair[1]), clusterPair[1].getSeedHit().getPositionVec().toString());
-            }
-
-            allPairs++;
-
-            if (useQuadrants) {
-                // Require that the event have at least two clusters in opposite
-                // quadrants
-                if (!oppositeQuadrantsCut(clusterPair)) {
-                    if (outputStream != null) {
-                        outputStream.println("Failed opposite quadrant cut");
-                    }
-                    continue;
-                }
-                oppositeQuadrantCount++;
-            }
-
-            // Require the components of a cluster pair to have an energy in
-            // the range of 100 MeV to 1.85 GeV
-            if (clusterECut(clusterPair)) {
-                bits.add(Flag.CLUSTER_ENERGY);
-            }
-
-            bits.add(Flag.ENERGY_SUM_DIFF);
-            // Require the sum of the energies of the components of the
-            // cluster pair to be less than the
-            // (Beam Energy)*(Sampling Fraction) ( 2 GeV for the Test Run )
-            if (!energySum(clusterPair)) {
-                bits.remove(Flag.ENERGY_SUM_DIFF);
-            }
-
-            // Require the difference in energy of the components of the
-            // cluster pair to be less than 1.5 GeV
-            if (!energyDifference(clusterPair)) {
-                bits.remove(Flag.ENERGY_SUM_DIFF);
-            }
-
-            // Apply a low energy cluster vs. distance cut of the form
-            // E_low + .0032 GeV/mm < .8 GeV
-            if (energyDistanceCut(clusterPair)) {
-                bits.add(Flag.ENERGY_DISTANCE);
-            }
-
-            // Require that the two clusters are coplanar with the beam within
-            // 35 degrees
-            if (coplanarityCut(clusterPair)) {
-                bits.add(Flag.COPLANARITY);
-            }
-
-            if (bits.contains(Flag.CLUSTER_ENERGY)) {
-                clusterEnergyCount++;
-                if (energySum(clusterPair)) {
-                    energySumCount++;
-                    if (energyDifference(clusterPair)) {
-                        energyDifferenceCount++;
-                        if (bits.contains(Flag.ENERGY_DISTANCE)) {
-                            energyDistanceCount++;
-                            if (bits.contains(Flag.COPLANARITY)) {
-                                coplanarityCount++;
-                            } else if (outputStream != null) {
-                                outputStream.println("Failed coplanarity cut");
-                            }
-                        } else if (outputStream != null) {
-                            outputStream.println("Failed energy-distance cut");
-                        }
-                    } else if (outputStream != null) {
-                        outputStream.println("Failed energy difference cut");
-                    }
-                } else if (outputStream != null) {
-                    outputStream.println("Failed energy sum cut");
-                }
-            } else if (outputStream != null) {
-                outputStream.println("Failed cluster energy cut");
-            }
-
-            clusterSumDiff2DAll.fill(clusterPair[0].getEnergy() + clusterPair[1].getEnergy(), clusterPair[0].getEnergy() - clusterPair[1].getEnergy());
-            clusterEnergy2DAll.fill(clusterPair[0].getEnergy(), clusterPair[1].getEnergy());
-            energyDistance2DAll.fill(clusterPair[1].getEnergy(), getClusterDistance(clusterPair[1]));
-            clusterCoplanarity2DAll.fill(getClusterAngle(clusterPair[1]), pairUncoplanarity(clusterPair));
-            clusterAngles2DAll.fill(getClusterAngle(clusterPair[0]), getClusterAngle(clusterPair[1]));
-
-            if (bits.containsAll(EnumSet.complementOf(EnumSet.of(Flag.ENERGY_SUM_DIFF, Flag.CLUSTER_ENERGY)))) { //cluster energy, energy-distance, coplanarity
-                clusterSumDiff2D.fill(clusterPair[0].getEnergy() + clusterPair[1].getEnergy(), clusterPair[0].getEnergy() - clusterPair[1].getEnergy());
-                clusterEnergy2D.fill(clusterPair[0].getEnergy(), clusterPair[1].getEnergy());
-            }
-            if (bits.containsAll(EnumSet.complementOf(EnumSet.of(Flag.ENERGY_DISTANCE)))) {
-                energyDistance2D.fill(clusterPair[1].getEnergy(), getClusterDistance(clusterPair[1]));
-            }
-            if (bits.containsAll(EnumSet.complementOf(EnumSet.of(Flag.COPLANARITY)))) {
-                clusterCoplanarity2D.fill(getClusterAngle(clusterPair[1]), pairUncoplanarity(clusterPair));
-                clusterAngles2D.fill(getClusterAngle(clusterPair[0]), getClusterAngle(clusterPair[1]));
-            }
-
-            triggerBits1D.fill(Flag.bitmask(bits));
-
-            if (bits.containsAll(EnumSet.allOf(Flag.class))) {
-                // If all cuts are pased, we have a trigger
-                if (outputStream != null) {
-                    outputStream.println("Passed all cuts");
-                }
-                trigger = true;
-            }
-        }
-        if (trigger) {
-            triggerBits1D.fill(-1);
-            triggerTimes1D.fill(ClockSingleton.getClock() % 500);
-        }
-        return trigger;
-    }
-
-    @Override
-    public void endOfData() {
-        if (outputStream != null) {
-            printCounts(outputStream);
-        }
-        printCounts(new PrintWriter(System.out));
-        super.endOfData();
-    }
-
-    private void printCounts(PrintWriter writer) {
-        writer.printf("Number of pairs: %d\n", allPairs);
-        writer.printf("Number of cluster pairs after successive trigger conditions:\n");
-        if (useQuadrants) {
-            writer.printf("Opposite quadrants: %d\n", oppositeQuadrantCount);
-        }
-        writer.printf("Cluster energy: %d\n", clusterEnergyCount);
-        writer.printf("Energy sum: %d\n", energySumCount);
-        writer.printf("Energy difference: %d\n", energyDifferenceCount);
-        writer.printf("Energy-distance cut: %d\n", energyDistanceCount);
-        writer.printf("Coplanarity: %d\n", coplanarityCount);
-        writer.printf("Trigger count: %d\n", numTriggers);
-        writer.close();
-    }
-
-    /**
-     * Get a list of all unique cluster pairs in the event
-     *
-     * @param ecalClusters : List of ECal clusters
-     * @return true if there are any cluster pairs
-     */
-    private boolean getClusterPairs(List<HPSEcalCluster> ecalClusters) {
-        // Create a list which will hold all neighboring cluster to the cluster
-        // of interest
-        List< HPSEcalCluster> ecalClusterNeighbors = new LinkedList< HPSEcalCluster>();
-        ecalClusterNeighbors.addAll(ecalClusters);
-
-        // Clear the list of cluster pairs
-        clusterPairs.clear();
-
-        for (HPSEcalCluster ecalCluster : ecalClusters) {
-            // Create a list of neighbors to the cluster of interest
-            ecalClusterNeighbors.remove(ecalCluster);
-
-            // Loop over all neigboring clusters and check to see if there is
-            // any which lie in opposing quadrants to the cluster of interest.
-            // If so, add them to the list of cluster pairs
-            for (HPSEcalCluster ecalClusterNeighbor : ecalClusterNeighbors) {
-                if (ecalCluster.getEnergy() > ecalClusterNeighbor.getEnergy()) {
-                    HPSEcalCluster[] clusterPair = {ecalCluster, ecalClusterNeighbor};
-                    clusterPairs.add(clusterPair);
-                } else {
-                    HPSEcalCluster[] clusterPair = {ecalClusterNeighbor, ecalCluster};
-                    clusterPairs.add(clusterPair);
-                }
-            }
-        }
-
-        return !clusterPairs.isEmpty();
-    }
-
-    private boolean getClusterPairsTopBot(List<HPSEcalCluster> ecalClusters) {
-        // Create a list which will hold all neighboring cluster to the cluster
-        // of interest
-        List< HPSEcalCluster> topClusters = new ArrayList< HPSEcalCluster>();
-        List< HPSEcalCluster> botClusters = new ArrayList< HPSEcalCluster>();
-        for (HPSEcalCluster ecalCluster : ecalClusters) {
-            if (ecalCluster.getSeedHit().getIdentifierFieldValue("iy") > 0) {
-                topClusters.add(ecalCluster);
-            } else {
-                botClusters.add(ecalCluster);
-            }
-        }
-        // Clear the list of cluster pairs
-        clusterPairs.clear();
-
-        // Loop over all top-bottom pairs of clusters; higher-energy cluster goes first in the pair
-        for (HPSEcalCluster topCluster : topClusters) {
-            for (HPSEcalCluster botCluster : botClusters) {
-                if (topCluster.getEnergy() > botCluster.getEnergy()) {
-                    HPSEcalCluster[] clusterPair = {topCluster, botCluster};
-                    clusterPairs.add(clusterPair);
-                } else {
-                    HPSEcalCluster[] clusterPair = {botCluster, topCluster};
-                    clusterPairs.add(clusterPair);
-                }
-            }
-        }
-        return !clusterPairs.isEmpty();
-    }
-
-    /**
-     * Checks if the ECal clusters making up a cluster pair lie in opposite
-     * quadrants
-     *
-     * @param clusterPair : pair of clusters
-     * @return true if opposite quadrants, false otherwise
-     */
-    private boolean oppositeQuadrantsCut(HPSEcalCluster[] clusterPair) {
-        int quad1 = HPSECalUtils.getQuadrant(clusterPair[0]);
-        int quad2 = HPSECalUtils.getQuadrant(clusterPair[1]);
-
-        //if clusters are in the same quadrant, they're not opposite quadrants
-        if (quad1 == quad2) {
-            return false;
-        } //opposite pairs of quadrants are either both even (2 and 4) or both odd (1 and 3)
-        else {
-            return ((quad1 & 1) == (quad2 & 1));
-        }
-    }
-
-    /**
-     * Checks if the ECal clusters making up a cluster pair lie above the low
-     * energy threshold and below the high energy threshold
-     *
-     * @param clusterPair : pair of clusters
-     * @return true if a pair is found, false otherwise
-     */
-    private boolean clusterECut(HPSEcalCluster[] clusterPair) {
-        return (clusterPair[0].getEnergy() < beamEnergy * clusterEnergyHigh
-                && clusterPair[1].getEnergy() < beamEnergy * clusterEnergyHigh
-                && clusterPair[0].getEnergy() > beamEnergy * clusterEnergyLow
-                && clusterPair[1].getEnergy() > beamEnergy * clusterEnergyLow);
-    }
-
-    /**
-     * Checks if the sum of the energies of ECal clusters making up a cluster
-     * pair is below an energy sum threshold
-     *
-     * @param clusterPair : pair of clusters
-     * @return true if a pair is found, false otherwise
-     */
-    private boolean energySum(Cluster[] clusterPair) {
-        double clusterESum = clusterPair[0].getEnergy() + clusterPair[1].getEnergy();
-        return (clusterESum < beamEnergy * energySumThreshold);
-    }
-
-    /**
-     * Checks if the energy difference between the ECal clusters making up a
-     * cluster pair is below an energy difference threshold
-     *
-     * @param clusterPair : pair of clusters
-     * @return true if pair is found, false otherwise
-     */
-    private boolean energyDifference(HPSEcalCluster[] clusterPair) {
-        double clusterEDifference = clusterPair[0].getEnergy() - clusterPair[1].getEnergy();
-
-        return (clusterEDifference < beamEnergy * energyDifferenceThreshold);
-    }
-
-    /**
-     * Require that the distance from the beam of the lowest energy cluster in a
-     * cluster pair satisfies the following E_low + d_b*.0032 GeV/mm < .8 GeV
-     *
-     * @param clusterPair : pair of clusters
-     * @return true if pair is found, false otherwise
-     */
-    private boolean energyDistanceCut(HPSEcalCluster[] clusterPair) {
-        HPSEcalCluster lowEnergyCluster = clusterPair[1];
-
-        // Calculate its position
-        double lowEClusterDistance = getClusterDistance(clusterPair[1]);
-        // event passes cut if above the line with X- and Y-intercepts defined by energyDistanceDistance and beamEnergy*energyDistanceThreshold
-        double clusterDistvsE = lowEnergyCluster.getEnergy() + lowEClusterDistance * beamEnergy * energyDistanceThreshold / energyDistanceDistance;
-
-        return (clusterDistvsE > beamEnergy * energyDistanceThreshold);
-    }
-
-    /**
-     * Checks if a cluster pair is coplanar to the beam within a given angle
-     *
-     * @param clusterPair : pair of clusters
-     * @return true if pair is found, false otherwise
-     */
-    private boolean coplanarityCut(HPSEcalCluster[] clusterPair) {
-        return (Math.abs(pairUncoplanarity(clusterPair)) < maxCoplanarityAngle);
-    }
-
-    private double pairUncoplanarity(HPSEcalCluster[] clusterPair) { // Find the angle between clusters in the pair
-        double cluster1Angle = (getClusterAngle(clusterPair[0]) + 180.0) % 180.0;
-        double cluster2Angle = (getClusterAngle(clusterPair[1]) + 180.0) % 180.0;
-
-        return cluster2Angle - cluster1Angle;
-    }
-
-    private double getClusterAngle(HPSEcalCluster cluster) { //returns angle in range of -180 to 180
-        double position[] = cluster.getSeedHit().getPosition();
-        return Math.toDegrees(Math.atan2(position[1], position[0]));
-    }
-
-    private double getClusterDistance(HPSEcalCluster cluster) {
-        return Math.hypot(cluster.getSeedHit().getPosition()[0], cluster.getSeedHit().getPosition()[1]);
-    }
-
-    /**
-     * Make a dummy TriggerData
-     */
-    @Override
-    protected void makeTriggerData(EventHeader event, String collectionName) {
-        TriggerData tData = new TriggerData(new int[8]);
-        List<TriggerData> triggerList = new ArrayList<TriggerData>();
-        triggerList.add(tData);
-        event.put(collectionName, triggerList, TriggerData.class, 0);
-    }
-}
\ No newline at end of file

hps-java/src/main/java/org/lcsim/hps/recon/ecal
HPSEcal1BitEventVetoClusterer.java removed after 1.4
diff -N HPSEcal1BitEventVetoClusterer.java
--- HPSEcal1BitEventVetoClusterer.java	8 Dec 2012 01:12:17 -0000	1.4
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,69 +0,0 @@
-package org.lcsim.hps.recon.ecal;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Set;
-
-import org.lcsim.event.CalorimeterHit;
-
-/**
- * Creates clusters from CalorimeterHits in the HPSEcal detector.
- *
- * A veto hit vetoes all clusters in the event.
- *
- * The clustering algorithm is from JLab Hall B 6 GeV DVCS Trigger Design doc.
- *
- * @author Sho Uemura <[log in to unmask]>
- * @version $Id: HPSEcal1BitEventVetoClusterer.java,v 1.4 2012/12/08 01:12:17 meeg Exp $
- */
-public class HPSEcal1BitEventVetoClusterer extends HPSEcal1BitClusterer {
-
-    public HPSEcal1BitEventVetoClusterer() {
-    }
-
-    @Override
-    public void countHits(List<CalorimeterHit> hits, List<CalorimeterHit> vetoHits) {
-        // Hit map.
-        hitMap = new HashMap<Long, CalorimeterHit>();
-
-        hitCounts = new HashMap<Long, Integer>();
-        if (vetoHits != null && !vetoHits.isEmpty()) {
-            return;
-        }
-
-        // Loop over ECal hits to count hit towers
-        for (CalorimeterHit hit : hits) {
-            int ix = hit.getIdentifierFieldValue("ix");
-            if (ix >= xMin && ix <= xMax) {
-                continue;
-            }
-
-            // Make a hit map for quick lookup by ID.
-            hitMap.put(hit.getCellID(), hit);
-
-            // Get neighbor crystal IDs.
-            Set<Long> neighbors = neighborMap.get(hit.getCellID());
-
-            if (neighbors == null) {
-                throw new RuntimeException("Oops!  Set of neighbors is null!");
-            }
-
-            Integer hitCount = hitCounts.get(hit.getCellID());
-            if (hitCount == null) {
-                hitCounts.put(hit.getCellID(), 1);
-            } else {
-                hitCounts.put(hit.getCellID(), hitCount + 1);
-            }
-
-            // Loop over neighbors to make hit list for cluster.
-            for (Long neighborId : neighbors) {
-                hitCount = hitCounts.get(neighborId);
-                if (hitCount == null) {
-                    hitCounts.put(neighborId, 1);
-                } else {
-                    hitCounts.put(neighborId, hitCount + 1);
-                }
-            }
-        }
-    }
-}

hps-java/src/main/java/org/lcsim/hps/recon/ecal
HPSEcalTriggerFilterDriver.java removed after 1.3
diff -N HPSEcalTriggerFilterDriver.java
--- HPSEcalTriggerFilterDriver.java	21 Sep 2012 23:16:02 -0000	1.3
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,108 +0,0 @@
-package org.lcsim.hps.recon.ecal;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Queue;
-import java.util.concurrent.ArrayBlockingQueue;
-import org.lcsim.event.CalorimeterHit;
-import org.lcsim.event.EventHeader;
-import org.lcsim.geometry.Detector;
-import org.lcsim.util.Driver;
-
-/**
- * Changes ECal hit IDs to match what the test run trigger sees.
- * @version $Id: HPSEcalRawConverterDriver.java,v 1.2 2012/05/03 00:17:54
- * phansson Exp $
- */
-public class HPSEcalTriggerFilterDriver extends Driver {
-
-    private String ecalReadoutName = "EcalHits";
-    private String inputCollection = "EcalReadoutHits";
-    private String outputCollection = "EcalCalHits";
-    private int topDelay = 0;
-    private int bottomDelay = 5;
-    private Queue<List<CalorimeterHit>> topHitsQueue = null;
-    private Queue<List<CalorimeterHit>> bottomHitsQueue = null;
-
-    public HPSEcalTriggerFilterDriver() {
-    }
-
-    public void setOutputCollection(String outputCollection) {
-        this.outputCollection = outputCollection;
-    }
-
-    public void setInputCollection(String inputCollection) {
-        this.inputCollection = inputCollection;
-    }
-
-    @Override
-    public void startOfData() {
-        if (outputCollection == null) {
-            throw new RuntimeException("The parameter ecalCollectionName was not set!");
-        }
-
-        topHitsQueue = new ArrayBlockingQueue<List<CalorimeterHit>>(topDelay + 1);
-        for (int i = 0; i < topDelay; i++) {
-            topHitsQueue.add(new ArrayList<CalorimeterHit>());
-        }
-        bottomHitsQueue = new ArrayBlockingQueue<List<CalorimeterHit>>(bottomDelay + 1);
-        for (int i = 0; i < bottomDelay; i++) {
-            bottomHitsQueue.add(new ArrayList<CalorimeterHit>());
-        }
-    }
-
-    @Override
-    public void detectorChanged(Detector detector) {
-    }
-
-    @Override
-    public void process(EventHeader event) {
-        if (event.hasCollection(CalorimeterHit.class, inputCollection)) {
-            ArrayList<CalorimeterHit> newHits = new ArrayList<CalorimeterHit>();
-
-            ArrayList<CalorimeterHit> topHits = new ArrayList<CalorimeterHit>();
-            ArrayList<CalorimeterHit> bottomHits = new ArrayList<CalorimeterHit>();
-
-            List<CalorimeterHit> hits = event.get(CalorimeterHit.class, inputCollection);
-            for (CalorimeterHit hit : hits) {
-                CalorimeterHit newHit = filterHit(hit);
-                if (newHit != null) {
-                    if (hit.getIdentifierFieldValue("iy") > 0) { //should really be checking newHit, but it doesn't have metadata yet
-                        topHits.add(newHit);
-                    } else {
-                        bottomHits.add(newHit);
-                    }
-                }
-            }
-            topHitsQueue.add(topHits);
-            bottomHitsQueue.add(bottomHits);
-            newHits.addAll(topHitsQueue.poll());
-            newHits.addAll(bottomHitsQueue.poll());
-            int flags = 0;
-            event.put(outputCollection, newHits, CalorimeterHit.class, flags, ecalReadoutName);
-        }
-    }
-
-    private CalorimeterHit filterHit(CalorimeterHit hit) {
-        int ix = hit.getIdentifierFieldValue("ix");
-        int iy = hit.getIdentifierFieldValue("iy");
-        long daqID = HPSEcalConditions.physicalToDaqID(hit.getCellID());
-        int crate = HPSEcalConditions.getCrate(daqID);
-        short slot = HPSEcalConditions.getSlot(daqID);
-        short channel = HPSEcalConditions.getChannel(daqID);
-
-        int delay = iy>0?topDelay:bottomDelay;
-        // no triggers from crate 1, slot 3 
-        if (crate == 1 && slot == 3) {
-            return null;
-        }
-
-        // flip quadrant
-        if (ix > 0 && iy > 0) {
-            ix = 24 - ix;
-        }
-        long newID = HPSEcalConditions.makePhysicalID(ix, iy);
-        //make new hit; set position to null so it gets recalculated
-        return new HPSRawCalorimeterHit(hit.getRawEnergy(), hit.getTime()+delay*4, newID, hit.getType());
-    }
-}

hps-java/src/main/java/org/lcsim/hps/recon/ecal
HPSEcalEdepToTriggerConverterDriver.java removed after 1.7
diff -N HPSEcalEdepToTriggerConverterDriver.java
--- HPSEcalEdepToTriggerConverterDriver.java	8 Dec 2012 01:12:17 -0000	1.7
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,188 +0,0 @@
-package org.lcsim.hps.recon.ecal;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.lcsim.event.CalorimeterHit;
-import org.lcsim.event.EventHeader;
-import org.lcsim.geometry.Detector;
-import org.lcsim.util.Driver;
-
-/**
- *
- * @version $Id: HPSEcalRawConverterDriver.java,v 1.2 2012/05/03 00:17:54
- * phansson Exp $
- */
-public class HPSEcalEdepToTriggerConverterDriver extends Driver {
-
-    private String ecalReadoutName = "EcalHits";
-    private String inputCollection = "EcalHits";
-    private String readoutCollection = "EcalCalHits";
-    private String triggerCollection = "EcalTriggerHits";
-    private boolean applyBadCrystalMap = true;
-    private double tp = 14.0;
-    private double readoutPeriod = 4.0;
-    private int readoutThreshold = 50;
-    private int triggerThreshold = 80;
-    private int truncateScale = 128;
-    private double pulseIntegral = tp * Math.E / readoutPeriod;
-    private double gainScale = 1.0; //gain miscalibration factor
-    private double _gain = -1.0; //constant gain, activated if >0
-
-    public HPSEcalEdepToTriggerConverterDriver() {
-    }
-
-    public void setTp(double tp) {
-        this.tp = tp;
-    }
-
-    public void setReadoutCollection(String readoutCollection) {
-        this.readoutCollection = readoutCollection;
-    }
-
-    public void setTriggerCollection(String triggerCollection) {
-        this.triggerCollection = triggerCollection;
-    }
-
-    public void setInputCollection(String inputCollection) {
-        this.inputCollection = inputCollection;
-    }
-
-    public void setApplyBadCrystalMap(boolean apply) {
-        this.applyBadCrystalMap = apply;
-    }
-
-    public void setTruncateScale(int truncateScale) {
-        this.truncateScale = truncateScale;
-    }
-
-    public void setConstantGain(double gain) {
-        this._gain = gain;
-    }
-
-    @Override
-    public void startOfData() {
-        if (readoutCollection == null) {
-            throw new RuntimeException("The parameter ecalCollectionName was not set!");
-        }
-    }
-
-    @Override
-    public void detectorChanged(Detector detector) {
-    }
-
-    public boolean isBadCrystal(CalorimeterHit hit) {
-        return HPSEcalConditions.badChannelsLoaded() ? HPSEcalConditions.isBadChannel(hit.getCellID()) : false;
-    }
-
-    @Override
-    public void process(EventHeader event) {
-        ArrayList<CalorimeterHit> triggerHits = new ArrayList<CalorimeterHit>();
-        ArrayList<CalorimeterHit> readoutHits = new ArrayList<CalorimeterHit>();
-
-        if (event.hasCollection(CalorimeterHit.class, inputCollection)) {
-            List<CalorimeterHit> hits = event.get(CalorimeterHit.class, inputCollection);
-
-            for (CalorimeterHit hit : hits) {
-                if (applyBadCrystalMap && isBadCrystal(hit)) {
-                    continue;
-                }
-                CalorimeterHit triggerHit = makeTriggerHit(hit);
-                if (triggerHit != null) {
-                    triggerHits.add(triggerHit);
-                }
-                CalorimeterHit readoutHit = makeReadoutHit(hit);
-                if (readoutHit != null) {
-                    readoutHits.add(readoutHit);
-                }
-            }
-        }
-        int flags = 0;
-        event.put(triggerCollection, triggerHits, CalorimeterHit.class, flags, ecalReadoutName);
-        event.put(readoutCollection, readoutHits, CalorimeterHit.class, flags, ecalReadoutName);
-    }
-
-    public CalorimeterHit makeTriggerHit(CalorimeterHit hit) {
-        double amplitude = hitAmplitude(hit);
-
-//        double time = readoutPeriod * (Math.random() - 1);
-        double time = 0 - hit.getTime();
-        double triggerIntegral = 0;
-        boolean overThreshold = false;
-        while (true) {
-            double currentValue = amplitude * pulseAmplitude(time);
-            if (!overThreshold && currentValue > triggerThreshold) {
-                overThreshold = true;
-            }
-            if (overThreshold) {
-                triggerIntegral += amplitude * pulseAmplitude(time);
-                if (currentValue < triggerThreshold) {
-                    break;
-                }
-            }
-            time += readoutPeriod;
-
-            if (time > 200.0) {
-                break;
-            }
-        }
-
-//        System.out.format("%f %f %f\n", readoutIntegral, amplitude, triggerIntegral);
-
-        int truncatedIntegral = (int) Math.floor(triggerIntegral / truncateScale);
-        if (truncatedIntegral > 0) {
-            return new HPSRawCalorimeterHit(truncatedIntegral, hit.getTime(), hit.getCellID(), 0);
-        }
-        return null;
-    }
-
-    public CalorimeterHit makeReadoutHit(CalorimeterHit hit) {
-        double amplitude = hitAmplitude(hit);
-        if (amplitude < readoutThreshold) {
-            return null;
-        }
-        double integral = hit.getRawEnergy()/HPSECalUtils.GeV * gainScale;
-
-//        double thresholdCrossingTime = 0 - hit.getTime();
-//        while (true) {
-//            double currentValue = amplitude * pulseAmplitude(thresholdCrossingTime);
-//            if (currentValue > readoutThreshold) {
-//                break;
-//            }
-//            thresholdCrossingTime += readoutPeriod;
-//
-//            if (thresholdCrossingTime > 200.0) {
-//                break;
-//            }
-//        }
-//
-//        double readoutIntegral = 0;
-//        for (int i = 0; i < 35; i++) {
-//            readoutIntegral += amplitude * pulseAmplitude(thresholdCrossingTime + (i - 5) * readoutPeriod);
-//        }
-////        double integral = readoutIntegral * HPSEcalConditions.physicalToGain(id);
-//        System.out.format("dumb: %f, full: %f\n",hit.getRawEnergy() * 1000.0,readoutIntegral * HPSEcalConditions.physicalToGain(id));
-
-        CalorimeterHit h = new HPSRawCalorimeterHit(integral, hit.getTime(), hit.getCellID(), 0);
-        return h;
-    }
-
-    private double hitAmplitude(CalorimeterHit hit) {
-        double gain = _gain > 0 ? _gain : HPSEcalConditions.physicalToGain(hit.getCellID());
-        return (hit.getRawEnergy() /HPSECalUtils.MeV) / (gain * pulseIntegral);
-    }
-
-    private double pulseAmplitude(double time) {
-        if (time <= 0.0) {
-            return 0.0;
-        }
-        if (tp > 0.0) {
-            return (time / tp) * Math.exp(1.0 - time / tp);
-        } else {
-            if (time < -tp) {
-                return 1.0;
-            } else {
-                return 0.0;
-            }
-        }
-    }
-}

hps-java/src/main/java/org/lcsim/hps/recon/ecal
HPSEcalConditions.java removed after 1.21
diff -N HPSEcalConditions.java
--- HPSEcalConditions.java	16 Oct 2012 20:00:39 -0000	1.21
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,342 +0,0 @@
-package org.lcsim.hps.recon.ecal;
-
-import java.io.BufferedReader;
-import org.lcsim.geometry.compact.Subdetector;
-import java.io.IOException;
-import java.io.Reader;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.StringTokenizer;
-import org.lcsim.conditions.ConditionsManager;
-import org.lcsim.detector.identifier.ExpandedIdentifier;
-import org.lcsim.detector.identifier.IExpandedIdentifier;
-import org.lcsim.detector.identifier.IIdentifierHelper;
-import org.lcsim.geometry.Detector;
-import org.lcsim.util.Driver;
-
-/**
- *
- * @author meeg
- * @version $Id: HPSEcalConditions.java,v 1.21 2012/10/16 20:00:39 phansson Exp $
- */
-public class HPSEcalConditions extends Driver {
-
-    //DAQ channel map
-    private static HashMap<Long, Long> daqToPhysicalMap = new HashMap<Long, Long>();
-    private static HashMap<Long, Long> physicalToDaqMap = new HashMap<Long, Long>();
-    //pedestals
-    private static HashMap<Long, Double> daqToPedestalMap = new HashMap<Long, Double>();
-    private static HashMap<Long, Double> daqToNoiseMap = new HashMap<Long, Double>();
-    //set of bad channels to ignore
-    private static HashSet<Long> badChannelsSet = new HashSet<Long>();
-    private static boolean badChannelsLoaded = false;
-    private static IIdentifierHelper helper = null;
-    //gain
-    private static HashMap<Long, Double> physicalToGainMap = new HashMap<Long, Double>();
-    //subdetector name (for when this is used as a driver)
-    private String subdetectorName = "Ecal";
-    private static Subdetector subdetector;
-    private static boolean debug = false;
-    private static boolean calibrationLoaded = false;
-
-    public HPSEcalConditions() {
-    }
-
-    @Override
-    public void detectorChanged(Detector detector) {
-        detectorChanged(detector, subdetectorName);
-    }
-
-    public static void detectorChanged(Detector detector, String ecalName) {
-        subdetector = detector.getSubdetector(ecalName);
-        if (subdetector == null) {
-            throw new RuntimeException("Subdetector " + ecalName + " not found");
-        }
-        helper = subdetector.getDetectorElement().getIdentifierHelper();
-    }
-
-    public static boolean calibrationLoaded() {
-        return calibrationLoaded;
-    }
-
-    public static void loadDaqMap(Detector detector, String ecalName) {
-        detectorChanged(detector, ecalName);
-        fillDaqCellMap(subdetector);
-    }
-
-    public static void loadCalibration() {
-        fillDaqCellMap(subdetector);
-        loadBadChannels(subdetector);
-        loadGains();
-        loadPedestals();
-        calibrationLoaded = true;
-    }
-
-    public void setSubdetectorName(String subdetectorName) {
-        this.subdetectorName = subdetectorName;
-    }
-
-    public static IIdentifierHelper getHelper() {
-        return helper;
-    }
-
-    public static Subdetector getSubdetector() {
-        return subdetector;
-    }
-
-    public static boolean badChannelsLoaded() {
-        return badChannelsLoaded;
-    }
-
-    public static void loadPedestals() {
-        ConditionsManager conditions = ConditionsManager.defaultInstance();
-        try {
-            Reader pedestalsReader = conditions.getRawConditions("calibECal/default01.ped").getReader();
-            loadPedestals(pedestalsReader, 1);
-            pedestalsReader = conditions.getRawConditions("calibECal/default02.ped").getReader();
-            loadPedestals(pedestalsReader, 2);
-        } catch (IOException e) {
-            throw new RuntimeException("couldn't get pedestals file", e);
-        }
-    }
-
-    public static void loadPedestals(Reader reader, int crate) {
-
-        System.out.println("reading pedestals for ECal");
-
-        BufferedReader bufferedReader = new BufferedReader(reader);
-        String line;
-        while (true) {
-            try {
-                line = bufferedReader.readLine();
-            } catch (IOException e) {
-                throw new RuntimeException("couldn't parse pedestals file", e);
-            }
-            if (line == null) {
-                break;
-            }
-
-            if (line.indexOf("#") != -1) {
-                line = line.substring(0, line.indexOf("#"));
-            }
-
-            StringTokenizer lineTok = new StringTokenizer(line);
-
-            if (lineTok.countTokens() != 0) {
-                if (lineTok.countTokens() != 4) {
-                    throw new RuntimeException("Invalid line in pedestals file: " + line);
-                } else {
-                    short slot = Short.valueOf(lineTok.nextToken());
-                    short channel = Short.valueOf(lineTok.nextToken());
-                    double pedestal = Double.valueOf(lineTok.nextToken());
-                    double noise = Double.valueOf(lineTok.nextToken());
-                    long daqid = getDaqID(crate, slot, channel);
-                    daqToPedestalMap.put(daqid, pedestal);
-                    daqToNoiseMap.put(daqid, noise);
-                    if (debug) {
-                        System.out.printf("Channel %d: pede %.2f noise %.2f (crate %d slot %d channel %d)\n", daqid,pedestal,noise,crate,slot,channel);
-                    }
-                }
-            }
-        }
-    }
-
-    private static void loadBadChannels(Subdetector ecal) {
-
-        System.out.println("reading ECal bad channels");
-
-        IExpandedIdentifier expId = new ExpandedIdentifier(helper.getIdentifierDictionary().getNumberOfFields());
-        expId.setValue(helper.getFieldIndex("system"), ecal.getSystemID());
-        ConditionsManager conditions = ConditionsManager.defaultInstance();
-        BufferedReader bufferedReader;
-        try {
-            bufferedReader = new BufferedReader(conditions.getRawConditions("daqmap/ecal.badchannels").getReader());
-        } catch (IOException e) {
-            throw new RuntimeException("couldn't get ECal bad channels from conditions manager", e);
-        }
-        String line;
-        while (true) {
-            try {
-                line = bufferedReader.readLine();
-            } catch (IOException e) {
-                throw new RuntimeException("couldn't parse ECal bad channels", e);
-            }
-            if (line == null) {
-                break;
-            }
-
-            if (line.indexOf("#") != -1) {
-                line = line.substring(0, line.indexOf("#"));
-            }
-
-            StringTokenizer lineTok = new StringTokenizer(line);
-
-            if (lineTok.countTokens() != 0) {
-                if (lineTok.countTokens() != 2) {
-                    throw new RuntimeException("Invalid line in ECal bad channels: " + line);
-                } else {
-                    int x = Integer.valueOf(lineTok.nextToken());
-                    int y = Integer.valueOf(lineTok.nextToken());
-                    expId.setValue(helper.getFieldIndex("ix"), x);
-                    expId.setValue(helper.getFieldIndex("iy"), y);
-                    badChannelsSet.add(helper.pack(expId).getValue());
-                    if (debug) {
-                        System.out.printf("Channel %d is bad (x=%d y=%d)\n", helper.pack(expId).getValue(),x,y);
-                    }
-                }
-            }
-        }
-        badChannelsLoaded = true;
-    }
-
-    public static void loadGains() {
-        if (debug) {
-            System.out.println("Loading gains");
-        }
-        BufferedReader bufferedReader;
-        ConditionsManager conditions = ConditionsManager.defaultInstance();
-        try {
-            bufferedReader = new BufferedReader(conditions.getRawConditions("calibECal/default.gain").getReader());
-        } catch (IOException e) {
-            throw new RuntimeException("couldn't get gain file", e);
-        }
-
-        String line;
-        while (true) {
-            try {
-                line = bufferedReader.readLine();
-            } catch (IOException e) {
-                throw new RuntimeException("couldn't parse gain file", e);
-            }
-            if (line == null) {
-                break;
-            }
-
-            if (line.indexOf("#") != -1) {
-                line = line.substring(0, line.indexOf("#"));
-            }
-
-            StringTokenizer lineTok = new StringTokenizer(line);
-
-            if (lineTok.countTokens() != 0) {
-                if (lineTok.countTokens() != 3) {
-                    throw new RuntimeException("Invalid line in gain file: " + line);
-                } else {
-                    int x = Integer.valueOf(lineTok.nextToken());
-                    int y = Integer.valueOf(lineTok.nextToken());
-                    double gain = Double.valueOf(lineTok.nextToken());
-                    physicalToGainMap.put(makePhysicalID(x, y), gain);
-                    if (debug) {
-                        System.out.printf("Channel %d: gain %.2f (x=%d y=%d)\n", makePhysicalID(x, y),gain,x,y);
-                    }
-                }
-            }
-        }
-    }
-
-    public static boolean isBadChannel(long id) {
-        return badChannelsSet.contains(id);
-    }
-
-    private static void fillDaqCellMap(Subdetector ecal) {
-
-        System.out.println("reading ECal DAQ map");
-
-        IExpandedIdentifier expId = new ExpandedIdentifier(helper.getIdentifierDictionary().getNumberOfFields());
-        expId.setValue(helper.getFieldIndex("system"), ecal.getSystemID());
-
-        ConditionsManager conditions = ConditionsManager.defaultInstance();
-        BufferedReader bufferedReader;
-        try {
-            bufferedReader = new BufferedReader(conditions.getRawConditions("daqmap/ecal.txt").getReader());
-        } catch (IOException e) {
-            throw new RuntimeException("couldn't get DAQ map from conditions manager", e);
-        }
-        String line;
-        while (true) {
-            try {
-                line = bufferedReader.readLine();
-            } catch (IOException e) {
-                throw new RuntimeException("couldn't parse ECal DAQ map", e);
-            }
-            if (line == null) {
-                break;
-            }
-
-            if (line.indexOf("#") != -1) {
-                line = line.substring(0, line.indexOf("#"));
-            }
-
-            StringTokenizer lineTok = new StringTokenizer(line);
-
-            if (lineTok.countTokens() != 0) {
-                if (lineTok.countTokens() != 5) {
-                    throw new RuntimeException("Invalid line in ECal DAQ map: " + line);
-                } else {
-                    int x = Integer.valueOf(lineTok.nextToken());
-                    int y = Integer.valueOf(lineTok.nextToken());
-//                    if (x>0 && y>0) x = 24-x;
-                    expId.setValue(helper.getFieldIndex("ix"), x);
-                    expId.setValue(helper.getFieldIndex("iy"), y);
-                    int crate = Integer.valueOf(lineTok.nextToken());
-                    short slot = Short.valueOf(lineTok.nextToken());
-                    short channel = Short.valueOf(lineTok.nextToken());
-                    addMapEntry(helper.pack(expId).getValue(), getDaqID(crate, slot, channel));
-                }
-            }
-        }
-    }
-
-    public static long makePhysicalID(int ix, int iy) {
-        IExpandedIdentifier expId = new ExpandedIdentifier(helper.getIdentifierDictionary().getNumberOfFields());
-        expId.setValue(helper.getFieldIndex("system"), subdetector.getSystemID());
-        expId.setValue(helper.getFieldIndex("ix"), ix);
-        expId.setValue(helper.getFieldIndex("iy"), iy);
-        return helper.pack(expId).getValue();
-    }
-
-    private static void addMapEntry(long physicalID, long daqID) {
-        daqToPhysicalMap.put(daqID, physicalID);
-        physicalToDaqMap.put(physicalID, daqID);
-    }
-
-    public static long getDaqID(int crate, short slot, short channel) {
-        return (((long) crate) << 32) | ((long) slot << 16) | (long) channel;
-    }
-
-    public static Long daqToPhysicalID(int crate, short slot, short channel) {
-        return daqToPhysicalMap.get(getDaqID(crate, slot, channel));
-    }
-
-    public static int getCrate(long daqID) {
-        return (int) (daqID >>> 32);
-    }
-
-    public static short getSlot(long daqID) {
-        return (short) ((daqID >>> 16) & 0xFFFF);
-    }
-
-    public static short getChannel(long daqID) {
-        return (short) (daqID & 0xFFFF);
-    }
-
-    public static Long physicalToDaqID(long physicalID) {
-        return physicalToDaqMap.get(physicalID);
-    }
-
-    public static Long daqToPhysicalID(long daqID) {
-        return daqToPhysicalMap.get(daqID);
-    }
-
-    public static Double daqToPedestal(long daqID) {
-        return daqToPedestalMap.get(daqID);
-    }
-
-    public static Double physicalToPedestal(long physicalID) {
-        return daqToPedestalMap.get(physicalToDaqMap.get(physicalID));
-    }
-
-    public static Double physicalToGain(long physicalID) {
-        return physicalToGainMap.get(physicalID);
-    }
-}

hps-java/src/main/java/org/lcsim/hps/recon/ecal
HPSTriggerDriver.java removed after 1.22
diff -N HPSTriggerDriver.java
--- HPSTriggerDriver.java	11 Dec 2012 00:04:30 -0000	1.22
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,222 +0,0 @@
-package org.lcsim.hps.recon.ecal;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.PrintStream;
-import java.io.PrintWriter;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Queue;
-
-
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import org.lcsim.event.EventHeader;
-import org.lcsim.hps.recon.tracking.apv25.Apv25Full;
-import org.lcsim.hps.recon.tracking.apv25.HPSAPV25;
-import org.lcsim.hps.util.ClockSingleton;
-import org.lcsim.util.Driver;
-import org.lcsim.util.lcio.LCIOWriter;
-
-/**
- * Reads clusters and makes trigger decision using opposite quadrant criterion.
- * Prints triggers to file if file path specified.
- * Applies SVT trigger latency and sends trigger signal to SVT
- *
- * @author Sho Uemura <[log in to unmask]>
- * @version $Id: HPSTriggerDriver.java,v 1.22 2012/12/11 00:04:30 meeg Exp $
- */
-public abstract class HPSTriggerDriver extends Driver {
-
-    private boolean _DEBUG = false;
-    protected String clusterCollectionName = "EcalClusters";
-    private String outputFileName = null;
-    protected PrintWriter outputStream = null;
-    protected int numTriggers;
-    private int lastTrigger;
-    private int deadTime = 0;
-    // FIFO queue to store the svt trigger time stamp 
-    private Queue<Double> svtTriggerTimeStamp = new LinkedList<Double>();
-    // SVT trigger latency
-    public static final double svtTriggerLatency = 100.0; // [ns]
-    // FIFO queue to store the ECal trigger time stamp 
-    private Queue<Double> ecalTriggerTimestamps = null;
-    // ECal trigger latency
-    private static final double ecalTriggerLatency = 100.0; // [ns]
-    // FIFO queue to store the trigger bank trigger time stamp 
-    private Queue<Double> triggerTriggerTimestamps = null;
-    // trigger bank trigger latency
-    public static final double triggerTriggerLatency = 50.0; // [ns]
-    private static boolean triggerBit = false;
-    private String lcioFile = null;
-    LCIOWriter lcioWriter = null;
-
-    public HPSTriggerDriver() {
-    }
-
-    public void setLcioFile(String lcioFile) {
-        this.lcioFile = lcioFile;
-    }
-
-    /**
-     * Set dead time; 0 for no dead time
-     * @param deadTime Minimum number of clock ticks between triggers
-     */
-    public void setDeadTime(int deadTime) {
-        this.deadTime = deadTime;
-    }
-
-    public void setClusterCollectionName(String clusterCollectionName) {
-        this.clusterCollectionName = clusterCollectionName;
-    }
-
-    public void setOutputFileName(String outputFileName) {
-        this.outputFileName = outputFileName;
-    }
-
-    @Override
-    public void startOfData() {
-        if (clusterCollectionName == null) {
-            throw new RuntimeException("The parameter clusterCollectionName was not set!");
-        }
-
-        if (outputFileName != null) {
-            try {
-                outputStream = new PrintWriter(new PrintStream(outputFileName), true);
-            } catch (IOException ex) {
-                throw new RuntimeException("Invalid outputFilePath!");
-            }
-        } else {
-            if (_DEBUG) {
-                outputStream = new PrintWriter(System.out, true);
-            }
-        }
-
-        if (lcioFile != null) {
-            try {
-                lcioWriter = new LCIOWriter(new File(lcioFile));
-            } catch (IOException e) {
-                throw new RuntimeException(e);
-            }
-        }
-
-        numTriggers = 0;
-
-        ecalTriggerTimestamps = new LinkedList<Double>();
-        triggerTriggerTimestamps = new LinkedList<Double>();
-    }
-
-    @Override
-    public void process(EventHeader event) {
-        triggerBit = false; //reset trigger
-        //System.out.println(this.getClass().getCanonicalName() + " - process");
-
-        if (ClockSingleton.getClock() - lastTrigger > deadTime && triggerDecision(event)) {
-            triggerBit = true;
-            lastTrigger = ClockSingleton.getClock();
-            numTriggers++;
-            if (_DEBUG) {
-                System.out.printf(this.getClass().getSimpleName() + ": Trigger on event %d\n", event.getEventNumber());
-            }
-            if (outputStream != null) {
-                outputStream.printf("Trigger on event %d\n", event.getEventNumber());
-            }
-
-            // If an ECal trigger signal has been sent store the trigger
-            // time offset by the trigger latencies
-            svtTriggerTimeStamp.add(ClockSingleton.getTime() + svtTriggerLatency);
-            ecalTriggerTimestamps.add(ClockSingleton.getTime() + ecalTriggerLatency);
-            triggerTriggerTimestamps.add(ClockSingleton.getTime() + triggerTriggerLatency);
-            if (_DEBUG) {
-                System.out.println(this.getClass().getSimpleName() + ": Trigger added on event " + event.getEventNumber());
-            }
-
-            if (outputStream != null) {
-                outputStream.printf("trigger sent to ET event builder on event %d\n", event.getEventNumber());
-            }
-            makeTriggerData(event, "TriggerStatus");
-            if (lcioWriter != null) {
-                try {
-                    lcioWriter.write(event);
-                } catch (IOException ex) {
-                    Logger.getLogger(HPSTriggerDriver.class.getName()).log(Level.SEVERE, null, ex);
-                }
-            }
-        }
-
-        // Check if there are any pending SVT triggers to process
-        if (svtTriggerTimeStamp.peek() != null
-                && ClockSingleton.getTime() >= svtTriggerTimeStamp.peek()) {
-
-            if (outputStream != null) {
-                outputStream.printf("SVT trigger sent on event %d\n", event.getEventNumber());
-            }
-
-            // Send a trigger signal to the SVT
-            HPSAPV25.readoutBit = true;
-            Apv25Full.readoutBit = true;
-            svtTriggerTimeStamp.remove();
-        }
-
-        // Check if there are any pending ECal triggers to process
-        if (ecalTriggerTimestamps.peek() != null
-                && ClockSingleton.getTime() >= ecalTriggerTimestamps.peek()) {
-
-            if (outputStream != null) {
-                outputStream.printf("ECal trigger sent on event %d\n", event.getEventNumber());
-            }
-
-            // Send a trigger signal to the ECal
-            HPSEcalReadoutDriver.readoutBit = true;
-            ecalTriggerTimestamps.remove();
-        }
-
-
-        // Check if there are any pending trigger bank triggers to process
-        if (triggerTriggerTimestamps.peek() != null
-                && ClockSingleton.getTime() >= triggerTriggerTimestamps.peek()) {
-
-            if (outputStream != null) {
-                outputStream.printf("Trigger bank trigger sent on event %d\n", event.getEventNumber());
-            }
-
-            // Make trigger bank
-            makeTriggerData(event, "TriggerBank");
-            triggerTriggerTimestamps.remove();
-        }
-    }
-
-    protected boolean triggerDecision(EventHeader event) {
-        // Get the list of raw ECal hits.
-        if (event.hasCollection(HPSEcalCluster.class, clusterCollectionName)) {
-            return testTrigger(event.get(HPSEcalCluster.class, clusterCollectionName));
-        } else {
-            return false;
-        }
-    }
-
-    public abstract boolean testTrigger(List<HPSEcalCluster> clusters);
-
-    protected void makeTriggerData(EventHeader event, String collectionName) {
-    }
-
-    @Override
-    public void endOfData() {
-        if (outputStream != null) {
-            outputStream.printf("Trigger count: %d\n", numTriggers);
-            outputStream.close();
-        }
-        if (lcioWriter != null) {
-            try {
-                lcioWriter.close();
-            } catch (IOException ex) {
-                Logger.getLogger(HPSTriggerDriver.class.getName()).log(Level.SEVERE, null, ex);
-            }
-        }
-        System.out.printf(this.getClass().getSimpleName() + ": Trigger count: %d\n", numTriggers);
-    }
-
-    public static boolean triggerBit() {
-        return triggerBit;
-    }
-}
\ No newline at end of file

hps-java/src/main/java/org/lcsim/hps/recon/ecal
HPSEcalRawConverterDriver.java removed after 1.16
diff -N HPSEcalRawConverterDriver.java
--- HPSEcalRawConverterDriver.java	20 Nov 2012 23:25:09 -0000	1.16
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,158 +0,0 @@
-package org.lcsim.hps.recon.ecal;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.lcsim.event.CalorimeterHit;
-import org.lcsim.event.EventHeader;
-import org.lcsim.event.RawCalorimeterHit;
-import org.lcsim.event.RawTrackerHit;
-import org.lcsim.geometry.Detector;
-import org.lcsim.util.Driver;
-
-/**
- *
- * @version $Id: HPSEcalRawConverterDriver.java,v 1.2 2012/05/03 00:17:54
- * phansson Exp $
- */
-public class HPSEcalRawConverterDriver extends Driver {
-
-    HPSEcalRawConverter converter = null;
-    String rawCollectionName = "EcalReadoutHits";
-    String ecalReadoutName = "EcalHits";
-    String ecalCollectionName = "EcalCalHits";
-    int integralWindow = 35;
-    boolean debug = false;
-    double threshold = Double.NEGATIVE_INFINITY;
-    boolean applyBadCrystalMap = true;
-    boolean dropBadFADC = false;
-    private boolean runBackwards = false;
-
-    public HPSEcalRawConverterDriver() {
-        converter = new HPSEcalRawConverter();
-    }
-
-    public void setRunBackwards(boolean runBackwards) {
-        this.runBackwards = runBackwards;
-    }
-
-    public void setDropBadFADC(boolean dropBadFADC) {
-        this.dropBadFADC = dropBadFADC;
-    }
-
-    public void setThreshold(double threshold) {
-        this.threshold = threshold;
-    }
-
-    public void setGain(double gain) {
-        converter.setGain(gain);
-    }
-
-    public void setIntegralWindow(int integralWindow) {
-        this.integralWindow = integralWindow;
-    }
-
-    public void setEcalCollectionName(String ecalCollectionName) {
-        this.ecalCollectionName = ecalCollectionName;
-    }
-
-    public void setRawCollectionName(String rawCollectionName) {
-        this.rawCollectionName = rawCollectionName;
-    }
-
-    public void setApplyBadCrystalMap(boolean apply) {
-        this.applyBadCrystalMap = apply;
-    }
-
-    public void setDebug(boolean debug) {
-        this.debug = debug;
-    }
-
-    @Override
-    public void startOfData() {
-        if (ecalCollectionName == null) {
-            throw new RuntimeException("The parameter ecalCollectionName was not set!");
-        }
-    }
-
-    @Override
-    public void detectorChanged(Detector detector) {
-    }
-
-    public static boolean isBadCrystal(CalorimeterHit hit) {
-        return HPSEcalConditions.badChannelsLoaded() ? HPSEcalConditions.isBadChannel(hit.getCellID()) : false;
-    }
-
-    public static boolean isBadFADC(CalorimeterHit hit) {
-        long daqID = HPSEcalConditions.physicalToDaqID(hit.getCellID());
-        return (HPSEcalConditions.getCrate(daqID) == 1 && HPSEcalConditions.getSlot(daqID) == 3);
-    }
-
-    @Override
-    public void process(EventHeader event) {
-        if (!runBackwards) {
-            ArrayList<CalorimeterHit> newHits = new ArrayList<CalorimeterHit>();
-
-            // Get the list of ECal hits.
-            if (event.hasCollection(RawTrackerHit.class, rawCollectionName)) {
-                List<RawTrackerHit> hits = event.get(RawTrackerHit.class, rawCollectionName);
-
-                for (RawTrackerHit hit : hits) {
-                    CalorimeterHit newHit = converter.HitDtoA(hit);
-                    if (applyBadCrystalMap && isBadCrystal(newHit)) {
-                        continue;
-                    }
-                    if (dropBadFADC && isBadFADC(newHit)) {
-                        continue;
-                    }
-                    if (newHit.getRawEnergy() > threshold) {
-                        newHits.add(newHit);
-                    }
-                }
-            }
-            if (event.hasCollection(RawCalorimeterHit.class, rawCollectionName)) {
-                List<RawCalorimeterHit> hits = event.get(RawCalorimeterHit.class, rawCollectionName);
-
-                for (RawCalorimeterHit hit : hits) {
-                    if (debug) {
-                        System.out.format("old hit energy %d\n", hit.getAmplitude());
-                    }
-                    CalorimeterHit newHit = converter.HitDtoA(hit, integralWindow);
-                    if (newHit.getRawEnergy() > threshold) {
-                        if (applyBadCrystalMap && isBadCrystal(newHit)) {
-                            continue;
-                        }
-                        if (dropBadFADC && isBadFADC(newHit)) {
-                            continue;
-                        }
-                        if (debug) {
-                            System.out.format("new hit energy %f\n", newHit.getRawEnergy());
-                        }
-                        newHits.add(newHit);
-                    }
-                }
-            }
-            int flags = 0;
-            event.put(ecalCollectionName, newHits, CalorimeterHit.class, flags, ecalReadoutName);
-        } else {
-            ArrayList<RawCalorimeterHit> newHits = new ArrayList<RawCalorimeterHit>();
-            if (event.hasCollection(CalorimeterHit.class, ecalCollectionName)) {
-                List<CalorimeterHit> hits = event.get(CalorimeterHit.class, ecalCollectionName);
-
-                for (CalorimeterHit hit : hits) {
-                    if (debug) {
-                        System.out.format("old hit energy %f\n", hit.getRawEnergy());
-                    }
-                    RawCalorimeterHit newHit = converter.HitAtoD(hit, integralWindow);
-                    if (newHit.getAmplitude() > 0) {
-                        if (debug) {
-                            System.out.format("new hit energy %d\n", newHit.getAmplitude());
-                        }
-                        newHits.add(newHit);
-                    }
-                }
-            }
-            int flags = 0;
-            event.put(rawCollectionName, newHits, RawCalorimeterHit.class, flags, ecalReadoutName);
-        }
-    }
-}

hps-java/src/main/java/org/lcsim/hps/recon/ecal
HPSDummyTriggerDriver.java removed after 1.3
diff -N HPSDummyTriggerDriver.java
--- HPSDummyTriggerDriver.java	8 Dec 2012 01:12:17 -0000	1.3
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,30 +0,0 @@
-package org.lcsim.hps.recon.ecal;
-
-import java.util.List;
-import org.lcsim.event.EventHeader;
-import org.lcsim.hps.util.ClockSingleton;
-
-/**
- * Free-running trigger - triggers on every Nth event
- *
- * @author Sho Uemura <[log in to unmask]>
- * @version $Id: HPSDummyTriggerDriver.java,v 1.3 2012/12/08 01:12:17 meeg Exp $
- */
-public class HPSDummyTriggerDriver extends HPSTriggerDriver {
-
-    int period = 100;
-
-    public void setPeriod(int period) {
-        this.period = period;
-    }
-
-    @Override
-    public boolean triggerDecision(EventHeader event) {
-        return (ClockSingleton.getClock() % period == 0);
-    }
-
-    @Override
-    public boolean testTrigger(List<HPSEcalCluster> clusters) {
-        return false;
-    }
-}

hps-java/sandbox
HPS1BitTriggerDriver.java added at 1.1
diff -N HPS1BitTriggerDriver.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ HPS1BitTriggerDriver.java	25 Feb 2013 22:39:25 -0000	1.1
@@ -0,0 +1,32 @@
+package org.lcsim.hps.readout.ecal;
+
+import java.util.List;
+import org.lcsim.hps.recon.ecal.HPSECalUtils;
+import org.lcsim.hps.recon.ecal.HPSEcalCluster;
+
+/**
+ * Reads clusters and makes trigger decision using opposite quadrant criterion.
+ * Prints triggers to file if file path specified.
+ *
+ * @author Sho Uemura <[log in to unmask]>
+ * @version $Id: HPS1BitTriggerDriver.java,v 1.1 2013/02/25 22:39:25 meeg Exp $
+ */
+public class HPS1BitTriggerDriver extends HPSTriggerDriver {
+
+    public HPS1BitTriggerDriver() {
+    }
+
+    @Override
+    public boolean testTrigger(List<HPSEcalCluster> clusters) {
+
+        boolean quadrants[] = new boolean[4];
+
+        for (HPSEcalCluster clus : clusters) {
+//            int ix = clus.getSeedHit().getIdentifierFieldValue("ix");
+//            int iy = clus.getSeedHit().getIdentifierFieldValue("iy");
+            //System.out.printf("ix = %d, iy = %d\n", ix, iy);
+            quadrants[HPSECalUtils.getQuadrant(clus)] = true;
+        }
+        return (quadrants[0] && quadrants[2]) || (quadrants[1] && quadrants[3]);
+    }
+}

hps-java/sandbox
HPSEcalWindowDiscriminatorReadoutDriver.java added at 1.1
diff -N HPSEcalWindowDiscriminatorReadoutDriver.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ HPSEcalWindowDiscriminatorReadoutDriver.java	25 Feb 2013 22:39:25 -0000	1.1
@@ -0,0 +1,94 @@
+package org.lcsim.hps.readout.ecal;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.lcsim.event.CalorimeterHit;
+import org.lcsim.hps.recon.ecal.HPSECalUtils;
+import org.lcsim.hps.recon.ecal.HPSRawCalorimeterHit;
+import org.lcsim.hps.util.ClockSingleton;
+import org.lcsim.hps.util.RingBuffer;
+
+/**
+ * Performs readout of ECal hits.
+ * Simulates time evolution of preamp output pulse and leading-edge discriminator.
+ * Uses lower and upper thresholds, with upper discriminator acting as a veto.
+ *
+ *
+ * @author Sho Uemura <[log in to unmask]>
+ * @version $Id: HPSEcalWindowDiscriminatorReadoutDriver.java,v 1.1 2013/02/25 22:39:25 meeg Exp $
+ */
+public class HPSEcalWindowDiscriminatorReadoutDriver extends HPSEcalDiscriminatorReadoutDriver {
+    //last time we saw a rising edge
+
+    Map<Long, Double> lowTimeMap = null;
+    //last time we saw a rising edge
+    Map<Long, Double> highTimeMap = null;
+    double highThreshold = 10.0 * HPSECalUtils.GeV;
+
+    public HPSEcalWindowDiscriminatorReadoutDriver() {
+    }
+
+    public void setHighThreshold(double highThreshold) {
+        this.highThreshold = highThreshold;
+    }
+
+    @Override
+    protected void readHits(List<HPSRawCalorimeterHit> hits) {
+        for (Long cellID : lowTimeMap.keySet()) {
+            //if there's an output pulse, make a hit
+            if (ClockSingleton.getTime() - lowTimeMap.get(cellID) < outputWidth) {
+                if (highTimeMap.containsKey(cellID) && ClockSingleton.getTime() - highTimeMap.get(cellID) < outputWidth) {
+                    continue;
+                }
+                hits.add(new HPSRawCalorimeterHit(outputEnergy, readoutTime(), cellID, hitType));
+            }
+        }
+    }
+
+    @Override
+    protected void putHits(List<CalorimeterHit> hits) {
+        //fill the readout buffers
+        for (CalorimeterHit hit : hits) {
+//            int ix = dec.getValue("ix");
+//            int iy = dec.getValue("iy");
+//            //temporary hack to disable crystals and flip X coordinate
+//            int side = dec.getValue("side");
+//            if (iy == 1 && ix * side >= -10 && ix * side <= -2)
+//                continue;
+
+            RingBuffer eDepBuffer = eDepMap.get(hit.getCellID());
+            if (eDepBuffer == null) {
+                eDepBuffer = new RingBuffer(bufferLength);
+                eDepMap.put(hit.getCellID(), eDepBuffer);
+            }
+            for (int i = 0; i < bufferLength; i++) {
+                eDepBuffer.addToCell(i, hit.getRawEnergy() * pulseAmplitude(i * ClockSingleton.getDt() - hit.getTime()));
+            }
+        }
+
+        //check for rising edges
+        for (Long cellID : eDepMap.keySet()) {
+            RingBuffer eDepBuffer = eDepMap.get(cellID);
+            //if there's a rising edge between now and the next time step, note the time
+            if ((eDepBuffer.currentValue() < threshold)
+                    && (eDepBuffer.getValue(1) > threshold)) {
+                lowTimeMap.put(cellID, ClockSingleton.getTime());
+            }
+            if ((eDepBuffer.currentValue() < highThreshold)
+                    && (eDepBuffer.getValue(1) > highThreshold)) {
+                highTimeMap.put(cellID, ClockSingleton.getTime());
+            }
+            eDepBuffer.step();
+        }
+    }
+
+    @Override
+    protected void initReadout() {
+        //initialize buffers
+        eDepMap = new HashMap<Long, RingBuffer>();
+        lowTimeMap = new HashMap<Long, Double>();
+        highTimeMap = new HashMap<Long, Double>();
+    }
+}

hps-java/sandbox
HPSEcalDiscriminatorReadoutDriver.java added at 1.1
diff -N HPSEcalDiscriminatorReadoutDriver.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ HPSEcalDiscriminatorReadoutDriver.java	25 Feb 2013 22:39:25 -0000	1.1
@@ -0,0 +1,121 @@
+package org.lcsim.hps.readout.ecal;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.lcsim.event.CalorimeterHit;
+import org.lcsim.hps.recon.ecal.HPSECalUtils;
+import org.lcsim.hps.recon.ecal.HPSRawCalorimeterHit;
+import org.lcsim.hps.util.ClockSingleton;
+import org.lcsim.hps.util.RingBuffer;
+
+/**
+ * Performs readout of ECal hits.
+ * Simulates time evolution of preamp output pulse and leading-edge discriminator.
+ *
+ * @author Sho Uemura <[log in to unmask]>
+ * @version $Id: HPSEcalDiscriminatorReadoutDriver.java,v 1.1 2013/02/25 22:39:25 meeg Exp $
+ */
+public class HPSEcalDiscriminatorReadoutDriver extends HPSEcalReadoutDriver<HPSRawCalorimeterHit> {
+
+	//buffer for deposited energy
+	Map<Long, RingBuffer> eDepMap = null;
+	//last time we saw a rising edge
+	Map<Long, Double> edgeTimeMap = null;
+	//length of ring buffer (in multiples of bunch spacing)
+	int bufferLength = 200;
+	//shaper time constant in ns
+	double t0 = 18.0;
+	//discriminator output pulse width in ns
+	double outputWidth = 32.0;
+	//output hit "energy" in GeV
+	double outputEnergy = 10.0*HPSECalUtils.GeV;
+
+	public HPSEcalDiscriminatorReadoutDriver() {
+		hitClass = HPSRawCalorimeterHit.class;
+	}
+
+	public void setBufferLength(int bufferLength) {
+		this.bufferLength = bufferLength;
+		eDepMap = new HashMap<Long, RingBuffer>();
+	}
+
+	public void setOutputWidth(double outputWidth) {
+		this.outputWidth = outputWidth;
+	}
+
+	/*
+	 * Set shaper time constant.
+	 * Positive values interpreted as shaping time of CR-RC pulse;
+	 * negative values interpreted as width of rectangular pulse.
+	 */
+	public void setT0(double t0) {
+		this.t0 = t0;
+	}
+
+    @Override
+	protected void readHits(List<HPSRawCalorimeterHit> hits) {
+		for (Long cellID : edgeTimeMap.keySet()) {
+			//if there's an output pulse, make a hit
+			if (ClockSingleton.getTime() - edgeTimeMap.get(cellID) < outputWidth) {
+				hits.add(new HPSRawCalorimeterHit(outputEnergy, readoutTime(), cellID, hitType));
+			}
+		}
+	}
+
+    @Override
+	protected void putHits(List<CalorimeterHit> hits) {
+		//fill the readout buffers
+		for (CalorimeterHit hit : hits) {
+//            int ix = dec.getValue("ix");
+//            int iy = dec.getValue("iy");
+//            //temporary hack to disable crystals and flip X coordinate
+//            int side = dec.getValue("side");
+//            if (iy == 1 && ix * side >= -10 && ix * side <= -2)
+//                continue;
+
+			RingBuffer eDepBuffer = eDepMap.get(hit.getCellID());
+			if (eDepBuffer == null) {
+				eDepBuffer = new RingBuffer(bufferLength);
+				eDepMap.put(hit.getCellID(), eDepBuffer);
+			}
+			for (int i = 0; i < bufferLength; i++) {
+				eDepBuffer.addToCell(i, hit.getRawEnergy() * pulseAmplitude(i * ClockSingleton.getDt() - hit.getTime()));
+			}
+		}
+
+		//check for rising edges
+		for (Long cellID : eDepMap.keySet()) {
+			RingBuffer eDepBuffer = eDepMap.get(cellID);
+			//if there's a rising edge between now and the next time step, note the time
+			if ((eDepBuffer.currentValue() < threshold)
+					&& (eDepBuffer.getValue(1) > threshold))
+				edgeTimeMap.put(cellID, ClockSingleton.getTime());
+			eDepBuffer.step();
+		}
+	}
+
+    @Override
+	protected void initReadout() {
+		//initialize buffers
+		eDepMap = new HashMap<Long, RingBuffer>();
+		edgeTimeMap = new HashMap<Long, Double>();
+	}
+
+	/*
+	 * Pulse shape as a function of time; normalized to have a peak height of 1.
+	 */
+	protected double pulseAmplitude(double time) {
+		if (time < 0.0)
+			return 0.0;
+		if (t0 > 0.0) {
+			return (time / t0) * Math.exp(1.0 - time / t0);
+		} else {
+			if (time < -t0)
+				return 1.0;
+			else
+				return 0.0;
+		}
+	}
+}

hps-java/sandbox
HPSEcal1BitClusterer.java added at 1.1
diff -N HPSEcal1BitClusterer.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ HPSEcal1BitClusterer.java	25 Feb 2013 22:39:25 -0000	1.1
@@ -0,0 +1,380 @@
+package org.lcsim.hps.recon.ecal;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.lcsim.event.CalorimeterHit;
+import org.lcsim.event.Cluster;
+import org.lcsim.event.EventHeader;
+import org.lcsim.geometry.Detector;
+import org.lcsim.geometry.IDDecoder;
+import org.lcsim.geometry.subdetector.HPSEcal3.NeighborMap;
+import org.lcsim.geometry.subdetector.HPSEcal3;
+import org.lcsim.util.Driver;
+import org.lcsim.util.lcio.LCIOConstants;
+
+/**
+ * Creates clusters from CalorimeterHits in the HPSEcal detector.
+ *
+ * The clustering algorithm is from JLab Hall B 6 GeV DVCS Trigger Design doc.
+ *
+ * @author Jeremy McCormick <[log in to unmask]>
+ * @author Tim Nelson <[log in to unmask]>
+ * @author Sho Uemura <[log in to unmask]>
+ * @version $Id: HPSEcal1BitClusterer.java,v 1.1 2013/02/25 22:39:25 meeg Exp $
+ */
+public class HPSEcal1BitClusterer extends Driver {
+
+    HPSEcal3 ecal;
+    IDDecoder dec;
+    String ecalName;
+    String ecalCollectionName;
+    String vetoCollectionName;
+    String clusterCollectionName = "EcalClusters";
+    //set bounds for a range of crystals to turn off in the clusterer
+    int xMin = 0;
+    int xMax = 0;
+    Map<Long, Integer> hitCounts = null;
+    Map<Long, CalorimeterHit> hitMap = null;
+    // Threshold hit count for cluster. Cluster must have more than this many hits.
+    int clusterThreshold = 5;
+    // Map of crystals to their neighbors.
+    NeighborMap neighborMap = null;
+
+    public HPSEcal1BitClusterer() {
+    }
+
+    public void setClusterCollectionName(String clusterCollectionName) {
+        this.clusterCollectionName = clusterCollectionName;
+    }
+
+    public void setEcalCollectionName(String ecalCollectionName) {
+        this.ecalCollectionName = ecalCollectionName;
+    }
+
+    public void setVetoCollectionName(String vetoCollectionName) {
+        this.vetoCollectionName = vetoCollectionName;
+    }
+
+    public void setxMax(int xMax) {
+        this.xMax = xMax;
+    }
+
+    public void setxMin(int xMin) {
+        this.xMin = xMin;
+    }
+
+    public void setClusterThreshold(int clusterThreshold) {
+        this.clusterThreshold = clusterThreshold;
+    }
+
+    public void setEcalName(String ecalName) {
+        this.ecalName = ecalName;
+    }
+
+    @Override
+    public void startOfData() {
+        if (ecalCollectionName == null) {
+            throw new RuntimeException("The parameter ecalCollectionName was not set!");
+        }
+
+        if (ecalName == null) {
+            throw new RuntimeException("The parameter ecalName was not set!");
+        }
+    }
+
+    @Override
+    public void detectorChanged(Detector detector) {
+        // Get the Subdetector.
+        ecal = (HPSEcal3) detector.getSubdetector(ecalName);
+
+        // Get the decoder for the ECal IDs.
+        dec = ecal.getIDDecoder();
+
+        // Cache ref to neighbor map.
+        neighborMap = ecal.getNeighborMap();
+
+        //System.out.println(ecal.getName());
+        //System.out.println("  nx="+ecal.nx());
+        //System.out.println("  ny="+ecal.ny());
+        //System.out.println("  beamgap="+ecal.beamGap());
+        //System.out.println("  dface="+ecal.distanceToFace());
+
+        //System.out.println(neighborMap.toString());
+    }
+
+    @Override
+    public void process(EventHeader event) {
+        //System.out.println(this.getClass().getCanonicalName() + " - process");
+
+        // Get the list of raw ECal hits.
+        List<CalorimeterHit> hits = event.get(CalorimeterHit.class, ecalCollectionName);
+        if (hits == null) {
+            throw new RuntimeException("Event is missing ECal raw hits collection!");
+        }
+        List<CalorimeterHit> vetoHits = null;
+
+        // Get the list of raw ECal hits.
+        if (vetoCollectionName != null) {
+            vetoHits = event.get(CalorimeterHit.class, vetoCollectionName);
+            if (vetoHits == null) {
+                throw new RuntimeException("Event is missing ECal veto hits collection!");
+            }
+        }
+
+        countHits(hits, vetoHits);
+
+        // Put Cluster collection into event.
+        int flag = 1 << LCIOConstants.CLBIT_HITS;
+        event.put(clusterCollectionName, createClusters(), Cluster.class, flag);
+    }
+
+    public void countHits(List<CalorimeterHit> hits, List<CalorimeterHit> vetoHits) {
+        // Hit map.
+        hitMap = new HashMap<Long, CalorimeterHit>();
+        HashMap<Long, CalorimeterHit> vetoMap = new HashMap<Long, CalorimeterHit>();
+
+        if (vetoHits != null) {
+            for (CalorimeterHit hit : vetoHits) {
+                vetoMap.put(hit.getCellID(), hit);
+            }
+        }
+
+        hitCounts = new HashMap<Long, Integer>();
+        // Loop over ECal hits to count hit towers
+        for (CalorimeterHit hit : hits) {
+            if (vetoMap.get(hit.getCellID()) != null) {
+                continue;
+            }
+
+            int ix = hit.getIdentifierFieldValue("ix");
+            if (ix >= xMin && ix <= xMax) {
+                continue;
+            }
+
+            // Make a hit map for quick lookup by ID.
+            hitMap.put(hit.getCellID(), hit);
+
+            // Get neighbor crystal IDs.
+            Set<Long> neighbors = neighborMap.get(hit.getCellID());
+
+            if (neighbors == null) {
+                throw new RuntimeException("Oops!  Set of neighbors is null!");
+            }
+
+            Integer hitCount = hitCounts.get(hit.getCellID());
+            if (hitCount == null) {
+                hitCounts.put(hit.getCellID(), 1);
+            } else {
+                hitCounts.put(hit.getCellID(), hitCount + 1);
+            }
+
+            // Loop over neighbors to make hit list for cluster.
+            for (Long neighborId : neighbors) {
+                hitCount = hitCounts.get(neighborId);
+                if (hitCount == null) {
+                    hitCounts.put(neighborId, 1);
+                } else {
+                    hitCounts.put(neighborId, hitCount + 1);
+                }
+            }
+        }
+    }
+
+    public List<Cluster> createClusters() {
+        // New Cluster list to be added to event.
+        List<Cluster> clusters = new ArrayList<Cluster>();
+
+        //for each crystal with a nonzero hit count, test for cluster
+        for (Long possibleCluster : hitCounts.keySet()) {
+            //System.out.printf("%d, %d hits\n",possibleCluster,hitCounts.get(possibleCluster));
+            if (hitCounts.get(possibleCluster) <= clusterThreshold) {
+                continue;
+            }
+
+            // Get neighbor crystal IDs.
+            Set<Long> neighbors = neighborMap.get(possibleCluster);
+
+            if (neighbors == null) {
+                throw new RuntimeException("Oops!  Set of neighbors is null!");
+            }
+
+            //Apply peak detector scheme.
+            // Set the ID.
+            dec.setID(possibleCluster);
+            // Get ID field values.
+            int x1 = dec.getValue("ix");
+            int y1 = dec.getValue("iy");
+            Integer hitCount = hitCounts.get(possibleCluster);
+
+            //System.out.printf("Possible cluster: x: %d, y: %d, hits: %d\n",x1,y1,hitCount);
+            boolean isCluster = true;
+            for (Long neighborId : neighbors) {
+                // Set the ID.
+                dec.setID(neighborId);
+                Integer neighborHitCount = hitCounts.get(neighborId);
+                if (neighborHitCount == null) {
+                    continue;
+                }
+                // Get ID field values.
+                int x2 = dec.getValue("ix");
+                int y2 = dec.getValue("iy");
+                if (y1 > 0) {
+                    if (x1 > 0) {
+                        //quadrant 1
+                        if (x1 == 1) {
+                            //special case: left edge of quadrant
+                            if (x1 > x2 && y1 < y2) {
+                                if (hitCount > neighborHitCount) {
+                                    continue;
+                                }
+                            } else if (x1 > x2) {
+                                if (hitCount >= neighborHitCount) {
+                                    continue;
+                                }
+                            } else if (x1 < x2) {
+                                if (hitCount > neighborHitCount) {
+                                    continue;
+                                }
+                            } else if (y1 < y2) {
+                                if (hitCount >= neighborHitCount) {
+                                    continue;
+                                }
+                            } else {
+                                if (hitCount > neighborHitCount) {
+                                    continue;
+                                }
+                            }
+                        } else {
+                            if (x1 > x2) {
+                                if (hitCount >= neighborHitCount) {
+                                    continue;
+                                }
+                            } else if (x1 < x2) {
+                                if (hitCount > neighborHitCount) {
+                                    continue;
+                                }
+                            } else if (y1 < y2) {
+                                if (hitCount >= neighborHitCount) {
+                                    continue;
+                                }
+                            } else {
+                                if (hitCount > neighborHitCount) {
+                                    continue;
+                                }
+                            }
+                        }
+                    } else {
+                        //quadrant 2
+                        if (y1 > y2) {
+                            if (hitCount >= neighborHitCount) {
+                                continue;
+                            }
+                        } else if (y1 < y2) {
+                            if (hitCount > neighborHitCount) {
+                                continue;
+                            }
+                        } else if (x1 > x2) {
+                            if (hitCount >= neighborHitCount) {
+                                continue;
+                            }
+                        } else {
+                            if (hitCount > neighborHitCount) {
+                                continue;
+                            }
+                        }
+                    }
+                } else {
+                    if (x1 < 0) {
+                        //quadrant 3
+                        if (x1 == 1) {
+                            //special case: left edge of quadrant
+                            if (x1 < x2 && y1 > y2) {
+                                if (hitCount > neighborHitCount) {
+                                    continue;
+                                }
+                            } else if (x1 < x2) {
+                                if (hitCount >= neighborHitCount) {
+                                    continue;
+                                }
+                            } else if (x1 > x2) {
+                                if (hitCount > neighborHitCount) {
+                                    continue;
+                                }
+                            } else if (y1 > y2) {
+                                if (hitCount >= neighborHitCount) {
+                                    continue;
+                                }
+                            } else {
+                                if (hitCount > neighborHitCount) {
+                                    continue;
+                                }
+                            }
+                        } else {
+                            if (x1 < x2) {
+                                if (hitCount >= neighborHitCount) {
+                                    continue;
+                                }
+                            } else if (x1 > x2) {
+                                if (hitCount > neighborHitCount) {
+                                    continue;
+                                }
+                            } else if (y1 > y2) {
+                                if (hitCount >= neighborHitCount) {
+                                    continue;
+                                }
+                            } else {
+                                if (hitCount > neighborHitCount) {
+                                    continue;
+                                }
+                            }
+                        }
+                    } else {
+                        //quadrant 4
+                        if (y1 < y2) {
+                            if (hitCount >= neighborHitCount) {
+                                continue;
+                            }
+                        } else if (y1 > y2) {
+                            if (hitCount > neighborHitCount) {
+                                continue;
+                            }
+                        } else if (x1 < x2) {
+                            if (hitCount >= neighborHitCount) {
+                                continue;
+                            }
+                        } else {
+                            if (hitCount > neighborHitCount) {
+                                continue;
+                            }
+                        }
+                    }
+                }
+                isCluster = false;
+                break;
+            }
+
+            if (isCluster) {
+                //System.out.printf("Cluster: x: %d, y: %d, side:%d, hits: %d\n",x1,y1,side1,hitCount);
+                HPSEcalCluster cluster = new HPSEcalCluster(possibleCluster);
+                CalorimeterHit hit = hitMap.get(possibleCluster);
+                if (hit != null /*&& hit.getRawEnergy() > hitEMin && hit.getRawEnergy() < hitEMax*/) {
+                    cluster.addHit(hit);
+                }
+
+                for (Long neighborId : neighbors) {
+                    // Find the neighbor hit in the event if it exists.
+                    hit = hitMap.get(neighborId);
+                    if (hit != null /*&& hit.getRawEnergy() > hitEMin && hit.getRawEnergy() < hitEMax*/) {
+                        cluster.addHit(hit);
+                    }
+                }
+                clusters.add(cluster);
+            }
+        }
+        return clusters;
+    }
+}

hps-java/sandbox
HPSEcal1BitClusterVetoClusterer.java added at 1.1
diff -N HPSEcal1BitClusterVetoClusterer.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ HPSEcal1BitClusterVetoClusterer.java	25 Feb 2013 22:39:25 -0000	1.1
@@ -0,0 +1,81 @@
+package org.lcsim.hps.recon.ecal;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Set;
+
+import org.lcsim.event.CalorimeterHit;
+
+/**
+ * Creates clusters from CalorimeterHits in the HPSEcal detector.
+ *
+ * A veto hit vetoes clusters in the crystal with the veto hit and all its neighbors.
+ *
+ * The clustering algorithm is from JLab Hall B 6 GeV DVCS Trigger Design doc.
+ *
+ * @author Sho Uemura <[log in to unmask]>
+ * @version $Id: HPSEcal1BitClusterVetoClusterer.java,v 1.1 2013/02/25 22:39:25 meeg Exp $
+ */
+public class HPSEcal1BitClusterVetoClusterer extends HPSEcal1BitClusterer {
+
+    public HPSEcal1BitClusterVetoClusterer() {
+    }
+
+    @Override
+    public void countHits(List<CalorimeterHit> hits, List<CalorimeterHit> vetoHits) {
+        // Hit map.
+        hitMap = new HashMap<Long, CalorimeterHit>();
+
+        hitCounts = new HashMap<Long, Integer>();
+        // Loop over ECal hits to count hit towers
+        for (CalorimeterHit hit : hits) {
+            int ix = hit.getIdentifierFieldValue("ix");
+            if (ix >= xMin && ix <= xMax) {
+                continue;
+            }
+
+            // Make a hit map for quick lookup by ID.
+            hitMap.put(hit.getCellID(), hit);
+
+            // Get neighbor crystal IDs.
+            Set<Long> neighbors = neighborMap.get(hit.getCellID());
+
+            if (neighbors == null) {
+                throw new RuntimeException("Oops!  Set of neighbors is null!");
+            }
+
+            Integer hitCount = hitCounts.get(hit.getCellID());
+            if (hitCount == null) {
+                hitCounts.put(hit.getCellID(), 1);
+            } else {
+                hitCounts.put(hit.getCellID(), hitCount + 1);
+            }
+
+            // Loop over neighbors to make hit list for cluster.
+            for (Long neighborId : neighbors) {
+                hitCount = hitCounts.get(neighborId);
+                if (hitCount == null) {
+                    hitCounts.put(neighborId, 1);
+                } else {
+                    hitCounts.put(neighborId, hitCount + 1);
+                }
+            }
+        }
+        if (vetoHits != null) {
+            for (CalorimeterHit hit : vetoHits) {
+                //Get neighbor crystal IDs.
+                Set<Long> neighbors = neighborMap.get(hit.getCellID());
+
+                if (neighbors == null) {
+                    throw new RuntimeException("Oops!  Set of neighbors is null!");
+                }
+
+                // Veto the hit towers for the vetoed crystal and all neighbors.
+                hitCounts.remove(hit.getCellID());
+                for (Long neighborId : neighbors) {
+                    hitCounts.remove(neighborId);
+                }
+            }
+        }
+    }
+}

hps-java/sandbox
HPSEcal1BitEventVetoClusterer.java added at 1.1
diff -N HPSEcal1BitEventVetoClusterer.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ HPSEcal1BitEventVetoClusterer.java	25 Feb 2013 22:39:25 -0000	1.1
@@ -0,0 +1,69 @@
+package org.lcsim.hps.recon.ecal;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Set;
+
+import org.lcsim.event.CalorimeterHit;
+
+/**
+ * Creates clusters from CalorimeterHits in the HPSEcal detector.
+ *
+ * A veto hit vetoes all clusters in the event.
+ *
+ * The clustering algorithm is from JLab Hall B 6 GeV DVCS Trigger Design doc.
+ *
+ * @author Sho Uemura <[log in to unmask]>
+ * @version $Id: HPSEcal1BitEventVetoClusterer.java,v 1.1 2013/02/25 22:39:25 meeg Exp $
+ */
+public class HPSEcal1BitEventVetoClusterer extends HPSEcal1BitClusterer {
+
+    public HPSEcal1BitEventVetoClusterer() {
+    }
+
+    @Override
+    public void countHits(List<CalorimeterHit> hits, List<CalorimeterHit> vetoHits) {
+        // Hit map.
+        hitMap = new HashMap<Long, CalorimeterHit>();
+
+        hitCounts = new HashMap<Long, Integer>();
+        if (vetoHits != null && !vetoHits.isEmpty()) {
+            return;
+        }
+
+        // Loop over ECal hits to count hit towers
+        for (CalorimeterHit hit : hits) {
+            int ix = hit.getIdentifierFieldValue("ix");
+            if (ix >= xMin && ix <= xMax) {
+                continue;
+            }
+
+            // Make a hit map for quick lookup by ID.
+            hitMap.put(hit.getCellID(), hit);
+
+            // Get neighbor crystal IDs.
+            Set<Long> neighbors = neighborMap.get(hit.getCellID());
+
+            if (neighbors == null) {
+                throw new RuntimeException("Oops!  Set of neighbors is null!");
+            }
+
+            Integer hitCount = hitCounts.get(hit.getCellID());
+            if (hitCount == null) {
+                hitCounts.put(hit.getCellID(), 1);
+            } else {
+                hitCounts.put(hit.getCellID(), hitCount + 1);
+            }
+
+            // Loop over neighbors to make hit list for cluster.
+            for (Long neighborId : neighbors) {
+                hitCount = hitCounts.get(neighborId);
+                if (hitCount == null) {
+                    hitCounts.put(neighborId, 1);
+                } else {
+                    hitCounts.put(neighborId, hitCount + 1);
+                }
+            }
+        }
+    }
+}

hps-java/sandbox
HPSFADCSingleTriggerDriver.java added at 1.1
diff -N HPSFADCSingleTriggerDriver.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ HPSFADCSingleTriggerDriver.java	25 Feb 2013 22:39:25 -0000	1.1
@@ -0,0 +1,128 @@
+package org.lcsim.hps.recon.ecal;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.lcsim.event.EventHeader;
+import org.lcsim.hps.evio.TriggerData;
+import org.lcsim.hps.util.ClockSingleton;
+
+/**
+ * Reads clusters and makes trigger decision using opposite quadrant criterion.
+ * Prints triggers to file if file path specified.
+ * TODO: Redundant with TestRunTriggerDriver.
+ *
+ * @author Omar Moreno <[log in to unmask]>
+ * @author Sho Uemura <[log in to unmask]>
+ * @author Per Hansson Adrian <[log in to unmask]>
+ * @version $Id: HPSFADCSingleTriggerDriver.java,v 1.1 2013/02/25 22:39:25 meeg Exp $
+ */
+public class HPSFADCSingleTriggerDriver extends HPSTriggerDriver {
+    // A list to contain all cluster pairs in an event
+    List<HPSEcalCluster[]> clusterPairs;
+    int nTriggers;
+    int totalEvents;
+    private double clusterEnergyHigh = 1.85 * HPSECalUtils.GeV; // GeV
+    private double clusterEnergyLow = .1 * HPSECalUtils.GeV;    // GeV
+    int allClusters;
+    int clusterEnergyCount;
+    int deadtimelessTriggerCount;
+
+    public HPSFADCSingleTriggerDriver() {
+        clusterPairs = new LinkedList<HPSEcalCluster[]>();
+    }
+
+    @Override
+    public void startOfData() {
+        super.startOfData();
+
+        allClusters = 0;
+        clusterEnergyCount = 0;
+        deadtimelessTriggerCount = 0;
+    }
+
+    @Override
+    public boolean testTrigger(List<HPSEcalCluster> clusters) {
+        boolean trigger = false;
+
+        //--- Apply Trigger Cuts ---//
+
+        // Iterate through all clusters present in the event.  
+        //If at least one of the clusters satisfies all of the trigger conditions,
+        // a trigger signal is sent to all other detectors.
+        for (HPSEcalCluster cluster : clusters) {
+            
+            
+            if (outputStream != null) {
+                outputStream.printf("Event %d: cluster energy %f in quadrant %d (%s)\n",
+                        ClockSingleton.getClock(),
+                        cluster.getEnergy(), HPSECalUtils.getQuadrant(cluster),cluster.getSeedHit().getPositionVec().toString());
+                        
+            }
+            
+            allClusters++;
+            
+          
+            // Require the componets of a cluster pair to have an energy in
+            // the range of 100 MeV to 1.85 GeV
+            if (!clusterECut(cluster)) {
+                if (outputStream != null) {
+                    outputStream.println("Failed cluster energy cut");
+                }
+                continue;
+            }
+            clusterEnergyCount++;
+
+            // If all cuts are pased, we have a trigger
+            if (outputStream != null) {
+                outputStream.println("Passed all cuts");
+            }
+            trigger = true;
+        }
+        if (trigger) {
+            deadtimelessTriggerCount++;
+        }
+        return trigger;
+    }
+
+    @Override
+    public void endOfData() {
+        if (outputStream != null) {
+            outputStream.printf("%s: Number of clusters: %d\n",this.getClass().getSimpleName(),allClusters);
+            outputStream.printf("%s: Number of cluster pairs after successive trigger conditions:\n",this.getClass().getSimpleName());
+            outputStream.printf("%s: Cluster energy: %d\n",this.getClass().getSimpleName(), clusterEnergyCount);
+            outputStream.printf("%s: Trigger count without dead time: %d\n",this.getClass().getSimpleName(), deadtimelessTriggerCount);
+            outputStream.printf("%s: Trigger count: %d\n",this.getClass().getSimpleName(), numTriggers);
+            outputStream.close();
+        }
+        System.out.printf("%s: Number of pairs: %d\n",this.getClass().getSimpleName(),allClusters);
+        System.out.printf("%s: Number of cluster pairs after successive trigger conditions:\n",this.getClass().getSimpleName());
+        System.out.printf("%s: Cluster energy: %d\n",this.getClass().getSimpleName(), clusterEnergyCount);
+        System.out.printf("%s: Trigger count without dead time: %d\n",this.getClass().getSimpleName(), deadtimelessTriggerCount);
+        System.out.printf("%s: Trigger count: %d\n",this.getClass().getSimpleName(), numTriggers);
+        super.endOfData();
+    }
+
+    /**
+     * Checks if the ECal clusters making up a cluster pair lie above the low
+     * energy threshold and below the high energy threshold
+     *
+     * @param clusterPair : pair of clusters
+     * @return true if a pair is found, false otherwise
+     */
+    private boolean clusterECut(HPSEcalCluster cluster) {
+        return (cluster.getEnergy() < clusterEnergyHigh && cluster.getEnergy() > clusterEnergyLow);
+    }
+
+    /**
+     * Make a dummy TriggerData
+     */
+    @Override
+    protected void makeTriggerData(EventHeader event, String collectionName) {
+        TriggerData tData = new TriggerData(new int[8]);
+        List<TriggerData> triggerList = new ArrayList<TriggerData>();
+        triggerList.add(tData);
+        event.put(collectionName, triggerList, TriggerData.class, 0);
+    }
+}
\ No newline at end of file

hps-java/src/main/java/org/lcsim/hps/evio
ECalHitWriter.java 1.3 -> 1.4
diff -u -r1.3 -r1.4
--- ECalHitWriter.java	16 Aug 2012 01:06:30 -0000	1.3
+++ ECalHitWriter.java	25 Feb 2013 22:39:25 -0000	1.4
@@ -14,7 +14,7 @@
 import org.lcsim.event.EventHeader;
 import org.lcsim.event.RawCalorimeterHit;
 import org.lcsim.geometry.IDDecoder;
-import org.lcsim.hps.recon.ecal.HPSEcalConditions;
+import org.lcsim.hps.recon.ecal.EcalConditions;
 
 import static org.lcsim.hps.evio.EventConstants.ECAL_BANK_NUMBER;
 import static org.lcsim.hps.evio.EventConstants.ECAL_BOTTOM_BANK_TAG;
@@ -25,7 +25,7 @@
 /**
  *
  * @author Sho Uemura <[log in to unmask]>
- * @version $Id: ECalHitWriter.java,v 1.3 2012/08/16 01:06:30 meeg Exp $
+ * @version $Id: ECalHitWriter.java,v 1.4 2013/02/25 22:39:25 meeg Exp $
  */
 public class ECalHitWriter implements HitWriter {
 
@@ -88,8 +88,8 @@
         List<Object> topHits = new ArrayList<Object>();
         List<Object> bottomHits = new ArrayList<Object>();
         for (Object hit : rawCalorimeterHits) {
-            Long daqID = HPSEcalConditions.physicalToDaqID(getCellID(hit));
-            int crate = HPSEcalConditions.getCrate(daqID);
+            Long daqID = EcalConditions.physicalToDaqID(getCellID(hit));
+            int crate = EcalConditions.getCrate(daqID);
             if (crate == ECAL_BOTTOM_BANK_TAG) {
                 bottomHits.add(hit);
             } else {
@@ -165,7 +165,7 @@
         }
 
         // Get the ID decoder.
-        IDDecoder dec = HPSEcalConditions.getSubdetector().getIDDecoder();
+        IDDecoder dec = EcalConditions.getSubdetector().getIDDecoder();
 
         // Make a hit map; allow for multiple hits in a crystal.
         Map<Long, List<RawCalorimeterHit>> hitMap = new HashMap<Long, List<RawCalorimeterHit>>();
@@ -184,9 +184,9 @@
             dec.setID(id);
 //			System.out.println(dec.getIDDescription());
 //			System.out.printf("ix = %d, iy = %d\n", dec.getValue("ix"), dec.getValue("iy"));
-            Long daqID = HPSEcalConditions.physicalToDaqID(id);
+            Long daqID = EcalConditions.physicalToDaqID(id);
 //			System.out.printf("physicalID %d, daqID %d\n", id, daqID);
-            int slot = HPSEcalConditions.getSlot(daqID);
+            int slot = EcalConditions.getSlot(daqID);
             if (slotMap.get(slot) == null) {
                 slotMap.put(slot, new ArrayList<Long>());
             }
@@ -210,7 +210,7 @@
             data.addN(nhits); // number of channels
             for (Long id : hitIDs) {
                 dec.setID(id);
-                int channel = HPSEcalConditions.getChannel(HPSEcalConditions.physicalToDaqID(id));
+                int channel = EcalConditions.getChannel(EcalConditions.physicalToDaqID(id));
                 data.addUchar((byte) channel); // channel #
                 List<RawCalorimeterHit> channelHits = hitMap.get(id);
                 data.addN(channelHits.size()); // number of pulses
@@ -244,7 +244,7 @@
         }
 
         // Get the ID decoder.
-        IDDecoder dec = HPSEcalConditions.getSubdetector().getIDDecoder();
+        IDDecoder dec = EcalConditions.getSubdetector().getIDDecoder();
 
         // Make a hit map; allow for multiple hits in a crystal.
         Map<Long, List<RawTrackerHit>> hitMap = new HashMap<Long, List<RawTrackerHit>>();
@@ -263,9 +263,9 @@
             dec.setID(id);
 //			System.out.println(dec.getIDDescription());
 //			System.out.printf("ix = %d, iy = %d\n", dec.getValue("ix"), dec.getValue("iy"));
-            Long daqID = HPSEcalConditions.physicalToDaqID(id);
+            Long daqID = EcalConditions.physicalToDaqID(id);
 //			System.out.printf("physicalID %d, daqID %d\n", id, daqID);
-            int slot = HPSEcalConditions.getSlot(daqID);
+            int slot = EcalConditions.getSlot(daqID);
             if (slotMap.get(slot) == null) {
                 slotMap.put(slot, new ArrayList<Long>());
             }
@@ -294,7 +294,7 @@
             data.addN(nhits); // number of channels
             for (Long id : hitIDs) {
                 dec.setID(id);
-                int channel = HPSEcalConditions.getChannel(HPSEcalConditions.physicalToDaqID(id));
+                int channel = EcalConditions.getChannel(EcalConditions.physicalToDaqID(id));
                 data.addUchar((byte) channel); // channel #
                 List<RawTrackerHit> channelHits = hitMap.get(id);
                 data.addN(channelHits.size()); // number of pulses
@@ -331,7 +331,7 @@
         }
 
         // Get the ID decoder.
-        IDDecoder dec = HPSEcalConditions.getSubdetector().getIDDecoder();
+        IDDecoder dec = EcalConditions.getSubdetector().getIDDecoder();
 
         // Make a hit map; allow for multiple hits in a crystal.
         Map<Long, RawTrackerHit> hitMap = new HashMap<Long, RawTrackerHit>();
@@ -346,9 +346,9 @@
             dec.setID(id);
 //			System.out.println(dec.getIDDescription());
 //			System.out.printf("ix = %d, iy = %d\n", dec.getValue("ix"), dec.getValue("iy"));
-            Long daqID = HPSEcalConditions.physicalToDaqID(id);
+            Long daqID = EcalConditions.physicalToDaqID(id);
 //			System.out.printf("physicalID %d, daqID %d\n", id, daqID);
-            int slot = HPSEcalConditions.getSlot(daqID);
+            int slot = EcalConditions.getSlot(daqID);
             if (slotMap.get(slot) == null) {
                 slotMap.put(slot, new ArrayList<Long>());
             }
@@ -377,7 +377,7 @@
             data.addN(nhits); // number of channels
             for (Long id : hitIDs) {
                 dec.setID(id);
-                int channel = HPSEcalConditions.getChannel(HPSEcalConditions.physicalToDaqID(id));
+                int channel = EcalConditions.getChannel(EcalConditions.physicalToDaqID(id));
                 data.addUchar((byte) channel); // channel #
                 RawTrackerHit hit = hitMap.get(id);
                 data.addN(hit.getADCValues().length); // number of samples
@@ -414,7 +414,7 @@
 
     @Override
     public void writeData(EventHeader event, EventHeader toEvent) {
-        String readoutName = HPSEcalConditions.getSubdetector().getReadout().getName();
+        String readoutName = EcalConditions.getSubdetector().getReadout().getName();
         switch (mode) {
             case EventConstants.ECAL_WINDOW_MODE:
             case EventConstants.ECAL_PULSE_MODE:

hps-java/src/main/java/org/lcsim/hps/evio
TestRunTriggeredReconToEvio.java 1.21 -> 1.22
diff -u -r1.21 -r1.22
--- TestRunTriggeredReconToEvio.java	21 Sep 2012 23:22:18 -0000	1.21
+++ TestRunTriggeredReconToEvio.java	25 Feb 2013 22:39:25 -0000	1.22
@@ -8,9 +8,9 @@
 import java.util.Queue;
 import org.jlab.coda.jevio.*;
 import org.lcsim.event.EventHeader;
-import org.lcsim.hps.monitoring.HPSCalibrationDriver;
-import org.lcsim.hps.recon.ecal.HPSEcalConditions;
-import org.lcsim.hps.recon.ecal.HPSTriggerDriver;
+import org.lcsim.hps.monitoring.CalibrationDriver;
+import org.lcsim.hps.recon.ecal.EcalConditions;
+import org.lcsim.hps.readout.ecal.TriggerDriver;
 import org.lcsim.util.Driver;
 
 /**
@@ -28,7 +28,7 @@
     Queue<QueuedEtEvent> builderQueue = null;
     private int eventsWritten = 0;
     private int eventNum = 0;
-    HPSEcalConditions ecalIDConverter = null;
+    EcalConditions ecalIDConverter = null;
     ECalHitWriter ecalWriter = null;
     SVTHitWriter_RTH svtWriter = null;
     TriggerDataWriter triggerWriter = null;
@@ -99,7 +99,7 @@
 
     @Override
     protected void process(EventHeader event) {
-        if (HPSTriggerDriver.triggerBit()) {
+        if (TriggerDriver.triggerBit()) {
             // Make a new EVIO event.
             EventBuilder builder = new EventBuilder(EventConstants.PHYSICS_EVENT_TAG, DataType.BANK, EventConstants.EVENT_BANK_NUM);
             builderQueue.add(new QueuedEtEvent(builder, writers.size(), eventNum));
@@ -164,7 +164,7 @@
         EventBuilder builder = new EventBuilder(EventConstants.PRESTART_EVENT_TAG, DataType.UINT32, EventConstants.EVENT_BANK_NUM);
         int[] prestartData = new int[3];
         prestartData[0] = EventConstants.MC_TIME; //Unix time in seconds - this value for MC data
-        prestartData[1] = HPSCalibrationDriver.runNumber(); //run number
+        prestartData[1] = CalibrationDriver.runNumber(); //run number
         prestartData[2] = 0; //run type
 
         try {

hps-java/src/main/java/org/lcsim/hps/evio
TestRunTriggeredReconToLcio.java 1.10 -> 1.11
diff -u -r1.10 -r1.11
--- TestRunTriggeredReconToLcio.java	14 Dec 2012 01:29:31 -0000	1.10
+++ TestRunTriggeredReconToLcio.java	25 Feb 2013 22:39:25 -0000	1.11
@@ -13,8 +13,8 @@
 import org.lcsim.event.SimCalorimeterHit;
 import org.lcsim.event.SimTrackerHit;
 import org.lcsim.hps.conditions.QuietBaseLCSimEvent;
-import org.lcsim.hps.monitoring.HPSCalibrationDriver;
-import org.lcsim.hps.recon.ecal.HPSTriggerDriver;
+import org.lcsim.hps.monitoring.CalibrationDriver;
+import org.lcsim.hps.readout.ecal.TriggerDriver;
 import org.lcsim.util.Driver;
 import org.lcsim.util.lcio.LCIOWriter;
 
@@ -111,8 +111,8 @@
         }
 
 
-        if (HPSTriggerDriver.triggerBit()) {
-            EventHeader lcsimEvent = new QuietBaseLCSimEvent(HPSCalibrationDriver.runNumber(), event.getEventNumber(), event.getDetectorName());
+        if (TriggerDriver.triggerBit()) {
+            EventHeader lcsimEvent = new QuietBaseLCSimEvent(CalibrationDriver.runNumber(), event.getEventNumber(), event.getDetectorName());
             events.add(lcsimEvent);
             System.out.println("Creating LCIO event " + eventNum);
             lcsimEvent.put(MCEvent.MC_PARTICLES, mcParticles);

hps-java/src/main/java/org/lcsim/hps/evio
ECalEvioReader.java 1.21 -> 1.22
diff -u -r1.21 -r1.22
--- ECalEvioReader.java	21 Sep 2012 23:22:18 -0000	1.21
+++ ECalEvioReader.java	25 Feb 2013 22:39:25 -0000	1.22
@@ -9,12 +9,12 @@
 import org.lcsim.event.SimTrackerHit;
 import org.lcsim.event.base.BaseRawCalorimeterHit;
 import org.lcsim.event.base.BaseRawTrackerHit;
-import org.lcsim.hps.recon.ecal.HPSEcalConditions;
+import org.lcsim.hps.recon.ecal.EcalConditions;
 
 /**
  *
  * @author Sho Uemura <[log in to unmask]>
- * @version $Id: ECalEvioReader.java,v 1.21 2012/09/21 23:22:18 meeg Exp $
+ * @version $Id: ECalEvioReader.java,v 1.22 2013/02/25 22:39:25 meeg Exp $
  */
 public class ECalEvioReader extends EvioReader {
     // Names of subdetectors.
@@ -81,7 +81,7 @@
                 }
             }
         }
-        String readoutName = HPSEcalConditions.getSubdetector().getReadout().getName();
+        String readoutName = EcalConditions.getSubdetector().getReadout().getName();
         lcsimEvent.put(hitCollectionName, hits, hitClass, 0, readoutName);
 //        for (Object hit : hits) {
 //            System.out.println(((RawTrackerHit) hit).getIDDecoder().getIDDescription().toString());
@@ -116,7 +116,7 @@
                 if (debug) {
                     System.out.println("  channel=" + channel + "; nSamples=" + nSamples);
                 }
-                Long id = HPSEcalConditions.daqToPhysicalID(crate, slot, channel);
+                Long id = EcalConditions.daqToPhysicalID(crate, slot, channel);
 
                 short[] adcValues = new short[nSamples];
                 for (int i = 0; i < nSamples; i++) {
@@ -125,7 +125,7 @@
                 if (id == null) {
                     System.out.printf("Crate %d, slot %d, channel %d not found in map\n", crate, slot, channel);
                 } else {
-                    hits.add(new BaseRawTrackerHit(0, id, adcValues, new ArrayList<SimTrackerHit>(), HPSEcalConditions.getSubdetector().getDetectorElement().findDetectorElement(new Identifier(id)).get(0)));
+                    hits.add(new BaseRawTrackerHit(0, id, adcValues, new ArrayList<SimTrackerHit>(), EcalConditions.getSubdetector().getDetectorElement().findDetectorElement(new Identifier(id)).get(0)));
                 }
             }
         }
@@ -158,7 +158,7 @@
                 if (debug) {
                     System.out.println("  channel=" + channel + "; npulses=" + npulses);
                 }
-                Long id = HPSEcalConditions.daqToPhysicalID(crate, slot, channel);
+                Long id = EcalConditions.daqToPhysicalID(crate, slot, channel);
                 for (int k = 0; k < npulses; k++) {
                     short pulseNum = cdata.getByte();
                     int sampleCount = cdata.getNValue();
@@ -169,7 +169,7 @@
                     if (id == null) {
                         System.out.printf("Crate %d, slot %d, channel %d not found in map\n", crate, slot, channel);
                     } else {
-                        hits.add(new BaseRawTrackerHit(pulseNum, id, adcValues, new ArrayList<SimTrackerHit>(), HPSEcalConditions.getSubdetector().getDetectorElement().findDetectorElement(new Identifier(id)).get(0)));
+                        hits.add(new BaseRawTrackerHit(pulseNum, id, adcValues, new ArrayList<SimTrackerHit>(), EcalConditions.getSubdetector().getDetectorElement().findDetectorElement(new Identifier(id)).get(0)));
                     }
                 }
             }
@@ -203,7 +203,7 @@
                 if (debug) {
                     System.out.println("  channel=" + channel + "; npulses=" + npulses);
                 }
-                Long id = HPSEcalConditions.daqToPhysicalID(crate, slot, channel);
+                Long id = EcalConditions.daqToPhysicalID(crate, slot, channel);
 
                 for (int k = 0; k < npulses; k++) {
                     short pulseTime = cdata.getShort();

hps-java/src/main/java/org/lcsim/hps/evio
TestRunEvioToLcio.java 1.24 -> 1.25
diff -u -r1.24 -r1.25
--- TestRunEvioToLcio.java	6 Nov 2012 03:56:55 -0000	1.24
+++ TestRunEvioToLcio.java	25 Feb 2013 22:39:25 -0000	1.25
@@ -17,7 +17,7 @@
 import org.lcsim.event.EventHeader;
 import org.lcsim.geometry.util.DetectorLocator;
 import org.lcsim.hps.monitoring.RunControlDialog;
-import org.lcsim.hps.recon.ecal.HPSEcalConditions;
+import org.lcsim.hps.recon.ecal.EcalConditions;
 import org.lcsim.job.JobControlManager;
 import org.lcsim.util.lcio.LCIOWriter;
 
@@ -174,7 +174,7 @@
         LCSimEventBuilder eventBuilder = new LCSimTestRunEventBuilder();
         eventBuilder.setDetectorName(detectorName);
 
-        HPSEcalConditions.loadDaqMap(DetectorLocator.findDetector(detectorName), "Ecal");
+        EcalConditions.loadDaqMap(DetectorLocator.findDetector(detectorName), "Ecal");
 
         for (String evioFileName : cl.getArgs()) {
             // EVIO input file.

hps-java/src/main/resources/org/lcsim/hps/steering/readout
TestRunNoPileup.lcsim added at 1.1
diff -N TestRunNoPileup.lcsim
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ TestRunNoPileup.lcsim	25 Feb 2013 22:39:25 -0000	1.1
@@ -0,0 +1,53 @@
+
+<lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
+       xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd">       
+    <control>
+        <printInputFiles>true</printInputFiles>
+        <printDriversDetailed>true</printDriversDetailed>
+    </control>    
+    <execute>
+        <driver name="EventMarkerDriver"/>
+        <driver name="CalibrationDriver"/>
+        <driver name="EcalRawConverter"/>
+        <driver name="EcalRawConverterDriver"/>
+        <driver name="EcalTriggerFilter"/>
+        <driver name="EcalTriggerClusterer"/>
+        <driver name="SimpleSVTReadout"/>
+        <driver name="EcalTrigger"/>
+        <driver name="ClockDriver"/>
+    </execute>    
+    <drivers>
+        <driver name="CalibrationDriver" type="org.lcsim.hps.monitoring.CalibrationDriver">
+        </driver>
+        <driver name="EcalRawConverter" type="org.lcsim.hps.recon.ecal.EcalEdepToTriggerConverterDriver">
+            <readoutCollection>EcalReadoutAnalogHits</readoutCollection>
+        </driver>
+        <driver name="EcalRawConverterDriver" type="org.lcsim.hps.recon.ecal.EcalRawConverterDriver">
+            <runBackwards>true</runBackwards>
+            <rawCollectionName>EcalReadoutHits</rawCollectionName>
+            <ecalCollectionName>EcalReadoutAnalogHits</ecalCollectionName>
+        </driver>
+        <driver name="EcalTriggerFilter" type="org.lcsim.hps.recon.ecal.HPSEcalTriggerFilterDriver">
+            <inputCollection>EcalTriggerHits</inputCollection>
+            <outputCollection>EcalFilteredHits</outputCollection>
+        </driver>
+        <driver name="EcalTriggerClusterer" type="org.lcsim.hps.recon.ecal.CTPEcalClusterer">
+            <ecalName>Ecal</ecalName>
+            <ecalCollectionName>EcalFilteredHits</ecalCollectionName>
+            <clusterCollectionName>EcalTriggerClusters</clusterCollectionName>
+        </driver>
+        <driver name="EcalTrigger" type="org.lcsim.hps.readout.ecal.TestRunTriggerDriver">
+            <clusterCollectionName>EcalTriggerClusters</clusterCollectionName>
+            <deadTime>0</deadTime>
+            <lcioFile>${outputFile}</lcioFile>
+        </driver>	
+        <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">
+            <eventInterval>1000</eventInterval>
+        </driver>
+        
+        <driver name="SimpleSVTReadout" type="org.lcsim.hps.recon.tracking.SimpleSvtReadout">
+            <noPileup>true</noPileup>
+        </driver>
+        <driver name="ClockDriver" type="org.lcsim.hps.util.ClockDriver"/>
+    </drivers>
+</lcsim>

hps-java/src/main/resources/org/lcsim/hps/steering/readout
HPS2014ReadoutNoPileup.lcsim added at 1.1
diff -N HPS2014ReadoutNoPileup.lcsim
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ HPS2014ReadoutNoPileup.lcsim	25 Feb 2013 22:39:25 -0000	1.1
@@ -0,0 +1,56 @@
+<!-- 
+  Execute trigger+readout simulation without pileup (event by event) and write the results as an LCIO file.
+  @author Sho Uemura <[log in to unmask]>
+  @version $Id: HPS2014ReadoutNoPileup.lcsim,v 1.1 2013/02/25 22:39:25 meeg Exp $
+-->
+<lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
+       xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd">       
+    <control>
+        <printInputFiles>true</printInputFiles>
+        <printDriversDetailed>true</printDriversDetailed>
+    </control>    
+    <execute>
+        <driver name="EventMarkerDriver"/>
+        <driver name="CalibrationDriver"/>
+        <driver name="EcalEdepToTriggerConverterDriver"/>
+        <driver name="EcalReadoutConverterDriver"/>
+        <driver name="EcalTriggerClusterer"/>
+        <driver name="SimpleSVTReadout"/> 
+        <driver name="EcalTrigger"/>
+        <driver name="ClockDriver"/>        
+    </execute>    
+    <drivers>
+        <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">
+            <eventInterval>1000</eventInterval>
+        </driver>
+        <driver name="CalibrationDriver" type="org.lcsim.hps.monitoring.CalibrationDriver">
+        </driver>
+        <driver name="EcalEdepToTriggerConverterDriver" type="org.lcsim.hps.recon.ecal.EcalEdepToTriggerConverterDriver">
+            <readoutCollection>EcalReadoutAnalogHits</readoutCollection>
+            <applyBadCrystalMap>false</applyBadCrystalMap>
+            <truncateScale>1</truncateScale>
+            <constantGain>0.15</constantGain>
+        </driver>
+        <driver name="EcalReadoutConverterDriver" type="org.lcsim.hps.recon.ecal.HPSEcalRawConverterDriver">
+            <runBackwards>true</runBackwards>
+            <rawCollectionName>EcalReadoutHits</rawCollectionName>
+            <ecalCollectionName>EcalReadoutAnalogHits</ecalCollectionName>
+        </driver>
+        <driver name="EcalTriggerClusterer" type="org.lcsim.hps.recon.ecal.CTPEcalClusterer">
+            <ecalName>Ecal</ecalName>
+            <ecalCollectionName>EcalReadoutAnalogHits</ecalCollectionName>
+            <clusterCollectionName>EcalTriggerClusters</clusterCollectionName>
+        </driver>
+        <driver name="EcalTrigger" type="org.lcsim.hps.readout.ecal.FADCTriggerDriver">
+            <clusterCollectionName>EcalTriggerClusters</clusterCollectionName>
+			<outputFileName>${outputFile}.triggers</outputFileName>
+            <deadTime>0</deadTime>
+            <lcioFile>${outputFile}</lcioFile>
+        </driver>	
+        
+        <driver name="SimpleSVTReadout" type="org.lcsim.hps.recon.tracking.SimpleSvtReadout">
+            <noPileup>true</noPileup>
+        </driver>
+        <driver name="ClockDriver" type="org.lcsim.hps.util.ClockDriver"/>
+    </drivers>
+</lcsim>

hps-java/src/main/resources/org/lcsim/hps/steering/readout
TestRunSim.lcsim added at 1.1
diff -N TestRunSim.lcsim
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ TestRunSim.lcsim	25 Feb 2013 22:39:25 -0000	1.1
@@ -0,0 +1,126 @@
+
+<lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd">
+
+    <inputFiles>
+        <file>${inputFile}</file>
+    </inputFiles>
+
+    <control>
+        <printInputFiles>true</printInputFiles>
+        <printDriversDetailed>true</printDriversDetailed>
+    </control>
+
+    <execute>
+        <driver name="Calibrations"           />
+        <driver name="EventMarkerDriver"         />
+        <!-- Ecal -->
+        <driver name="EcalReadout"               />
+        <driver name="EcalConverter"             />
+        <driver name="EcalTriggerFilter"/>
+        <driver name="EcalClusterer"             />
+        <driver name="EcalTrigger"               /> 
+        <!-- SVT -->
+        <driver name="SVTReadout"                />
+        <driver name="Digitization"              />
+        <driver name="DataProcessing"            />
+        <!-- Recon -->
+        <driver name="RawTrackerHitFitterDriver" />
+        <driver name="TrackerHitDriver"          /> 
+        <driver name="HelicalTrackHitDriver"     /> 
+        <driver name="TrackerReconDriver"        />
+        <driver name="ClockDriver"               />
+        <driver name="CleanupDriver"             />    
+    </execute>
+
+    <drivers>
+
+        <driver name="Calibrations" type="org.lcsim.hps.monitoring.CalibrationDriver">
+            <runNumber>1351</runNumber>
+        </driver>     
+
+        <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">
+            <eventInterval>1000</eventInterval>
+        </driver>
+
+        <driver name="EcalReadout" type="org.lcsim.hps.readout.ecal.FADCEcalReadoutDriver">
+            <readoutPeriod>4.0</readoutPeriod>
+            <coincidenceWindow>2</coincidenceWindow>
+            <ecalName>Ecal</ecalName>
+            <ecalCollectionName>EcalHits</ecalCollectionName>
+            <ecalRawCollectionName>EcalRawHits</ecalRawCollectionName>
+            <triggerThreshold>80</triggerThreshold>
+            <readoutThreshold>50</readoutThreshold>
+        </driver>
+
+        <driver name="EcalConverter" type="org.lcsim.hps.recon.ecal.EcalConverterDriver">
+            <rawCollectionName>EcalRawHits</rawCollectionName>
+            <ecalCollectionName>EcalCorrectedHits</ecalCollectionName>
+            <scale>1</scale>
+        </driver>	
+        
+        <driver name="EcalTriggerFilter" type="org.lcsim.hps.recon.ecal.EcalTriggerFilterDriver">
+            <inputCollection>EcalCorrectedHits</inputCollection>
+            <outputCollection>EcalFilteredHits</outputCollection>
+        </driver>
+
+        <driver name="EcalClusterer"
+            type="org.lcsim.hps.recon.ecal.CTPEcalClusterer">
+            <ecalName>Ecal</ecalName>
+            <ecalCollectionName>EcalFilteredHits</ecalCollectionName>
+        </driver>
+
+        <driver name="EcalTrigger" type="org.lcsim.hps.readout.ecal.TestRunTriggerDriver">
+            <clusterCollectionName>EcalClusters</clusterCollectionName>
+            <deadTime>10</deadTime>
+        </driver>
+
+        <driver name="SVTReadout" type="org.lcsim.hps.recon.tracking.apv25.SvtReadout">
+            <debug>false</debug>
+            <pedestalRun>false</pedestalRun>
+            <triggerLatencyTime>288</triggerLatencyTime>
+        </driver>
+        
+        <driver name="Digitization" type="org.lcsim.hps.recon.tracking.RearTransitionModule" />
+
+        <driver name="DataProcessing" type="org.lcsim.hps.recon.tracking.TestRunDataProcessingModule" >
+            <enablePileUpCut>true</enablePileUpCut>
+            <enableThresholdCut>true</enableThresholdCut>
+            <noiseThreshold>2</noiseThreshold>
+            <numberOfSamplesAboveThreshold>3</numberOfSamplesAboveThreshold>
+            <numberOfSamplesToReadOut>6</numberOfSamplesToReadOut>
+        </driver>
+
+
+        <driver name="RawTrackerHitFitterDriver" type="org.lcsim.hps.recon.tracking.HPSRawTrackerHitFitterDriver">
+            <debug>false</debug> 
+            <rawHitCollectionName>SVTRawTrackerHits</rawHitCollectionName>  
+            <fittedHitCollectionName>SVTFittedRawTrackerHits</fittedHitCollectionName> 
+            <fitAlgorithm>Analytic</fitAlgorithm>  
+        </driver>
+
+
+        <driver name="TrackerHitDriver" type="org.lcsim.hps.users.mgraham.DataTrackerHitDriver" >
+            <debug>false</debug>    
+        </driver>
+
+        <driver name="HelicalTrackHitDriver"
+                type="org.lcsim.hps.recon.tracking.HelicalTrackHitDriver">
+            <debug>false</debug>
+            <layerGeometryType>Common</layerGeometryType>
+            <maxSeperation>20.0</maxSeperation>
+            <tolerance>1.0</tolerance>
+        </driver>
+
+        <driver name="TrackerReconDriver" type="org.lcsim.hps.recon.tracking.TrackerReconDriver">
+            <debug>false</debug>
+            <strategyResource> </strategyResource> 
+        </driver>
+        
+        <driver name="ClockDriver" type="org.lcsim.hps.util.ClockDriver" />
+
+        <driver name="CleanupDriver" type="org.lcsim.recon.tracking.digitization.sisim.config.ReadoutCleanupDriver">
+            <collectionNames>TrackerHits SVTRawTrackerHits  SVTFittedRawTrackerHits</collectionNames>
+        </driver>
+
+    </drivers>
+</lcsim>

hps-java/src/main/resources/org/lcsim/hps/steering/readout
TestRunReadoutToEvio.lcsim added at 1.1
diff -N TestRunReadoutToEvio.lcsim
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ TestRunReadoutToEvio.lcsim	25 Feb 2013 22:39:25 -0000	1.1
@@ -0,0 +1,91 @@
+<!-- 
+  Execute test run full recon and write the results as an EVIO file.
+-->
+<lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
+       xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd">
+    <execute>
+<!--        <driver name="EventMarkerDriver"/>-->
+        <driver name="CalibrationDriver"/>   
+        <driver name="EcalReadout"/>
+        <driver name="EcalConverter"/>
+        <driver name="EcalTriggerFilter"/>
+        <driver name="EcalClusterer"/>
+        <driver name="EcalTrigger"/>
+<!--        <driver name="SimpleSVTReadout"/>-->
+        <driver name="SVTReadout"/>
+        <driver name="Digitization"/>
+        <driver name="DataProcessing"/>
+        <driver name="ClockDriver"/>
+        <driver name="TestRunReconToEvio"/>
+        <driver name="CleanupDriver"/>
+    </execute> 
+
+    <drivers>
+        <!--<driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">
+            <eventInterval>1</eventInterval>
+        </driver> -->
+        <driver name="CalibrationDriver" type="org.lcsim.hps.monitoring.CalibrationDriver">
+<!--            <runNumber>1351</runNumber>    -->
+        </driver>
+        <driver name="TestRunReconToEvio" type="org.lcsim.hps.evio.TestRunTriggeredReconToEvio">
+            <evioOutputFile>${evioFile}</evioOutputFile>
+        </driver>
+			
+        <driver name="EcalReadout" type="org.lcsim.hps.readout.ecal.FADCEcalReadoutDriver">
+            <readoutPeriod>4.0</readoutPeriod>
+            <coincidenceWindow>2</coincidenceWindow>
+            <ecalName>Ecal</ecalName>
+            <ecalCollectionName>EcalHits</ecalCollectionName>
+            <ecalRawCollectionName>EcalRawHits</ecalRawCollectionName>
+            <triggerThreshold>80</triggerThreshold>
+            <readoutThreshold>50</readoutThreshold>
+        </driver>
+
+        <driver name="EcalConverter" type="org.lcsim.hps.recon.ecal.EcalConverterDriver">
+            <rawCollectionName>EcalRawHits</rawCollectionName>
+            <ecalCollectionName>EcalCorrectedHits</ecalCollectionName>
+            <scale>1</scale>
+        </driver>	
+        
+        <driver name="EcalTriggerFilter" type="org.lcsim.hps.recon.ecal.EcalTriggerFilterDriver">
+            <inputCollection>EcalCorrectedHits</inputCollection>
+            <outputCollection>EcalFilteredHits</outputCollection>
+        </driver>
+
+        <driver name="EcalClusterer" type="org.lcsim.hps.recon.ecal.CTPEcalClusterer">
+            <ecalName>Ecal</ecalName>
+            <clusterWindow>32.0</clusterWindow>
+            <ecalCollectionName>EcalFilteredHits</ecalCollectionName>
+        </driver>
+
+        <driver name="EcalTrigger" type="org.lcsim.hps.readout.ecal.TestRunTriggerDriver">
+            <clusterCollectionName>EcalClusters</clusterCollectionName>
+            <deadTime>10</deadTime>
+			<outputFileName>${evioFile}.triggers</outputFileName>
+        </driver>	
+        <driver name="SimpleSVTReadout" type="org.lcsim.hps.recon.tracking.SimpleSvtReadout">
+        </driver>
+
+        <driver name="SVTReadout" type="org.lcsim.hps.recon.tracking.apv25.SvtReadout">
+            <debug>false</debug>
+            <pedestalRun>false</pedestalRun>
+            <triggerLatencyTime>288</triggerLatencyTime>
+        </driver>
+        
+        <driver name="Digitization" type="org.lcsim.hps.recon.tracking.RearTransitionModule" />
+
+        <driver name="DataProcessing" type="org.lcsim.hps.recon.tracking.TestRunDataProcessingModule" >
+            <enablePileUpCut>true</enablePileUpCut>
+            <enableThresholdCut>true</enableThresholdCut>
+            <noiseThreshold>2</noiseThreshold>
+            <numberOfSamplesAboveThreshold>3</numberOfSamplesAboveThreshold>
+            <numberOfSamplesToReadOut>6</numberOfSamplesToReadOut>
+        </driver>
+
+        <driver name="ClockDriver" type="org.lcsim.hps.util.ClockDriver"/>
+        <driver name="CleanupDriver" type="org.lcsim.recon.tracking.digitization.sisim.config.ReadoutCleanupDriver">
+            <collectionNames>TrackerHits</collectionNames>
+        </driver> 
+    </drivers>
+</lcsim>
+	

hps-java/src/main/resources/org/lcsim/hps/steering/readout
TestRunReadoutToLcio.lcsim added at 1.1
diff -N TestRunReadoutToLcio.lcsim
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ TestRunReadoutToLcio.lcsim	25 Feb 2013 22:39:25 -0000	1.1
@@ -0,0 +1,91 @@
+<!-- 
+  Execute test run full recon and write the results as an LCIO file.
+-->
+<lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
+       xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd">
+    <execute>
+<!--        <driver name="EventMarkerDriver"/>-->
+        <driver name="CalibrationDriver"/>   
+        <driver name="EcalReadout"/>
+        <driver name="EcalConverter"/>
+        <driver name="EcalTriggerFilter"/>
+        <driver name="EcalClusterer"/>
+        <driver name="EcalTrigger"/>
+<!--        <driver name="SimpleSVTReadout"/>-->
+        <driver name="SVTReadout"/>
+        <driver name="Digitization"/>
+        <driver name="DataProcessing"/>
+        <driver name="ClockDriver"/>
+        <driver name="TestRunReconToLcio"/>
+        <driver name="CleanupDriver"/>
+    </execute> 
+
+    <drivers>
+<!--        <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">
+            <eventInterval>1</eventInterval>
+        </driver> -->
+        <driver name="CalibrationDriver" type="org.lcsim.hps.monitoring.CalibrationDriver">
+<!--            <runNumber>1351</runNumber>    -->
+        </driver>
+        <driver name="TestRunReconToLcio" type="org.lcsim.hps.evio.TestRunTriggeredReconToLcio">
+            <outputFile>${outputFile}</outputFile>
+        </driver>
+			
+        <driver name="EcalReadout" type="org.lcsim.hps.readout.ecal.FADCEcalReadoutDriver">
+            <readoutPeriod>4.0</readoutPeriod>
+            <coincidenceWindow>2</coincidenceWindow>
+            <ecalName>Ecal</ecalName>
+            <ecalCollectionName>EcalHits</ecalCollectionName>
+            <ecalRawCollectionName>EcalRawHits</ecalRawCollectionName>
+            <triggerThreshold>80</triggerThreshold>
+            <readoutThreshold>50</readoutThreshold>
+        </driver>
+
+        <driver name="EcalConverter" type="org.lcsim.hps.recon.ecal.EcalConverterDriver">
+            <rawCollectionName>EcalRawHits</rawCollectionName>
+            <ecalCollectionName>EcalCorrectedHits</ecalCollectionName>
+            <scale>1</scale>
+        </driver>	
+        
+        <driver name="EcalTriggerFilter" type="org.lcsim.hps.recon.ecal.EcalTriggerFilterDriver">
+            <inputCollection>EcalCorrectedHits</inputCollection>
+            <outputCollection>EcalFilteredHits</outputCollection>
+        </driver>
+
+        <driver name="EcalClusterer" type="org.lcsim.hps.recon.ecal.CTPEcalClusterer">
+            <ecalName>Ecal</ecalName>
+            <clusterWindow>32.0</clusterWindow>
+            <ecalCollectionName>EcalFilteredHits</ecalCollectionName>
+        </driver>
+
+        <driver name="EcalTrigger" type="org.lcsim.hps.readout.ecal.TestRunTriggerDriver">
+            <clusterCollectionName>EcalClusters</clusterCollectionName>
+            <deadTime>10</deadTime>
+			<outputFileName>${outputFile}.triggers</outputFileName>
+        </driver>	
+        <driver name="SimpleSVTReadout" type="org.lcsim.hps.recon.tracking.SimpleSvtReadout">
+        </driver>
+
+        <driver name="SVTReadout" type="org.lcsim.hps.recon.tracking.apv25.SvtReadout">
+            <debug>false</debug>
+            <pedestalRun>false</pedestalRun>
+            <triggerLatencyTime>288</triggerLatencyTime>
+        </driver>
+        
+        <driver name="Digitization" type="org.lcsim.hps.recon.tracking.RearTransitionModule" />
+
+        <driver name="DataProcessing" type="org.lcsim.hps.recon.tracking.TestRunDataProcessingModule" >
+            <enablePileUpCut>true</enablePileUpCut>
+            <enableThresholdCut>true</enableThresholdCut>
+            <noiseThreshold>2</noiseThreshold>
+            <numberOfSamplesAboveThreshold>3</numberOfSamplesAboveThreshold>
+            <numberOfSamplesToReadOut>6</numberOfSamplesToReadOut>
+        </driver>
+
+        <driver name="ClockDriver" type="org.lcsim.hps.util.ClockDriver"/>
+        <driver name="CleanupDriver" type="org.lcsim.recon.tracking.digitization.sisim.config.ReadoutCleanupDriver">
+            <collectionNames>TrackerHits</collectionNames>
+        </driver> 
+    </drivers>
+</lcsim>
+	

hps-java/src/main/resources/org/lcsim/hps/steering/readout
HPS2014ReadoutToLcio.lcsim added at 1.1
diff -N HPS2014ReadoutToLcio.lcsim
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ HPS2014ReadoutToLcio.lcsim	25 Feb 2013 22:39:25 -0000	1.1
@@ -0,0 +1,104 @@
+<!-- 
+  Execute full trigger+readout simulation and write the results as an LCIO file.
+  @author Sho Uemura <[log in to unmask]>
+  @version $Id: HPS2014ReadoutToLcio.lcsim,v 1.1 2013/02/25 22:39:25 meeg Exp $
+-->
+<lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
+       xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd">
+    <execute>
+        <driver name="EventMarkerDriver"/>
+        
+        <driver name="CalibrationDriver"/>   
+        <driver name="EcalReadout"/>
+        <driver name="EcalConverter"/>
+        <driver name="EcalClusterer"/>
+        <driver name="EcalTrigger"/>
+        
+<!--        <driver name="SimpleSVTReadout"/>-->
+
+        <driver name="SVTReadout"/>
+        <driver name="Digitization"/>
+        <driver name="DataProcessing"/>
+        <driver name="TestRunReconToLcio"/>
+
+		<driver name="AidaSaveDriver"/>
+
+        <driver name="ClockDriver"/>
+        <driver name="CleanupDriver"/>
+    </execute> 
+
+    <drivers>
+        <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">
+            <eventInterval>1000</eventInterval>
+        </driver> 
+        <driver name="CalibrationDriver" type="org.lcsim.hps.monitoring.CalibrationDriver">
+<!--            <runNumber>1351</runNumber>    -->
+        </driver>
+        <driver name="TestRunReconToLcio" type="org.lcsim.hps.evio.TestRunTriggeredReconToLcio">
+            <outputFile>${outputFile}.slcio</outputFile>
+        </driver>
+			
+        <driver name="EcalReadout" type="org.lcsim.hps.readout.ecal.FADCEcalReadoutDriver">
+            <readoutPeriod>4.0</readoutPeriod>
+            <coincidenceWindow>2</coincidenceWindow>
+            <ecalName>Ecal</ecalName>
+            <ecalCollectionName>EcalHits</ecalCollectionName>
+            <ecalRawCollectionName>EcalRawHits</ecalRawCollectionName>
+            <triggerThreshold>50</triggerThreshold>
+            <readoutThreshold>50</readoutThreshold>
+            <constantTriggerWindow>true</constantTriggerWindow>
+            <scaleFactor>1</scaleFactor>
+<!--            <fixedGain>0.15</fixedGain>-->
+<!--            <debug>true</debug>-->
+        </driver>
+
+        <driver name="EcalConverter" type="org.lcsim.hps.recon.ecal.EcalRawConverterDriver">
+            <rawCollectionName>EcalRawHits</rawCollectionName>
+            <ecalCollectionName>EcalCorrectedHits</ecalCollectionName>
+<!--            <gain>0.15</gain>-->
+            <applyBadCrystalMap>false</applyBadCrystalMap>
+<!--            <debug>true</debug>-->
+        </driver>	
+
+        <driver name="EcalClusterer" type="org.lcsim.hps.recon.ecal.CTPEcalClusterer">
+            <ecalName>Ecal</ecalName>
+            <clusterWindow>8.0</clusterWindow>
+            <ecalCollectionName>EcalCorrectedHits</ecalCollectionName>
+        </driver>
+
+        <driver name="EcalTrigger" type="org.lcsim.hps.readout.ecal.FADCTriggerDriver">
+            <clusterCollectionName>EcalClusters</clusterCollectionName>
+            <deadTime>10</deadTime>
+            <outputFileName>${outputFile}.triggers</outputFileName>
+        </driver>	
+        <driver name="SimpleSVTReadout" type="org.lcsim.hps.recon.tracking.SimpleSvtReadout">
+        </driver>
+
+        <driver name="SVTReadout" type="org.lcsim.hps.recon.tracking.apv25.SvtReadout">
+            <debug>false</debug>
+            <pedestalRun>false</pedestalRun>
+            <triggerLatencyTime>240</triggerLatencyTime>
+        </driver>
+        
+        <driver name="Digitization" type="org.lcsim.hps.recon.tracking.RearTransitionModule" />
+
+        <driver name="DataProcessing" type="org.lcsim.hps.recon.tracking.TestRunDataProcessingModule" >
+            <enablePileUpCut>true</enablePileUpCut>
+            <enableThresholdCut>true</enableThresholdCut>
+            <noiseThreshold>2</noiseThreshold>
+            <numberOfSamplesAboveThreshold>3</numberOfSamplesAboveThreshold>
+            <numberOfSamplesToReadOut>6</numberOfSamplesToReadOut>
+        </driver>
+
+		<driver name="AidaSaveDriver"
+                type="org.lcsim.job.AidaSaveDriver">
+			<outputFileName>${outputFile}_triggerPlots</outputFileName>
+		</driver>
+
+        <driver name="ClockDriver" type="org.lcsim.hps.util.ClockDriver"/>
+        <driver name="CleanupDriver" type="org.lcsim.recon.tracking.digitization.sisim.config.ReadoutCleanupDriver">
+            <collectionNames>TrackerHits</collectionNames>
+        </driver> 
+    </drivers>
+</lcsim>
+	

hps-java/src/main/resources/org/lcsim/hps/steering/readout
TestRunPairTrigger.lcsim added at 1.1
diff -N TestRunPairTrigger.lcsim
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ TestRunPairTrigger.lcsim	25 Feb 2013 22:39:25 -0000	1.1
@@ -0,0 +1,75 @@
+
+<lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
+       xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd">       
+    <inputFiles>
+        <!--<fileRegExp baseDir="./../data/mc/Reach-2pt2" >.*gev60.*</fileRegExp>-->
+<!--        <fileRegExp baseDir="./../data/mc/Reach-2pt2" >.*gev100.*</fileRegExp>-->
+    </inputFiles>
+    <control>
+<!--        <numberOfEvents>10000</numberOfEvents>-->
+        <printInputFiles>true</printInputFiles>
+        <printDriversDetailed>true</printDriversDetailed>
+    </control>    
+    <execute>
+        <driver name="EventMarkerDriver"/>
+        <driver name="CalibrationDriver"/>
+        <driver name="EcalRawConverter"/>
+<!--        <driver name="HPSEcalRawConverterDriver"/> -->
+<!--        <driver name="EcalTriggerFilter"/> -->
+        <driver name="EcalTriggerClusterer"/>
+<!--        <driver name="SimpleSVTReadout"/> -->
+        <driver name="EcalTrigger"/>
+        <driver name="ClockDriver"/>
+<!--        <driver name="MCParticlePlots"/>-->
+<!--        <driver name="TriggerTurnOnAnalysis"/>-->
+        
+    </execute>    
+    <drivers>
+        <driver name="CalibrationDriver" type="org.lcsim.hps.monitoring.CalibrationDriver">
+        </driver>
+        <driver name="EcalRawConverter" type="org.lcsim.hps.recon.ecal.EcalEdepToTriggerConverterDriver">
+            <readoutCollection>EcalReadoutAnalogHits</readoutCollection>
+            <applyBadCrystalMap>false</applyBadCrystalMap>
+            <truncateScale>1</truncateScale>
+            <constantGain>0.15</constantGain>
+        </driver>
+<!--        <driver name="HPSEcalRawConverterDriver" type="org.lcsim.hps.recon.ecal.HPSEcalRawConverterDriver">
+            <runBackwards>true</runBackwards>
+            <rawCollectionName>EcalReadoutHits</rawCollectionName>
+            <ecalCollectionName>EcalReadoutAnalogHits</ecalCollectionName>
+        </driver>-->
+<!--        <driver name="EcalTriggerFilter" type="org.lcsim.hps.recon.ecal.HPSEcalTriggerFilterDriver">
+            <inputCollection>EcalTriggerHits</inputCollection>
+            <outputCollection>EcalFilteredHits</outputCollection>
+        </driver>-->
+        <driver name="EcalTriggerClusterer" type="org.lcsim.hps.recon.ecal.CTPEcalClusterer">
+            <ecalName>Ecal</ecalName>
+            <ecalCollectionName>EcalReadoutAnalogHits</ecalCollectionName>
+<!--            <ecalCollectionName>EcalFilteredHits</ecalCollectionName>-->
+            <clusterCollectionName>EcalTriggerClusters</clusterCollectionName>
+        </driver>
+<!--        <driver name="EcalTrigger" type="org.lcsim.hps.recon.ecal.TestRunTriggerDriver">-->
+        <driver name="EcalTrigger" type="org.lcsim.hps.readout.ecal.FADCTriggerDriver">
+        <!--<driver name="EcalTrigger" type="org.lcsim.hps.recon.ecal.HPSFADCSingleTriggerDriver">-->
+            <clusterCollectionName>EcalTriggerClusters</clusterCollectionName>
+			<outputFileName>${outputFile}.triggers</outputFileName>
+            <deadTime>0</deadTime>
+            <!--<lcioFile>${outputFile}</lcioFile>-->
+        </driver>	
+        <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">
+            <eventInterval>1000</eventInterval>
+        </driver>
+        
+        <driver name="SimpleSVTReadout" type="org.lcsim.hps.recon.tracking.SimpleSvtReadout">
+            <noPileup>true</noPileup>
+        </driver>
+        <driver name="ClockDriver" type="org.lcsim.hps.util.ClockDriver"/>
+        <driver name="MCParticlePlots" type="org.lcsim.hps.analysis.ecal.HPSMCParticlePlotsDriver">
+            <hideFrame>true</hideFrame>
+        </driver>
+        <driver name="TriggerTurnOnAnalysis" type="org.lcsim.hps.users.phansson.TriggerTurnOnAnalysis">
+            <aidaFileName>${outputFile}</aidaFileName>
+            <hideFrame>true</hideFrame>
+        </driver>
+    </drivers>
+</lcsim>

hps-java/src/main/resources/org/lcsim/hps/steering/readout
HPS2014ReadoutToEvio.lcsim added at 1.1
diff -N HPS2014ReadoutToEvio.lcsim
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ HPS2014ReadoutToEvio.lcsim	25 Feb 2013 22:39:25 -0000	1.1
@@ -0,0 +1,97 @@
+<!-- 
+  Execute full trigger+readout simulation and write the results as an EVIO file.
+  @author Sho Uemura <[log in to unmask]>
+  @version $Id: HPS2014ReadoutToEvio.lcsim,v 1.1 2013/02/25 22:39:25 meeg Exp $
+-->
+<lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
+       xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd">
+    <execute>
+        <driver name="EventMarkerDriver"/>
+        
+        <driver name="CalibrationDriver"/>   
+        <driver name="EcalReadout"/>
+        <driver name="EcalConverter"/>
+        <driver name="EcalClusterer"/>
+        <driver name="EcalTrigger"/>
+        
+<!--        <driver name="SimpleSVTReadout"/>-->
+
+        <driver name="SVTReadout"/>
+        <driver name="Digitization"/>
+        <driver name="DataProcessing"/>
+        <driver name="TestRunReconToEvio"/>
+
+        <driver name="ClockDriver"/>
+        <driver name="CleanupDriver"/>
+    </execute> 
+
+    <drivers>
+        <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">
+            <eventInterval>1000</eventInterval>
+        </driver> 
+        <driver name="CalibrationDriver" type="org.lcsim.hps.monitoring.CalibrationDriver">
+<!--            <runNumber>1351</runNumber>    -->
+        </driver>
+        <driver name="TestRunReconToEvio" type="org.lcsim.hps.evio.TestRunTriggeredReconToEvio">
+            <evioOutputFile>${outputFile}</evioOutputFile>
+        </driver>
+			
+        <driver name="EcalReadout" type="org.lcsim.hps.readout.ecal.FADCEcalReadoutDriver">
+            <readoutPeriod>4.0</readoutPeriod>
+            <coincidenceWindow>2</coincidenceWindow>
+            <ecalName>Ecal</ecalName>
+            <ecalCollectionName>EcalHits</ecalCollectionName>
+            <ecalRawCollectionName>EcalRawHits</ecalRawCollectionName>
+            <triggerThreshold>50</triggerThreshold>
+            <readoutThreshold>50</readoutThreshold>
+            <constantTriggerWindow>true</constantTriggerWindow>
+            <scaleFactor>1</scaleFactor>
+            <fixedGain>0.15</fixedGain>
+<!--            <debug>true</debug>-->
+        </driver>
+
+        <driver name="EcalConverter" type="org.lcsim.hps.recon.ecal.EcalRawConverterDriver">
+            <rawCollectionName>EcalRawHits</rawCollectionName>
+            <ecalCollectionName>EcalCorrectedHits</ecalCollectionName>
+            <gain>0.15</gain>
+            <applyBadCrystalMap>false</applyBadCrystalMap>
+<!--            <debug>true</debug>-->
+        </driver>	
+
+        <driver name="EcalClusterer" type="org.lcsim.hps.recon.ecal.CTPEcalClusterer">
+            <ecalName>Ecal</ecalName>
+            <clusterWindow>32.0</clusterWindow>
+            <ecalCollectionName>EcalCorrectedHits</ecalCollectionName>
+        </driver>
+
+        <driver name="EcalTrigger" type="org.lcsim.hps.readout.ecal.FADCTriggerDriver">
+            <clusterCollectionName>EcalClusters</clusterCollectionName>
+            <deadTime>10</deadTime>
+            <outputFileName>${outputFile}.triggers</outputFileName>
+        </driver>	
+        <driver name="SimpleSVTReadout" type="org.lcsim.hps.recon.tracking.SimpleSvtReadout">
+        </driver>
+
+        <driver name="SVTReadout" type="org.lcsim.hps.recon.tracking.apv25.SvtReadout">
+            <debug>false</debug>
+            <pedestalRun>false</pedestalRun>
+            <triggerLatencyTime>240</triggerLatencyTime>
+        </driver>
+        
+        <driver name="Digitization" type="org.lcsim.hps.recon.tracking.RearTransitionModule" />
+
+        <driver name="DataProcessing" type="org.lcsim.hps.recon.tracking.TestRunDataProcessingModule" >
+            <enablePileUpCut>true</enablePileUpCut>
+            <enableThresholdCut>true</enableThresholdCut>
+            <noiseThreshold>2</noiseThreshold>
+            <numberOfSamplesAboveThreshold>3</numberOfSamplesAboveThreshold>
+            <numberOfSamplesToReadOut>6</numberOfSamplesToReadOut>
+        </driver>
+
+        <driver name="ClockDriver" type="org.lcsim.hps.util.ClockDriver"/>
+        <driver name="CleanupDriver" type="org.lcsim.recon.tracking.digitization.sisim.config.ReadoutCleanupDriver">
+            <collectionNames>TrackerHits</collectionNames>
+        </driver> 
+    </drivers>
+</lcsim>
+	

hps-java/src/main/resources/org/lcsim/hps/steering/readout
HPSTestRunLcioToEvio.lcsim added at 1.1
diff -N HPSTestRunLcioToEvio.lcsim
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ HPSTestRunLcioToEvio.lcsim	25 Feb 2013 22:39:25 -0000	1.1
@@ -0,0 +1,24 @@
+<!-- 
+  Convert LCIO file to EVIO file.
+-->
+<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="DummyTrigger"/>
+        <driver name="TestRunReconToEvio"/>
+        <driver name="ClockDriver"/>
+    </execute> 
+
+    <drivers>
+        <driver name="DummyTrigger" type="org.lcsim.hps.readout.ecal.DummyTriggerDriver">
+            <period>1</period>
+            <deadTime>0</deadTime>
+        </driver>	
+        <driver name="TestRunReconToEvio" type="org.lcsim.hps.evio.TestRunTriggeredReconToEvio">
+            <evioOutputFile>${evioFile}</evioOutputFile>
+        </driver>
+        <driver name="ClockDriver" type="org.lcsim.hps.util.ClockDriver">
+        </driver>
+    </drivers>
+</lcsim>
+	

hps-java/src/main/java/org/lcsim/hps/recon/tracking
HPSSVTCalibrationConstants.java 1.22 -> 1.23
diff -u -r1.22 -r1.23
--- HPSSVTCalibrationConstants.java	18 Dec 2012 19:53:07 -0000	1.22
+++ HPSSVTCalibrationConstants.java	25 Feb 2013 22:39:26 -0000	1.23
@@ -8,13 +8,13 @@
 import org.lcsim.detector.identifier.IIdentifier;
 import org.lcsim.detector.identifier.IIdentifierHelper;
 import org.lcsim.detector.tracker.silicon.SiSensor;
-import org.lcsim.hps.monitoring.HPSCalibrationDriver;
+import org.lcsim.hps.monitoring.CalibrationDriver;
 import org.lcsim.hps.util.Pair;
 
 /**
  *
  * @author Mathew Graham <[log in to unmask]>
- * $Id: HPSSVTCalibrationConstants.java,v 1.22 2012/12/18 19:53:07 omoreno Exp $
+ * $Id: HPSSVTCalibrationConstants.java,v 1.23 2013/02/25 22:39:26 meeg Exp $
  */
 public class HPSSVTCalibrationConstants {
 
@@ -47,7 +47,7 @@
         ConditionsManager conditions = ConditionsManager.defaultInstance();
         String filePath = null;
 
-        filePath = HPSCalibrationDriver.getCalibForRun("calibSVT/base", run);
+        filePath = CalibrationDriver.getCalibForRun("calibSVT/base", run);
 
         if (filePath == null) {
             filePath = "calibSVT/default.base";
@@ -61,7 +61,7 @@
         }
 
 
-        filePath = HPSCalibrationDriver.getCalibForRun("calibSVT/tp", run);
+        filePath = CalibrationDriver.getCalibForRun("calibSVT/tp", run);
 
         if (filePath == null) {
             filePath = "calibSVT/default.tp";

hps-java/src/main/java/org/lcsim/hps/readout/ecal
FADCTriggerDriver.java added at 1.1
diff -N FADCTriggerDriver.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ FADCTriggerDriver.java	25 Feb 2013 22:39:26 -0000	1.1
@@ -0,0 +1,477 @@
+package org.lcsim.hps.readout.ecal;
+
+import hep.aida.IHistogram1D;
+import hep.aida.IHistogram2D;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.EnumSet;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.lcsim.event.Cluster;
+import org.lcsim.event.EventHeader;
+import org.lcsim.geometry.Detector;
+import org.lcsim.hps.evio.TriggerData;
+import org.lcsim.hps.recon.ecal.ECalUtils;
+import org.lcsim.hps.recon.ecal.HPSEcalCluster;
+import org.lcsim.hps.util.ClockSingleton;
+import org.lcsim.util.aida.AIDA;
+
+/**
+ * Reads clusters and makes trigger decision using opposite quadrant criterion.
+ * Prints triggers to file if file path specified.
+ *
+ * @author Omar Moreno <[log in to unmask]>
+ * @author Sho Uemura <[log in to unmask]>
+ * @version $Id: FADCTriggerDriver.java,v 1.1 2013/02/25 22:39:26 meeg Exp $
+ */
+public class FADCTriggerDriver extends TriggerDriver {
+
+    // A list to contain all cluster pairs in an event
+    List<HPSEcalCluster[]> clusterPairs;
+    int nTriggers;
+    int totalEvents;
+    private double beamEnergy = 2.2 * ECalUtils.GeV;
+    private double clusterEnergyHigh = 1.85 / 2.2;
+    private double clusterEnergyLow = .1 / 2.2;
+    private double energySumThreshold = 1.0;
+    private double energyDifferenceThreshold = 1.5 / 2.2;
+    private double maxCoplanarityAngle = 35; // degrees
+//    private double energyDistanceDistance = 250; // mm
+//    private double energyDistanceThreshold = 0.8 / 2.2;
+    private double energyDistanceDistance = 200; // mm
+    private double energyDistanceThreshold = 0.5;
+    int allPairs;
+    int oppositeQuadrantCount;
+    int clusterEnergyCount;
+    int energySumCount;
+    int energyDifferenceCount;
+    int energyDistanceCount;
+    int coplanarityCount;
+    AIDA aida = AIDA.defaultInstance();
+    IHistogram2D clusterEnergy2DAll, clusterSumDiff2DAll, energyDistance2DAll, clusterAngles2DAll, clusterCoplanarity2DAll;
+    IHistogram2D clusterEnergy2D, clusterSumDiff2D, energyDistance2D, clusterAngles2D, clusterCoplanarity2D;
+    IHistogram1D triggerBits1D, triggerTimes1D;
+    private boolean useQuadrants = false;
+
+    private enum Flag {
+
+        CLUSTER_ENERGY(3), ENERGY_SUM_DIFF(2), ENERGY_DISTANCE(1), COPLANARITY(0);
+        private final int index;
+
+        Flag(int i) {
+            index = i;
+        }
+
+        static int bitmask(EnumSet<Flag> flags) {
+            int mask = 0;
+            for (Flag flag : flags) {
+                mask |= 1 << flag.index;
+            }
+            return mask;
+        }
+    }
+
+    public FADCTriggerDriver() {
+        clusterPairs = new LinkedList<HPSEcalCluster[]>();
+    }
+
+    public void setBeamEnergy(double beamEnergy) {
+        if (beamEnergy == 1.1) {
+            System.out.println(this.getClass().getSimpleName() + ": Setting trigger for 1.1 GeV beam");
+            maxCoplanarityAngle = 90;
+            clusterEnergyHigh = .7 / beamEnergy;
+            clusterEnergyLow = .1 / beamEnergy;
+            energySumThreshold = 0.8 / beamEnergy;
+        } else if (beamEnergy == 2.2) {
+            System.out.println(this.getClass().getSimpleName() + ": Setting trigger for 2.2 GeV beam");
+            maxCoplanarityAngle = 45;
+            clusterEnergyHigh = 1.6 / beamEnergy;
+            clusterEnergyLow = .1 / beamEnergy;
+            energySumThreshold = 1.7 / beamEnergy;
+        } else if (beamEnergy == 6.6) {
+            System.out.println(this.getClass().getSimpleName() + ": Setting trigger for 6.6 GeV beam");
+            maxCoplanarityAngle = 60;
+            clusterEnergyHigh = 5.0 / beamEnergy;
+            clusterEnergyLow = .1 / beamEnergy;
+            energySumThreshold = 5.5 / beamEnergy;
+        }
+        this.beamEnergy = beamEnergy * ECalUtils.GeV;
+    }
+
+    @Override
+    public void detectorChanged(Detector detector) {
+        if (detector.getName().contains("1pt1")) {
+            setBeamEnergy(1.1);
+        } else if (detector.getName().contains("2pt2")) {
+            setBeamEnergy(2.2);
+        } else if (detector.getName().contains("6pt6")) {
+            setBeamEnergy(6.6);
+        }
+
+        clusterSumDiff2DAll = aida.histogram2D("All cluster pairs: energy difference vs. sum", 100, 0.0, 2 * beamEnergy, 100, 0.0, beamEnergy);
+        clusterEnergy2DAll = aida.histogram2D("All cluster pairs: energy (less energetic vs. more energetic)", 100, 0.0, 2 * beamEnergy, 100, 0.0, beamEnergy);
+        energyDistance2DAll = aida.histogram2D("All cluster pairs: distance vs. energy (less energetic cluster)", 100, 0.0, 0.5 * beamEnergy, 25, 0.0, 400.0);
+        clusterCoplanarity2DAll = aida.histogram2D("All cluster pairs: cluster angle uncoplanarity vs. less energetic cluster angle", 100, -180.0, 180.0, 100, -180.0, 180.0);
+        clusterAngles2DAll = aida.histogram2D("All cluster pairs: cluster angle (less energetic vs. more energetic)", 100, -180.0, 180.0, 100, -180.0, 180.0);
+
+        clusterSumDiff2D = aida.histogram2D("Passed other cuts: energy difference vs. sum", 100, 0.0, 2 * beamEnergy, 100, 0.0, beamEnergy);
+        clusterEnergy2D = aida.histogram2D("Passed other cuts: energy (less energetic vs. more energetic)", 100, 0.0, 2 * beamEnergy, 100, 0.0, beamEnergy);
+        energyDistance2D = aida.histogram2D("Passed other cuts: distance vs. energy (less energetic cluster)", 100, 0.0, 0.5 * beamEnergy, 25, 0.0, 400.0);
+        clusterCoplanarity2D = aida.histogram2D("Passed other cuts: cluster angle uncoplanarity vs. less energetic cluster angle", 100, -180.0, 180.0, 100, -180.0, 180.0);
+        clusterAngles2D = aida.histogram2D("Passed other cuts: cluster angle (less energetic vs. more energetic)", 100, -180.0, 180.0, 100, -180.0, 180.0);
+
+        triggerBits1D = aida.histogram1D(detector.getDetectorName() + " : " + clusterCollectionName + " : trigger bits", 17, -1.5, 15.5);
+        triggerTimes1D = aida.histogram1D(detector.getDetectorName() + " : " + clusterCollectionName + " : trigger times", 500, -0.5, 499.5);
+    }
+
+    @Override
+    public void startOfData() {
+        super.startOfData();
+
+        allPairs = 0;
+        oppositeQuadrantCount = 0;
+        clusterEnergyCount = 0;
+        energySumCount = 0;
+        energyDifferenceCount = 0;
+        energyDistanceCount = 0;
+        coplanarityCount = 0;
+    }
+
+    @Override
+    public boolean testTrigger(List<HPSEcalCluster> clusters) {
+        boolean trigger = false;
+
+        if (useQuadrants) {
+            getClusterPairs(clusters);
+        } else {
+            getClusterPairsTopBot(clusters);
+        }
+
+        //--- Apply Trigger Cuts ---//
+
+        // Iterate through all cluster pairs present in the event.  If at least
+        // one of the cluster pairs satisfies all of the trigger conditions,
+        // a trigger signal is sent to all other detectors.
+        for (HPSEcalCluster[] clusterPair : clusterPairs) {
+
+            EnumSet<Flag> bits = EnumSet.noneOf(Flag.class);
+
+            if (outputStream != null) {
+                outputStream.printf("Event %d: cluster pair (energy %f in quadrant %d (%s), energy %f in quadrant %d (%s))\n",
+                        ClockSingleton.getClock(),
+                        clusterPair[0].getEnergy(), ECalUtils.getQuadrant(clusterPair[0]), clusterPair[0].getSeedHit().getPositionVec().toString(),
+                        clusterPair[1].getEnergy(), ECalUtils.getQuadrant(clusterPair[1]), clusterPair[1].getSeedHit().getPositionVec().toString());
+            }
+
+            allPairs++;
+
+            if (useQuadrants) {
+                // Require that the event have at least two clusters in opposite
+                // quadrants
+                if (!oppositeQuadrantsCut(clusterPair)) {
+                    if (outputStream != null) {
+                        outputStream.println("Failed opposite quadrant cut");
+                    }
+                    continue;
+                }
+                oppositeQuadrantCount++;
+            }
+
+            // Require the components of a cluster pair to have an energy in
+            // the range of 100 MeV to 1.85 GeV
+            if (clusterECut(clusterPair)) {
+                bits.add(Flag.CLUSTER_ENERGY);
+            }
+
+            bits.add(Flag.ENERGY_SUM_DIFF);
+            // Require the sum of the energies of the components of the
+            // cluster pair to be less than the
+            // (Beam Energy)*(Sampling Fraction) ( 2 GeV for the Test Run )
+            if (!energySum(clusterPair)) {
+                bits.remove(Flag.ENERGY_SUM_DIFF);
+            }
+
+            // Require the difference in energy of the components of the
+            // cluster pair to be less than 1.5 GeV
+            if (!energyDifference(clusterPair)) {
+                bits.remove(Flag.ENERGY_SUM_DIFF);
+            }
+
+            // Apply a low energy cluster vs. distance cut of the form
+            // E_low + .0032 GeV/mm < .8 GeV
+            if (energyDistanceCut(clusterPair)) {
+                bits.add(Flag.ENERGY_DISTANCE);
+            }
+
+            // Require that the two clusters are coplanar with the beam within
+            // 35 degrees
+            if (coplanarityCut(clusterPair)) {
+                bits.add(Flag.COPLANARITY);
+            }
+
+            if (bits.contains(Flag.CLUSTER_ENERGY)) {
+                clusterEnergyCount++;
+                if (energySum(clusterPair)) {
+                    energySumCount++;
+                    if (energyDifference(clusterPair)) {
+                        energyDifferenceCount++;
+                        if (bits.contains(Flag.ENERGY_DISTANCE)) {
+                            energyDistanceCount++;
+                            if (bits.contains(Flag.COPLANARITY)) {
+                                coplanarityCount++;
+                            } else if (outputStream != null) {
+                                outputStream.println("Failed coplanarity cut");
+                            }
+                        } else if (outputStream != null) {
+                            outputStream.println("Failed energy-distance cut");
+                        }
+                    } else if (outputStream != null) {
+                        outputStream.println("Failed energy difference cut");
+                    }
+                } else if (outputStream != null) {
+                    outputStream.println("Failed energy sum cut");
+                }
+            } else if (outputStream != null) {
+                outputStream.println("Failed cluster energy cut");
+            }
+
+            clusterSumDiff2DAll.fill(clusterPair[0].getEnergy() + clusterPair[1].getEnergy(), clusterPair[0].getEnergy() - clusterPair[1].getEnergy());
+            clusterEnergy2DAll.fill(clusterPair[0].getEnergy(), clusterPair[1].getEnergy());
+            energyDistance2DAll.fill(clusterPair[1].getEnergy(), getClusterDistance(clusterPair[1]));
+            clusterCoplanarity2DAll.fill(getClusterAngle(clusterPair[1]), pairUncoplanarity(clusterPair));
+            clusterAngles2DAll.fill(getClusterAngle(clusterPair[0]), getClusterAngle(clusterPair[1]));
+
+            if (bits.containsAll(EnumSet.complementOf(EnumSet.of(Flag.ENERGY_SUM_DIFF, Flag.CLUSTER_ENERGY)))) { //cluster energy, energy-distance, coplanarity
+                clusterSumDiff2D.fill(clusterPair[0].getEnergy() + clusterPair[1].getEnergy(), clusterPair[0].getEnergy() - clusterPair[1].getEnergy());
+                clusterEnergy2D.fill(clusterPair[0].getEnergy(), clusterPair[1].getEnergy());
+            }
+            if (bits.containsAll(EnumSet.complementOf(EnumSet.of(Flag.ENERGY_DISTANCE)))) {
+                energyDistance2D.fill(clusterPair[1].getEnergy(), getClusterDistance(clusterPair[1]));
+            }
+            if (bits.containsAll(EnumSet.complementOf(EnumSet.of(Flag.COPLANARITY)))) {
+                clusterCoplanarity2D.fill(getClusterAngle(clusterPair[1]), pairUncoplanarity(clusterPair));
+                clusterAngles2D.fill(getClusterAngle(clusterPair[0]), getClusterAngle(clusterPair[1]));
+            }
+
+            triggerBits1D.fill(Flag.bitmask(bits));
+
+            if (bits.containsAll(EnumSet.allOf(Flag.class))) {
+                // If all cuts are pased, we have a trigger
+                if (outputStream != null) {
+                    outputStream.println("Passed all cuts");
+                }
+                trigger = true;
+            }
+        }
+        if (trigger) {
+            triggerBits1D.fill(-1);
+            triggerTimes1D.fill(ClockSingleton.getClock() % 500);
+        }
+        return trigger;
+    }
+
+    @Override
+    public void endOfData() {
+        if (outputStream != null) {
+            printCounts(outputStream);
+        }
+        printCounts(new PrintWriter(System.out));
+        super.endOfData();
+    }
+
+    private void printCounts(PrintWriter writer) {
+        writer.printf("Number of pairs: %d\n", allPairs);
+        writer.printf("Number of cluster pairs after successive trigger conditions:\n");
+        if (useQuadrants) {
+            writer.printf("Opposite quadrants: %d\n", oppositeQuadrantCount);
+        }
+        writer.printf("Cluster energy: %d\n", clusterEnergyCount);
+        writer.printf("Energy sum: %d\n", energySumCount);
+        writer.printf("Energy difference: %d\n", energyDifferenceCount);
+        writer.printf("Energy-distance cut: %d\n", energyDistanceCount);
+        writer.printf("Coplanarity: %d\n", coplanarityCount);
+        writer.printf("Trigger count: %d\n", numTriggers);
+        writer.close();
+    }
+
+    /**
+     * Get a list of all unique cluster pairs in the event
+     *
+     * @param ecalClusters : List of ECal clusters
+     * @return true if there are any cluster pairs
+     */
+    private boolean getClusterPairs(List<HPSEcalCluster> ecalClusters) {
+        // Create a list which will hold all neighboring cluster to the cluster
+        // of interest
+        List< HPSEcalCluster> ecalClusterNeighbors = new LinkedList< HPSEcalCluster>();
+        ecalClusterNeighbors.addAll(ecalClusters);
+
+        // Clear the list of cluster pairs
+        clusterPairs.clear();
+
+        for (HPSEcalCluster ecalCluster : ecalClusters) {
+            // Create a list of neighbors to the cluster of interest
+            ecalClusterNeighbors.remove(ecalCluster);
+
+            // Loop over all neigboring clusters and check to see if there is
+            // any which lie in opposing quadrants to the cluster of interest.
+            // If so, add them to the list of cluster pairs
+            for (HPSEcalCluster ecalClusterNeighbor : ecalClusterNeighbors) {
+                if (ecalCluster.getEnergy() > ecalClusterNeighbor.getEnergy()) {
+                    HPSEcalCluster[] clusterPair = {ecalCluster, ecalClusterNeighbor};
+                    clusterPairs.add(clusterPair);
+                } else {
+                    HPSEcalCluster[] clusterPair = {ecalClusterNeighbor, ecalCluster};
+                    clusterPairs.add(clusterPair);
+                }
+            }
+        }
+
+        return !clusterPairs.isEmpty();
+    }
+
+    private boolean getClusterPairsTopBot(List<HPSEcalCluster> ecalClusters) {
+        // Create a list which will hold all neighboring cluster to the cluster
+        // of interest
+        List< HPSEcalCluster> topClusters = new ArrayList< HPSEcalCluster>();
+        List< HPSEcalCluster> botClusters = new ArrayList< HPSEcalCluster>();
+        for (HPSEcalCluster ecalCluster : ecalClusters) {
+            if (ecalCluster.getSeedHit().getIdentifierFieldValue("iy") > 0) {
+                topClusters.add(ecalCluster);
+            } else {
+                botClusters.add(ecalCluster);
+            }
+        }
+        // Clear the list of cluster pairs
+        clusterPairs.clear();
+
+        // Loop over all top-bottom pairs of clusters; higher-energy cluster goes first in the pair
+        for (HPSEcalCluster topCluster : topClusters) {
+            for (HPSEcalCluster botCluster : botClusters) {
+                if (topCluster.getEnergy() > botCluster.getEnergy()) {
+                    HPSEcalCluster[] clusterPair = {topCluster, botCluster};
+                    clusterPairs.add(clusterPair);
+                } else {
+                    HPSEcalCluster[] clusterPair = {botCluster, topCluster};
+                    clusterPairs.add(clusterPair);
+                }
+            }
+        }
+        return !clusterPairs.isEmpty();
+    }
+
+    /**
+     * Checks if the ECal clusters making up a cluster pair lie in opposite
+     * quadrants
+     *
+     * @param clusterPair : pair of clusters
+     * @return true if opposite quadrants, false otherwise
+     */
+    private boolean oppositeQuadrantsCut(HPSEcalCluster[] clusterPair) {
+        int quad1 = ECalUtils.getQuadrant(clusterPair[0]);
+        int quad2 = ECalUtils.getQuadrant(clusterPair[1]);
+
+        //if clusters are in the same quadrant, they're not opposite quadrants
+        if (quad1 == quad2) {
+            return false;
+        } //opposite pairs of quadrants are either both even (2 and 4) or both odd (1 and 3)
+        else {
+            return ((quad1 & 1) == (quad2 & 1));
+        }
+    }
+
+    /**
+     * Checks if the ECal clusters making up a cluster pair lie above the low
+     * energy threshold and below the high energy threshold
+     *
+     * @param clusterPair : pair of clusters
+     * @return true if a pair is found, false otherwise
+     */
+    private boolean clusterECut(HPSEcalCluster[] clusterPair) {
+        return (clusterPair[0].getEnergy() < beamEnergy * clusterEnergyHigh
+                && clusterPair[1].getEnergy() < beamEnergy * clusterEnergyHigh
+                && clusterPair[0].getEnergy() > beamEnergy * clusterEnergyLow
+                && clusterPair[1].getEnergy() > beamEnergy * clusterEnergyLow);
+    }
+
+    /**
+     * Checks if the sum of the energies of ECal clusters making up a cluster
+     * pair is below an energy sum threshold
+     *
+     * @param clusterPair : pair of clusters
+     * @return true if a pair is found, false otherwise
+     */
+    private boolean energySum(Cluster[] clusterPair) {
+        double clusterESum = clusterPair[0].getEnergy() + clusterPair[1].getEnergy();
+        return (clusterESum < beamEnergy * energySumThreshold);
+    }
+
+    /**
+     * Checks if the energy difference between the ECal clusters making up a
+     * cluster pair is below an energy difference threshold
+     *
+     * @param clusterPair : pair of clusters
+     * @return true if pair is found, false otherwise
+     */
+    private boolean energyDifference(HPSEcalCluster[] clusterPair) {
+        double clusterEDifference = clusterPair[0].getEnergy() - clusterPair[1].getEnergy();
+
+        return (clusterEDifference < beamEnergy * energyDifferenceThreshold);
+    }
+
+    /**
+     * Require that the distance from the beam of the lowest energy cluster in a
+     * cluster pair satisfies the following E_low + d_b*.0032 GeV/mm < .8 GeV
+     *
+     * @param clusterPair : pair of clusters
+     * @return true if pair is found, false otherwise
+     */
+    private boolean energyDistanceCut(HPSEcalCluster[] clusterPair) {
+        HPSEcalCluster lowEnergyCluster = clusterPair[1];
+
+        // Calculate its position
+        double lowEClusterDistance = getClusterDistance(clusterPair[1]);
+        // event passes cut if above the line with X- and Y-intercepts defined by energyDistanceDistance and beamEnergy*energyDistanceThreshold
+        double clusterDistvsE = lowEnergyCluster.getEnergy() + lowEClusterDistance * beamEnergy * energyDistanceThreshold / energyDistanceDistance;
+
+        return (clusterDistvsE > beamEnergy * energyDistanceThreshold);
+    }
+
+    /**
+     * Checks if a cluster pair is coplanar to the beam within a given angle
+     *
+     * @param clusterPair : pair of clusters
+     * @return true if pair is found, false otherwise
+     */
+    private boolean coplanarityCut(HPSEcalCluster[] clusterPair) {
+        return (Math.abs(pairUncoplanarity(clusterPair)) < maxCoplanarityAngle);
+    }
+
+    private double pairUncoplanarity(HPSEcalCluster[] clusterPair) { // Find the angle between clusters in the pair
+        double cluster1Angle = (getClusterAngle(clusterPair[0]) + 180.0) % 180.0;
+        double cluster2Angle = (getClusterAngle(clusterPair[1]) + 180.0) % 180.0;
+
+        return cluster2Angle - cluster1Angle;
+    }
+
+    private double getClusterAngle(HPSEcalCluster cluster) { //returns angle in range of -180 to 180
+        double position[] = cluster.getSeedHit().getPosition();
+        return Math.toDegrees(Math.atan2(position[1], position[0]));
+    }
+
+    private double getClusterDistance(HPSEcalCluster cluster) {
+        return Math.hypot(cluster.getSeedHit().getPosition()[0], cluster.getSeedHit().getPosition()[1]);
+    }
+
+    /**
+     * Make a dummy TriggerData
+     */
+    @Override
+    protected void makeTriggerData(EventHeader event, String collectionName) {
+        TriggerData tData = new TriggerData(new int[8]);
+        List<TriggerData> triggerList = new ArrayList<TriggerData>();
+        triggerList.add(tData);
+        event.put(collectionName, triggerList, TriggerData.class, 0);
+    }
+}
\ No newline at end of file

hps-java/src/main/java/org/lcsim/hps/readout/ecal
TimeEvolutionEcalReadoutDriver.java added at 1.1
diff -N TimeEvolutionEcalReadoutDriver.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ TimeEvolutionEcalReadoutDriver.java	25 Feb 2013 22:39:26 -0000	1.1
@@ -0,0 +1,94 @@
+package org.lcsim.hps.readout.ecal;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.lcsim.event.CalorimeterHit;
+import org.lcsim.hps.recon.ecal.HPSCalorimeterHit;
+import org.lcsim.hps.util.ClockSingleton;
+import org.lcsim.hps.util.RingBuffer;
+
+/**
+ * Performs readout of ECal hits.
+ * Simulates time evolution of preamp output pulse.
+ *
+ * @author Sho Uemura <[log in to unmask]>
+ * @version $Id: TimeEvolutionEcalReadoutDriver.java,v 1.1 2013/02/25 22:39:26 meeg Exp $
+ */
+public class TimeEvolutionEcalReadoutDriver extends EcalReadoutDriver<HPSCalorimeterHit> {
+
+    //buffer for deposited energy
+    Map<Long, RingBuffer> eDepMap = null;
+    //length of ring buffer (in readout cycles)
+    int bufferLength = 20;
+    //shaper time constant in ns; negative values generate square pulses of the given width
+    double t0 = 18.0;
+
+    public TimeEvolutionEcalReadoutDriver() {
+		hitClass = HPSCalorimeterHit.class;
+    }
+
+    public void setT0(double t0) {
+        this.t0 = t0;
+    }
+
+    public void setBufferLength(int bufferLength) {
+        this.bufferLength = bufferLength;
+        eDepMap = new HashMap<Long, RingBuffer>();
+    }
+
+    @Override
+    protected void readHits(List<HPSCalorimeterHit> hits) {
+        for (Long cellID : eDepMap.keySet()) {
+            RingBuffer eDepBuffer = eDepMap.get(cellID);
+            if (eDepBuffer.currentValue() > threshold) {
+//                int ix = dec.getValue("ix");
+//                int iy = dec.getValue("iy");
+//                if (iy == 1 && ix == -2)
+//                    System.out.printf("Time %f, output signal %f\n", ClockSingleton.getTime(), eDepBuffer.currentValue());
+                hits.add(new HPSCalorimeterHit(eDepBuffer.currentValue(), readoutTime(), cellID, hitType));
+            }
+            eDepBuffer.step();
+        }
+    }
+
+    @Override
+    protected void putHits(List<CalorimeterHit> hits) {
+        //fill the readout buffers
+        for (CalorimeterHit hit : hits) {
+//            int ix = dec.getValue("ix");
+//            int iy = dec.getValue("iy");
+//            if (iy == 1 && ix == -2)
+//                System.out.printf("Time %f, input hit %f)\n", ClockSingleton.getTime() + hit.getTime(), hit.getRawEnergy());
+
+            RingBuffer eDepBuffer = eDepMap.get(hit.getCellID());
+            if (eDepBuffer == null) {
+                eDepBuffer = new RingBuffer(bufferLength);
+                eDepMap.put(hit.getCellID(), eDepBuffer);
+            }
+            for (int i = 0; i < bufferLength; i++) {
+                eDepBuffer.addToCell(i, hit.getRawEnergy() * pulseAmplitude((i + 1) * readoutPeriod + readoutTime() - (ClockSingleton.getTime() + hit.getTime())));
+            }
+        }
+    }
+
+    @Override
+    protected void initReadout() {
+        //initialize buffers
+        eDepMap = new HashMap<Long, RingBuffer>();
+    }
+
+    private double pulseAmplitude(double time) {
+        if (time < 0.0)
+            return 0.0;
+        if (t0 > 0.0) {
+            return (time / t0) * Math.exp(1.0 - time / t0);
+        } else {
+            if (time < -t0)
+                return 1.0;
+            else
+                return 0.0;
+        }
+    }
+}

hps-java/src/main/java/org/lcsim/hps/readout/ecal
TestRunTriggerDriver.java added at 1.1
diff -N TestRunTriggerDriver.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ TestRunTriggerDriver.java	25 Feb 2013 22:39:26 -0000	1.1
@@ -0,0 +1,102 @@
+package org.lcsim.hps.readout.ecal;
+
+import org.lcsim.hps.readout.ecal.TriggerDriver;
+import java.util.ArrayList;
+import java.util.List;
+import org.lcsim.event.EventHeader;
+import org.lcsim.hps.evio.TriggerData;
+import org.lcsim.hps.recon.ecal.HPSEcalCluster;
+
+/**
+ * Reads clusters and makes trigger decision using opposite quadrant criterion.
+ * Prints triggers to file if file path specified.
+ *
+ * @author Omar Moreno <[log in to unmask]>
+ * @author Sho Uemura <[log in to unmask]>
+ * @version $Id: TestRunTriggerDriver.java,v 1.1 2013/02/25 22:39:26 meeg Exp $
+ */
+public class TestRunTriggerDriver extends TriggerDriver {
+
+    boolean triggerThisCycle = false;
+    int cycleCounter = 0;
+    private double clusterEnergyLow = 10;    //
+    int deadtimelessTriggerCount;
+    private int topBits = 0, botBits = 0;
+
+    public TestRunTriggerDriver() {
+    }
+
+    @Override
+    protected void makeTriggerData(EventHeader event, String collectionName) {
+        int[] trigArray = new int[8];
+        trigArray[TriggerData.TOP_TRIG] = topBits;
+        trigArray[TriggerData.BOT_TRIG] = botBits;
+        trigArray[TriggerData.AND_TRIG] = topBits & botBits;
+        trigArray[TriggerData.OR_TRIG] = topBits | botBits;
+        TriggerData tData = new TriggerData(trigArray);
+        List<TriggerData> triggerList = new ArrayList<TriggerData>();
+        triggerList.add(tData);
+        event.put(collectionName, triggerList, TriggerData.class, 0);
+    }
+
+    @Override
+    public void startOfData() {
+        super.startOfData();
+
+        deadtimelessTriggerCount = 0;
+    }
+
+    @Override
+    protected boolean triggerDecision(EventHeader event) {
+        if (event.hasCollection(HPSEcalCluster.class, clusterCollectionName)) {
+            cycleCounter++;
+            if (testTrigger(event.get(HPSEcalCluster.class, clusterCollectionName))) {
+                triggerThisCycle = true;
+            }
+        }
+
+        if (cycleCounter % 4 == 0) {
+            boolean trigger = triggerThisCycle;
+            triggerThisCycle = false;
+            return trigger;
+        } else {
+            return false;
+        }
+    }
+
+    @Override
+    public boolean testTrigger(List<HPSEcalCluster> clusters) {
+        boolean trigger = false;
+
+        topBits <<= 1;
+        botBits <<= 1;
+        for (HPSEcalCluster cluster : clusters) {
+            if (cluster.getEnergy() > clusterEnergyLow) {
+                if (cluster.getPosition()[1] > 0) {
+                    topBits |= 1;
+                } else {
+                    botBits |= 1;
+                }
+                trigger = true;
+            }
+        }
+        if (trigger) {
+            deadtimelessTriggerCount++;
+        }
+        return trigger;
+    }
+
+    @Override
+    public void endOfData() {
+        if (outputStream != null) {
+            outputStream.printf("Number of cluster pairs after successive trigger conditions:\n");
+            outputStream.printf("Trigger count without dead time: %d\n", deadtimelessTriggerCount);
+            outputStream.printf("Trigger count: %d\n", numTriggers);
+            outputStream.close();
+        }
+        System.out.printf("Number of cluster pairs after successive trigger conditions:\n");
+        System.out.printf("Trigger count without dead time: %d\n", deadtimelessTriggerCount);
+        System.out.printf("Trigger count: %d\n", numTriggers);
+        super.endOfData();
+    }
+}
\ No newline at end of file

hps-java/src/main/java/org/lcsim/hps/readout/ecal
TriggerDriver.java added at 1.1
diff -N TriggerDriver.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ TriggerDriver.java	25 Feb 2013 22:39:26 -0000	1.1
@@ -0,0 +1,223 @@
+package org.lcsim.hps.readout.ecal;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.io.PrintWriter;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Queue;
+
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.lcsim.event.EventHeader;
+import org.lcsim.hps.recon.ecal.HPSEcalCluster;
+import org.lcsim.hps.recon.tracking.apv25.Apv25Full;
+import org.lcsim.hps.recon.tracking.apv25.HPSAPV25;
+import org.lcsim.hps.util.ClockSingleton;
+import org.lcsim.util.Driver;
+import org.lcsim.util.lcio.LCIOWriter;
+
+/**
+ * Reads clusters and makes trigger decision using opposite quadrant criterion.
+ * Prints triggers to file if file path specified.
+ * Applies SVT trigger latency and sends trigger signal to SVT
+ *
+ * @author Sho Uemura <[log in to unmask]>
+ * @version $Id: TriggerDriver.java,v 1.1 2013/02/25 22:39:26 meeg Exp $
+ */
+public abstract class TriggerDriver extends Driver {
+
+    private boolean _DEBUG = false;
+    protected String clusterCollectionName = "EcalClusters";
+    private String outputFileName = null;
+    protected PrintWriter outputStream = null;
+    protected int numTriggers;
+    private int lastTrigger;
+    private int deadTime = 0;
+    // FIFO queue to store the svt trigger time stamp 
+    private Queue<Double> svtTriggerTimeStamp = new LinkedList<Double>();
+    // SVT trigger latency
+    public static final double svtTriggerLatency = 100.0; // [ns]
+    // FIFO queue to store the ECal trigger time stamp 
+    private Queue<Double> ecalTriggerTimestamps = null;
+    // ECal trigger latency
+    private static final double ecalTriggerLatency = 100.0; // [ns]
+    // FIFO queue to store the trigger bank trigger time stamp 
+    private Queue<Double> triggerTriggerTimestamps = null;
+    // trigger bank trigger latency
+    public static final double triggerTriggerLatency = 50.0; // [ns]
+    private static boolean triggerBit = false;
+    private String lcioFile = null;
+    LCIOWriter lcioWriter = null;
+
+    public TriggerDriver() {
+    }
+
+    public void setLcioFile(String lcioFile) {
+        this.lcioFile = lcioFile;
+    }
+
+    /**
+     * Set dead time; 0 for no dead time
+     * @param deadTime Minimum number of clock ticks between triggers
+     */
+    public void setDeadTime(int deadTime) {
+        this.deadTime = deadTime;
+    }
+
+    public void setClusterCollectionName(String clusterCollectionName) {
+        this.clusterCollectionName = clusterCollectionName;
+    }
+
+    public void setOutputFileName(String outputFileName) {
+        this.outputFileName = outputFileName;
+    }
+
+    @Override
+    public void startOfData() {
+        if (clusterCollectionName == null) {
+            throw new RuntimeException("The parameter clusterCollectionName was not set!");
+        }
+
+        if (outputFileName != null) {
+            try {
+                outputStream = new PrintWriter(new PrintStream(outputFileName), true);
+            } catch (IOException ex) {
+                throw new RuntimeException("Invalid outputFilePath!");
+            }
+        } else {
+            if (_DEBUG) {
+                outputStream = new PrintWriter(System.out, true);
+            }
+        }
+
+        if (lcioFile != null) {
+            try {
+                lcioWriter = new LCIOWriter(new File(lcioFile));
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+        numTriggers = 0;
+
+        ecalTriggerTimestamps = new LinkedList<Double>();
+        triggerTriggerTimestamps = new LinkedList<Double>();
+    }
+
+    @Override
+    public void process(EventHeader event) {
+        triggerBit = false; //reset trigger
+        //System.out.println(this.getClass().getCanonicalName() + " - process");
+
+        if (ClockSingleton.getClock() - lastTrigger > deadTime && triggerDecision(event)) {
+            triggerBit = true;
+            lastTrigger = ClockSingleton.getClock();
+            numTriggers++;
+            if (_DEBUG) {
+                System.out.printf(this.getClass().getSimpleName() + ": Trigger on event %d\n", event.getEventNumber());
+            }
+            if (outputStream != null) {
+                outputStream.printf("Trigger on event %d\n", event.getEventNumber());
+            }
+
+            // If an ECal trigger signal has been sent store the trigger
+            // time offset by the trigger latencies
+            svtTriggerTimeStamp.add(ClockSingleton.getTime() + svtTriggerLatency);
+            ecalTriggerTimestamps.add(ClockSingleton.getTime() + ecalTriggerLatency);
+            triggerTriggerTimestamps.add(ClockSingleton.getTime() + triggerTriggerLatency);
+            if (_DEBUG) {
+                System.out.println(this.getClass().getSimpleName() + ": Trigger added on event " + event.getEventNumber());
+            }
+
+            if (outputStream != null) {
+                outputStream.printf("trigger sent to ET event builder on event %d\n", event.getEventNumber());
+            }
+            makeTriggerData(event, "TriggerStatus");
+            if (lcioWriter != null) {
+                try {
+                    lcioWriter.write(event);
+                } catch (IOException ex) {
+                    Logger.getLogger(TriggerDriver.class.getName()).log(Level.SEVERE, null, ex);
+                }
+            }
+        }
+
+        // Check if there are any pending SVT triggers to process
+        if (svtTriggerTimeStamp.peek() != null
+                && ClockSingleton.getTime() >= svtTriggerTimeStamp.peek()) {
+
+            if (outputStream != null) {
+                outputStream.printf("SVT trigger sent on event %d\n", event.getEventNumber());
+            }
+
+            // Send a trigger signal to the SVT
+            HPSAPV25.readoutBit = true;
+            Apv25Full.readoutBit = true;
+            svtTriggerTimeStamp.remove();
+        }
+
+        // Check if there are any pending ECal triggers to process
+        if (ecalTriggerTimestamps.peek() != null
+                && ClockSingleton.getTime() >= ecalTriggerTimestamps.peek()) {
+
+            if (outputStream != null) {
+                outputStream.printf("ECal trigger sent on event %d\n", event.getEventNumber());
+            }
+
+            // Send a trigger signal to the ECal
+            EcalReadoutDriver.readoutBit = true;
+            ecalTriggerTimestamps.remove();
+        }
+
+
+        // Check if there are any pending trigger bank triggers to process
+        if (triggerTriggerTimestamps.peek() != null
+                && ClockSingleton.getTime() >= triggerTriggerTimestamps.peek()) {
+
+            if (outputStream != null) {
+                outputStream.printf("Trigger bank trigger sent on event %d\n", event.getEventNumber());
+            }
+
+            // Make trigger bank
+            makeTriggerData(event, "TriggerBank");
+            triggerTriggerTimestamps.remove();
+        }
+    }
+
+    protected boolean triggerDecision(EventHeader event) {
+        // Get the list of raw ECal hits.
+        if (event.hasCollection(HPSEcalCluster.class, clusterCollectionName)) {
+            return testTrigger(event.get(HPSEcalCluster.class, clusterCollectionName));
+        } else {
+            return false;
+        }
+    }
+
+    public abstract boolean testTrigger(List<HPSEcalCluster> clusters);
+
+    protected void makeTriggerData(EventHeader event, String collectionName) {
+    }
+
+    @Override
+    public void endOfData() {
+        if (outputStream != null) {
+            outputStream.printf("Trigger count: %d\n", numTriggers);
+            outputStream.close();
+        }
+        if (lcioWriter != null) {
+            try {
+                lcioWriter.close();
+            } catch (IOException ex) {
+                Logger.getLogger(TriggerDriver.class.getName()).log(Level.SEVERE, null, ex);
+            }
+        }
+        System.out.printf(this.getClass().getSimpleName() + ": Trigger count: %d\n", numTriggers);
+    }
+
+    public static boolean triggerBit() {
+        return triggerBit;
+    }
+}
\ No newline at end of file

hps-java/src/main/java/org/lcsim/hps/readout/ecal
FADCEcalReadoutDriver.java added at 1.1
diff -N FADCEcalReadoutDriver.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ FADCEcalReadoutDriver.java	25 Feb 2013 22:39:26 -0000	1.1
@@ -0,0 +1,469 @@
+package org.lcsim.hps.readout.ecal;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import java.util.PriorityQueue;
+import java.util.Set;
+import org.lcsim.event.CalorimeterHit;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.RawCalorimeterHit;
+import org.lcsim.event.RawTrackerHit;
+import org.lcsim.event.base.BaseRawCalorimeterHit;
+import org.lcsim.event.base.BaseRawTrackerHit;
+import org.lcsim.geometry.Detector;
+import org.lcsim.geometry.Subdetector;
+import org.lcsim.geometry.subdetector.HPSEcal3;
+import org.lcsim.hps.evio.EventConstants;
+import org.lcsim.hps.recon.ecal.ECalUtils;
+import org.lcsim.hps.recon.ecal.EcalConditions;
+import org.lcsim.hps.recon.ecal.HPSRawCalorimeterHit;
+import org.lcsim.hps.util.ClockSingleton;
+import org.lcsim.hps.util.RingBuffer;
+import org.lcsim.util.lcio.LCIOConstants;
+
+/**
+ * Performs readout of ECal hits.
+ * Simulates time evolution of preamp output pulse.
+ *
+ * @author Sho Uemura <[log in to unmask]>
+ * @version $Id: FADCEcalReadoutDriver.java,v 1.1 2013/02/25 22:39:26 meeg Exp $
+ */
+public class FADCEcalReadoutDriver extends EcalReadoutDriver<RawCalorimeterHit> {
+
+    String ecalName = "Ecal";
+    Subdetector ecal;
+    //buffer for deposited energy
+    private Map<Long, RingBuffer> eDepMap = null;
+    //ADC pipeline for readout
+    private Map<Long, FADCPipeline> pipelineMap = null;
+    //buffer for window sums
+    private Map<Long, Double> sumMap = null;
+    //buffer for timestamps
+    private Map<Long, Integer> timeMap = null;
+    //queue for hits to be output to clusterer
+    private PriorityQueue<HPSRawCalorimeterHit> outputQueue = null;
+    //length of ring buffer (in readout cycles)
+    private int bufferLength = 100;
+    //length of readout pipeline (in readout cycles)
+    private int pipelineLength = 2000;
+    //shaper time constant in ns; negative values generate square pulses of the given width
+    private double tp = 14.0;
+    //delay (number of readout periods) between start of summing window and output of hit to clusterer
+    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<HPSRawCalorimeterHit> buffer = new LinkedList<HPSRawCalorimeterHit>();
+    //number of readout periods for which a given hit stays in the buffer
+    private int coincidenceWindow = 2;
+    private double pulseIntegral;
+    //output collection name for hits read out from trigger
+    private String ecalReadoutCollectionName = "EcalReadoutHits";
+    private int mode = EventConstants.ECAL_PULSE_INTEGRAL_MODE;
+    private int readoutThreshold = (int) threshold;
+    private int triggerThreshold = (int) threshold;
+    //amplitude ADC counts/GeV
+//    private double gain = 0.5*1000 * 80.0 / 60;
+    private double scaleFactor = 128;
+    private double fixedGain = -1;
+    private boolean constantTriggerWindow = false;
+
+    public FADCEcalReadoutDriver() {
+        flags = 0;
+        flags += 1 << LCIOConstants.RCHBIT_TIME; //store cell ID
+        hitClass = HPSRawCalorimeterHit.class;
+//        converter = new HPSEcalConverter(null);
+    }
+
+    public void setConstantTriggerWindow(boolean constantTriggerWindow) {
+        this.constantTriggerWindow = constantTriggerWindow;
+    }
+
+    public void setFixedGain(double fixedGain) {
+        this.fixedGain = fixedGain;
+    }
+
+    public void setEcalName(String ecalName) {
+        this.ecalName = ecalName;
+    }
+
+    public void setReadoutThreshold(int readoutThreshold) {
+        this.readoutThreshold = readoutThreshold;
+    }
+
+    public void setScaleFactor(double scaleFactor) {
+        this.scaleFactor = scaleFactor;
+    }
+
+    public void setTriggerThreshold(int triggerThreshold) {
+        this.triggerThreshold = triggerThreshold;
+    }
+
+    public void setEcalReadoutCollectionName(String ecalReadoutCollectionName) {
+        this.ecalReadoutCollectionName = ecalReadoutCollectionName;
+    }
+
+    public void setNumSamplesAfter(int numSamplesAfter) {
+        this.numSamplesAfter = numSamplesAfter;
+    }
+
+    public void setNumSamplesBefore(int numSamplesBefore) {
+        this.numSamplesBefore = numSamplesBefore;
+    }
+
+    public void setReadoutLatency(int readoutLatency) {
+        this.readoutLatency = readoutLatency;
+    }
+
+    public void setReadoutWindow(int readoutWindow) {
+        this.readoutWindow = readoutWindow;
+    }
+
+    public void setCoincidenceWindow(int coincidenceWindow) {
+        this.coincidenceWindow = coincidenceWindow;
+    }
+
+    public void setTp(double tp) {
+        this.tp = tp;
+    }
+
+    public void setDelay0(int delay0) {
+        this.delay0 = delay0;
+    }
+
+    public void setBufferLength(int bufferLength) {
+        this.bufferLength = bufferLength;
+        resetFADCBuffers();
+    }
+
+    public void setPipelineLength(int pipelineLength) {
+        this.pipelineLength = pipelineLength;
+        resetFADCBuffers();
+    }
+
+    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) {
+            throw new IllegalArgumentException("invalid mode " + mode);
+        }
+    }
+
+    @Override
+    protected void readHits(List<RawCalorimeterHit> hits) {
+
+        for (Long cellID : eDepMap.keySet()) {
+            RingBuffer eDepBuffer = eDepMap.get(cellID);
+
+            FADCPipeline pipeline = pipelineMap.get(cellID);
+            pipeline.step();
+            double pedestal = EcalConditions.physicalToPedestal(cellID);
+            //normalization constant from cal gain (MeV/integral bit) to amplitude gain (amplitude bit/GeV)
+            double gain;
+            if (fixedGain > 0) {
+                gain = 1.0 / (fixedGain * ECalUtils.MeV * pulseIntegral);
+            } else {
+                gain = 1.0 / (EcalConditions.physicalToGain(cellID) * ECalUtils.MeV * pulseIntegral);
+            }
+
+            double currentValue = gain * eDepBuffer.currentValue();
+            pipeline.writeValue((int) Math.round(pedestal + currentValue));
+
+            Double sum = sumMap.get(cellID);
+            if (sum == null && currentValue > triggerThreshold) {
+                timeMap.put(cellID, readoutCounter);
+                if (constantTriggerWindow) {
+                    double sumBefore = 0;
+                    for (int i = 0; i < numSamplesBefore; i++) {
+                        if (debug) {
+                            System.out.format("trigger %d, %d: %d\n", cellID, i, pipeline.getValue(numSamplesBefore - i - 1));
+                        }
+                        sumBefore += pipeline.getValue(numSamplesBefore - i - 1);
+                    }
+                    sumMap.put(cellID, sumBefore);
+                } else {
+                    sumMap.put(cellID, currentValue);
+                }
+            }
+            if (sum != null) {
+                if (constantTriggerWindow) {
+                    if (timeMap.get(cellID) + numSamplesAfter >= readoutCounter) {
+                        if (debug) {
+                            System.out.format("trigger %d, %d: %d\n", cellID, readoutCounter - timeMap.get(cellID) + numSamplesBefore - 1, pipeline.getValue(0));
+                        }
+                        sumMap.put(cellID, sum + pipeline.getValue(0));
+                    } else if (timeMap.get(cellID) + delay0 <= readoutCounter) {
+//                        System.out.printf("sum = %f\n", sum);
+                        outputQueue.add(new HPSRawCalorimeterHit(cellID,
+                                (int) Math.round(sum / scaleFactor),
+                                64 * timeMap.get(cellID),
+                                readoutCounter - timeMap.get(cellID) + 1));
+                        sumMap.remove(cellID);
+                    }
+                } else {
+                    if (currentValue < triggerThreshold || timeMap.get(cellID) + delay0 == readoutCounter) {
+//					System.out.printf("sum = %f\n",sum);
+                        outputQueue.add(new HPSRawCalorimeterHit(cellID,
+                                (int) Math.round((sum + currentValue) / scaleFactor),
+                                64 * timeMap.get(cellID),
+                                readoutCounter - timeMap.get(cellID) + 1));
+                        sumMap.remove(cellID);
+                    } else {
+                        sumMap.put(cellID, sum + currentValue);
+                    }
+                }
+            }
+            eDepBuffer.step();
+        }
+        while (outputQueue.peek() != null && outputQueue.peek().getTimeStamp() / 64 <= readoutCounter - delay0) {
+            if (outputQueue.peek().getTimeStamp() / 64 < readoutCounter - delay0) {
+                System.out.println("Stale hit in output queue");
+                outputQueue.poll();
+            } else {
+                buffer.add(outputQueue.poll());
+            }
+        }
+        while (!buffer.isEmpty() && buffer.peek().getTimeStamp() / 64 <= readoutCounter - delay0 - coincidenceWindow) {
+            buffer.remove();
+        }
+        if (debug) {
+            for (RawCalorimeterHit hit : buffer) {
+                System.out.format("new hit: energy %d\n", hit.getAmplitude());
+            }
+        }
+
+        hits.addAll(buffer);
+    }
+
+    @Override
+    public void startOfData() {
+        super.startOfData();
+        if (ecalReadoutCollectionName == null) {
+            throw new RuntimeException("The parameter ecalReadoutCollectionName was not set!");
+        }
+    }
+
+    @Override
+    protected void processTrigger(EventHeader event) {
+        switch (mode) {
+            case EventConstants.ECAL_WINDOW_MODE:
+                if (debug) {
+                    System.out.println("Reading out ECal in window mode");
+                }
+                event.put(ecalReadoutCollectionName, readWindow(), RawTrackerHit.class, 0, ecalReadoutName);
+                break;
+            case EventConstants.ECAL_PULSE_MODE:
+                if (debug) {
+                    System.out.println("Reading out ECal in pulse mode");
+                }
+                event.put(ecalReadoutCollectionName, readPulses(), RawTrackerHit.class, 0, ecalReadoutName);
+                break;
+            case EventConstants.ECAL_PULSE_INTEGRAL_MODE:
+                if (debug) {
+                    System.out.println("Reading out ECal in integral mode");
+                }
+                event.put(ecalReadoutCollectionName, readIntegrals(), RawCalorimeterHit.class, 0, ecalReadoutName);
+                break;
+        }
+    }
+
+    protected short[] getWindow(long cellID) {
+        FADCPipeline pipeline = pipelineMap.get(cellID);
+        short[] adcValues = new short[readoutWindow];
+        for (int i = 0; i < readoutWindow; i++) {
+            adcValues[i] = (short) pipeline.getValue(readoutLatency - i - 1);
+//			if (adcValues[i] != 0) {
+//				System.out.println("getWindow: " + adcValues[i] + " at i = " + i);
+//			}
+        }
+        return adcValues;
+    }
+
+    protected List<RawTrackerHit> readWindow() {
+//		System.out.println("Reading FADC data");
+        List<RawTrackerHit> hits = new ArrayList<RawTrackerHit>();
+        for (Long cellID : pipelineMap.keySet()) {
+            short[] adcValues = getWindow(cellID);
+            hits.add(new BaseRawTrackerHit(cellID, 0, adcValues));
+        }
+        return hits;
+    }
+
+    protected List<RawTrackerHit> readPulses() {
+//		System.out.println("Reading FADC data");
+        List<RawTrackerHit> hits = new ArrayList<RawTrackerHit>();
+        for (Long cellID : pipelineMap.keySet()) {
+            short[] window = getWindow(cellID);
+            short[] adcValues = null;
+            int pointerOffset = 0;
+            int numSamplesToRead = 0;
+            int thresholdCrossing = 0;
+            for (int i = 0; i < readoutWindow; i++) {
+                if (numSamplesToRead != 0) {
+                    adcValues[adcValues.length - numSamplesToRead] = window[i - pointerOffset];
+                    numSamplesToRead--;
+                    if (numSamplesToRead == 0) {
+                        hits.add(new BaseRawTrackerHit(cellID, thresholdCrossing, adcValues));
+                    }
+                } else if ((i == 0 || window[i - 1] <= EcalConditions.physicalToPedestal(cellID) + readoutThreshold) && window[i] > EcalConditions.physicalToPedestal(cellID) + readoutThreshold) {
+                    thresholdCrossing = i;
+                    pointerOffset = Math.min(numSamplesBefore, i);
+                    numSamplesToRead = pointerOffset + Math.min(numSamplesAfter, readoutWindow - i - pointerOffset - 1);
+                    adcValues = new short[numSamplesToRead];
+                }
+            }
+        }
+        return hits;
+    }
+
+    protected List<RawCalorimeterHit> readIntegrals() {
+//		System.out.println("Reading FADC data");
+        List<RawCalorimeterHit> hits = new ArrayList<RawCalorimeterHit>();
+        for (Long cellID : pipelineMap.keySet()) {
+            short[] window = getWindow(cellID);
+            int adcSum = 0;
+            int pointerOffset = 0;
+            int numSamplesToRead = 0;
+            int thresholdCrossing = 0;
+            if (window != null) {
+                for (int i = 0; i < readoutWindow; i++) {
+                    if (numSamplesToRead != 0) {
+                        if (debug) {
+                            System.out.format("readout %d, %d: %d\n", cellID, numSamplesBefore + numSamplesAfter - numSamplesToRead, window[i - pointerOffset]);
+                        }
+                        adcSum += window[i - pointerOffset];
+                        numSamplesToRead--;
+                        if (numSamplesToRead == 0) {
+                            hits.add(new BaseRawCalorimeterHit(cellID, adcSum, 64 * thresholdCrossing));
+                        }
+                    } else if ((i == 0 || window[i - 1] <= EcalConditions.physicalToPedestal(cellID) + readoutThreshold) && window[i] > EcalConditions.physicalToPedestal(cellID) + readoutThreshold) {
+                        thresholdCrossing = i;
+                        pointerOffset = Math.min(numSamplesBefore, i);
+                        numSamplesToRead = pointerOffset + Math.min(numSamplesAfter, readoutWindow - i - pointerOffset - 1);
+                        adcSum = 0;
+                    }
+                }
+            }
+        }
+        return hits;
+    }
+
+    @Override
+    protected void putHits(List<CalorimeterHit> hits) {
+        //fill the readout buffers
+        for (CalorimeterHit hit : hits) {
+            RingBuffer eDepBuffer = eDepMap.get(hit.getCellID());
+            for (int i = 0; i < bufferLength; i++) {
+                eDepBuffer.addToCell(i, hit.getRawEnergy() * pulseAmplitude((i + 1) * readoutPeriod + readoutTime() - (ClockSingleton.getTime() + hit.getTime())));
+            }
+        }
+    }
+
+    @Override
+    protected void initReadout() {
+        //initialize buffers
+        sumMap = new HashMap<Long, Double>();
+        timeMap = new HashMap<Long, Integer>();
+        outputQueue = new PriorityQueue(20, new HPSRawCalorimeterHit.TimeComparator());
+        pulseIntegral = tp * Math.E / readoutPeriod;
+        resetFADCBuffers();
+    }
+
+    @Override
+    public void detectorChanged(Detector detector) {
+        // Get the Subdetector.
+        ecal = detector.getSubdetector(ecalName);
+        resetFADCBuffers();
+    }
+
+    private boolean resetFADCBuffers() {
+        if (ecal == null) {
+            return false;
+        }
+        eDepMap = new HashMap<Long, RingBuffer>();
+        pipelineMap = new HashMap<Long, FADCPipeline>();
+        Set<Long> cells = ((HPSEcal3) ecal).getNeighborMap().keySet();
+        for (Long cellID : cells) {
+            eDepMap.put(cellID, new RingBuffer(bufferLength));
+            pipelineMap.put(cellID, new FADCPipeline(pipelineLength, (int) Math.round(EcalConditions.physicalToPedestal(cellID))));
+        }
+        return true;
+    }
+
+    private double pulseAmplitude(double time) {
+        if (time <= 0.0) {
+            return 0.0;
+        }
+        if (tp > 0.0) {
+            return (time / tp) * Math.exp(1.0 - time / tp);
+        } else {
+            if (time < -tp) {
+                return 1.0;
+            } else {
+                return 0.0;
+            }
+        }
+    }
+
+    private class FADCPipeline {
+
+        private int[] array;
+        private int size;
+        private int ptr;
+
+        public FADCPipeline(int size) {
+            this.size = size;
+            array = new int[size]; //initialized to 0
+            ptr = 0;
+        }
+
+        //construct pipeline with a nonzero initial value
+        public FADCPipeline(int size, int init) {
+            this.size = size;
+            array = new int[size];
+            for (int i = 0; i < size; i++) {
+                array[i] = init;
+            }
+            ptr = 0;
+        }
+
+        /**
+         * Write value to current cell
+         */
+        public void writeValue(int val) {
+            array[ptr] = val;
+        }
+
+        /**
+         * Write value to current cell
+         */
+        public void step() {
+            ptr++;
+            if (ptr == size) {
+                ptr = 0;
+            }
+        }
+
+        //return content of specified cell (pos=0 for current cell)
+        public int getValue(int pos) {
+            if (pos >= size || pos < 0) {
+                throw new ArrayIndexOutOfBoundsException();
+            }
+            return array[((ptr - pos) % size + size) % size];
+        }
+    }
+}
\ No newline at end of file

hps-java/src/main/java/org/lcsim/hps/readout/ecal
SimpleEcalReadoutDriver.java added at 1.1
diff -N SimpleEcalReadoutDriver.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ SimpleEcalReadoutDriver.java	25 Feb 2013 22:39:26 -0000	1.1
@@ -0,0 +1,59 @@
+package org.lcsim.hps.readout.ecal;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.lcsim.event.CalorimeterHit;
+import org.lcsim.hps.recon.ecal.HPSCalorimeterHit;
+
+/**
+ * Performs readout of ECal hits.
+ * No time evolution - this just integrates all hits in a cycle.
+ *
+ * @author Sho Uemura <[log in to unmask]>
+ * @version $Id: SimpleEcalReadoutDriver.java,v 1.1 2013/02/25 22:39:26 meeg Exp $
+ */
+public class SimpleEcalReadoutDriver extends EcalReadoutDriver<HPSCalorimeterHit> {
+    //buffer for deposited energy
+    Map<Long, Double> eDepMap = null;
+
+	public SimpleEcalReadoutDriver() {
+		hitClass = HPSCalorimeterHit.class;
+	}
+
+    @Override
+    protected void readHits(List<HPSCalorimeterHit> hits) {
+        for (Long cellID : eDepMap.keySet()) {
+//            int ix = dec.getValue("ix");
+//            int iy = dec.getValue("iy");
+//            //temporary hack to disable crystals and flip X coordinate
+//            int side = dec.getValue("side");
+//            if (iy == 1 && ix*side >= -10 && ix*side <= -2)
+//                continue;
+            if (eDepMap.get(cellID) > threshold)
+                hits.add(new HPSCalorimeterHit(eDepMap.get(cellID), readoutTime(), cellID, hitType));
+        }
+        //reset hit integration
+        eDepMap = new HashMap<Long, Double>();
+    }
+
+    @Override
+    protected void putHits(List<CalorimeterHit> hits) {
+        //fill the readout buffers
+        for (CalorimeterHit hit : hits) {
+            Double eDep = eDepMap.get(hit.getCellID());
+            if (eDep == null) {
+                eDepMap.put(hit.getCellID(), hit.getRawEnergy());
+            } else {
+                eDepMap.put(hit.getCellID(), eDep + hit.getRawEnergy());
+            }
+        }
+    }
+
+    @Override
+    protected void initReadout() {
+        //initialize buffers
+        eDepMap = new HashMap<Long, Double>();
+    }
+}

hps-java/src/main/java/org/lcsim/hps/readout/ecal
EcalReadoutDriver.java added at 1.1
diff -N EcalReadoutDriver.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ EcalReadoutDriver.java	25 Feb 2013 22:39:26 -0000	1.1
@@ -0,0 +1,152 @@
+package org.lcsim.hps.readout.ecal;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.lcsim.event.CalorimeterHit;
+import org.lcsim.event.EventHeader;
+import org.lcsim.hps.util.ClockSingleton;
+import org.lcsim.util.Driver;
+import org.lcsim.util.lcio.LCIOConstants;
+
+/**
+ * Performs readout of ECal hits.
+ *
+ * @author Sho Uemura <[log in to unmask]>
+ * @version $Id: EcalReadoutDriver.java,v 1.1 2013/02/25 22:39:26 meeg Exp $
+ */
+public abstract class EcalReadoutDriver<T> extends Driver {
+
+    String ecalCollectionName;
+    String ecalRawCollectionName = "EcalRawHits";
+    String ecalReadoutName = "EcalHits";
+    Class hitClass;
+    //hit type as in org.lcsim.recon.calorimetry.CalorimeterHitType
+    int hitType = 0;
+    //number of bunches in readout cycle
+    int readoutCycle = 1;
+    //minimum readout value to write a hit
+    double threshold = 0.0;
+    //LCIO flags
+    int flags = 0;
+    //readout period in ns
+    double readoutPeriod = 2.0;
+    //readout period time offset in ns
+    double readoutOffset = 0.0;
+    //readout period counter
+    int readoutCounter;
+    public static boolean readoutBit = false;
+    protected boolean debug = false;
+
+    public EcalReadoutDriver() {
+        flags += 1 << LCIOConstants.CHBIT_LONG; //store position
+        flags += 1 << LCIOConstants.RCHBIT_ID1; //store cell ID
+
+    }
+
+    public void setDebug(boolean debug) {
+        this.debug = debug;
+    }
+
+    public void setEcalReadoutName(String ecalReadoutName) {
+        this.ecalReadoutName = ecalReadoutName;
+    }
+
+    public void setEcalRawCollectionName(String ecalRawCollectionName) {
+        this.ecalRawCollectionName = ecalRawCollectionName;
+    }
+
+    public void setEcalCollectionName(String ecalCollectionName) {
+        this.ecalCollectionName = ecalCollectionName;
+    }
+
+    public void setReadoutCycle(int readoutCycle) {
+        this.readoutCycle = readoutCycle;
+        if (readoutCycle > 0) {
+            this.readoutPeriod = readoutCycle * ClockSingleton.getDt();
+        }
+    }
+
+    public void setReadoutOffset(double readoutOffset) {
+        this.readoutOffset = readoutOffset;
+    }
+
+    public void setReadoutPeriod(double readoutPeriod) {
+        this.readoutPeriod = readoutPeriod;
+        this.readoutCycle = -1;
+    }
+
+    public void setThreshold(double threshold) {
+        this.threshold = threshold;
+    }
+
+    @Override
+    public void startOfData() {
+        if (ecalCollectionName == null) {
+            throw new RuntimeException("The parameter ecalCollectionName was not set!");
+        }
+
+        readoutCounter = 0;
+
+        initReadout();
+    }
+
+    @Override
+    public void process(EventHeader event) {
+        //System.out.println(this.getClass().getCanonicalName() + " - process");
+        // Get the list of ECal hits.        
+        if (event.hasCollection(CalorimeterHit.class, ecalCollectionName)) {
+            List<CalorimeterHit> hits = event.get(CalorimeterHit.class, ecalCollectionName);
+
+            //write hits into buffers
+            putHits(hits);
+        }
+
+        ArrayList<T> newHits = null;
+
+        //if at the end of a readout cycle, write buffers to hits
+        if (readoutCycle > 0) {
+            if ((ClockSingleton.getClock() + 1) % readoutCycle == 0) {
+                if (newHits == null) {
+                    newHits = new ArrayList<T>();
+                }
+                readHits(newHits);
+                readoutCounter++;
+            }
+        } else {
+            while (ClockSingleton.getTime() - readoutTime() + ClockSingleton.getDt() >= readoutPeriod) {
+                if (newHits == null) {
+                    newHits = new ArrayList<T>();
+                }
+                readHits(newHits);
+                readoutCounter++;
+            }
+        }
+
+        if (newHits != null) {
+            event.put(ecalRawCollectionName, newHits, hitClass, flags, ecalReadoutName);
+        }
+
+        if (readoutBit) {
+            processTrigger(event);
+            readoutBit = false;
+        }
+    }
+
+    protected double readoutTime() {
+        return readoutCounter * readoutPeriod + readoutOffset;
+    }
+
+    //read analog signal out of buffers and make hits; reset buffers
+    protected abstract void readHits(List<T> hits);
+
+    //add deposited energy to buffers
+    //must be run every event, even if the list is empty
+    protected abstract void putHits(List<CalorimeterHit> hits);
+
+    protected void processTrigger(EventHeader event) {
+    }
+
+    //initialize buffers
+    protected abstract void initReadout();
+}
\ No newline at end of file

hps-java/src/main/java/org/lcsim/hps/readout/ecal
DummyTriggerDriver.java added at 1.1
diff -N DummyTriggerDriver.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ DummyTriggerDriver.java	25 Feb 2013 22:39:26 -0000	1.1
@@ -0,0 +1,31 @@
+package org.lcsim.hps.readout.ecal;
+
+import java.util.List;
+import org.lcsim.event.EventHeader;
+import org.lcsim.hps.recon.ecal.HPSEcalCluster;
+import org.lcsim.hps.util.ClockSingleton;
+
+/**
+ * Free-running trigger - triggers on every Nth event
+ *
+ * @author Sho Uemura <[log in to unmask]>
+ * @version $Id: DummyTriggerDriver.java,v 1.1 2013/02/25 22:39:26 meeg Exp $
+ */
+public class DummyTriggerDriver extends TriggerDriver {
+
+    int period = 100;
+
+    public void setPeriod(int period) {
+        this.period = period;
+    }
+
+    @Override
+    public boolean triggerDecision(EventHeader event) {
+        return (ClockSingleton.getClock() % period == 0);
+    }
+
+    @Override
+    public boolean testTrigger(List<HPSEcalCluster> clusters) {
+        return false;
+    }
+}

hps-java/src/main/java/org/lcsim/hps/monitoring
CalibrationDriver.java added at 1.1
diff -N CalibrationDriver.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ CalibrationDriver.java	25 Feb 2013 22:39:26 -0000	1.1
@@ -0,0 +1,105 @@
+package org.lcsim.hps.monitoring;
+
+import org.lcsim.conditions.ConditionsEvent;
+import org.lcsim.conditions.ConditionsListener;
+import org.lcsim.conditions.ConditionsManager;
+import org.lcsim.conditions.ConditionsSet;
+import org.lcsim.event.EventHeader;
+import org.lcsim.geometry.Detector;
+import org.lcsim.hps.recon.ecal.EcalConditions;
+import org.lcsim.hps.recon.tracking.FieldMap;
+import org.lcsim.hps.recon.tracking.HPSSVTCalibrationConstants;
+import org.lcsim.hps.recon.tracking.HPSSVTSensorSetup;
+import org.lcsim.util.Driver;
+
+/**
+ *
+ * @author Sho Uemura <[log in to unmask]>
+ * @version $Id: CalibrationDriver.java,v 1.1 2013/02/25 22:39:26 meeg Exp $
+ */
+public class CalibrationDriver extends Driver implements ConditionsListener {
+
+    // The test run number of interest.  If it equals -1, the default calibrations
+    // are loaded
+    private static int runNumber = -1;
+    private boolean fixRunNumber = false;
+
+    public CalibrationDriver() {
+        add(new EcalConditions());
+        add(new HPSSVTSensorSetup());
+    }
+
+    public void setRunNumber(int runNumber) {
+        CalibrationDriver.runNumber = runNumber;
+        fixRunNumber = true;
+    }
+
+    public static int runNumber() {
+        return runNumber;
+    }
+
+    @Override
+    protected void process(EventHeader event) {
+        super.process(event);
+        if (!fixRunNumber && runNumber != event.getRunNumber()) {
+            runNumber = event.getRunNumber();
+        }
+    }
+
+    @Override
+    protected void detectorChanged(Detector detector) {
+        super.detectorChanged(detector);
+
+        if (!EcalConditions.calibrationLoaded()) {
+            EcalConditions.loadCalibration();
+        }
+        if (fixRunNumber && (!HPSSVTCalibrationConstants.pedestalLoaded() || !HPSSVTCalibrationConstants.tpLoaded())) {
+            System.out.println("Loading calibration for set run: " + runNumber);
+            loadCalibsByRun(runNumber);
+        }
+    }
+
+    @Override
+    protected void startOfData() {
+        ConditionsManager.defaultInstance().addConditionsListener(this);
+    }
+
+    @Override
+    public void conditionsChanged(ConditionsEvent ce) {
+        if (!fixRunNumber) {
+            System.out.println("Got ConditionsEvent with run: " + ce.getConditionsManager().getRun());
+            runNumber = ce.getConditionsManager().getRun();
+            loadCalibsByRun(runNumber);
+        }
+    }
+
+    private void loadCalibsByRun(int run) {
+        HPSSVTCalibrationConstants.loadCalibration(run);
+        FieldMap.loadFieldMap(run);
+    }
+
+    /**
+     * get specified conditions list, parse as a map of run numbers to calibration file paths; get the appropriate file 
+     * @param calibName 
+     * @param run
+     * @return
+     */
+    public static String getCalibForRun(String calibName, int run) {
+        System.out.println("Reading calibrations " + calibName + " for run: " + run);
+
+        ConditionsSet calibSet = ConditionsManager.defaultInstance().getConditions(calibName);
+
+        int mostRecentValid = Integer.MIN_VALUE;
+        String filePath = null;
+        for (Object key : calibSet.keySet()) {
+            int keyRun = Integer.parseInt((String) key);
+//            System.out.println("Available calibration for run: " + keyRun);
+            if (keyRun > mostRecentValid && keyRun <= run) {
+                mostRecentValid = keyRun;
+                filePath = calibSet.getString((String) key);
+            }
+        }
+        System.out.println("Use this calibration from run " + mostRecentValid + ": " + filePath);
+        return filePath;
+    }
+}

hps-java/src/main/java/org/lcsim/hps/monitoring
HPSCalibrationDriver.java removed after 1.8
diff -N HPSCalibrationDriver.java
--- HPSCalibrationDriver.java	21 Sep 2012 23:22:18 -0000	1.8
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,105 +0,0 @@
-package org.lcsim.hps.monitoring;
-
-import org.lcsim.conditions.ConditionsEvent;
-import org.lcsim.conditions.ConditionsListener;
-import org.lcsim.conditions.ConditionsManager;
-import org.lcsim.conditions.ConditionsSet;
-import org.lcsim.event.EventHeader;
-import org.lcsim.geometry.Detector;
-import org.lcsim.hps.recon.ecal.HPSEcalConditions;
-import org.lcsim.hps.recon.tracking.FieldMap;
-import org.lcsim.hps.recon.tracking.HPSSVTCalibrationConstants;
-import org.lcsim.hps.recon.tracking.HPSSVTSensorSetup;
-import org.lcsim.util.Driver;
-
-/**
- *
- * @author Sho Uemura <[log in to unmask]>
- * @version $Id: HPSCalibrationDriver.java,v 1.8 2012/09/21 23:22:18 meeg Exp $
- */
-public class HPSCalibrationDriver extends Driver implements ConditionsListener {
-
-    // The test run number of interest.  If it equals -1, the default calibrations
-    // are loaded
-    private static int runNumber = -1;
-    private boolean fixRunNumber = false;
-
-    public HPSCalibrationDriver() {
-        add(new HPSEcalConditions());
-        add(new HPSSVTSensorSetup());
-    }
-
-    public void setRunNumber(int runNumber) {
-        HPSCalibrationDriver.runNumber = runNumber;
-        fixRunNumber = true;
-    }
-
-    public static int runNumber() {
-        return runNumber;
-    }
-
-    @Override
-    protected void process(EventHeader event) {
-        super.process(event);
-        if (!fixRunNumber && runNumber != event.getRunNumber()) {
-            runNumber = event.getRunNumber();
-        }
-    }
-
-    @Override
-    protected void detectorChanged(Detector detector) {
-        super.detectorChanged(detector);
-
-        if (!HPSEcalConditions.calibrationLoaded()) {
-            HPSEcalConditions.loadCalibration();
-        }
-        if (fixRunNumber && (!HPSSVTCalibrationConstants.pedestalLoaded() || !HPSSVTCalibrationConstants.tpLoaded())) {
-            System.out.println("Loading calibration for set run: " + runNumber);
-            loadCalibsByRun(runNumber);
-        }
-    }
-
-    @Override
-    protected void startOfData() {
-        ConditionsManager.defaultInstance().addConditionsListener(this);
-    }
-
-    @Override
-    public void conditionsChanged(ConditionsEvent ce) {
-        if (!fixRunNumber) {
-            System.out.println("Got ConditionsEvent with run: " + ce.getConditionsManager().getRun());
-            runNumber = ce.getConditionsManager().getRun();
-            loadCalibsByRun(runNumber);
-        }
-    }
-
-    private void loadCalibsByRun(int run) {
-        HPSSVTCalibrationConstants.loadCalibration(run);
-        FieldMap.loadFieldMap(run);
-    }
-
-    /**
-     * get specified conditions list, parse as a map of run numbers to calibration file paths; get the appropriate file 
-     * @param calibName 
-     * @param run
-     * @return
-     */
-    public static String getCalibForRun(String calibName, int run) {
-        System.out.println("Reading calibrations " + calibName + " for run: " + run);
-
-        ConditionsSet calibSet = ConditionsManager.defaultInstance().getConditions(calibName);
-
-        int mostRecentValid = Integer.MIN_VALUE;
-        String filePath = null;
-        for (Object key : calibSet.keySet()) {
-            int keyRun = Integer.parseInt((String) key);
-//            System.out.println("Available calibration for run: " + keyRun);
-            if (keyRun > mostRecentValid && keyRun <= run) {
-                mostRecentValid = keyRun;
-                filePath = calibSet.getString((String) key);
-            }
-        }
-        System.out.println("Use this calibration from run " + mostRecentValid + ": " + filePath);
-        return filePath;
-    }
-}

hps-java/src/main/java/org/lcsim/hps/users/phansson
MultScatAnalysis.java 1.7 -> 1.8
diff -u -r1.7 -r1.8
--- MultScatAnalysis.java	9 Sep 2012 02:50:00 -0000	1.7
+++ MultScatAnalysis.java	25 Feb 2013 22:39:26 -0000	1.8
@@ -23,7 +23,7 @@
 import org.lcsim.hps.evio.TriggerData;
 import org.lcsim.hps.monitoring.AIDAFrame;
 import org.lcsim.hps.recon.ecal.HPSEcalCluster;
-import org.lcsim.hps.recon.ecal.HPSEcalConditions;
+import org.lcsim.hps.recon.ecal.EcalConditions;
 import org.lcsim.hps.recon.tracking.EcalTrackMatch;
 import org.lcsim.hps.recon.tracking.SvtTrackExtrapolator;
 import org.lcsim.util.Driver;
@@ -2149,9 +2149,9 @@
      
     private boolean hasBadNeighbours(HPSEcalCluster cluster) {
         //check if this cluster has a neighbour that is dead or bad
-        if(!HPSEcalConditions.badChannelsLoaded()) return false;
+        if(!EcalConditions.badChannelsLoaded()) return false;
         List<CalorimeterHit> hits = cluster.getCalorimeterHits();
-        IIdentifierHelper helper = HPSEcalConditions.getHelper();
+        IIdentifierHelper helper = EcalConditions.getHelper();
         IExpandedIdentifier expId = new ExpandedIdentifier(helper.getIdentifierDictionary().getNumberOfFields());
         expId.setValue(helper.getFieldIndex("system"), ecal.getSystemID());
         
@@ -2162,7 +2162,7 @@
         for(CalorimeterHit hit : hits) {
             IIdentifier compactId = hit.getIdentifier();   
             //x-check
-            if(HPSEcalConditions.isBadChannel(hit.getCellID())) {
+            if(EcalConditions.isBadChannel(hit.getCellID())) {
                 System.out.println("This cluster has a bad channel hit included!? ");
                 int x = helper.getValue(compactId, "ix");
                 int y = helper.getValue(compactId, "iy");
@@ -2182,7 +2182,7 @@
                     expId.setValue(helper.getFieldIndex("iy"), iy);
                     IIdentifier compactId_t = helper.pack(expId);
                     System.out.println("Check" + ix + "," + iy + " id " + compactId_t.getValue());
-                    if(HPSEcalConditions.isBadChannel(compactId_t.getValue())) {
+                    if(EcalConditions.isBadChannel(compactId_t.getValue())) {
                         System.out.println("This cell was BAD!");
                         return true;
                     }

hps-java/src/main/java/org/lcsim/hps/users/phansson
TrigRateDriver.java 1.5 -> 1.6
diff -u -r1.5 -r1.6
--- TrigRateDriver.java	1 Oct 2012 21:26:31 -0000	1.5
+++ TrigRateDriver.java	25 Feb 2013 22:39:26 -0000	1.6
@@ -23,7 +23,7 @@
 import org.lcsim.geometry.Subdetector;
 import org.lcsim.hps.monitoring.AIDAFrame;
 import org.lcsim.hps.recon.ecal.HPSEcalCluster;
-import org.lcsim.hps.recon.ecal.HPSEcalConditions;
+import org.lcsim.hps.recon.ecal.EcalConditions;
 import org.lcsim.hps.recon.tracking.EcalTrackMatch;
 import org.lcsim.util.Driver;
 import org.lcsim.util.aida.AIDA;
@@ -380,9 +380,9 @@
      
     private boolean hasBadNeighbours(HPSEcalCluster cluster) {
         //check if this cluster has a neighbour that is dead or bad
-        if(!HPSEcalConditions.badChannelsLoaded()) return false;
+        if(!EcalConditions.badChannelsLoaded()) return false;
         List<CalorimeterHit> hits = cluster.getCalorimeterHits();
-        IIdentifierHelper helper = HPSEcalConditions.getHelper();
+        IIdentifierHelper helper = EcalConditions.getHelper();
         IExpandedIdentifier expId = new ExpandedIdentifier(helper.getIdentifierDictionary().getNumberOfFields());
         expId.setValue(helper.getFieldIndex("system"), ecal.getSystemID());
         
@@ -393,7 +393,7 @@
         for(CalorimeterHit hit : hits) {
             IIdentifier compactId = hit.getIdentifier();   
             //x-check
-            if(HPSEcalConditions.isBadChannel(hit.getCellID())) {
+            if(EcalConditions.isBadChannel(hit.getCellID())) {
                 System.out.println("This cluster has a bad channel hit included!? ");
                 int x = helper.getValue(compactId, "ix");
                 int y = helper.getValue(compactId, "iy");
@@ -413,7 +413,7 @@
                     expId.setValue(helper.getFieldIndex("iy"), iy);
                     IIdentifier compactId_t = helper.pack(expId);
                     System.out.println("Check" + ix + "," + iy + " id " + compactId_t.getValue());
-                    if(HPSEcalConditions.isBadChannel(compactId_t.getValue())) {
+                    if(EcalConditions.isBadChannel(compactId_t.getValue())) {
                         System.out.println("This cell was BAD!");
                         return true;
                     }

hps-java/src/main/java/org/lcsim/hps/users/phansson
ecalGainAna.java 1.9 -> 1.10
diff -u -r1.9 -r1.10
--- ecalGainAna.java	20 Nov 2012 20:00:36 -0000	1.9
+++ ecalGainAna.java	25 Feb 2013 22:39:26 -0000	1.10
@@ -7,8 +7,8 @@
 import java.util.logging.Logger;
 import org.apache.commons.cli.*;
 import org.lcsim.geometry.util.DetectorLocator;
-import org.lcsim.hps.recon.ecal.HPSECalUtils;
-import org.lcsim.hps.recon.ecal.HPSEcalConditions;
+import org.lcsim.hps.recon.ecal.ECalUtils;
+import org.lcsim.hps.recon.ecal.EcalConditions;
 
 /**
  *
@@ -134,8 +134,8 @@
             detectorName = cmd.getOptionValue("d");
         }
 
-        HPSEcalConditions.detectorChanged(DetectorLocator.findDetector(detectorName), "Ecal");
-        HPSEcalConditions.loadCalibration();
+        EcalConditions.detectorChanged(DetectorLocator.findDetector(detectorName), "Ecal");
+        EcalConditions.loadCalibration();
 
         IHistogramFactory hf = af.createHistogramFactory(null);
 
@@ -244,12 +244,12 @@
         }
         for (int x = -23; x <= 23; x++) {
             for (int y = -5; y <= 5; y++) {
-                pePlotsHVSim[HPSECalUtils.getQuadrant(x, y) - 1][HPSECalUtils.getHVGroup(x, y) - 1].add(pePlotsSim[x + 23][y + 5][0]);
-                pePlotsHVReal[HPSECalUtils.getQuadrant(x, y) - 1][HPSECalUtils.getHVGroup(x, y) - 1].add(pePlotsReal[x + 23][y + 5][0]);
-                weightsHVSim[HPSECalUtils.getQuadrant(x, y) - 1][HPSECalUtils.getHVGroup(x, y) - 1] += weightPlotSim.binHeight(x + 23, y + 5);
-                sumsHVSim[HPSECalUtils.getQuadrant(x, y) - 1][HPSECalUtils.getHVGroup(x, y) - 1] += sumPlotSim.binHeight(x + 23, y + 5);
-                weightsHVReal[HPSECalUtils.getQuadrant(x, y) - 1][HPSECalUtils.getHVGroup(x, y) - 1] += weightPlotReal.binHeight(x + 23, y + 5);
-                sumsHVReal[HPSECalUtils.getQuadrant(x, y) - 1][HPSECalUtils.getHVGroup(x, y) - 1] += sumPlotReal.binHeight(x + 23, y + 5);
+                pePlotsHVSim[ECalUtils.getQuadrant(x, y) - 1][ECalUtils.getHVGroup(x, y) - 1].add(pePlotsSim[x + 23][y + 5][0]);
+                pePlotsHVReal[ECalUtils.getQuadrant(x, y) - 1][ECalUtils.getHVGroup(x, y) - 1].add(pePlotsReal[x + 23][y + 5][0]);
+                weightsHVSim[ECalUtils.getQuadrant(x, y) - 1][ECalUtils.getHVGroup(x, y) - 1] += weightPlotSim.binHeight(x + 23, y + 5);
+                sumsHVSim[ECalUtils.getQuadrant(x, y) - 1][ECalUtils.getHVGroup(x, y) - 1] += sumPlotSim.binHeight(x + 23, y + 5);
+                weightsHVReal[ECalUtils.getQuadrant(x, y) - 1][ECalUtils.getHVGroup(x, y) - 1] += weightPlotReal.binHeight(x + 23, y + 5);
+                sumsHVReal[ECalUtils.getQuadrant(x, y) - 1][ECalUtils.getHVGroup(x, y) - 1] += sumPlotReal.binHeight(x + 23, y + 5);
                 allWeightsReal += weightPlotReal.binHeight(x + 23, y + 5);
                 allWeightsSim += weightPlotSim.binHeight(x + 23, y + 5);
             }
@@ -257,7 +257,7 @@
 
         for (int x = -23; x <= 23; x++) {
             for (int y = -5; y <= 5; y++) {
-                Double gain = HPSEcalConditions.physicalToGain(HPSEcalConditions.makePhysicalID(x, y));
+                Double gain = EcalConditions.physicalToGain(EcalConditions.makePhysicalID(x, y));
                 if (gain != null) {
                     ecalPlot.fill(x, y, gain);
 //                    gainsPlot.fill(x, y, HPSECalUtils.getHVGroup(x, y));
@@ -317,15 +317,15 @@
             for (int x = -23; x <= 23; x++) {
                 for (int iy = 1; iy <= 5; iy++) {
                     int y = side == 0 ? iy : -iy;
-                    Double gain = HPSEcalConditions.physicalToGain(HPSEcalConditions.makePhysicalID(x, y));
+                    Double gain = EcalConditions.physicalToGain(EcalConditions.makePhysicalID(x, y));
                     IHistogram1D peSim = pePlotsSim[x + 23][y + 5][0];
                     IHistogram1D peReal = pePlotsReal[x + 23][y + 5][0];
-                    IHistogram1D peHVSim = pePlotsHVSim[HPSECalUtils.getQuadrant(x, y) - 1][HPSECalUtils.getHVGroup(x, y) - 1];
-                    IHistogram1D peHVReal = pePlotsHVReal[HPSECalUtils.getQuadrant(x, y) - 1][HPSECalUtils.getHVGroup(x, y) - 1];
-                    double weightHVReal = weightsHVReal[HPSECalUtils.getQuadrant(x, y) - 1][HPSECalUtils.getHVGroup(x, y) - 1];
-                    double sumHVReal = sumsHVReal[HPSECalUtils.getQuadrant(x, y) - 1][HPSECalUtils.getHVGroup(x, y) - 1];
-                    double weightHVSim = weightsHVSim[HPSECalUtils.getQuadrant(x, y) - 1][HPSECalUtils.getHVGroup(x, y) - 1];
-                    double sumHVSim = sumsHVSim[HPSECalUtils.getQuadrant(x, y) - 1][HPSECalUtils.getHVGroup(x, y) - 1];
+                    IHistogram1D peHVSim = pePlotsHVSim[ECalUtils.getQuadrant(x, y) - 1][ECalUtils.getHVGroup(x, y) - 1];
+                    IHistogram1D peHVReal = pePlotsHVReal[ECalUtils.getQuadrant(x, y) - 1][ECalUtils.getHVGroup(x, y) - 1];
+                    double weightHVReal = weightsHVReal[ECalUtils.getQuadrant(x, y) - 1][ECalUtils.getHVGroup(x, y) - 1];
+                    double sumHVReal = sumsHVReal[ECalUtils.getQuadrant(x, y) - 1][ECalUtils.getHVGroup(x, y) - 1];
+                    double weightHVSim = weightsHVSim[ECalUtils.getQuadrant(x, y) - 1][ECalUtils.getHVGroup(x, y) - 1];
+                    double sumHVSim = sumsHVSim[ECalUtils.getQuadrant(x, y) - 1][ECalUtils.getHVGroup(x, y) - 1];
                     if (gain != null) {
                         if (weightPlotSim.binHeight(x + 23, y + 5) > minCount && weightPlotReal.binHeight(x + 23, y + 5) > minCount) {
                             gain *= (corrPlotSim.binHeight(x + 23, y + 5) / corrPlotReal.binHeight(x + 23, y + 5));

hps-java/src/main/java/org/lcsim/hps/users/phansson
ECalGainDriver.java 1.11 -> 1.12
diff -u -r1.11 -r1.12
--- ECalGainDriver.java	8 Sep 2012 00:17:53 -0000	1.11
+++ ECalGainDriver.java	25 Feb 2013 22:39:26 -0000	1.12
@@ -429,7 +429,7 @@
 
         gainWriter.print(event.getEventNumber() + " " + P + " " + E + " " + pos[0] + " " + pos[1]);
         for (CalorimeterHit hit : bestCl.getCalorimeterHits()) {
-            gainWriter.print(" " + hit.getIdentifierFieldValue("ix") + " " + hit.getIdentifierFieldValue("iy") + " " + hit.getRawEnergy() + " " + HPSEcalConditions.physicalToGain(hit.getCellID()));
+            gainWriter.print(" " + hit.getIdentifierFieldValue("ix") + " " + hit.getIdentifierFieldValue("iy") + " " + hit.getRawEnergy() + " " + EcalConditions.physicalToGain(hit.getCellID()));
         }
         gainWriter.println("");
     }
@@ -458,7 +458,7 @@
         //displayFastTrackingPlots();
         for (int x = -23; x <= 23; x++) { // slot
             for (int y = -5; y <= 5; y++) { // crate  
-                if (HPSEcalConditions.physicalToGain(HPSEcalConditions.makePhysicalID(x, y)) != null) {
+                if (EcalConditions.physicalToGain(EcalConditions.makePhysicalID(x, y)) != null) {
                     System.out.printf("%d\t%d\t%d\t%f\t%f\n", x, y, pePlots[x + 23][y + 5][0].allEntries(), pePlots[x + 23][y + 5][0].mean(), pePlots[x + 23][y + 5][0].rms());
                 }
             }

hps-java/src/main/java/org/lcsim/hps/analysis/ecal
TestRunRateAnalysis.java added at 1.1
diff -N TestRunRateAnalysis.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ TestRunRateAnalysis.java	25 Feb 2013 22:39:26 -0000	1.1
@@ -0,0 +1,170 @@
+package org.lcsim.hps.analysis.ecal;
+
+import hep.aida.IHistogram1D;
+import hep.aida.IHistogram2D;
+import java.util.List;
+import org.lcsim.event.CalorimeterHit;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.MCParticle;
+import org.lcsim.event.util.ParticleTypeClassifier;
+import org.lcsim.hps.recon.ecal.HPSEcalCluster;
+import org.lcsim.util.Driver;
+import org.lcsim.util.aida.AIDA;
+
+/**
+ * Reads clusters and makes trigger decision using opposite quadrant criterion.
+ * Prints triggers to file if file path specified.
+ *
+ * @author Sho Uemura <[log in to unmask]>
+ * @version $Id: TestRunRateAnalysis.java,v 1.1 2013/02/25 22:39:26 meeg Exp $
+ */
+public class TestRunRateAnalysis extends Driver {
+
+    AIDA aida = AIDA.defaultInstance();
+    IHistogram2D eClusterVsP, photonEClusterVsP, electronEClusterVsP, positronEClusterVsP;
+    IHistogram2D eVsP, photonEVsP, electronEVsP, positronEVsP;
+    IHistogram1D eClusterOverP, photonEClusterOverP, electronEClusterOverP, positronEClusterOverP;
+    IHistogram1D eOverP, photonEOverP, electronEOverP, positronEOverP;
+    private String clusterCollectionName;
+    private String hitCollectionName = "EcalHits";
+    int nTriggers;
+    private double clusterEnergyLow = 10;    //
+    int deadtimelessTriggerCount;
+    int[] triggersY = new int[5];
+
+    public TestRunRateAnalysis() {
+    }
+
+    @Override
+    public void startOfData() {
+        deadtimelessTriggerCount = 0;
+
+        eClusterVsP = aida.histogram2D("All Cluster E vs. Pz", 100, 0.0, 2000.0, 100, 0.0, 2000.0);
+        photonEClusterVsP = aida.histogram2D("Photon Cluster E vs. Pz", 100, 0.0, 2000.0, 100, 0.0, 2000.0);
+        electronEClusterVsP = aida.histogram2D("Electron Cluster E vs. Pz", 100, 0.0, 2000.0, 100, 0.0, 2000.0);
+        positronEClusterVsP = aida.histogram2D("Positron Cluster E vs. Pz", 100, 0.0, 2000.0, 100, 0.0, 2000.0);
+
+        eClusterOverP = aida.histogram1D("Cluster E over Pz, Pz > 0.6", 100, 0.0, 2.0);
+        photonEClusterOverP = aida.histogram1D("Photon Cluster E over Pz, Pz > 0.6", 100, 0.0, 2.0);
+        electronEClusterOverP = aida.histogram1D("Electron Cluster E over Pz, Pz > 0.6", 100, 0.0, 2.0);
+        positronEClusterOverP = aida.histogram1D("Positron Cluster E over Pz, Pz > 0.6", 100, 0.0, 2.0);
+
+        eVsP = aida.histogram2D("All Edep vs. Pz", 100, 0.0, 2000.0, 100, 0.0, 2000.0);
+        photonEVsP = aida.histogram2D("Photon Edep vs. Pz", 100, 0.0, 2000.0, 100, 0.0, 2000.0);
+        electronEVsP = aida.histogram2D("Electron Edep vs. Pz", 100, 0.0, 2000.0, 100, 0.0, 2000.0);
+        positronEVsP = aida.histogram2D("Positron Edep vs. Pz", 100, 0.0, 2000.0, 100, 0.0, 2000.0);
+
+        eOverP = aida.histogram1D("All Edep over Pz, Pz > 0.6", 100, 0.0, 2.0);
+        photonEOverP = aida.histogram1D("Photon Edep over Pz, Pz > 0.6", 100, 0.0, 2.0);
+        electronEOverP = aida.histogram1D("Electron Edep over Pz, Pz > 0.6", 100, 0.0, 2.0);
+        positronEOverP = aida.histogram1D("Positron Edep over Pz, Pz > 0.6", 100, 0.0, 2.0);
+    }
+
+    public void setClusterEnergyLow(double clusterEnergyLow) {
+        this.clusterEnergyLow = clusterEnergyLow;
+    }
+
+    public void setClusterCollectionName(String clusterCollectionName) {
+        this.clusterCollectionName = clusterCollectionName;
+    }
+
+    @Override
+    public void process(EventHeader event) {
+        //System.out.println(this.getClass().getCanonicalName() + " - process");
+
+        // MCParticles
+        List<MCParticle> mcparticles = event.get(MCParticle.class).get(0);
+
+        if (mcparticles.isEmpty()) {
+            return;
+        }
+//        if (mcparticles.size() != 1) {
+//            throw new RuntimeException("expected exactly 1 MCParticle");
+//        }
+//        MCParticle particle = mcparticles.get(0);
+
+        // Get the list of raw ECal hits.
+        List<HPSEcalCluster> clusters = event.get(HPSEcalCluster.class, clusterCollectionName);
+        if (clusters == null) {
+            throw new RuntimeException("Event is missing ECal clusters collection!");
+        }
+
+        boolean trigger = false;
+
+        for (HPSEcalCluster cluster : clusters) {
+            if (cluster.getEnergy() > clusterEnergyLow && cluster.getSeedHit().getIdentifierFieldValue("ix") < 0) {
+//            if (cluster.getEnergy() > clusterEnergyLow && cluster.getSeedHit().getIdentifierFieldValue("iy")>0 && cluster.getSeedHit().getIdentifierFieldValue("ix")<0) {
+                triggersY[Math.abs(cluster.getSeedHit().getIdentifierFieldValue("iy")) - 1]++;
+                if (Math.abs(cluster.getSeedHit().getIdentifierFieldValue("iy")) > 1) {
+                    trigger = true;
+                }
+            }
+            if (cluster.getSeedHit().getIdentifierFieldValue("ix") < 0 && Math.abs(cluster.getSeedHit().getIdentifierFieldValue("iy")) > 1) {
+                for (MCParticle particle : mcparticles) {
+                    if (ParticleTypeClassifier.isElectron(particle.getPDGID())) {
+                        electronEClusterVsP.fill(1000.0 * particle.getPZ(), 1000.0 * cluster.getEnergy());
+                        if (particle.getPZ() > 0.6) {
+                            electronEClusterOverP.fill(cluster.getEnergy() / particle.getPZ());
+                        }
+                    } else if (ParticleTypeClassifier.isPositron(particle.getPDGID())) {
+                        positronEClusterVsP.fill(1000.0 * particle.getPZ(), 1000.0 * cluster.getEnergy());
+                        if (particle.getPZ() > 0.6) {
+                            positronEClusterOverP.fill(cluster.getEnergy() / particle.getPZ());
+                        }
+                    } else if (ParticleTypeClassifier.isPhoton(particle.getPDGID())) {
+                        photonEClusterVsP.fill(1000.0 * particle.getPZ(), 1000.0 * cluster.getEnergy());
+                        if (particle.getPZ() > 0.6) {
+                            photonEClusterOverP.fill(cluster.getEnergy() / particle.getPZ());
+                        }
+                    }
+                    eClusterVsP.fill(1000.0 * particle.getPZ(), 1000.0 * cluster.getEnergy());
+                    if (particle.getPZ() > 0.6) {
+                        eClusterOverP.fill(cluster.getEnergy() / particle.getPZ());
+                    }
+                }
+            }
+        }
+        if (trigger) {
+            deadtimelessTriggerCount++;
+        }
+
+        List<CalorimeterHit> hits = event.get(CalorimeterHit.class, hitCollectionName);
+        if (hits == null) {
+            throw new RuntimeException("Event is missing ECal hits collection!");
+        }
+        double totalE = 0;
+        for (CalorimeterHit hit : hits) {
+            totalE += hit.getRawEnergy();
+        }
+
+        for (MCParticle particle : mcparticles) {
+            if (ParticleTypeClassifier.isElectron(particle.getPDGID())) {
+                electronEVsP.fill(1000.0 * particle.getPZ(), 1000.0 * totalE);
+                if (particle.getPZ() > 0.6) {
+                    electronEOverP.fill(totalE / particle.getPZ());
+                }
+            } else if (ParticleTypeClassifier.isPositron(particle.getPDGID())) {
+                positronEVsP.fill(1000.0 * particle.getPZ(), 1000.0 * totalE);
+                if (particle.getPZ() > 0.6) {
+                    positronEOverP.fill(totalE / particle.getPZ());
+                }
+            } else if (ParticleTypeClassifier.isPhoton(particle.getPDGID())) {
+                photonEVsP.fill(1000.0 * particle.getPZ(), 1000.0 * totalE);
+                if (particle.getPZ() > 0.6) {
+                    photonEOverP.fill(totalE / particle.getPZ());
+                }
+            }
+            eVsP.fill(1000.0 * particle.getPZ(), 1000.0 * totalE);
+            if (particle.getPZ() > 0.6) {
+                eOverP.fill(totalE / particle.getPZ());
+            }
+        }
+    }
+
+    @Override
+    public void endOfData() {
+        System.out.printf("Trigger count without dead time: %d\n", deadtimelessTriggerCount);
+        System.out.format("Triggers vs. Y: %d\t%d\t%d\t%d\t%d, total %d\n", triggersY[0], triggersY[1], triggersY[2], triggersY[3], triggersY[4], deadtimelessTriggerCount);
+        super.endOfData();
+    }
+}
\ No newline at end of file

hps-java/src/main/java/org/lcsim/hps/analysis/ecal
HPSEcalTriggerPlotsDriver.java 1.6 -> 1.7
diff -u -r1.6 -r1.7
--- HPSEcalTriggerPlotsDriver.java	22 Dec 2012 00:54:15 -0000	1.6
+++ HPSEcalTriggerPlotsDriver.java	25 Feb 2013 22:39:26 -0000	1.7
@@ -9,10 +9,10 @@
 import org.lcsim.event.CalorimeterHit;
 import org.lcsim.event.EventHeader;
 import org.lcsim.geometry.IDDecoder;
-import org.lcsim.hps.recon.ecal.HPSECalUtils;
+import org.lcsim.hps.recon.ecal.ECalUtils;
 import org.lcsim.hps.recon.ecal.HPSEcalCluster;
-import org.lcsim.hps.recon.ecal.HPSRawCalorimeterHit;
-import org.lcsim.hps.recon.ecal.HPSTriggerDriver;
+import org.lcsim.hps.recon.ecal.HPSCalorimeterHit;
+import org.lcsim.hps.readout.ecal.TriggerDriver;
 import org.lcsim.util.Driver;
 import org.lcsim.util.aida.AIDA;
 
@@ -20,7 +20,7 @@
  * Diagnostic plots for HPS ECal.
  *
  * @author Sho Uemura <[log in to unmask]>
- * @version $Id: HPSEcalTriggerPlotsDriver.java,v 1.6 2012/12/22 00:54:15 meeg Exp $
+ * @version $Id: HPSEcalTriggerPlotsDriver.java,v 1.7 2013/02/25 22:39:26 meeg Exp $
  */
 public class HPSEcalTriggerPlotsDriver extends Driver {
 
@@ -40,7 +40,7 @@
     IDDecoder dec = null;
     private int coincidenceWindow = 2;
     private double tp = 14.0;
-    private double threshold = 50 * 10 * 0.15 * HPSECalUtils.MeV;
+    private double threshold = 50 * 10 * 0.15 * ECalUtils.MeV;
 
     public void setEcalCollectionName(String ecalCollectionName) {
         this.ecalCollectionName = ecalCollectionName;
@@ -104,13 +104,13 @@
             int ix = hit.getIdentifierFieldValue("ix");
             int iy = hit.getIdentifierFieldValue("iy");
             hitXYPlot.fill(ix-0.5*Math.signum(ix), iy, 1.0 / coincidenceWindow);
-            if (hit.getRawEnergy() > 100.0 * HPSECalUtils.MeV) {
+            if (hit.getRawEnergy() > 100.0 * ECalUtils.MeV) {
                 hitXYPlot100.fill(ix-0.5*Math.signum(ix), iy, 1.0 / coincidenceWindow);
-                if (hit.getRawEnergy() > 200.0 * HPSECalUtils.MeV) {
+                if (hit.getRawEnergy() > 200.0 * ECalUtils.MeV) {
                     hitXYPlot200.fill(ix-0.5*Math.signum(ix), iy, 1.0 / coincidenceWindow);
-                    if (hit.getRawEnergy() > 500.0 * HPSECalUtils.MeV) {
+                    if (hit.getRawEnergy() > 500.0 * ECalUtils.MeV) {
                         hitXYPlot500.fill(ix-0.5*Math.signum(ix), iy, 1.0 / coincidenceWindow);
-                        if (hit.getRawEnergy() > 1000.0 * HPSECalUtils.MeV) {
+                        if (hit.getRawEnergy() > 1000.0 * ECalUtils.MeV) {
                             hitXYPlot1000.fill(ix-0.5*Math.signum(ix), iy, 1.0 / coincidenceWindow);
                         }
                     }
@@ -128,7 +128,7 @@
         }
 
         for (HPSEcalCluster clus : clusters) {
-            HPSRawCalorimeterHit seedHit = (HPSRawCalorimeterHit) clus.getSeedHit();
+            HPSCalorimeterHit seedHit = (HPSCalorimeterHit) clus.getSeedHit();
             IIdentifier id = seedHit.getIdentifier();
             int ix = helper.unpack(id).getValue(helper.getFieldIndex("ix"));
             int iy = helper.unpack(id).getValue(helper.getFieldIndex("iy"));
@@ -145,9 +145,9 @@
             }
         }
 
-        if (HPSTriggerDriver.triggerBit()) {
+        if (TriggerDriver.triggerBit()) {
             for (HPSEcalCluster clus : clusters) {
-                HPSRawCalorimeterHit seedHit = (HPSRawCalorimeterHit) clus.getSeedHit();
+                HPSCalorimeterHit seedHit = (HPSCalorimeterHit) clus.getSeedHit();
                 IIdentifier id = seedHit.getIdentifier();
                 int ix = helper.unpack(id).getValue(helper.getFieldIndex("ix"));
                 int iy = helper.unpack(id).getValue(helper.getFieldIndex("iy"));

hps-java/src/main/java/org/lcsim/hps/analysis/ecal
HPSEcalPlotsDriver.java 1.15 -> 1.16
diff -u -r1.15 -r1.16
--- HPSEcalPlotsDriver.java	30 Jul 2012 23:31:45 -0000	1.15
+++ HPSEcalPlotsDriver.java	25 Feb 2013 22:39:26 -0000	1.16
@@ -22,8 +22,8 @@
 import org.lcsim.event.EventHeader;
 import org.lcsim.event.MCParticle;
 import org.lcsim.hps.recon.ecal.HPSEcalCluster;
-import org.lcsim.hps.recon.ecal.HPSRawCalorimeterHit;
-import org.lcsim.hps.recon.ecal.HPSTriggerDriver;
+import org.lcsim.hps.recon.ecal.HPSCalorimeterHit;
+import org.lcsim.hps.readout.ecal.TriggerDriver;
 import org.lcsim.hps.util.ClockSingleton;
 import org.lcsim.units.SystemOfUnits;
 import org.lcsim.util.Driver;
@@ -33,7 +33,7 @@
  * Diagnostic plots for HPS ECal.
  *
  * @author Jeremy McCormick <[log in to unmask]>
- * @version $Id: HPSEcalPlotsDriver.java,v 1.15 2012/07/30 23:31:45 meeg Exp $
+ * @version $Id: HPSEcalPlotsDriver.java,v 1.16 2013/02/25 22:39:26 meeg Exp $
  */
 public class HPSEcalPlotsDriver extends Driver {
 
@@ -191,7 +191,7 @@
     }
 
     public void process(EventHeader event) {
-        if (HPSTriggerDriver.triggerBit()) numTriggers++;
+        if (TriggerDriver.triggerBit()) numTriggers++;
 
         // MCParticles
         List<MCParticle> mcparticles = event.get(MCParticle.class).get(0);
@@ -238,7 +238,7 @@
             double e = clus.getEnergy();
             clusEPlot.fill(e);
             clusE += e;
-            HPSRawCalorimeterHit seedHit = (HPSRawCalorimeterHit) clus.getSeedHit();
+            HPSCalorimeterHit seedHit = (HPSCalorimeterHit) clus.getSeedHit();
             //double maxe = 0;
             for (CalorimeterHit hit : clus.getCalorimeterHits()) {
                 if (hitClusMap.containsKey(hit)) {
@@ -293,7 +293,7 @@
         int nhits100MeV = 0;
         int nhitsOver100MeV = 0;
 
-        if (HPSTriggerDriver.triggerBit() && numTriggers <= 100) {
+        if (TriggerDriver.triggerBit() && numTriggers <= 100) {
             hitXYPlot = aida.histogram2D(
                     ecalCollectionName + " : hit E, event " + String.format("%07d", ClockSingleton.getClock()),
                     47, -23.5, 23.5, 11, -5.5, 5.5);
@@ -347,7 +347,7 @@
             crystalXPlot.fill(ix);
             crystalYPlot.fill(iy);
             crystalXYPlot.fill(ix, iy);
-            if (HPSTriggerDriver.triggerBit() && numTriggers <= 100)
+            if (TriggerDriver.triggerBit() && numTriggers <= 100)
                 hitXYPlot.fill(ix, iy, eraw);
         }
 

hps-java/src/main/java/org/lcsim/hps/analysis/ecal
HPSEcalFADCPlotsDriver.java 1.3 -> 1.4
diff -u -r1.3 -r1.4
--- HPSEcalFADCPlotsDriver.java	9 Dec 2011 23:40:21 -0000	1.3
+++ HPSEcalFADCPlotsDriver.java	25 Feb 2013 22:39:26 -0000	1.4
@@ -9,7 +9,7 @@
 import org.lcsim.event.Cluster;
 import org.lcsim.event.EventHeader;
 import org.lcsim.hps.recon.ecal.HPSEcalCluster;
-import org.lcsim.hps.recon.ecal.HPSFADCCalorimeterHit;
+import org.lcsim.hps.recon.ecal.HPSRawCalorimeterHit;
 import org.lcsim.util.Driver;
 import org.lcsim.util.aida.AIDA;
 
@@ -17,7 +17,7 @@
  * Diagnostic plots for HPS ECal.
  *
  * @author Sho Uemura <[log in to unmask]>
- * @version $Id: HPSEcalFADCPlotsDriver.java,v 1.3 2011/12/09 23:40:21 meeg Exp $
+ * @version $Id: HPSEcalFADCPlotsDriver.java,v 1.4 2013/02/25 22:39:26 meeg Exp $
  */
 public class HPSEcalFADCPlotsDriver extends Driver {
 
@@ -79,11 +79,11 @@
 			throw new RuntimeException("Missing hit collection!");
 
 		if (rawCollectionName != null) {
-			List<HPSFADCCalorimeterHit> rawHits = event.get(HPSFADCCalorimeterHit.class, rawCollectionName);
+			List<HPSRawCalorimeterHit> rawHits = event.get(HPSRawCalorimeterHit.class, rawCollectionName);
 			if (rawHits == null)
 				throw new RuntimeException("Missing hit collection!");
 
-			for (HPSFADCCalorimeterHit hit : rawHits) {
+			for (HPSRawCalorimeterHit hit : rawHits) {
 				rawE.fill(hit.getAmplitude());
 				window_E.fill(hit.getAmplitude(),hit.getWindowSize());
 			}

hps-java/src/test/java/org/lcsim/hps/recon/tracking
MainTrackingDriver.java 1.1 -> 1.2
diff -u -r1.1 -r1.2
--- MainTrackingDriver.java	28 Nov 2012 06:42:05 -0000	1.1
+++ MainTrackingDriver.java	25 Feb 2013 22:39:26 -0000	1.2
@@ -4,7 +4,7 @@
  */
 package org.lcsim.hps.recon.tracking;
 
-import org.lcsim.hps.monitoring.HPSCalibrationDriver;
+import org.lcsim.hps.monitoring.CalibrationDriver;
 import org.lcsim.hps.users.mgraham.DataTrackerHitDriver;
 import org.lcsim.recon.tracking.digitization.sisim.config.RawTrackerHitSensorSetup;
 import org.lcsim.util.Driver;
@@ -21,7 +21,7 @@
     public MainTrackingDriver() {
 
         //Setup the sensors and calibrations
-        HPSCalibrationDriver calibDriver = new HPSCalibrationDriver();
+        CalibrationDriver calibDriver = new CalibrationDriver();
         calibDriver.setRunNumber(1351); //not sure what should be done here!? -> FIX THIS!
         add(calibDriver);
         add(new RawTrackerHitSensorSetup());
CVSspam 0.2.12


Use REPLY-ALL to reply to list

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