Print

Print


Author: [log in to unmask]
Date: Fri Oct 16 08:20:40 2015
New Revision: 3848

Log:
Added method to TriggerModule to create cluster top/bottom pairs to avoid having to re-implement the method in multiple locations.

Modified:
    java/trunk/record-util/src/main/java/org/hps/record/triggerbank/TriggerModule.java

Modified: java/trunk/record-util/src/main/java/org/hps/record/triggerbank/TriggerModule.java
 =============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/triggerbank/TriggerModule.java	(original)
+++ java/trunk/record-util/src/main/java/org/hps/record/triggerbank/TriggerModule.java	Fri Oct 16 08:20:40 2015
@@ -1,6 +1,9 @@
 package org.hps.record.triggerbank;
 
+import java.lang.reflect.Array;
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.StringTokenizer;
 
@@ -604,6 +607,127 @@
      */
     public static double getClusterZ(SSPCluster cluster) {
     	return getCrystalPosition(cluster.getXIndex(), cluster.getYIndex())[2];
+    }
+    
+    /**
+     * Forms all possible pairs of top/bottom clusters from a given
+     * list of clusters.
+     * @param clusters - The clusters from which to form the pairs.
+     * @return Returns a <code>List</code> collection of size two
+     * <code>Cluster</code> arrays representing top/bottom pairs. The
+     * first entry in the array is always the top cluster, with the
+     * bottom cluster in the next position.
+     */
+	public static <E> List<E[]> getTopBottomPairs(List<E> clusters, Class<E> clusterType) throws IllegalArgumentException {
+		// Ensure that only valid cluster types are processed.
+		if(!clusterType.equals(Cluster.class) && !clusterType.equals(SSPCluster.class)) {
+			throw new IllegalArgumentException("Class \"" + clusterType.getSimpleName() + "\" is not a supported cluster type.");
+		}
+		
+    	// Create a list to store top clusters, bottom clusters, and
+    	// cluster pairs.
+    	List<E> topClusters = new ArrayList<E>();
+    	List<E> botClusters = new ArrayList<E>();
+    	List<E[]> pairClusters = new ArrayList<E[]>();
+    	
+    	// Separate the cluster list into top/bottom clusters.
+    	for(E cluster : clusters) {
+    		// Process LCIO clusters...
+    		if(clusterType.equals(Cluster.class)) {
+				if(getClusterYIndex((Cluster) cluster) > 0) {
+					topClusters.add(cluster);
+				} else { botClusters.add(cluster); }
+    		}
+    		
+    		// Process SSP clusters...
+    		else if(clusterType.equals(SSPCluster.class)) {
+				if(getClusterYIndex((SSPCluster) cluster) > 0) {
+					topClusters.add(cluster);
+				} else { botClusters.add(cluster); }
+    		}
+    	}
+    	
+    	// Form all top/bottom cluster pairs.
+    	for(E topCluster : topClusters) {
+    		for(E botCluster : botClusters) {
+    			@SuppressWarnings("unchecked")
+				E[] pair = (E[]) Array.newInstance(clusterType, 2);
+    			pair[0] = topCluster;
+    			pair[1] = botCluster;
+    			pairClusters.add(pair);
+    		}
+    	}
+    	
+    	// Return the cluster pairs.
+    	return pairClusters;
+    }
+    
+    /**
+     * Forms all possible pairs of top/bottom clusters from a given
+     * list of clusters.
+     * @param clusters - The clusters from which to form the pairs.
+     * @return Returns a <code>List</code> collection of size two
+     * <code>Cluster</code> arrays representing top/bottom pairs. The
+     * first entry in the array is always the top cluster, with the
+     * bottom cluster in the next position.
+     */
+	public static List<Cluster[]> getTopBottomPairs(Cluster... clusters) {
+    	// Create a list to store top clusters, bottom clusters, and
+    	// cluster pairs.
+    	List<Cluster> topClusters = new ArrayList<Cluster>();
+    	List<Cluster> botClusters = new ArrayList<Cluster>();
+    	List<Cluster[]> pairClusters = new ArrayList<Cluster[]>();
+    	
+    	// Separate the cluster list into top/bottom clusters.
+    	for(Cluster cluster : clusters) {
+			if(getClusterYIndex(cluster) > 0) {
+				topClusters.add(cluster);
+			} else { botClusters.add(cluster); }
+    	}
+    	
+    	// Form all top/bottom cluster pairs.
+    	for(Cluster topCluster : topClusters) {
+    		for(Cluster botCluster : botClusters) {
+    			pairClusters.add(new Cluster[] { topCluster, botCluster });
+    		}
+    	}
+    	
+    	// Return the cluster pairs.
+    	return pairClusters;
+    }
+    
+    /**
+     * Forms all possible pairs of top/bottom clusters from a given
+     * list of clusters.
+     * @param clusters - The clusters from which to form the pairs.
+     * @return Returns a <code>List</code> collection of size two
+     * <code>SSPCluster</code> arrays representing top/bottom pairs.
+     * The first entry in the array is always the top cluster, with
+     * the bottom cluster in the next position.
+     */
+	public static List<SSPCluster[]> getTopBottomPairs(SSPCluster... clusters) {
+    	// Create a list to store top clusters, bottom clusters, and
+    	// cluster pairs.
+    	List<SSPCluster> topClusters = new ArrayList<SSPCluster>();
+    	List<SSPCluster> botClusters = new ArrayList<SSPCluster>();
+    	List<SSPCluster[]> pairClusters = new ArrayList<SSPCluster[]>();
+    	
+    	// Separate the cluster list into top/bottom clusters.
+    	for(SSPCluster cluster : clusters) {
+			if(getClusterYIndex(cluster) > 0) {
+				topClusters.add(cluster);
+			} else { botClusters.add(cluster); }
+    	}
+    	
+    	// Form all top/bottom cluster pairs.
+    	for(SSPCluster topCluster : topClusters) {
+    		for(SSPCluster botCluster : botClusters) {
+    			pairClusters.add(new SSPCluster[] { topCluster, botCluster });
+    		}
+    	}
+    	
+    	// Return the cluster pairs.
+    	return pairClusters;
     }
     
     /**