lcsim/src/org/lcsim/recon/cluster/util
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<Long,SimCalorimeterHit> hitmap = CalHitMapMgr.getInstance().getCollHitMap("EcalBarrHits");</code>
+ * <code>Map<Long,CalorimeterHit> 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;
}