lcsim/src/org/lcsim/contrib/uiowa
diff -N RemoveHitsFromClusters.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ RemoveHitsFromClusters.java 13 Oct 2008 07:16:15 -0000 1.1
@@ -0,0 +1,98 @@
+package org.lcsim.contrib.uiowa;
+
+import java.util.*;
+import org.lcsim.util.Driver;
+import org.lcsim.util.hitmap.HitMap;
+import org.lcsim.event.EventHeader;
+import org.lcsim.util.*;
+import org.lcsim.event.*;
+import org.lcsim.recon.cluster.util.BasicCluster;
+
+public class RemoveHitsFromClusters extends Driver
+{
+ protected String m_inputClusterListName;
+ protected String m_inputMapName;
+ protected String m_outputClusterListName;
+
+ public RemoveHitsFromClusters(String inputClusterList, String inputMap, String outputClusterList) {
+ m_inputClusterListName = inputClusterList;
+ m_inputMapName = inputMap;
+ m_outputClusterListName = outputClusterList;
+ }
+
+ public void process(EventHeader event) {
+ {
+ // DEBUG
+ HitMap hitsEcalBarrel = (HitMap)(event.get("EcalBarrDigiHitMap"));
+ HitMap hitsEcalEndcap = (HitMap)(event.get("EcalEndcapDigiHitMap"));
+ HitMap hitsHcalBarrel = (HitMap)(event.get("HcalBarrDigiHitMap"));
+ HitMap hitsHcalEndcap = (HitMap)(event.get("HcalEndcapDigiHitMap"));
+ HitMap hitsMcalBarrel = (HitMap)(event.get("MuonBarrDigiHitMap"));
+ HitMap hitsMcalEndcap = (HitMap)(event.get("MuonEndcapDigiHitMap"));
+ System.out.println("DEBUG: hitsEcalBarrel contains "+hitsEcalBarrel.size()+" hits");
+ System.out.println("DEBUG: hitsEcalEndcap contains "+hitsEcalEndcap.size()+" hits");
+ System.out.println("DEBUG: hitsHcalBarrel contains "+hitsHcalBarrel.size()+" hits");
+ System.out.println("DEBUG: hitsHcalEndcap contains "+hitsHcalEndcap.size()+" hits");
+ System.out.println("DEBUG: hitsMcalBarrel contains "+hitsMcalBarrel.size()+" hits");
+ System.out.println("DEBUG: hitsMcalEndcap contains "+hitsMcalEndcap.size()+" hits");
+ HitMap test1 = (HitMap)(event.get("AllDigiHitMap"));
+ System.out.println("DEBUG: AllDigiHitMap contains "+test1.size()+" hits");
+ HitMap test2 = (HitMap)(event.get("RecoDigiHitMapWithoutMuons"));
+ System.out.println("DEBUG: RecoDigiHitMapWithoutMuons contains "+test2.size()+" hits");
+ }
+
+ // Which hits will we remove?
+ Map<Track,Cluster> inputMap = (Map<Track,Cluster>)(event.get(m_inputMapName));
+ Set<CalorimeterHit> hitsToRemove = new HashSet<CalorimeterHit>();
+ for (Cluster clus : inputMap.values()) {
+ hitsToRemove.addAll(clus.getCalorimeterHits());
+ }
+ System.out.println("DEBUG: RemoveHitsFromClusters: Flagged "+hitsToRemove.size()+" MIP/muon hits that will be removed if found in a photon cluster");
+ // Remove those:
+ List<Cluster> inputClusterList = event.get(Cluster.class, m_inputClusterListName);
+ List<Cluster> outputClusterList = new Vector<Cluster>();
+ System.out.println("DEBUG: RemoveHitsFromClusters: Will scan "+inputClusterList.size()+" photon clusters...");
+ for (Cluster inputClus : inputClusterList) {
+ // Photons have a core & halo
+ Cluster oldCore = inputClus.getClusters().get(0);
+ Set<CalorimeterHit> oldCoreHits = new HashSet<CalorimeterHit>();
+ oldCoreHits.addAll(oldCore.getCalorimeterHits());
+ Set<CalorimeterHit> oldHaloHits = new HashSet<CalorimeterHit>();
+ oldHaloHits.addAll(inputClus.getCalorimeterHits());
+ oldHaloHits.removeAll(oldCoreHits);
+ if (oldCoreHits.size() + oldHaloHits.size() != inputClus.getCalorimeterHits().size()) { throw new AssertionError("Book-keeping error!"); }
+ System.out.println("DEBUG: RemoveHitsFromClusters: Checking a cluster with "+inputClus.getCalorimeterHits().size()+" hits ("+oldCoreHits.size()+" core + "+oldHaloHits.size()+" halo)");
+ // Remove hits as needed:
+ Set<CalorimeterHit> newCoreHits = new HashSet<CalorimeterHit>();
+ Set<CalorimeterHit> newHaloHits = new HashSet<CalorimeterHit>();
+ newCoreHits.addAll(oldCoreHits);
+ newHaloHits.addAll(oldHaloHits);
+ newCoreHits.removeAll(hitsToRemove);
+ newHaloHits.removeAll(hitsToRemove);
+ System.out.println("DEBUG: RemoveHitsFromClusters: After purging MIP hits, "+newCoreHits.size()+" core + "+newHaloHits.size()+" halo hits remain.");
+ // Build output cluster -- must have at least one hit left in core.
+ if (newCoreHits.size() > 0) {
+ // Set up core & halo hits for new cluster:
+ BasicCluster outputCore = new BasicCluster();
+ BasicCluster outputClus = new BasicCluster();
+ for (CalorimeterHit hit : newCoreHits) {
+ outputCore.addHit(hit);
+ }
+ outputClus.addCluster(outputCore);
+ for (CalorimeterHit hit : newHaloHits) {
+ outputClus.addHit(hit);
+ }
+ // Sanity checks
+ if (outputClus.getCalorimeterHits().size() == 0) { throw new AssertionError("Book-keeping error!"); }
+ if (outputClus.getCalorimeterHits().size() > inputClus.getCalorimeterHits().size() ) { throw new AssertionError("Book-keeping error!"); }
+ // All good -- keep it
+ outputClusterList.add(outputClus);
+ System.out.println("DEBUG: RemoveHitsFromClusters: Wrote out updated cluster with "+outputClus.getCalorimeterHits().size()+" hits.");
+ } else {
+ System.out.println("DEBUG: RemoveHitsFromClusters: Skipped writing an output cluster since there were "+newCoreHits.size()+" core hits left.");
+ }
+ }
+ // Write out
+ event.put(m_outputClusterListName, outputClusterList);
+ }
+}