Print

Print


Author: [log in to unmask]
Date: Sun Mar  8 18:49:14 2015
New Revision: 2367

Log:
noticed a mistake in conversion of mode-1 to mode-7 minimum, fixed.

Modified:
    java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverter.java

Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverter.java
 =============================================================================
--- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverter.java	(original)
+++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverter.java	Sun Mar  8 18:49:14 2015
@@ -228,7 +228,7 @@
    
     
     /*
-     * Emulate the FADC250 firmware emulation Mode-1 waveform to a Mode-3/7 pulse,
+     * Emulate the FADC250 firmware in conversion of Mode-1 waveform to a Mode-3/7 pulse,
      * given a time for threshold crossing.
      */
     public double[] convertWaveformToPulse(RawTrackerHit hit,int thresholdCrossing,boolean mode7) {
@@ -245,12 +245,17 @@
             lastSample  = thresholdCrossing + NSA/nsPerSample - 1;
         }
         
-        // mode-7 min and max:
+        // mode-7's minimum/pedestal (average of first 4 samples):
         double minADC=0;
+        for (int jj=0; jj<4; jj++) minADC += samples[jj];
+        // does the firmware's conversion of min to int occur before or after time calculation?  undocumented.
+        minADC=(int)(minADC/4); 
+        
+        // mode-7's max pulse height:
         double maxADC=0;
         int sampleMaxADC=0;
         
-        // pulse integral:
+        // mode-3/7's pulse integral:
         short sumADC = 0;
         
         for (int jj=firstSample; jj<=lastSample; jj++) {
@@ -261,11 +266,8 @@
             // integrate pulse:
             sumADC += samples[jj];
            
-            // compute "minimum" at beginning of window:
-            if (jj<4) minADC+=samples[jj];
-          
             // find pulse maximum:
-            if (jj>firstSample && jj<samples.length-5) {
+            if (jj>firstSample && jj<samples.length-5) { // The "5" here is a firmware constant.
                 if (samples[jj+1]<samples[jj]) {
                     sampleMaxADC=jj;
                     maxADC=samples[jj];
@@ -273,15 +275,13 @@
             }
         }
        
-        // minADC is the average of first four samples:
-        minADC/=4;
-      
         // pulse time with 4ns resolution:
         double pulseTime=thresholdCrossing*nsPerSample;
         
         // calculate Mode-7 high-resolution time:
         if (mode7) {
             if (thresholdCrossing < 4) {
+                // special case where firmware sets max to zero and time to 4ns time.
                 maxADC=0;
             }
             else if (maxADC>0) {
@@ -293,10 +293,12 @@
                 double a1 = maxADC;
                 double slope = (a1-a0)/(t1-t0);
                 double halfMax = (maxADC+minADC)/2;
+                // this is not rigorously firmware-correct, need to find halMax-crossing.
                 double tmpTime = t1 - (a1 - halfMax) / slope;
                 if (slope>0 && tmpTime>0) {
                     pulseTime = tmpTime;
                 }
+                // else another special firmware case
             }
         }