Print

Print


Author: [log in to unmask]
Date: Wed Nov  4 19:09:47 2015
New Revision: 3938

Log:
new filter

Added:
    java/trunk/users/src/main/java/org/hps/users/meeg/TridentMCFilter.java
      - copied, changed from r3922, java/trunk/users/src/main/java/org/hps/users/meeg/KinkAnalysisDriver.java
Modified:
    java/trunk/users/src/main/java/org/hps/users/meeg/KinkAnalysisDriver.java

Modified: java/trunk/users/src/main/java/org/hps/users/meeg/KinkAnalysisDriver.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/meeg/KinkAnalysisDriver.java	(original)
+++ java/trunk/users/src/main/java/org/hps/users/meeg/KinkAnalysisDriver.java	Wed Nov  4 19:09:47 2015
@@ -78,7 +78,6 @@
 //                }
 //            }
 //        }
-
         if (event.hasCollection(ReconstructedParticle.class, "AprimeBeamspotConstrained")) {
             List<ReconstructedParticle> particles = event.get(ReconstructedParticle.class, "AprimeBeamspotConstrained");
             int nvertices = 0;
@@ -101,47 +100,14 @@
 
         for (MCParticle particle : MCParticles) {
             if (particle.getOrigin().magnitude() > 10.0) {
-                hardScatters.add(VecOp.neg(particle.getOrigin()));
-            }
-        }
-
+                hardScatters.add(particle.getOrigin());
+            }
+        }
 
         List<SimTrackerHit> trackerHits = event.get(SimTrackerHit.class, "TrackerHits");
 
 //        Map<MCParticle, List<SimTrackerHit>> hitMap = new HashMap<MCParticle, List<SimTrackerHit>>();
-        Map<MCParticle, Map<Integer, SimTrackerHit>> trackMap = new HashMap<MCParticle, Map<Integer, SimTrackerHit>>();
-
-        for (SimTrackerHit hit : trackerHits) {
-//            List hitList = hitMap.get(hit.getMCParticle());
-//            if (hitList == null) {
-//                hitList = new ArrayList<SimTrackerHit>();
-//                hitMap.put(hit.getMCParticle(), hitList);
-//            }
-//            hitList.add(hit);
-
-            Map<Integer, SimTrackerHit> layerMap = trackMap.get(hit.getMCParticle());
-            if (layerMap == null) {
-                layerMap = new HashMap<Integer, SimTrackerHit>();
-                trackMap.put(hit.getMCParticle(), layerMap);
-            }
-            int layer = hit.getIdentifierFieldValue("layer");
-            if (layerMap.containsKey(layer)) {
-                boolean nearHardScatter = false;
-                for (Hep3Vector scatter : hardScatters) {
-                    if (VecOp.add(hit.getPositionVec(), scatter).magnitude() < 5.0) {
-                        nearHardScatter = true;
-                    }
-                }
-                if (!nearHardScatter) {
-                    hardScatters.add(VecOp.neg(hit.getPositionVec()));
-                }
-//                System.out.format("Double hit in layer %d, %s\n", layer, nearHardScatter ? "near hard scatter" : "not near hard scatter");
-                if (layerMap.get(layer).getPathLength() < hit.getPathLength()) {
-                    continue;
-                }
-            }
-            layerMap.put(layer, hit);
-        }
+        Map<MCParticle, Map<Integer, SimTrackerHit>> trackMap = makeTrackHitMap(trackerHits, hardScatters);
 
         List<MCParticle> particlesWithoutTracks = new ArrayList<MCParticle>();
         for (MCParticle particle : trackMap.keySet()) {
@@ -208,13 +174,12 @@
             frontDP.fill(p1.magnitude() - p2.magnitude());
             frontDT.fill(deflection12);
 
-
             for (int i = 0; i < layers.size() - 1; i++) {
                 SimTrackerHit hit = layerMap.get(layers.get(i));
 
                 boolean nearHardScatter = false;
                 for (Hep3Vector scatter : hardScatters) {
-                    if (VecOp.add(hit.getPositionVec(), scatter).magnitude() < 5.0) {
+                    if (VecOp.sub(hit.getPositionVec(), scatter).magnitude() < 5.0) {
                         nearHardScatter = true;
                     }
                 }
@@ -268,7 +233,7 @@
         }
     }
 
-    private double angle(SimTrackerHit hit1, SimTrackerHit hit2) {
+    private static double angle(SimTrackerHit hit1, SimTrackerHit hit2) {
         double y1 = hit2.getMCParticle().getOriginY();
 //        double z1 = hit2.getMCParticle().getOriginZ();
         double s1 = hit2.getMCParticle().getProductionTime() * PhysicalConstants.c_light;
@@ -286,7 +251,7 @@
         return Math.asin((y2 - y1) / (s2 - s1));
     }
 
-    private double angle(List<Integer> layers, Map<Integer, SimTrackerHit> layerMap, int layer1, int layer2) {
+    private static double angle(List<Integer> layers, Map<Integer, SimTrackerHit> layerMap, int layer1, int layer2) {
         SimTrackerHit hit1 = null;
         if (layer1 > 0) {
             hit1 = layerMap.get(layers.get(layer1 - 1));
@@ -296,7 +261,7 @@
         return angle(hit1, hit2);
     }
 
-    private double deflection(Map<Integer, SimTrackerHit> layerMap, int layer1, int layer2) {
+    static double deflection(Map<Integer, SimTrackerHit> layerMap, int layer1, int layer2) {
         List<Integer> layers = new ArrayList<Integer>(layerMap.keySet());
         Collections.sort(layers);
 
@@ -304,6 +269,38 @@
         double angle2 = angle(layers, layerMap, layer2, layer2 + 1);
 
         return (angle2 - angle1) * Math.signum(angle1);
+    }
+
+    static Map<MCParticle, Map<Integer, SimTrackerHit>> makeTrackHitMap(List<SimTrackerHit> trackerHits, List<Hep3Vector> hardScatters) {
+        Map<MCParticle, Map<Integer, SimTrackerHit>> trackMap = new HashMap<MCParticle, Map<Integer, SimTrackerHit>>();
+
+        for (SimTrackerHit hit : trackerHits) {
+            Map<Integer, SimTrackerHit> layerMap = trackMap.get(hit.getMCParticle());
+            if (layerMap == null) {
+                layerMap = new HashMap<Integer, SimTrackerHit>();
+                trackMap.put(hit.getMCParticle(), layerMap);
+            }
+            int layer = hit.getIdentifierFieldValue("layer");
+            if (layerMap.containsKey(layer)) {
+                if (hardScatters != null) {
+                    boolean nearHardScatter = false;
+                    for (Hep3Vector scatter : hardScatters) {
+                        if (VecOp.sub(hit.getPositionVec(), scatter).magnitude() < 5.0) {
+                            nearHardScatter = true;
+                        }
+                    }
+                    if (!nearHardScatter) {
+                        hardScatters.add(hit.getPositionVec());
+                    }
+                }
+//                System.out.format("Double hit in layer %d, %s\n", layer, nearHardScatter ? "near hard scatter" : "not near hard scatter");
+                if (layerMap.get(layer).getPathLength() < hit.getPathLength()) {
+                    continue;
+                }
+            }
+            layerMap.put(layer, hit);
+        }
+        return trackMap;
     }
 
     @Override

Copied: java/trunk/users/src/main/java/org/hps/users/meeg/TridentMCFilter.java (from r3922, java/trunk/users/src/main/java/org/hps/users/meeg/KinkAnalysisDriver.java)
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/meeg/KinkAnalysisDriver.java	(original)
+++ java/trunk/users/src/main/java/org/hps/users/meeg/TridentMCFilter.java	Wed Nov  4 19:09:47 2015
@@ -1,313 +1,77 @@
 package org.hps.users.meeg;
 
-import hep.aida.IHistogram1D;
-import hep.aida.IHistogram2D;
-import hep.physics.vec.BasicHep3Vector;
-import hep.physics.vec.Hep3Vector;
-import hep.physics.vec.VecOp;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import org.hps.recon.filtering.EventReconFilter;
+import static org.hps.users.meeg.KinkAnalysisDriver.makeTrackHitMap;
 
 import org.lcsim.event.EventHeader;
 import org.lcsim.event.MCParticle;
-import org.lcsim.event.ReconstructedParticle;
 import org.lcsim.event.SimTrackerHit;
-import org.lcsim.event.Vertex;
-import org.lcsim.geometry.Detector;
-import org.lcsim.units.clhep.PhysicalConstants;
-import org.lcsim.util.Driver;
-import org.lcsim.util.aida.AIDA;
 
 /*
  * @author Sho Uemura <[log in to unmask]>
  * @version $Id: KinkAnalysisDriver.java,v 1.3 2013/10/24 18:11:43 meeg Exp $
  */
-public class KinkAnalysisDriver extends Driver {
-
-    private AIDA aida = AIDA.defaultInstance();
-    IHistogram2D dThetaLayer;
-    IHistogram2D dThetaLayerLargestT;
-    IHistogram2D dThetaLayerLargestE;
-    IHistogram2D dThetaLayerScatter;
-    IHistogram2D dThetaLayerNoScatter;
-    IHistogram1D dThetaLargestT;
-    IHistogram1D dThetaLargestE;
-    IHistogram1D layerLargestT;
-    IHistogram1D layerLargestE;
-    IHistogram2D frontDPDT;
-    IHistogram1D frontDP;
-    IHistogram1D frontDT;
-    IHistogram1D bsZ;
-    IHistogram2D twoTrackFrontDT;
-    IHistogram1D frontDTSum;
-    int neventsWithScatter = 0;
-    int hardScatterIsLargestScatter = 0;
-
-    @Override
-    protected void detectorChanged(Detector detector) {
-        dThetaLayer = aida.histogram2D("deflection in Y vs. layer", 12, 0.5, 12.5, 1000, -0.02, 0.02);
-        dThetaLayerScatter = aida.histogram2D("deflection in Y vs. layer, with hard scatter", 12, 0.5, 12.5, 1000, -0.02, 0.02);
-        dThetaLayerNoScatter = aida.histogram2D("deflection in Y vs. layer, no hard scatter", 12, 0.5, 12.5, 1000, -0.02, 0.02);
-        dThetaLayerLargestT = aida.histogram2D("deflection in Y vs. layer, largest scatter in track", 12, 0.5, 12.5, 1000, -0.02, 0.02);
-        dThetaLayerLargestE = aida.histogram2D("deflection in Y vs. layer, largest scatter in event", 12, 0.5, 12.5, 1000, -0.02, 0.02);
-        dThetaLargestT = aida.histogram1D("largest deflection in Y in track", 1000, -0.02, 0.02);
-        dThetaLargestE = aida.histogram1D("largest deflection in Y in event", 1000, -0.02, 0.02);
-        layerLargestT = aida.histogram1D("layer of largest deflection in Y in track", 12, 0.5, 12.5);
-        layerLargestE = aida.histogram1D("layer of largest deflection in Y in event", 12, 0.5, 12.5);
-        frontDPDT = aida.histogram2D("deflection in Y vs. energy loss, front layers", 200, 0.0, 3.0, 1000, -0.02, 0.02);
-        frontDP = aida.histogram1D("energy loss, front layers", 200, 0.0, 3.0);
-        frontDT = aida.histogram1D("deflection in Y, front layers", 1000, -0.02, 0.02);
-        bsZ = aida.histogram1D("vertex Z, BS constrained", 200, -10.0, 20.0);
-        twoTrackFrontDT = aida.histogram2D("deflection in Y, two tracks", 200, -0.02, 0.02, 200, -0.02, 0.02);
-        frontDTSum = aida.histogram1D("sum of deflections in Y, two tracks", 500, -0.02, 0.02);
-    }
+public class TridentMCFilter extends EventReconFilter {
 
     @Override
     public void process(EventHeader event) {
+        List<MCParticle> MCParticles = event.getMCParticles();
 
-//        for (List<ReconstructedParticle> list : event.get(ReconstructedParticle.class)) {
-//            for (ReconstructedParticle particle : list) {
-//                Vertex vertex = particle.getStartVertex();
-//                if (vertex != null) {
-//                    System.out.format("%s: z %f, chisq %f\n", event.getMetaData(list).getName(), vertex.getPosition().x(), vertex.getChi2());
-//                }
-//            }
-//        }
+        List<MCParticle> tridentParticles = null;
 
-        if (event.hasCollection(ReconstructedParticle.class, "AprimeBeamspotConstrained")) {
-            List<ReconstructedParticle> particles = event.get(ReconstructedParticle.class, "AprimeBeamspotConstrained");
-            int nvertices = 0;
-            Vertex theVertex = null;
-            for (ReconstructedParticle particle : particles) {
-                Vertex vertex = particle.getStartVertex();
-                if (vertex != null) {
-                    nvertices++;
-                    theVertex = vertex;
-//                    System.out.println(vertex.getPosition().x());
-                }
-            }
-            if (nvertices == 1) {
-                bsZ.fill(theVertex.getPosition().x());
+        for (MCParticle particle : MCParticles) {
+            if (particle.getPDGID() == 622) {
+                tridentParticles = particle.getDaughters();
             }
         }
 
-        List<MCParticle> MCParticles = event.getMCParticles();
-        List<Hep3Vector> hardScatters = new ArrayList<Hep3Vector>();
-
-        for (MCParticle particle : MCParticles) {
-            if (particle.getOrigin().magnitude() > 10.0) {
-                hardScatters.add(VecOp.neg(particle.getOrigin()));
-            }
+        if (tridentParticles == null) {
+            skipEvent();
         }
-
 
         List<SimTrackerHit> trackerHits = event.get(SimTrackerHit.class, "TrackerHits");
 
-//        Map<MCParticle, List<SimTrackerHit>> hitMap = new HashMap<MCParticle, List<SimTrackerHit>>();
-        Map<MCParticle, Map<Integer, SimTrackerHit>> trackMap = new HashMap<MCParticle, Map<Integer, SimTrackerHit>>();
+        Map<MCParticle, Map<Integer, SimTrackerHit>> trackHitMap = makeTrackHitMap(trackerHits, null);
 
-        for (SimTrackerHit hit : trackerHits) {
-//            List hitList = hitMap.get(hit.getMCParticle());
-//            if (hitList == null) {
-//                hitList = new ArrayList<SimTrackerHit>();
-//                hitMap.put(hit.getMCParticle(), hitList);
-//            }
-//            hitList.add(hit);
+        int nElectronsWithTracks = 0, nPositronsWithTracks = 0;
+        MCParticle electron = null, positron = null;
 
-            Map<Integer, SimTrackerHit> layerMap = trackMap.get(hit.getMCParticle());
-            if (layerMap == null) {
-                layerMap = new HashMap<Integer, SimTrackerHit>();
-                trackMap.put(hit.getMCParticle(), layerMap);
-            }
-            int layer = hit.getIdentifierFieldValue("layer");
-            if (layerMap.containsKey(layer)) {
-                boolean nearHardScatter = false;
-                for (Hep3Vector scatter : hardScatters) {
-                    if (VecOp.add(hit.getPositionVec(), scatter).magnitude() < 5.0) {
-                        nearHardScatter = true;
-                    }
-                }
-                if (!nearHardScatter) {
-                    hardScatters.add(VecOp.neg(hit.getPositionVec()));
-                }
-//                System.out.format("Double hit in layer %d, %s\n", layer, nearHardScatter ? "near hard scatter" : "not near hard scatter");
-                if (layerMap.get(layer).getPathLength() < hit.getPathLength()) {
-                    continue;
-                }
-            }
-            layerMap.put(layer, hit);
-        }
-
-        List<MCParticle> particlesWithoutTracks = new ArrayList<MCParticle>();
-        for (MCParticle particle : trackMap.keySet()) {
-            Set<Integer> layers = trackMap.get(particle).keySet();
+        for (MCParticle particle : tridentParticles) {
+            Set<Integer> layers = trackHitMap.get(particle).keySet();
             int pairCount = 0;
             for (Integer layer : layers) {
                 if (layer % 2 == 0 && layers.contains(layer - 1)) {
                     pairCount++;
                 }
             }
-            if (pairCount < 4) {
-                particlesWithoutTracks.add(particle);
-            }
-        }
-        for (MCParticle particle : particlesWithoutTracks) {
-            trackMap.remove(particle);
-        }
+            boolean hasTrack = (pairCount >= 5);
 
-        MCParticle electron = null, positron = null;
-        for (MCParticle particle : trackMap.keySet()) {
-            if (particle.getCharge() > 0) {
-                if (positron != null) {
-                    return;
-                }
-                positron = particle;
-            }
-            if (particle.getCharge() < 0) {
-                if (electron != null) {
-                    return;
-                }
+            if (hasTrack && particle.getCharge() < 0) {
+                nElectronsWithTracks++;
                 electron = particle;
             }
-        }
-        if (electron == null || positron == null) {
-            return;
-        }
-
-        double maxEventDT = 0.0;
-        int maxEventDTLayer = 0;
-        boolean maxEventDTHardScatter = false;
-
-        double deflection12_ele = deflection(trackMap.get(electron), 0, 4);
-        double deflection12_pos = deflection(trackMap.get(positron), 0, 4);
-        twoTrackFrontDT.fill(deflection12_ele, deflection12_pos);
-        frontDTSum.fill(deflection12_ele + deflection12_pos);
-
-        for (MCParticle particle : trackMap.keySet()) {
-            Map<Integer, SimTrackerHit> layerMap = trackMap.get(particle);
-            List<Integer> layers = new ArrayList<Integer>(layerMap.keySet());
-            Collections.sort(layers);
-            double maxDT = 0.0;
-            int maxDTLayer = 0;
-            boolean maxDTHardScatter = false;
-
-            double angle1 = angle(layers, layerMap, 0, 1);
-            Hep3Vector p1 = particle.getMomentum();
-
-            double angle2 = angle(layers, layerMap, 4, 5);
-            Hep3Vector p2 = new BasicHep3Vector(layerMap.get(layers.get(1)).getMomentum());
-
-            double deflection12 = (angle2 - angle1) * Math.signum(angle1);
-
-            frontDPDT.fill(p1.magnitude() - p2.magnitude(), deflection12);
-            frontDP.fill(p1.magnitude() - p2.magnitude());
-            frontDT.fill(deflection12);
-
-
-            for (int i = 0; i < layers.size() - 1; i++) {
-                SimTrackerHit hit = layerMap.get(layers.get(i));
-
-                boolean nearHardScatter = false;
-                for (Hep3Vector scatter : hardScatters) {
-                    if (VecOp.add(hit.getPositionVec(), scatter).magnitude() < 5.0) {
-                        nearHardScatter = true;
-                    }
-                }
-
-                SimTrackerHit lastHit = null;
-                if (i > 0) {
-                    lastHit = layerMap.get(layers.get(i - 1));
-//                    double theta = Constants.fieldConversion*0.5*PhysicalConstants.c_light;
-                }
-
-                SimTrackerHit nextHit = layerMap.get(layers.get(i + 1));
-
-                double inAngle = angle(lastHit, hit);
-                double outAngle = angle(hit, nextHit);
-
-                double deflectionY = (outAngle - inAngle) * Math.signum(inAngle);
-//                    System.out.format("in: %f, out: %f, delta: %f\n", inAngle,outAngle,deflectionY);
-                dThetaLayer.fill(layers.get(i), deflectionY);
-                if (nearHardScatter) {
-                    dThetaLayerScatter.fill(layers.get(i), deflectionY);
-                } else {
-                    dThetaLayerNoScatter.fill(layers.get(i), deflectionY);
-                }
-                if (Math.abs(deflectionY) > Math.abs(maxDT)) {
-                    maxDT = deflectionY;
-                    maxDTLayer = layers.get(i);
-                    maxDTHardScatter = nearHardScatter;
-                }
-            }
-            if (maxDT != 0.0) {
-                dThetaLargestT.fill(maxDT);
-                layerLargestT.fill(maxDTLayer);
-                dThetaLayerLargestT.fill(maxDTLayer, maxDT);
-            }
-
-            if (Math.abs(maxDT) > Math.abs(maxEventDT)) {
-                maxEventDT = maxDT;
-                maxEventDTLayer = maxDTLayer;
-                maxEventDTHardScatter = maxDTHardScatter;
+            if (hasTrack && particle.getCharge() > 0) {
+                nPositronsWithTracks++;
+                positron = particle;
             }
         }
 
-        if (maxEventDT != 0.0) {
-            dThetaLargestE.fill(maxEventDT);
-            layerLargestE.fill(maxEventDTLayer);
-            dThetaLayerLargestE.fill(maxEventDTLayer, maxEventDT);
-            neventsWithScatter++;
-            if (maxEventDTHardScatter) {
-                hardScatterIsLargestScatter++;
-            }
-        }
-    }
-
-    private double angle(SimTrackerHit hit1, SimTrackerHit hit2) {
-        double y1 = hit2.getMCParticle().getOriginY();
-//        double z1 = hit2.getMCParticle().getOriginZ();
-        double s1 = hit2.getMCParticle().getProductionTime() * PhysicalConstants.c_light;
-        if (hit1 != null) {
-            y1 = hit1.getPosition()[1];
-//            z1 = hit1.getPosition()[2];
-            s1 = hit1.getTime() * PhysicalConstants.c_light;
+        if (electron == null || positron == null) {
+            System.out.println("not enough trident daughters with tracks");
+            skipEvent();
         }
 
-        double y2 = hit2.getPosition()[1];
-//        double z2 = hit2.getPosition()[2];
-        double s2 = hit2.getTime() * PhysicalConstants.c_light;
-//                double outAngle = Math.atan2((nextY - y), (nextZ - z));
+        if (nElectronsWithTracks > 1 || nPositronsWithTracks > 1) {
+            System.out.println("too many trident daughters with tracks");
+            skipEvent();
+        }
 
-        return Math.asin((y2 - y1) / (s2 - s1));
-    }
+//        double deflection12_ele = KinkAnalysisDriver.deflection(trackHitMap.get(electron), 0, 4);
+//        double deflection12_pos = KinkAnalysisDriver.deflection(trackHitMap.get(positron), 0, 4);
+        incrementEventPassed();
 
-    private double angle(List<Integer> layers, Map<Integer, SimTrackerHit> layerMap, int layer1, int layer2) {
-        SimTrackerHit hit1 = null;
-        if (layer1 > 0) {
-            hit1 = layerMap.get(layers.get(layer1 - 1));
-        }
-        SimTrackerHit hit2 = layerMap.get(layers.get(layer2 - 1));
-
-        return angle(hit1, hit2);
-    }
-
-    private double deflection(Map<Integer, SimTrackerHit> layerMap, int layer1, int layer2) {
-        List<Integer> layers = new ArrayList<Integer>(layerMap.keySet());
-        Collections.sort(layers);
-
-        double angle1 = angle(layers, layerMap, layer1, layer1 + 1);
-        double angle2 = angle(layers, layerMap, layer2, layer2 + 1);
-
-        return (angle2 - angle1) * Math.signum(angle1);
-    }
-
-    @Override
-    protected void endOfData() {
-        System.out.format("%d events, %d had hard scatter as largest scatter\n", neventsWithScatter, hardScatterIsLargestScatter);
     }
 }