Print

Print


Author: [log in to unmask]
Date: Thu Aug 20 12:51:36 2015
New Revision: 3381

Log:
add docs

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/EcalRawConverterDriver.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	Thu Aug 20 12:51:36 2015
@@ -22,44 +22,76 @@
 import org.lcsim.geometry.Detector;
 
 /**
- * This class is used to convert {@link org.lcsim.event.RawCalorimeterHit}
- * and {@link org.lcsim.event.RawTrackerHit} to {@link org.lcsim.event.CalorimeterHit}
- * objects with energy information.
+ * This class is used to convert between {@link org.lcsim.event.RawCalorimeterHit}
+ * or {@link org.lcsim.event.RawTrackerHit}, objects with ADC/sample information,
+ * and {@link org.lcsim.event.CalorimeterHit}, an object with energy+time information.
+ * 
+ * At minimum this involves pedestal subtraction/addition and gain scaling.
+ *
+ * Knows how to deal with Mode-1/3/7 FADC readout formats.
+ * Can perform Mode-3/7 firmware algorithms on Mode-1 data.
+ * Can alternatively call pulse-fitting on Mode-1 data.
+ *
  *
  * @author Sho Uemura <[log in to unmask]>
  * @author Andrea Celentano <[log in to unmask]>
  * @author Nathan Baltzell <[log in to unmask]>
  * @author Holly Szumila <[log in to unmask]>
  *
- * baltzell: May 2015:  Pulse Fitting. (default behavior unchanged)
- *
- * baltzell:  Early 2015:  (default behavior is still unchanged)
- *
- * Implemented conversion of Mode-1 to Mode-3.
- * 
- * Now using NSA/NSB for pedestal subtraction instead of integralWindow, to allow
- * treating all FADC Modes uniformly.  (New) NSA+NSB == (Old) integralWindow*4(ns) 
- * 
- * Pedestal subtracting clipped pulses more correctly for all Modes.
- * 
- * Implemented finding multiple peaks for Mode-1.
- * 
- * Implemented conversion of Mode-1 to Mode-7 with high-resolution timing.
- * Only some of the special cases in the firmware for when this algorithm fails due
- * to bad pulses (e.g. clipping) are already implemented.  Not yet writing Mode-7's
- * min/max to data stream. 
  */
 public class EcalRawConverter {
 
+	/**
+	 * If true, time walk correction is performed. 
+	 */
     private boolean useTimeWalkCorrection = false;
+    
+    /**
+     * If true, running pedestal is used.
+     */
     private boolean useRunningPedestal = false;
+    
+    /**
+     * If true, use a single gain factor for all channels.
+     * Else, use 442 gains from the conditions system. 
+     */
     private boolean constantGain = false;
+    
+    /**
+     * A single gain factor for all channels (only used if constantGain=true)
+     */
     private double gain;
+    
+    /**
+     * If true, the relationship between ADC and GeV is a convention that
+     * includes readoutPeriod and a global scaling factor.
+     * 
+     * If false, it is the currently used convention:  E(GeV) = GAIN * ADC 
+     */
     private boolean use2014Gain = true;
+    
+    /**
+     * If true, use the DAQ configuration from EVIO to set EcalRawConverter parameters.
+     * This should be removed to a standalone EcalRawConverter solely for trigger emulation.
+     */
     private boolean useDAQConfig = false;
+    
+    /**
+     * The DAQ configuration from EVIO used to set EcalRawConverter parameters
+     * if useDAQConfig=true.  This should be removed to a standalone EcalRawConverter
+     * solely for trigger emulation.
+     */
     private FADCConfig config = null;
-
+    
+    /**
+     * Whether to use pulse fitting (EcalPulseFitter) to extract pulse energy time.
+     * Only applicable to Mode-1 data.
+     */
     private boolean useFit = false;
+    
+    /**
+     * The pulse fitter class.
+     */
     private EcalPulseFitter pulseFitter = new EcalPulseFitter();
     
     /**
@@ -93,23 +125,29 @@
      * 
      * A non-positive number disables pulse-clipped pedestals and reverts to
      * the old behavior which assumed integration range was constant.
-     * 
      */
     private int windowSamples = -1;
     
     /**
      * The maximum number of peaks to be searched for.
+     * This is applicable only to Mode-1 data.
      */
     private int nPeak = 3;
    
     /**
-     * Convert Mode-1 into Mode-7, else Mode-3.
+     * Perform Mode-7 algorithm, else Mode-3.
+     * Only applicable to Mode-1 data.
      */
     private boolean mode7 = false;
 
 
     private EcalConditions ecalConditions = null;
 
+    /**
+     * Currently sets up a listener for DAQ configuration from EVIO.
+     * This should be removed to a standalone ECalRawConverter solely
+     * for trigger emulation.
+     */
     public EcalRawConverter() {
     	// Track changes in the DAQ configuration.
     	ConfigurationManager.addActionListener(new ActionListener() {
@@ -149,24 +187,43 @@
     	});
     }
     
-  
+ 
     public void setUseFit(boolean useFit) { this.useFit=useFit; }
     public void setFixShapeParameter(boolean fix) { pulseFitter.fixShapeParameter=fix; }
     public void setGlobalFixedPulseWidth(double width) { 
         pulseFitter.globalThreePoleWidth=width; 
         pulseFitter.fixShapeParameter=true;
     }
+    
+    /**
+     * Pulses with threshold crossing earlier than this will not be fit.
+     */
     public void setFitThresholdTimeLo(int sample) { pulseFitter.threshRange[0]=sample; }
+    /**
+     * Pulses with threshold crossing time greater than this will not be fit.
+     */
     public void setFitThresholdTimeHi(int sample) { pulseFitter.threshRange[1]=sample; }
+    /**
+     * Tell Minuit to limit pulse time parameter in fit to be greater than this. 
+     */
     public void setFitLimitTimeLo(int sample) { pulseFitter.t0limits[0]=sample; }
+    /**
+     * Tell Minuit to limit pulse time parameter in fit to be less than this. 
+     */
     public void setFitLimitTimeHi(int sample) { pulseFitter.t0limits[1]=sample; }
     
     
 
+    /**
+     * Set threshold for pulse finding.  Units = ADC
+     */
     public void setLeadingEdgeThreshold(double thresh) {
         leadingEdgeThreshold=thresh;
     }
     
+    /**
+     * Set number of samples after threshold crossing for pulse integration range.
+     */
     public void setNSA(int nsa) {
         if (NSA%nsPerSample !=0 || NSA<0) {
             throw new RuntimeException("NSA must be multiples of 4ns and non-negative.");
@@ -174,17 +231,29 @@
         NSA=nsa;
     }
     
+    /**
+     * Set number of samples before threshold crossing for pulse integration range.
+     */
     public void setNSB(int nsb) {
         if (NSB%nsPerSample !=0 || NSB<0) {
             throw new RuntimeException("NSB must be multiples of 4ns and non-negative.");
         }
         NSB=nsb;
     }
-    
+   
+    /**
+     * Set number of samples in readout window.  
+     * 
+     * Used for pedestal subtraction for clipped pulses.
+     * This is ignored for Mode-1 raw data, since Mode-1 knows its number of samples. 
+     */
     public void setWindowSamples(int windowSamples) {
         this.windowSamples=windowSamples;
     }
-    
+   
+    /**
+     * Set maximum number of pulses to search for in Mode-1 data.
+     */
     public void setNPeak(int nPeak) {
         if (nPeak<1 || nPeak>3) {
             throw new RuntimeException("Npeak must be 1, 2, or 3.");
@@ -192,28 +261,57 @@
         this.nPeak=nPeak;
     }
     
+    /**
+     * Set Mode-7 emulation on/off.  If off, falls back to Mode-3.  
+     */
     public void setMode7(boolean mode7)
     {
         this.mode7=mode7;
     }
 
+    /**
+     * Set global gain value and turn on constant gain.
+     * The 442 gains from the conditions system will be ignored.
+     */
     public void setGain(double gain) {
         constantGain = true;
         this.gain = gain;
     }
 
+    /**
+     * Chooses which ADC --> Energy convention is used.
+     * 
+     * If true, the relationship between ADC and GeV is a convention that
+     * includes readoutPeriod and a global scaling factor.
+     * 
+     * If false, it is the currently used convention:  E(GeV) = GAIN * ADC 
+     */
     public void setUse2014Gain(boolean use2014Gain) {
         this.use2014Gain = use2014Gain;
     }
 
+    /**
+     * Enables using running pedestals calculated on the fly from previous events.
+     * If false, uses 442 fixed pedestals from the conditions system. 
+     * 
+     * Only applies to FADC Mode-1/7 input data formats.  
+     */
     public void setUseRunningPedestal(boolean useRunningPedestal) {
         this.useRunningPedestal=useRunningPedestal;
     }
 
+    /**
+     * Set whether to use timewalk corrections. 
+     */
     public void setUseTimeWalkCorrection(boolean useTimeWalkCorrection) {
         this.useTimeWalkCorrection=useTimeWalkCorrection;
     }
     
+    /**
+     * Set whether to use DAQ configuration read from EVIO to set EcalRawConverter parameters.
+     * This should be removed to a standalone EcalRawCongverterDriver solely
+     * for trigger emulation.
+     */
     public void setUseDAQConfig(boolean state) {
     	useDAQConfig = state;
     }
@@ -221,7 +319,7 @@
 
 
     /**
-     * This should probably be deprecated.  It just integrates the entire window.
+     * Integrate the entire window.  Return pedestal-subtracted integral.
      */
     public int sumADC(RawTrackerHit hit) {
         EcalChannelConstants channelData = findChannel(hit.getCellID());
@@ -337,7 +435,7 @@
         
         // mode-7's max pulse height:
         double maxADC=0;
-        int sampleMaxADC=0;
+        //int sampleMaxADC=0;
         
         // mode-3/7's pulse integral:
         double sumADC = 0;
@@ -355,7 +453,7 @@
         //if (jj>firstSample && jj<samples.length-5) { // The "5" here is a firmware constant.
         for (int jj=thresholdCrossing; jj<samples.length-5; jj++) { // The "5" here is a firmware constant.
             if (samples[jj+1]<samples[jj]){ 
-                sampleMaxADC=jj;
+                //sampleMaxADC=jj;
                 maxADC=samples[jj];
                 break;                
             }
@@ -391,8 +489,8 @@
                     final int t1 = t0 + 1;
                     final int a0 = samples[t0];
                     final int a1 = samples[t1];
-                    final double slope = (a1 - a0); // units = ADC/sample
-                    final double yint = a1 - slope * t1;  // units = ADC 
+                    //final double slope = (a1 - a0); // units = ADC/sample
+                    //final double yint = a1 - slope * t1;  // units = ADC 
                     pulseTime = ((halfMax - a0)/(a1-a0) + t0)* nsPerSample;
                 }
             }
@@ -482,8 +580,8 @@
             final double[] data = convertWaveformToPulse(hit, thresholdCrossing, mode7);
             double time = data[0];
             double sum = data[1];
-            final double min = data[2]; // TODO: stick min and max in a GenericObject with an 
-            final double max = data[3]; // LCRelation to finish mode-7 emulation
+//            final double min = data[2]; // TODO: stick min and max in a GenericObject with an 
+//            final double max = data[3]; // LCRelation to finish mode-7 emulation
             final double fitQuality = data[4];
             
             if (!useFit || fitQuality<=0) {

Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverterDriver.java
 =============================================================================
--- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverterDriver.java	(original)
+++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverterDriver.java	Thu Aug 20 12:51:36 2015
@@ -18,29 +18,95 @@
 import org.lcsim.util.Driver;
 
 /**
- * baltzell June 2015: removed outdated javadoc comments in the class header
- */
+ * This class is used to convert between collections of {@link org.lcsim.event.RawCalorimeterHit}
+ * and {@link org.lcsim.event.RawTrackerHit}, objects with ADC/sample information, and
+ * collections of {@link org.lcsim.event.CalorimeterHit}, objects with energy/time information.
+ * 
+ * org.hps.recon.ecal.EcalRawConverter is called to do most of the lower level work.
+ *
+ *
+*/
 public class EcalRawConverterDriver extends Driver {
 
     // To import database conditions
     private EcalConditions ecalConditions = null;
 
     private EcalRawConverter converter = null;
+    /**
+     * Input collection name (unless runBackwards=true, then it's output).
+     * Can be a {@link org.lcsim.event.RawTrackerHit} or {@link org.lcsim.event.RawCalorimeterHit}
+     * These have ADC and sample time information.
+     */
     private String rawCollectionName = "EcalReadoutHits";
+    
+    /**
+     * Output collection name (unless runBackwards=true, then it's input).
+     * Always a {@link org.lcsim.event.CalorimeterHit}
+     * This has energy (GeV) and ns time information.
+     */
+    private String ecalCollectionName = "EcalCalHits";
+
+    /**
+     * ecalCollectionName "type" (must match detector-data) 
+     */
     private final String ecalReadoutName = "EcalHits";
-    private String ecalCollectionName = "EcalCalHits";
-
+
+    /*
+     * Output relation between ecalCollectionName and Mode-7 pedestal for that hit
+     */
     private static final String extraDataRelationsName = "EcalReadoutExtraDataRelations";
 
     private boolean debug = false;
+    
+    /**
+     * Hit threshold in GeV.  Anything less will not be put into LCIO. 
+     */
     private double threshold = Double.NEGATIVE_INFINITY;
+    
+    /**
+     * Whether to reject bad crystals. 
+     */
     private boolean applyBadCrystalMap = true;
+    
+    /**
+     * Whether to reject bad FADC channels.
+     */
     private boolean dropBadFADC = false;
+    
+    /**
+     * If true, convert ecalCollectionName to rawCollectionName (GeV to ADC).
+     * Else, convert rawCollectionName to ecalCollectionName (ADC to GeV).
+     */
     private boolean runBackwards = false;
+  
+    /**
+     * 
+     */
     private boolean useTimestamps = false;
+    
+    /**
+     * 
+     */
     private boolean useTruthTime = false;
+    
+    /**
+     * Whether to use DAQ config read from EVIO for EcalRawConverter parameters.
+     * Should be completely removed to a standalone class soilely for trigger emulation.
+     */
     private boolean useDAQConfig = false;
 
+    /**
+     * Whether to perform "firmware algorithm" on Mode-1 data.
+     * 
+     * If so, this includes finding a threshold crossing, extracting
+     * a pulse time, and integrating over some configurable sample
+     * range inside the window to extract pulse integral.
+     * 
+     * If not, it simply integrates the entire window and makes
+     * no attempt at extracting pulse time.
+     * 
+     * This is poorly named.
+     */
     private boolean emulateFirmware = false;
     
     public EcalRawConverterDriver() {