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; + } +}