lcsim/src/org/lcsim/recon/cheater
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
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());
+ }
+ }
+
+}