LISTSERV mailing list manager LISTSERV 16.5

Help for HPS-SVN Archives


HPS-SVN Archives

HPS-SVN Archives


HPS-SVN@LISTSERV.SLAC.STANFORD.EDU


View:

Message:

[

First

|

Previous

|

Next

|

Last

]

By Topic:

[

First

|

Previous

|

Next

|

Last

]

By Author:

[

First

|

Previous

|

Next

|

Last

]

Font:

Proportional Font

LISTSERV Archives

LISTSERV Archives

HPS-SVN Home

HPS-SVN Home

HPS-SVN  November 2014

HPS-SVN November 2014

Subject:

r1412 - in /java/branches/trunk_20141031: ./ analysis/ conditions/ conditions/src/main/java/org/hps/conditions/ conditions/src/main/java/org/hps/conditions/cli/ detector-data/ distribution/ ecal-event-display/ ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/ ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/util/ ecal-readout-sim/ ecal-recon/ evio/ integration-tests/ integration-tests/src/test/java/org/hps/ monitoring-app/ monitoring-app/src/main/java/org/hps/monitoring/subsys/ monitoring-drivers/ monitoring-drivers/src/main/java/org/hps/monitoring/drivers/example/ parent/ plugin/ recon/ record-util/ steering-files/ steering-files/src/main/resources/org/hps/steering/monitoring/ tracking/ users/ util/

From:

[log in to unmask]

Reply-To:

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

Date:

Sun, 2 Nov 2014 21:30:48 -0000

Content-Type:

text/plain

Parts/Attachments:

Parts/Attachments

text/plain (3443 lines)

Author: [log in to unmask]
Date: Sun Nov  2 13:30:41 2014
New Revision: 1412

Log:
Merge in pre merge trunk changes to backup.

Added:
    java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/DataFileViewer.java
      - copied unchanged from r1409, java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/DataFileViewer.java
    java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/PDataEventViewer.java
      - copied unchanged from r1409, java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/PDataEventViewer.java
    java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/ResizableFieldPanel.java
      - copied unchanged from r1409, java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/ResizableFieldPanel.java
    java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/util/CrystalDataSet.java
      - copied unchanged from r1409, java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/util/CrystalDataSet.java
    java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/util/EcalWiringManager.java
      - copied unchanged from r1409, java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/util/EcalWiringManager.java
Modified:
    java/branches/trunk_20141031/   (props changed)
    java/branches/trunk_20141031/analysis/pom.xml
    java/branches/trunk_20141031/conditions/pom.xml
    java/branches/trunk_20141031/conditions/src/main/java/org/hps/conditions/DatabaseConditionsManager.java
    java/branches/trunk_20141031/conditions/src/main/java/org/hps/conditions/cli/LoadCommand.java
    java/branches/trunk_20141031/detector-data/pom.xml
    java/branches/trunk_20141031/distribution/pom.xml
    java/branches/trunk_20141031/ecal-event-display/pom.xml
    java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/ActiveViewer.java
    java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/ClusterViewer.java
    java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/FileViewer.java
    java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/OccupancyViewer.java
    java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/PEventViewer.java
    java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/POccupancyViewer.java
    java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/PassiveViewer.java
    java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/StatusPanel.java
    java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/Viewer.java
    java/branches/trunk_20141031/ecal-readout-sim/pom.xml
    java/branches/trunk_20141031/ecal-recon/pom.xml
    java/branches/trunk_20141031/evio/pom.xml
    java/branches/trunk_20141031/integration-tests/pom.xml
    java/branches/trunk_20141031/integration-tests/src/test/java/org/hps/SimpleSvtReadoutTest.java
    java/branches/trunk_20141031/monitoring-app/pom.xml
    java/branches/trunk_20141031/monitoring-app/src/main/java/org/hps/monitoring/subsys/SystemStatusImpl.java
    java/branches/trunk_20141031/monitoring-drivers/pom.xml
    java/branches/trunk_20141031/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/example/DummyErrorDriver.java
    java/branches/trunk_20141031/parent/pom.xml
    java/branches/trunk_20141031/plugin/pom.xml
    java/branches/trunk_20141031/pom.xml
    java/branches/trunk_20141031/recon/pom.xml
    java/branches/trunk_20141031/record-util/pom.xml
    java/branches/trunk_20141031/steering-files/pom.xml
    java/branches/trunk_20141031/steering-files/src/main/resources/org/hps/steering/monitoring/DummyError.lcsim
    java/branches/trunk_20141031/tracking/pom.xml
    java/branches/trunk_20141031/users/pom.xml
    java/branches/trunk_20141031/util/pom.xml

Modified: java/branches/trunk_20141031/analysis/pom.xml
 =============================================================================
--- java/branches/trunk_20141031/analysis/pom.xml	(original)
+++ java/branches/trunk_20141031/analysis/pom.xml	Sun Nov  2 13:30:41 2014
@@ -8,7 +8,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>../parent/pom.xml</relativePath>
-        <version>3.0.4-SNAPSHOT</version>
+        <version>3.1-SNAPSHOT</version>
     </parent>
     <scm>
         <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/analysis/</url>

Modified: java/branches/trunk_20141031/conditions/pom.xml
 =============================================================================
--- java/branches/trunk_20141031/conditions/pom.xml	(original)
+++ java/branches/trunk_20141031/conditions/pom.xml	Sun Nov  2 13:30:41 2014
@@ -8,7 +8,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>../parent/pom.xml</relativePath>
-        <version>3.0.4-SNAPSHOT</version>
+        <version>3.1-SNAPSHOT</version>
     </parent>
     <scm>
         <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/conditions/</url>

Modified: java/branches/trunk_20141031/conditions/src/main/java/org/hps/conditions/DatabaseConditionsManager.java
 =============================================================================
--- java/branches/trunk_20141031/conditions/src/main/java/org/hps/conditions/DatabaseConditionsManager.java	(original)
+++ java/branches/trunk_20141031/conditions/src/main/java/org/hps/conditions/DatabaseConditionsManager.java	Sun Nov  2 13:30:41 2014
@@ -26,8 +26,6 @@
 import org.lcsim.conditions.ConditionsConverter;
 import org.lcsim.conditions.ConditionsManager;
 import org.lcsim.conditions.ConditionsManagerImplementation;
-import org.lcsim.conditions.ConditionsReader;
-import org.lcsim.conditions.readers.BaseClasspathConditionsReader;
 import org.lcsim.geometry.Detector;
 import org.lcsim.util.loop.DetectorConditionsConverter;
 
@@ -269,6 +267,33 @@
         logger.fine("new collection ID " + collectionId + " created for table " + tableName);
         return collectionId;
     }
+    
+    /**
+     * This method will return true if the given collection ID already exists in the table.
+     * @param tableName The name of the table.
+     * @param collectionID The collection ID value.
+     * @return True if collection exists.
+     */
+    public boolean collectionExists(String tableName, int collectionID) {
+        String sql = "SELECT * FROM " + tableName + " where collection_id = " + collectionID;
+        ResultSet resultSet = selectQuery(sql);
+        try {
+            resultSet.last();
+        } catch (SQLException e) {
+            e.printStackTrace();
+        }
+        int rowCount = 0;
+        try {
+            rowCount = resultSet.getRow();
+        } catch (SQLException e) {
+            e.printStackTrace();
+        }
+        if (rowCount != 0) {
+            return true;
+        } else {
+            return false;
+        }
+    }
 
     /**
      * Get the list of table meta data.
@@ -297,6 +322,7 @@
      * @param type The collection class.
      * @return The table meta data.
      */
+    // FIXME: This should return a list in case of multiple conditions defined with same type.
     public TableMetaData findTableMetaData(Class type) {
         for (TableMetaData meta : tableMetaData) {
             if (meta.getCollectionClass().equals(type)) {

Modified: java/branches/trunk_20141031/conditions/src/main/java/org/hps/conditions/cli/LoadCommand.java
 =============================================================================
--- java/branches/trunk_20141031/conditions/src/main/java/org/hps/conditions/cli/LoadCommand.java	(original)
+++ java/branches/trunk_20141031/conditions/src/main/java/org/hps/conditions/cli/LoadCommand.java	Sun Nov  2 13:30:41 2014
@@ -67,7 +67,7 @@
         int collectionID;
         if (commandLine.getOptionValue("c") != null) {
             collectionID = Integer.parseInt(commandLine.getOptionValue("c"));
-            if (collectionExists(conditionsManager, tableName, collectionID)) {
+            if (conditionsManager.collectionExists(tableName, collectionID)) {
                 throw new IllegalArgumentException("The user supplied collection ID " + collectionID + " already exists in this table.");
             }            
         } else {
@@ -89,7 +89,7 @@
         File inputFile = new File(fileName);
         BufferedReader reader = null;
         try {
-            reader = new BufferedReader(new FileReader(inputFile));           
+            reader = new BufferedReader(new FileReader(inputFile));
             String headerLine = reader.readLine();
             if (headerLine == null) {
                 throw new IllegalArgumentException("The file is empty.");
@@ -118,26 +118,5 @@
                 }
             }
         }        
-    }
-    
-    boolean collectionExists(DatabaseConditionsManager conditionsManager, String tableName, int collectionID) {
-        String sql = "SELECT * FROM " + tableName + " where collection_id = " + collectionID;
-        ResultSet resultSet = conditionsManager.selectQuery(sql);
-        try {
-            resultSet.last();
-        } catch (SQLException e) {
-            e.printStackTrace();
-        }
-        int rowCount = 0;
-        try {
-            rowCount = resultSet.getRow();
-        } catch (SQLException e) {
-            e.printStackTrace();
-        }
-        if (rowCount != 0) {
-            return true;
-        } else {
-            return false;
-        }
-    }
+    }    
 }

Modified: java/branches/trunk_20141031/detector-data/pom.xml
 =============================================================================
--- java/branches/trunk_20141031/detector-data/pom.xml	(original)
+++ java/branches/trunk_20141031/detector-data/pom.xml	Sun Nov  2 13:30:41 2014
@@ -8,7 +8,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>../parent/pom.xml</relativePath>
-        <version>3.0.4-SNAPSHOT</version>
+        <version>3.1-SNAPSHOT</version>
     </parent>
     <scm>
         <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/detector-data/</url>

Modified: java/branches/trunk_20141031/distribution/pom.xml
 =============================================================================
--- java/branches/trunk_20141031/distribution/pom.xml	(original)
+++ java/branches/trunk_20141031/distribution/pom.xml	Sun Nov  2 13:30:41 2014
@@ -11,7 +11,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>../parent/pom.xml</relativePath>
-        <version>3.0.4-SNAPSHOT</version>
+        <version>3.1-SNAPSHOT</version>
     </parent>    
     <scm>
         <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/distribution/</url>

Modified: java/branches/trunk_20141031/ecal-event-display/pom.xml
 =============================================================================
--- java/branches/trunk_20141031/ecal-event-display/pom.xml	(original)
+++ java/branches/trunk_20141031/ecal-event-display/pom.xml	Sun Nov  2 13:30:41 2014
@@ -7,7 +7,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>../parent/pom.xml</relativePath>
-        <version>3.0.4-SNAPSHOT</version>
+        <version>3.1-SNAPSHOT</version>
     </parent>
     <scm>
         <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/ecal-event-display/</url>

Modified: java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/ActiveViewer.java
 =============================================================================
--- java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/ActiveViewer.java	(original)
+++ java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/ActiveViewer.java	Sun Nov  2 13:30:41 2014
@@ -19,50 +19,43 @@
  * @author Kyle McCarty
  */
 public abstract class ActiveViewer extends Viewer {
-	private static final long serialVersionUID = -6107646224627009923L;
-	// Stores whether the background color is set or not.
-	private boolean background = false;
-	// Gets events from some file.
-	protected final EventManager em;
-	
-	/**
-     * Creates an active-type <code>Viewer</code> window which draws
-     * events from the indicated data source.
-	 * @param em - The data source event manager.
-	 */
-	public ActiveViewer(EventManager em) { this(em, new String[0]); }
-	
-	/**
+    private static final long serialVersionUID = -6107646224627009923L;
+    // Stores whether the background color is set or not.
+    private boolean background = false;
+    // Gets events from some file.
+    protected final EventManager em;
+    
+    /**
      * Creates an active-type <code>Viewer</code> window which draws
      * events from the indicated data source with additional status
      * fields defined by the <code>fieldNames</code> argument.
-	 * @param em - The data source event manager.
-	 * @param fieldNames - An array of additional status fields
-	 * that should be displayed.
-	 */
-	public ActiveViewer(EventManager em, String... fieldNames) {
-		// Pass any additional field values to the super class.
-		super(fieldNames);
-		
-		// Set the data source.
-		this.em = em;
-		
+     * @param em - The data source event manager.
+     * @param fieldNames - An array of additional status fields
+     * that should be displayed.
+     */
+    public ActiveViewer(EventManager em) {
+        // Pass any additional field values to the super class.
+        super();
+        
+        // Set the data source.
+        this.em = em;
+        
         // Make a key listener to change events.
         addKeyListener(new EcalKeyListener());
-	}
-	
+    }
+    
     /**
      * Feeds the calorimeter panel the data from the next event.
      * @throws IOException Occurs when there is an issue with reading the data file.
      **/
-	public abstract void displayNextEvent() throws IOException;
-	
+    public abstract void displayNextEvent() throws IOException;
+    
     /**
      * Feeds the calorimeter panel the data from the previous event.
      * @throws IOException Occurs when there is an issue with reading the data file.
      **/
-	public abstract void displayPreviousEvent() throws IOException;
-	
+    public abstract void displayPreviousEvent() throws IOException;
+    
     /**
      * The <code>EcalListener</code> class binds keys to actions.
      * Bound actions include:
@@ -71,7 +64,7 @@
      * b             :: Toggle color-mapping for 0 energy crystals
      * h             :: Toggle selected crystal highlighting
      * l             :: Toggle logarithmic versus linear scaling
-     * s			 :: Saves the current display to a file
+     * s             :: Saves the current display to a file
      **/
     private class EcalKeyListener implements KeyListener {
         public void keyPressed(KeyEvent e) { }
@@ -97,9 +90,9 @@
             
             // 'b' toggles the default white background.
             else if(e.getKeyCode() == 66) {
-            	if(background) { ecalPanel.setDefaultCrystalColor(null); }
-            	else { ecalPanel.setDefaultCrystalColor(Color.GRAY); }
-            	background = !background;
+                if(background) { ecalPanel.setDefaultCrystalColor(null); }
+                else { ecalPanel.setDefaultCrystalColor(Color.GRAY); }
+                background = !background;
             }
             
             // 'h' toggles highlighting the crystal under the cursor.
@@ -107,45 +100,45 @@
             
             // 'l' toggles linear or logarithmic scaling.
             else if(e.getKeyCode() == 76) {
-            	if(ecalPanel.isScalingLinear()) { ecalPanel.setScalingLogarithmic(); }
-            	else { ecalPanel.setScalingLinear(); }
+                if(ecalPanel.isScalingLinear()) { ecalPanel.setScalingLogarithmic(); }
+                else { ecalPanel.setScalingLinear(); }
             }
             
             // 'x' toggles x-axis mirroring.
             else if(e.getKeyCode() == 88) {
-            	ecalPanel.setMirrorX(!ecalPanel.isMirroredX());
-            	updateStatusPanel();
+                ecalPanel.setMirrorX(!ecalPanel.isMirroredX());
+                updateStatusPanel();
             }
             
             // 'y' toggles y-axis mirroring.
             else if(e.getKeyCode() == 89) {
-            	ecalPanel.setMirrorY(!ecalPanel.isMirroredY());
-            	updateStatusPanel();
+                ecalPanel.setMirrorY(!ecalPanel.isMirroredY());
+                updateStatusPanel();
             }
             
             // 's' saves the panel to a file.
             else if(e.getKeyCode() == 83) {
-            	// Make a new buffered image on which to draw the content pane.
-            	BufferedImage screenshot = new BufferedImage(getContentPane().getWidth(),
-            			getContentPane().getHeight(), BufferedImage.TYPE_INT_ARGB);
-            	
-            	// Paint the content pane to image.
-            	getContentPane().paint(screenshot.getGraphics());
-            	
-            	// Get the lowest available file name.
-            	int fileNum = 0;
-            	File imageFile = new File("screenshot_" + fileNum + ".png");
-            	while(imageFile.exists()) {
-            		fileNum++;
-            		imageFile = new File("screenshot_" + fileNum + ".png");
-            	}
-            	
-            	// Save the image to a PNG file.
-            	try { ImageIO.write(screenshot, "PNG", imageFile); }
-            	catch(IOException ioe) {
-            		System.err.println("Error saving file \"screenshot.png\".");
-            	}
-            	System.out.println("Screenshot saved to: " + imageFile.getAbsolutePath());
+                // Make a new buffered image on which to draw the content pane.
+                BufferedImage screenshot = new BufferedImage(getContentPane().getWidth(),
+                        getContentPane().getHeight(), BufferedImage.TYPE_INT_ARGB);
+                
+                // Paint the content pane to image.
+                getContentPane().paint(screenshot.getGraphics());
+                
+                // Get the lowest available file name.
+                int fileNum = 0;
+                File imageFile = new File("screenshot_" + fileNum + ".png");
+                while(imageFile.exists()) {
+                    fileNum++;
+                    imageFile = new File("screenshot_" + fileNum + ".png");
+                }
+                
+                // Save the image to a PNG file.
+                try { ImageIO.write(screenshot, "PNG", imageFile); }
+                catch(IOException ioe) {
+                    System.err.println("Error saving file \"screenshot.png\".");
+                }
+                System.out.println("Screenshot saved to: " + imageFile.getAbsolutePath());
             }
             
             // Otherwise, print out the key code for the pressed key.

Modified: java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/ClusterViewer.java
 =============================================================================
--- java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/ClusterViewer.java	(original)
+++ java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/ClusterViewer.java	Sun Nov  2 13:30:41 2014
@@ -31,10 +31,11 @@
  * 
  * @author Kyle McCarty
  */
+@Deprecated
 public class ClusterViewer extends ActiveViewer {
-	private static final long serialVersionUID = 17058336873349781L;
-	// Stores whether the background color is set or not.
-	private boolean background = false;
+    private static final long serialVersionUID = 17058336873349781L;
+    // Stores whether the background color is set or not.
+    private boolean background = false;
     // Store the index in the buffer of the displayed event.
     private int bufferIndex;
     // Map cluster location to a cluster object.
@@ -50,197 +51,205 @@
     // Additional status display field names for this data type.
     private static final String[] fieldNames = { "Shared Hits", "Component Hits", "Cluster Energy", "Buffer Index" };
     
-	/**
-	 * <b>ClusterViewer</b><br/><br/>
+    /**
+     * <b>ClusterViewer</b><br/><br/>
      * <code>public <b>ClusterViewer</b>()</code><br/><br/>
      * Constructs a new <code>Viewer</code> for displaying data read
      * from a file.
-	 * @param dataSource - The <code>EventManager</code> responsible
-	 * for reading data from a file.
-	 * @throws NullPointerException Occurs if the event manager is
-	 * <code>null</code>.
-	 */
-	public ClusterViewer(EventManager dataSource, int eventWindow) throws NullPointerException {
-		// Pass any additional fields required by the event manager
-		// to the underlying Viewer object to be added to the status
-		// display panel.
-		super(dataSource, fieldNames);
-		
-		// Define the event window and initialize the event data.
-		this.eventWindow = eventWindow;
-		eventEnergyBuffer = new LinkedList<Double[][]>();
-		eventHitBuffer = new LinkedList<List<EcalHit>>();
-		
-		// Prepare the event buffer to display the first event.
-		try {
-			// Make an empty array. At the start, there are no previous
-			// events to load.
-			Double[][] emptyArray = new Double[46][11];
-			for(int x = 0; x < 46; x++) {
-				for(int y = 0; y < 11; y++) { emptyArray[x][y] = new Double(0.0); }
-			}
-			
-			// Populate the eventWindow before section of the buffer
-			// with the empty events.
-			for(int i = 0; i <= eventWindow; i++) {
-				eventEnergyBuffer.addFirst(emptyArray);
-				eventHitBuffer.addFirst(new ArrayList<EcalHit>());
-			}
-			
-			// Fill the rest of the array with future events.
-			for(int i = 0; i < eventWindow; i++) {
-				em.nextEvent();
-				eventEnergyBuffer.addFirst(toEnergyArray(em.getHits()));
-				eventHitBuffer.addFirst(em.getHits());
-			}
-		}
-		catch(java.io.IOException e) { System.exit(1); }
-		
+     * @param dataSource - The <code>EventManager</code> responsible
+     * for reading data from a file.
+     * @throws NullPointerException Occurs if the event manager is
+     * <code>null</code>.
+     */
+    public ClusterViewer(EventManager dataSource, int eventWindow) throws NullPointerException {
+        // Initialize the superclass.
+        super(dataSource);
+        
+        // Add the additional fields.
+        for(String field : fieldNames) {
+            addStatusField(field);
+        }
+        
+        // Define the event window and initialize the event data.
+        this.eventWindow = eventWindow;
+        eventEnergyBuffer = new LinkedList<Double[][]>();
+        eventHitBuffer = new LinkedList<List<EcalHit>>();
+        
+        // Prepare the event buffer to display the first event.
+        try {
+            // Make an empty array. At the start, there are no previous
+            // events to load.
+            Double[][] emptyArray = new Double[46][11];
+            for(int x = 0; x < 46; x++) {
+                for(int y = 0; y < 11; y++) { emptyArray[x][y] = new Double(0.0); }
+            }
+            
+            // Populate the eventWindow before section of the buffer
+            // with the empty events.
+            for(int i = 0; i <= eventWindow; i++) {
+                eventEnergyBuffer.addFirst(emptyArray);
+                eventHitBuffer.addFirst(new ArrayList<EcalHit>());
+            }
+            
+            // Fill the rest of the array with future events.
+            for(int i = 0; i < eventWindow; i++) {
+                em.nextEvent();
+                eventEnergyBuffer.addFirst(toEnergyArray(em.getHits()));
+                eventHitBuffer.addFirst(em.getHits());
+            }
+        }
+        catch(java.io.IOException e) { System.exit(1); }
+        
         // Make a key listener to change events.
         addKeyListener(new EcalKeyListener());
-	}
-    
-    /**
-     * <b>displayNextEvent</b><br/><br/>
-     * <code>public void <b>displayNextEvent</b>()</code><br/><br/>
+    }
+    
+    /**
      * Feeds the calorimeter panel the data from the next event.
      * @throws IOException Occurs when there is an issue with reading the data file.
      **/
+    @Override
     public void displayNextEvent() throws IOException { getEvent(true); }
     
     /**
-     * <b>displayPreviousEvent</b><br/><br/>
-     * <code>public void <b>displayPreviousEvent</b>()</code><br/><br/>
      * Feeds the calorimeter panel the data from the previous event.
      * @throws IOException Occurs when there is an issue with reading the data file.
      **/
+    @Override
     public void displayPreviousEvent() throws IOException { getEvent(false); }
-	
-	public List<Cluster> getClusters() {
-		// Get the set of hits in the middle of the buffer. This is
-		// the "current" event.
-		List<EcalHit> activeEvent = eventHitBuffer.get(eventWindow);
-		
-		// Store clusters.
-		ArrayList<Cluster> clusterList = new ArrayList<Cluster>();
-		
-		// For each hit, check if it meets the criteria for a cluster.
-		for(EcalHit hit : activeEvent) {
-			// Track whether this hit is a cluster.
-			boolean isCluster = true;
-			
-			// Track the current hit's cluster energy.
-			double clusterEnergy = 0.0;
-			
-			// Convert the current hit to the proper coordinates.
-			Point hitLoc = toPanelPoint(hit.getLocation());
-			
-			// Track which crystals are part of the cluster.
-			HashSet<Point> componentSet = new HashSet<Point>();
-			
-			// Get the set of the current hit's neighbors.
-			Set<Point> neighbors = ecalPanel.getNeighbors(hitLoc);
-			
-			// Loop through the buffer and perform comparisons.
-			for(Double[][] event : eventEnergyBuffer) {
-				// Increment the cluster energy by the hit's energy at
-				// the current time in the buffer.
-				clusterEnergy += event[hitLoc.x][hitLoc.y];
-				
-				// A hit must be larger than itself at all other times
-				// stored in the buffer.
-				if(event[hitLoc.x][hitLoc.y] > hit.getEnergy()) {
-					isCluster = false;
-					break;
-				}
-				
-				// A hit must be larger than its immediate neighbors
-				// at all times in the buffer as well.
-				for(Point neighbor : neighbors) {
-					// Increment the cluster energy by the neighbor's
-					// energy at the current time in the buffer.
-					clusterEnergy += event[neighbor.x][neighbor.y];
-					
-					// Check that the neighbor's energy is not higher
-					// than the present hit's.
-					if(event[neighbor.x][neighbor.y] > hit.getEnergy()) {
-						isCluster = false;
-						break;
-					}
-					
-					// If this neighbor has a non-zero energy, it is
-					// a component of the potential cluster.
-					if(event[neighbor.x][neighbor.y] != 0) { componentSet.add(neighbor); }
-				}
-			}
-			
-			// If the current hit did not fail any of the preceding
-			// checks, then it is a cluster and should be added to
-			// the cluster list.
-			if(isCluster) {
-				Cluster cluster = new Cluster(hit.getLocation(), clusterEnergy);
-				for(Point neighbor : componentSet) { cluster.addComponentHit(toEcalPoint(neighbor)); }
-				clusterList.add(cluster);
-			}
-		}
-		
-		// Return the list of clusters.
-		return clusterList;
-	}
-    
+    
+    /**
+     * Generates a list of clusters from the list of hits in the event.
+     * This was used as a debugging method for the current clustering
+     * algorithm.
+     * @return Returns a generated list of clusters.
+     */
+    public List<Cluster> getClusters() {
+        // Get the set of hits in the middle of the buffer. This is
+        // the "current" event.
+        List<EcalHit> activeEvent = eventHitBuffer.get(eventWindow);
+        
+        // Store clusters.
+        ArrayList<Cluster> clusterList = new ArrayList<Cluster>();
+        
+        // For each hit, check if it meets the criteria for a cluster.
+        for(EcalHit hit : activeEvent) {
+            // Track whether this hit is a cluster.
+            boolean isCluster = true;
+            
+            // Track the current hit's cluster energy.
+            double clusterEnergy = 0.0;
+            
+            // Convert the current hit to the proper coordinates.
+            Point hitLoc = toPanelPoint(hit.getLocation());
+            
+            // Track which crystals are part of the cluster.
+            HashSet<Point> componentSet = new HashSet<Point>();
+            
+            // Get the set of the current hit's neighbors.
+            Set<Point> neighbors = ecalPanel.getNeighbors(hitLoc);
+            
+            // Loop through the buffer and perform comparisons.
+            for(Double[][] event : eventEnergyBuffer) {
+                // Increment the cluster energy by the hit's energy at
+                // the current time in the buffer.
+                clusterEnergy += event[hitLoc.x][hitLoc.y];
+                
+                // A hit must be larger than itself at all other times
+                // stored in the buffer.
+                if(event[hitLoc.x][hitLoc.y] > hit.getEnergy()) {
+                    isCluster = false;
+                    break;
+                }
+                
+                // A hit must be larger than its immediate neighbors
+                // at all times in the buffer as well.
+                for(Point neighbor : neighbors) {
+                    // Increment the cluster energy by the neighbor's
+                    // energy at the current time in the buffer.
+                    clusterEnergy += event[neighbor.x][neighbor.y];
+                    
+                    // Check that the neighbor's energy is not higher
+                    // than the present hit's.
+                    if(event[neighbor.x][neighbor.y] > hit.getEnergy()) {
+                        isCluster = false;
+                        break;
+                    }
+                    
+                    // If this neighbor has a non-zero energy, it is
+                    // a component of the potential cluster.
+                    if(event[neighbor.x][neighbor.y] != 0) { componentSet.add(neighbor); }
+                }
+            }
+            
+            // If the current hit did not fail any of the preceding
+            // checks, then it is a cluster and should be added to
+            // the cluster list.
+            if(isCluster) {
+                Cluster cluster = new Cluster(hit.getLocation(), clusterEnergy);
+                for(Point neighbor : componentSet) { cluster.addComponentHit(toEcalPoint(neighbor)); }
+                clusterList.add(cluster);
+            }
+        }
+        
+        // Return the list of clusters.
+        return clusterList;
+    }
+    
+    @Override
     protected void updateStatusPanel() {
-    	super.updateStatusPanel();
-    	
-		// Get the currently selected crystal.
-		Point crystal = ecalPanel.getSelectedCrystal();
-    	
-		// If the active crystal is not null, see if it is a cluster.
-		if(crystal != null) {
-			// Get the cluster associated with this point.
-			Cluster activeCluster = clusterMap.get(crystal);
-			
-			// If the cluster is null, we set everything to undefined.
-			if(activeCluster == null) {
-				for(String field : fieldNames) { setStatusField(field, StatusPanel.NULL_VALUE); }
-			}
-			
-			// Otherwise, define the fields based on the cluster.
-			else {
-				// Get the shared and component hit counts.
-				setStatusField(fieldNames[0], Integer.toString(activeCluster.getSharedHitCount()));
-				setStatusField(fieldNames[1], Integer.toString(activeCluster.getComponentHitCount()));
-				
-				// Format the cluster energy, or account for it if it
-				// doesn't exist.
-				String energy;
-				if(activeCluster.getClusterEnergy() != Double.NaN) {
-					DecimalFormat formatter = new DecimalFormat("0.####E0");
-					energy = formatter.format(activeCluster.getClusterEnergy());
-				}
-				else { energy = "---"; }
-				setStatusField(fieldNames[2], energy);
-			}
-		}
-		// Otherwise, clear the field values.
-		else { for(String field : fieldNames) { setStatusField(field, StatusPanel.NULL_VALUE); } }
-		
-		// Write the current buffer index.
-		
-		setStatusField(fieldNames[3], Integer.toString(eventWindow - bufferIndex));
-    }
-    
-	/**
-	 * <b>displayEvent</b><br/><br/>
-	 * <code>private void <b>displayEvent</b></code><br/><br/>
-	 * Displays the given lists of hits and clusters on the calorimeter
-	 * panel.
-	 * @param hitList - A list of hits for the current event.
-	 * @param clusterList  - A list of clusters for the current event.
-	 */
-	private void displayEvent(List<EcalHit> hitList, List<Cluster> clusterList) {
-		// Suppress the calorimeter panel.
-		ecalPanel.setSuppressRedraw(true);
-		
+        super.updateStatusPanel();
+        
+        // Get the currently selected crystal.
+        Point crystal = ecalPanel.getSelectedCrystal();
+        
+        // If the active crystal is not null, see if it is a cluster.
+        if(crystal != null) {
+            // Get the cluster associated with this point.
+            Cluster activeCluster = clusterMap.get(crystal);
+            
+            // If the cluster is null, we set everything to undefined.
+            if(activeCluster == null) {
+                for(String field : fieldNames) { setStatusField(field, StatusPanel.NULL_VALUE); }
+            }
+            
+            // Otherwise, define the fields based on the cluster.
+            else {
+                // Get the shared and component hit counts.
+                setStatusField(fieldNames[0], Integer.toString(activeCluster.getSharedHitCount()));
+                setStatusField(fieldNames[1], Integer.toString(activeCluster.getComponentHitCount()));
+                
+                // Format the cluster energy, or account for it if it
+                // doesn't exist.
+                String energy;
+                if(activeCluster.getClusterEnergy() != Double.NaN) {
+                    DecimalFormat formatter = new DecimalFormat("0.####E0");
+                    energy = formatter.format(activeCluster.getClusterEnergy());
+                }
+                else { energy = "---"; }
+                setStatusField(fieldNames[2], energy);
+            }
+        }
+        // Otherwise, clear the field values.
+        else { for(String field : fieldNames) { setStatusField(field, StatusPanel.NULL_VALUE); } }
+        
+        // Write the current buffer index.
+        
+        setStatusField(fieldNames[3], Integer.toString(eventWindow - bufferIndex));
+    }
+    
+    /**
+     * <b>displayEvent</b><br/><br/>
+     * <code>private void <b>displayEvent</b></code><br/><br/>
+     * Displays the given lists of hits and clusters on the calorimeter
+     * panel.
+     * @param hitList - A list of hits for the current event.
+     * @param clusterList  - A list of clusters for the current event.
+     */
+    private void displayEvent(List<EcalHit> hitList, List<Cluster> clusterList) {
+        // Suppress the calorimeter panel.
+        ecalPanel.setSuppressRedraw(true);
+        
         // Display the hits.
         for (EcalHit h : hitList) {
             int ix = toPanelX(h.getX());
@@ -250,28 +259,28 @@
         
         // Display the clusters.
         for(Cluster cluster : clusterList) {
-        	Point rawCluster = cluster.getClusterCenter();
-        	Point clusterCenter = toPanelPoint(rawCluster);
+            Point rawCluster = cluster.getClusterCenter();
+            Point clusterCenter = toPanelPoint(rawCluster);
             ecalPanel.setCrystalCluster(clusterCenter.x, clusterCenter.y, true);
             
-        	// Add component hits to the calorimeter panel.
-        	for(Point ch : cluster.getComponentHits()) {
-        		ecalPanel.addAssociation(new Association(clusterCenter, toPanelPoint(ch), HIGHLIGHT_CLUSTER_COMPONENT));
-        	}
-        	
-        	// Add shared hits to the calorimeter panel.
-        	for(Point sh : cluster.getSharedHits()) {
-        		ecalPanel.addAssociation(new Association(clusterCenter, toPanelPoint(sh), HIGHLIGHT_CLUSTER_SHARED));
-        	}
-        }
-        
-		// Stop suppressing the panel and order it to redraw.
-		ecalPanel.setSuppressRedraw(false);
-		ecalPanel.repaint();
+            // Add component hits to the calorimeter panel.
+            for(Point ch : cluster.getComponentHits()) {
+                ecalPanel.addAssociation(new Association(clusterCenter, toPanelPoint(ch), HIGHLIGHT_CLUSTER_COMPONENT));
+            }
+            
+            // Add shared hits to the calorimeter panel.
+            for(Point sh : cluster.getSharedHits()) {
+                ecalPanel.addAssociation(new Association(clusterCenter, toPanelPoint(sh), HIGHLIGHT_CLUSTER_SHARED));
+            }
+        }
+        
+        // Stop suppressing the panel and order it to redraw.
+        ecalPanel.setSuppressRedraw(false);
+        ecalPanel.repaint();
         
         // Update the status panel to account for the new event.
         updateStatusPanel();
-	}
+    }
     
     /**
      * <b>getEvent</b><br/><br/>
@@ -294,16 +303,16 @@
         
         // Remove the last buffer event and add the new one.
         if(forward) {
-        	eventEnergyBuffer.removeLast();
-        	eventHitBuffer.removeLast();
-        	eventEnergyBuffer.addFirst(toEnergyArray(em.getHits()));
-        	eventHitBuffer.addFirst(em.getHits());
+            eventEnergyBuffer.removeLast();
+            eventHitBuffer.removeLast();
+            eventEnergyBuffer.addFirst(toEnergyArray(em.getHits()));
+            eventHitBuffer.addFirst(em.getHits());
         }
         else {
-        	eventEnergyBuffer.removeFirst();
-        	eventHitBuffer.removeFirst();
-        	eventEnergyBuffer.addLast(toEnergyArray(em.getHits()));
-        	eventHitBuffer.addLast(em.getHits());
+            eventEnergyBuffer.removeFirst();
+            eventHitBuffer.removeFirst();
+            eventEnergyBuffer.addLast(toEnergyArray(em.getHits()));
+            eventHitBuffer.addLast(em.getHits());
         }
         
         // Determine if any of the hits in the active event are
@@ -321,29 +330,36 @@
         // Display it.
         displayEvent(eventHitBuffer.get(eventWindow), eventClusters);
     }
-	
-	private Double[][] toEnergyArray(List<EcalHit> hits) {
-		// Define the energy array.
-		Double[][] energy = new Double[46][11];
-		for(int x = 0; x < energy.length; x++) {
-			for(int y = 0; y < energy[x].length; y++) {
-				energy[x][y] = new Double(0);
-			}
-		}
-		
-		// For each hit, place its energy in the array.
-		for(EcalHit hit : hits) {
-			// Get the converted crystal index.
-			Point panelLoc = toPanelPoint(hit.getLocation());
-			
-			// Add the energy to the array.
-			energy[panelLoc.x][panelLoc.y] += hit.getEnergy(); 
-		}
-		
-		// Return the resulting array.
-		return energy;
-	}
-	
+    
+    /**
+     * Gets the energy that should be stored in each crystal of the
+     * calorimeter.
+     * @param hits - The list of hits for the event.
+     * @return Returns the energy of each crystal as an array of <code>
+     * Double</code> objects.
+     */
+    private Double[][] toEnergyArray(List<EcalHit> hits) {
+        // Define the energy array.
+        Double[][] energy = new Double[46][11];
+        for(int x = 0; x < energy.length; x++) {
+            for(int y = 0; y < energy[x].length; y++) {
+                energy[x][y] = new Double(0);
+            }
+        }
+        
+        // For each hit, place its energy in the array.
+        for(EcalHit hit : hits) {
+            // Get the converted crystal index.
+            Point panelLoc = toPanelPoint(hit.getLocation());
+            
+            // Add the energy to the array.
+            energy[panelLoc.x][panelLoc.y] += hit.getEnergy(); 
+        }
+        
+        // Return the resulting array.
+        return energy;
+    }
+    
     /**
      * The <code>EcalListener</code> class binds keys to actions.
      * Bound actions include:
@@ -352,11 +368,13 @@
      * b             :: Toggle color-mapping for 0 energy crystals
      * h             :: Toggle selected crystal highlighting
      * l             :: Toggle logarithmic versus linear scaling
-     * s			 :: Saves the current display to a file
+     * s             :: Saves the current display to a file
      **/
     private class EcalKeyListener implements KeyListener {
+        @Override
         public void keyPressed(KeyEvent e) { }
         
+        @Override
         public void keyReleased(KeyEvent e) {
             // If right-arrow was pressed, go to the next event.
             if (e.getKeyCode() == 39) {
@@ -379,30 +397,30 @@
             // If the down-arrow was pressed, move down a time step in
             // the buffer and display it.
             else if(e.getKeyCode() == 40) {
-            	if(bufferIndex == eventHitBuffer.size() - 1) { return; }
-            	else {
-                	bufferIndex++;
-            		ecalPanel.clearCrystals();
-            		displayEvent(eventHitBuffer.get(bufferIndex), eventClusters);
-            	}
+                if(bufferIndex == eventHitBuffer.size() - 1) { return; }
+                else {
+                    bufferIndex++;
+                    ecalPanel.clearCrystals();
+                    displayEvent(eventHitBuffer.get(bufferIndex), eventClusters);
+                }
             }
             
             // If the up-arrow was pressed, move up a time step in
             // the buffer and display it.
             else if(e.getKeyCode() == 38) {
-            	if(bufferIndex == 0) { return; }
-            	else {
-            		bufferIndex--;
-            		ecalPanel.clearCrystals();
-            		displayEvent(eventHitBuffer.get(bufferIndex), eventClusters);
-            	}
+                if(bufferIndex == 0) { return; }
+                else {
+                    bufferIndex--;
+                    ecalPanel.clearCrystals();
+                    displayEvent(eventHitBuffer.get(bufferIndex), eventClusters);
+                }
             }
             
             // 'b' toggles the default white background.
             else if(e.getKeyCode() == 66) {
-            	if(background) { ecalPanel.setDefaultCrystalColor(null); }
-            	else { ecalPanel.setDefaultCrystalColor(Color.GRAY); }
-            	background = !background;
+                if(background) { ecalPanel.setDefaultCrystalColor(null); }
+                else { ecalPanel.setDefaultCrystalColor(Color.GRAY); }
+                background = !background;
             }
             
             // 'h' toggles highlighting the crystal under the cursor.
@@ -410,39 +428,40 @@
             
             // 'l' toggles linear or logarithmic scaling.
             else if(e.getKeyCode() == 76) {
-            	if(ecalPanel.isScalingLinear()) { ecalPanel.setScalingLogarithmic(); }
-            	else { ecalPanel.setScalingLinear(); }
+                if(ecalPanel.isScalingLinear()) { ecalPanel.setScalingLogarithmic(); }
+                else { ecalPanel.setScalingLinear(); }
             }
             
             // 's' saves the panel to a file.
             else if(e.getKeyCode() == 83) {
-            	// Make a new buffered image on which to draw the content pane.
-            	BufferedImage screenshot = new BufferedImage(getContentPane().getWidth(),
-            			getContentPane().getHeight(), BufferedImage.TYPE_INT_ARGB);
-            	
-            	// Paint the content pane to image.
-            	getContentPane().paint(screenshot.getGraphics());
-            	
-            	// Get the lowest available file name.
-            	int fileNum = 0;
-            	File imageFile = new File("screenshot_" + fileNum + ".png");
-            	while(imageFile.exists()) {
-            		fileNum++;
-            		imageFile = new File("screenshot_" + fileNum + ".png");
-            	}
-            	
-            	// Save the image to a PNG file.
-            	try { ImageIO.write(screenshot, "PNG", imageFile); }
-            	catch(IOException ioe) {
-            		System.err.println("Error saving file \"screenshot.png\".");
-            	}
-            	System.out.println("Screenshot saved to: " + imageFile.getAbsolutePath());
+                // Make a new buffered image on which to draw the content pane.
+                BufferedImage screenshot = new BufferedImage(getContentPane().getWidth(),
+                        getContentPane().getHeight(), BufferedImage.TYPE_INT_ARGB);
+                
+                // Paint the content pane to image.
+                getContentPane().paint(screenshot.getGraphics());
+                
+                // Get the lowest available file name.
+                int fileNum = 0;
+                File imageFile = new File("screenshot_" + fileNum + ".png");
+                while(imageFile.exists()) {
+                    fileNum++;
+                    imageFile = new File("screenshot_" + fileNum + ".png");
+                }
+                
+                // Save the image to a PNG file.
+                try { ImageIO.write(screenshot, "PNG", imageFile); }
+                catch(IOException ioe) {
+                    System.err.println("Error saving file \"screenshot.png\".");
+                }
+                System.out.println("Screenshot saved to: " + imageFile.getAbsolutePath());
             }
             
             // Otherwise, print out the key code for the pressed key.
             else { System.out.printf("Key Code: %d%n", e.getKeyCode()); }
         }
         
+        @Override
         public void keyTyped(KeyEvent e) { }
     }
 }

Modified: java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/FileViewer.java
 =============================================================================
--- java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/FileViewer.java	(original)
+++ java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/FileViewer.java	Sun Nov  2 13:30:41 2014
@@ -21,7 +21,7 @@
  * @author Kyle McCarty
  */
 public class FileViewer extends ActiveViewer {
-	private static final long serialVersionUID = 17058336873349781L;
+    private static final long serialVersionUID = 17058336873349781L;
     // Map cluster location to a cluster object.
     private HashMap<Point, Cluster> clusterMap = new HashMap<Point, Cluster>();
     // Additional status display field names for this data type.
@@ -32,80 +32,87 @@
     private static final int COMPONENT_HITS = 2;
     private static final int CLUSTER_ENERGY = 3;
     
-	/**
-	 * <b>FileViewer</b><br/><br/>
+    /**
+     * <b>FileViewer</b><br/><br/>
      * <code>public <b>FileViewer</b>()</code><br/><br/>
      * Constructs a new <code>Viewer</code> for displaying data read
      * from a file.
-	 * @param dataSource - The <code>EventManager</code> responsible
-	 * for reading data from a file.
-	 * @throws NullPointerException Occurs if the event manager is
-	 * <code>null</code>.
-	 */
-	public FileViewer(EventManager dataSource) throws NullPointerException {
-		// Pass any additional fields required by the event manager
-		// to the underlying Viewer object to be added to the status
-		// display panel.
-		super(dataSource, fieldNames);
-	}
+     * @param dataSource - The <code>EventManager</code> responsible
+     * for reading data from a file.
+     * @throws NullPointerException Occurs if the event manager is
+     * <code>null</code>.
+     */
+    public FileViewer(EventManager dataSource) throws NullPointerException {
+        // Initialize the superclass viewer.
+        super(dataSource);
+        
+        // Add additional fields.
+        insertStatusField(0, fieldNames[0]);
+        for(int index = 1; index < fieldNames.length; index++) {
+            addStatusField(fieldNames[index]);
+        }
+    }
     
+    @Override
     public void displayNextEvent() throws IOException { getEvent(true); }
     
+    @Override
     public void displayPreviousEvent() throws IOException { getEvent(false); }
     
+    @Override
     protected void updateStatusPanel() {
-    	// Update the superclass status fields.
-    	super.updateStatusPanel();
-    	
-		// Get the currently selected crystal.
-		Point crystal = ecalPanel.getSelectedCrystal();
-    	
-		// If the active crystal is not null, see if it is a cluster.
-		if(crystal != null) {
-			// Get the cluster associated with this point.
-			Cluster activeCluster = clusterMap.get(crystal);
-			
-			// If the cluster is null, we set everything to undefined.
-			if(activeCluster == null) {
-				for(String field : fieldNames) { setStatusField(field, StatusPanel.NULL_VALUE); }
-			}
-			
-			// Otherwise, define the fields based on the cluster.
-			else {
-				// Get the shared and component hit counts.
-				setStatusField(fieldNames[SHARED_HITS], Integer.toString(activeCluster.getSharedHitCount()));
-				setStatusField(fieldNames[COMPONENT_HITS], Integer.toString(activeCluster.getComponentHitCount()));
-				
-				// Format the cluster energy, or account for it if it
-				// doesn't exist.
-				String energy;
-				if(activeCluster.getClusterEnergy() != Double.NaN) {
-					DecimalFormat formatter = new DecimalFormat("0.####E0");
-					energy = formatter.format(activeCluster.getClusterEnergy());
-				}
-				else { energy = "---"; }
-				setStatusField(fieldNames[CLUSTER_ENERGY], energy);
-			}
-		}
-		// Otherwise, clear the field values.
-		else { for(String field : fieldNames) { setStatusField(field, StatusPanel.NULL_VALUE); } }
-    	
-    	// Set the event number.
-    	setStatusField(fieldNames[EVENT_NUMBER], Integer.toString(em.getEventNumber()));
+        // Update the superclass status fields.
+        super.updateStatusPanel();
+        
+        // Get the currently selected crystal.
+        Point crystal = ecalPanel.getSelectedCrystal();
+        
+        // If the active crystal is not null, see if it is a cluster.
+        if(crystal != null) {
+            // Get the cluster associated with this point.
+            Cluster activeCluster = clusterMap.get(crystal);
+            
+            // If the cluster is null, we set everything to undefined.
+            if(activeCluster == null) {
+                for(String field : fieldNames) { setStatusField(field, ResizableFieldPanel.NULL_VALUE); }
+            }
+            
+            // Otherwise, define the fields based on the cluster.
+            else {
+                // Get the shared and component hit counts.
+                setStatusField(fieldNames[SHARED_HITS], Integer.toString(activeCluster.getSharedHitCount()));
+                setStatusField(fieldNames[COMPONENT_HITS], Integer.toString(activeCluster.getComponentHitCount()));
+                
+                // Format the cluster energy, or account for it if it
+                // doesn't exist.
+                String energy;
+                if(activeCluster.getClusterEnergy() != Double.NaN) {
+                    DecimalFormat formatter = new DecimalFormat("0.####E0");
+                    energy = formatter.format(activeCluster.getClusterEnergy());
+                }
+                else { energy = "---"; }
+                setStatusField(fieldNames[CLUSTER_ENERGY], energy);
+            }
+        }
+        // Otherwise, clear the field values.
+        else { for(String field : fieldNames) { setStatusField(field, ResizableFieldPanel.NULL_VALUE); } }
+        
+        // Set the event number.
+        setStatusField(fieldNames[EVENT_NUMBER], Integer.toString(em.getEventNumber()));
     }
     
-	/**
-	 * <b>displayEvent</b><br/><br/>
-	 * <code>private void <b>displayEvent</b>(List<EcalHit> hitList, List<Cluster> clusterList)</code><br/><br/>
-	 * Displays the given lists of hits and clusters on the calorimeter
-	 * panel.
-	 * @param hitList - A list of hits for the current event.
-	 * @param clusterList  - A list of clusters for the current event.
-	 */
-	private void displayEvent(List<EcalHit> hitList, List<Cluster> clusterList) {
-		// Suppress the calorimeter panel's redrawing.
-		ecalPanel.setSuppressRedraw(true);
-		
+    /**
+     * <b>displayEvent</b><br/><br/>
+     * <code>private void <b>displayEvent</b>(List<EcalHit> hitList, List<Cluster> clusterList)</code><br/><br/>
+     * Displays the given lists of hits and clusters on the calorimeter
+     * panel.
+     * @param hitList - A list of hits for the current event.
+     * @param clusterList  - A list of clusters for the current event.
+     */
+    private void displayEvent(List<EcalHit> hitList, List<Cluster> clusterList) {
+        // Suppress the calorimeter panel's redrawing.
+        ecalPanel.setSuppressRedraw(true);
+        
         // Display the hits.
         for (EcalHit h : hitList) {
             int ix = toPanelX(h.getX());
@@ -115,19 +122,19 @@
         
         // Display the clusters.
         for(Cluster cluster : clusterList) {
-        	Point rawCluster = cluster.getClusterCenter();
-        	Point clusterCenter = toPanelPoint(rawCluster);
+            Point rawCluster = cluster.getClusterCenter();
+            Point clusterCenter = toPanelPoint(rawCluster);
             ecalPanel.setCrystalCluster(clusterCenter.x, clusterCenter.y, true);
             
-        	// Add component hits to the calorimeter panel.
-        	for(Point ch : cluster.getComponentHits()) {
-        		ecalPanel.addAssociation(new Association(clusterCenter, toPanelPoint(ch), HIGHLIGHT_CLUSTER_COMPONENT));
-        	}
-        	
-        	// Add shared hits to the calorimeter panel.
-        	for(Point sh : cluster.getSharedHits()) {
-        		ecalPanel.addAssociation(new Association(clusterCenter, toPanelPoint(sh), HIGHLIGHT_CLUSTER_SHARED));
-        	}
+            // Add component hits to the calorimeter panel.
+            for(Point ch : cluster.getComponentHits()) {
+                ecalPanel.addAssociation(new Association(clusterCenter, toPanelPoint(ch), HIGHLIGHT_CLUSTER_COMPONENT));
+            }
+            
+            // Add shared hits to the calorimeter panel.
+            for(Point sh : cluster.getSharedHits()) {
+                ecalPanel.addAssociation(new Association(clusterCenter, toPanelPoint(sh), HIGHLIGHT_CLUSTER_SHARED));
+            }
         }
         
         // Stop suppressing the redraw and order the panel to update.
@@ -136,7 +143,7 @@
         
         // Update the status panel to account for the new event.
         updateStatusPanel();
-	}
+    }
     
     /**
      * <b>getEvent</b><br/><br/>

Modified: java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/OccupancyViewer.java
 =============================================================================
--- java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/OccupancyViewer.java	(original)
+++ java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/OccupancyViewer.java	Sun Nov  2 13:30:41 2014
@@ -17,63 +17,59 @@
  * @author Kyle McCarty
  */
 public class OccupancyViewer extends ActiveViewer {
-	private static final long serialVersionUID = 3712604287904215617L;
-	// The number of events that have been read so far.
-	private long events = 0;
-	// The total number of hits for each crystal position.
-	private long[][] hits;
-	
-	/**
-	 * <b>OccupancyViewer</b><br/><br/>
-     * <code>public <b>OccupancyViewer</b>(EventManager em)</code><br/><br/>
+    private static final long serialVersionUID = 3712604287904215617L;
+    // The number of events that have been read so far.
+    private long events = 0;
+    // The total number of hits for each crystal position.
+    private long[][] hits;
+    
+    /**
      * Creates a new occupancy display that draws event data from the
      * indicated data source.
-	 * @param em - The data source from which to draw events.
-	 */
-	public OccupancyViewer(EventManager em) {
-		// Initialize the super class.
-		super(em);
-		
-		// Set the title and scale.
-		setTitle("HPS Calorimeter Occupancies");
-		ecalPanel.setScaleMaximum(1.0);
-		
-		// Initialize the hit counts array.
-		Dimension ecalSize = ecalPanel.getCrystalBounds();
-		hits = new long[ecalSize.width][ecalSize.height];
-	}
+     * @param em - The data source from which to draw events.
+     */
+    public OccupancyViewer(EventManager em) {
+        // Initialize the super class.
+        super(em);
+        
+        // Set the title and scale.
+        setTitle("HPS Calorimeter Occupancies");
+        ecalPanel.setScaleMaximum(1.0);
+        
+        // Initialize the hit counts array.
+        Dimension ecalSize = ecalPanel.getCrystalBounds();
+        hits = new long[ecalSize.width][ecalSize.height];
+    }
     
+    @Override
     public void displayNextEvent() throws IOException { getEvent(true); }
     
+    @Override
     public void displayPreviousEvent() throws IOException { getEvent(false); }
     
     /**
-     * <b>resetOccupancies</b><br/><br/>
-     * <code>public void <b>resetOccupancies</b>()</code><br/><br/>
      * Clears the current occupancy data.
      */
     public void resetOccupancies() {
-    	// Clear the crystal hit counts.
-    	for(int x = 0; x < hits.length; x++) {
-    		for(int y = 0; y < hits[0].length; y++) {
-    			hits[x][y] = 0;
-    		}
-    	}
-    	
-    	// Clear the number of events.
-    	events = 0;
+        // Clear the crystal hit counts.
+        for(int x = 0; x < hits.length; x++) {
+            for(int y = 0; y < hits[0].length; y++) {
+                hits[x][y] = 0;
+            }
+        }
+        
+        // Clear the number of events.
+        events = 0;
     }
     
-	/**
-	 * <b>displayEvent</b><br/><br/>
-	 * <code>private void <b>displayEvent</b>(List<EcalHit> hitList)</code><br/><br/>
-	 * Displays the given lists of hits on the calorimeter panel.
-	 * @param hitList - A list of hits for the current event.
-	 */
-	private void displayEvent(List<EcalHit> hitList) {
-		// Suppress the calorimeter panel's redrawing.
-		ecalPanel.setSuppressRedraw(true);
-		
+    /**
+     * Displays the given lists of hits on the calorimeter panel.
+     * @param hitList - A list of hits for the current event.
+     */
+    private void displayEvent(List<EcalHit> hitList) {
+        // Suppress the calorimeter panel's redrawing.
+        ecalPanel.setSuppressRedraw(true);
+        
         // Display the hits.
         for (EcalHit h : hitList) {
             ecalPanel.addCrystalEnergy(h.getX(), h.getY(), h.getEnergy());
@@ -85,11 +81,9 @@
         
         // Update the status panel to account for the new event.
         updateStatusPanel();
-	}
+    }
     
     /**
-     * <b>getEvent</b><br/><br/>
-     * <code>private void <b>getEvent</b>(boolean forward)</code><br/><br/>
      * Reads either the next or the previous event from the event manager.
      * @param forward - Whether the event data should be read forward
      * or backward.
@@ -104,44 +98,44 @@
         
         // Get the next event.
         if(forward) {
-        	// Get the next event.
-        	em.nextEvent();
-        	
-        	// Increment the event count.
-        	events++;
-        	
-        	// For each hit, increment the hit count for the relevant
-        	// crystal by one.
-        	for(EcalHit hit : em.getHits()) {
-        		hits[toPanelX(hit.getX())][toPanelY(hit.getY())]++;
-        	}
+            // Get the next event.
+            em.nextEvent();
+            
+            // Increment the event count.
+            events++;
+            
+            // For each hit, increment the hit count for the relevant
+            // crystal by one.
+            for(EcalHit hit : em.getHits()) {
+                hits[toPanelX(hit.getX())][toPanelY(hit.getY())]++;
+            }
         }
         else {
-        	// Get the previous event.
-        	em.previousEvent();
-        	
-        	// Decrement the event count.
-        	events--;
-        	
-        	// For each hit, decrement the hit count for the relevant
-        	// crystal by one.
-        	for(EcalHit hit : em.getHits()) {
-        		hits[toPanelX(hit.getX())][toPanelY(hit.getY())]--;
-        	}
+            // Get the previous event.
+            em.previousEvent();
+            
+            // Decrement the event count.
+            events--;
+            
+            // For each hit, decrement the hit count for the relevant
+            // crystal by one.
+            for(EcalHit hit : em.getHits()) {
+                hits[toPanelX(hit.getX())][toPanelY(hit.getY())]--;
+            }
         }
         
         // Build a "hit list" from the occupancies.
         ArrayList<EcalHit> occupancyList = new ArrayList<EcalHit>();
         for(int x = 0; x < hits.length; x++) {
-        	for(int y = 0; y < hits[0].length; y++) {
-        		if(hits[x][y] != 0) {
-        			// Define the crystal ID and "energy."
-        			Point cid = new Point(x, y);
-        			double occupancy = ((double) hits[x][y]) / events;
-        			EcalHit occupancyHit = new EcalHit(cid, occupancy);
-        			occupancyList.add(occupancyHit);
-        		}
-        	}
+            for(int y = 0; y < hits[0].length; y++) {
+                if(hits[x][y] != 0) {
+                    // Define the crystal ID and "energy."
+                    Point cid = new Point(x, y);
+                    double occupancy = ((double) hits[x][y]) / events;
+                    EcalHit occupancyHit = new EcalHit(cid, occupancy);
+                    occupancyList.add(occupancyHit);
+                }
+            }
         }
         
         // Display it the occupancies.

Modified: java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/PEventViewer.java
 =============================================================================
--- java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/PEventViewer.java	(original)
+++ java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/PEventViewer.java	Sun Nov  2 13:30:41 2014
@@ -22,60 +22,58 @@
  * @author Kyle McCarty
  */
 public class PEventViewer extends PassiveViewer {
-	private static final long serialVersionUID = -7479125553259270894L;
-	// Stores whether the background color is set or not.
-	private boolean background = false;
-	// Stores cluster objects.
-	protected ArrayList<Cluster> clusterList = new ArrayList<Cluster>();
-	// Stores hit objects.
-	protected ArrayList<EcalHit> hitList = new ArrayList<EcalHit>();
-	
-	/**
-	 * <b>PEventViewer</b><br/><br/>
-	 * <code>public <b>PEventViewer</b>(String... fieldValues)</code><br/><br/>
-	 * Creates a passive viewer for displaying hits and clusters in
-	 * an event.
-	 * @param fieldValues - Any additional status fields to display.
-	 */
-	public PEventViewer(String... fieldValues) {
-		// Pass the field values to the superclass.
-		super(fieldValues);
-		
-		// Set the key bindings.
-		addKeyListener(new EcalKeyListener());
-	}
-	
-	public void addHit(EcalHit hit) { hitList.add(hit); }
-	
-	public void addCluster(Cluster cluster) { clusterList.add(cluster); }
-	
-	/**
-	 * <b>clearHits</b><br/><br/>
-	 * <code>public void <b>clearHits</b>()</code><br/><br/>
-	 * Removes all of the hit data from the viewer.
-	 */
-	public void clearHits() { hitList.clear(); }
-	
-	/**
-	 * <b>clearClusters</b><br/><br/>
-	 * <code>public void <b>clearClusters</b>()</code><br/><br/>
-	 * Removes all of the cluster data from the viewer.
-	 */
-	public void clearClusters() { hitList.clear(); }
-	
-	public void resetDisplay() {
-		// Reset the hit and cluster lists.
-		hitList.clear();
-		clusterList.clear();
-	}
-	
-	public void updateDisplay() {
-		// Suppress the calorimeter panel's redrawing.
-		ecalPanel.setSuppressRedraw(true);
-		
-		// Clear the panel data.
-		ecalPanel.clearCrystals();
-		
+    private static final long serialVersionUID = -7479125553259270894L;
+    // Stores whether the background color is set or not.
+    private boolean background = false;
+    // Stores cluster objects.
+    protected ArrayList<Cluster> clusterList = new ArrayList<Cluster>();
+    // Stores hit objects.
+    protected ArrayList<EcalHit> hitList = new ArrayList<EcalHit>();
+    
+    /**
+     * Creates a passive viewer for displaying hits and clusters in
+     * an event.
+     * @param fieldValues - Any additional status fields to display.
+     */
+    public PEventViewer() {
+        // Initialize the superclass.
+        super();
+        
+        // Set the key bindings.
+        addKeyListener(new EcalKeyListener());
+    }
+    
+    @Override
+    public void addHit(EcalHit hit) { hitList.add(hit); }
+    
+    @Override
+    public void addCluster(Cluster cluster) { clusterList.add(cluster); }
+    
+    /**
+     * Removes all of the hit data from the viewer.
+     */
+    public void clearHits() { hitList.clear(); }
+    
+    /**
+     * Removes all of the cluster data from the viewer.
+     */
+    public void clearClusters() { hitList.clear(); }
+    
+    @Override
+    public void resetDisplay() {
+        // Reset the hit and cluster lists.
+        hitList.clear();
+        clusterList.clear();
+    }
+    
+    @Override
+    public void updateDisplay() {
+        // Suppress the calorimeter panel's redrawing.
+        ecalPanel.setSuppressRedraw(true);
+        
+        // Clear the panel data.
+        ecalPanel.clearCrystals();
+        
         // Display the hits.
         for (EcalHit h : hitList) {
             int ix = toPanelX(h.getX());
@@ -85,19 +83,19 @@
         
         // Display the clusters.
         for(Cluster cluster : clusterList) {
-        	Point rawCluster = cluster.getClusterCenter();
-        	Point clusterCenter = toPanelPoint(rawCluster);
+            Point rawCluster = cluster.getClusterCenter();
+            Point clusterCenter = toPanelPoint(rawCluster);
             ecalPanel.setCrystalCluster(clusterCenter.x, clusterCenter.y, true);
             
-        	// Add component hits to the calorimeter panel.
-        	for(Point ch : cluster.getComponentHits()) {
-        		ecalPanel.addAssociation(new Association(clusterCenter, toPanelPoint(ch), HIGHLIGHT_CLUSTER_COMPONENT));
-        	}
-        	
-        	// Add shared hits to the calorimeter panel.
-        	for(Point sh : cluster.getSharedHits()) {
-        		ecalPanel.addAssociation(new Association(clusterCenter, toPanelPoint(sh), HIGHLIGHT_CLUSTER_SHARED));
-        	}
+            // Add component hits to the calorimeter panel.
+            for(Point ch : cluster.getComponentHits()) {
+                ecalPanel.addAssociation(new Association(clusterCenter, toPanelPoint(ch), HIGHLIGHT_CLUSTER_COMPONENT));
+            }
+            
+            // Add shared hits to the calorimeter panel.
+            for(Point sh : cluster.getSharedHits()) {
+                ecalPanel.addAssociation(new Association(clusterCenter, toPanelPoint(sh), HIGHLIGHT_CLUSTER_SHARED));
+            }
         }
         
         // Stop suppressing the redraw and order the panel to update.
@@ -106,25 +104,27 @@
         
         // Update the status panel to account for the new event.
         updateStatusPanel();
-	}
-	
+    }
+    
     /**
      * The <code>EcalListener</code> class binds keys to actions.
      * Bound actions include:
      * b             :: Toggle color-mapping for 0 energy crystals
      * h             :: Toggle selected crystal highlighting
      * l             :: Toggle logarithmic versus linear scaling
-     * s			 :: Saves the current display to a file
+     * s             :: Saves the current display to a file
      **/
     private class EcalKeyListener implements KeyListener {
+        @Override
         public void keyPressed(KeyEvent e) { }
         
+        @Override
         public void keyReleased(KeyEvent e) {
             // 'b' toggles the default white background.
             if(e.getKeyCode() == 66) {
-            	if(background) { ecalPanel.setDefaultCrystalColor(null); }
-            	else { ecalPanel.setDefaultCrystalColor(Color.GRAY); }
-            	background = !background;
+                if(background) { ecalPanel.setDefaultCrystalColor(null); }
+                else { ecalPanel.setDefaultCrystalColor(Color.GRAY); }
+                background = !background;
             }
             
             // 'h' toggles highlighting the crystal under the cursor.
@@ -132,39 +132,40 @@
             
             // 'l' toggles linear or logarithmic scaling.
             else if(e.getKeyCode() == 76) {
-            	if(ecalPanel.isScalingLinear()) { ecalPanel.setScalingLogarithmic(); }
-            	else { ecalPanel.setScalingLinear(); }
+                if(ecalPanel.isScalingLinear()) { ecalPanel.setScalingLogarithmic(); }
+                else { ecalPanel.setScalingLinear(); }
             }
             
             // 's' saves the panel to a file.
             else if(e.getKeyCode() == 83) {
-            	// Make a new buffered image on which to draw the content pane.
-            	BufferedImage screenshot = new BufferedImage(getContentPane().getWidth(),
-            			getContentPane().getHeight(), BufferedImage.TYPE_INT_ARGB);
-            	
-            	// Paint the content pane to image.
-            	getContentPane().paint(screenshot.getGraphics());
-            	
-            	// Get the lowest available file name.
-            	int fileNum = 0;
-            	File imageFile = new File("screenshot_" + fileNum + ".png");
-            	while(imageFile.exists()) {
-            		fileNum++;
-            		imageFile = new File("screenshot_" + fileNum + ".png");
-            	}
-            	
-            	// Save the image to a PNG file.
-            	try { ImageIO.write(screenshot, "PNG", imageFile); }
-            	catch(IOException ioe) {
-            		System.err.println("Error saving file \"screenshot.png\".");
-            	}
-            	System.out.println("Screenshot saved to: " + imageFile.getAbsolutePath());
+                // Make a new buffered image on which to draw the content pane.
+                BufferedImage screenshot = new BufferedImage(getContentPane().getWidth(),
+                        getContentPane().getHeight(), BufferedImage.TYPE_INT_ARGB);
+                
+                // Paint the content pane to image.
+                getContentPane().paint(screenshot.getGraphics());
+                
+                // Get the lowest available file name.
+                int fileNum = 0;
+                File imageFile = new File("screenshot_" + fileNum + ".png");
+                while(imageFile.exists()) {
+                    fileNum++;
+                    imageFile = new File("screenshot_" + fileNum + ".png");
+                }
+                
+                // Save the image to a PNG file.
+                try { ImageIO.write(screenshot, "PNG", imageFile); }
+                catch(IOException ioe) {
+                    System.err.println("Error saving file \"screenshot.png\".");
+                }
+                System.out.println("Screenshot saved to: " + imageFile.getAbsolutePath());
             }
             
             // Otherwise, print out the key code for the pressed key.
             else { System.out.printf("Key Code: %d%n", e.getKeyCode()); }
         }
         
+        @Override
         public void keyTyped(KeyEvent e) { }
     }
 }

Modified: java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/POccupancyViewer.java
 =============================================================================
--- java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/POccupancyViewer.java	(original)
+++ java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/POccupancyViewer.java	Sun Nov  2 13:30:41 2014
@@ -16,100 +16,93 @@
  * @author Kyle McCarty
  */
 public class POccupancyViewer extends PassiveViewer {
-	private static final long serialVersionUID = 3712604287904215617L;
-	// Store the number of hits for each crystal.
-	private long[][] hits;
-	// Store the total number of events read.
-	private long events = 0;
-	// Stores hit objects.
-	protected ArrayList<EcalHit> hitList = new ArrayList<EcalHit>();
-	
-	/**
-	 * <b>POccupancyViewer</b><br/><br/>
-     * <code>public <b>POccupancyViewer</b>(int updateRate, boolean resetAtUpdate)</code><br/><br/>
+    private static final long serialVersionUID = 3712604287904215617L;
+    // Store the number of hits for each crystal.
+    private long[][] hits;
+    // Store the total number of events read.
+    private long events = 0;
+    // Stores hit objects.
+    protected ArrayList<EcalHit> hitList = new ArrayList<EcalHit>();
+    
+    /**
      * Initializes a <code>Viewer</code> window that displays will
      * occupancies from a data stream.
-	 */
-	public POccupancyViewer() {
-		// Set the title and scale.
-		setTitle("HPS Calorimeter Occupancies");
-		ecalPanel.setScaleMaximum(1.0);
-		
-		// Initialize the hit counts array.
-		Dimension ecalSize = ecalPanel.getCrystalBounds();
-		hits = new long[ecalSize.width][ecalSize.height];
-	}
+     */
+    public POccupancyViewer() {
+        // Set the title and scale.
+        setTitle("HPS Calorimeter Occupancies");
+        ecalPanel.setScaleMaximum(1.0);
+        
+        // Initialize the hit counts array.
+        Dimension ecalSize = ecalPanel.getCrystalBounds();
+        hits = new long[ecalSize.width][ecalSize.height];
+    }
     
-	public void addHit(EcalHit hit) {
-		// Get the panel coordinates of the hit.
-		int ix = toPanelX(hit.getX());
-		int iy = toPanelY(hit.getY());
-		
-		// Increment the hit count at the indicated location.
-		hits[ix][iy]++;
-	}
-	
-	/**
-	 * <b>addCluster</b><br/><br/>
-	 * <code>public void <b>addCluster</b>(Cluster cluster)</code><br/><br/>
-	 * Adds a new cluster to the display.<br/><br/>
-	 * <b>Note:</b> This operation is not supported for occupancies.
-	 */
-	public void addCluster(Cluster cluster) { }
-	
-	/**
-	 * <b>removeHit</b><br/><br/>
-	 * <code>public void <b>removeHit</b>(EcalHit hit)</code><br/><br/>
-	 * Removes a hit from the display.
-	 * @param hit - The hit to be removed.
-	 */
-	public void removeHit(EcalHit hit) {
-		// Get the panel coordinates of the hit.
-		int ix = toPanelX(hit.getX());
-		int iy = toPanelY(hit.getY());
-		
-		// Decrement the hit count at the indicated location.
-		hits[ix][iy]--;
-	}
-	
-	public void resetDisplay() { hitList.clear(); }
-	
-	/**
-	 * <b>incrementEventCount</b><br/><br/>
-	 * <code>public void <b>incrementEventCount</b>(int amount)</code><br/><br/>
-	 * Increments the number of events represented by the current data
-	 * set by the indicated amount. Note that this may be negative to
-	 * reduce the number of events.
-	 * @param amount - The number of events to add.
-	 */
-	public void incrementEventCount(int amount) { events += amount; }
-	
-	/**
-	 * <b>updateDisplay</b><br/><br/>
-	 * <code>public void <b>updateDisplay</b>()</code><br/><br/>
-	 * Displays the hits and clusters added by the <code>addHit</code>
-	 * and <code>addCluster</code> methods.
-	 */
-	public void updateDisplay() { 
+    @Override
+    public void addHit(EcalHit hit) {
+        // Get the panel coordinates of the hit.
+        int ix = toPanelX(hit.getX());
+        int iy = toPanelY(hit.getY());
+        
+        // Increment the hit count at the indicated location.
+        hits[ix][iy]++;
+    }
+    
+    /**
+     * Adds a new cluster to the display.<br/><br/>
+     * <b>Note:</b> This operation is not supported for occupancies.
+     */
+    public void addCluster(Cluster cluster) { }
+    
+    /**
+     * Removes a hit from the display.
+     * @param hit - The hit to be removed.
+     */
+    public void removeHit(EcalHit hit) {
+        // Get the panel coordinates of the hit.
+        int ix = toPanelX(hit.getX());
+        int iy = toPanelY(hit.getY());
+        
+        // Decrement the hit count at the indicated location.
+        hits[ix][iy]--;
+    }
+    
+    @Override
+    public void resetDisplay() { hitList.clear(); }
+    
+    /**
+     * Increments the number of events represented by the current data
+     * set by the indicated amount. Note that this may be negative to
+     * reduce the number of events.
+     * @param amount - The number of events to add.
+     */
+    public void incrementEventCount(int amount) { events += amount; }
+    
+    /**
+     * Displays the hits and clusters added by the <code>addHit</code>
+     * and <code>addCluster</code> methods.
+     */
+    @Override
+    public void updateDisplay() { 
         // Build a "hit list" from the occupancies.
         for(int x = 0; x < hits.length; x++) {
-        	for(int y = 0; y < hits[0].length; y++) {
-        		// Don't bother performing calculations or building
-        		// any objects if there are zero hits.
-        		if(hits[x][y] != 0) {
-        			// Define the crystal ID and "energy."
-        			Point cid = new Point(x, y);
-        			double occupancy = ((double) hits[x][y]) / events;
-        			
-        			// Add a "hit" formed from these values.
-        			hitList.add(new EcalHit(cid, occupancy));
-        		}
-        	}
+            for(int y = 0; y < hits[0].length; y++) {
+                // Don't bother performing calculations or building
+                // any objects if there are zero hits.
+                if(hits[x][y] != 0) {
+                    // Define the crystal ID and "energy."
+                    Point cid = new Point(x, y);
+                    double occupancy = ((double) hits[x][y]) / events;
+                    
+                    // Add a "hit" formed from these values.
+                    hitList.add(new EcalHit(cid, occupancy));
+                }
+            }
         }
         
-		// Suppress the calorimeter panel's redrawing.
-		ecalPanel.setSuppressRedraw(true);
-		
+        // Suppress the calorimeter panel's redrawing.
+        ecalPanel.setSuppressRedraw(true);
+        
         // Display the hits.
         for (EcalHit h : hitList) {
             int ix = toPanelX(h.getX());
@@ -123,5 +116,5 @@
         
         // Update the status panel to account for the new event.
         updateStatusPanel();
-	}
+    }
 }

Modified: java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/PassiveViewer.java
 =============================================================================
--- java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/PassiveViewer.java	(original)
+++ java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/PassiveViewer.java	Sun Nov  2 13:30:41 2014
@@ -20,94 +20,94 @@
  * @author Kyle McCarty
  */
 public abstract class PassiveViewer extends Viewer {
-	private static final long serialVersionUID = -7479125553259270894L;
-	// Stores whether the background color is set or not.
-	private boolean background = false;
-	
-	/**
-	 * <b>PassiveViewer</b><br/><br/>
-	 * <code>public <b>PassiveViewer</b>(String... fieldValues)</code><br/><br/>
-	 * @param fieldValues
-	 */
-	public PassiveViewer(String... fieldValues) {
-		// Pass the field values to the superclass.
-		super(fieldValues);
-		
-		// Set the key bindings.
-		addKeyListener(new EcalKeyListener());
-	}
-	
-	/**
-	 * <b>addHit</b><br/><br/>
-	 * <code>public void <b>addHit</b>(EcalHit hit)</code><br/><br/>
-	 * Adds a new hit to the display.
-	 * @param hit - The hit to be added.
-	 */
-	public abstract void addHit(EcalHit hit);
-	
-	/**
-	 * <b>addCluster</b><br/><br/>
-	 * <code>public void <b>addCluster</b>(Cluster cluster)</code><br/><br/>
-	 * Adds a new cluster to the display.
-	 * @param cluster - The cluster to be added.
-	 */
-	public abstract void addCluster(Cluster cluster);
-	
-	/**
-	 * <b>resetDisplay</b><br/><br/>
-	 * <code>public void <b>resetDisplay</b>()</code><br/><br/>
-	 * Clears any hits or clusters that have been added to the viewer.
-	 * Note that this does not automatically update the displayed panel.
-	 * <code>updateDisplay</code> must be called separately.
-	 */
-	public abstract void resetDisplay();
-	
-	/**
-	 * <b>setScale</b><br/><br/>
-	 * <code>public void <b>setScale</b>(int min, int max)</code><br/><br/>
-	 * Sets the upper and lower bounds of for the calorimeter display's
-	 * color mapping scale.
-	 * @param min - The lower bound.
-	 * @param max - The upper bound.
-	 */
-	public void setScale(int min, int max) {
-		ecalPanel.setScaleMinimum(min);
-		ecalPanel.setScaleMaximum(max);
-	}
-	
-	/**
-	 * <b>setScaleMaximum</b><br/><br/>
-	 * <code>public void <b>setScaleMaximum</b>(int max)</code><br/><br/>
-	 * Sets the upper bound for the calorimeter display's color mapping
-	 * scale.
-	 * @param max - The upper bound.
-	 */
-	public void setScaleMaximum(int max) { ecalPanel.setScaleMaximum(max); }
-	
-	/**
-	 * <b>setScaleMinimum</b><br/><br/>
-	 * <code>public void <b>setScaleMinimum</b>(int min)</code><br/><br/>
-	 * Sets the lower bound for the calorimeter display's color mapping
-	 * scale.
-	 * @param min - The lower bound.
-	 */
-	public void setScaleMinimum(int min) { ecalPanel.setScaleMinimum(min); }
-	
-	/**
-	 * <b>updateDisplay</b><br/><br/>
-	 * <code>public void <b>updateDisplay</b>()</code><br/><br/>
-	 * Displays the hits and clusters added by the <code>addHit</code>
-	 * and <code>addCluster</code> methods.
-	 */
-	public abstract void updateDisplay();
-	
+    private static final long serialVersionUID = -7479125553259270894L;
+    // Stores whether the background color is set or not.
+    private boolean background = false;
+    
+    /**
+     * <b>PassiveViewer</b><br/><br/>
+     * <code>public <b>PassiveViewer</b>(String... fieldValues)</code><br/><br/>
+     * @param fieldValues
+     */
+    public PassiveViewer() {
+        // Initialize the superclass.
+        super();
+        
+        // Set the key bindings.
+        addKeyListener(new EcalKeyListener());
+    }
+    
+    /**
+     * <b>addHit</b><br/><br/>
+     * <code>public void <b>addHit</b>(EcalHit hit)</code><br/><br/>
+     * Adds a new hit to the display.
+     * @param hit - The hit to be added.
+     */
+    public abstract void addHit(EcalHit hit);
+    
+    /**
+     * <b>addCluster</b><br/><br/>
+     * <code>public void <b>addCluster</b>(Cluster cluster)</code><br/><br/>
+     * Adds a new cluster to the display.
+     * @param cluster - The cluster to be added.
+     */
+    public abstract void addCluster(Cluster cluster);
+    
+    /**
+     * <b>resetDisplay</b><br/><br/>
+     * <code>public void <b>resetDisplay</b>()</code><br/><br/>
+     * Clears any hits or clusters that have been added to the viewer.
+     * Note that this does not automatically update the displayed panel.
+     * <code>updateDisplay</code> must be called separately.
+     */
+    public abstract void resetDisplay();
+    
+    /**
+     * <b>setScale</b><br/><br/>
+     * <code>public void <b>setScale</b>(int min, int max)</code><br/><br/>
+     * Sets the upper and lower bounds of for the calorimeter display's
+     * color mapping scale.
+     * @param min - The lower bound.
+     * @param max - The upper bound.
+     */
+    public void setScale(int min, int max) {
+        ecalPanel.setScaleMinimum(min);
+        ecalPanel.setScaleMaximum(max);
+    }
+    
+    /**
+     * <b>setScaleMaximum</b><br/><br/>
+     * <code>public void <b>setScaleMaximum</b>(int max)</code><br/><br/>
+     * Sets the upper bound for the calorimeter display's color mapping
+     * scale.
+     * @param max - The upper bound.
+     */
+    public void setScaleMaximum(int max) { ecalPanel.setScaleMaximum(max); }
+    
+    /**
+     * <b>setScaleMinimum</b><br/><br/>
+     * <code>public void <b>setScaleMinimum</b>(int min)</code><br/><br/>
+     * Sets the lower bound for the calorimeter display's color mapping
+     * scale.
+     * @param min - The lower bound.
+     */
+    public void setScaleMinimum(int min) { ecalPanel.setScaleMinimum(min); }
+    
+    /**
+     * <b>updateDisplay</b><br/><br/>
+     * <code>public void <b>updateDisplay</b>()</code><br/><br/>
+     * Displays the hits and clusters added by the <code>addHit</code>
+     * and <code>addCluster</code> methods.
+     */
+    public abstract void updateDisplay();
+    
     /**
      * The <code>EcalListener</code> class binds keys to actions.
      * Bound actions include:
      * b             :: Toggle color-mapping for 0 energy crystals
      * h             :: Toggle selected crystal highlighting
      * l             :: Toggle logarithmic versus linear scaling
-     * s			 :: Saves the current display to a file
+     * s             :: Saves the current display to a file
      **/
     private class EcalKeyListener implements KeyListener {
         public void keyPressed(KeyEvent e) { }
@@ -115,9 +115,9 @@
         public void keyReleased(KeyEvent e) {
             // 'b' toggles the default white background.
             if(e.getKeyCode() == 66) {
-            	if(background) { ecalPanel.setDefaultCrystalColor(null); }
-            	else { ecalPanel.setDefaultCrystalColor(Color.GRAY); }
-            	background = !background;
+                if(background) { ecalPanel.setDefaultCrystalColor(null); }
+                else { ecalPanel.setDefaultCrystalColor(Color.GRAY); }
+                background = !background;
             }
             
             // 'h' toggles highlighting the crystal under the cursor.
@@ -125,33 +125,33 @@
             
             // 'l' toggles linear or logarithmic scaling.
             else if(e.getKeyCode() == 76) {
-            	if(ecalPanel.isScalingLinear()) { ecalPanel.setScalingLogarithmic(); }
-            	else { ecalPanel.setScalingLinear(); }
+                if(ecalPanel.isScalingLinear()) { ecalPanel.setScalingLogarithmic(); }
+                else { ecalPanel.setScalingLinear(); }
             }
             
             // 's' saves the panel to a file.
             else if(e.getKeyCode() == 83) {
-            	// Make a new buffered image on which to draw the content pane.
-            	BufferedImage screenshot = new BufferedImage(getContentPane().getWidth(),
-            			getContentPane().getHeight(), BufferedImage.TYPE_INT_ARGB);
-            	
-            	// Paint the content pane to image.
-            	getContentPane().paint(screenshot.getGraphics());
-            	
-            	// Get the lowest available file name.
-            	int fileNum = 0;
-            	File imageFile = new File("screenshot_" + fileNum + ".png");
-            	while(imageFile.exists()) {
-            		fileNum++;
-            		imageFile = new File("screenshot_" + fileNum + ".png");
-            	}
-            	
-            	// Save the image to a PNG file.
-            	try { ImageIO.write(screenshot, "PNG", imageFile); }
-            	catch(IOException ioe) {
-            		System.err.println("Error saving file \"screenshot.png\".");
-            	}
-            	System.out.println("Screenshot saved to: " + imageFile.getAbsolutePath());
+                // Make a new buffered image on which to draw the content pane.
+                BufferedImage screenshot = new BufferedImage(getContentPane().getWidth(),
+                        getContentPane().getHeight(), BufferedImage.TYPE_INT_ARGB);
+                
+                // Paint the content pane to image.
+                getContentPane().paint(screenshot.getGraphics());
+                
+                // Get the lowest available file name.
+                int fileNum = 0;
+                File imageFile = new File("screenshot_" + fileNum + ".png");
+                while(imageFile.exists()) {
+                    fileNum++;
+                    imageFile = new File("screenshot_" + fileNum + ".png");
+                }
+                
+                // Save the image to a PNG file.
+                try { ImageIO.write(screenshot, "PNG", imageFile); }
+                catch(IOException ioe) {
+                    System.err.println("Error saving file \"screenshot.png\".");
+                }
+                System.out.println("Screenshot saved to: " + imageFile.getAbsolutePath());
             }
             
             // Otherwise, print out the key code for the pressed key.

Modified: java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/StatusPanel.java
 =============================================================================
--- java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/StatusPanel.java	(original)
+++ java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/StatusPanel.java	Sun Nov  2 13:30:41 2014
@@ -9,188 +9,180 @@
 
 /**
  * Class <code>StatusPanel</code> displays text in a set of fields.
+ * This class is being phased out in favor of <code>ResizableFieldPanel
+ * </code> and should no longer be used. It will be removed next update.
  *
  * @author Kyle McCarty
  */
+@Deprecated
 public class StatusPanel extends JPanel {
-	private static final long serialVersionUID = -8353479383875379010L;
-	// The panel that displays behind the status field.
-	private BackPanel background = new BackPanel();
-	// The status fields. The first array index represents which status
-	// field and the second is always of size two, with index 0 mapping
-	// to the label that displays the field name and index 1 mapping to
-	// the label displaying the field value.
-	private JLabel[][] field;
-	// Spacing variables for panel layout.
-	private int leftBuffer = 10;
-	private int upperBuffer = 10;
-	
-	/**
-	 * <b>NULL_VALUE</b><br/><br/>
-	 * <code><b>static final String <b>NULL_VALUE</b></code><br/><br/>
-	 * A <code>String</code> representing the default value to be
-	 * displayed on the status panel whenever there is no value for
-	 * that field.
-	 */
-	static final String NULL_VALUE = "---";
-	
-	/**
-	 * <b>StatusPanel</b><br/><br/>
-	 * <code>public <b>StatusPanel</b>(String... fieldName)</code><br/><br/>
-	 * Creates a new status panel with display fields with the indicated
-	 * names. They will be assigned a field index in the order that they
-	 * are given starting with zero.
-	 * @param fieldName - The names of the fields to display.
-	 */
-	public StatusPanel(String... fieldName) {
-		// Initialize the component.
-		super();
-		
-		// Set the layout manager to manual.
-		setLayout(null);
-		
-		// Build the text fields.
-		int curZ = 0;
-		field = new JLabel[fieldName.length][2];
-		for(int i = 0; i < field.length; i++) {
-			for(int j = 0; j < field[i].length; j++) {
-				field[i][j] = new JLabel();
-				field[i][j].setOpaque(true);
-				field[i][j].setBackground(Color.WHITE);
-				add(field[i][j]);
-				setComponentZOrder(field[i][j], curZ);
-				curZ++;
-			}
-			field[i][0].setText(fieldName[i] + ":   ");
-			field[i][0].setHorizontalAlignment(JLabel.RIGHT);
-		}
-		
-		// Start the fields as null by default.
-		clearValues();
-		
-		// Build the background panel.
-		add(background);
-		setComponentZOrder(background, curZ);
-	}
-	
-	/**
-	 * <b>clearValues</b><br/><br/>
-	 * <code>public void <b>clearValues</b>()</code><br/><br/>
-	 * Sets all of the fields on the status display to the null value.
-	 */
-	public void clearValues() {
-		for(int i = 0; i < field.length; i++) {
-			field[i][1].setText(NULL_VALUE);
-		}
-	}
-	
-	/**
-	 * <b>setFieldValue</b><br/><br/>
-	 * Sets the value of the indicated field.
-	 * @param index - The field's index.
-	 * @param value - The new value to display.
-	 * @throws IndexOutOfBoundsException Occurs when the field index
-	 * is neither more than the existing number of fields or is negative.
-	 */
-	public void setFieldValue(int index, String value) throws IndexOutOfBoundsException {
-		if(index >= 0 && index < field.length) {
-			if(value == null) { field[index][1].setText(NULL_VALUE); }
-			else  { field[index][1].setText(value); }
-		}
-		else { throw new IndexOutOfBoundsException("Invalid field index."); }
-	}
-	
-	public void setSize(int width, int height) {
-		super.setSize(width, height);
-		resize();
-	}
-	
-	public void setSize(Dimension d) {
-		super.setSize(d);
-		resize();
-	}
-	
-	/**
-	 *<b>getNextX</b><br/><br/>
-	 * <code>private int <b>getNextX</b>(Component c)</code><br/><br/>
-	 * Finds the x-coordinate immediately after the component.
-	 * @param c - The component of which to find the end.
-	 * @return Returns the x-coordinate at the end of the component. 
-	 */
-	private final static int getNextX(Component c) { return getNextX(c, 0); }
-	
-	/**
-	/**
-	 *<b>getNextX</b><br/><br/>
-	 * <code>private int <b>getNextX</b>(Component c, int buffer)</code><br/><br/>
-	 * Finds the x-coordinate after the component with a given buffer.
-	 * @param c - The component of which to find the end.
-	 * @param buffer - The extra space after the component to be included.
-	 * @return Returns the x-coordinate at the end of the component,
-	 * with a buffer length.
-	 */
-	private final static int getNextX(Component c, int buffer) {
-		return c.getX() + c.getWidth() + buffer;
-	}
-	
-	/**
-	 * <b>resize</b><br/><br/>
-	 * <code>private void <b>resize</b>()</code><br/><br/>
-	 * Updates the layout of the component to the panel's current size.
-	 */
-	private void resize() {
-		// Define the width an height as convenience variables.
-		int width = getWidth();
-		int height = getHeight();
-		
-		// Size the background panel.
-		background.setBounds(0, 0, width, height);
-		
-		// Size and place the text labels.
-		if(field.length != 0) {
-			int labelHeight = (height - (int)(upperBuffer + 5)) / 3;
-			int labelRem = (height - upperBuffer - 8) % field.length;
-			int curX = leftBuffer;
-			int curY = (int)(upperBuffer + 2);
-			for(int i = 0; i < field.length; i++) {
-				// Determine the appropriate field height.
-				int thisHeight = labelHeight;
-				if(labelRem > 0) {
-					thisHeight++;
-					labelRem--;
-				}
-				
-				// Place the field.
-				field[i][0].setBounds(curX, curY, 130, thisHeight);
-				field[i][1].setBounds(getNextX(field[i][0]), curY, 75, thisHeight);
-				
-				// If we have written three labels, then start a new column.
-				if(i % 3 == 2) {
-					curX = getNextX(field[i][1], 10);
-					curY = (int)(upperBuffer + 2);
-				}
-				
-				// Otherwise just increment the current height.
-				else { curY += thisHeight; }
-			}
-		}
-	}
-	
-	/**
-	 * Class <code>BackPanel</code> simply renders the background panel
-	 * for the status panel.
-	 */
-	private class BackPanel extends JPanel {
-		private static final long serialVersionUID = 4997805650267243080L;
+    private static final long serialVersionUID = -8353479383875379010L;
+    // The panel that displays behind the status field.
+    private BackPanel background = new BackPanel();
+    // The status fields. The first array index represents which status
+    // field and the second is always of size two, with index 0 mapping
+    // to the label that displays the field name and index 1 mapping to
+    // the label displaying the field value.
+    private JLabel[][] field;
+    // Spacing variables for panel layout.
+    private int leftBuffer = 10;
+    private int upperBuffer = 10;
+    
+    /**
+     * A <code>String</code> representing the default value to be
+     * displayed on the status panel whenever there is no value for
+     * that field.
+     */
+    static final String NULL_VALUE = "---";
+    
+    /**
+     * Creates a new status panel with display fields with the indicated
+     * names. They will be assigned a field index in the order that they
+     * are given starting with zero.
+     * @param fieldName - The names of the fields to display.
+     */
+    public StatusPanel(String... fieldName) {
+        // Initialize the component.
+        super();
+        
+        // Set the layout manager to manual.
+        setLayout(null);
+        
+        // Build the text fields.
+        int curZ = 0;
+        field = new JLabel[fieldName.length][2];
+        for(int i = 0; i < field.length; i++) {
+            for(int j = 0; j < field[i].length; j++) {
+                field[i][j] = new JLabel();
+                field[i][j].setOpaque(true);
+                field[i][j].setBackground(Color.WHITE);
+                add(field[i][j]);
+                setComponentZOrder(field[i][j], curZ);
+                curZ++;
+            }
+            field[i][0].setText(fieldName[i] + ":   ");
+            field[i][0].setHorizontalAlignment(JLabel.RIGHT);
+        }
+        
+        // Start the fields as null by default.
+        clearValues();
+        
+        // Build the background panel.
+        add(background);
+        setComponentZOrder(background, curZ);
+    }
+    
+    /**
+     * Sets all of the fields on the status display to the null value.
+     */
+    public void clearValues() {
+        for(int i = 0; i < field.length; i++) {
+            field[i][1].setText(NULL_VALUE);
+        }
+    }
+    
+    /**
+     * Sets the value of the indicated field.
+     * @param index - The field's index.
+     * @param value - The new value to display.
+     * @throws IndexOutOfBoundsException Occurs when the field index
+     * is neither more than the existing number of fields or is negative.
+     */
+    public void setFieldValue(int index, String value) throws IndexOutOfBoundsException {
+        if(index >= 0 && index < field.length) {
+            if(value == null) { field[index][1].setText(NULL_VALUE); }
+            else  { field[index][1].setText(value); }
+        }
+        else { throw new IndexOutOfBoundsException("Invalid field index."); }
+    }
+    
+    @Override
+    public void setSize(int width, int height) {
+        super.setSize(width, height);
+        resize();
+    }
+    
+    @Override
+    public void setSize(Dimension d) {
+        super.setSize(d);
+        resize();
+    }
+    
+    /**
+     * Finds the x-coordinate immediately after the component.
+     * @param c - The component of which to find the end.
+     * @return Returns the x-coordinate at the end of the component. 
+     */
+    private final static int getNextX(Component c) { return getNextX(c, 0); }
+    
+    /**
+    /**
+     * Finds the x-coordinate after the component with a given buffer.
+     * @param c - The component of which to find the end.
+     * @param buffer - The extra space after the component to be included.
+     * @return Returns the x-coordinate at the end of the component,
+     * with a buffer length.
+     */
+    private final static int getNextX(Component c, int buffer) {
+        return c.getX() + c.getWidth() + buffer;
+    }
+    
+    /**
+     * Updates the layout of the component to the panel's current size.
+     */
+    private void resize() {
+        // Define the width an height as convenience variables.
+        int width = getWidth();
+        int height = getHeight();
+        
+        // Size the background panel.
+        background.setBounds(0, 0, width, height);
+        
+        // Size and place the text labels.
+        if(field.length != 0) {
+            int labelHeight = (height - (int)(upperBuffer + 5)) / 3;
+            int labelRem = (height - upperBuffer - 8) % field.length;
+            int curX = leftBuffer;
+            int curY = (int)(upperBuffer + 2);
+            for(int i = 0; i < field.length; i++) {
+                // Determine the appropriate field height.
+                int thisHeight = labelHeight;
+                if(labelRem > 0) {
+                    thisHeight++;
+                    labelRem--;
+                }
+                
+                // Place the field.
+                field[i][0].setBounds(curX, curY, 130, thisHeight);
+                field[i][1].setBounds(getNextX(field[i][0]), curY, 75, thisHeight);
+                
+                // If we have written three labels, then start a new column.
+                if(i % 3 == 2) {
+                    curX = getNextX(field[i][1], 10);
+                    curY = (int)(upperBuffer + 2);
+                }
+                
+                // Otherwise just increment the current height.
+                else { curY += thisHeight; }
+            }
+        }
+    }
+    
+    /**
+     * Class <code>BackPanel</code> simply renders the background panel
+     * for the status panel.
+     */
+    private class BackPanel extends JPanel {
+        private static final long serialVersionUID = 4997805650267243080L;
 
-		public void paint(Graphics g) {
-			// Render the panel background.
-			g.setColor(Color.WHITE);
-			g.fillRect(0, upperBuffer, getWidth(), getHeight() - upperBuffer);
-			g.setColor(Color.GRAY);
-			g.drawRect(0, upperBuffer, getWidth() - 1, getHeight() - upperBuffer - 1);
-			g.setColor(Color.LIGHT_GRAY);
-			g.drawRect(1, upperBuffer + 1, getWidth() - 3, getHeight() - upperBuffer - 3);
-		}
-	}
+        public void paint(Graphics g) {
+            // Render the panel background.
+            g.setColor(Color.WHITE);
+            g.fillRect(0, upperBuffer, getWidth(), getHeight() - upperBuffer);
+            g.setColor(Color.GRAY);
+            g.drawRect(0, upperBuffer, getWidth() - 1, getHeight() - upperBuffer - 1);
+            g.setColor(Color.LIGHT_GRAY);
+            g.drawRect(1, upperBuffer + 1, getWidth() - 3, getHeight() - upperBuffer - 3);
+        }
+    }
 }

Modified: java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/Viewer.java
 =============================================================================
--- java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/Viewer.java	(original)
+++ java/branches/trunk_20141031/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/Viewer.java	Sun Nov  2 13:30:41 2014
@@ -11,6 +11,7 @@
 import java.text.DecimalFormat;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.Map;
 import java.util.NoSuchElementException;
 
 import javax.swing.JFrame;
@@ -30,7 +31,7 @@
     // Java-suggested variable.
     private static final long serialVersionUID = -2022819652687941812L;
     // A map of field names to field indices.
-    private final HashMap<String, Integer> fieldMap = new HashMap<String, Integer>();
+    private Map<String, Integer> fieldMap = new HashMap<String, Integer>();
     // A list of crystal listeners attached to the viewer.
     private ArrayList<CrystalListener> listenerList = new ArrayList<CrystalListener>();
     // The default field names.
@@ -41,33 +42,25 @@
     private static final int CELL_VALUE = 2;
     
     /**
-     * <b><statusPanel/b><br/><br/>
-     * <code>protected final StatusPanel <b>statusPanel</b></code><br/><br/>
      * The component responsible for displaying status information 
      * about the currently selected crystal.
      */
-    protected final StatusPanel statusPanel;
-    
-    /**
-     * <b>ecalPanel</b><br/><br/>
-     * <code>protected final CalorimeterPanel <b>ecalPanel</b></code><br/><br/>
+    protected final ResizableFieldPanel statusPanel;
+    
+    /**
      * The panel displaying the calorimeter crystals and scale.
      */
     protected final CalorimeterPanel ecalPanel = new CalorimeterPanel(46, 11);
-	
-    /**
-     * <b>HIGHLIGHT_CLUSTER_COMPONENT</b><br/><br/>
-     * <code>public static final Color <b>HIGHLIGHT_CLUSTER_COMPONENT</b></code><br/><br/>
+    
+    /**
      * The default color for highlighting cluster components.
      */
-	public static final Color HIGHLIGHT_CLUSTER_COMPONENT = Color.RED;
-	
-	/**
-	 * <b>HIGHLIGHT_CLUSTER_SHARED</b><br/><br/>
-     * <code>public static final Color <b>HIGHLIGHT_CLUSTER_SHARED</b></code><br/><br/>
+    public static final Color HIGHLIGHT_CLUSTER_COMPONENT = Color.RED;
+    
+    /**
      * The default color for highlighting cluster shared hits.
-	 */
-	public static final Color HIGHLIGHT_CLUSTER_SHARED = Color.YELLOW;
+     */
+    public static final Color HIGHLIGHT_CLUSTER_SHARED = Color.YELLOW;
     
     /**
      * Initializes the viewer window and calorimeter panel.
@@ -76,29 +69,20 @@
      * @throws NullPointerException Occurs if any of the additional field
      * arguments are <code>null</code>.
      **/
-    public Viewer(String... statusFields) throws NullPointerException {
+    public Viewer() throws NullPointerException {
         // Initialize the underlying JPanel.
         super();
         
-        // Define the status panel fields and map them to indices.
-        String[] fields = new String[statusFields.length + defaultFields.length];
-        for(int i = 0; i < defaultFields.length; i++) {
-        	fields[i] = defaultFields[i];
-        	fieldMap.put(defaultFields[i], i);
-        }
-        for(int i = 0; i < statusFields.length; i++) {
-        	int index = i + defaultFields.length;
-        	fields[index] = statusFields[i];
-        	fieldMap.put(statusFields[i], index);
-        }
-        
         // Generate the status panel.
-        statusPanel = new StatusPanel(fields);
+        statusPanel = new ResizableFieldPanel(100);
+        statusPanel.setBackground(Color.WHITE);
+        
+        // Add the default fields.
+        for(String field : defaultFields) { addStatusField(field); }
         
         // Set the scaling settings.
-        ecalPanel.setScaleMinimum(0.00001);
-        ecalPanel.setScaleMaximum(3);
-       // ecalPanel.setScalingLogarithmic();
+        ecalPanel.setScaleMinimum(0.001);
+        ecalPanel.setScaleMaximum(3.0);
         ecalPanel.setScalingLinear();
         
         // Disable the crystals in the calorimeter panel along the beam gap.
@@ -137,7 +121,28 @@
      * @param cl - The listener to add.
      */
     public void addCrystalListener(CrystalListener cl) {
-    	if(cl != null) { listenerList.add(cl); }
+        if(cl != null) { listenerList.add(cl); }
+    }
+    
+    /**
+     * Adds a new field to the status panel.
+     * @param fieldName - The name to display for the field and that
+     * links to the field when calling <code>setStatusField</code>.
+     */
+    protected void addStatusField(String fieldName) {
+        fieldMap.put(fieldName, statusPanel.getFieldCount());
+        statusPanel.addField(fieldName);
+    }
+    
+    /**
+     * Inserts the field at the indicated location on the status panel.
+     * @param index - The index at which to insert the field.
+     * @param fieldName - The name to display for the field and that
+     * links to the field when calling <code>setStatusField</code>.
+     */
+    protected void insertStatusField(int index, String fieldName) {
+        statusPanel.insertField(index, fieldName);
+        fieldMap = statusPanel.getFieldNameIndexMap();
     }
     
     /**
@@ -147,14 +152,14 @@
      * @return Returns the coordinate pair in LCSim's coordinate system
      * as an <code>int</code>.
      **/
-	public static final Point toEcalPoint(Point panelPoint) {
-		// Convert the point coordinates.
-		int ix = toEcalX(panelPoint.x);
-		int iy = toEcalY(panelPoint.y);
-		
-		// Return the new point.
-		return new Point(ix, iy);
-	}
+    public static final Point toEcalPoint(Point panelPoint) {
+        // Convert the point coordinates.
+        int ix = toEcalX(panelPoint.x);
+        int iy = toEcalY(panelPoint.y);
+        
+        // Return the new point.
+        return new Point(ix, iy);
+    }
     
     /**
      * Converts the panel x-coordinate to the calorimeter's
@@ -164,8 +169,8 @@
      * coordinate system as an <code>int</code>.
      */
     public static final int toEcalX(int panelX) {
-    	if(panelX > 22) { return panelX - 22; }
-    	else { return panelX - 23; }
+        if(panelX > 22) { return panelX - 22; }
+        else { return panelX - 23; }
     }
     
     /**
@@ -184,14 +189,14 @@
      * @return Returns the coordinate pair in the calorimeter panel's
      * coordinate system as an <code>int</code>.
      **/
-	public static final Point toPanelPoint(Point ecalPoint) {
-		// Convert the point coordinates.
-		int ix = toPanelX(ecalPoint.x);
-		int iy = toPanelY(ecalPoint.y);
-		
-		// Return the new point.
-		return new Point(ix, iy);
-	}
+    public static final Point toPanelPoint(Point ecalPoint) {
+        // Convert the point coordinates.
+        int ix = toPanelX(ecalPoint.x);
+        int iy = toPanelY(ecalPoint.y);
+        
+        // Return the new point.
+        return new Point(ix, iy);
+    }
     
     /**
      * Converts the LCSim x-coordinate to the calorimeter panel's
@@ -238,7 +243,7 @@
      * @param cl - The listener to remove.
      */
     public void removeCrystalListener(CrystalListener cl) {
-    	if(cl != null) { listenerList.remove(cl); }
+        if(cl != null) { listenerList.remove(cl); }
     }
     
     public void setSize(int width, int height) {
@@ -259,44 +264,46 @@
      * is provided for argument <code>fieldName</code>.
      */
     public final void setStatusField(String fieldName, String value) throws NoSuchElementException {
-    	// Get the index for the indicated field.
-    	Integer index = fieldMap.get(fieldName);
-    	
-    	// If it is null, the field does not exist.
-    	if(index == null) { throw new NoSuchElementException("Field \"" + fieldName + "\" does not exist."); }
-    	
-    	// Otherwise, set the field.
-    	else { statusPanel.setFieldValue(index, value); }
-    }
-    
-	/**
-	 * Updates the information on the status panel to match that of
-	 * the calorimeter panel's currently selected crystal.
-	 */
-	protected void updateStatusPanel() {
-		// Get the currently selected crystal.
-		Point crystal = ecalPanel.getSelectedCrystal();
-		
-		// If the crystal is null, there is no selection.
-		if(crystal == null || ecalPanel.isCrystalDisabled(crystal.x, crystal.y)) { statusPanel.clearValues(); }
-		
-		// Otherwise, write the crystal's data to the panel.
-		else {
-			setStatusField(defaultFields[X_INDEX], String.valueOf(toEcalX(crystal.x)));
-			setStatusField(defaultFields[Y_INDEX], String.valueOf(toEcalY(crystal.y)));
-			DecimalFormat formatter = new DecimalFormat("0.####E0");
-			String energy = formatter.format(ecalPanel.getCrystalEnergy(crystal.x, crystal.y));
-			setStatusField(defaultFields[CELL_VALUE], energy);
-		}
-	}
+        // Get the index for the indicated field.
+        Integer index = fieldMap.get(fieldName);
+        
+        // If it is null, the field does not exist.
+        if(index == null) { throw new NoSuchElementException("Field \"" + fieldName + "\" does not exist."); }
+        
+        // Otherwise, set the field.
+        else { statusPanel.setFieldValue(index, value); }
+    }
+    
+    /**
+     * Updates the information on the status panel to match that of
+     * the calorimeter panel's currently selected crystal.
+     */
+    protected void updateStatusPanel() {
+        // Get the currently selected crystal.
+        Point crystal = ecalPanel.getSelectedCrystal();
+        
+        // If the crystal is null, there is no selection.
+        if(crystal == null || ecalPanel.isCrystalDisabled(crystal.x, crystal.y)) {
+            statusPanel.clearFields();
+        }
+        
+        // Otherwise, write the crystal's data to the panel.
+        else {
+            setStatusField(defaultFields[X_INDEX], String.valueOf(toEcalX(crystal.x)));
+            setStatusField(defaultFields[Y_INDEX], String.valueOf(toEcalY(crystal.y)));
+            DecimalFormat formatter = new DecimalFormat("0.####E0");
+            String energy = formatter.format(ecalPanel.getCrystalEnergy(crystal.x, crystal.y));
+            setStatusField(defaultFields[CELL_VALUE], energy);
+        }
+    }
     
     /**
      * Handles proper resizing of the window and its components.
      **/
     private void resize() {
-    	// Define the size constants.
-    	int statusHeight = 125;
-    	
+        // Define the size constants.
+        int statusHeight = 125;
+        
         // Size and position the calorimeter display.
         ecalPanel.setLocation(0, 0);
         ecalPanel.setSize(getContentPane().getWidth(), getContentPane().getHeight() - statusHeight);
@@ -312,30 +319,30 @@
      * It also triggers crystal click events.
      */
     private class EcalMouseListener implements MouseListener {
-		public void mouseClicked(MouseEvent e) {
-			// If there is a selected crystal, trigger a crystal click event.
-			if(ecalPanel.getSelectedCrystal() != null) {
-				// Get the selected crystal.
-				Point crystal = ecalPanel.getSelectedCrystal();
-				
-				// Construct a crystal event.
-				CrystalEvent ce = new CrystalEvent(Viewer.this, crystal);
-				
-				// Loop through all the crystal listeners and trigger them.
-				for(CrystalListener cl : listenerList) { cl.crystalClicked(ce); }
-			}
-		}
-		
-		public void mouseEntered(MouseEvent e) { }
-		
-		public void mouseExited(MouseEvent e) {
-			ecalPanel.clearSelectedCrystal();
-			statusPanel.clearValues();
-		}
-		
-		public void mousePressed(MouseEvent e) { }
-		
-		public void mouseReleased(MouseEvent e) { }
+        public void mouseClicked(MouseEvent e) {
+            // If there is a selected crystal, trigger a crystal click event.
+            if(ecalPanel.getSelectedCrystal() != null) {
+                // Get the selected crystal.
+                Point crystal = ecalPanel.getSelectedCrystal();
+                
+                // Construct a crystal event.
+                CrystalEvent ce = new CrystalEvent(Viewer.this, crystal);
+                
+                // Loop through all the crystal listeners and trigger them.
+                for(CrystalListener cl : listenerList) { cl.crystalClicked(ce); }
+            }
+        }
+        
+        public void mouseEntered(MouseEvent e) { }
+        
+        public void mouseExited(MouseEvent e) {
+            ecalPanel.clearSelectedCrystal();
+            statusPanel.clearFields();
+        }
+        
+        public void mousePressed(MouseEvent e) { }
+        
+        public void mouseReleased(MouseEvent e) { }
     }
     
     /**
@@ -344,80 +351,80 @@
      * mouse moves over the window. Additionally triggers crystal
      * activation and deactivation events.
      */
-    private class EcalMouseMotionListener implements MouseMotionListener {    	
-		public void mouseDragged(MouseEvent arg0) { }
-		
-		public void mouseMoved(MouseEvent e) {
-			// Get the panel coordinates.
-			int x = e.getX();
-			int y = e.getY();
-			
-			// Get the crystal index for these coordinates.
-			Point crystal = ecalPanel.getCrystalID(x, y);
-			
-			// If either of the crystal indices are negative, then
-			// the mouse is not in a crystal and the selection should
-			// be cleared.
-			boolean validCrystal = (crystal != null);
-			
-			// Get the currently selected calorimeter crystal.
-			Point curCrystal = ecalPanel.getSelectedCrystal();
-			
-			// Perform event comparison checks.
-			boolean[] nullCrystal = { !validCrystal, curCrystal == null };
-			boolean[] disabledCrystal = { true, true };
-			if(!nullCrystal[0]) { disabledCrystal[0] = ecalPanel.isCrystalDisabled(crystal); }
-			if(!nullCrystal[1]) { disabledCrystal[1] = ecalPanel.isCrystalDisabled(curCrystal); }
-			boolean sameCrystal = true;
-			if(validCrystal) { sameCrystal = crystal.equals(curCrystal); }
-			
-			// If the crystals are the same, there are no events to throw.
-			if(!sameCrystal) {
-				// If the new crystal is non-null and enabled, throw an event.
-				if(!nullCrystal[0] && !disabledCrystal[0]) { throwActivationEvent(crystal); }
-				
-				// If the old crystal is non-null and enabled, throw an event.
-				if(!nullCrystal[1] && !disabledCrystal[1]) { throwDeactivationEvent(curCrystal); }
-			}
-			
-			// If the crystal is valid, then set the selected crystal
-			// to the current one.
-			if(validCrystal) { ecalPanel.setSelectedCrystal(crystal); }
-			
-			// Otherwise, clear the selection.
-			else { ecalPanel.clearSelectedCrystal(); }
-			
-			// Update the status panel.
-			updateStatusPanel();
-		}
-		
-		/**
-		 * Triggers crystal activation events on all listeners for
-		 * this component.
-		 * @param activatedCrystal - The panel coordinates for the
-		 * activated crystal.
-		 */
-		private void throwActivationEvent(Point activatedCrystal) {
-			// Create a crystal event.
-			CrystalEvent ce = new CrystalEvent(Viewer.this, activatedCrystal);
-			
-			// Throw the event with every listener.
-			for(CrystalListener cl : listenerList) { cl.crystalActivated(ce); }
-		}
-		
-		/**
-		 * Triggers crystal deactivation events on all listeners for
-		 * this component.
-		 * @param deactivatedCrystal - The panel coordinates for the
-		 * deactivated crystal.
-		 */
-		private void throwDeactivationEvent(Point deactivatedCrystal) {
-			// Create a crystal event.
-			CrystalEvent ce = new CrystalEvent(Viewer.this, deactivatedCrystal);
-			
-			// Throw the event with every listener.
-			for(CrystalListener cl : listenerList) { cl.crystalDeactivated(ce); }
-		}
+    private class EcalMouseMotionListener implements MouseMotionListener {        
+        public void mouseDragged(MouseEvent arg0) { }
+        
+        public void mouseMoved(MouseEvent e) {
+            // Get the panel coordinates.
+            int x = e.getX();
+            int y = e.getY();
+            
+            // Get the crystal index for these coordinates.
+            Point crystal = ecalPanel.getCrystalID(x, y);
+            
+            // If either of the crystal indices are negative, then
+            // the mouse is not in a crystal and the selection should
+            // be cleared.
+            boolean validCrystal = (crystal != null);
+            
+            // Get the currently selected calorimeter crystal.
+            Point curCrystal = ecalPanel.getSelectedCrystal();
+            
+            // Perform event comparison checks.
+            boolean[] nullCrystal = { !validCrystal, curCrystal == null };
+            boolean[] disabledCrystal = { true, true };
+            if(!nullCrystal[0]) { disabledCrystal[0] = ecalPanel.isCrystalDisabled(crystal); }
+            if(!nullCrystal[1]) { disabledCrystal[1] = ecalPanel.isCrystalDisabled(curCrystal); }
+            boolean sameCrystal = true;
+            if(validCrystal) { sameCrystal = crystal.equals(curCrystal); }
+            
+            // If the crystals are the same, there are no events to throw.
+            if(!sameCrystal) {
+                // If the new crystal is non-null and enabled, throw an event.
+                if(!nullCrystal[0] && !disabledCrystal[0]) { throwActivationEvent(crystal); }
+                
+                // If the old crystal is non-null and enabled, throw an event.
+                if(!nullCrystal[1] && !disabledCrystal[1]) { throwDeactivationEvent(curCrystal); }
+            }
+            
+            // If the crystal is valid, then set the selected crystal
+            // to the current one.
+            if(validCrystal) { ecalPanel.setSelectedCrystal(crystal); }
+            
+            // Otherwise, clear the selection.
+            else { ecalPanel.clearSelectedCrystal(); }
+            
+            // Update the status panel.
+            updateStatusPanel();
+        }
+        
+        /**
+         * Triggers crystal activation events on all listeners for
+         * this component.
+         * @param activatedCrystal - The panel coordinates for the
+         * activated crystal.
+         */
+        private void throwActivationEvent(Point activatedCrystal) {
+            // Create a crystal event.
+            CrystalEvent ce = new CrystalEvent(Viewer.this, activatedCrystal);
+            
+            // Throw the event with every listener.
+            for(CrystalListener cl : listenerList) { cl.crystalActivated(ce); }
+        }
+        
+        /**
+         * Triggers crystal deactivation events on all listeners for
+         * this component.
+         * @param deactivatedCrystal - The panel coordinates for the
+         * deactivated crystal.
+         */
+        private void throwDeactivationEvent(Point deactivatedCrystal) {
+            // Create a crystal event.
+            CrystalEvent ce = new CrystalEvent(Viewer.this, deactivatedCrystal);
+            
+            // Throw the event with every listener.
+            for(CrystalListener cl : listenerList) { cl.crystalDeactivated(ce); }
+        }
     }
     
     /**

Modified: java/branches/trunk_20141031/ecal-readout-sim/pom.xml
 =============================================================================
--- java/branches/trunk_20141031/ecal-readout-sim/pom.xml	(original)
+++ java/branches/trunk_20141031/ecal-readout-sim/pom.xml	Sun Nov  2 13:30:41 2014
@@ -8,7 +8,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>../parent/pom.xml</relativePath>
-        <version>3.0.4-SNAPSHOT</version>
+        <version>3.1-SNAPSHOT</version>
     </parent>
     <scm>
         <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/ecal-readout-sim/</url>

Modified: java/branches/trunk_20141031/ecal-recon/pom.xml
 =============================================================================
--- java/branches/trunk_20141031/ecal-recon/pom.xml	(original)
+++ java/branches/trunk_20141031/ecal-recon/pom.xml	Sun Nov  2 13:30:41 2014
@@ -8,7 +8,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>../parent/pom.xml</relativePath>
-        <version>3.0.4-SNAPSHOT</version>
+        <version>3.1-SNAPSHOT</version>
     </parent>
     <scm>
         <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/ecal-recon/</url>

Modified: java/branches/trunk_20141031/evio/pom.xml
 =============================================================================
--- java/branches/trunk_20141031/evio/pom.xml	(original)
+++ java/branches/trunk_20141031/evio/pom.xml	Sun Nov  2 13:30:41 2014
@@ -8,7 +8,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>../parent/pom.xml</relativePath>
-        <version>3.0.4-SNAPSHOT</version>
+        <version>3.1-SNAPSHOT</version>
     </parent>
     <scm>
         <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/evio/</url>

Modified: java/branches/trunk_20141031/integration-tests/pom.xml
 =============================================================================
--- java/branches/trunk_20141031/integration-tests/pom.xml	(original)
+++ java/branches/trunk_20141031/integration-tests/pom.xml	Sun Nov  2 13:30:41 2014
@@ -7,7 +7,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>../parent/pom.xml</relativePath>
-        <version>3.0.4-SNAPSHOT</version>
+        <version>3.1-SNAPSHOT</version>
     </parent>
     <scm>
         <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/integration-tests/</url>
@@ -29,6 +29,8 @@
                     <excludes>
                         <exclude>org/hps/EtSystemTest.java</exclude>
                         <exclude>org/hps/DataQualityMonitorTest.java</exclude>
+                        <exclude>org/hps/EcalReadoutSimTest.java</exclude>
+                        <exclude>org/hps/ReconClusterICTest.java</exclude>
                     </excludes>
                     <redirectTestOutputToFile>true</redirectTestOutputToFile>
                     <trimStackTrace>true</trimStackTrace>

Modified: java/branches/trunk_20141031/integration-tests/src/test/java/org/hps/SimpleSvtReadoutTest.java
 =============================================================================
--- java/branches/trunk_20141031/integration-tests/src/test/java/org/hps/SimpleSvtReadoutTest.java	(original)
+++ java/branches/trunk_20141031/integration-tests/src/test/java/org/hps/SimpleSvtReadoutTest.java	Sun Nov  2 13:30:41 2014
@@ -51,6 +51,7 @@
         job.addVariableDefinition("outputFile", outputFile.getPath());
         job.setup("/org/hps/steering/readout/HPS2014TruthReadoutToLcio.lcsim");
         job.getLCSimLoop().add(checker);
+        job.setNumberOfEvents(1000);
         job.run();
         
         this.printDebug("=========== Summary ===========");

Modified: java/branches/trunk_20141031/monitoring-app/pom.xml
 =============================================================================
--- java/branches/trunk_20141031/monitoring-app/pom.xml	(original)
+++ java/branches/trunk_20141031/monitoring-app/pom.xml	Sun Nov  2 13:30:41 2014
@@ -7,7 +7,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>../parent/pom.xml</relativePath>
-        <version>3.0.4-SNAPSHOT</version>
+        <version>3.1-SNAPSHOT</version>
     </parent>
     <scm>
         <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/monitoring-app/</url>
@@ -124,7 +124,7 @@
         <dependency>
             <groupId>jfreechart-aida-experimental</groupId>
             <artifactId>jfreechart-aida-experimental</artifactId>
-            <version>1.3-SNAPSHOT</version>
+            <version>1.4</version>
             <exclusions>
                 <exclusion>  
                     <groupId>jdom</groupId>

Modified: java/branches/trunk_20141031/monitoring-app/src/main/java/org/hps/monitoring/subsys/SystemStatusImpl.java
 =============================================================================
--- java/branches/trunk_20141031/monitoring-app/src/main/java/org/hps/monitoring/subsys/SystemStatusImpl.java	(original)
+++ java/branches/trunk_20141031/monitoring-app/src/main/java/org/hps/monitoring/subsys/SystemStatusImpl.java	Sun Nov  2 13:30:41 2014
@@ -52,7 +52,7 @@
     }
 
     @Override
-    public void setStatus(StatusCode code, String message) {
+    synchronized public void setStatus(StatusCode code, String message) {
         if (isActive()) {
             this.code = code;
             this.message = message;
@@ -74,7 +74,7 @@
     /**
      * Notify listeners of changes to the system status.
      */
-    void notifyListeners() {
+    synchronized void notifyListeners() {
         for (SystemStatusListener listener : listeners) {
             listener.statusChanged(this);
         }

Modified: java/branches/trunk_20141031/monitoring-drivers/pom.xml
 =============================================================================
--- java/branches/trunk_20141031/monitoring-drivers/pom.xml	(original)
+++ java/branches/trunk_20141031/monitoring-drivers/pom.xml	Sun Nov  2 13:30:41 2014
@@ -7,7 +7,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>../parent/pom.xml</relativePath>
-        <version>3.0.4-SNAPSHOT</version>
+        <version>3.1-SNAPSHOT</version>
     </parent>
     <scm>
         <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/monitoring-drivers/</url>

Modified: java/branches/trunk_20141031/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/example/DummyErrorDriver.java
 =============================================================================
--- java/branches/trunk_20141031/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/example/DummyErrorDriver.java	(original)
+++ java/branches/trunk_20141031/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/example/DummyErrorDriver.java	Sun Nov  2 13:30:41 2014
@@ -15,19 +15,19 @@
     boolean throwStartOfData = false;
     boolean throwDetectorChanged = false;
     
-    public void throwProcess(boolean throwProcess) {
+    public void setThrowProcess(boolean throwProcess) {
         this.throwProcess = throwProcess;
     }
     
-    public void throwEndOfData(boolean throwEndOfData) {
+    public void setThrowEndOfData(boolean throwEndOfData) {
         this.throwEndOfData = throwEndOfData;
     }
     
-    public void throwStartOfData(boolean throwStartOfData) {
+    public void setThrowStartOfData(boolean throwStartOfData) {
         this.throwStartOfData = throwStartOfData;
     }
     
-    public void throwDetectorChanged(boolean throwDetectorChanged) {
+    public void setThrowDetectorChanged(boolean throwDetectorChanged) {
         this.throwDetectorChanged = throwDetectorChanged;
     }
     

Modified: java/branches/trunk_20141031/parent/pom.xml
 =============================================================================
--- java/branches/trunk_20141031/parent/pom.xml	(original)
+++ java/branches/trunk_20141031/parent/pom.xml	Sun Nov  2 13:30:41 2014
@@ -6,13 +6,13 @@
     <groupId>org.hps</groupId>
     <artifactId>hps-parent</artifactId>
     <packaging>pom</packaging>
-    <version>3.0.4-SNAPSHOT</version>
+    <version>3.1-SNAPSHOT</version>
     <name>parent</name>
     <description>HPS Java parent POM</description>
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <org.lcsim.cacheDir>${user.home}</org.lcsim.cacheDir>
-        <lcsimVersion>3.0.7-SNAPSHOT</lcsimVersion>
+        <lcsimVersion>3.0.8-SNAPSHOT</lcsimVersion>
         <skipSite>false</skipSite>
         <skipPlugin>false</skipPlugin>
     </properties>
@@ -103,82 +103,82 @@
             <dependency>
                 <groupId>org.hps</groupId>
                 <artifactId>hps-util</artifactId>
-                <version>3.0.4-SNAPSHOT</version>
+                <version>3.1-SNAPSHOT</version>
             </dependency>
             <dependency>
                 <groupId>org.hps</groupId>
                 <artifactId>hps-detector-data</artifactId>
-                <version>3.0.4-SNAPSHOT</version>
+                <version>3.1-SNAPSHOT</version>
             </dependency>
             <dependency>
                 <groupId>org.hps</groupId>
                 <artifactId>hps-conditions</artifactId>
-                <version>3.0.4-SNAPSHOT</version>
+                <version>3.1-SNAPSHOT</version>
             </dependency>
             <dependency>
                 <groupId>org.hps</groupId>
                 <artifactId>hps-ecal-recon</artifactId>
-                <version>3.0.4-SNAPSHOT</version>
+                <version>3.1-SNAPSHOT</version>
             </dependency>
             <dependency>
                 <groupId>org.hps</groupId>
                 <artifactId>hps-ecal-readout-sim</artifactId>
-                <version>3.0.4-SNAPSHOT</version>
+                <version>3.1-SNAPSHOT</version>
             </dependency>
             <dependency>
                 <groupId>org.hps</groupId>
                 <artifactId>hps-tracking</artifactId>
-                <version>3.0.4-SNAPSHOT</version>
+                <version>3.1-SNAPSHOT</version>
             </dependency>
             <dependency>
                 <groupId>org.hps</groupId>
                 <artifactId>hps-evio</artifactId>
-                <version>3.0.4-SNAPSHOT</version>
+                <version>3.1-SNAPSHOT</version>
             </dependency>
             <dependency>
                 <groupId>org.hps</groupId>
                 <artifactId>hps-recon</artifactId>
-                <version>3.0.4-SNAPSHOT</version>
+                <version>3.1-SNAPSHOT</version>
             </dependency>
             <dependency>
                 <groupId>org.hps</groupId>
                 <artifactId>hps-analysis</artifactId>
-                <version>3.0.4-SNAPSHOT</version>
+                <version>3.1-SNAPSHOT</version>
             </dependency>
             <dependency>
                 <groupId>org.hps</groupId>
                 <artifactId>hps-monitoring-drivers</artifactId>
-                <version>3.0.4-SNAPSHOT</version>
+                <version>3.1-SNAPSHOT</version>
             </dependency>
             <dependency>
                 <groupId>org.hps</groupId>
                 <artifactId>hps-monitoring-app</artifactId>
-                <version>3.0.4-SNAPSHOT</version>
+                <version>3.1-SNAPSHOT</version>
             </dependency>
             <dependency>
                 <groupId>org.hps</groupId>
                 <artifactId>hps-users</artifactId>
-                <version>3.0.4-SNAPSHOT</version>
+                <version>3.1-SNAPSHOT</version>
             </dependency>
             <dependency>
                 <groupId>org.hps</groupId>
                 <artifactId>hps-steering-files</artifactId>
-                <version>3.0.4-SNAPSHOT</version>
+                <version>3.1-SNAPSHOT</version>
             </dependency>
             <dependency>
                 <groupId>org.hps</groupId>
                 <artifactId>hps-distribution</artifactId>
-                <version>3.0.4-SNAPSHOT</version>
+                <version>3.1-SNAPSHOT</version>
             </dependency>
             <dependency>
                 <groupId>org.hps</groupId>
                 <artifactId>hps-ecal-event-display</artifactId>
-                <version>3.0.4-SNAPSHOT</version>
+                <version>3.1-SNAPSHOT</version>
             </dependency>
             <dependency>
                 <groupId>org.hps</groupId>
                 <artifactId>hps-record-util</artifactId>
-                <version>3.0.4-SNAPSHOT</version>
+                <version>3.1-SNAPSHOT</version>
             </dependency>
         </dependencies>
     </dependencyManagement>

Modified: java/branches/trunk_20141031/plugin/pom.xml
 =============================================================================
--- java/branches/trunk_20141031/plugin/pom.xml	(original)
+++ java/branches/trunk_20141031/plugin/pom.xml	Sun Nov  2 13:30:41 2014
@@ -7,7 +7,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>../parent/pom.xml</relativePath>
-        <version>3.0.4-SNAPSHOT</version>
+        <version>3.1-SNAPSHOT</version>
     </parent>
     <scm>
         <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/plugin/</url>

Modified: java/branches/trunk_20141031/pom.xml
 =============================================================================
--- java/branches/trunk_20141031/pom.xml	(original)
+++ java/branches/trunk_20141031/pom.xml	Sun Nov  2 13:30:41 2014
@@ -10,7 +10,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>parent/pom.xml</relativePath>
-        <version>3.0.4-SNAPSHOT</version>
+        <version>3.1-SNAPSHOT</version>
     </parent>   
     <scm>
         <url>svn://svn.freehep.org/hps/java/trunk/</url>
@@ -38,7 +38,12 @@
                         <generateProjectInfo>true</generateProjectInfo>
                     </configuration>
                 </plugin>
-            </plugins>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-eclipse-plugin</artifactId>
+                    <version>2.9</version>
+                </plugin>
+            </plugins>            
         </pluginManagement>
     </build>
     <reporting>

Modified: java/branches/trunk_20141031/recon/pom.xml
 =============================================================================
--- java/branches/trunk_20141031/recon/pom.xml	(original)
+++ java/branches/trunk_20141031/recon/pom.xml	Sun Nov  2 13:30:41 2014
@@ -8,7 +8,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>../parent/pom.xml</relativePath>
-        <version>3.0.4-SNAPSHOT</version>
+        <version>3.1-SNAPSHOT</version>
     </parent>
     <scm>
         <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/recon/</url>

Modified: java/branches/trunk_20141031/record-util/pom.xml
 =============================================================================
--- java/branches/trunk_20141031/record-util/pom.xml	(original)
+++ java/branches/trunk_20141031/record-util/pom.xml	Sun Nov  2 13:30:41 2014
@@ -7,7 +7,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>../parent/pom.xml</relativePath>
-        <version>3.0.4-SNAPSHOT</version>
+        <version>3.1-SNAPSHOT</version>
     </parent>
     <scm>
         <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/record-util/</url>

Modified: java/branches/trunk_20141031/steering-files/pom.xml
 =============================================================================
--- java/branches/trunk_20141031/steering-files/pom.xml	(original)
+++ java/branches/trunk_20141031/steering-files/pom.xml	Sun Nov  2 13:30:41 2014
@@ -8,7 +8,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>../parent/pom.xml</relativePath>
-        <version>3.0.4-SNAPSHOT</version>
+        <version>3.1-SNAPSHOT</version>
     </parent>
     <scm>
         <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/steering-files/</url>

Modified: java/branches/trunk_20141031/steering-files/src/main/resources/org/hps/steering/monitoring/DummyError.lcsim
 =============================================================================
--- java/branches/trunk_20141031/steering-files/src/main/resources/org/hps/steering/monitoring/DummyError.lcsim	(original)
+++ java/branches/trunk_20141031/steering-files/src/main/resources/org/hps/steering/monitoring/DummyError.lcsim	Sun Nov  2 13:30:41 2014
@@ -4,6 +4,8 @@
         <driver name="DummyErrorDriver"/>
     </execute>   
     <drivers>
-        <driver name="DummyErrorDriver" type="org.hps.monitoring.drivers.test.DummyErrorDriver"/>
+        <driver name="DummyErrorDriver" type="org.hps.monitoring.drivers.example.DummyErrorDriver">
+            <throwProcess>true</throwProcess>
+        </driver>
     </drivers>
 </lcsim>

Modified: java/branches/trunk_20141031/tracking/pom.xml
 =============================================================================
--- java/branches/trunk_20141031/tracking/pom.xml	(original)
+++ java/branches/trunk_20141031/tracking/pom.xml	Sun Nov  2 13:30:41 2014
@@ -8,7 +8,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>../parent/pom.xml</relativePath>
-        <version>3.0.4-SNAPSHOT</version>
+        <version>3.1-SNAPSHOT</version>
     </parent>
     <scm>
         <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/tracking/</url>

Modified: java/branches/trunk_20141031/users/pom.xml
 =============================================================================
--- java/branches/trunk_20141031/users/pom.xml	(original)
+++ java/branches/trunk_20141031/users/pom.xml	Sun Nov  2 13:30:41 2014
@@ -7,7 +7,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>../parent/pom.xml</relativePath>
-        <version>3.0.4-SNAPSHOT</version>
+        <version>3.1-SNAPSHOT</version>
     </parent>
     <scm>
         <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/users/</url>

Modified: java/branches/trunk_20141031/util/pom.xml
 =============================================================================
--- java/branches/trunk_20141031/util/pom.xml	(original)
+++ java/branches/trunk_20141031/util/pom.xml	Sun Nov  2 13:30:41 2014
@@ -7,7 +7,7 @@
         <groupId>org.hps</groupId>
         <artifactId>hps-parent</artifactId>
         <relativePath>../parent/pom.xml</relativePath>
-        <version>3.0.4-SNAPSHOT</version>
+        <version>3.1-SNAPSHOT</version>
     </parent>
     <scm>
         <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/util/</url>

Top of Message | Previous Page | Permalink

Advanced Options


Options

Log In

Log In

Get Password

Get Password


Search Archives

Search Archives


Subscribe or Unsubscribe

Subscribe or Unsubscribe


Archives

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

ATOM RSS1 RSS2



LISTSERV.SLAC.STANFORD.EDU

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

Privacy Notice, Security Notice and Terms of Use