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