Author: [log in to unmask]
Date: Thu Jan 7 16:08:35 2016
New Revision: 4105
Log:
rawhitfilter
Added:
java/trunk/recon/src/main/java/org/hps/recon/filtering/SvtRawHitMultiplicityFilter.java
Added: java/trunk/recon/src/main/java/org/hps/recon/filtering/SvtRawHitMultiplicityFilter.java
=============================================================================
--- java/trunk/recon/src/main/java/org/hps/recon/filtering/SvtRawHitMultiplicityFilter.java (added)
+++ java/trunk/recon/src/main/java/org/hps/recon/filtering/SvtRawHitMultiplicityFilter.java Thu Jan 7 16:08:35 2016
@@ -0,0 +1,215 @@
+/**
+ *
+ */
+package org.hps.recon.filtering;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.hps.recon.tracking.SvtPlotUtils;
+import org.lcsim.detector.tracker.silicon.HpsSiSensor;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.RawTrackerHit;
+import org.lcsim.geometry.compact.converter.HPSTrackerBuilder;
+import org.lcsim.recon.tracking.digitization.sisim.SiTrackerHitStrip1D;
+
+/**
+ *
+ * Filter events based on max nr of strip hits
+ *
+ * @author Per Hansson Adrian <[log in to unmask]>
+ *
+ */
+public class SvtRawHitMultiplicityFilter extends EventReconFilter {
+
+ private Logger logger = Logger.getLogger(SvtRawHitMultiplicityFilter.class.getSimpleName());
+ private int minHitsPerSensor = 1;
+ private int maxHitsPerSensor = -1;
+ private int minHitsPerHalf = 3;
+ private int maxHitsPerHalf = -1;
+ private final String rawTrackerHitCollectionName = "SVTRawTrackerHits";
+ private final boolean dropSmallHitEvents = true;
+
+ public SvtRawHitMultiplicityFilter() {
+ logger.setLevel(Level.INFO);
+ }
+
+ @Override
+ protected void process(EventHeader event) {
+
+ incrementEventProcessed();
+
+
+ if(!event.hasCollection(RawTrackerHit.class, rawTrackerHitCollectionName))
+ skipEvent();
+
+ List<RawTrackerHit> rawHits = event.get(RawTrackerHit.class, rawTrackerHitCollectionName);
+
+ if (dropSmallHitEvents && SvtPlotUtils.countSmallHits(rawHits) > 3) {
+ return;
+ }
+
+ int nhits[] = {0,0};
+ Map<String, List<RawTrackerHit> > sensorHitMap = new HashMap<String, List<RawTrackerHit>>();
+ for (RawTrackerHit rawHit : rawHits) {
+ HpsSiSensor sensor = (HpsSiSensor) rawHit.getDetectorElement();
+
+ boolean isTop = sensor.isTopLayer();
+ if(isTop)
+ nhits[0]++;
+ else
+ nhits[1]++;
+
+ String name = sensor.getName();
+ List<RawTrackerHit> hits;
+ if(sensorHitMap.containsKey(name))
+ hits = sensorHitMap.get(name);
+ else {
+ hits = new ArrayList<RawTrackerHit>();
+ sensorHitMap.put(name, hits);
+ }
+ hits.add(rawHit);
+ }
+
+
+ // check top and bottom hit multiplicity
+ if(minHitsPerHalf >= 0 && nhits[0] < minHitsPerHalf)
+ skipEvent();
+ if(minHitsPerHalf >= 0 && nhits[1] < minHitsPerHalf)
+ skipEvent();
+ if(maxHitsPerHalf >= 0 && nhits[0] > maxHitsPerHalf)
+ skipEvent();
+ if(maxHitsPerHalf >= 0 && nhits[1] > maxHitsPerHalf)
+ skipEvent();
+
+ Map<Integer, List<RawTrackerHit>> trackCandL13Top = new HashMap<Integer, List<RawTrackerHit>>();
+ Map<Integer, List<RawTrackerHit>> trackCandL13Bot = new HashMap<Integer, List<RawTrackerHit>>();
+ Map<Integer, List<RawTrackerHit>> trackCandL46TopH = new HashMap<Integer, List<RawTrackerHit>>();
+ Map<Integer, List<RawTrackerHit>> trackCandL46BotH = new HashMap<Integer, List<RawTrackerHit>>();
+ Map<Integer, List<RawTrackerHit>> trackCandL46TopS = new HashMap<Integer, List<RawTrackerHit>>();
+ Map<Integer, List<RawTrackerHit>> trackCandL46BotS = new HashMap<Integer, List<RawTrackerHit>>();
+
+ for(Map.Entry<String, List<RawTrackerHit>> entry : sensorHitMap.entrySet()) {
+
+ // check multiplicity on the sensor
+ int n = entry.getValue().size();
+ if(minHitsPerSensor >= 0 && n < minHitsPerSensor)
+ continue;
+ if(maxHitsPerSensor >= 0 && n > maxHitsPerSensor)
+ continue;
+
+ int layer = HPSTrackerBuilder.getLayerFromVolumeName(entry.getKey());
+ boolean isTop = HPSTrackerBuilder.getHalfFromName(entry.getKey()).equalsIgnoreCase("top") ? true : false;
+
+ if (layer < 4) {
+ List<RawTrackerHit> list;
+ if( isTop ) {
+ if (trackCandL13Top.containsKey(layer)) {
+ list = trackCandL13Top.get(layer);
+ } else {
+ list = new ArrayList<RawTrackerHit>();
+ trackCandL13Top.put(layer,list);
+ }
+ } else {
+ if (trackCandL13Bot.containsKey(layer)) {
+ list = trackCandL13Bot.get(layer);
+ } else {
+ list = new ArrayList<RawTrackerHit>();
+ trackCandL13Bot.put(layer,list);
+ }
+ }
+ list.addAll(entry.getValue());
+
+ } else {
+ List<RawTrackerHit> list;
+ boolean isHole = HPSTrackerBuilder.isHoleFromName(entry.getKey());
+ if( isTop ) {
+ if( isHole ) {
+ if (trackCandL46TopH.containsKey(layer)) {
+ list = trackCandL46TopH.get(layer);
+ } else {
+ list = new ArrayList<RawTrackerHit>();
+ trackCandL46TopH.put(layer,list);
+ }
+ } else {
+ if (trackCandL46TopS.containsKey(layer)) {
+ list = trackCandL46TopS.get(layer);
+ } else {
+ list = new ArrayList<RawTrackerHit>();
+ trackCandL46TopS.put(layer,list);
+ }
+ }
+ } else {
+ if( isHole ) {
+ if (trackCandL46BotH.containsKey(layer)) {
+ list = trackCandL46BotH.get(layer);
+ } else {
+ list = new ArrayList<RawTrackerHit>();
+ trackCandL46BotH.put(layer,list);
+ }
+ } else {
+ if (trackCandL46BotS.containsKey(layer)) {
+ list = trackCandL46BotS.get(layer);
+ } else {
+ list = new ArrayList<RawTrackerHit>();
+ trackCandL46BotS.put(layer,list);
+ }
+ }
+ }
+ list.addAll(entry.getValue());
+
+ }
+ }
+
+
+ // require candidate tracks in L13 and L46 in the same half
+
+
+ StringBuffer sb = new StringBuffer();
+ sb.append("Event with " + rawHits.size() + " hits passed:\n");
+ for(RawTrackerHit hit : rawHits) {
+ sb.append(hit.getDetectorElement().getName() + "\n");
+ }
+ logger.info(sb.toString());
+
+ incrementEventPassed();
+
+ }
+
+ public void setMinHitsPerSensor(int minHitsPerSensor) {
+ this.minHitsPerSensor = minHitsPerSensor;
+ }
+
+ public void setMaxHitsPerSensor(int maxHitsPerSensor) {
+ this.maxHitsPerSensor = maxHitsPerSensor;
+ }
+
+ public void setMinHitsPerHalf(int minHitsPerHalf) {
+ this.minHitsPerHalf = minHitsPerHalf;
+ }
+
+ public void setMaxHitsPerHalf(int maxHitsPerHalf) {
+ this.maxHitsPerHalf = maxHitsPerHalf;
+ }
+
+/*
+ private static class Sensor {
+ boolean isAxial;
+ SiSensor
+ List<RawTrackerHit> hits = new ArrayList<>();
+ Sensor(boolean isAxial) {
+ this.isAxial = isAxial;
+ }
+
+ }
+ private static class Pair {
+ HpsSiSensor axialSensor;
+ HpsSiSensor stereoSensor;
+
+ }
+ */
+}
|