Print

Print


Author: [log in to unmask]
Date: Tue Feb  3 13:58:32 2015
New Revision: 2033

Log:
Added a driver for the readout version of the GTP algorithm and made a few minor updates to the formatting of the algorithms. Algorithm functionality is unchanged.

Added:
    java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPOnlineClusterDriver.java
Modified:
    java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPClusterDriver.java
    java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPOnlineClusterer.java

Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPClusterDriver.java
 =============================================================================
--- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPClusterDriver.java	(original)
+++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPClusterDriver.java	Tue Feb  3 13:58:32 2015
@@ -15,11 +15,11 @@
  */
 public class GTPClusterDriver extends ClusterDriver {
     // The GTP clustering algorithm.
-	private final GTPClusterer gtp;
-	
-	/**
-	 * Instantiates a new <code>GTPClusterer</code>.
-	 */
+    private final GTPClusterer gtp;
+    
+    /**
+     * Instantiates a new <code>GTPClusterer</code>.
+     */
     public GTPClusterDriver() {
         clusterer = ClustererFactory.create("GTPClusterer");
         gtp = (GTPClusterer) clusterer;
@@ -37,7 +37,7 @@
     @Deprecated
     void setLimitClusterRange(boolean limitClusterRange) {
         gtp.setLimitClusterRange(limitClusterRange);
-    }        
+    }
     
     /**
      * Sets the number of clock-cycles (4 ns) before and after a hit
@@ -58,7 +58,7 @@
      * @param seedEnergyThreshold - The minimum seed energy in GeV.
      */
     public void setSeedEnergyThreshold(double seedEnergyThreshold) {
-    	gtp.getCuts().setValue("seedEnergyThreshold", seedEnergyThreshold);
+        gtp.getCuts().setValue("seedEnergyThreshold", seedEnergyThreshold);
     }
     
     /**
@@ -73,7 +73,7 @@
      * should not.
      */
     public void setAsymmetricWindow(boolean asymmetricWindow) {
-    	gtp.setLimitClusterRange(asymmetricWindow);
+        gtp.setLimitClusterRange(asymmetricWindow);
     }
     
     /**
@@ -83,6 +83,6 @@
      * output diagnostic text and <code>false</code> that it should not.
      */
     public void setVerbose(boolean verbose) {
-    	gtp.setVerbose(verbose);
+        gtp.setVerbose(verbose);
     }
-}
+}

Added: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPOnlineClusterDriver.java
 =============================================================================
--- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPOnlineClusterDriver.java	(added)
+++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPOnlineClusterDriver.java	Tue Feb  3 13:58:32 2015
@@ -0,0 +1,62 @@
+package org.hps.recon.ecal.cluster;
+
+/**
+ * Class <code>GTPOnlineClusterDriver</code> allows parameters for the
+ * readout variant of the GTP algorithm to be set.
+ * 
+ * @author Kyle McCarty <[log in to unmask]>
+ */
+public class GTPOnlineClusterDriver extends ClusterDriver {
+    // Store the cluistering algorithm.
+    private final GTPOnlineClusterer gtp;
+    
+    /**
+     * Instantiates a new clustering algorithm using the readout
+     * variant of the GTP clustering algorithm.
+     */
+    public GTPOnlineClusterDriver() {
+        clusterer = ClustererFactory.create("GTPOnlineClusterer");
+        gtp = (GTPOnlineClusterer) clusterer;
+    }
+    
+    /**
+     * Sets the minimum seed energy needed for a hit to be considered
+     * for forming a cluster.
+     * @param seedEnergyThreshold - The minimum cluster seed energy in
+     * GeV.
+     */
+    public void setSeedEnergyThreshold(double seedEnergyThreshold) {
+        gtp.getCuts().setValue("seedEnergyThreshold", seedEnergyThreshold);
+        gtp.setSeedLowThreshold(seedEnergyThreshold);
+    }
+    
+    /**
+     * Sets the number of clock-cycles to include in the clustering
+     * window before the seed hit. One clock-cycle is four nanoseconds.
+     * @param cyclesBefore - The length of the clustering window before
+     * the seed hit in clock cycles.
+     */
+    public void setWindowBefore(int cyclesBefore) {
+        gtp.setWindowBefore(cyclesBefore);
+    }
+    
+    /**
+     * Sets the number of clock-cycles to include in the clustering
+     * window after the seed hit. One clock-cycle is four nanoseconds.
+     * @param cyclesAfter - The length of the clustering window after
+     * the seed hit in clock cycles.
+     */
+    public void setWindowAfter(int cyclesAfter) {
+        gtp.setWindowAfter(cyclesAfter);
+    }
+    
+    /**
+     * Sets whether the clusterer should output diagnostic text or not.
+     * @param verbose - <code>true</code> indicates that the clusterer
+     * should output diagnostic text and <code>false</code> that it
+     * should not.
+     */
+    public void setVerbose(boolean verbose) {
+        gtp.setVerbose(verbose);
+    }
+}

Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPOnlineClusterer.java
 =============================================================================
--- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPOnlineClusterer.java	(original)
+++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPOnlineClusterer.java	Tue Feb  3 13:58:32 2015
@@ -36,9 +36,8 @@
  * 
  * @author Kyle McCarty <[log in to unmask]>
  */
-// TODO: Handle time window arguments.
 public class GTPOnlineClusterer extends AbstractClusterer {
-
+    
     // The size of the temporal window in nanoseconds. By default,
     // this is 1 clock-cycle before and 3 clock-cycles after.
     private double timeBefore = 4;
@@ -48,19 +47,18 @@
     // Cluster formation energy thresholds. Currently, the hardware
     // only supports a lower bound seed energy. Units are in GeV.
     private double seedThreshold = 0.050;
-
+    
     // Internal variables.
     private boolean verbose = false;
     
     GTPOnlineClusterer() {
-        super(new String[] { "seedThreshold" }, 
-                new double[] { 0.050 });
-    }
-
+        super(new String[] { "seedThreshold" }, new double[] { 0.050 });
+    }
+    
     public void initialize() {
         seedThreshold = getCuts().getValue("seedThreshold");
     }
-
+    
     /**
      * Reads in hits and processes them into clusters as per the GTP
      * clustering algorithm implemented in the hardware.
@@ -68,13 +66,13 @@
      */
     @Override
     public List<Cluster> createClusters(EventHeader event, List<CalorimeterHit> hitList) {
-
+    	
         // Track the valid clusters.
         List<Cluster> clusterList = new ArrayList<Cluster>();
-
+        
         // VERBOSE :: Indicate whether the event has hits.
         //if(verbose) { System.out.printf("Event %7d :: Has hits [%5b]%n", event.getEventNumber(), hasHits); }
-
+        
         // Sort the hits by time in reverse order.
         Collections.sort(hitList, new Comparator<CalorimeterHit>() {
             @Override
@@ -82,7 +80,7 @@
                 return Double.compare(secondHit.getTime(), firstHit.getTime());
             }
         }); 
-
+        
         // VERBOSE :: Print the hit information.
         if(verbose) { 
             for(CalorimeterHit hit : hitList) {
@@ -90,18 +88,18 @@
                 int iy = hit.getIdentifierFieldValue("iy");
                 double energy = hit.getCorrectedEnergy();
                 double time = hit.getTime();
-
+                
                 System.out.printf("\tHit --> %.3f GeV at (%3d, %3d) and at t = %.2f%n", energy, ix, iy, time);
             }
         }
-
+        
         // A seed hit is a hit that is the largest both within its
         // spatial range (+/- 1 in the ix and iy direction) and
         // within a certain temporal window. If a hit is a seed, all
         // hits within the 3x3 spatial range around it that are also
         // within the temporal window are considered part of the
         // cluster.
-
+        
         // Iterate over each hit and see if it qualifies as a seed hit.
         seedLoop:
             for(CalorimeterHit seed : hitList) {
@@ -110,26 +108,26 @@
                 if(seed.getCorrectedEnergy() < seedThreshold) {
                     continue seedLoop;
                 }
-
+                
                 // Create a cluster for the potential seed.
                 BaseCluster protoCluster = createBasicCluster();
                 protoCluster.addHit(seed);
                 protoCluster.setPosition(seed.getDetectorElement().getGeometry().getPosition().v());
                 protoCluster.setNeedsPropertyCalculation(false);
-
+                
                 // Iterate over the other hits and if the are within
                 // the clustering spatiotemporal window, compare their
                 // energies.
                 for(CalorimeterHit hit : hitList) {
                     // Do not perform the comparison if the hit is the
                     // current potential seed.
-                    if (hit != seed) {
+                    if(hit != seed) {
                         // Check if the hit is within the spatiotemporal
                         // clustering window.
-                        if (withinTimeVerificationWindow(seed, hit) && withinSpatialWindow(seed, hit)) {
+                        if(withinTimeVerificationWindow(seed, hit) && withinSpatialWindow(seed, hit)) {
                             // Check if the hit invalidates the potential
                             // seed.
-                            if (isValidSeed(seed, hit)) {
+                            if(isValidSeed(seed, hit)) {
                                 // Make sure that the hit is also within
                                 // the hit add window; this may not be
                                 // the same as the verification window
@@ -138,7 +136,7 @@
                                     protoCluster.addHit(hit);
                                 }
                             }
-
+                            
                             // If it is not, then skip the rest of the
                             // loop; the potential seed is not really
                             // a seed.
@@ -147,13 +145,13 @@
                     }
                 }
                 
-
+                
                 // If this point is reached, then the seed was not
                 // invalidated by any of the other hits and is really
                 // a cluster center. Add the cluster to the list.
                 clusterList.add(protoCluster);
             }
-
+        
         // VERBOSE :: Print out all the clusters in the event.
         if(verbose) { 
             for(Cluster cluster : clusterList) {
@@ -162,9 +160,9 @@
                 int iy = seedHit.getIdentifierFieldValue("iy");
                 double energy = cluster.getEnergy();
                 double time = seedHit.getTime();
-
+                
                 System.out.printf("\tCluster --> %.3f GeV at (%3d, %3d) and at t = %.2f%n", energy, ix, iy, time);
-
+                
                 for(CalorimeterHit hit : cluster.getCalorimeterHits()) {
                     int hix = hit.getIdentifierFieldValue("ix");
                     int hiy = hit.getIdentifierFieldValue("iy");
@@ -174,13 +172,13 @@
                 }
             }
         }
-                
+        
         // VERBOSE :: Print a new line.
         if(verbose) { System.out.println(); }
-
+        
         return clusterList;
     }
-
+    
     /**
      * Checks whether the hit <code>hit</code> keeps the hit <code>seed
      * </code> from meeting the criteria for being a seed hit. Note that
@@ -196,24 +194,24 @@
         // Get the hit and seed energies.
         double henergy = hit.getCorrectedEnergy();
         double senergy = seed.getCorrectedEnergy();
-
+        
         // If the hit energy is less than the seed, the seed is valid.
         if(henergy < senergy) {
             return true;
         }
-
+        
         // If the hit energy is the same as the seed energy, spatial
         // comparisons are used to ensure the uniqueness of the seed.
         if(henergy == senergy) {
             // Get the x-indices of the hits.
             int six = seed.getIdentifierFieldValue("ix");
             int hix = hit.getIdentifierFieldValue("ix");
-
+            
             // The hit closest to the electron-side of the detector
             // is considered the seed.
             if(six < hix) { return true; }
             else if(six > hix) { return false; }
-
+            
             // If both hits are at the same x-index, compare how close
             // they are to the beam gap.
             else {
@@ -222,11 +220,11 @@
                 // to the beam gap.
                 int siy = Math.abs(seed.getIdentifierFieldValue("iy"));
                 int hiy = Math.abs(seed.getIdentifierFieldValue("iy"));
-
+                
                 // If the seed is closer, it is valid.
                 if(siy < hiy) { return true; }
                 else if(siy > hiy) { return false; }
-
+                
                 // If the y-index is the same, these are the same hit.
                 // This case shouldn't really ever happen, but for the
                 // compiler's sake, it returns true. A hit can not render
@@ -234,11 +232,11 @@
                 else { return true; }
             }
         }
-
+        
         // Otherwise, the seed is invalid.
         else { return false; }
     }
-
+    
     /**
      * Checks whether the hit <code>hit</code> falls within the spatial
      * window of the hit <code>Seed</code>. This is defined as within
@@ -255,23 +253,23 @@
         // Get the x-indices of each hit.
         int six = seed.getIdentifierFieldValue("ix");
         int hix = hit.getIdentifierFieldValue("ix");
-
+        
         // Check that the x indices are either the same or within a
         // range of one of one another.
         if((six == hix) || (six + 1 == hix) || (six - 1 == hix)) {
             // Get the y-indices of each hit.
             int siy = seed.getIdentifierFieldValue("iy");
             int hiy = hit.getIdentifierFieldValue("iy");
-
+            
             // Ensure that the y-indices are either the same or are
             // within one of one another.
             return (siy == hiy) || (siy + 1 == hiy) || (siy - 1 == hiy);
         }
-
+        
         // If the x-index comparison fails, return false.
         return false;
     }
-
+    
     /**
      * Checks whether the hit <code>hit</code> is within the temporal
      * window of the hit <code>seed</code> for the purpose of seed
@@ -287,11 +285,11 @@
         if(Math.abs(seed.getTime() - hit.getTime()) <= timeWindow) {
             return true;
         }
-
+        
         // Otherwise, they are not.
         else { return false; }
     }
-
+    
     /**
      * Checks whether the hit <code>hit</code> is within the temporal
      * window of the hit <code>seed</code> for the purpose of adding
@@ -306,25 +304,25 @@
         // Get the hit time and seed time.
         double hitTime = hit.getTime();
         double seedTime = seed.getTime();
-
+        
         // If the hit is before the seed, use the before window.
         if(hitTime < seedTime) {
             return (seedTime - hitTime) <= timeBefore;
         }
-
+        
         // If the hit occurs after the seed, use the after window.
         else if(hitTime > seedTime) {
             return (hitTime - seedTime) <= timeAfter;
         }
-
+        
         // If the times are the same, the are within the window.
         if(hitTime == seedTime) { return true; }
-
+        
         // Otherwise, one or both times is undefined and should not be
         // treated as within time.
         else { return false; }
     }
- 
+    
     /**
      * Sets the minimum energy a hit must have before it will be
      * considered for cluster formation.
@@ -333,7 +331,7 @@
     public void setSeedLowThreshold(double seedThreshold) {
         this.seedThreshold = seedThreshold;
     }
-
+    
     /**
      * Sets the number of clock-cycles to include in the clustering
      * window before the seed hit. One clock-cycle is four nanoseconds.
@@ -344,7 +342,7 @@
         timeBefore = cyclesBefore * 4;
         timeWindow = Math.max(timeBefore, timeAfter);
     }
-
+    
     /**
      * Sets the number of clock-cycles to include in the clustering
      * window after the seed hit. One clock-cycle is four nanoseconds.
@@ -355,9 +353,19 @@
         timeAfter = cyclesAfter * 4;
         timeWindow = Math.max(timeBefore, timeAfter);
     }
-
+    
+    /**
+     * Sets whether the clusterer should output diagnostic text or not.
+     * @param verbose - <code>true</code> indicates that the clusterer
+     * should output diagnostic text and <code>false</code> that it
+     * should not.
+     */
+    public void setVerbose(boolean verbose) {
+        this.verbose = verbose;
+    }
+    
     @Override
     public ClusterType getClusterType() {
         return ClusterType.GTP_ONLINE;
     }
-}
+}