Print

Print


Author: [log in to unmask]
Date: Mon Jun 22 16:34:50 2015
New Revision: 3182

Log:
add filters I've been using

Added:
    java/trunk/recon/src/main/java/org/hps/recon/filtering/CollectionSizeFilter.java
    java/trunk/recon/src/main/java/org/hps/recon/filtering/EcalPairsFilter.java
    java/trunk/recon/src/main/java/org/hps/recon/filtering/SVTSmallHitsFilter.java

Added: java/trunk/recon/src/main/java/org/hps/recon/filtering/CollectionSizeFilter.java
 =============================================================================
--- java/trunk/recon/src/main/java/org/hps/recon/filtering/CollectionSizeFilter.java	(added)
+++ java/trunk/recon/src/main/java/org/hps/recon/filtering/CollectionSizeFilter.java	Mon Jun 22 16:34:50 2015
@@ -0,0 +1,39 @@
+package org.hps.recon.filtering;
+
+import java.util.List;
+import org.lcsim.event.EventHeader;
+
+/**
+ * Accept events where the specified collection exists and is of at least the
+ * required size.
+ *
+ * @author Sho Uemura <[log in to unmask]>
+ * @version $Id: $
+ */
+public class CollectionSizeFilter extends EventReconFilter {
+
+    private String collectionName = "UnconstrainedV0Candidates";
+    private int minSize = 1;
+
+    public void setCollectionName(String collectionName) {
+        this.collectionName = collectionName;
+    }
+
+    public void setMinSize(int minSize) {
+        this.minSize = minSize;
+    }
+
+    @Override
+    public void process(EventHeader event) {
+        incrementEventProcessed();
+        if (event.hasCollection(Object.class, collectionName)) {
+            List<Object> collection = event.get(Object.class, collectionName);
+            if (collection.size() < minSize) {
+                skipEvent();
+            }
+        } else {
+            skipEvent();
+        }
+        incrementEventPassed();
+    }
+}

Added: java/trunk/recon/src/main/java/org/hps/recon/filtering/EcalPairsFilter.java
 =============================================================================
--- java/trunk/recon/src/main/java/org/hps/recon/filtering/EcalPairsFilter.java	(added)
+++ java/trunk/recon/src/main/java/org/hps/recon/filtering/EcalPairsFilter.java	Mon Jun 22 16:34:50 2015
@@ -0,0 +1,59 @@
+package org.hps.recon.filtering;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import org.hps.recon.ecal.cluster.ClusterUtilities;
+import org.lcsim.event.Cluster;
+import org.lcsim.event.EventHeader;
+
+/**
+ * Accept events containing a pair of ECal clusters within a set time
+ * coincidence.
+ *
+ * @author Sho Uemura <[log in to unmask]>
+ * @version $Id: $
+ */
+public class EcalPairsFilter extends EventReconFilter {
+
+    private String clusterCollectionName = "EcalClusters";
+    private double maxDt = 5.0;
+
+    public void setClusterCollectionName(String clusterCollectionName) {
+        this.clusterCollectionName = clusterCollectionName;
+    }
+
+    public void setMaxDt(double maxDt) {
+        this.maxDt = maxDt;
+    }
+
+    @Override
+    public void process(EventHeader event) {
+        incrementEventProcessed();
+        if (event.hasCollection(Cluster.class, clusterCollectionName)) {
+            List<Cluster> clusters = event.get(Cluster.class, clusterCollectionName);
+            if (clusters.size() < 2) {
+                skipEvent();
+            }
+            List<Double> clusterTimes = new ArrayList<Double>();
+            for (Cluster cluster : clusters) {
+                clusterTimes.add(ClusterUtilities.getSeedHitTime(cluster));
+            }
+            Collections.sort(clusterTimes);
+            boolean acceptEvent = false;
+            for (int i = 0; i < clusterTimes.size() - 1; i++) {
+                double dt = clusterTimes.get(i + 1) - clusterTimes.get(i);
+//                System.out.println(dt);
+                if (dt < maxDt) {
+                    acceptEvent = true;
+                }
+            }
+            if (!acceptEvent) {
+                skipEvent();
+            }
+        } else {
+                skipEvent();
+        }
+        incrementEventPassed();
+    }
+}

Added: java/trunk/recon/src/main/java/org/hps/recon/filtering/SVTSmallHitsFilter.java
 =============================================================================
--- java/trunk/recon/src/main/java/org/hps/recon/filtering/SVTSmallHitsFilter.java	(added)
+++ java/trunk/recon/src/main/java/org/hps/recon/filtering/SVTSmallHitsFilter.java	Mon Jun 22 16:34:50 2015
@@ -0,0 +1,77 @@
+package org.hps.recon.filtering;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.lcsim.detector.tracker.silicon.HpsSiSensor;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.RawTrackerHit;
+
+/**
+ * Reject events with noise hits in the SVT. This cut rejects events affected by
+ * burst-mode noise.
+ *
+ * @author Sho Uemura <[log in to unmask]>
+ * @version $Id: $
+ */
+public class SVTSmallHitsFilter extends EventReconFilter {
+
+    @Override
+    public void process(EventHeader event) {
+        incrementEventProcessed();
+
+        if (event.hasCollection(RawTrackerHit.class, "SVTRawTrackerHits")) {
+            // Get RawTrackerHit collection from event.
+            List<RawTrackerHit> rawHits = event.get(RawTrackerHit.class, "SVTRawTrackerHits");
+
+            if (countSmallHits(rawHits) > 3) {
+                skipEvent();
+            }
+        } else {
+            skipEvent();
+        }
+        incrementEventPassed();
+    }
+
+    public static int countSmallHits(List<RawTrackerHit> rawHits) {
+        int smallHitCount = 0;
+        Map<HpsSiSensor, Set<Integer>> hitMap = new HashMap<HpsSiSensor, Set<Integer>>();
+
+        for (RawTrackerHit hit : rawHits) {
+            HpsSiSensor sensor = (HpsSiSensor) hit.getDetectorElement();
+            Set<Integer> hitStrips = hitMap.get(sensor);
+            if (hitStrips == null) {
+                hitStrips = new HashSet<Integer>();
+                hitMap.put(sensor, hitStrips);
+            }
+            int strip = hit.getIdentifierFieldValue("strip");
+            hitStrips.add(strip);
+        }
+
+        for (RawTrackerHit hit : rawHits) {
+            if (isSmallHit(hitMap, hit)) {
+                smallHitCount++;
+            }
+        }
+        return smallHitCount;
+    }
+
+    public static boolean isSmallHit(Map<HpsSiSensor, Set<Integer>> hitMap, RawTrackerHit hit) {
+        HpsSiSensor sensor = (HpsSiSensor) hit.getDetectorElement();
+        int strip = hit.getIdentifierFieldValue("strip");
+        double pedestal = sensor.getPedestal(strip, 0);
+        double noise = sensor.getNoise(strip, 0);
+
+        if (hitMap.get(sensor) != null && (hitMap.get(sensor).contains(strip - 1) || hitMap.get(sensor).contains(strip + 1))) {
+            return false;
+        }
+        for (int i = 0; i < 6; i++) {
+            if (hit.getADCValues()[i] > pedestal + 4.0 * noise) {
+                return false;
+            }
+        }
+        return true;
+    }
+}