Commit in lcsim/src/org/lcsim/recon on MAIN
cheater/RemoveMultipleTrackHitsCheater.java+88added 1.1
calorimetry/CalorimeterLayerSelector.java+83added 1.1
+171
2 added files
A helper driver to remove hits from certain layers in a calorimeter collection
A cheating driver to remove multiple hits in overlapping tracking modules

lcsim/src/org/lcsim/recon/cheater
RemoveMultipleTrackHitsCheater.java added at 1.1
diff -N RemoveMultipleTrackHitsCheater.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ RemoveMultipleTrackHitsCheater.java	18 Feb 2011 10:36:55 -0000	1.1
@@ -0,0 +1,88 @@
+package org.lcsim.recon.cheater;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.lcsim.event.EventHeader;
+import org.lcsim.util.Driver;
+import org.lcsim.event.RelationalTable;
+import org.lcsim.event.SimTrackerHit;
+import org.lcsim.event.MCParticle;
+import org.lcsim.event.EventHeader.LCMetaData;
+import org.lcsim.event.base.BaseRelationalTable;
+
+/**
+ * A driver to remove additional tracker hits from the same particle in a tracking layer.
+ * This happens in regions where tracker modules are overlapping.</br>
+ * The SeedTracker takes only one hit per layer and will create additional tracks from the extra hits.
+ * Not removing those additional hits leads to fake tracks as well as a huge loss in performance.</br>
+ * This driver uses monte carlo truth to identify hits belonging to the same particle. It should be run <b>before</b> digitization.
+ * @author <a href="mailto:[log in to unmask]">Christian Grefe</a>
+ *
+ */
+public class RemoveMultipleTrackHitsCheater extends Driver {
+	
+	public RemoveMultipleTrackHitsCheater() {
+
+	}
+	
+	@Override
+	protected void process(EventHeader event) {
+		List<List<SimTrackerHit>> trackerHitCollections = event.get(SimTrackerHit.class);
+		List<MCParticle> mcParticles = event.getMCParticles();
+		
+		// need to relate each mc particle to its hits per collection
+		Map<LCMetaData, RelationalTable<MCParticle, SimTrackerHit>> collectionToMcToHit = new HashMap<LCMetaData, RelationalTable<MCParticle,SimTrackerHit>>();
+		
+		int nHits = 0;
+		
+		// build map of hit to mc particle relation
+		for (List<SimTrackerHit> trackerHitCollection : trackerHitCollections) {
+			nHits += trackerHitCollection.size();
+			LCMetaData meta = event.getMetaData(trackerHitCollection);
+			if (!collectionToMcToHit.containsKey(meta)) {
+				collectionToMcToHit.put(meta, new BaseRelationalTable<MCParticle, SimTrackerHit>(RelationalTable.Mode.ONE_TO_MANY, RelationalTable.Weighting.UNWEIGHTED));
+			}
+			RelationalTable<MCParticle, SimTrackerHit> mcpToHits = collectionToMcToHit.get(meta);
+			
+			for (SimTrackerHit hit : trackerHitCollection) {
+				MCParticle mcParticle = hit.getMCParticle();
+				if (mcParticles.contains(mcParticle)) {
+					mcpToHits.add(mcParticle, hit);
+				}
+			}
+		}
+		
+		int nHitsRemoved = 0;
+		
+		for (LCMetaData meta : collectionToMcToHit.keySet()) {
+			RelationalTable<MCParticle, SimTrackerHit> mcpToHits = collectionToMcToHit.get(meta);
+			
+			for (MCParticle mcp : mcParticles) {
+				Set<SimTrackerHit> hits = mcpToHits.allFrom(mcp);
+				// store which layer has been hit by this mc particle
+				Map<Integer, SimTrackerHit> layerToHits = new HashMap<Integer, SimTrackerHit>();
+				
+				for (SimTrackerHit hit : hits) {
+					int layer = hit.getLayerNumber();
+					if (layerToHits.containsKey(layer)) {
+						SimTrackerHit hit2 = layerToHits.get(layer);
+						// remove hit if in the same layer but not on same module
+						// detector element is a Sensor and the module is one up in the hierarchy
+						if (!hit.getDetectorElement().getParent().equals(hit2.getDetectorElement().getParent())) {
+							event.get(SimTrackerHit.class, meta.getName()).remove(hit);
+							nHitsRemoved++;
+						}
+					} else {
+						// store that this layer had a hit by this mc particle
+						layerToHits.put(layer, hit);
+					}
+				}
+			}
+		}
+		
+		if (this.getHistogramLevel() > Driver.HLEVEL_NORMAL) System.out.println("Removed "+nHitsRemoved+"/"+nHits+" tracker hits");
+	}
+}

lcsim/src/org/lcsim/recon/calorimetry
CalorimeterLayerSelector.java added at 1.1
diff -N CalorimeterLayerSelector.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ CalorimeterLayerSelector.java	18 Feb 2011 10:36:55 -0000	1.1
@@ -0,0 +1,83 @@
+package org.lcsim.recon.calorimetry;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.SimCalorimeterHit;
+import org.lcsim.event.EventHeader.LCMetaData;
+import org.lcsim.util.Driver;
+
+/**
+ * Helper class to select instrumented layers in a calorimeter collection and remove all the other hits from the collection.
+ * @author <a href="mailto:[log in to unmask]">Christian Grefe</a>
+ *
+ */
+public class CalorimeterLayerSelector extends Driver {
+
+	protected String caloCollection = "";
+	protected List<Integer> activeLayers;
+	
+	public CalorimeterLayerSelector() {
+		
+	}
+	
+	public void setCollectionName(String collectionName) {
+		this.caloCollection = collectionName;
+		this.activeLayers = new ArrayList<Integer>();
+	}
+	
+	public void setActiveLayers(int[] layers) {
+		activeLayers.clear();
+		for (int i = 0; i != layers.length; i++) {
+			activeLayers.add(layers[i]);
+		}
+	}
+	
+	@Override
+	protected void process(EventHeader event) {
+		List<SimCalorimeterHit> caloHits = new ArrayList<SimCalorimeterHit>();
+		try {
+			caloHits = event.get(SimCalorimeterHit.class, caloCollection);
+		} catch (Exception e) {
+			System.err.println("Error: Collection "+caloCollection+" does not exist.");
+			return;
+		}
+		if (this.getHistogramLevel() > HLEVEL_HIGH) {
+			System.out.println("Removing calorimeter hits from "+caloCollection+" for all layers except:");
+			for (int layer : activeLayers) {
+				System.out.println("\tLayer "+layer);
+			}
+		}
+		
+		List<SimCalorimeterHit> hitsToKeep = new ArrayList<SimCalorimeterHit>();
+		
+		for (SimCalorimeterHit hit : caloHits) {
+			//System.out.println("Layer: "+ hit.getLayerNumber());
+			if (activeLayers.contains(hit.getLayerNumber())) {
+				//System.out.println("Layer: "+ hit.getLayerNumber());
+				hitsToKeep.add(hit);
+			}
+		}
+		
+		replaceCollection(event.getMetaData(caloHits), hitsToKeep, event);
+	}
+	
+	/**
+	 * Adds a collection to an event using the meta data information from the
+	 * given collection and the entries from the given list.
+	 * @param collection the collection to take the meta data from
+	 * @param entries the list of entries to put into the event
+	 * @param event the event to put the collection
+	 */
+	protected void replaceCollection(LCMetaData collection, List entries, EventHeader event) {
+		event.remove(collection.getName());
+		String[] readout = collection.getStringParameters().get("READOUT_NAME");
+		if (readout != null) {
+			event.put(collection.getName(), entries, collection.getType(), collection.getFlags(), readout[0]);
+		} else {
+			event.put(collection.getName(), entries, collection.getType(), collection.getFlags());
+		}
+	}
+	
+}
CVSspam 0.2.8