Print

Print


Author: [log in to unmask]
Date: Tue Mar 17 14:45:46 2015
New Revision: 2474

Log:
Added the ability to access the GTP configuration from the DAQ configuration manager. Also converted all tabs to spaces in the package.

Added:
    java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/GTPConfig.java
Modified:
    java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/AbstractConfig.java
    java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/ConfigurationManager.java
    java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/DAQConfig.java
    java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/DAQConfigDriver.java
    java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/ESBCutConfig.java
    java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/EvioDAQParser.java
    java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/FADCConfig.java
    java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/IDAQConfig.java
    java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/LBOCutConfig.java
    java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/PairTriggerConfig.java
    java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/SSPConfig.java
    java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/SinglesTriggerConfig.java
    java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/UBOCutConfig.java
    java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/ULBCutConfig.java

Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/AbstractConfig.java
 =============================================================================
--- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/AbstractConfig.java	(original)
+++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/AbstractConfig.java	Tue Mar 17 14:45:46 2015
@@ -11,74 +11,74 @@
  * @author Kyle McCarty <[log in to unmask]>
  */
 abstract class AbstractConfig<E> {
-	// Store the cut values.
-	private final List<E> values;
-	private boolean enabled = false;
-	
-	/**
-	 * Instantiates an <code>AbstractConfig</code> with the indicated
-	 * number of values.
-	 * @param count - The number of values that the object should store.
-	 */
-	AbstractConfig(int count) {
-		// A configuration object must have at least one value.
-		if(count <= 0) {
-			throw new IllegalArgumentException("There must be at least one value.");
-		}
-		
-		// Instantiate the value array.
-		values = new ArrayList<E>(count);
-		for(int i = 0; i < count; i++) { values.add(null); }
-	}
-	
-	/**
-	 * Gets the value of the cut with the associated value ID.
-	 * @param valueIndex - The ID corresponding to the desired value.
-	 * @return Returns the value as a parameterized <code>E</code>
-	 * object.
-	 */
-	protected E getValue(int valueIndex) {
-		validateValueIndex(valueIndex);
-		return values.get(valueIndex);
-	}
-	
-	/**
-	 * Indicates whether the object is enabled or not.
-	 * @return Returns <code>true</code> if the object is enabled and
-	 * <code>false</code> otherwise.
-	 */
-	public boolean isEnabled() {
-		return enabled;
-	}
-	
-	/**
-	 * Sets the value corresponding to the argument value ID to a new
-	 * object.
-	 * @param valueIndex - The ID corresponding to the desired value.
-	 * @param value - The new value.
-	 */
-	protected void setValue(int valueIndex, E value) {
-		validateValueIndex(valueIndex);
-		values.set(valueIndex, value);
-	}
-	
-	/**
-	 * Sets whether the configuration object is enabled.
-	 * @param state <code>true</code> means that the object is enabled
-	 * and <code>false</code> that it is disabled.
-	 */
-	protected void setIsEnabled(boolean state) {
-		enabled = state;
-	}
-	
-	/**
-	 * Throws an exception if the argument index does not correspond to
-	 * any value.
-	 * @param index - The index to check.
-	 */
-	private final void validateValueIndex(int index) {
-		if(index < 0 || index >= values.size()) {
-			throw new IndexOutOfBoundsException("Value index \"" + index + "\" is invalid.");
-		}
-	}
+    // Store the cut values.
+    private final List<E> values;
+    private boolean enabled = false;
+    
+    /**
+     * Instantiates an <code>AbstractConfig</code> with the indicated
+     * number of values.
+     * @param count - The number of values that the object should store.
+     */
+    AbstractConfig(int count) {
+        // A configuration object must have at least one value.
+        if(count <= 0) {
+            throw new IllegalArgumentException("There must be at least one value.");
+        }
+        
+        // Instantiate the value array.
+        values = new ArrayList<E>(count);
+        for(int i = 0; i < count; i++) { values.add(null); }
+    }
+    
+    /**
+     * Gets the value of the cut with the associated value ID.
+     * @param valueIndex - The ID corresponding to the desired value.
+     * @return Returns the value as a parameterized <code>E</code>
+     * object.
+     */
+    protected E getValue(int valueIndex) {
+        validateValueIndex(valueIndex);
+        return values.get(valueIndex);
+    }
+    
+    /**
+     * Indicates whether the object is enabled or not.
+     * @return Returns <code>true</code> if the object is enabled and
+     * <code>false</code> otherwise.
+     */
+    public boolean isEnabled() {
+        return enabled;
+    }
+    
+    /**
+     * Sets the value corresponding to the argument value ID to a new
+     * object.
+     * @param valueIndex - The ID corresponding to the desired value.
+     * @param value - The new value.
+     */
+    protected void setValue(int valueIndex, E value) {
+        validateValueIndex(valueIndex);
+        values.set(valueIndex, value);
+    }
+    
+    /**
+     * Sets whether the configuration object is enabled.
+     * @param state <code>true</code> means that the object is enabled
+     * and <code>false</code> that it is disabled.
+     */
+    protected void setIsEnabled(boolean state) {
+        enabled = state;
+    }
+    
+    /**
+     * Throws an exception if the argument index does not correspond to
+     * any value.
+     * @param index - The index to check.
+     */
+    private final void validateValueIndex(int index) {
+        if(index < 0 || index >= values.size()) {
+            throw new IndexOutOfBoundsException("Value index \"" + index + "\" is invalid.");
+        }
+    }
 }

Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/ConfigurationManager.java
 =============================================================================
--- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/ConfigurationManager.java	(original)
+++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/ConfigurationManager.java	Tue Mar 17 14:45:46 2015
@@ -17,84 +17,84 @@
  * @see EvioDAQParser
  */
 public class ConfigurationManager {
-	// Store the configuration object.
-	private static final DAQConfig DAQ_CONFIG = new DAQConfig();
-	
-	// Track whether a DAQ configuration has been read yet.
-	private static boolean INITIALIZED = false;
-	
-	// Store listeners to alert other classes when an update occurs.
-	private static final List<ActionListener> AL_LIST = new ArrayList<ActionListener>();
-	private static final ActionEvent EVENT = new ActionEvent(DAQ_CONFIG, ActionEvent.RESERVED_ID_MAX + 12, "update");
-	
-	/**
-	 * Gets an instance of the DAQ configuration settings object if it
-	 * exists. If no configuration has been read, this will return
-	 * <code>null</code> instead.
-	 * @return Returns the DAQ settings as a <code>DAQConfig</code>
-	 * object or <code>null</code>.
-	 */
-	public static final DAQConfig getInstance() {
-		if(INITIALIZED) { return DAQ_CONFIG; }
-		else { return null; }
-	}
-	
-	/**
-	 * Adds a listener to track when updates occur in the DAQ settings.
-	 * @param listener - The listener.
-	 */
-	public static final void addActionListener(ActionListener listener) {
-		if(listener != null) { AL_LIST.add(listener); }
-	}
-	
-	/**
-	 * Gets the list of all listeners attached to the manager.
-	 * @return Returns a <code>List</code> collection containing the
-	 * <code>ActionListener</code> objects attached to the manager.
-	 */
-	public static final List<ActionListener> getActionListeners() {
-		return AL_LIST;
-	}
-	
-	/**
-	 * Indicates whether a DAQ configuration has been received yet.
-	 * If <code>false</code>, then calls to <code>getInstance</code>
-	 * will return <code>null</code>.
-	 * @return Returns <code>true</code> if a DAQ configuration has
-	 * been read and <code>false</code> otherwise.
-	 */
-	public static final boolean isInitialized() {
-		return INITIALIZED;
-	}
-	
-	/**
-	 * Removes an listener so that it will no longer receive updates
-	 * when the DAQ configuration changes.
-	 * @param listener - The listener to remove.
-	 */
-	public static final void removeActionListener(ActionListener listener) {
-		if(listener != null) { AL_LIST.remove(listener); }
-	}
-	
-	/**
-	 * Updates the DAQ configuration with the given EVIO parser. The
-	 * manager will also note that it is initialized and inform any
-	 * associated listeners that an update has occurred.
-	 * @param parser - The updated DAQ information.
-	 */
-	public static final void updateConfiguration(EvioDAQParser parser) {
-		DAQ_CONFIG.loadConfig(parser);
-		INITIALIZED = true;
-		updateListeners();
-	}
-	
-	/**
-	 * Sends an update event to all associated listeners.
-	 */
-	private static final void updateListeners() {
-		for(ActionListener al : AL_LIST) {
-			al.actionPerformed(EVENT);
-		}
-	}
-	
-}
+    // Store the configuration object.
+    private static final DAQConfig DAQ_CONFIG = new DAQConfig();
+    
+    // Track whether a DAQ configuration has been read yet.
+    private static boolean INITIALIZED = false;
+    
+    // Store listeners to alert other classes when an update occurs.
+    private static final List<ActionListener> AL_LIST = new ArrayList<ActionListener>();
+    private static final ActionEvent EVENT = new ActionEvent(DAQ_CONFIG, ActionEvent.RESERVED_ID_MAX + 12, "update");
+    
+    /**
+     * Gets an instance of the DAQ configuration settings object if it
+     * exists. If no configuration has been read, this will return
+     * <code>null</code> instead.
+     * @return Returns the DAQ settings as a <code>DAQConfig</code>
+     * object or <code>null</code>.
+     */
+    public static final DAQConfig getInstance() {
+        if(INITIALIZED) { return DAQ_CONFIG; }
+        else { return null; }
+    }
+    
+    /**
+     * Adds a listener to track when updates occur in the DAQ settings.
+     * @param listener - The listener.
+     */
+    public static final void addActionListener(ActionListener listener) {
+        if(listener != null) { AL_LIST.add(listener); }
+    }
+    
+    /**
+     * Gets the list of all listeners attached to the manager.
+     * @return Returns a <code>List</code> collection containing the
+     * <code>ActionListener</code> objects attached to the manager.
+     */
+    public static final List<ActionListener> getActionListeners() {
+        return AL_LIST;
+    }
+    
+    /**
+     * Indicates whether a DAQ configuration has been received yet.
+     * If <code>false</code>, then calls to <code>getInstance</code>
+     * will return <code>null</code>.
+     * @return Returns <code>true</code> if a DAQ configuration has
+     * been read and <code>false</code> otherwise.
+     */
+    public static final boolean isInitialized() {
+        return INITIALIZED;
+    }
+    
+    /**
+     * Removes an listener so that it will no longer receive updates
+     * when the DAQ configuration changes.
+     * @param listener - The listener to remove.
+     */
+    public static final void removeActionListener(ActionListener listener) {
+        if(listener != null) { AL_LIST.remove(listener); }
+    }
+    
+    /**
+     * Updates the DAQ configuration with the given EVIO parser. The
+     * manager will also note that it is initialized and inform any
+     * associated listeners that an update has occurred.
+     * @param parser - The updated DAQ information.
+     */
+    public static final void updateConfiguration(EvioDAQParser parser) {
+        INITIALIZED = false;
+        DAQ_CONFIG.loadConfig(parser);
+        INITIALIZED = true;
+        updateListeners();
+    }
+    
+    /**
+     * Sends an update event to all associated listeners.
+     */
+    private static final void updateListeners() {
+        for(ActionListener al : AL_LIST) {
+            al.actionPerformed(EVENT);
+        }
+    }
+}

Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/DAQConfig.java
 =============================================================================
--- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/DAQConfig.java	(original)
+++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/DAQConfig.java	Tue Mar 17 14:45:46 2015
@@ -9,39 +9,49 @@
  * @author Kyle McCarty <[log in to unmask]>
  */
 public class DAQConfig extends IDAQConfig {
-	// Store the configuration objects.
-	private SSPConfig sspConfig = new SSPConfig();
-	private FADCConfig fadcConfig = new FADCConfig();
-	
-	/**
-	 * Gets the configuration parameters for the FADC.
-	 * @return Returns the FADC configuration.
-	 */
-	public FADCConfig getFADCConfig() {
-		return fadcConfig;
-	}
-	
-	/**
-	 * Gets the configuration parameters for the SSP.
-	 * @return Returns the SSP configuration.
-	 */
-	public SSPConfig getSSPConfig() {
-		return sspConfig;
-	}
-	
-	@Override
-	void loadConfig(EvioDAQParser parser) {
-		// Pass the configuration parser to the system-specific objects.
-		sspConfig.loadConfig(parser);
-		fadcConfig.loadConfig(parser);
-	}
+    // Store the configuration objects.
+    private SSPConfig sspConfig = new SSPConfig();
+    private GTPConfig gtpConfig = new GTPConfig();
+    private FADCConfig fadcConfig = new FADCConfig();
+    
+    /**
+     * Gets the configuration parameters for the FADC.
+     * @return Returns the FADC configuration.
+     */
+    public FADCConfig getFADCConfig() {
+        return fadcConfig;
+    }
+    
+    /**
+     * Gets the configuration parameters for the GTP.
+     * @return Returns the GTP configuration.
+     */
+    public GTPConfig getGTPConfig() {
+        return gtpConfig;
+    }
+    
+    /**
+     * Gets the configuration parameters for the SSP.
+     * @return Returns the SSP configuration.
+     */
+    public SSPConfig getSSPConfig() {
+        return sspConfig;
+    }
+    
+    @Override
+    void loadConfig(EvioDAQParser parser) {
+        // Pass the configuration parser to the system-specific objects.
+        sspConfig.loadConfig(parser);
+        gtpConfig.loadConfig(parser);
+        fadcConfig.loadConfig(parser);
+    }
 
-	@Override
-	public void printConfig() {
-		// Print the system-specific objects.
-		fadcConfig.printConfig();
-		System.out.println();
-		sspConfig.printConfig();
-	}
-	
-}
+    @Override
+    public void printConfig() {
+        // Print the system-specific objects.
+        fadcConfig.printConfig();
+        System.out.println();
+        sspConfig.printConfig();
+    }
+    
+}

Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/DAQConfigDriver.java
 =============================================================================
--- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/DAQConfigDriver.java	(original)
+++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/DAQConfigDriver.java	Tue Mar 17 14:45:46 2015
@@ -6,20 +6,20 @@
 import org.lcsim.util.Driver;
 
 public class DAQConfigDriver extends Driver {
-	
-	@Override
-	public void process(EventHeader event) {
-		// Check if a trigger configuration bank exists.
-		if(event.hasCollection(EvioDAQParser.class, "TriggerConfig")) {
-			// Get the trigger configuration bank. There should only be
-			// one in the list.
-			List<EvioDAQParser> configList = event.get(EvioDAQParser.class, "TriggerConfig");
-			EvioDAQParser daqConfig = configList.get(0);
-			
-			// Get the DAQ configuration and update it with the new
-			// configuration object.
-			ConfigurationManager.updateConfiguration(daqConfig);
-		}
-	}
-	
+    
+    @Override
+    public void process(EventHeader event) {
+        // Check if a trigger configuration bank exists.
+        if(event.hasCollection(EvioDAQParser.class, "TriggerConfig")) {
+            // Get the trigger configuration bank. There should only be
+            // one in the list.
+            List<EvioDAQParser> configList = event.get(EvioDAQParser.class, "TriggerConfig");
+            EvioDAQParser daqConfig = configList.get(0);
+            
+            // Get the DAQ configuration and update it with the new
+            // configuration object.
+            ConfigurationManager.updateConfiguration(daqConfig);
+        }
+    }
+    
 }

Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/ESBCutConfig.java
 =============================================================================
--- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/ESBCutConfig.java	(original)
+++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/ESBCutConfig.java	Tue Mar 17 14:45:46 2015
@@ -10,43 +10,43 @@
  * @author Kyle McCarty <[log in to unmask]>
  */
 public class ESBCutConfig extends AbstractConfig<Double> {
-	private static final int ENERGY_SLOPE_THRESHOLD = 0;
-	private static final int PARAMETER_F = 1;
-	
-	/**
-	 * Instantiates a new <code>ESBCutConfig</code> object.
-	 */
-	ESBCutConfig() { super(2); }
-	
-	/**
-	 * Gets the lower bound of the cut.
-	 * @return Returns the lower bound as a <code>double</code>.
-	 */
-	public double getLowerBound() {
-		return getValue(ENERGY_SLOPE_THRESHOLD);
-	}
-	
-	/**
-	 * Gets the parameter F in the energy slope equation.
-	 * @return Returns the parameter as a <code>double</code>.
-	 */
-	public double getParameterF() {
-		return getValue(PARAMETER_F);
-	}
-	
-	/**
-	 * Sets the lower bound of the cut to the specified value.
-	 * @param value - The new lower bound for the cut.
-	 */
-	void setLowerBound(double value) {
-		setValue(ENERGY_SLOPE_THRESHOLD, value);
-	}
-	
-	/**
-	 * Sets the parameter F in the energy slope equation.
-	 * @param value - The new parameter for the cut.
-	 */
-	void setParameterF(double value) {
-		setValue(PARAMETER_F, value);
-	}
-}
+    private static final int ENERGY_SLOPE_THRESHOLD = 0;
+    private static final int PARAMETER_F = 1;
+    
+    /**
+     * Instantiates a new <code>ESBCutConfig</code> object.
+     */
+    ESBCutConfig() { super(2); }
+    
+    /**
+     * Gets the lower bound of the cut.
+     * @return Returns the lower bound as a <code>double</code>.
+     */
+    public double getLowerBound() {
+        return getValue(ENERGY_SLOPE_THRESHOLD);
+    }
+    
+    /**
+     * Gets the parameter F in the energy slope equation.
+     * @return Returns the parameter as a <code>double</code>.
+     */
+    public double getParameterF() {
+        return getValue(PARAMETER_F);
+    }
+    
+    /**
+     * Sets the lower bound of the cut to the specified value.
+     * @param value - The new lower bound for the cut.
+     */
+    void setLowerBound(double value) {
+        setValue(ENERGY_SLOPE_THRESHOLD, value);
+    }
+    
+    /**
+     * Sets the parameter F in the energy slope equation.
+     * @param value - The new parameter for the cut.
+     */
+    void setParameterF(double value) {
+        setValue(PARAMETER_F, value);
+    }
+}

Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/EvioDAQParser.java
 =============================================================================
--- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/EvioDAQParser.java	(original)
+++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/EvioDAQParser.java	Tue Mar 17 14:45:46 2015
@@ -13,97 +13,94 @@
 import org.hps.conditions.ecal.EcalConditions;
 
 public class EvioDAQParser {
-
     /*
      * Read/Parse/Save the DAQ trigger configuration settings.
      * These settings arrive in multiple banks, but they *should* be in the same event.
-     *
+     * 
      * Currently this is set up to read SSP and ECAL configurations,
      * which is all that is currently available in EVIO as of Feb 28, 2015.
      * 
      * GTP settings and Prescale factors will need to be added to this class when added to EVIO.
-     *
+     * 
      * TODO: Error in EVIO format for Crate 39 for 2014 data requires another JEVIO workaround (realized Feb 16).
      *       ** This was fixed in EVIO for data after run 4044.
-     *       
+     * 
      * TODO: Manually put in GTP settings based on run number for 2014 data.
      * TODO: Manually deal with change in format of SSP_HPS_SINGLES_NMIN (at 3312(?)).
-     *
+     * 
      * TODO: Restructure, clean up..
      *  
      *  @author <[log in to unmask]>
      */
-  
     public int nBanks = 0;
-    
     public static final int BANK_TAG = 0xE10E;
-  
+    
     // need to know these in order to interpret DAQ strings:
     private static final int[] singlesIOsrc = { 20, 21 };
     private static final int[] pairsIOsrc = { 22, 23 };
-  
-	// Dump everything read from the DAQ Configuration Bank, minimal interpretation:
-	public Map<String,List<String>> configMap = new HashMap<String,List<String>>();
-  
-	// link ECAL FADC channel settings to EcalChannels:
-	Map<EcalChannel,Float> GAIN = new HashMap<EcalChannel,Float>();
-	Map<EcalChannel,Float> PEDESTAL = new HashMap<EcalChannel,Float>();
-	Map<EcalChannel,Integer> THRESHOLD = new HashMap<EcalChannel,Integer>();
-	
-//	private boolean debug = true;
-	private boolean debug = false;
-
-	// FADC Config:
-	int fadcNSA    = 0;
-	int fadcNSB    = 0;
-	int fadcNPEAK  = 0;
-	int fadcMODE   = 0;
-	int fadcWIDTH  = 0;
-	int fadcOFFSET = 0;
-
-	// GTP Clustering Cut Values:
-	int clusterMinSeedEnergy  = 0;
-	int clusterMinHitTimeDiff = 0;
-	int clusterMaxHitTimeDiff = 0;
-	
-	// Triggers Enabled:
-	boolean[] singlesEn = { false, false };
-	boolean[] pairsEn   = { false, false };
-
-	// Singles Cuts Enabled:
-	boolean[] singlesNhitsEn     = { false, false };
-	boolean[] singlesEnergyMinEn = { false, false };
-	boolean[] singlesEnergyMaxEn = { false, false };
-	
-	// Pairs Cuts Enabled:
-	boolean[] pairsEnergySumMaxMinEn = { false, false };
-	boolean[] pairsEnergyDiffEn      = { false, false };
-	boolean[] pairsCoplanarityEn     = { false, false };
-	boolean[] pairsEnergyDistEn      = { false, false };
-	
-	// Singles Cut Values:
-	int[] singlesNhits     = { 0, 0 };
-	int[] singlesEnergyMin = { 0, 0 };
-	int[] singlesEnergyMax = { 0, 0 };
-	
-	// Pairs Cut Values:
-	int[] pairsNhitsMin       = { 0, 0 };
-	int[] pairsEnergyMin      = { 0, 0 };
-	int[] pairsEnergyMax      = { 0, 0 };
-	int[] pairsEnergySumMin   = { 0, 0 };
-	int[] pairsEnergySumMax   = { 0, 0 };
-	int[] pairsEnergyDiffMax  = { 0, 0 };
-	int[] pairsCoplanarityMax = { 0, 0 };
-	int[] pairsTimeDiffMax    = { 0, 0 };
-	int[] pairsEnergyDistMin  = { 0, 0 };
-	
-	// Pairs Cut Parameters:
-	float[] pairsEnergyDistSlope = { 0, 0 };
-
-	// Have to remember the previous slot line in order to interpret the data:
-	private int thisFadcSlot = 0;
-
-	// Cache local set of EcalChannels:
+    
+    // Dump everything read from the DAQ Configuration Bank, minimal interpretation:
+    Map<String,List<String>> configMap = new HashMap<String,List<String>>();
+    
+    // link ECAL FADC channel settings to EcalChannels:
+    Map<EcalChannel,Float> GAIN = new HashMap<EcalChannel,Float>();
+    Map<EcalChannel,Float> PEDESTAL = new HashMap<EcalChannel,Float>();
+    Map<EcalChannel,Integer> THRESHOLD = new HashMap<EcalChannel,Integer>();
+    
+    // private boolean debug = true;
+    private boolean debug = false;
+    
+    // FADC Config:
+    int fadcNSA    = 0;
+    int fadcNSB    = 0;
+    int fadcNPEAK  = 0;
+    int fadcMODE   = 0;
+    int fadcWIDTH  = 0;
+    int fadcOFFSET = 0;
+    
+    // GTP Clustering Cut Values:
+    int gtpMinSeedEnergy  = 0;
+    int gtpWindowBefore = 0;
+    int gtpWindowAfter = 0;
+    
+    // Triggers Enabled:
+    boolean[] singlesEn = { false, false };
+    boolean[] pairsEn   = { false, false };
+    
+    // Singles Cuts Enabled:
+    boolean[] singlesNhitsEn     = { false, false };
+    boolean[] singlesEnergyMinEn = { false, false };
+    boolean[] singlesEnergyMaxEn = { false, false };
+    
+    // Pairs Cuts Enabled:
+    boolean[] pairsEnergySumMaxMinEn = { false, false };
+    boolean[] pairsEnergyDiffEn      = { false, false };
+    boolean[] pairsCoplanarityEn     = { false, false };
+    boolean[] pairsEnergyDistEn      = { false, false };
+    
+    // Singles Cut Values:
+    int[] singlesNhits     = { 0, 0 };
+    int[] singlesEnergyMin = { 0, 0 };
+    int[] singlesEnergyMax = { 0, 0 };
+    
+    // Pairs Cut Values:
+    int[] pairsNhitsMin       = { 0, 0 };
+    int[] pairsEnergyMin      = { 0, 0 };
+    int[] pairsEnergyMax      = { 0, 0 };
+    int[] pairsEnergySumMin   = { 0, 0 };
+    int[] pairsEnergySumMax   = { 0, 0 };
+    int[] pairsEnergyDiffMax  = { 0, 0 };
+    int[] pairsCoplanarityMax = { 0, 0 };
+    int[] pairsTimeDiffMax    = { 0, 0 };
+    int[] pairsEnergyDistMin  = { 0, 0 };
+    
+    // Pairs Cut Parameters:
+    float[] pairsEnergyDistSlope = { 0, 0 };
+    
+    // Have to remember the previous slot line in order to interpret the data:
+    private int thisFadcSlot = 0;
+    
+    // Cache local set of EcalChannels:
     private EcalConditions ecalConditions = null;
     private List<EcalChannel> channels = new ArrayList<EcalChannel>();
     
@@ -112,308 +109,292 @@
         for (int ii = 0; ii < 442; ii++) {
             channels.add(findChannel(ii+1));
         } 
-	}
-    
-    public void parse(int crate,int runNumber,String[] dump) {
-        
+    }
+    
+    public void parse(int crate, int runNumber, String[] dump) {
         nBanks++;
-        
         loadConfigMap(crate,dump); 
-    	if (debug) printMap();
+        if (debug) printMap();
         fixConfigMap2014Run(runNumber);
         parseConfigMap();
         
-        if (nBanks>2 && debug) printVars();
-    }
-
+        if(nBanks > 2 && debug) { printVars(); }
+    }
+    
     /*
      * The first parsing routine.  Just dumps the config strings
      * into a map whose keys are the first column in the config file.
      * Also treats some special cases.
      */
-    private void loadConfigMap(int crate,String[] dump) {
-  
-        for (String dump1 : dump) {
-            for (String line : dump1.trim().split("\n")) {
-
-                String[] cols=line.trim().split(" +",2);
-                if (cols.length < 2) continue;
-
-                String key=cols[0];
-                List<String> vals=new ArrayList<String>
+    private void loadConfigMap(int crate, String[] dump) {
+        for(String dump1 : dump) {
+            for(String line : dump1.trim().split("\n")) {
+                
+                String[] cols = line.trim().split(" +", 2);
+                if(cols.length < 2) continue;
+                
+                String key = cols[0];
+                List<String> vals = new ArrayList<String>
                     (Arrays.asList(cols[1].trim().split(" +")));
-
+                
                 if (vals.size() < 1) {
-                	continue;
+                    continue;
                 }
                
                 // SPECIAL CASE:
                 // parse the 16+1 column slot configurations. 
                 if (key.startsWith("FADC250")) {
-                    parseFADC(crate,key.trim(),vals);
+                    parseFADC(crate, key.trim(), vals);
                 }
                 
                 // SPECIAL CASE:
                 // figure out which triggers are enabled:
-                else if (key.startsWith("SSP_HPS_SET_IO_SRC")) {
+                else if(key.startsWith("SSP_HPS_SET_IO_SRC")) {
                     int trig = Integer.valueOf(vals.get(1));
-                    for (int ii=0; ii<pairsIOsrc.length; ii++)
-                    {
-                        if (trig == singlesIOsrc[ii]) {
-                            singlesEn[ii]=true;
+                    for (int ii = 0; ii < pairsIOsrc.length; ii++) {
+                        if(trig == singlesIOsrc[ii]) {
+                            singlesEn[ii] = true;
                         }
-                        else if (trig == pairsIOsrc[ii]) {
-                            pairsEn[ii]=true;
+                        else if(trig == pairsIOsrc[ii]) {
+                            pairsEn[ii] = true;
                         }
                     }
                 }
                
                 // GENERAL CASE:
                 // Append trigger# onto key:
-                if (vals.size() > 1 && key.startsWith("SSP"))
-                {
-                    key += "_"+vals.remove(0);
+                if(vals.size() > 1 && key.startsWith("SSP")) {
+                    key += "_" + vals.remove(0);
                 }
                 // dump it into the map:
-                configMap.put(key,vals);
-            }
-        }
-    }
+                configMap.put(key, vals);
+            }
+        }
+    }
+    
     /*
      * This function parses the config map for the cases where the
      * config string has a simple format:
      * TAG VALUE
      * TAG TRIGGER VALUES
      */
-    public void parseConfigMap()
-    {
-//        System.out.println("PARSECONFIGMAP ..................");
-       
-        fadcNSA=Integer.valueOf(getConfig("FADC250_NSA",0));
-        fadcNSB=Integer.valueOf(getConfig("FADC250_NSB",0));
-        fadcNPEAK=Integer.valueOf(getConfig("FADC250_NPEAK",0));
-        fadcMODE=Integer.valueOf(getConfig("FADC250_MODE",0));
-        fadcWIDTH=Integer.valueOf(getConfig("FADC250_W_WIDTH",0));
-        fadcOFFSET=Integer.valueOf(getConfig("FADC250_W_OFFSET",0));
+    public void parseConfigMap() {
+        fadcNSA = Integer.valueOf(getConfig("FADC250_NSA", 0));
+        fadcNSB = Integer.valueOf(getConfig("FADC250_NSB", 0));
+        fadcNPEAK = Integer.valueOf(getConfig("FADC250_NPEAK", 0));
+        fadcMODE = Integer.valueOf(getConfig("FADC250_MODE", 0));
+        fadcWIDTH = Integer.valueOf(getConfig("FADC250_W_WIDTH", 0));
+        fadcOFFSET = Integer.valueOf(getConfig("FADC250_W_OFFSET", 0));
         
-        clusterMinSeedEnergy=Integer.valueOf(getConfig("GTP_CLUSTER_PULSE_THRESHOLD",0));
-        clusterMinHitTimeDiff=Integer.valueOf(getConfig("GTP_CLUSTER_PULSE_COIN",0));
-        clusterMaxHitTimeDiff=Integer.valueOf(getConfig("GTP_CLUSTER_PULSE_COIN",1));
-       
-        for (int ii=0; ii<2; ii++) {
-            
-            singlesNhitsEn[ii]=getBoolConfigSSP(ii,"SINGLES_NMIN",1);
-            singlesEnergyMinEn[ii]=getBoolConfigSSP(ii,"SINGLES_EMIN",1);
-            singlesEnergyMaxEn[ii]=getBoolConfigSSP(ii,"SINGLES_EMAX",1);
-
-            pairsEnergySumMaxMinEn[ii]=getBoolConfigSSP(ii,"PAIRS_SUMMAX_MIN",2);
-            pairsEnergyDiffEn[ii]=getBoolConfigSSP(ii,"PAIRS_DIFFMAX",1);
-            pairsCoplanarityEn[ii]=getBoolConfigSSP(ii,"PAIRS_COPLANARITY",1);
-            pairsEnergyDistEn[ii]=getBoolConfigSSP(ii,"PAIRS_ENERGYDIST",1);
-
-            singlesNhits[ii]=getIntConfigSSP(ii,"SINGLES_NMIN",0);
-            singlesEnergyMin[ii]=getIntConfigSSP(ii,"SINGLES_EMIN",0);
-            singlesEnergyMax[ii]=getIntConfigSSP(ii,"SINGLES_EMAX",0);
-
-            pairsNhitsMin[ii]=getIntConfigSSP(ii,"PAIRS_NMIN",0);
-            pairsEnergyMin[ii]=getIntConfigSSP(ii,"PAIRS_EMIN",0);
-            pairsEnergyMax[ii]=getIntConfigSSP(ii,"PAIRS_EMAX",0);
-            pairsEnergySumMin[ii]=getIntConfigSSP(ii,"PAIRS_SUMMAX_MIN",1);
-            pairsEnergySumMax[ii]=getIntConfigSSP(ii,"PAIRS_SUMMAX_MIN",0);
-            pairsEnergyDiffMax[ii]=getIntConfigSSP(ii,"PAIRS_DIFFMAX",0);
-            pairsCoplanarityMax[ii]=getIntConfigSSP(ii,"PAIRS_COPLANARITY",0);
-            pairsTimeDiffMax[ii]=getIntConfigSSP(ii,"PAIRS_TIMECOINCIDENCE",0);
-            pairsEnergyDistSlope[ii]=getFloatConfigSSP(ii,"PAIRS_ENERGYDIST",0);
-            pairsEnergyDistMin[ii]=getIntConfigSSP(ii,"PAIRS_ENERGYDIST",1);
-        }
-//        System.out.println("DONE PARSECONFIGMAP.");
-    }
-    
-   
-     
+        gtpMinSeedEnergy = Integer.valueOf(getConfig("GTP_CLUSTER_PULSE_THRESHOLD", 0));
+        gtpWindowBefore = Integer.valueOf(getConfig("GTP_CLUSTER_PULSE_COIN", 0));
+        gtpWindowAfter = Integer.valueOf(getConfig("GTP_CLUSTER_PULSE_COIN", 1));
+        
+        for(int ii = 0; ii < 2; ii++) {
+            singlesNhitsEn[ii]         = getBoolConfigSSP(ii,  "SINGLES_NMIN",          1);
+            singlesEnergyMinEn[ii]     = getBoolConfigSSP(ii,  "SINGLES_EMIN",          1);
+            singlesEnergyMaxEn[ii]     = getBoolConfigSSP(ii,  "SINGLES_EMAX",          1);
+            
+            pairsEnergySumMaxMinEn[ii] = getBoolConfigSSP(ii,  "PAIRS_SUMMAX_MIN",      2);
+            pairsEnergyDiffEn[ii]      = getBoolConfigSSP(ii,  "PAIRS_DIFFMAX",         1);
+            pairsCoplanarityEn[ii]     = getBoolConfigSSP(ii,  "PAIRS_COPLANARITY",     1);
+            pairsEnergyDistEn[ii]      = getBoolConfigSSP(ii,  "PAIRS_ENERGYDIST",      1);
+            
+            singlesNhits[ii]           = getIntConfigSSP(ii,   "SINGLES_NMIN",          0);
+            singlesEnergyMin[ii]       = getIntConfigSSP(ii,   "SINGLES_EMIN",          0);
+            singlesEnergyMax[ii]       = getIntConfigSSP(ii,   "SINGLES_EMAX",          0);
+            
+            pairsNhitsMin[ii]          = getIntConfigSSP(ii,   "PAIRS_NMIN",            0);
+            pairsEnergyMin[ii]         = getIntConfigSSP(ii,   "PAIRS_EMIN",            0);
+            pairsEnergyMax[ii]         = getIntConfigSSP(ii,   "PAIRS_EMAX",            0);
+            pairsEnergySumMin[ii]      = getIntConfigSSP(ii,   "PAIRS_SUMMAX_MIN",      1);
+            pairsEnergySumMax[ii]      = getIntConfigSSP(ii,   "PAIRS_SUMMAX_MIN",      0);
+            pairsEnergyDiffMax[ii]     = getIntConfigSSP(ii,   "PAIRS_DIFFMAX",         0);
+            pairsCoplanarityMax[ii]    = getIntConfigSSP(ii,   "PAIRS_COPLANARITY",     0);
+            pairsTimeDiffMax[ii]       = getIntConfigSSP(ii,   "PAIRS_TIMECOINCIDENCE", 0);
+            pairsEnergyDistSlope[ii]   = getFloatConfigSSP(ii, "PAIRS_ENERGYDIST",      0);
+            pairsEnergyDistMin[ii]     = getIntConfigSSP(ii,   "PAIRS_ENERGYDIST",      1);
+        }
+    }
+    
+    
+    
     /*
      * UNFINISHED.
      * This is a fixer-upper for before we had the full config in EVIO
      * or when there was a bug in it.
      */
     private void fixConfigMap2014Run(int runNumber) {
-        if (runNumber>3470 || runNumber < 3100) return;
-     	// TODO: port datacat/python/engrun/engrun_metadata.py
+        if(runNumber > 3470 || runNumber < 3100) { return; }
+        // TODO: port datacat/python/engrun/engrun_metadata.py
         // 1. SET GTP SETTINGS MANUALLY BASED ON RUN NUMBER
         // 2. FIX SINGLES_NMIN prior to 3312
-    	for (String key : configMap.keySet()) {
-    	}
-    	List<String> tmp=new ArrayList<String>();
-    	tmp.add("0");
-    	tmp.add("0");
-    	tmp.add("0");
-    	tmp.add("0");
-    	configMap.put("GTP_CLUSTER_THRESH",tmp);
-    	configMap.put("GTP_TIMEDIFF",tmp);
-    }
-    
-    
+        for (String key : configMap.keySet()) {
+        }
+        List<String> tmp = new ArrayList<String>();
+        tmp.add("0");
+        tmp.add("0");
+        tmp.add("0");
+        tmp.add("0");
+        configMap.put("GTP_CLUSTER_THRESH" ,tmp);
+        configMap.put("GTP_TIMEDIFF", tmp);
+    }
     
     /*
      * These treat the FADC config lines with 16+1 columns.
      * Must keep track of most recent FADC250_SLOT tag, since it's
      * not on the line with the data. 
      */
-    private void parseFADC(int crate,String key,List<String> vals)
-    {
-//        System.out.println(crate);
+    private void parseFADC(int crate, String key, List<String> vals) {
+    	// System.out.println(crate);
         if (key.equals("FADC250_SLOT")) {
-            thisFadcSlot=Integer.valueOf(vals.get(0));
+            thisFadcSlot = Integer.valueOf(vals.get(0));
         }
         else if (key.equals("FADC250_ALLCH_TET")) {
-            setChannelParsInt(crate,thisFadcSlot,THRESHOLD,vals);
+            setChannelParsInt(crate, thisFadcSlot, THRESHOLD, vals);
         }
         else if (key.equals("FADC250_ALLCH_PED")) {
-            setChannelParsFloat(crate,thisFadcSlot,PEDESTAL,vals);    
+            setChannelParsFloat(crate, thisFadcSlot, PEDESTAL, vals);    
         }
         else if (key.equals("FADC250_ALLCH_GAIN")) {
-            setChannelParsFloat(crate,thisFadcSlot,GAIN,vals);
-        }
-    }
-    private void setChannelParsFloat(int crate,int slot,Map<EcalChannel,Float>map, List<String> vals)
-    {
-        for (int ii=0; ii<16; ii++) {
-            map.put(findChannel(crate,slot,ii),Float.valueOf(vals.get(ii)));
-        }
-    }
-    private void setChannelParsInt(int crate,int slot,Map<EcalChannel,Integer>map, List<String> vals)
-    {
-        for (int ii=0; ii<16; ii++) {
-            map.put(findChannel(crate,slot,ii),Integer.valueOf(vals.get(ii)));
-        }
-    }
-   
-    
-    
+            setChannelParsFloat(crate, thisFadcSlot, GAIN, vals);
+        }
+    }
+    
+    private void setChannelParsFloat(int crate, int slot, Map<EcalChannel, Float>map, List<String> vals) {
+        for (int ii = 0; ii < 16; ii++) {
+            map.put(findChannel(crate, slot, ii),Float.valueOf(vals.get(ii)));
+        }
+    }
+    
+    private void setChannelParsInt(int crate, int slot, Map<EcalChannel, Integer>map, List<String> vals) {
+        for (int ii = 0; ii < 16; ii++) {
+            map.put(findChannel(crate, slot, ii),Integer.valueOf(vals.get(ii)));
+        }
+    }
     
     public void printMap() {
         System.out.print("\nTriggerConfigMap::::::::::::::::::::::::::::\n");
         for (String key : configMap.keySet()) {
-            System.out.printf("%s: ",key);
+            System.out.printf("%s: ", key);
             for (String val : configMap.get(key)) {
-                System.out.printf("%s ",val);
+                System.out.printf("%s ", val);
             }
             System.out.printf("\n");
         }
         System.out.println("::::::::::::::::::::::::::::::::::::::::::::");
     }
-
+    
     public void printVars()
-	{
+    {
         System.out.println("\nTriggerConfigVars%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%");
         System.out.println();
-	    System.out.println(String.format("GTPMINSEED: %d",clusterMinSeedEnergy));
-	    System.out.println(String.format("GTPMINHITDT: %d",clusterMinHitTimeDiff));
-	    System.out.println(String.format("GTPMAXHITDT: %d",clusterMaxHitTimeDiff));
-	    System.out.println();
-	    System.out.println(String.format("FADC250_NSA: %d",fadcNSA));
-	    System.out.println(String.format("FADC250_NSB: %d",fadcNSB));
-	    System.out.println(String.format("FADC250_NPEAK: %d",fadcNPEAK));
-	    System.out.println(String.format("FADC250_MODE: %d",fadcMODE));
-	    System.out.println(String.format("FADC250_WIDTH: %d",fadcWIDTH));
-	    System.out.println(String.format("FADC250_OFFSET: %d",fadcOFFSET));
-        for (EcalChannel cc : ecalConditions.getChannelCollection()) {
+        System.out.println(String.format("GTPMINSEED: %d",     gtpMinSeedEnergy));
+        System.out.println(String.format("GTPMINHITDT: %d",    gtpWindowBefore));
+        System.out.println(String.format("GTPMAXHITDT: %d",    gtpWindowAfter));
+        System.out.println();
+        System.out.println(String.format("FADC250_NSA: %d",    fadcNSA));
+        System.out.println(String.format("FADC250_NSB: %d",    fadcNSB));
+        System.out.println(String.format("FADC250_NPEAK: %d",  fadcNPEAK));
+        System.out.println(String.format("FADC250_MODE: %d",   fadcMODE));
+        System.out.println(String.format("FADC250_WIDTH: %d",  fadcWIDTH));
+        System.out.println(String.format("FADC250_OFFSET: %d", fadcOFFSET));
+        for(EcalChannel cc : ecalConditions.getChannelCollection()) {
             //System.out.print(String.format("SLOT%d CHAN%d --",cc.getSlot(),cc.getChannel()));
-            if (!PEDESTAL.containsKey(cc)) {
+            if(!PEDESTAL.containsKey(cc)) {
                 System.out.println("\nP !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
             }
-            if (!THRESHOLD.containsKey(cc)) {
+            if(!THRESHOLD.containsKey(cc)) {
                 System.out.println("\nT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
             }
-            if (!GAIN.containsKey(cc)) {
+            if(!GAIN.containsKey(cc)) {
                 System.out.println("\nG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
             }
             //System.out.println(String.format(" %f %d %f",
             //        PEDESTAL.get(cc),THRESHOLD.get(cc),GAIN.get(cc)));
         }
-	    System.out.println();
-	    for (int ii=0; ii<2; ii++)
-	    {
-	        System.out.println(String.format("SINGLES_EN %d %b ",ii,singlesEn[ii]));
-	        System.out.println(String.format("PAIRS_EN %d %b ",ii,pairsEn[ii]));
-	        
-	        System.out.println(String.format("SINGLES_NHITS_EN %d %b:  ",ii,singlesNhitsEn[ii]));
-	        System.out.println(String.format("SINGLES_EMIN_EN %d %b",ii,singlesEnergyMinEn[ii]));
-	        System.out.println(String.format("SINGLES_EMAX_EN %d %b",ii,singlesEnergyMaxEn[ii]));
-	        
-	        System.out.println(String.format("PAIRS_SUMMAXMIN_EN %d %b",ii,pairsEnergySumMaxMinEn[ii]));
-	        System.out.println(String.format("PAIRS_ENERGYDIFF_EN %d %b",ii,pairsEnergyDiffEn[ii]));
-	        System.out.println(String.format("PAIRS_COP_EN %d %b",ii,pairsCoplanarityEn[ii]));
-	        System.out.println(String.format("PAIRS_EDIST_EN %d %b",ii,pairsEnergyDistEn[ii]));
-	        
-	        System.out.println(String.format("SINGLES_NHTIS %d %d",ii,singlesNhits[ii]));
-	        System.out.println(String.format("SINGLES_EMIN %d %d",ii,singlesEnergyMin[ii]));
-	        System.out.println(String.format("SINGLES_EMAX %d %d",ii,singlesEnergyMax[ii]));
-	        
-	        System.out.println(String.format("PAIRS_NHITS %d %d",ii,pairsNhitsMin[ii]));
-	        System.out.println(String.format("PAIRS_SUMMIN %d %d",ii,pairsEnergySumMin[ii]));
-	        System.out.println(String.format("PAIRS_SUMMAX %d %d",ii,pairsEnergySumMax[ii]));
-	        System.out.println(String.format("PAIRS_ENERGYDIFF %d %d",ii,pairsEnergyDiffMax[ii]));
-	        System.out.println(String.format("PAIRS_COPMAX %d %d",ii,pairsCoplanarityMax[ii]));
-	        System.out.println(String.format("PAIRS_TDIFFMAAX %d %d",ii,pairsTimeDiffMax[ii]));
-	        System.out.println(String.format("PAIRS_EDISTMIN %d %d",ii,pairsEnergyDistMin[ii]));
-	        System.out.println(String.format("PAIRS_EDISTSLOP %d %f",ii,pairsEnergyDistSlope[ii]));
-	    }
-	    System.out.println("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%");
-	}
-  
-    
+        
+        System.out.println();
+        for(int ii = 0; ii < 2; ii++) {
+            System.out.println(String.format("SINGLES_EN %d %b ",         ii, singlesEn[ii]));
+            System.out.println(String.format("PAIRS_EN %d %b ",           ii, pairsEn[ii]));
+            
+            System.out.println(String.format("SINGLES_NHITS_EN %d %b: ",  ii, singlesNhitsEn[ii]));
+            System.out.println(String.format("SINGLES_EMIN_EN %d %b",     ii, singlesEnergyMinEn[ii]));
+            System.out.println(String.format("SINGLES_EMAX_EN %d %b",     ii, singlesEnergyMaxEn[ii]));
+            
+            System.out.println(String.format("PAIRS_SUMMAXMIN_EN %d %b",  ii, pairsEnergySumMaxMinEn[ii]));
+            System.out.println(String.format("PAIRS_ENERGYDIFF_EN %d %b", ii, pairsEnergyDiffEn[ii]));
+            System.out.println(String.format("PAIRS_COP_EN %d %b",        ii, pairsCoplanarityEn[ii]));
+            System.out.println(String.format("PAIRS_EDIST_EN %d %b",      ii, pairsEnergyDistEn[ii]));
+            
+            System.out.println(String.format("SINGLES_NHTIS %d %d",       ii, singlesNhits[ii]));
+            System.out.println(String.format("SINGLES_EMIN %d %d",        ii, singlesEnergyMin[ii]));
+            System.out.println(String.format("SINGLES_EMAX %d %d",        ii, singlesEnergyMax[ii]));
+            
+            System.out.println(String.format("PAIRS_NHITS %d %d",         ii, pairsNhitsMin[ii]));
+            System.out.println(String.format("PAIRS_SUMMIN %d %d",        ii, pairsEnergySumMin[ii]));
+            System.out.println(String.format("PAIRS_SUMMAX %d %d",        ii, pairsEnergySumMax[ii]));
+            System.out.println(String.format("PAIRS_ENERGYDIFF %d %d",    ii, pairsEnergyDiffMax[ii]));
+            System.out.println(String.format("PAIRS_COPMAX %d %d",        ii, pairsCoplanarityMax[ii]));
+            System.out.println(String.format("PAIRS_TDIFFMAAX %d %d",     ii, pairsTimeDiffMax[ii]));
+            System.out.println(String.format("PAIRS_EDISTMIN %d %d",      ii, pairsEnergyDistMin[ii]));
+            System.out.println(String.format("PAIRS_EDISTSLOP %d %f",     ii, pairsEnergyDistSlope[ii]));
+        }
+        
+        System.out.println("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%");
+    }
     
     /*
      * Parsing wrappers to make rest of code easier.
      */
-    public float getFloatConfigSSP(int itrig,String stub,int ival) {
-        return Float.valueOf(getConfigSSP(itrig,stub,ival));
-    }
-    public int getIntConfigSSP(int itrig,String stub,int ival) {
-        return Integer.valueOf(getConfigSSP(itrig,stub,ival));
-    }
-    public boolean getBoolConfigSSP(int itrig,String stub,int ival) {
-        return "1".equals(getConfigSSP(itrig,stub,ival));
-    }
-    public String getConfigSSP(int itrig,String stub,int ival) {
-    	String key="SSP_HPS_"+stub+"_"+itrig;
-    	return getConfig(key,ival);
-    }
+    public float getFloatConfigSSP(int itrig, String stub, int ival) {
+        return Float.valueOf(getConfigSSP(itrig, stub, ival));
+    }
+    
+    public int getIntConfigSSP(int itrig, String stub, int ival) {
+        return Integer.valueOf(getConfigSSP(itrig, stub, ival));
+    }
+    
+    public boolean getBoolConfigSSP(int itrig, String stub, int ival) {
+        return "1".equals(getConfigSSP(itrig, stub, ival));
+    }
+    
+    public String getConfigSSP(int itrig, String stub, int ival) {
+        String key = "SSP_HPS_" + stub + "_" + itrig;
+        return getConfig(key,ival);
+    }
+    
     public String getConfig(String key, int ival) {
         if (configMap.containsKey(key)) {
-        	List<String> vals=configMap.get(key);
-        	if (ival<vals.size()) {
-            	return configMap.get(key).get(ival);
-        	} else {
-        	    Logger.getLogger(this.getClass().getName()).log(Level.SEVERE,
-        	            "ConfigMap TOO SHORT:   "+ival+" "+configMap.get(key));
-        		return "0";
-        	}
+            List<String> vals = configMap.get(key);
+            if (ival < vals.size()) {
+                return configMap.get(key).get(ival);
+            } else {
+                Logger.getLogger(this.getClass().getName()).log(Level.SEVERE,
+                        "ConfigMap TOO SHORT:   " + ival + " " + configMap.get(key));
+                return "0";
+            }
         } else {
             // this is only necessarily an error if we've read 3 banks:
-            if (nBanks>2) {
-            	Logger.getLogger(this.getClass().getName()).log(Level.SEVERE,
-        	         "ConfigMap MISSING KEY:   "+key);
-            }
-        	return "0";
-        }
-    }
-
-    
-    public EcalChannel findChannel(int crate,int fadcSlot,int fadcChan)
-    {
+            if(nBanks > 2) {
+                Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, "ConfigMap MISSING KEY:   " + key);
+            }
+            return "0";
+        }
+    }
+    
+    public EcalChannel findChannel(int crate, int fadcSlot, int fadcChan) {
         for (EcalChannel cc : channels) {
             // EcalChannel follows different convention on crate numbering:
-            if ((cc.getCrate()-1)*2 == crate-37 && 
-                cc.getSlot() == fadcSlot && cc.getChannel() == fadcChan)
-            {
+            if ((cc.getCrate() - 1) * 2 == crate - 37 && cc.getSlot() == fadcSlot && cc.getChannel() == fadcChan) {
                 return cc;
             }
         }
         return null;
     }
+    
     public EcalChannel findChannel(int channel_id) {
         return ecalConditions.getChannelCollection().findChannel(channel_id);
     }
-} 
+}

Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/FADCConfig.java
 =============================================================================
--- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/FADCConfig.java	(original)
+++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/FADCConfig.java	Tue Mar 17 14:45:46 2015
@@ -27,253 +27,253 @@
  * @author Kyle McCarty <[log in to unmask]>
  */
 public class FADCConfig extends IDAQConfig {
-	// Store basic FADC information.
-	private int mode        = -1;
-	private int nsa         = -1;
-	private int nsb         = -1;
-	private int windowWidth = -1;
-	private int offset      = -1;
-	private int maxPulses       = -1;
-	
-	// Store a map of calorimeter channel number to crystal indices.
-	private Map<Point, Integer> indexChannelMap = new HashMap<Point, Integer>();
-	
-	// Store crystal calibrations and energy conversion factors.
-	private float[] gains = new float[443];
-	private float[] pedestals = new float[443];
-	private int[] thresholds = new int[443];
-	
-	@Override
-	void loadConfig(EvioDAQParser parser) {
-		// Store the basic FADC information.
-		mode = parser.fadcMODE;
-		nsa = parser.fadcNSA;
-		nsb = parser.fadcNSB;
-		windowWidth = parser.fadcWIDTH;
-		offset = parser.fadcOFFSET;
-		maxPulses = parser.fadcNPEAK;
-		
-		// Get the channel collection from the database.
-		DatabaseConditionsManager database = DatabaseConditionsManager.getInstance();
-		EcalChannelCollection channels = database.getCachedConditions(EcalChannelCollection.class, "ecal_channels").getCachedData();
-		
-		// Create a mapping of calorimeter crystal positions to their
-		// corresponding channels. Also place the mapped values into
-		// an array by their channel ID.
-		indexChannelMap.clear();
-		for(EcalChannel ecalChannel : channels) {
-			// Map the channel IDs to the crystal position.
-			int channel = ecalChannel.getChannelId();
-			int ix = ecalChannel.getX();
-			int iy = ecalChannel.getY();
-			indexChannelMap.put(new Point(ix, iy), new Integer(channel));
-			
-			// Place the mapped values into the arrays.
-			gains[ecalChannel.getChannelId()]      = parser.GAIN.get(ecalChannel);
-			pedestals[ecalChannel.getChannelId()]  = parser.PEDESTAL.get(ecalChannel);
-			thresholds[ecalChannel.getChannelId()] = parser.THRESHOLD.get(ecalChannel);
-		}
-	}
-	
-	/**
-	 * Gets the gain for a crystal.
-	 * @param channel - The channel object corresponding to the crystal.
-	 * @return Returns the gain as a <code>float</code> in units of MeV
-	 * per ADC.
-	 */
-	public float getGain(EcalChannel channel) {
-		return getGain(channel.getChannelId());
-	}
-	
-	/**
-	 * Gets the gain for a crystal.
-	 * @param channelID - The channel ID corresponding to the crystal.
-	 * @return Returns the gain as a <code>float</code> in units of MeV
-	 * per ADC.
-	 */
-	public float getGain(int channelID) {
-		validateChannelID(channelID);
-		return gains[channelID];
-	}
-	
-	/**
-	 * Gets the gain for a crystal.
-	 * @param ix - The x-index of the crystal.
-	 * @param iy - The y-index of the crystal.
-	 * @return Returns the gain as a <code>float</code> in units of MeV
-	 * per ADC.
-	 */
-	public float getGain(int ix, int iy) {
-		return getGain(new Point(ix, iy));
-	}
-	
-	/**
-	 * Gets the gain for a crystal.
-	 * @param ixy - The a point representing the x/y-indices of the
-	 * crystal.
-	 * @return Returns the gain as a <code>float</code> in units of MeV
-	 * per ADC.
-	 */
-	public float getGain(Point ixy) {
-		return getGain(indexChannelMap.get(ixy));
-	}
-	
-	/**
-	 * Gets the maximum number of pulses that the FADC will look for
-	 * in a channel's window.
-	 * @return Returns the maximum number of pulses.
-	 */
-	public int getMaxPulses() {
-		return maxPulses;
-	}
-	
-	/**
-	 * Gets the mode in which FADC data is written.
-	 * @return Returns the mode as an <code>int</code>; either 1, 3,
-	 * or 7.
-	 */
-	public int getMode() {
-		return mode;
-	}
-	
-	/**
-	 * Gets the number of samples (4 ns clock-cycles) that a pulse will
-	 * be integrated by the FADC after a threshold-crossing event.
-	 * @return Returns the samples as an <code>int</code> in clock-cycles.
-	 */
-	public int getNSA() {
-		return nsa;
-	}
-	
-	/**
-	 * Gets the number of samples (4 ns clock-cycles) that a pulse will
-	 * be integrated by the FADC before a threshold-crossing event.
-	 * @return Returns the samples as an <code>int</code> in clock-cycles.
-	 */
-	public int getNSB() {
-		return nsb;
-	}
-	
-	/**
-	 * Gets the pedestal for a crystal.
-	 * @param channel - The channel object corresponding to the crystal.
-	 * @return Returns the pedestal as a <code>float</code> in units
-	 * of ADC.
-	 */
-	public float getPedestal(EcalChannel channel) {
-		return getPedestal(channel.getChannelId());
-	}
-	
-	/**
-	 * Gets the pedestal for a crystal.
-	 * @param channelID - The channel ID corresponding to the crystal.
-	 * @return Returns the pedestal as a <code>float</code> in units
-	 * of ADC.
-	 */
-	public float getPedestal(int channelID) {
-		validateChannelID(channelID);
-		return pedestals[channelID];
-	}
-	
-	/**
-	 * Gets the pedestal for a crystal.
-	 * @param ix - The x-index of the crystal.
-	 * @param iy - The y-index of the crystal.
-	 * @return Returns the pedestal as a <code>float</code> in units
-	 * of ADC.
-	 */
-	public float getPedestal(int ix, int iy) {
-		return getPedestal(new Point(ix, iy));
-	}
-	
-	/**
-	 * Gets the pedestal for a crystal.
-	 * @param ixy - The a point representing the x/y-indices of the
-	 * crystal.
-	 * @return Returns the pedestal as a <code>float</code> in units
-	 * of ADC.
-	 */
-	public float getPedestal(Point ixy) {
-		return getPedestal(indexChannelMap.get(ixy));
-	}
-	
-	/**
-	 * Gets the threshold for a crystal.
-	 * @param channel - The channel object corresponding to the crystal.
-	 * @return Returns the threshold as a <code>int</code> in units
-	 * of ADC.
-	 */
-	public int getThreshold(EcalChannel channel) {
-		return getThreshold(channel.getChannelId());
-	}
-	
-	/**
-	 * Gets the threshold for a crystal.
-	 * @param channelID - The channel ID corresponding to the crystal.
-	 * @return Returns the threshold as a <code>int</code> in units
-	 * of ADC.
-	 */
-	public int getThreshold(int channelID) {
-		validateChannelID(channelID);
-		return thresholds[channelID];
-	}
-	
-	/**
-	 * Gets the threshold for a crystal.
-	 * @param ix - The x-index of the crystal.
-	 * @param iy - The y-index of the crystal.
-	 * @return Returns the threshold as a <code>int</code> in units
-	 * of ADC.
-	 */
-	public int getThreshold(int ix, int iy) {
-		return getThreshold(new Point(ix, iy));
-	}
-	
-	/**
-	 * Gets the threshold for a crystal.
-	 * @param ixy - The a point representing the x/y-indices of the
-	 * crystal.
-	 * @return Returns the threshold as a <code>int</code> in units
-	 * of ADC.
-	 */
-	public int getThreshold(Point ixy) {
-		return getThreshold(indexChannelMap.get(ixy));
-	}
-	
-	/**
-	 * Gets the length of the readout window for the FADC in nanoseconds.
-	 * @return Returns the window length.
-	 */
-	public int getWindowWidth() {
-		return windowWidth;
-	}
-	
-	/**
-	 * Gets the time in nanoseconds that the readout window is offset.
-	 * @return Returns the offset time in nanoseconds.
-	 */
-	public int getWindowOffset() {
-		return offset;
-	}
-	
-	@Override
-	public void printConfig() {
-		System.out.println("FADC Configuration:");
-		System.out.printf("\tMode          :: %d%n", mode);
-		System.out.printf("\tNSA           :: %d%n", nsa);
-		System.out.printf("\tNSB           :: %d%n", nsb);
-		System.out.printf("\tWindow Width  :: %d%n", windowWidth);
-		System.out.printf("\tWindow Offset :: %d%n", offset);
-	}
-	
-	/**
-	 * Throws an exception if the argument channel ID is not within
-	 * the allowed range.
-	 * @param channelID - The channel ID to validate.
-	 */
-	private static final void validateChannelID(int channelID) {
-		if(channelID < 1 || channelID > 442) {
-			throw new IndexOutOfBoundsException(String.format("Channel ID \"%d\" is invalid. Channel IDs must be between 1 and 442.", channelID));
-		}
-	}
+    // Store basic FADC information.
+    private int mode        = -1;
+    private int nsa         = -1;
+    private int nsb         = -1;
+    private int windowWidth = -1;
+    private int offset      = -1;
+    private int maxPulses   = -1;
+    
+    // Store a map of calorimeter channel number to crystal indices.
+    private Map<Point, Integer> indexChannelMap = new HashMap<Point, Integer>();
+    
+    // Store crystal calibrations and energy conversion factors.
+    private float[] gains = new float[443];
+    private float[] pedestals = new float[443];
+    private int[] thresholds = new int[443];
+    
+    @Override
+    void loadConfig(EvioDAQParser parser) {
+        // Store the basic FADC information.
+        mode = parser.fadcMODE;
+        nsa = parser.fadcNSA;
+        nsb = parser.fadcNSB;
+        windowWidth = parser.fadcWIDTH;
+        offset = parser.fadcOFFSET;
+        maxPulses = parser.fadcNPEAK;
+        
+        // Get the channel collection from the database.
+        DatabaseConditionsManager database = DatabaseConditionsManager.getInstance();
+        EcalChannelCollection channels = database.getCachedConditions(EcalChannelCollection.class, "ecal_channels").getCachedData();
+        
+        // Create a mapping of calorimeter crystal positions to their
+        // corresponding channels. Also place the mapped values into
+        // an array by their channel ID.
+        indexChannelMap.clear();
+        for(EcalChannel ecalChannel : channels) {
+            // Map the channel IDs to the crystal position.
+            int channel = ecalChannel.getChannelId();
+            int ix = ecalChannel.getX();
+            int iy = ecalChannel.getY();
+            indexChannelMap.put(new Point(ix, iy), new Integer(channel));
+            
+            // Place the mapped values into the arrays.
+            gains[ecalChannel.getChannelId()]      = parser.GAIN.get(ecalChannel);
+            pedestals[ecalChannel.getChannelId()]  = parser.PEDESTAL.get(ecalChannel);
+            thresholds[ecalChannel.getChannelId()] = parser.THRESHOLD.get(ecalChannel);
+        }
+    }
+    
+    /**
+     * Gets the gain for a crystal.
+     * @param channel - The channel object corresponding to the crystal.
+     * @return Returns the gain as a <code>float</code> in units of MeV
+     * per ADC.
+     */
+    public float getGain(EcalChannel channel) {
+        return getGain(channel.getChannelId());
+    }
+    
+    /**
+     * Gets the gain for a crystal.
+     * @param channelID - The channel ID corresponding to the crystal.
+     * @return Returns the gain as a <code>float</code> in units of MeV
+     * per ADC.
+     */
+    public float getGain(int channelID) {
+        validateChannelID(channelID);
+        return gains[channelID];
+    }
+    
+    /**
+     * Gets the gain for a crystal.
+     * @param ix - The x-index of the crystal.
+     * @param iy - The y-index of the crystal.
+     * @return Returns the gain as a <code>float</code> in units of MeV
+     * per ADC.
+     */
+    public float getGain(int ix, int iy) {
+        return getGain(new Point(ix, iy));
+    }
+    
+    /**
+     * Gets the gain for a crystal.
+     * @param ixy - The a point representing the x/y-indices of the
+     * crystal.
+     * @return Returns the gain as a <code>float</code> in units of MeV
+     * per ADC.
+     */
+    public float getGain(Point ixy) {
+        return getGain(indexChannelMap.get(ixy));
+    }
+    
+    /**
+     * Gets the maximum number of pulses that the FADC will look for
+     * in a channel's window.
+     * @return Returns the maximum number of pulses.
+     */
+    public int getMaxPulses() {
+        return maxPulses;
+    }
+    
+    /**
+     * Gets the mode in which FADC data is written.
+     * @return Returns the mode as an <code>int</code>; either 1, 3,
+     * or 7.
+     */
+    public int getMode() {
+        return mode;
+    }
+    
+    /**
+     * Gets the number of samples (4 ns clock-cycles) that a pulse will
+     * be integrated by the FADC after a threshold-crossing event.
+     * @return Returns the samples as an <code>int</code> in clock-cycles.
+     */
+    public int getNSA() {
+        return nsa;
+    }
+    
+    /**
+     * Gets the number of samples (4 ns clock-cycles) that a pulse will
+     * be integrated by the FADC before a threshold-crossing event.
+     * @return Returns the samples as an <code>int</code> in clock-cycles.
+     */
+    public int getNSB() {
+        return nsb;
+    }
+    
+    /**
+     * Gets the pedestal for a crystal.
+     * @param channel - The channel object corresponding to the crystal.
+     * @return Returns the pedestal as a <code>float</code> in units
+     * of ADC.
+     */
+    public float getPedestal(EcalChannel channel) {
+        return getPedestal(channel.getChannelId());
+    }
+    
+    /**
+     * Gets the pedestal for a crystal.
+     * @param channelID - The channel ID corresponding to the crystal.
+     * @return Returns the pedestal as a <code>float</code> in units
+     * of ADC.
+     */
+    public float getPedestal(int channelID) {
+        validateChannelID(channelID);
+        return pedestals[channelID];
+    }
+    
+    /**
+     * Gets the pedestal for a crystal.
+     * @param ix - The x-index of the crystal.
+     * @param iy - The y-index of the crystal.
+     * @return Returns the pedestal as a <code>float</code> in units
+     * of ADC.
+     */
+    public float getPedestal(int ix, int iy) {
+        return getPedestal(new Point(ix, iy));
+    }
+    
+    /**
+     * Gets the pedestal for a crystal.
+     * @param ixy - The a point representing the x/y-indices of the
+     * crystal.
+     * @return Returns the pedestal as a <code>float</code> in units
+     * of ADC.
+     */
+    public float getPedestal(Point ixy) {
+        return getPedestal(indexChannelMap.get(ixy));
+    }
+    
+    /**
+     * Gets the threshold for a crystal.
+     * @param channel - The channel object corresponding to the crystal.
+     * @return Returns the threshold as a <code>int</code> in units
+     * of ADC.
+     */
+    public int getThreshold(EcalChannel channel) {
+        return getThreshold(channel.getChannelId());
+    }
+    
+    /**
+     * Gets the threshold for a crystal.
+     * @param channelID - The channel ID corresponding to the crystal.
+     * @return Returns the threshold as a <code>int</code> in units
+     * of ADC.
+     */
+    public int getThreshold(int channelID) {
+        validateChannelID(channelID);
+        return thresholds[channelID];
+    }
+    
+    /**
+     * Gets the threshold for a crystal.
+     * @param ix - The x-index of the crystal.
+     * @param iy - The y-index of the crystal.
+     * @return Returns the threshold as a <code>int</code> in units
+     * of ADC.
+     */
+    public int getThreshold(int ix, int iy) {
+        return getThreshold(new Point(ix, iy));
+    }
+    
+    /**
+     * Gets the threshold for a crystal.
+     * @param ixy - The a point representing the x/y-indices of the
+     * crystal.
+     * @return Returns the threshold as a <code>int</code> in units
+     * of ADC.
+     */
+    public int getThreshold(Point ixy) {
+        return getThreshold(indexChannelMap.get(ixy));
+    }
+    
+    /**
+     * Gets the length of the readout window for the FADC in nanoseconds.
+     * @return Returns the window length.
+     */
+    public int getWindowWidth() {
+        return windowWidth;
+    }
+    
+    /**
+     * Gets the time in nanoseconds that the readout window is offset.
+     * @return Returns the offset time in nanoseconds.
+     */
+    public int getWindowOffset() {
+        return offset;
+    }
+    
+    @Override
+    public void printConfig() {
+        System.out.println("FADC Configuration:");
+        System.out.printf("\tMode          :: %d%n", mode);
+        System.out.printf("\tNSA           :: %d%n", nsa);
+        System.out.printf("\tNSB           :: %d%n", nsb);
+        System.out.printf("\tWindow Width  :: %d%n", windowWidth);
+        System.out.printf("\tWindow Offset :: %d%n", offset);
+    }
+    
+    /**
+     * Throws an exception if the argument channel ID is not within
+     * the allowed range.
+     * @param channelID - The channel ID to validate.
+     */
+    private static final void validateChannelID(int channelID) {
+        if(channelID < 1 || channelID > 442) {
+            throw new IndexOutOfBoundsException(String.format("Channel ID \"%d\" is invalid. Channel IDs must be between 1 and 442.", channelID));
+        }
+    }
 }

Added: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/GTPConfig.java
 =============================================================================
--- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/GTPConfig.java	(added)
+++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/GTPConfig.java	Tue Mar 17 14:45:46 2015
@@ -0,0 +1,70 @@
+package org.hps.recon.ecal.daqconfig;
+
+/**
+ * Class <code>GTPConfig</code> stores GTP configuration settings
+ * parsed from the an EVIO file. This class manages the following
+ * properties:
+ * <ul>
+ * <li>Cluster verification window size (after seed)</li>
+ * <li>Cluster verification window size (before seed)</li>
+ * <li>Seed energy cut bounds</li>
+ * </ul>
+ * 
+ * @author Kyle McCarty <[log in to unmask]>
+ */
+public class GTPConfig extends IDAQConfig {
+    // Store clustering configuration parameters.
+    private int windowBefore = -1;
+    private int windowAfter = -1;
+    private LBOCutConfig seedCut = new LBOCutConfig();
+    
+    /**
+     * Gets the configuration for the seed energy cut.
+     * @return Returns the seed energy cut configuration.
+     */
+    public LBOCutConfig getSeedEnergyCutConfig() {
+        return seedCut;
+    }
+    
+    /**
+     * Gets the size of the temporal cluster verification window for
+     * after a potential seed hit used for checking that a cluster is
+     * a spatiotemporal local maximum. Value is in clock-cycles (4 ns
+     * intervals).
+     * @return Returns the size window after the seed.
+     */
+    public int getTimeWindowAfter() {
+        return windowAfter;
+    }
+    
+    /**
+     * Gets the size of the temporal cluster verification window for
+     * before a potential seed hit used for checking that a cluster
+     * is  a spatiotemporal local maximum. Value is in clock-cycles
+     * (4 ns intervals).
+     * @return Returns the size window before the seed.
+     */
+    public int getTimeWindowBefore() {
+        return windowBefore;
+    }
+    
+    @Override
+    void loadConfig(EvioDAQParser parser) {
+        // Load the clustering settings.
+        windowBefore = parser.gtpWindowBefore;
+        windowAfter = parser.gtpWindowAfter;
+        seedCut.setLowerBound(parser.gtpMinSeedEnergy / 1000.0);
+    }
+    
+    @Override
+    public void printConfig() {
+        // Print the configuration header.
+        System.out.println("GTP Configuration:");
+        
+        // Print the GTP settings.
+        System.out.printf("\tTime Window Before :: %d clock-cycles%n", windowBefore);
+        System.out.printf("\tTime Window After  :: %d clock-cycles%n", windowAfter);
+        System.out.printf("\tSeed Energy Min    :: %5.3f GeV%n",       seedCut.getLowerBound());
+    }
+
+}

Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/IDAQConfig.java
 =============================================================================
--- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/IDAQConfig.java	(original)
+++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/IDAQConfig.java	Tue Mar 17 14:45:46 2015
@@ -10,15 +10,15 @@
  * @author Kyle McCarty
  */
 abstract class IDAQConfig {
-	/**
-	 * Updates the stored settings based on the argument parser.
-	 * @param parser - The EVIO DAQ bank parser.
-	 */
-	abstract void loadConfig(EvioDAQParser parser);
-	
-	/**
-	 * Prints a textual representation of the configuration bank to the
-	 * terminal.
-	 */
-	public abstract void printConfig();
-}
+    /**
+     * Updates the stored settings based on the argument parser.
+     * @param parser - The EVIO DAQ bank parser.
+     */
+    abstract void loadConfig(EvioDAQParser parser);
+    
+    /**
+     * Prints a textual representation of the configuration bank to the
+     * terminal.
+     */
+    public abstract void printConfig();
+}

Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/LBOCutConfig.java
 =============================================================================
--- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/LBOCutConfig.java	(original)
+++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/LBOCutConfig.java	Tue Mar 17 14:45:46 2015
@@ -9,26 +9,26 @@
  * @author Kyle McCarty <[log in to unmask]>
  */
 public class LBOCutConfig extends AbstractConfig<Double> {
-	private static final int LOWER_BOUND = 0;
-	
-	/**
-	 * Instantiates a new <code>LBOCutConfig</code> object.
-	 */
-	LBOCutConfig() { super(1); }
-	
-	/**
-	 * Gets the lower bound of the cut.
-	 * @return Returns the lower bound as a <code>double</code>.
-	 */
-	public double getLowerBound() {
-		return getValue(LOWER_BOUND);
-	}
-	
-	/**
-	 * Sets the lower bound of the cut to the specified value.
-	 * @param value - The new lower bound for the cut.
-	 */
-	void setLowerBound(double value) {
-		setValue(LOWER_BOUND, value);
-	}
-}
+    private static final int LOWER_BOUND = 0;
+    
+    /**
+     * Instantiates a new <code>LBOCutConfig</code> object.
+     */
+    LBOCutConfig() { super(1); }
+    
+    /**
+     * Gets the lower bound of the cut.
+     * @return Returns the lower bound as a <code>double</code>.
+     */
+    public double getLowerBound() {
+        return getValue(LOWER_BOUND);
+    }
+    
+    /**
+     * Sets the lower bound of the cut to the specified value.
+     * @param value - The new lower bound for the cut.
+     */
+    void setLowerBound(double value) {
+        setValue(LOWER_BOUND, value);
+    }
+}

Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/PairTriggerConfig.java
 =============================================================================
--- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/PairTriggerConfig.java	(original)
+++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/PairTriggerConfig.java	Tue Mar 17 14:45:46 2015
@@ -7,103 +7,102 @@
  * @author Kyle McCarty <[log in to unmask]>
  */
 public class PairTriggerConfig extends AbstractConfig<AbstractConfig<Double>> {
-	private static final int CUT_ENERGY_MIN   = 0;
-	private static final int CUT_ENERGY_MAX   = 1;
-	private static final int CUT_HIT_COUNT    = 2;
-	private static final int CUT_ENERGY_SUM   = 3;
-	private static final int CUT_ENERGY_DIFF  = 4;
-	private static final int CUT_ENERGY_SLOPE = 5;
-	private static final int CUT_COPLANARITY  = 6;
-	private static final int CUT_TIME_DIFF    = 7;
-	
-	/**
-	 * Creates a new <code>PairTriggerConfig</code> object.
-	 */
-	PairTriggerConfig() {
-		// Instantiate the superclass.
-		super(8);
-		
-		// Define the pair cuts.
-		setValue(CUT_ENERGY_MIN,   new LBOCutConfig());
-		setValue(CUT_ENERGY_MAX,   new UBOCutConfig());
-		setValue(CUT_HIT_COUNT,    new LBOCutConfig());
-		setValue(CUT_ENERGY_SUM,   new ULBCutConfig());
-		setValue(CUT_ENERGY_DIFF,  new UBOCutConfig());
-		setValue(CUT_ENERGY_SLOPE, new ESBCutConfig());
-		setValue(CUT_COPLANARITY,  new UBOCutConfig());
-		setValue(CUT_TIME_DIFF,    new UBOCutConfig());
-	}
-	
-	/**
-	 * Gets the configuration object for the cluster energy lower bound
-	 * cut. Note that cuts are in units of GeV.
-	 * @return Returns the configuration object for the cut.
-	 */
-	public LBOCutConfig getEnergyMinCutConfig() {
-		return (LBOCutConfig) getValue(CUT_ENERGY_MIN);
-	}
-	
-	/**
-	 * Gets the configuration object for the cluster energy upper bound
-	 * cut. Note that cuts are in units of GeV.
-	 * @return Returns the configuration object for the cut.
-	 */
-	public UBOCutConfig getEnergyMaxCutConfig() {
-		return (UBOCutConfig) getValue(CUT_ENERGY_MAX);
-	}
-	
-	/**
-	 * Gets the configuration object for the cluster hit count cut.
-	 * Note that cuts are in units of calorimeter hits.
-	 * @return Returns the configuration object for the cut.
-	 */
-	public LBOCutConfig getHitCountCutConfig() {
-		return (LBOCutConfig) getValue(CUT_HIT_COUNT);
-	}
-	
-	/**
-	 * Gets the configuration object for the pair energy sum cut. Note
-	 * that cuts are in units of GeV.
-	 * @return Returns the configuration object for the cut.
-	 */
-	public ULBCutConfig getEnergySumCutConfig() {
-		return (ULBCutConfig) getValue(CUT_ENERGY_SUM);
-	}
-	
-	/**
-	 * Gets the configuration object for the pair energy difference
-	 * cut. Note that cuts are in units of GeV.
-	 * @return Returns the configuration object for the cut.
-	 */
-	public UBOCutConfig getEnergyDifferenceCutConfig() {
-		return (UBOCutConfig) getValue(CUT_ENERGY_DIFF);
-	}
-	
-	/**
-	 * Gets the configuration object for the pair energy slope cut.
-	 * Note that cuts are in units of GeV and mm.
-	 * @return Returns the configuration object for the cut.
-	 */
-	public ESBCutConfig getEnergySlopeCutConfig() {
-		return (ESBCutConfig) getValue(CUT_ENERGY_SLOPE);
-	}
-	
-	/**
-	 * Gets the configuration object for the pair coplanarity cut.
-	 * Note that cuts are in units of degrees.
-	 * @return Returns the configuration object for the cut.
-	 */
-	public UBOCutConfig getCoplanarityCutConfig() {
-		return (UBOCutConfig) getValue(CUT_COPLANARITY);
-	}
-	
-	/**
-	 * Gets the configuration object for the pair time coincidence cut.
-	 * Note that cuts are in units of nanoseconds.
-	 * @return Returns the configuration object for the cut.
-	 */
-	public UBOCutConfig getTimeDifferenceCutConfig() {
-		return (UBOCutConfig) getValue(CUT_TIME_DIFF);
-	}
-	
+    private static final int CUT_ENERGY_MIN   = 0;
+    private static final int CUT_ENERGY_MAX   = 1;
+    private static final int CUT_HIT_COUNT    = 2;
+    private static final int CUT_ENERGY_SUM   = 3;
+    private static final int CUT_ENERGY_DIFF  = 4;
+    private static final int CUT_ENERGY_SLOPE = 5;
+    private static final int CUT_COPLANARITY  = 6;
+    private static final int CUT_TIME_DIFF    = 7;
+    
+    /**
+     * Creates a new <code>PairTriggerConfig</code> object.
+     */
+    PairTriggerConfig() {
+        // Instantiate the superclass.
+        super(8);
+        
+        // Define the pair cuts.
+        setValue(CUT_ENERGY_MIN,   new LBOCutConfig());
+        setValue(CUT_ENERGY_MAX,   new UBOCutConfig());
+        setValue(CUT_HIT_COUNT,    new LBOCutConfig());
+        setValue(CUT_ENERGY_SUM,   new ULBCutConfig());
+        setValue(CUT_ENERGY_DIFF,  new UBOCutConfig());
+        setValue(CUT_ENERGY_SLOPE, new ESBCutConfig());
+        setValue(CUT_COPLANARITY,  new UBOCutConfig());
+        setValue(CUT_TIME_DIFF,    new UBOCutConfig());
+    }
+    
+    /**
+     * Gets the configuration object for the cluster energy lower bound
+     * cut. Note that cuts are in units of GeV.
+     * @return Returns the configuration object for the cut.
+     */
+    public LBOCutConfig getEnergyMinCutConfig() {
+        return (LBOCutConfig) getValue(CUT_ENERGY_MIN);
+    }
+    
+    /**
+     * Gets the configuration object for the cluster energy upper bound
+     * cut. Note that cuts are in units of GeV.
+     * @return Returns the configuration object for the cut.
+     */
+    public UBOCutConfig getEnergyMaxCutConfig() {
+        return (UBOCutConfig) getValue(CUT_ENERGY_MAX);
+    }
+    
+    /**
+     * Gets the configuration object for the cluster hit count cut.
+     * Note that cuts are in units of calorimeter hits.
+     * @return Returns the configuration object for the cut.
+     */
+    public LBOCutConfig getHitCountCutConfig() {
+        return (LBOCutConfig) getValue(CUT_HIT_COUNT);
+    }
+    
+    /**
+     * Gets the configuration object for the pair energy sum cut. Note
+     * that cuts are in units of GeV.
+     * @return Returns the configuration object for the cut.
+     */
+    public ULBCutConfig getEnergySumCutConfig() {
+        return (ULBCutConfig) getValue(CUT_ENERGY_SUM);
+    }
+    
+    /**
+     * Gets the configuration object for the pair energy difference
+     * cut. Note that cuts are in units of GeV.
+     * @return Returns the configuration object for the cut.
+     */
+    public UBOCutConfig getEnergyDifferenceCutConfig() {
+        return (UBOCutConfig) getValue(CUT_ENERGY_DIFF);
+    }
+    
+    /**
+     * Gets the configuration object for the pair energy slope cut.
+     * Note that cuts are in units of GeV and mm.
+     * @return Returns the configuration object for the cut.
+     */
+    public ESBCutConfig getEnergySlopeCutConfig() {
+        return (ESBCutConfig) getValue(CUT_ENERGY_SLOPE);
+    }
+    
+    /**
+     * Gets the configuration object for the pair coplanarity cut.
+     * Note that cuts are in units of degrees.
+     * @return Returns the configuration object for the cut.
+     */
+    public UBOCutConfig getCoplanarityCutConfig() {
+        return (UBOCutConfig) getValue(CUT_COPLANARITY);
+    }
+    
+    /**
+     * Gets the configuration object for the pair time coincidence cut.
+     * Note that cuts are in units of nanoseconds.
+     * @return Returns the configuration object for the cut.
+     */
+    public UBOCutConfig getTimeDifferenceCutConfig() {
+        return (UBOCutConfig) getValue(CUT_TIME_DIFF);
+    }
 }

Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/SSPConfig.java
 =============================================================================
--- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/SSPConfig.java	(original)
+++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/SSPConfig.java	Tue Mar 17 14:45:46 2015
@@ -15,148 +15,147 @@
  * @author Kyle McCarty <[log in to unmask]>
  */
 public class SSPConfig extends IDAQConfig {
-	// Store trigger configuration parameters.
-	private PairTriggerConfig[] pairTrigger = { new PairTriggerConfig(), new PairTriggerConfig() };
-	private SinglesTriggerConfig[] singlesTrigger = { new SinglesTriggerConfig(), new SinglesTriggerConfig() };
-	
-	@Override
-	void loadConfig(EvioDAQParser parser) {
-		// Set the trigger parameters.
-		for(int triggerNum = 0; triggerNum < 2; triggerNum++) {
-			// Set whether the triggers are enabled or not.
-			singlesTrigger[triggerNum].setIsEnabled(parser.singlesEn[triggerNum]);
-			pairTrigger[triggerNum].setIsEnabled(parser.pairsEn[triggerNum]);
-			
-			// Set the cut enabled statuses for the singles trigger.
-			singlesTrigger[triggerNum].getEnergyMinCutConfig().setIsEnabled(parser.singlesEnergyMinEn[triggerNum]);
-			singlesTrigger[triggerNum].getEnergyMaxCutConfig().setIsEnabled(parser.singlesEnergyMaxEn[triggerNum]);
-			singlesTrigger[triggerNum].getHitCountCutConfig().setIsEnabled(parser.singlesNhitsEn[triggerNum]);
-			
-			// The pair trigger singles cuts are always enabled.
-			pairTrigger[triggerNum].getEnergyMinCutConfig().setIsEnabled(true);
-			pairTrigger[triggerNum].getEnergyMaxCutConfig().setIsEnabled(true);
-			pairTrigger[triggerNum].getHitCountCutConfig().setIsEnabled(true);
-			
-			// The pair trigger time difference cut is always enabled.
-			pairTrigger[triggerNum].getTimeDifferenceCutConfig().setIsEnabled(true);
+    // Store trigger configuration parameters.
+    private PairTriggerConfig[] pairTrigger = { new PairTriggerConfig(), new PairTriggerConfig() };
+    private SinglesTriggerConfig[] singlesTrigger = { new SinglesTriggerConfig(), new SinglesTriggerConfig() };
+    
+    @Override
+    void loadConfig(EvioDAQParser parser) {
+        // Set the trigger parameters.
+        for(int triggerNum = 0; triggerNum < 2; triggerNum++) {
+            // Set whether the triggers are enabled or not.
+            singlesTrigger[triggerNum].setIsEnabled(parser.singlesEn[triggerNum]);
+            pairTrigger[triggerNum].setIsEnabled(parser.pairsEn[triggerNum]);
+            
+            // Set the cut enabled statuses for the singles trigger.
+            singlesTrigger[triggerNum].getEnergyMinCutConfig().setIsEnabled(parser.singlesEnergyMinEn[triggerNum]);
+            singlesTrigger[triggerNum].getEnergyMaxCutConfig().setIsEnabled(parser.singlesEnergyMaxEn[triggerNum]);
+            singlesTrigger[triggerNum].getHitCountCutConfig().setIsEnabled(parser.singlesNhitsEn[triggerNum]);
+            
+            // The pair trigger singles cuts are always enabled.
+            pairTrigger[triggerNum].getEnergyMinCutConfig().setIsEnabled(true);
+            pairTrigger[triggerNum].getEnergyMaxCutConfig().setIsEnabled(true);
+            pairTrigger[triggerNum].getHitCountCutConfig().setIsEnabled(true);
+            
+            // The pair trigger time difference cut is always enabled.
+            pairTrigger[triggerNum].getTimeDifferenceCutConfig().setIsEnabled(true);
 
-			// Set the pair cut enabled statuses for the pair trigger.
-			pairTrigger[triggerNum].getEnergySumCutConfig().setIsEnabled(parser.pairsEnergySumMaxMinEn[triggerNum]);
-			pairTrigger[triggerNum].getEnergyDifferenceCutConfig().setIsEnabled(parser.pairsEnergyDiffEn[triggerNum]);
-			pairTrigger[triggerNum].getEnergySlopeCutConfig().setIsEnabled(parser.pairsEnergyDistEn[triggerNum]);
-			pairTrigger[triggerNum].getCoplanarityCutConfig().setIsEnabled(parser.pairsCoplanarityEn[triggerNum]);
-			
-			// Set the individual cut values.
-			singlesTrigger[triggerNum].getEnergyMinCutConfig().setLowerBound(parser.singlesEnergyMin[triggerNum] / 1000.0);
-			singlesTrigger[triggerNum].getEnergyMaxCutConfig().setUpperBound(parser.singlesEnergyMax[triggerNum] / 1000.0);
-			singlesTrigger[triggerNum].getHitCountCutConfig().setLowerBound(parser.singlesNhits[triggerNum]);
-			
-			// Set the individual cut values.
-			pairTrigger[triggerNum].getEnergyMinCutConfig().setLowerBound(parser.pairsEnergyMin[triggerNum] / 1000.0);
-			pairTrigger[triggerNum].getEnergyMaxCutConfig().setUpperBound(parser.pairsEnergyMax[triggerNum] / 1000.0);
-			pairTrigger[triggerNum].getHitCountCutConfig().setLowerBound(parser.pairsNhitsMin[triggerNum]);
-			pairTrigger[triggerNum].getEnergySumCutConfig().setLowerBound(parser.pairsEnergySumMin[triggerNum] / 1000.0);
-			pairTrigger[triggerNum].getEnergySumCutConfig().setUpperBound(parser.pairsEnergySumMax[triggerNum] / 1000.0);
-			pairTrigger[triggerNum].getEnergyDifferenceCutConfig().setUpperBound(parser.pairsEnergyDiffMax[triggerNum] / 1000.0);
-			pairTrigger[triggerNum].getEnergySlopeCutConfig().setLowerBound(parser.pairsEnergyDistMin[triggerNum] / 1000.0);
-			pairTrigger[triggerNum].getEnergySlopeCutConfig().setParameterF(parser.pairsEnergyDistSlope[triggerNum] / 1000.0);
-			pairTrigger[triggerNum].getCoplanarityCutConfig().setUpperBound(parser.pairsCoplanarityMax[triggerNum]);
-			pairTrigger[triggerNum].getTimeDifferenceCutConfig().setUpperBound(parser.pairsTimeDiffMax[triggerNum]);
-		}
-	}
-	
-	/**
-	 * Gets the configuration parameters for the first singles trigger.
-	 * @return Returns the first singles trigger configuration.
-	 */
-	public SinglesTriggerConfig getSingles1Config() {
-		return singlesTrigger[0];
-	}
-	
-	/**
-	 * Gets the configuration parameters for the second singles trigger.
-	 * @return Returns the second singles trigger configuration.
-	 */
-	public SinglesTriggerConfig getSingles2Config() {
-		return singlesTrigger[1];
-	}
-	
-	/**
-	 * Gets the configuration parameters for the first pair trigger.
-	 * @return Returns the first pair trigger configuration.
-	 */
-	public PairTriggerConfig getPair1Config() {
-		return pairTrigger[0];
-	}
-	
-	/**
-	 * Gets the configuration parameters for the second pair trigger.
-	 * @return Returns the second trigger trigger configuration.
-	 */
-	public PairTriggerConfig getPair2Config() {
-		return pairTrigger[1];
-	}
-	
-	@Override
-	public void printConfig() {
-		// Print the configuration header.
-		System.out.println("SSP Configuration:");
-		
-		// Print the singles triggers.
-		for(int triggerNum = 0; triggerNum < 2; triggerNum++) {
-			System.out.printf("\tSingles Trigger %d%n", (triggerNum + 1));
-			System.out.println("\t\tCluster Energy Lower Bound Cut");
-			System.out.printf("\t\t\tEnabled :: %b%n", singlesTrigger[triggerNum].getEnergyMinCutConfig().isEnabled());
-			System.out.printf("\t\t\tValue   :: %5.3f GeV%n", singlesTrigger[triggerNum].getEnergyMinCutConfig().getLowerBound());
-			
-			System.out.println("\t\tCluster Energy Upper Bound Cut");
-			System.out.printf("\t\t\tEnabled :: %b%n", singlesTrigger[triggerNum].getEnergyMaxCutConfig().isEnabled());
-			System.out.printf("\t\t\tValue   :: %5.3f GeV%n", singlesTrigger[triggerNum].getEnergyMaxCutConfig().getUpperBound());
-			
-			System.out.println("\t\tCluster Hit Count Cut");
-			System.out.printf("\t\t\tEnabled :: %b%n", singlesTrigger[triggerNum].getHitCountCutConfig().isEnabled());
-			System.out.printf("\t\t\tValue   :: %1.0f hits%n", singlesTrigger[triggerNum].getHitCountCutConfig().getLowerBound());
-			System.out.println();
-		}
-		
-		// Print the pair triggers.
-		for(int triggerNum = 0; triggerNum < 2; triggerNum++) {
-			System.out.printf("\tPair Trigger %d%n", (triggerNum + 1));
-			System.out.println("\t\tCluster Energy Lower Bound Cut");
-			System.out.printf("\t\t\tEnabled :: %b%n", pairTrigger[triggerNum].getEnergyMinCutConfig().isEnabled());
-			System.out.printf("\t\t\tValue   :: %5.3f GeV%n", pairTrigger[triggerNum].getEnergyMinCutConfig().getLowerBound());
-			
-			System.out.println("\t\tCluster Energy Upper Bound Cut");
-			System.out.printf("\t\t\tEnabled :: %b%n", pairTrigger[triggerNum].getEnergyMaxCutConfig().isEnabled());
-			System.out.printf("\t\t\tValue   :: %5.3f GeV%n", pairTrigger[triggerNum].getEnergyMaxCutConfig().getUpperBound());
-			
-			System.out.println("\t\tCluster Hit Count Cut");
-			System.out.printf("\t\t\tEnabled :: %b%n", pairTrigger[triggerNum].getHitCountCutConfig().isEnabled());
-			System.out.printf("\t\t\tValue   :: %1.0f hits%n", pairTrigger[triggerNum].getHitCountCutConfig().getLowerBound());
-			
-			System.out.println("\t\tPair Energy Sum Cut");
-			System.out.printf("\t\t\tEnabled :: %b%n", pairTrigger[triggerNum].getEnergySumCutConfig().isEnabled());
-			System.out.printf("\t\t\tMin     :: %5.3f GeV%n", pairTrigger[triggerNum].getEnergySumCutConfig().getLowerBound());
-			System.out.printf("\t\t\tMax     :: %5.3f GeV%n", pairTrigger[triggerNum].getEnergySumCutConfig().getUpperBound());
-			
-			System.out.println("\t\tPair Energy Difference Cut");
-			System.out.printf("\t\t\tEnabled :: %b%n", pairTrigger[triggerNum].getEnergyDifferenceCutConfig().isEnabled());
-			System.out.printf("\t\t\tValue   :: %5.3f GeV%n", pairTrigger[triggerNum].getEnergyDifferenceCutConfig().getUpperBound());
-			
-			System.out.println("\t\tPair Energy Slope Cut");
-			System.out.printf("\t\t\tEnabled :: %b%n", pairTrigger[triggerNum].getEnergySlopeCutConfig().isEnabled());
-			System.out.printf("\t\t\tValue   :: %5.3f GeV%n", pairTrigger[triggerNum].getEnergySlopeCutConfig().getLowerBound());
-			System.out.printf("\t\t\tParam F :: %6.4f GeV/mm%n", pairTrigger[triggerNum].getEnergySlopeCutConfig().getParameterF());
-			
-			System.out.println("\t\tPair Coplanarity Cut");
-			System.out.printf("\t\t\tEnabled :: %b%n", pairTrigger[triggerNum].getCoplanarityCutConfig().isEnabled());
-			System.out.printf("\t\t\tValue   :: %3.0f degrees%n", pairTrigger[triggerNum].getCoplanarityCutConfig().getUpperBound());
-			
-			System.out.println("\t\tPair Time Coincidence Cut");
-			System.out.printf("\t\t\tEnabled :: %b%n", pairTrigger[triggerNum].getTimeDifferenceCutConfig().isEnabled());
-			System.out.printf("\t\t\tValue   :: %1.0f clock-cycles%n", pairTrigger[triggerNum].getTimeDifferenceCutConfig().getUpperBound());
-			System.out.println();
-		}
-	}
-	
-}
+            // Set the pair cut enabled statuses for the pair trigger.
+            pairTrigger[triggerNum].getEnergySumCutConfig().setIsEnabled(parser.pairsEnergySumMaxMinEn[triggerNum]);
+            pairTrigger[triggerNum].getEnergyDifferenceCutConfig().setIsEnabled(parser.pairsEnergyDiffEn[triggerNum]);
+            pairTrigger[triggerNum].getEnergySlopeCutConfig().setIsEnabled(parser.pairsEnergyDistEn[triggerNum]);
+            pairTrigger[triggerNum].getCoplanarityCutConfig().setIsEnabled(parser.pairsCoplanarityEn[triggerNum]);
+            
+            // Set the individual cut values.
+            singlesTrigger[triggerNum].getEnergyMinCutConfig().setLowerBound(parser.singlesEnergyMin[triggerNum] / 1000.0);
+            singlesTrigger[triggerNum].getEnergyMaxCutConfig().setUpperBound(parser.singlesEnergyMax[triggerNum] / 1000.0);
+            singlesTrigger[triggerNum].getHitCountCutConfig().setLowerBound(parser.singlesNhits[triggerNum]);
+            
+            // Set the individual cut values.
+            pairTrigger[triggerNum].getEnergyMinCutConfig().setLowerBound(parser.pairsEnergyMin[triggerNum] / 1000.0);
+            pairTrigger[triggerNum].getEnergyMaxCutConfig().setUpperBound(parser.pairsEnergyMax[triggerNum] / 1000.0);
+            pairTrigger[triggerNum].getHitCountCutConfig().setLowerBound(parser.pairsNhitsMin[triggerNum]);
+            pairTrigger[triggerNum].getEnergySumCutConfig().setLowerBound(parser.pairsEnergySumMin[triggerNum] / 1000.0);
+            pairTrigger[triggerNum].getEnergySumCutConfig().setUpperBound(parser.pairsEnergySumMax[triggerNum] / 1000.0);
+            pairTrigger[triggerNum].getEnergyDifferenceCutConfig().setUpperBound(parser.pairsEnergyDiffMax[triggerNum] / 1000.0);
+            pairTrigger[triggerNum].getEnergySlopeCutConfig().setLowerBound(parser.pairsEnergyDistMin[triggerNum] / 1000.0);
+            pairTrigger[triggerNum].getEnergySlopeCutConfig().setParameterF(parser.pairsEnergyDistSlope[triggerNum] / 1000.0);
+            pairTrigger[triggerNum].getCoplanarityCutConfig().setUpperBound(parser.pairsCoplanarityMax[triggerNum]);
+            pairTrigger[triggerNum].getTimeDifferenceCutConfig().setUpperBound(parser.pairsTimeDiffMax[triggerNum]);
+        }
+    }
+    
+    /**
+     * Gets the configuration parameters for the first singles trigger.
+     * @return Returns the first singles trigger configuration.
+     */
+    public SinglesTriggerConfig getSingles1Config() {
+        return singlesTrigger[0];
+    }
+    
+    /**
+     * Gets the configuration parameters for the second singles trigger.
+     * @return Returns the second singles trigger configuration.
+     */
+    public SinglesTriggerConfig getSingles2Config() {
+        return singlesTrigger[1];
+    }
+    
+    /**
+     * Gets the configuration parameters for the first pair trigger.
+     * @return Returns the first pair trigger configuration.
+     */
+    public PairTriggerConfig getPair1Config() {
+        return pairTrigger[0];
+    }
+    
+    /**
+     * Gets the configuration parameters for the second pair trigger.
+     * @return Returns the second trigger trigger configuration.
+     */
+    public PairTriggerConfig getPair2Config() {
+        return pairTrigger[1];
+    }
+    
+    @Override
+    public void printConfig() {
+        // Print the configuration header.
+        System.out.println("SSP Configuration:");
+        
+        // Print the singles triggers.
+        for(int triggerNum = 0; triggerNum < 2; triggerNum++) {
+            System.out.printf("\tSingles Trigger %d%n", (triggerNum + 1));
+            System.out.println("\t\tCluster Energy Lower Bound Cut");
+            System.out.printf("\t\t\tEnabled :: %b%n", singlesTrigger[triggerNum].getEnergyMinCutConfig().isEnabled());
+            System.out.printf("\t\t\tValue   :: %5.3f GeV%n", singlesTrigger[triggerNum].getEnergyMinCutConfig().getLowerBound());
+            
+            System.out.println("\t\tCluster Energy Upper Bound Cut");
+            System.out.printf("\t\t\tEnabled :: %b%n", singlesTrigger[triggerNum].getEnergyMaxCutConfig().isEnabled());
+            System.out.printf("\t\t\tValue   :: %5.3f GeV%n", singlesTrigger[triggerNum].getEnergyMaxCutConfig().getUpperBound());
+            
+            System.out.println("\t\tCluster Hit Count Cut");
+            System.out.printf("\t\t\tEnabled :: %b%n", singlesTrigger[triggerNum].getHitCountCutConfig().isEnabled());
+            System.out.printf("\t\t\tValue   :: %1.0f hits%n", singlesTrigger[triggerNum].getHitCountCutConfig().getLowerBound());
+            System.out.println();
+        }
+        
+        // Print the pair triggers.
+        for(int triggerNum = 0; triggerNum < 2; triggerNum++) {
+            System.out.printf("\tPair Trigger %d%n", (triggerNum + 1));
+            System.out.println("\t\tCluster Energy Lower Bound Cut");
+            System.out.printf("\t\t\tEnabled :: %b%n", pairTrigger[triggerNum].getEnergyMinCutConfig().isEnabled());
+            System.out.printf("\t\t\tValue   :: %5.3f GeV%n", pairTrigger[triggerNum].getEnergyMinCutConfig().getLowerBound());
+            
+            System.out.println("\t\tCluster Energy Upper Bound Cut");
+            System.out.printf("\t\t\tEnabled :: %b%n", pairTrigger[triggerNum].getEnergyMaxCutConfig().isEnabled());
+            System.out.printf("\t\t\tValue   :: %5.3f GeV%n", pairTrigger[triggerNum].getEnergyMaxCutConfig().getUpperBound());
+            
+            System.out.println("\t\tCluster Hit Count Cut");
+            System.out.printf("\t\t\tEnabled :: %b%n", pairTrigger[triggerNum].getHitCountCutConfig().isEnabled());
+            System.out.printf("\t\t\tValue   :: %1.0f hits%n", pairTrigger[triggerNum].getHitCountCutConfig().getLowerBound());
+            
+            System.out.println("\t\tPair Energy Sum Cut");
+            System.out.printf("\t\t\tEnabled :: %b%n", pairTrigger[triggerNum].getEnergySumCutConfig().isEnabled());
+            System.out.printf("\t\t\tMin     :: %5.3f GeV%n", pairTrigger[triggerNum].getEnergySumCutConfig().getLowerBound());
+            System.out.printf("\t\t\tMax     :: %5.3f GeV%n", pairTrigger[triggerNum].getEnergySumCutConfig().getUpperBound());
+            
+            System.out.println("\t\tPair Energy Difference Cut");
+            System.out.printf("\t\t\tEnabled :: %b%n", pairTrigger[triggerNum].getEnergyDifferenceCutConfig().isEnabled());
+            System.out.printf("\t\t\tValue   :: %5.3f GeV%n", pairTrigger[triggerNum].getEnergyDifferenceCutConfig().getUpperBound());
+            
+            System.out.println("\t\tPair Energy Slope Cut");
+            System.out.printf("\t\t\tEnabled :: %b%n", pairTrigger[triggerNum].getEnergySlopeCutConfig().isEnabled());
+            System.out.printf("\t\t\tValue   :: %5.3f GeV%n", pairTrigger[triggerNum].getEnergySlopeCutConfig().getLowerBound());
+            System.out.printf("\t\t\tParam F :: %6.4f GeV/mm%n", pairTrigger[triggerNum].getEnergySlopeCutConfig().getParameterF());
+            
+            System.out.println("\t\tPair Coplanarity Cut");
+            System.out.printf("\t\t\tEnabled :: %b%n", pairTrigger[triggerNum].getCoplanarityCutConfig().isEnabled());
+            System.out.printf("\t\t\tValue   :: %3.0f degrees%n", pairTrigger[triggerNum].getCoplanarityCutConfig().getUpperBound());
+            
+            System.out.println("\t\tPair Time Coincidence Cut");
+            System.out.printf("\t\t\tEnabled :: %b%n", pairTrigger[triggerNum].getTimeDifferenceCutConfig().isEnabled());
+            System.out.printf("\t\t\tValue   :: %1.0f clock-cycles%n", pairTrigger[triggerNum].getTimeDifferenceCutConfig().getUpperBound());
+            System.out.println();
+        }
+    }
+}

Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/SinglesTriggerConfig.java
 =============================================================================
--- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/SinglesTriggerConfig.java	(original)
+++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/SinglesTriggerConfig.java	Tue Mar 17 14:45:46 2015
@@ -7,47 +7,47 @@
  * @author Kyle McCarty <[log in to unmask]>
  */
 public class SinglesTriggerConfig extends AbstractConfig<AbstractConfig<Double>> {
-	private static final int CUT_ENERGY_MIN = 0;
-	private static final int CUT_ENERGY_MAX = 1;
-	private static final int CUT_HIT_COUNT  = 2;
-	
-	/**
-	 * Creates a new <code>SinglesTriggerConfig</code> object.
-	 */
-	SinglesTriggerConfig() {
-		// Instantiate the base object.
-		super(3);
-		
-		// Define the singles cuts.
-		setValue(CUT_ENERGY_MIN, new LBOCutConfig());
-		setValue(CUT_ENERGY_MAX, new UBOCutConfig());
-		setValue(CUT_HIT_COUNT,  new LBOCutConfig());
-	}
-	
-	/**
-	 * Gets the configuration object for the cluster energy lower bound
-	 * cut. Note that cuts are in units of GeV.
-	 * @return Returns the configuration object for the cut.
-	 */
-	public LBOCutConfig getEnergyMinCutConfig() {
-		return (LBOCutConfig) getValue(CUT_ENERGY_MIN);
-	}
-	
-	/**
-	 * Gets the configuration object for the cluster energy upper bound
-	 * cut. Note that cuts are in units of GeV.
-	 * @return Returns the configuration object for the cut.
-	 */
-	public UBOCutConfig getEnergyMaxCutConfig() {
-		return (UBOCutConfig) getValue(CUT_ENERGY_MAX);
-	}
-	
-	/**
-	 * Gets the configuration object for the cluster hit count cut.
-	 * Note that cuts are in units of calorimeter hits.
-	 * @return Returns the configuration object for the cut.
-	 */
-	public LBOCutConfig getHitCountCutConfig() {
-		return (LBOCutConfig) getValue(CUT_HIT_COUNT);
-	}
+    private static final int CUT_ENERGY_MIN = 0;
+    private static final int CUT_ENERGY_MAX = 1;
+    private static final int CUT_HIT_COUNT  = 2;
+    
+    /**
+     * Creates a new <code>SinglesTriggerConfig</code> object.
+     */
+    SinglesTriggerConfig() {
+        // Instantiate the base object.
+        super(3);
+        
+        // Define the singles cuts.
+        setValue(CUT_ENERGY_MIN, new LBOCutConfig());
+        setValue(CUT_ENERGY_MAX, new UBOCutConfig());
+        setValue(CUT_HIT_COUNT,  new LBOCutConfig());
+    }
+    
+    /**
+     * Gets the configuration object for the cluster energy lower bound
+     * cut. Note that cuts are in units of GeV.
+     * @return Returns the configuration object for the cut.
+     */
+    public LBOCutConfig getEnergyMinCutConfig() {
+        return (LBOCutConfig) getValue(CUT_ENERGY_MIN);
+    }
+    
+    /**
+     * Gets the configuration object for the cluster energy upper bound
+     * cut. Note that cuts are in units of GeV.
+     * @return Returns the configuration object for the cut.
+     */
+    public UBOCutConfig getEnergyMaxCutConfig() {
+        return (UBOCutConfig) getValue(CUT_ENERGY_MAX);
+    }
+    
+    /**
+     * Gets the configuration object for the cluster hit count cut.
+     * Note that cuts are in units of calorimeter hits.
+     * @return Returns the configuration object for the cut.
+     */
+    public LBOCutConfig getHitCountCutConfig() {
+        return (LBOCutConfig) getValue(CUT_HIT_COUNT);
+    }
 }

Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/UBOCutConfig.java
 =============================================================================
--- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/UBOCutConfig.java	(original)
+++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/UBOCutConfig.java	Tue Mar 17 14:45:46 2015
@@ -9,26 +9,26 @@
  * @author Kyle McCarty <[log in to unmask]>
  */
 public class UBOCutConfig extends AbstractConfig<Double> {
-	private static final int UPPER_BOUND = 0;
-	
-	/**
-	 * Instantiates a new <code>UBOCutConfig</code> object.
-	 */
-	UBOCutConfig() { super(1); }
-	
-	/**
-	 * Gets the upper bound of the cut.
-	 * @return Returns the upper bound as a <code>double</code>.
-	 */
-	public double getUpperBound() {
-		return getValue(UPPER_BOUND);
-	}
-	
-	/**
-	 * Sets the upper bound of the cut to the specified value.
-	 * @param value - The new upper bound for the cut.
-	 */
-	void setUpperBound(double value) {
-		setValue(UPPER_BOUND, value);
-	}
-}
+    private static final int UPPER_BOUND = 0;
+    
+    /**
+     * Instantiates a new <code>UBOCutConfig</code> object.
+     */
+    UBOCutConfig() { super(1); }
+    
+    /**
+     * Gets the upper bound of the cut.
+     * @return Returns the upper bound as a <code>double</code>.
+     */
+    public double getUpperBound() {
+        return getValue(UPPER_BOUND);
+    }
+    
+    /**
+     * Sets the upper bound of the cut to the specified value.
+     * @param value - The new upper bound for the cut.
+     */
+    void setUpperBound(double value) {
+        setValue(UPPER_BOUND, value);
+    }
+}

Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/ULBCutConfig.java
 =============================================================================
--- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/ULBCutConfig.java	(original)
+++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/daqconfig/ULBCutConfig.java	Tue Mar 17 14:45:46 2015
@@ -9,43 +9,43 @@
  * @author Kyle McCarty <[log in to unmask]>
  */
 public class ULBCutConfig extends AbstractConfig<Double> {
-	private static final int LOWER_BOUND = 0;
-	private static final int UPPER_BOUND = 1;
-	
-	/**
-	 * Instantiates a new <code>ULBCutConfig</code> object.
-	 */
-	ULBCutConfig() { super(2); }
-	
-	/**
-	 * Gets the lower bound of the cut.
-	 * @return Returns the lower bound as a <code>double</code>.
-	 */
-	public double getLowerBound() {
-		return getValue(LOWER_BOUND);
-	}
-	
-	/**
-	 * Gets the upper bound of the cut.
-	 * @return Returns the upper bound as a <code>double</code>.
-	 */
-	public double getUpperBound() {
-		return getValue(UPPER_BOUND);
-	}
-	
-	/**
-	 * Sets the lower bound of the cut to the specified value.
-	 * @param value - The new lower bound for the cut.
-	 */
-	void setLowerBound(double value) {
-		setValue(LOWER_BOUND, value);
-	}
-	
-	/**
-	 * Sets the upper bound of the cut to the specified value.
-	 * @param value - The new upper bound for the cut.
-	 */
-	void setUpperBound(double value) {
-		setValue(UPPER_BOUND, value);
-	}
-}
+    private static final int LOWER_BOUND = 0;
+    private static final int UPPER_BOUND = 1;
+    
+    /**
+     * Instantiates a new <code>ULBCutConfig</code> object.
+     */
+    ULBCutConfig() { super(2); }
+    
+    /**
+     * Gets the lower bound of the cut.
+     * @return Returns the lower bound as a <code>double</code>.
+     */
+    public double getLowerBound() {
+        return getValue(LOWER_BOUND);
+    }
+    
+    /**
+     * Gets the upper bound of the cut.
+     * @return Returns the upper bound as a <code>double</code>.
+     */
+    public double getUpperBound() {
+        return getValue(UPPER_BOUND);
+    }
+    
+    /**
+     * Sets the lower bound of the cut to the specified value.
+     * @param value - The new lower bound for the cut.
+     */
+    void setLowerBound(double value) {
+        setValue(LOWER_BOUND, value);
+    }
+    
+    /**
+     * Sets the upper bound of the cut to the specified value.
+     * @param value - The new upper bound for the cut.
+     */
+    void setUpperBound(double value) {
+        setValue(UPPER_BOUND, value);
+    }
+}