Author: [log in to unmask]
Date: Thu May 28 23:44:54 2015
New Revision: 3057
Log:
Updated GTP Monte Carlo drivers to ensure that all cluster hits are properly included in an LCIO event. This prevents null pointer exceptions that can occur when referencing a hit from a different event than the associated cluster.
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/GTPClusterer.java
java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/LegacyClusterer.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 Thu May 28 23:44:54 2015
@@ -23,7 +23,7 @@
public GTPClusterDriver() {
clusterer = ClustererFactory.create("GTPClusterer");
gtp = (GTPClusterer) clusterer;
- setWriteClusterCollection(false);
+ setWriteClusterCollection(true);
}
/**
@@ -36,7 +36,7 @@
* false</code> that the symmetric window should be used.
*/
@Deprecated
- void setLimitClusterRange(boolean limitClusterRange) {
+ public void setLimitClusterRange(boolean limitClusterRange) {
gtp.setLimitClusterRange(limitClusterRange);
}
@@ -86,4 +86,14 @@
public void setVerbose(boolean verbose) {
gtp.setVerbose(verbose);
}
+
+ @Override
+ public void setWriteClusterCollection(boolean state) {
+ // Set the flag as appropriate with the superclass.
+ super.setWriteClusterCollection(state);
+
+ // Also tell the clusterer whether it should persist its hit
+ // collection or not.
+ gtp.setWriteHitCollection(state);
+ }
}
Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPClusterer.java
=============================================================================
--- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPClusterer.java (original)
+++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPClusterer.java Thu May 28 23:44:54 2015
@@ -2,6 +2,7 @@
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@@ -33,7 +34,7 @@
* @author Sho Uemura
*/
public class GTPClusterer extends AbstractClusterer {
-
+
/**
* The minimum energy required for a hit to be considered as a
* cluster center. Hits with energy less than this value will be
@@ -54,7 +55,7 @@
* clustering.
*/
private LinkedList<Map<Long, CalorimeterHit>> hitBuffer;
-
+
/**
* Whether an asymmetric or symmetric window should be used for
* adding hits to a cluster.
@@ -66,9 +67,19 @@
*/
private boolean verbose = false;
+ /**
+ * Sets whether the clusterer should store the collection of hits
+ * that are part of clusters. This needs to be true if the clusters
+ * are to be written out to LCIO.
+ */
+ private boolean writeHitCollection = true;
+
+ /**
+ * Instantiates the clusterer.
+ */
GTPClusterer() {
super(new String[] { "seedEnergyThreshold", "clusterWindow" }, new double[] { 0.00, 2.});
- }
+ }
/**
* Sets the clustering algorithm parameters.
@@ -276,20 +287,45 @@
// Store each hit in a set by its cell ID so that it may be
// easily acquired later.
HashMap<Long, CalorimeterHit> hitMap = new HashMap<Long, CalorimeterHit>();
- for (CalorimeterHit hit : hits) {
+ for(CalorimeterHit hit : hits) {
hitMap.put(hit.getCellID(), hit);
}
-
+
// Remove the last event from the hit buffer and add the new one.
hitBuffer.removeLast();
hitBuffer.addFirst(hitMap);
-
+
// Run the clustering algorithm on the buffer.
List<Cluster> clusterList = getClusters();
-
+
+ // The MC GTP algorithm collects hits from across events; to be
+ // stored in LCIO format properly, it needs to separately store
+ // its clusters' hits in a collection.
+ if(writeHitCollection) {
+ // Create a set to store the hits so that each one may be
+ // stored only once.
+ Set<CalorimeterHit> hitSet = new HashSet<CalorimeterHit>();
+
+ // Loop over all clusters and add their hits to the set.
+ for(Cluster cluster : clusterList) {
+ for(CalorimeterHit hit : cluster.getCalorimeterHits()) {
+ hitSet.add(hit);
+ }
+ }
+
+ // Convert the set into a List object so that it can be stored
+ // in LCIO.
+ List<CalorimeterHit> clusterHits = new ArrayList<CalorimeterHit>(hitSet.size());
+ clusterHits.addAll(hitSet);
+
+ // Place the list of hits into the event stream.
+ event.put("GTPHits", hits, CalorimeterHit.class, 0);
+ }
+
+ // Return the clusters.
return clusterList;
}
-
+
/**
* Sets the number of clock cycles before and after a given cycle
* that will be used when checking whether a given hit is a local
@@ -352,6 +388,17 @@
}
/**
+ * Sets whether the set of hits associated with an event's clusters
+ * should be written to the data stream and persisted in LCIO. This
+ * must be true if the clusters are to be persisted.
+ * @param state - <code>true</code> indicates that the hits will be
+ * persisted and <code>false</code> that they will not.
+ */
+ void setWriteHitCollection(boolean state) {
+ writeHitCollection = state;
+ }
+
+ /**
* Indicates the type of cluster that is generated by this algorithm.
* @return Returns the type of cluster as a <code>ClusterType</code>
* object, specifically, <code>ClusterType.GTP</code>.
@@ -359,5 +406,5 @@
@Override
public ClusterType getClusterType() {
return ClusterType.GTP;
- }
+ }
}
Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/LegacyClusterer.java
=============================================================================
--- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/LegacyClusterer.java (original)
+++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/LegacyClusterer.java Thu May 28 23:44:54 2015
@@ -5,7 +5,6 @@
import java.util.Map;
import java.util.Set;
-import org.hps.recon.ecal.EcalUtils;
import org.lcsim.event.CalorimeterHit;
import org.lcsim.event.Cluster;
import org.lcsim.event.EventHeader;
|