lcsim/src/org/lcsim/recon/cluster/clumpfinder
diff -u -r1.4 -r1.5
--- ClumpFinder.java 19 Nov 2007 21:53:09 -0000 1.4
+++ ClumpFinder.java 17 Dec 2007 22:40:21 -0000 1.5
@@ -18,6 +18,7 @@
import org.lcsim.util.decision.*;
import org.lcsim.recon.cluster.util.ClusterSizeDecision;
import org.lcsim.util.hitmap.HitMap;
+import org.lcsim.recon.cluster.util.Clusterer;
/**
* A Driver which finds dense clumps within clusters.
@@ -28,10 +29,10 @@
* or more for each hit. This is hard-coded at the moment, but
* should become a user-definable in a later version.
*
- * @version $Id: ClumpFinder.java,v 1.4 2007/11/19 21:53:09 mcharles Exp $
+ * @version $Id: ClumpFinder.java,v 1.5 2007/12/17 22:40:21 mcharles Exp $
*/
-public class ClumpFinder extends Driver
+public class ClumpFinder extends Driver implements Clusterer
{
protected String m_inputHitMapName;
protected String m_outputClusterListName;
@@ -40,8 +41,15 @@
protected DecisionMakerSingle<CalorimeterHit> m_seedDecision;
protected DecisionMakerSingle<Cluster> m_clumpDecision;
+ /** Simple constructor. */
+ public ClumpFinder() {
+ m_hitDecision = new DummyDecisionMakerSingle<CalorimeterHit> (); // Default: All hits are valid
+ m_seedDecision = new DummyDecisionMakerSingle<CalorimeterHit> (); // Default: All seeds are valid
+ m_clumpDecision = new ClusterSizeDecision(6); // Default: Clumps must have >= 6 hits
+ }
+
/**
- * Constructor.
+ * Constructor, for when intended for use as a Driver.
* @param inputHitMap Make clusters from the hits in this HitMap
* @param outputClusterList Write the clumps made to this list
* @param outputHitMap Write unused hits out to this HitMap
@@ -67,12 +75,34 @@
HitMap inputHitMap = (HitMap) (event.get(m_inputHitMapName));
// Outputs:
- Vector<Cluster> outputClusterList = new Vector<Cluster>();
+ List<Cluster> outputClusterList = this.createClusters(inputHitMap);
HitMap outputHitMap = new HitMap(inputHitMap); // initially cloned
+ for (Cluster clump: outputClusterList) {
+ for (CalorimeterHit hitInClump : clump.getCalorimeterHits()) {
+ outputHitMap.remove(hitInClump.getCellID());
+ }
+ }
+ // Write out:
+ event.put(m_outputHitMapName, outputHitMap);
+ int flag = 1<<LCIOConstants.CLBIT_HITS; // needed to make sure that hits appear when read back in
+ event.put(m_outputClusterListName, outputClusterList, Cluster.class, flag);
+ }
+
+ /** Clusterer interface. */
+ public List<Cluster> createClusters(Map<Long,CalorimeterHit> map) {
+ List<CalorimeterHit> hits = new Vector<CalorimeterHit>();
+ hits.addAll(map.values());
+ return createClusters(hits);
+ }
+
+ /** Clusterer interface. */
+ public List<Cluster> createClusters(List<CalorimeterHit> hits)
+ {
+ List<Cluster> outputClusterList = new Vector<Cluster>();
// Clone the input hitmap to give a list of unused hits we can edit:
ListFilter<CalorimeterHit> hitFilter = new ListFilter<CalorimeterHit> (m_hitDecision);
- List<CalorimeterHit> inputHits = hitFilter.filterList(inputHitMap.values());
+ List<CalorimeterHit> inputHits = hitFilter.filterList(hits);
// Filter these again, require high local density:
ListFilter<CalorimeterHit> densityFilter = new ListFilter<CalorimeterHit> (new HighHitDensityDecision(inputHits));
List<CalorimeterHit> unusedHits = densityFilter.filterList(inputHits);
@@ -91,16 +121,11 @@
outputClusterList.add(clump);
for (CalorimeterHit hitInClump : clump.getCalorimeterHits()) {
unusedHits.remove(hitInClump);
- outputHitMap.remove(hitInClump.getCellID());
}
}
}
}
-
- // Write out:
- event.put(m_outputHitMapName, outputHitMap);
- int flag = 1<<LCIOConstants.CLBIT_HITS; // needed to make sure that hits appear when read back in
- event.put(m_outputClusterListName, outputClusterList, Cluster.class, flag);
+ return outputClusterList;
}
/**