Commit in lcsim/src/org/lcsim/recon/cluster/util on MAIN
CalHitMapMgr.java+171-221.2 -> 1.3
GL: Replace SimCalHits with CalorimeterHits where possible

lcsim/src/org/lcsim/recon/cluster/util
CalHitMapMgr.java 1.2 -> 1.3
diff -u -r1.2 -r1.3
--- CalHitMapMgr.java	7 Dec 2005 18:33:49 -0000	1.2
+++ CalHitMapMgr.java	12 Dec 2005 05:12:03 -0000	1.3
@@ -1,12 +1,14 @@
 package org.lcsim.recon.cluster.util;
 
 import java.util.List;
+import java.util.ArrayList;
 import java.util.Map;
 import java.util.HashMap;
 
 import org.lcsim.event.EventHeader;
-import org.lcsim.event.SimCalorimeterHit;
+import org.lcsim.event.CalorimeterHit;
 import org.lcsim.geometry.Detector;
+import org.lcsim.geometry.IDDecoder;
 import org.lcsim.geometry.compact.Subdetector;
 import org.lcsim.geometry.compact.Readout;
 
@@ -15,13 +17,13 @@
  * be randomly accessed from the cellID.  Once filled, the maps can be
  * accessed from *any* class, using e.g.<p>
  *
- *   <code>Map&lt;Long,SimCalorimeterHit&gt; hitmap = CalHitMapMgr.getInstance().getCollHitMap("EcalBarrHits");</code>
+ *   <code>Map&lt;Long,CalorimeterHit&gt; hitmap = CalHitMapMgr.getInstance().getCollHitMap("EcalBarrHits");</code>
  * 
  * <p><em>Note:</em> <code>CalHitMapDriver</code> needs to be
  * processed before the data is available to other classes.
  *
  * @author Guilherme Lima
- * @version $Id: CalHitMapMgr.java,v 1.2 2005/12/07 18:33:49 lima Exp $
+ * @version $Id: CalHitMapMgr.java,v 1.3 2005/12/12 05:12:03 lima Exp $
  * @see CalHitMapDriver
  */
 public class CalHitMapMgr {
@@ -31,7 +33,9 @@
      * constructor)
      */
     public static CalHitMapMgr getInstance() {
-	if( _me == null ) _me = new CalHitMapMgr();
+	if( _me == null ) {
+	    new CalHitMapMgr();
+	}
 	assert _me != null : "Problem constructing CalHitMapMgr.";
 	return _me;
     }
@@ -71,15 +75,20 @@
 	return _subdets.get(readout);
     }
 
+    public IDDecoder getIDDecoder(String colName) {
+	List<CalorimeterHit> coll = _event.get(CalorimeterHit.class,colName);
+	return _event.getMetaData( coll ).getIDDecoder();
+    }
+
     /**
      * Returns a hit map, with all hits contained in a given collection.
      * @param colName name of collection with data to be returned
      */
-    public final Map<Long,SimCalorimeterHit> getCollHitMap(final String colName) {
-	Map<Long,SimCalorimeterHit> retColl = _collMap.get( colName );
+    public final Map<Long,CalorimeterHit> getCollHitMap(final String colName) {
+	Map<Long,CalorimeterHit> retColl = _collMap.get( colName );
 	if(retColl==null) {
 	    // if it does not exist, create it now
-	    retColl = new HashMap<Long,SimCalorimeterHit>();
+	    retColl = new HashMap<Long,CalorimeterHit>();
 	    _collMap.put(colName, retColl);
 	}
 	assert retColl!=null : "retColl is empty for colName="+colName;
@@ -87,21 +96,96 @@
 	return retColl;
     }
 
+    /**
+     * Returns a list with all hits contained in a given layer of a
+     * calorimeter component.
+     * @param colName name of collection with data to be returned
+     * @param layer layer number
+     * @return A List<CalorimeterHit> with all hits in this layer.
+     */
+    public final List<CalorimeterHit> getHitsInLayer(final String colName,
+							int layer) {
+        Map<Integer,List<CalorimeterHit>> tmpMap;
+        List<CalorimeterHit> retColl;
+
+	tmpMap = _layerHitmap.get( colName );
+	if( tmpMap==null ) fillLayerHitMap( colName );
+
+	tmpMap = _layerHitmap.get( colName );
+	assert tmpMap != null  : "getHitsInLayer: empty, colName="+colName;
+
+	retColl = tmpMap.get( layer );
+	if(retColl==null) {
+	    // if it does not exist, create it now
+	    retColl = new ArrayList<CalorimeterHit>();
+	    tmpMap.put(layer, retColl);
+	}
+
+	return retColl;
+    }
+
+    /**
+     * Returns a hit map, with all hits contained in a given layer of a
+     * calorimeter component.
+     * @param colName name of the collection of a calorimeter
+     * component (e.g. "EcalBarrHits")
+     * @param layer layer number
+     * @return number of hits in this layer of the calorimeter component
+     */
+    public final int getHitCountInLayer(final String colName, int layer) {
+
+        Map<Integer,Integer> tmpMap;
+
+	tmpMap = _hitCountersPerLayer.get( colName );
+	if( tmpMap==null ) fillLayerHitMap( colName );
+
+	tmpMap = _hitCountersPerLayer.get( colName );
+	assert tmpMap != null  : "getHitsInLayer: empty, colName="+colName;
+
+	Integer counter = tmpMap.get( layer );
+	if(counter==null) {
+	    // if it does not exist, create it now
+	    counter = new Integer(0);
+	    tmpMap.put(layer, counter);
+	}
+
+	return counter;
+    }
+
+
     /** Private constructor */
     protected CalHitMapMgr() {
-	_collMap = new HashMap< String, Map<Long,SimCalorimeterHit> >();
+	_me = this;
+	_collMap = new HashMap< String, Map<Long,CalorimeterHit> >();
+	_layerHitmap= new HashMap<String,Map<Integer,List<CalorimeterHit>>>();
+	_hitCountersPerLayer = new HashMap<String,Map<Integer,Integer>>();
     }
 
     /** Clear hit maps */
     private void reset() {
+	_subdets.clear();
+
 	// Loop over all existing hit collections
 	for( String key : _collMap.keySet() ) {
 	    // clear hit maps for each subdetector collection
-	    Map<Long,SimCalorimeterHit> subDetHitMap = _collMap.get(key);
+	    Map<Long,CalorimeterHit> subDetHitMap = _collMap.get(key);
 	    subDetHitMap.clear();
 	}
 	_collMap.clear();
-	_subdets.clear();
+
+	for(Map<Integer,List<CalorimeterHit>> imap: _layerHitmap.values())
+	{
+	    for( List<CalorimeterHit> hits : imap.values() ) {
+		hits.clear();
+	    }
+	    imap.clear();
+	}
+	_layerHitmap.clear();
+
+	for( Map<Integer,Integer> imap : _hitCountersPerLayer.values() ) {
+	    imap.clear();
+	}
+	_hitCountersPerLayer.clear();
     }
 
     /**
@@ -110,16 +194,16 @@
      * @param hitmap output map containing
      * @see CalHitMapMgr.setEvent
      */
-    private void fillHitMap( final String colName,
-			     Map<Long,SimCalorimeterHit> hitmap )  {
-
+    protected void fillHitMap( final String colName,
+			     Map<Long,CalorimeterHit> hitmap )  {
+	System.out.println("Using manager to fill hitmaps");
  	assert _event!=null : "No event seems to be available, is CalHitMapDriver added before current driver?";
 
 	// First fill the hit map without defining densities,
 	// as the map may be used for calculating densities
-	List<SimCalorimeterHit> hits = null;
+	List<CalorimeterHit> hits = null;
 	try {
-	    hits = _event.get( SimCalorimeterHit.class, colName );
+	    hits = _event.get( CalorimeterHit.class, colName );
 	}
 // 	catch(DataNotAvailableException e) {
 	catch(Exception e) {
@@ -132,26 +216,91 @@
 	if(hits==null) return;
 
 	for( int i = 0; i<hits.size(); ++i ) {
-	    SimCalorimeterHit ihit = hits.get(i);
+	    CalorimeterHit ihit = hits.get(i);
 	    long cellid = ihit.getCellID();
 
-	    // fill hit map
+	    // fill component hit map
 	    hitmap.put( cellid, ihit );
 	}
     }
 
+    /**
+     * Fills hit maps using data from current event.
+     * @param colName name of hit collection to extract the hits from
+     * @param hitmap output map containing
+     * @see CalHitMapMgr.setEvent
+     */
+    private void fillLayerHitMap( final String colName ) {
+// 				  Map<Integer,List<CalorimeterHit>> layerHits,
+// 				  Map<Integer,Integer> layerHitCounters)  {
+ 	assert _event!=null : "No event seems to be available, is CalHitMapDriver added before current driver?";
+
+	// First fill the hit map without defining densities,
+	// as the map may be used for calculating densities
+	List<CalorimeterHit> hits = null;
+	try {
+	    hits = _event.get( CalorimeterHit.class, colName );
+	}
+// 	catch(DataNotAvailableException e) {
+	catch(Exception e) {
+// 	    System.out.println(" Evt "+_event.getEventNumber()
+// 			       +": No data in collection "+colName);
+	    // This happens quite frequently with tail catcher,
+	    // when no energy leaks into it
+	}
+	// return if no collection in event
+	if(hits==null) return;
+
+	Map<Integer,List<CalorimeterHit>> layerHits;
+	layerHits = _layerHitmap.get( colName );
+	if(layerHits==null) {
+	    layerHits = new HashMap<Integer,List<CalorimeterHit>>();
+	    _layerHitmap.put( colName, layerHits );
+	}
+
+	Map<Integer,Integer> layerCounters = _hitCountersPerLayer.get(colName);
+	if(layerCounters==null) {
+	    layerCounters = new HashMap<Integer,Integer>();
+	    _hitCountersPerLayer.put( colName, layerCounters );
+	}
+
+	IDDecoder decoder = this.getIDDecoder(colName);
+	for( CalorimeterHit ihit : hits ) {
+	    long cellid = ihit.getCellID();
+	    decoder.setID(cellid);
+	    int layer = decoder.getLayer();
+
+	    // fill layer hit map
+	    List<CalorimeterHit> tmpHits = layerHits.get( layer );
+	    if(tmpHits==null) {
+		tmpHits = new ArrayList<CalorimeterHit>();
+		layerHits.put( layer, tmpHits );
+	    }
+	    tmpHits.add(ihit);
+
+	    // increment the appropriate hit counter
+	    Integer tmpCounter = layerCounters.get( layer );
+	    if(tmpCounter==null) {
+		tmpCounter = new Integer(0);
+		layerCounters.put( layer, tmpCounter );
+	    }
+	    ++tmpCounter;
+	}
+    }
+
     //=== FIELDS ===
     /** Singleton instance */
-    private static CalHitMapMgr _me = new CalHitMapMgr();
+    private static CalHitMapMgr _me = null;
     /** Current event */
-    private EventHeader _event;
+    protected EventHeader _event;
     /** Run number */
     private int _runno;
     /** Event number */
     private int _evtno;
     /** Map of hit maps, keyed by collection name where hits come from */
-    private Map< String, Map<Long, SimCalorimeterHit> > _collMap;
+    protected Map< String, Map<Long, CalorimeterHit> > _collMap;
     /** Map of subdetectors keyed by collection names */
-    private Map<String,Subdetector> _subdets = new HashMap<String,Subdetector>();
-    private Map<Integer,List<SimCalorimeterHit>> _layerHitmap;
+    protected Map<String,Subdetector> _subdets = new HashMap<String,Subdetector>();
+    protected Map<String,Map<Integer,List<CalorimeterHit>>> _layerHitmap;
+    protected Map<String,Map<Integer,Integer>> _hitCountersPerLayer;
 }
CVSspam 0.2.8