Author: [log in to unmask]
Date: Thu Jun 25 01:55:38 2015
New Revision: 3201
Log:
Updated so it works with the engineering run detector.
Modified:
java/trunk/users/src/main/java/org/hps/users/omoreno/SvtHitEfficiency.java
Modified: java/trunk/users/src/main/java/org/hps/users/omoreno/SvtHitEfficiency.java
=============================================================================
--- java/trunk/users/src/main/java/org/hps/users/omoreno/SvtHitEfficiency.java (original)
+++ java/trunk/users/src/main/java/org/hps/users/omoreno/SvtHitEfficiency.java Thu Jun 25 01:55:38 2015
@@ -26,12 +26,13 @@
import org.lcsim.detector.tracker.silicon.SiSensor;
import org.lcsim.detector.tracker.silicon.SiStrips;
import org.lcsim.event.EventHeader;
+import org.lcsim.event.RawTrackerHit;
import org.lcsim.event.ReconstructedParticle;
import org.lcsim.event.Track;
import org.lcsim.event.TrackerHit;
-import org.lcsim.fit.helicaltrack.HelicalTrackHit;
import org.lcsim.geometry.Detector;
import org.lcsim.util.Driver;
+
import org.hps.recon.tracking.TrackUtils;
import org.hps.recon.tracking.TrackerHitUtils;
@@ -61,8 +62,8 @@
//private Map<SiSensor, Map<Integer, Hep3Vector>> stripPositions = new HashMap<SiSensor, Map<Integer, Hep3Vector>>();
private List<HpsSiSensor> sensors = null;
private Map<Track, ReconstructedParticle> reconParticleMap = new HashMap<Track, ReconstructedParticle>();
- private Map<Integer, SvtStereoLayer> topStereoLayers = new HashMap<Integer, SvtStereoLayer>();
- private Map<Integer, SvtStereoLayer> bottomStereoLayers = new HashMap<Integer, SvtStereoLayer>();
+ private Map<Integer, List<SvtStereoLayer>> topStereoLayers = new HashMap<Integer, List<SvtStereoLayer>>();
+ private Map<Integer, List<SvtStereoLayer>> bottomStereoLayers = new HashMap<Integer, List<SvtStereoLayer>>();
TrackerHitUtils trackerHitUtils = new TrackerHitUtils();
@@ -151,20 +152,20 @@
List<SvtStereoLayer> stereoLayers
= ((HpsTracker2) detector.getSubdetector(SUBDETECTOR_NAME).getDetectorElement()).getStereoPairs();
for (SvtStereoLayer stereoLayer : stereoLayers) {
- if (stereoLayer.getAxialSensor().isTopLayer()) {
- topStereoLayers.put(stereoLayer.getLayerNumber(), stereoLayer);
+ if (stereoLayer.getAxialSensor().isTopLayer()) {
+ //System.out.println("Adding stereo layer " + stereoLayer.getLayerNumber());
+ if (!topStereoLayers.containsKey(stereoLayer.getLayerNumber())) {
+ topStereoLayers.put(stereoLayer.getLayerNumber(), new ArrayList<SvtStereoLayer>());
+ }
+ topStereoLayers.get(stereoLayer.getLayerNumber()).add(stereoLayer);
} else {
- bottomStereoLayers.put(stereoLayer.getLayerNumber(), stereoLayer);
- }
- }
-
- /*
- String title = null;
- IHistogram2D histo2D = null;
- IHistogram1D histo1D = null;
- ICloud2D cloud2D = null;
- */
-
+ if (!bottomStereoLayers.containsKey(stereoLayer.getLayerNumber())) {
+ bottomStereoLayers.put(stereoLayer.getLayerNumber(), new ArrayList<SvtStereoLayer>());
+ }
+ bottomStereoLayers.get(stereoLayer.getLayerNumber()).add(stereoLayer);
+ }
+ }
+
plotters.put("Event Information", plotterFactory.create("Event information"));
plotters.get("Event Information").createRegions(2, 3);
@@ -175,16 +176,21 @@
plotters.get("Event Information").region(1).plot(trackPlots.get("Unused Layer"));
plotters.put("Track Momentum", plotterFactory.create("Track Momentum"));
- plotters.get("Track Momentum").createRegions(1, 2);
+ plotters.get("Track Momentum").createRegions(2, 2);
trackMomentumPlots.put("Track Momentum", histogramFactory.createHistogram1D("Track Momentum", 50, 0, 1.5));
plotters.get("Track Momentum").region(0).plot(trackMomentumPlots.get("Track Momentum"));
trackMomentumPlots.put("Track Momentum - Tracks Within Acceptance",
histogramFactory.createHistogram1D("Track Momentum - Tracks Within Acceptance", 50, 0, 1.5));
- plotters.get("Track Momentum").region(0)
+ plotters.get("Track Momentum").region(1)
.plot(trackMomentumPlots.get("Track Momentum - Tracks Within Acceptance"));
+ trackMomentumPlots.put("Track Momentum - All Layers Hit",
+ histogramFactory.createHistogram1D("Track Momentum - All Layers Hit", 50, 0, 1.5));
+ plotters.get("Track Momentum").region(2)
+ .plot(trackMomentumPlots.get("Track Momentum - All Layers Hit"));
+
// Create a Map from sensor to bad channels and from bad channels to
// strip position
/*
@@ -300,6 +306,9 @@
trackPlots.get("Number of tracks").fill(tracks.size());
+ // Get all of the stereo hits in the event
+ List<TrackerHit> stereoHits = event.get(TrackerHit.class, stereoHitCollectionName);
+
// Get the list of Ecal clusters from the event
//List<Cluster> ecalClusters = event.get(Cluster.class, ecalClustersCollectionName);
@@ -325,9 +334,64 @@
// Extrapolate the track to the unused layer and check that it lies
// within the acceptance of that layer. If it doesn't, move on
// to the next event
- //if(!isWithinAcceptance(track, unusedLayer)) continue;
-
+ if(!isWithinAcceptance(track, unusedLayer)) continue;
+
+ HpsSiSensor trackSensor = (HpsSiSensor) ((RawTrackerHit)track.getTrackerHits().get(0).getRawHits().get(0)).getDetectorElement();
+
+ if (trackSensor.isTopLayer()) {
+ numberOfTopTracks++;
+ } else {
+ numberOfBottomTracks++;
+ }
+
trackMomentumPlots.get("Track Momentum - Tracks Within Acceptance").fill(p);
+
+ // Check if there is a stereo hit within some distance of the track
+ // in the unused layer
+ for (TrackerHit stereoHit : stereoHits) {
+
+ // Retrieve the sensor associated with one of the hits. This will
+ // be used to retrieve the layer number
+ HpsSiSensor hitSensor = (HpsSiSensor) ((RawTrackerHit) stereoHit.getRawHits().get(0)).getDetectorElement();
+
+ if ((trackSensor.isTopLayer() && hitSensor.isBottomLayer())
+ || (trackSensor.isBottomLayer() && hitSensor.isTopLayer())) continue;
+
+ // Retrieve the layer number by using the sensor
+ int layer = (hitSensor.getLayerNumber() + 1)/2;
+
+ if (unusedLayer == layer) {
+ trackMomentumPlots.get("Track Momentum - All Layers Hit").fill(p);
+
+ if (hitSensor.isTopLayer()) {
+ numberOfTopTracksWithHitOnMissingLayer++;
+ } else {
+ numberOfBottomTracksWithHitOnMissingLayer++;
+ }
+
+ return;
+ }
+ }
+
+ /*
+ for(HelicalTrackHit stereoHit : stereoHits){
+ if(layer == stereoHit.Layer()){
+ if(debug) System.out.println(this.getClass().getSimpleName() + ": Track has five layers hit");
+ if(TrackUtils.getZ0(track) > 0){
+ topTracksWithHitOnMissingLayer[arrayPosition]++;
+ } else {
+ bottomTracksWithHitOnMissingLayer[arrayPosition]++;
+ }
+ if(enableMomentumPlots)
+ aida.histogram1D("Track Momentum - Tracks With All Layers Hit").fill(momentum);
+ if(enableChiSquaredPlots)
+ aida.histogram1D("Chi Squared - Tracks With All Layers Hit").fill(track.getChi2());
+
+ return;
+ }
+ }*/
+
+
//ecalClusterTrackMatch = false;
// Check if there is an Ecal cluster in the same detector volume as the track
@@ -349,39 +413,9 @@
}*/
- //int arrayPosition = (layer - 1)/2;
-
- //if(TrackUtils.getZ0(track) > 0){
- //numberOfTopTracks++;
- //topTracksPerMissingLayer[arrayPosition]++;
- //} else {
- //numberOfBottomTracks++;
- //bottomTracksPerMissingLayer[arrayPosition]++;
- //}
-
//if(enableChiSquaredPlots)
// aida.histogram1D("Chi Squared - Tracks Within Acceptance").fill(track.getChi2());
- // Find if there is a stereo hit within that layer
- /*List<HelicalTrackHit> stereoHits = event.get(HelicalTrackHit.class, stereoHitCollectionName);
- for(HelicalTrackHit stereoHit : stereoHits){
- if(layer == stereoHit.Layer()){
- if(debug) System.out.println(this.getClass().getSimpleName() + ": Track has five layers hit");
- if(TrackUtils.getZ0(track) > 0){
- numberOfTopTracksWithHitOnMissingLayer++;
- topTracksWithHitOnMissingLayer[arrayPosition]++;
- } else {
- numberOfBottomTracksWithHitOnMissingLayer++;
- bottomTracksWithHitOnMissingLayer[arrayPosition]++;
- }
- if(enableMomentumPlots)
- aida.histogram1D("Track Momentum - Tracks With All Layers Hit").fill(momentum);
- if(enableChiSquaredPlots)
- aida.histogram1D("Chi Squared - Tracks With All Layers Hit").fill(track.getChi2());
-
- return;
- }
- }*/
/*int layerNumber = (layer - 1)/2 + 1;
if(enableTrackPositionPlots){
@@ -416,81 +450,102 @@
* @param hits : List of stereo hits associated with a track
* @return Layer not used in the track fit
*/
- private int getUnusedSvtLayer(List<TrackerHit> hits) {
+ private int getUnusedSvtLayer(List<TrackerHit> stereoHits) {
int[] svtLayer = new int[6];
- for (TrackerHit hit : hits) {
+
+ // Loop over all of the stereo hits associated with the track
+ for (TrackerHit stereoHit : stereoHits) {
+
+ // Retrieve the sensor associated with one of the hits. This will
+ // be used to retrieve the layer number
+ HpsSiSensor sensor = (HpsSiSensor) ((RawTrackerHit) stereoHit.getRawHits().get(0)).getDetectorElement();
+
+ // Retrieve the layer number by using the sensor
+ int layer = (sensor.getLayerNumber() + 1)/2;
- int layer = -1;
- switch ((int) Math.floor(hit.getPosition()[0])/100) {
- case 1:
- layer = 1;
- break;
- case 2:
- layer = 2;
- break;
- case 3:
- layer = 3;
- break;
- case 5:
- layer = 4;
- break;
- case 7:
- layer = 5;
- break;
- case 9:
- layer = 6;
- break;
- default:
- throw new RuntimeException("Layer not found");
- }
- svtLayer[layer - 1]++;
- }
-
+ // If a hit is associated with that layer, increment its
+ // corresponding counter
+ svtLayer[layer - 1]++;
+ }
+
+ // Loop through the layer counters and find which layer has not been
+ // incremented i.e. is unused by the track
for(int layer = 0; layer < svtLayer.length; layer++){
- if(svtLayer[layer] == 0) return layer;
- }
-
+ if(svtLayer[layer] == 0) {
+ System.out.println("Layer number " + (layer+1) + " is not used");
+ return (layer + 1);
+ }
+ }
+
+ // If all of the layers are being used, this track can't be used to
+ // in the single hit efficiency calculation. This means that something
+ // is wrong with the file
+ // TODO: This should probably throw an exception
return -1;
}
/**
- * Check if a track lies within the acceptance of a layer.
- *
- */
- // TODO: Move this to a utility class
+ * Extrapolate a track to a layer and check that it lies within its
+ * acceptance.
+ *
+ * @param track The track that will be extrapolated to the layer of interest
+ * @param layer The layer number to extrapolate to
+ * @return true if the track lies within the sensor acceptance, false otherwise
+ */
private boolean isWithinAcceptance(Track track, int layer) {
-
-
- List<HpsSiSensor> sensors = new ArrayList<HpsSiSensor>();
- /*if(TrackUtils.getZ0(track) > 0){
- //sensors.add(SvtUtils.getInstance().getTopSensor(layer, 0));
- //sensors.add(SvtUtils.getInstance().getTopSensor(layer + 1, 0));
+ // TODO: Move this to a utility class
+
+ //System.out.println("Retrieving sensors for layer: " + layer);
+
+ // Since TrackUtils.isTop/BottomTrack does not work when running off
+ // a recon file, get the detector volume that a track is associated
+ // with by using the sensor. This assumes that a track is always
+ // composed by stereo hits that lie within a single detector volume
+ HpsSiSensor sensor = (HpsSiSensor) ((RawTrackerHit)track.getTrackerHits().get(0).getRawHits().get(0)).getDetectorElement();
+
+ // Get the sensors associated with the layer that the track
+ // will be extrapolated to
+ List<SvtStereoLayer> stereoLayers = null;
+
+ // if (TrackUtils.isTopTrack(track, track.getTrackerHits().size())) {
+ if (sensor.isTopLayer()) {
+ //System.out.println("Top track found.");
+ stereoLayers = this.topStereoLayers.get(layer);
+ //} else if (TrackUtils.isBottomTrack(track, track.getTrackerHits().size())) {
} else {
- //sensors.add(SvtUtils.getInstance().getBottomSensor(layer, 0));
- //sensors.add(SvtUtils.getInstance().getBottomSensor(layer + 1, 0));
- }*/
-
- Hep3Vector frontSensorPos = sensors.get(0).getGeometry().getPosition();
- Hep3Vector rearSensorPos = sensors.get(1).getGeometry().getPosition();
-
- this.frontTrackPos = TrackUtils.extrapolateTrack(track,frontSensorPos.z());
- this.rearTrackPos = TrackUtils.extrapolateTrack(track,rearSensorPos.z());
-
- if(this.sensorContainsTrack(frontTrackPos, sensors.get(0)) && this.sensorContainsTrack(rearTrackPos, sensors.get(1))){
-// if(this.sensorContainsTrack(trackPos, sensor))
- if(enableTrackPositionPlots){
- int layerNumber = (layer - 1)/2 + 1;
- String title = "Track Position - Layer " + layerNumber + " - Tracks Within Acceptance";
- //aida.histogram2D(title).fill(trackPos.y(), trackPos.z());
- //aida.cloud2D(title).fill(frontTrackPos.y(), frontTrackPos.z());
- }
- return true;
- }
-
+ //System.out.println("Bottom track found.");
+ stereoLayers = this.bottomStereoLayers.get(layer);
+ }
+
+ for (SvtStereoLayer stereoLayer : stereoLayers) {
+ Hep3Vector axialSensorPosition = stereoLayer.getAxialSensor().getGeometry().getPosition();
+ Hep3Vector stereoSensorPosition = stereoLayer.getStereoSensor().getGeometry().getPosition();
+
+ //System.out.println("Axial sensor position: " + axialSensorPosition.toString());
+ //System.out.println("Stereo sensor position: " + stereoSensorPosition.toString());
+
+ Hep3Vector axialTrackPos = TrackUtils.extrapolateTrack(track, axialSensorPosition.z());
+ Hep3Vector stereoTrackPos = TrackUtils.extrapolateTrack(track, stereoSensorPosition.z());
+
+ //System.out.println("Track position at axial sensor: " + axialTrackPos.toString());
+ //System.out.println("Track position at stereo sensor: " + stereoTrackPos.toString());
+
+ if(this.sensorContainsTrack(axialTrackPos, stereoLayer.getAxialSensor())
+ && this.sensorContainsTrack(stereoTrackPos, stereoLayer.getStereoSensor())){
+ //System.out.println("Track lies within layer acceptance.");
+ return true;
+ }
+ }
return false;
+
+ /*int layerNumber = (layer - 1)/2 + 1;
+ String title = "Track Position - Layer " + layerNumber + " - Tracks Within Acceptance";
+ //aida.histogram2D(title).fill(trackPos.y(), trackPos.z());
+ //aida.cloud2D(title).fill(frontTrackPos.y(), frontTrackPos.z()); */
+
}
/**
@@ -561,45 +616,44 @@
localToGlobal.transform(vertex);
//vertices.set(0, new Point3D(vertex.y() + sensorPos.x(), vertex.x() + sensorPos.y(), vertex.z() + sensorPos.z()));
vertices.set(0, new Point3D(vertex.x(), vertex.y(), vertex.z()));
- if(debug){
- System.out.println(this.getClass().getSimpleName() + ": Vertex 1 Position: " + vertices.get(0).toString());
- //System.out.println(this.getClass().getSimpleName() + ": Transformed Vertex 1 Position: " + localToGlobal.transformed(vertex).toString());
- }
+ //System.out.println(this.getClass().getSimpleName() + ": Vertex 1 Position: " + vertices.get(0).toString());
+ //System.out.println(this.getClass().getSimpleName() + ": Transformed Vertex 1 Position: " + localToGlobal.transformed(vertex).toString());
}
else if(vertex.y() > 0 && vertex.x() > 0){
localToGlobal.transform(vertex);
//vertices.set(1, new Point3D(vertex.y() + sensorPos.x(), vertex.x() + sensorPos.y(), vertex.z() + sensorPos.z()));
vertices.set(1, new Point3D(vertex.x(), vertex.y(), vertex.z()));
- if(debug){
- System.out.println(this.getClass().getSimpleName() + ": Vertex 2 Position: " + vertices.get(1).toString());
+ //System.out.println(this.getClass().getSimpleName() + ": Vertex 2 Position: " + vertices.get(1).toString());
//System.out.println(this.getClass().getSimpleName() + ": Transformed Vertex 2 Position: " + localToGlobal.transformed(vertex).toString());
- }
}
else if(vertex.y() > 0 && vertex.x() < 0){
localToGlobal.transform(vertex);
//vertices.set(2, new Point3D(vertex.y() + sensorPos.x(), vertex.x() + sensorPos.y(), vertex.z() + sensorPos.z()));
vertices.set(2, new Point3D(vertex.x(), vertex.y(), vertex.z()));
- if(debug){
- System.out.println(this.getClass().getSimpleName() + ": Vertex 3 Position: " + vertices.get(2).toString());
+ //System.out.println(this.getClass().getSimpleName() + ": Vertex 3 Position: " + vertices.get(2).toString());
//System.out.println(this.getClass().getSimpleName() + ": Transformed Vertex 3 Position: " + localToGlobal.transformed(vertex).toString());
- }
}
else if(vertex.y() < 0 && vertex.x() < 0){
localToGlobal.transform(vertex);
//vertices.set(3, new Point3D(vertex.y() + sensorPos.x(), vertex.x() + sensorPos.y(), vertex.z() + sensorPos.z()));
vertices.set(3, new Point3D(vertex.x(), vertex.y(), vertex.z()));
- if(debug){
- System.out.println(this.getClass().getSimpleName() + ": Vertex 4 Position: " + vertices.get(3).toString());
+ //System.out.println(this.getClass().getSimpleName() + ": Vertex 4 Position: " + vertices.get(3).toString());
//System.out.println(this.getClass().getSimpleName() + ": Transformed Vertex 4 Position: " + localToGlobal.transformed(vertex).toString());
- }
}
}
+ /*
double area1 = this.findTriangleArea(vertices.get(0).x(), vertices.get(0).y(), vertices.get(1).x(), vertices.get(1).y(), trackPosition.y(), trackPosition.z());
double area2 = this.findTriangleArea(vertices.get(1).x(), vertices.get(1).y(), vertices.get(2).x(), vertices.get(2).y(), trackPosition.y(), trackPosition.z());
double area3 = this.findTriangleArea(vertices.get(2).x(), vertices.get(2).y(), vertices.get(3).x(), vertices.get(3).y(), trackPosition.y(), trackPosition.z());
double area4 = this.findTriangleArea(vertices.get(3).x(), vertices.get(3).y(), vertices.get(0).x(), vertices.get(0).y(), trackPosition.y(), trackPosition.z());
-
+ */
+
+ double area1 = this.findTriangleArea(vertices.get(0).x(), vertices.get(0).y(), vertices.get(1).x(), vertices.get(1).y(), trackPosition.x(), trackPosition.y());
+ double area2 = this.findTriangleArea(vertices.get(1).x(), vertices.get(1).y(), vertices.get(2).x(), vertices.get(2).y(), trackPosition.x(), trackPosition.y());
+ double area3 = this.findTriangleArea(vertices.get(2).x(), vertices.get(2).y(), vertices.get(3).x(), vertices.get(3).y(), trackPosition.x(), trackPosition.y());
+ double area4 = this.findTriangleArea(vertices.get(3).x(), vertices.get(3).y(), vertices.get(0).x(), vertices.get(0).y(), trackPosition.x(), trackPosition.y());
+
if((area1 > 0 && area2 > 0 && area3 > 0 && area4 > 0) || (area1 < 0 && area2 < 0 && area3 < 0 && area4 < 0)) return true;
return false;
}
@@ -645,6 +699,11 @@
System.out.println("% \n%===================================================================%");
}
+ /**
+ *
+ * @param tracks
+ * @param particles
+ */
private void mapReconstructedParticlesToTracks(List<Track> tracks, List<ReconstructedParticle> particles) {
reconParticleMap.clear();
@@ -656,7 +715,12 @@
}
}
}
-
+
+ /**
+ *
+ * @param track
+ * @return
+ */
private ReconstructedParticle getReconstructedParticle(Track track) {
return reconParticleMap.get(track);
}
|