Print

Print


Author: [log in to unmask]
Date: Mon Sep  7 13:21:55 2015
New Revision: 3544

Log:
add simple event filter

Added:
    java/trunk/recon/src/main/java/org/hps/recon/filtering/SvtAlignmentFilter.java

Added: java/trunk/recon/src/main/java/org/hps/recon/filtering/SvtAlignmentFilter.java
 =============================================================================
--- java/trunk/recon/src/main/java/org/hps/recon/filtering/SvtAlignmentFilter.java	(added)
+++ java/trunk/recon/src/main/java/org/hps/recon/filtering/SvtAlignmentFilter.java	Mon Sep  7 13:21:55 2015
@@ -0,0 +1,245 @@
+/**
+ * 
+ */
+package org.hps.recon.filtering;
+
+import hep.physics.vec.Hep3Vector;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.hps.recon.tracking.TrackUtils;
+import org.hps.util.BasicLogFormatter;
+import org.lcsim.event.Cluster;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.Track;
+import org.lcsim.lcio.LCIOConstants;
+import org.lcsim.util.log.LogUtil;
+
+/**
+ * 
+ * Filter events to be used for SVT alignment.
+ * 
+ * @author Per Hansson Adrian <[log in to unmask]>
+ *
+ */
+public class SvtAlignmentFilter extends EventReconFilter {
+
+    
+//    private static Logger logger = LogUtil.create(SvtAlignmentFilter.class.getSimpleName(), new BasicLogFormatter(), Level.INFO);
+//    private int minRawHits = 12;
+//    private int minStripClustersPerSensor = 1;
+//    private int maxStripClustersPerSensor = 9999999;
+//    private int minStripClustersInHalf = 12;
+//    private int maxStripClustersInHalf = 9999999;
+//    private int minEcalClustersInHalf = -1;
+//    private int maxEcalClustersInHalf = 99999999;
+//    private Double minStripIsolation = 0.2;
+    
+    
+    @Override
+    protected void process(EventHeader event) {
+     
+        incrementEventProcessed();
+        
+        if(!event.hasCollection(Track.class,"MatchedTracks")) skipEvent();
+        
+        if(!event.hasCollection(Cluster.class, "EcalClusters")) skipEvent();
+        
+        List<Track> tracks = event.get(Track.class, "MatchedTracks");
+        List<Cluster> clusters = event.get(Cluster.class, "EcalClusters");
+        
+        // require track match
+        List<Track> selectedTracks = new ArrayList<Track>();
+
+        for(Track track : tracks) {
+            Hep3Vector posAtEcal = TrackUtils.getTrackPositionAtEcal(tracks.get(0));
+            Cluster cand_clust = findClosestCluster(posAtEcal, clusters);
+            if(cand_clust!=null) {
+                if(Math.abs( posAtEcal.x() - cand_clust.getPosition()[0])<30.0 && 
+                        Math.abs( posAtEcal.y() - cand_clust.getPosition()[1])<30.0) 
+                {
+                    selectedTracks.add(track);
+                }
+            }
+        }
+
+        // remove old track collection
+        event.remove("MatchedTracks");
+        
+        // Put the tracks back into the event
+        int flag = 1 << LCIOConstants.TRBIT_HITS;
+        event.put("MatchedTracks", selectedTracks, Track.class, flag);
+
+        
+        
+        
+        /*
+                
+        if (event.hasCollection(Cluster.class, "EcalClusters")) {
+            List<Cluster> clusters = event.get(Cluster.class, "EcalClusters");
+            int top = 0;
+            int bottom = 0;
+            for (Cluster cluster : clusters) {
+                if (cluster.getPosition()[1] > 0) top++;
+                else bottom++;
+            }
+            
+            boolean passTop = true;
+            if(top < minEcalClustersInHalf || top > maxEcalClustersInHalf) {
+                passTop = false;
+            }
+            boolean passBottom = true;
+            if(bottom < minEcalClustersInHalf || bottom > maxEcalClustersInHalf) {
+                passBottom = false;
+            }
+            
+            logger.info(Integer.toString(bottom) + "(" + Integer.toString(top) + ")" + " ecal clusters in bottom (top)");
+            
+            if( !passTop ) skipEvent();
+            
+            if( !passBottom ) {
+                skipEvent();
+            }
+            
+            
+        } else {
+                logger.info("no ECal clusters in event");
+            
+            skipEvent();
+        }
+        
+        logger.info("Passed ecal cluster selection");
+        
+        if(event.hasCollection(RawTrackerHit.class, "SVTRawTrackerHits")) {
+            
+            List<RawTrackerHit> rawHits = event.get(RawTrackerHit.class, "SVTRawTrackerHits");
+                
+            logger.info("Event has " + Integer.toString(rawHits.size()) + " SVTRawTrackerHits");
+            
+            if( rawHits.size() < minRawHits) {
+                skipEvent();
+            }
+            
+        } else {
+            
+            logger.info("no SVTRawTrackerHits in event");
+            
+            skipEvent();
+        }
+
+        logger.info("Passed raw tracker hit selection");
+        
+        
+        
+        
+        
+        if(event.hasCollection(SiTrackerHitStrip1D.class, "StripClusterer_SiTrackerHitStrip1D")) {
+            
+            List<SiTrackerHitStrip1D> stripClusters = event.get(SiTrackerHitStrip1D.class, "StripClusterer_SiTrackerHitStrip1D");
+  
+            logger.fine("Event has " + Integer.toString(stripClusters.size()) + " StripClusterer_SiTrackerHitStrip1D");
+
+            Map<HpsSiSensor, Integer> nClustersPerSensor = new HashMap<HpsSiSensor , Integer>();
+            Map<HpsSiSensor, Double> stripHitsIso = new HashMap<HpsSiSensor , Double>();
+            int top = 0;
+            int bottom = 0;
+            for(SiTrackerHitStrip1D stripCluster : stripClusters) {
+                HpsSiSensor sensor = (HpsSiSensor) stripCluster.getSensor();
+                if(!nClustersPerSensor.containsKey(sensor)) {
+                    nClustersPerSensor.put(sensor, 1);
+                } 
+                nClustersPerSensor.put(sensor, nClustersPerSensor.get(sensor)+1);
+                logger.fine("strip on " + sensor.getName() + " with " + Integer.toString(stripCluster.getRawHits().size()) + " raw hits");
+                if(sensor.isTopLayer()) top++;
+                else bottom++;
+                
+                
+                SiTrackerHitStrip1D local = stripCluster.getTransformedHit(TrackerHitType.CoordinateSystem.SENSOR);
+                
+                double stripIsoMin = 9999.9;
+                for (SiTrackerHitStrip1D stripHitOther : stripClusters) {
+                    if(stripHitOther.equals(stripCluster)) {
+                        continue;
+                    }
+                    
+                    HpsSiSensor sensorOther = (HpsSiSensor) stripHitOther.getRawHits().get(0).getDetectorElement();
+                    //System.out.println(sensor.getName() + " c.f. " + sensorOther.getName());
+                    if(sensorOther.equals(sensor)) {
+                        SiTrackerHitStrip1D localOther = stripHitOther.getTransformedHit(TrackerHitType.CoordinateSystem.SENSOR);
+                        double d = Math.abs(local.getPosition()[0] - localOther.getPosition()[0]);
+                        //System.out.println(sensor.getName() + " d " + Double.toString(d));
+                        if (d < stripIsoMin && d > 0) {
+                            stripIsoMin = d;
+                        }
+                    }
+                }
+                stripHitsIso.put(sensor, stripIsoMin);
+                
+                
+            }
+            boolean passTop = true;
+            if(top < minStripClustersInHalf || top > maxStripClustersInHalf) {
+                passTop = false;
+            }
+            boolean passBottom = true;
+            if(bottom < minStripClustersInHalf || bottom > maxStripClustersInHalf) {
+                passBottom = false;
+            }
+            
+            logger.info(Integer.toString(bottom) + "(" + Integer.toString(top) + ")" + " strip clusters in bottom (top)");
+            
+            if( !passTop && !passBottom ) {
+                skipEvent();
+            }
+            
+            for(Map.Entry<HpsSiSensor, Integer> entry : nClustersPerSensor.entrySet()) {
+                int n = entry.getValue();
+                if(n < minStripClustersPerSensor || n > maxStripClustersPerSensor) {
+                    skipEvent();
+                }
+            
+                if(stripHitsIso.get(entry.getKey()) < minStripIsolation ) {
+                    skipEvent();
+                }
+            
+            }
+            
+            
+            
+            
+            
+            
+            
+        } else {
+
+            logger.info("no StripClusterer_SiTrackerHitStrip1D in event");
+
+            skipEvent();
+        }
+        
+        logger.info("Passed cluster hit selection");
+        */
+        incrementEventPassed();
+        
+    }
+    
+    
+    private Cluster findClosestCluster(Hep3Vector posonhelix, List<Cluster> clusters) {
+        Cluster closest = null;
+        double minDist = 9999;
+        for (Cluster cluster : clusters) {
+            double[] clPos = cluster.getPosition();
+            double clEne = cluster.getEnergy();
+            double dist = Math.sqrt(Math.pow(clPos[0] - posonhelix.x(), 2) + Math.pow(clPos[1] - posonhelix.y(), 2)); //coordinates!!!
+            if (dist < minDist && clEne > 0.4) {
+                closest = cluster;
+                minDist = dist;
+            }
+        }
+        return closest;
+    }
+       
+}