Print

Print


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