Print

Print


Author: [log in to unmask]
Date: Sun Oct  9 21:01:01 2016
New Revision: 4507

Log:
fixed bug with HashMap where the order of the iterated elements of getEntries is random by using LinkedHashMap

Modified:
    java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ReconClusterer.java

Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ReconClusterer.java
 =============================================================================
--- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ReconClusterer.java	(original)
+++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ReconClusterer.java	Sun Oct  9 21:01:01 2016
@@ -6,7 +6,7 @@
 
 import java.awt.Point;
 import java.util.ArrayList;
-import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -67,7 +67,7 @@
     double timeWindow = 8.0;
 
     // Make a map for quick calculation of the x-y position of crystal face
-    Map<Point, double[]> correctedPositionMap = new HashMap<Point, double[]>();
+    Map<Point, double[]> correctedPositionMap = new LinkedHashMap<Point, double[]>();
 
     List<CalorimeterHit> rejectedHitList = new ArrayList<CalorimeterHit>();
 
@@ -136,7 +136,7 @@
         
 //        Map<Long, CalorimeterHit> hitMap = ClusterUtilities.createHitMap(hitList);
         
-        HashMap<Long, CalorimeterHit> hitMap = new HashMap<Long, CalorimeterHit>();
+        LinkedHashMap<Long, CalorimeterHit> hitMap = new LinkedHashMap<Long, CalorimeterHit>();
         
         //boolean multihit = false;
         //for (int ii = hitList.size() - 1; ii >= 0; ii--) {
@@ -159,13 +159,13 @@
         //}
 
         // Create a map to connect a seed hit to its cluster.
-        Map<CalorimeterHit, BaseCluster> seedToCluster = new HashMap<CalorimeterHit, BaseCluster>();
+        Map<CalorimeterHit, BaseCluster> seedToCluster = new LinkedHashMap<CalorimeterHit, BaseCluster>();
 
         // Map a crystal to a list of all clusters in which it is a member.
-        Map<CalorimeterHit, List<CalorimeterHit>> commonHits = new HashMap<CalorimeterHit, List<CalorimeterHit>>();
+        Map<CalorimeterHit, List<CalorimeterHit>> commonHits = new LinkedHashMap<CalorimeterHit, List<CalorimeterHit>>();
 
         // Map a crystal to the seed of the cluster of which it is a member.
-        HashMap<CalorimeterHit, CalorimeterHit> hitToSeed = new HashMap<CalorimeterHit, CalorimeterHit>();
+        LinkedHashMap<CalorimeterHit, CalorimeterHit> hitToSeed = new LinkedHashMap<CalorimeterHit, CalorimeterHit>();
 
         // Loop through all calorimeter hits to locate seeds and perform
         // first pass calculations for component and common hits.
@@ -308,6 +308,7 @@
         } // End component hits loop.
 
         // Performs second pass calculations for common hits.
+        // TODO make this loop keySet-order independent
         commonHitsLoop: for (CalorimeterHit clusteredHit : hitToSeed.keySet()) {
 
             // Get the current clustered hit's neighboring crystals.
@@ -367,6 +368,7 @@
         } // End common hits loop.
 
         // Remove any common hits from the clustered hits collection.
+        // Note: this does not depend on the order of the commonHits key set
         for (CalorimeterHit commonHit : commonHits.keySet()) {
             hitToSeed.remove(commonHit);
             hitList.remove(commonHit);
@@ -392,6 +394,7 @@
         }
 
         // Add common hits
+        // Note: the order of the entry set in this loop does not affect the output.
         for (Map.Entry<CalorimeterHit, List<CalorimeterHit>> commHit : commonHits.entrySet()) {
             // Check that the common hit is in both time windows to their clusters
             CalorimeterHit seedA = commHit.getValue().get(0);