LISTSERV mailing list manager LISTSERV 16.5

Help for HPS-SVN Archives


HPS-SVN Archives

HPS-SVN Archives


HPS-SVN@LISTSERV.SLAC.STANFORD.EDU


View:

Message:

[

First

|

Previous

|

Next

|

Last

]

By Topic:

[

First

|

Previous

|

Next

|

Last

]

By Author:

[

First

|

Previous

|

Next

|

Last

]

Font:

Proportional Font

LISTSERV Archives

LISTSERV Archives

HPS-SVN Home

HPS-SVN Home

HPS-SVN  September 2016

HPS-SVN September 2016

Subject:

r4505 - in /java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal: EcalOnlineRawConverter.java EcalOnlineRawConverterDriver.java

From:

[log in to unmask]

Reply-To:

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

Date:

Fri, 30 Sep 2016 18:50:35 -0000

Content-Type:

text/plain

Parts/Attachments:

Parts/Attachments

text/plain (725 lines)

Author: [log in to unmask]
Date: Fri Sep 30 11:50:32 2016
New Revision: 4505

Log:
Updated the EcalOnlineRawConverter to function with pre-readout Monte Carlo.

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

Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalOnlineRawConverter.java
 =============================================================================
--- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalOnlineRawConverter.java	(original)
+++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalOnlineRawConverter.java	Fri Sep 30 11:50:32 2016
@@ -1,31 +1,52 @@
 package org.hps.recon.ecal;
-
 
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.util.ArrayList;
+import java.util.List;
 
 import org.hps.record.daqconfig.ConfigurationManager;
 import org.hps.record.daqconfig.FADCConfig;
 import org.lcsim.event.CalorimeterHit;
-import org.lcsim.event.EventHeader;
 import org.lcsim.event.GenericObject;
 import org.lcsim.event.RawCalorimeterHit;
 import org.lcsim.event.RawTrackerHit;
 
 /**
+ * <code>EcalOnlineRawConverter</code> handles the conversion of raw
+ * hits of all modes to energy hit <code>CalorimeterHit</code> objects.
+ * This converter will employ the runtime values for all parameters and
+ * is intended to emulate the firmware specifically.<br/>
+ * <br/>
+ * The converter requires the presence of the DAQ configuration manager,
+ * which is activated by either <code>DatabaseDAQConfigDriver</code>
+ * or <code>DAQConfigDriver</code> depending on from where it is to
+ * obtain the configuration.<br/>
+ * <br/>
+ * This converter is primarily employed in the trigger and hardware
+ * diagnostic processes as well as the readout simulation in Monte
+ * Carlo.
  * 
- * This is a EcalRawConverter used only for pure firmware emulation for
- * studying trigger efficiency from real data.  It requires the DAQ
- * configuration to be read from EVIO in order to set the parameters.
- * 
+ * @author Nathan Baltzell <[log in to unmask]>
+ * @author Kyle McCarty <[log in to unmask]>
  */
 public class EcalOnlineRawConverter {
-
+    // Defines the maximum number of peaks that may be extracted from
+    // a single waveform.
+    private int nPeak = 3;
+    // The DAQ configuration manager for FADC parameters.
     private FADCConfig config = null;
+    // Whether or not a constant integration window should be assumed
+    // for the purpose of pedestal calculations/
+    private boolean constantWindow = false;
+    // The number of nanoseconds in a clock-cycle (sample).
     private static final int nsPerSample = 4;
-    private int nPeak = 3;
-    
+    
+    /**
+     * Instantiates the <code>EcalOnlineRawConverter</code> and connects
+     * it to the <code>ConfigurationManager</code> to receive settings
+     * from the DAQ configuration.
+     */
     public EcalOnlineRawConverter() {
         // Track changes in the DAQ configuration.
         ConfigurationManager.addActionListener(new ActionListener() {
@@ -33,174 +54,275 @@
             public void actionPerformed(ActionEvent e) {
                 // Get the FADC configuration.
                 config = ConfigurationManager.getInstance().getFADCConfig();
+                
                 // Get the number of peaks.
-                if(config.getMode() == 1) nPeak = Integer.MAX_VALUE;
-                else                      nPeak = config.getMaxPulses();
-                // Print the FADC configuration.
-                System.out.println();
-                System.out.println();
-                System.out.printf("NSA            :: %d ns%n", config.getNSA());
-                System.out.printf("NSB            :: %d ns%n", config.getNSB());
-                System.out.printf("Window Samples :: %d clock-cycles%n", config.getWindowWidth());
-                System.out.printf("Max Peaks      :: %d peaks%n", nPeak);
-                System.out.println("======================================================================");
-                System.out.println("=== FADC Pulse-Processing Settings ===================================");
-                System.out.println("======================================================================");
-                config.printConfig(System.out);
+                if(config.getMode() == 1) { nPeak = Integer.MAX_VALUE; }
+                else { nPeak = config.getMaxPulses(); }
             }
         });
     }
-
-    /**
-     * Get pedestal for entire pulse integral.  Account for clipping if
-     * windowSamples is greater than zero.
-     */
-    public double getPulsePedestal(EventHeader event,long cellID,int windowSamples,int thresholdCrossing) {
-        int firstSample,lastSample;
-        if ( windowSamples>0 && (config.getNSA()+config.getNSB())/nsPerSample >= windowSamples ) {
-            // special case where firmware always integrates entire window
+    
+    /**
+     * Gets the pedestal for a given crystal and threshold crossing.
+     * @param cellID - The cell ID of the crystal.
+     * @param windowSamples - The size of the readout window. A value
+     * of <code>-1</code> indicates an infinite readout window.
+     * @param thresholdCrossing - The time of the threshold crossing in
+     * 4-nanosecond clock-cycles (samples).
+     * @return Returns the pedestal for the crystal and threshold
+     * crossing.
+     */
+    public double getPulsePedestal(long cellID, int windowSamples, int thresholdCrossing) {
+        // Track the starting and ending samples over which integration
+        // will occur. Only the intermediary samples need be considered
+        // for pedestal calculation.
+        int firstSample, lastSample;
+        
+        // For finite readout windows, calculate the pedestal based on
+        // the size of the full readout window in the event that the
+        // integration window is larger than the readout window.
+        if(windowSamples > 0 && (config.getNSA() + config.getNSB()) / nsPerSample >= windowSamples) {
             firstSample = 0;
-            lastSample = windowSamples-1;
-        } else {
-            firstSample = thresholdCrossing - config.getNSB()/nsPerSample;
-            lastSample  = thresholdCrossing + config.getNSA()/nsPerSample-1;
-            if (windowSamples > 0) {
-                // properly pedestal subtract pulses clipped by edge(s) of readout window:
-                if (firstSample < 0) firstSample=0;
-                if (lastSample >= windowSamples) lastSample=windowSamples-1;
+            lastSample = windowSamples - 1;
+        }
+        
+        // Otherwise, the pedestal should be calculated based on the
+        // integration window size.
+        else {
+            // Define the sample width as equivalent to the integration
+            // window size.
+            firstSample = thresholdCrossing - config.getNSB() / nsPerSample;
+            lastSample  = thresholdCrossing + config.getNSA() / nsPerSample - 1;
+            
+            // In the event of a finite readout window, ignore any
+            // samples that fall outside the readout window. Since these
+            // are clipped and will not be integrated, these pedestals
+            // do not contribute.
+            if(windowSamples > 0) {
+                if(firstSample < 0) { firstSample = 0; }
+                if(lastSample >= windowSamples) { lastSample = windowSamples - 1; }
             }
         }
-        return (lastSample-firstSample+1)*config.getPedestal(cellID);
-    }
-   
+        
+        // Calculate and return the pedestal.
+        return(lastSample - firstSample + 1) * config.getPedestal(cellID);
+    }
+    
+    /**
+     * Converts a mode-1 digitized waveform into standard energy hit.
+     * @param hit - The "hit" object representing the digitized waveform
+     * for a given crystal.
+     * @return Returns a list of <code>CalorimeterHit</code> objects
+     * parsed from the waveform.
+     */
+    public List<CalorimeterHit> HitDtoA(RawTrackerHit hit) {
+        // Get the cell ID for the crystal as well as the digitized
+        // waveform samples.
+        final long cellID = hit.getCellID();
+        final short[] waveform = hit.getADCValues();
+        
+        // If there are no samples, then there is nothing to integrate.
+        if(waveform.length == 0) { return null; }
+        
+        // The pulse integration threshold is defined as the combination
+        // of the pedestal and the threshold configuration parameter.
+        final int absoluteThreshold = (int) (config.getPedestal(cellID) + config.getThreshold(cellID));
+        
+        // Store each instance of a threshold crossing in that can be
+        // found within the digitized waveform.
+        List<Integer> thresholdCrossings = new ArrayList<Integer>();
+        
+        // Check for the special case of the first sample exceeding
+        // the integration threshold.
+        if(waveform[0] > absoluteThreshold) {
+            thresholdCrossings.add(0);
+        } 
+        
+        // Search the remaining samples for threshold crossings.
+        thresholdLoop:
+        for(int sample = 1; sample < waveform.length; ++sample) {
+            if(waveform[sample] > absoluteThreshold && waveform[sample - 1] <= absoluteThreshold) {
+                // Add the sample index to the list of threshold crossing.
+                thresholdCrossings.add(sample);
+                
+                // No new threshold crossings can be registered within
+                // this pulse. In the case of mode-1 data, the end of
+                // the pulse is considered to be 8 samples past the
+                // crossing, as the per the SSP. Otherwise, it is defined
+                // by the integration window.
+                if(config.getMode() == 1) { sample += 8; }
+                else { sample += config.getNSA() / nsPerSample - 1; }
+                
+                // If there is a limit defined on the maximum number
+                // of peaks that may be processed, terminate the search
+                // after this number of peaks have been found.
+                if(thresholdCrossings.size() >= nPeak) { break thresholdLoop; }
+            }
+        }
+        
+        // Use the previously located threshold crossing to generate
+        // calorimeter hits.
+        List<CalorimeterHit> newHits = new ArrayList<CalorimeterHit>();
+        for(int thresholdCrossing : thresholdCrossings) {
+            // Perform the pulse integral.
+            final double[] data = convertWaveformToPulse(waveform, thresholdCrossing);
+            double time = data[0];
+            double sum = data[1];
+            
+            // Perform pedestal subtraction.
+            sum -= getPulsePedestal(cellID, waveform.length, thresholdCrossing);
+          
+            // Perform gain scaling.
+            double energy = adcToEnergy(sum, cellID);
+            
+            // Create a new hit and add it to the list.
+            newHits.add(CalorimeterHitUtilities.create(energy, time, cellID));
+        }
+        
+        // Return the list of hits.
+        return newHits;
+    }
+    
+    /**
+     * Converts a raw mode-3 hit to a proper calorimeter hit in units
+     * of energy.
+     * @param hit - The raw hit that is to be converted.
+     * @param timeOffset - The time offset for the hit.
+     * @return Returns a <code>CalorimeterHit</code> hit object that
+     * represents the raw mode-3 hit with units of energy and a correct
+     * time-stamp.
+     */
+    public CalorimeterHit HitDtoA(RawCalorimeterHit hit, double timeOffset) {
+        // Verify the validity of the time-stamp.
+        if(hit.getTimeStamp() % 64 != 0) {
+            System.out.println("Unexpected time-stamp: " + hit.getTimeStamp());
+        }
+        
+        // Get the pedestal. In the case of a constant integration window
+        // (i.e. infinite readout window size, so no risk of clipping),
+        // the window width should be given as -1. Otherwise, the real
+        // readout window size should be used.
+        long id = hit.getCellID();
+        double time = hit.getTimeStamp() / 16.0;
+        double pedestal = getPulsePedestal(id, constantWindow ? -1 : config.getWindowWidth(), (int) time / nsPerSample);
+        
+        // Calculate the total ADC value for the pulse and convert it
+        // to energy.
+        double adcSum = hit.getAmplitude() - pedestal;
+        double rawEnergy = adcToEnergy(adcSum, id);
+        
+        // Create a calorimeter hit from the result and return it.
+        return CalorimeterHitUtilities.create(rawEnergy, time + timeOffset, id);
+    }
+    
+    /**
+     * Converts a raw mode-7 hit to a proper calorimeter hit in units
+     * of energy.
+     * @param hit - The raw hit that is to be converted.
+     * @param mode7Data - Additional mode-7 data object.
+     * @param timeOffset - The time offset for the hit.
+     * @return Returns a <code>CalorimeterHit</code> hit object that
+     * represents the raw mode-7 hit with units of energy and a correct
+     * time-stamp.
+     */
+    public CalorimeterHit HitDtoA(RawCalorimeterHit hit, GenericObject mode7Data, double timeOffset) {
+        // Get the time and crystal cell ID for the hit. Note that the
+        // time-stamps use the full 62.5 ps resolution.
+        double time = hit.getTimeStamp() / 16.0;
+        long id = hit.getCellID();
+        
+        // Get the pedestal. In the case of a constant integration window
+        // (i.e. infinite readout window size, so no risk of clipping),
+        // the window width should be given as -1. Otherwise, the real
+        // readout window size should be used.
+        double pedestal = getPulsePedestal(id, constantWindow ? -1 : config.getWindowWidth(), (int) time / nsPerSample);
+        
+        // Calculate the total ADC value for the pulse and convert it
+        // to energy.
+        double adcSum = hit.getAmplitude() - pedestal;
+        double rawEnergy = adcToEnergy(adcSum, id);
+        
+        // Create a calorimeter hit from the result and return it.
+        return CalorimeterHitUtilities.create(rawEnergy, time + timeOffset, id);
+    }
+    
+    /**
+     * Converts a value in ADC in a crystal to energy in units of GeV.
+     * @param adcSum - The ADC value to convert.
+     * @param cellID - The cell ID of the crystal containing the value.
+     * @return Returns the ADC value as an energy in units of GeV.
+     */
+    private double adcToEnergy(double adcSum, long cellID) {
+        return config.getGain(cellID) * adcSum * EcalUtils.MeV;
+    }
     
     /**
      * 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) {
-       
-        short samples[] = hit.getADCValues();
-        // choose integration range:
-        int firstSample,lastSample;
-        if ((config.getNSA()+config.getNSB())/nsPerSample >= samples.length) {
-            // firmware treats this case specially:
+    
+    /**
+     * Converts a mode-1 digitized waveform to a mode-3/7 pulse for a
+     * a given threshold crossing.
+     * @param waveform - The digitized waveform. Each array value should
+     * correspond to a sample of the waveform in units of ADC.
+     * @param thresholdCrossing - The time of the threshold crossing
+     * in samples.
+     * @return Returns a <code>double</code> primitive of size 2. The
+     * first value represents the time in nanoseconds of the pulser and
+     * the second value the total integrated value of the pulse in ADC.
+     */
+    private double[] convertWaveformToPulse(short[] waveform, int thresholdCrossing) {
+        // Store the integration range.
+        int firstSample, lastSample;
+        
+        // If the integration range is larger than the number of samples,
+        // then all the samples are used for pulse integration.
+        if((config.getNSA() + config.getNSB()) / nsPerSample >= waveform.length) {
             firstSample = 0;
-            lastSample = samples.length-1;
-        } else {
-            firstSample = thresholdCrossing - config.getNSB()/nsPerSample;
-            lastSample  = thresholdCrossing + config.getNSA()/nsPerSample - 1;
-        }
-        
-        // pulse integral:
+            lastSample = waveform.length - 1;
+        }
+        
+        // Otherwise, the integration range covers a number of samples
+        // before and after the threshold crossing as defined by the
+        // run parameters.
+        else {
+            firstSample = thresholdCrossing - config.getNSB() / nsPerSample;
+            lastSample  = thresholdCrossing + config.getNSA() / nsPerSample - 1;
+        }
+        
+        // Perform the pulse integral.
         double sumADC = 0;
-        for (int jj=firstSample; jj<=lastSample; jj++) {
-            if (jj<0) continue;
-            if (jj>=samples.length) break;
-            sumADC += samples[jj];
-        }
-
-        // pulse time with 4ns resolution:
-        double pulseTime=thresholdCrossing*nsPerSample;
-        return new double []{pulseTime,sumADC};
-    }
-   
-    
-    /**
-     *
-     */
-    public ArrayList <CalorimeterHit> HitDtoA(EventHeader event, RawTrackerHit hit) {
-        final long cellID = hit.getCellID();
-        final short samples[] = hit.getADCValues();
-        if(samples.length == 0) return null;
-        
-        // threshold is pedestal plus threshold configuration parameter:
-        final int absoluteThreshold;
-        int leadingEdgeThreshold = config.getThreshold(cellID);
-        absoluteThreshold = (int) (config.getPedestal(cellID) + leadingEdgeThreshold);
-        
-        ArrayList <Integer> thresholdCrossings = new ArrayList<Integer>();
-        
-        // special case, first sample is above threshold:
-        if (samples[0] > absoluteThreshold) {
-            thresholdCrossings.add(0);
-        } 
-        
-        // search for threshold crossings:
-        for(int ii = 1; ii < samples.length; ++ii) {
-            if ( samples[ii]   >  absoluteThreshold && 
-                 samples[ii-1] <= absoluteThreshold) {
-                
-                // found one:
-                thresholdCrossings.add(ii);
-
-                // search for next threshold crossing begins at end of this pulse:
-                if (ConfigurationManager.getInstance().getFADCConfig().getMode() == 1) {
-                    // special case, emulating SSP:
-                    ii += 8;
-                } else {
-                    // "normal" case, emulating FADC250:
-                    ii += config.getNSA()/nsPerSample - 1;
-                }
-
-                // firmware limit on # of peaks:
-                if (thresholdCrossings.size() >= nPeak) break;
-            }
-        }
-        
-        // make hits
-        ArrayList <CalorimeterHit> newHits = new ArrayList<CalorimeterHit>();
-        for(int thresholdCrossing : thresholdCrossings) {
-            // do pulse integral:
-            final double[] data = convertWaveformToPulse(hit, thresholdCrossing, false);
-            double time = data[0];
-            double sum = data[1];
-            
-            // do pedestal subtraction:
-            sum -= getPulsePedestal(event, cellID, samples.length, thresholdCrossing);
-          
-            // do gain scaling:
-            double energy = adcToEnergy(sum, cellID);
-            
-            newHits.add(CalorimeterHitUtilities.create(energy,time,cellID));
-        }
-        
-        return newHits;
-    }
-
-    /**
-     * This HitDtoA is for Mode-3 data.
-     */
-    public CalorimeterHit HitDtoA(EventHeader event,RawCalorimeterHit hit, double timeOffset) {
-        if (hit.getTimeStamp() % 64 != 0) {
-            System.out.println("unexpected timestamp " + hit.getTimeStamp());
-        }
-        double time = hit.getTimeStamp() / 16.0;
-        long id = hit.getCellID();
-        double pedestal = getPulsePedestal(event,id,config.getWindowWidth(),(int)time/nsPerSample);
-        double adcSum = hit.getAmplitude() - pedestal;
-        double rawEnergy = adcToEnergy(adcSum, id);
-        return CalorimeterHitUtilities.create(rawEnergy, time + timeOffset, id);
-    }
-
-    /**
-     * This HitDtoA is exclusively for Mode-7 data, hence the GenericObject parameter.
-     */
-    public CalorimeterHit HitDtoA(EventHeader event,RawCalorimeterHit hit, GenericObject mode7Data, double timeOffset) {
-        double time = hit.getTimeStamp() / 16.0; //timestamps use the full 62.5 ps resolution
-        long id = hit.getCellID();
-        double pedestal = getPulsePedestal(event,id,config.getWindowWidth(),(int)time/nsPerSample);
-        double adcSum = hit.getAmplitude() - pedestal;
-        double rawEnergy = adcToEnergy(adcSum, id);       
-        return CalorimeterHitUtilities.create(rawEnergy, time + timeOffset, id);
-    }
-
-
-    /**
-     * return energy (units of GeV) corresponding to the ADC sum and crystal ID
-     */
-    private double adcToEnergy(double adcSum, long cellID) {
-        return config.getGain(cellID) * adcSum * EcalUtils.MeV;
-    }
-
-}
+        integrationLoop:
+        for (int sample = firstSample; sample <= lastSample; sample++) {
+            // If the current sample occurs before the readout window,
+            // then it does not exist and can not be integrated. Skip it.
+            if(sample < 0) { continue integrationLoop; }
+            
+            // Likewise, samples that occur after the readout window are
+            // not retained and must be skipped.
+            if(sample >= waveform.length) { break integrationLoop; }
+            
+            // Otherwise, add the sample to the pulse total.
+            sumADC += waveform[sample];
+        }
+        
+        // Calculate the pulse time with a 4 nanosecond resolution.
+        double pulseTime = thresholdCrossing * nsPerSample;
+        
+        // Return both the pulse time and the total integrated pulse ADC.
+        return new double [] { pulseTime, sumADC };
+    }
+    
+    /**
+     * Sets whether to use a constant integration window for the the
+     * purpose of determining the correct pedestal. This should be used
+     * in conjunction with Monte Carlo data during the readout cycle.
+     * @param state - <code>true</code> ignores the size of the readout
+     * window when calculating pedestals, and <code>false</code> accounts
+     * for it in the case of pulse-clipping.
+     */
+    void setUseConstantWindow(boolean state) {
+        constantWindow = state;
+    }
+}

Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalOnlineRawConverterDriver.java
 =============================================================================
--- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalOnlineRawConverterDriver.java	(original)
+++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalOnlineRawConverterDriver.java	Fri Sep 30 11:50:32 2016
@@ -23,119 +23,138 @@
  *
 */
 public class EcalOnlineRawConverterDriver extends Driver {
-
     private EcalOnlineRawConverter converter = null;
     /**
-     * Input collection name
-     * Can be a {@link org.lcsim.event.RawTrackerHit} or {@link org.lcsim.event.RawCalorimeterHit}
-     * These have ADC and sample time information.
+     * The input LCIO collection name. This can be either 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
-     * Always a {@link org.lcsim.event.CalorimeterHit}
-     * This has energy (GeV) and ns time information.
+     * The output LCIO collection name. This will always a
+     * {@link org.lcsim.event.CalorimeterHit} with energy (GeV) and
+     * ns time information.
      */
     private String ecalCollectionName = "EcalCalHits";
-
+    
     /**
      * ecalCollectionName "type" (must match detector-data) 
      */
     private final String ecalReadoutName = "EcalHits";
-
-    /*
-     * Output relation between ecalCollectionName and Mode-7 pedestals
+    
+    /**
+     * Output relation between ecalCollectionName and Mode-7 pedestals.
      */
     private static final String extraDataRelationsName = "EcalReadoutExtraDataRelations";
-
-    public EcalOnlineRawConverterDriver() {
-        converter = new EcalOnlineRawConverter();
-    }
-
+    
     /**
-     * Set the output {@link org.lcsim.event.CalorimeterHit} collection name,
-     * 
-     * @param ecalCollectionName The <code>CalorimeterHit</code> collection name.
+     * Instantiates the <code>EcalOnlineRawConverter</code> for this
+     * driver.
      */
-    public void setEcalCollectionName(String ecalCollectionName) {
-        this.ecalCollectionName = ecalCollectionName;
-    }
-
+    public EcalOnlineRawConverterDriver() { converter = new EcalOnlineRawConverter(); }
+    
     /**
-     * Set the input raw collection name
-     * <p>
-     * Depending on the Driver configuration, this could be a collection
-     * of {@link org.lcsim.event.RawTrackerHit} objects for Mode-1
-     * or {@link org.lcsim.event.RawCalorimeterHit} objects for Mode-3
-     * or Mode-7.
-     * 
-     * @param rawCollectionName The raw collection name.
+     * Checks that the required LCIO collection names are defined.
      */
-    public void setRawCollectionName(String rawCollectionName) {
-        this.rawCollectionName = rawCollectionName;
-    }
-
     @Override
     public void startOfData() {
-        if (ecalCollectionName == null) {
+        if(ecalCollectionName == null) {
             throw new RuntimeException("The parameter ecalCollectionName was not set!");
         }
     }
-
+    
     @Override
     public void process(EventHeader event) {
-        // Do not process the event if the DAQ configuration should be
-        // used for value, but is not initialized.
+        // Do not process the event if the DAQ configuration is not
+        // initialized. All online raw converter parameters are obtained
+        // from this class, and this nothing can be done before they
+        // are available.
         if(!ConfigurationManager.isInitialized()) {
             return;
         }
         
         double timeOffset = 0.0;
+        
+        // Define the LCIO data flags.
         int flags = 0;
-        flags += 1 << LCIOConstants.RCHBIT_TIME; //store hit time
-        flags += 1 << LCIOConstants.RCHBIT_LONG; //store hit position; this flag has no effect for RawCalorimeterHits
-
+        flags += 1 << LCIOConstants.RCHBIT_TIME; // Store hit time.
+        flags += 1 << LCIOConstants.RCHBIT_LONG; // Store hit position; this flag has no effect for RawCalorimeterHits.
+        
+        // Create a list to store hits.
         ArrayList<CalorimeterHit> newHits = new ArrayList<CalorimeterHit>();
-
-        /*
-         * This is for FADC Mode-1 data:    
-         */
-        if (event.hasCollection(RawTrackerHit.class, rawCollectionName)) {
+        
+        // Events that contain RawTrackerHit objects use mode-1 data.
+        if(event.hasCollection(RawTrackerHit.class, rawCollectionName)) {
+            // Get the list of mode-1 waveforms.
             List<RawTrackerHit> hits = event.get(RawTrackerHit.class, rawCollectionName);
-
-            for (RawTrackerHit hit : hits) {
-                newHits.addAll(converter.HitDtoA(event,hit));
+            
+            // Extract hits from each waveform and store them.
+            for(RawTrackerHit hit : hits) {
+                newHits.addAll(converter.HitDtoA(hit));
             }
+            
+            // Add the hits to the data stream.
             event.put(ecalCollectionName, newHits, CalorimeterHit.class, flags, ecalReadoutName);
         }
-
-        /*
-         * This is for FADC pulse mode data (Mode-3 or Mode-7):
-         */
-        if (event.hasCollection(RawCalorimeterHit.class, rawCollectionName)) { 
-
-            /*
-             * This is for FADC Mode-7 data:
-             */
-            if (event.hasCollection(LCRelation.class, extraDataRelationsName)) { // extra information available from mode 7 readout
+        
+        // Events that contain RawCalorimeterHit objects are either
+        // mode-3 or mode-7.
+        if(event.hasCollection(RawCalorimeterHit.class, rawCollectionName)) {
+            // Check for extra relations data. This indicates that the
+            // hits should be interpreted as mode-7.
+            if(event.hasCollection(LCRelation.class, extraDataRelationsName)) { // extra information available from mode 7 readout
                 List<LCRelation> extraDataRelations = event.get(LCRelation.class, extraDataRelationsName);
-                for (LCRelation rel : extraDataRelations) {
+                for(LCRelation rel : extraDataRelations) {
                     RawCalorimeterHit hit = (RawCalorimeterHit) rel.getFrom();
                     GenericObject extraData = (GenericObject) rel.getTo();
-                    newHits.add(converter.HitDtoA(event,hit, extraData, timeOffset));
+                    newHits.add(converter.HitDtoA(hit, extraData, timeOffset));
                 }
-            } else {
-                /*
-                 * This is for FADC Mode-3 data:
-                 */
+            }
+            
+            // Otherwise, the hits should be treated as mode-3.
+            else {
                 List<RawCalorimeterHit> hits = event.get(RawCalorimeterHit.class, rawCollectionName);
-                for (RawCalorimeterHit hit : hits) {
-                    newHits.add(converter.HitDtoA(event, hit, timeOffset));
+                for(RawCalorimeterHit hit : hits) {
+                    newHits.add(converter.HitDtoA(hit, timeOffset));
                 }
             }
             event.put(ecalCollectionName, newHits, CalorimeterHit.class, flags, ecalReadoutName);
         }
     }
-
-}
+    
+    /**
+     * Sets the output {@link org.lcsim.event.CalorimeterHit} LCIO
+     * collection name.
+     * @param ecalCollectionName - The LCIO collection name for output
+     * data.
+     */
+    public void setEcalCollectionName(String ecalCollectionName) {
+        this.ecalCollectionName = ecalCollectionName;
+    }
+    
+    /**
+     * Sets whether to use a constant integration window for the the
+     * purpose of determining the correct pedestal. This should be used
+     * in conjunction with Monte Carlo data during the readout cycle.
+     * @param state - <code>true</code> ignores the size of the readout
+     * window when calculating pedestals, and <code>false</code> accounts
+     * for it in the case of pulse-clipping.
+     */
+    public void setIsReadoutSimulation(boolean state) {
+        converter.setUseConstantWindow(state);
+    }
+    
+    /**
+     * Sets the input raw hit data LCIO collection name. Depending on
+     * the driver configuration, this could be either a collection of
+     * {@link org.lcsim.event.RawTrackerHit} objects for mode-1 data or
+     * {@link org.lcsim.event.RawCalorimeterHit} objects for mode-3
+     * and mode-7 data.
+     * @param rawCollectionName - The LCIO collection name for raw data.
+     */
+    public void setRawCollectionName(String rawCollectionName) {
+        this.rawCollectionName = rawCollectionName;
+    }
+}

Top of Message | Previous Page | Permalink

Advanced Options


Options

Log In

Log In

Get Password

Get Password


Search Archives

Search Archives


Subscribe or Unsubscribe

Subscribe or Unsubscribe


Archives

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

ATOM RSS1 RSS2



LISTSERV.SLAC.STANFORD.EDU

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

Privacy Notice, Security Notice and Terms of Use