Commit in java/trunk/hps-java/src/main on MAIN
java/org/lcsim/hps/readout/ecal/FADCEcalReadoutDriver.java+58-19136 -> 137
resources/org/lcsim/hps/steering/readout/HPS2014ReadoutToEvio.lcsim+2-4136 -> 137
                                        /HPS2014ReadoutToLcio.lcsim+6-8136 -> 137
                                        /TestRunReadoutToEvio.lcsim+4-3136 -> 137
                                        /TestRunReadoutToLcio.lcsim+4-4136 -> 137
                                        /TestRunSim.lcsim+2-1136 -> 137
+76-39
6 modified files
placeholders for new pulse shape function

java/trunk/hps-java/src/main/java/org/lcsim/hps/readout/ecal
FADCEcalReadoutDriver.java 136 -> 137
--- java/trunk/hps-java/src/main/java/org/lcsim/hps/readout/ecal/FADCEcalReadoutDriver.java	2014-01-29 23:52:37 UTC (rev 136)
+++ java/trunk/hps-java/src/main/java/org/lcsim/hps/readout/ecal/FADCEcalReadoutDriver.java	2014-01-30 21:47:57 UTC (rev 137)
@@ -21,9 +21,7 @@
 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.RandomGaussian;
-import org.lcsim.hps.util.RingBuffer;
+import org.lcsim.hps.util.*;
 import org.lcsim.lcio.LCIOConstants;
 
 /**
@@ -51,8 +49,17 @@
     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
+    //switch between two pulse shape functions
+    private boolean useCRRCShape = false;
+    //shaper time constant in ns; negative values generate square pulses of the given width (for test run sim)
     private double tp = 14.0;
+    //TODO: set riseTime, fallTime, pulseDelay
+    //pulse rise time in ns
+    private double riseTime = 14.0;
+    //pulse fall time in ns
+    private double fallTime = 14.0;
+    //pulse delay time in ns
+    private double pulseDelay = 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)
@@ -72,24 +79,25 @@
     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;
+    private int readoutThreshold = 50;
+    private int triggerThreshold = 50;
     //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;
     private boolean addNoise = false;
+    //TODO: change to 2014 value
     private double pePerMeV = 2.0; //photoelectrons per MeV, used to calculate noise
 
     public FADCEcalReadoutDriver() {
         flags = 0;
         flags += 1 << LCIOConstants.RCHBIT_TIME; //store cell ID
         hitClass = HPSRawCalorimeterHit.class;
+        setReadoutPeriod(4.0);
 //        converter = new HPSEcalConverter(null);
     }
 
@@ -145,10 +153,30 @@
         this.coincidenceWindow = coincidenceWindow;
     }
 
+    public void setUseCRRCShape(boolean useCRRCShape) {
+        this.useCRRCShape = useCRRCShape;
+    }
+
     public void setTp(double tp) {
         this.tp = tp;
     }
 
+    public void setFallTime(double fallTime) {
+        this.fallTime = fallTime;
+    }
+
+    public void setPePerMeV(double pePerMeV) {
+        this.pePerMeV = pePerMeV;
+    }
+
+    public void setPulseDelay(double pulseDelay) {
+        this.pulseDelay = pulseDelay;
+    }
+
+    public void setRiseTime(double riseTime) {
+        this.riseTime = riseTime;
+    }
+
     public void setDelay0(int delay0) {
         this.delay0 = delay0;
     }
@@ -182,9 +210,9 @@
             //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);
+                gain = 1.0 / (fixedGain * ECalUtils.MeV * (pulseIntegral() / readoutPeriod));
             } else {
-                gain = 1.0 / (EcalConditions.physicalToGain(cellID) * ECalUtils.MeV * pulseIntegral);
+                gain = 1.0 / (EcalConditions.physicalToGain(cellID) * ECalUtils.MeV * (pulseIntegral() / readoutPeriod));
             }
 
             double currentValue = gain * eDepBuffer.currentValue();
@@ -400,7 +428,6 @@
         sumMap = new HashMap<Long, Double>();
         timeMap = new HashMap<Long, Integer>();
         outputQueue = new PriorityQueue(20, new HPSRawCalorimeterHit.TimeComparator());
-        pulseIntegral = tp * Math.E / readoutPeriod;
         resetFADCBuffers();
     }
 
@@ -426,20 +453,32 @@
     }
 
     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 {
+        if (useCRRCShape) {
+            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;
+                }
+            }
+        } else {
+            return 0.0; //TODO: new pulse shape definition for 2014
         }
     }
 
+    private double pulseIntegral() {
+        if (useCRRCShape) {
+            return tp * Math.E;
+        } else {
+            return 0.0; //TODO: new pulse shape definition for 2014
+        }
+    }
+
     private class FADCPipeline {
 
         private int[] array;

java/trunk/hps-java/src/main/resources/org/lcsim/hps/steering/readout
HPS2014ReadoutToEvio.lcsim 136 -> 137
--- java/trunk/hps-java/src/main/resources/org/lcsim/hps/steering/readout/HPS2014ReadoutToEvio.lcsim	2014-01-29 23:52:37 UTC (rev 136)
+++ java/trunk/hps-java/src/main/resources/org/lcsim/hps/steering/readout/HPS2014ReadoutToEvio.lcsim	2014-01-30 21:47:57 UTC (rev 137)
@@ -37,17 +37,15 @@
         </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>
+<!--            <fixedGain>0.15</fixedGain>-->
 <!--            <debug>true</debug>-->
+            <useCRRCShape>true</useCRRCShape>
         </driver>
 
         <driver name="EcalConverter" type="org.lcsim.hps.recon.ecal.EcalRawConverterDriver">

java/trunk/hps-java/src/main/resources/org/lcsim/hps/steering/readout
HPS2014ReadoutToLcio.lcsim 136 -> 137
--- java/trunk/hps-java/src/main/resources/org/lcsim/hps/steering/readout/HPS2014ReadoutToLcio.lcsim	2014-01-29 23:52:37 UTC (rev 136)
+++ java/trunk/hps-java/src/main/resources/org/lcsim/hps/steering/readout/HPS2014ReadoutToLcio.lcsim	2014-01-30 21:47:57 UTC (rev 137)
@@ -21,7 +21,7 @@
         <driver name="DataProcessing"/>-->
         <driver name="TestRunReconToLcio"/>
 
-		<driver name="AidaSaveDriver"/>
+        <driver name="AidaSaveDriver"/>
 
         <driver name="ClockDriver"/>
         <driver name="CleanupDriver"/>
@@ -39,17 +39,15 @@
         </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>-->
+            <useCRRCShape>true</useCRRCShape>
         </driver>
 
         <driver name="EcalConverter" type="org.lcsim.hps.recon.ecal.EcalRawConverterDriver">
@@ -90,10 +88,10 @@
             <numberOfSamplesToReadOut>6</numberOfSamplesToReadOut>
         </driver>-->
 
-		<driver name="AidaSaveDriver"
-                type="org.lcsim.job.AidaSaveDriver">
-			<outputFileName>${outputFile}_triggerPlots</outputFileName>
-		</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">

java/trunk/hps-java/src/main/resources/org/lcsim/hps/steering/readout
TestRunReadoutToEvio.lcsim 136 -> 137
--- java/trunk/hps-java/src/main/resources/org/lcsim/hps/steering/readout/TestRunReadoutToEvio.lcsim	2014-01-29 23:52:37 UTC (rev 136)
+++ java/trunk/hps-java/src/main/resources/org/lcsim/hps/steering/readout/TestRunReadoutToEvio.lcsim	2014-01-30 21:47:57 UTC (rev 137)
@@ -31,15 +31,16 @@
         <driver name="TestRunReconToEvio" type="org.lcsim.hps.evio.TestRunTriggeredReconToEvio">
             <evioOutputFile>${outputFile}.evio</evioOutputFile>
         </driver>
-		<driver name="BadChannelFilter" type="org.lcsim.hps.recon.tracking.SVTBadChannelFilterDriver" /> 		
+        <driver name="BadChannelFilter" type="org.lcsim.hps.recon.tracking.SVTBadChannelFilterDriver" /> 		
         <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>
+            <pePerMeV>2.0</pePerMeV>
+            <useCRRCShape>true</useCRRCShape>
         </driver>
 
         <driver name="EcalConverter" type="org.lcsim.hps.recon.ecal.EcalConverterDriver">
@@ -62,7 +63,7 @@
         <driver name="EcalTrigger" type="org.lcsim.hps.readout.ecal.TestRunTriggerDriver">
             <clusterCollectionName>EcalClusters</clusterCollectionName>
             <deadTime>10</deadTime>
-			<outputFileName>${outputFile}.triggers</outputFileName>
+            <outputFileName>${outputFile}.triggers</outputFileName>
         </driver>	
         <driver name="SimpleSVTReadout" type="org.lcsim.hps.recon.tracking.SimpleSvtReadout">
         </driver>

java/trunk/hps-java/src/main/resources/org/lcsim/hps/steering/readout
TestRunReadoutToLcio.lcsim 136 -> 137
--- java/trunk/hps-java/src/main/resources/org/lcsim/hps/steering/readout/TestRunReadoutToLcio.lcsim	2014-01-29 23:52:37 UTC (rev 136)
+++ java/trunk/hps-java/src/main/resources/org/lcsim/hps/steering/readout/TestRunReadoutToLcio.lcsim	2014-01-30 21:47:57 UTC (rev 137)
@@ -35,15 +35,15 @@
         <driver name="TestRunReconToLcio" type="org.lcsim.hps.evio.TestRunTriggeredReconToLcio">
             <outputFile>${outputFile}.slcio</outputFile>
         </driver>
-		<driver name="BadChannelFilter" type="org.lcsim.hps.recon.tracking.SVTBadChannelFilterDriver" /> 	
+        <driver name="BadChannelFilter" type="org.lcsim.hps.recon.tracking.SVTBadChannelFilterDriver" /> 	
         <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>
+            <pePerMeV>2.0</pePerMeV>
+            <useCRRCShape>true</useCRRCShape>
         </driver>
 
         <driver name="EcalConverter" type="org.lcsim.hps.recon.ecal.EcalConverterDriver">
@@ -66,7 +66,7 @@
         <driver name="EcalTrigger" type="org.lcsim.hps.readout.ecal.TestRunTriggerDriver">
             <clusterCollectionName>EcalClusters</clusterCollectionName>
             <deadTime>10</deadTime>
-			<outputFileName>${outputFile}.triggers</outputFileName>
+            <outputFileName>${outputFile}.triggers</outputFileName>
         </driver>	
         <driver name="SimpleSVTReadout" type="org.lcsim.hps.recon.tracking.SimpleSvtReadout">
         </driver>

java/trunk/hps-java/src/main/resources/org/lcsim/hps/steering/readout
TestRunSim.lcsim 136 -> 137
--- java/trunk/hps-java/src/main/resources/org/lcsim/hps/steering/readout/TestRunSim.lcsim	2014-01-29 23:52:37 UTC (rev 136)
+++ java/trunk/hps-java/src/main/resources/org/lcsim/hps/steering/readout/TestRunSim.lcsim	2014-01-30 21:47:57 UTC (rev 137)
@@ -40,13 +40,14 @@
         </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>
+            <pePerMeV>2.0</pePerMeV>
+            <useCRRCShape>true</useCRRCShape>
         </driver>
 
         <driver name="EcalConverter" type="org.lcsim.hps.recon.ecal.EcalConverterDriver">
SVNspam 0.1