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