Author: [log in to unmask]
Date: Tue May 5 17:10:19 2015
New Revision: 2915
Log:
Updating this so it can be used with the current geometry. Work in progress.
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 Tue May 5 17:10:19 2015
@@ -1,23 +1,24 @@
package org.hps.users.omoreno;
-
-
-import hep.aida.ICloud2D;
-import hep.aida.IHistogram1D;
-import hep.aida.IHistogram2D;
-import hep.aida.IPlotter;
-import hep.aida.IPlotterStyle;
-import hep.physics.vec.BasicHep3Vector;
-import hep.physics.vec.Hep3Vector;
-import hep.physics.vec.VecOp;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import org.hps.recon.tracking.TrackUtils;
-import org.hps.recon.tracking.TrackerHitUtils;
+import hep.aida.IAnalysisFactory;
+import hep.aida.IHistogramFactory;
+import hep.aida.IPlotterFactory;
+import hep.aida.IPlotter;
+import hep.aida.IHistogram1D;
+import hep.aida.ITree;
+
+import hep.physics.vec.BasicHep3Vector;
+import hep.physics.vec.Hep3Vector;
+import hep.physics.vec.VecOp;
+
import org.lcsim.detector.ITransform3D;
+import org.lcsim.detector.converter.compact.subdetector.SvtStereoLayer;
+import org.lcsim.detector.converter.compact.subdetector.HpsTracker2;
import org.lcsim.detector.solids.Box;
import org.lcsim.detector.solids.Point3D;
import org.lcsim.detector.solids.Polygon3D;
@@ -31,7 +32,10 @@
import org.lcsim.fit.helicaltrack.HelicalTrackHit;
import org.lcsim.geometry.Detector;
import org.lcsim.util.Driver;
-import org.lcsim.util.aida.AIDA;
+
+import org.hps.recon.tracking.TrackUtils;
+import org.hps.recon.tracking.TrackerHitUtils;
+
/**
* Analysis driver used to calculate the hit efficiency of the SVT.
@@ -41,12 +45,25 @@
*/
public class SvtHitEfficiency extends Driver {
- private AIDA aida;
- private List<IHistogram1D> histos1D = new ArrayList<IHistogram1D>();
- private List<IHistogram2D> histos2D = new ArrayList<IHistogram2D>();
- private List<IPlotter> plotters = new ArrayList<IPlotter>();
- private Map<SiSensor, Map<Integer, Hep3Vector>> stripPositions = new HashMap<SiSensor, Map<Integer, Hep3Vector>>();
+
+ // Use JFreeChart as the default plotting backend
+ static {
+ hep.aida.jfree.AnalysisFactory.register();
+ }
+
+ // Plotting
+ ITree tree;
+ IHistogramFactory histogramFactory;
+ IPlotterFactory plotterFactory = IAnalysisFactory.create().createPlotterFactory();
+ protected Map<String, IPlotter> plotters = new HashMap<String, IPlotter>();
+
+ private Map<String, IHistogram1D> trackMomentumPlots = new HashMap<String, IHistogram1D>();
+
+ //private Map<SiSensor, Map<Integer, Hep3Vector>> stripPositions = new HashMap<SiSensor, Map<Integer, Hep3Vector>>();
private List<HpsSiSensor> sensors = null;
+ private Map<Integer, SvtStereoLayer> topStereoLayers = new HashMap<Integer, SvtStereoLayer>();
+ private Map<Integer, SvtStereoLayer> bottomStereoLayers = new HashMap<Integer, SvtStereoLayer>();
+
TrackerHitUtils trackerHitUtils = new TrackerHitUtils();
boolean debug = false;
@@ -57,8 +74,6 @@
boolean enableChiSquaredPlots = true;
boolean enableTrackPositionPlots = true;
boolean maskBadChannels = false;
-
- int plotterIndex = 0;
double numberOfTopTracks = 0;
double numberOfBottomTracks = 0;
@@ -83,10 +98,22 @@
public static final double SENSOR_WIDTH = 38.3399; // mm
private static final String SUBDETECTOR_NAME = "Tracker";
- /**
- * Default Ctor
+ // By default, require that all tracks have 5 hits
+ int hitsOnTrack = 5;
+
+ /**
+ * Default Constructor
*/
public SvtHitEfficiency(){
+ }
+
+ /**
+ * Set the number of stereo hits associated with a track fit.
+ *
+ * @param hitsOnTrack : Number of stereo hits associated with a track fit.
+ */
+ public void setHitsOnTrack(int hitsOnTrack) {
+ this.hitsOnTrack = hitsOnTrack;
}
/**
@@ -100,25 +127,60 @@
* Enable/Disable masking of bad channels
*/
public void setMaskBadChannels(boolean maskBadChannels){
- this.maskBadChannels = maskBadChannels;
+ this.maskBadChannels = maskBadChannels;
}
public void detectorChanged(Detector detector){
-
- // Get the list of sensors
- sensors = detector.getSubdetector(SUBDETECTOR_NAME).getDetectorElement().findDescendants(HpsSiSensor.class);
-
- // setup AIDA
- aida = AIDA.defaultInstance();
- aida.tree().cd("/");
-
+
+ tree = IAnalysisFactory.create().createTreeFactory().create();
+ histogramFactory = IAnalysisFactory.create().createHistogramFactory(tree);
+
+ // Get the HpsSiSensor objects from the tracker detector element
+ sensors = detector.getSubdetector(SUBDETECTOR_NAME)
+ .getDetectorElement().findDescendants(HpsSiSensor.class);
+
+ // If the detector element had no sensors associated with it, throw
+ // an exception
+ if (sensors.size() == 0) {
+ throw new RuntimeException("No sensors were found in this detector.");
+ }
+
+ // Get the stereo layers from the geometry and build the stereo
+ // layer maps
+ List<SvtStereoLayer> stereoLayers
+ = ((HpsTracker2) detector.getSubdetector(SUBDETECTOR_NAME).getDetectorElement()).getStereoPairs();
+ for (SvtStereoLayer stereoLayer : stereoLayers) {
+ if (stereoLayer.getAxialSensor().isTopLayer()) {
+ topStereoLayers.put(stereoLayer.getLayerNumber(), stereoLayer);
+ } else {
+ bottomStereoLayers.put(stereoLayer.getLayerNumber(), stereoLayer);
+ }
+ }
+
+ /*
String title = null;
IHistogram2D histo2D = null;
IHistogram1D histo1D = null;
ICloud2D cloud2D = null;
+ */
+
+ if (enableMomentumPlots) {
+
+ plotters.put("Track Momentum", plotterFactory.create("Track Momentum"));
+ plotters.get("Track Momentum").createRegions(1, 2);
+
+ trackMomentumPlots.put("Track Momentum", histogramFactory.createHistogram1D("Track Momentum", 50, 0, 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, 5));
+ plotters.get("Track Momentum").region(0)
+ .plot(trackMomentumPlots.get("Track Momentum - Tracks Within Acceptance"));
+ }
// Create a Map from sensor to bad channels and from bad channels to
// strip position
+ /*
for(ChargeCarrier carrier : ChargeCarrier.values()){
for(SiSensor sensor : sensors){
if(sensor.hasElectrodesOnSide(carrier)){
@@ -137,49 +199,34 @@
}
}
}
- }
-
- //--- Momentum Plots ---//
- //----------------------//
- if(enableMomentumPlots){
- plotters.add(PlotUtils.setupPlotter("Track Momentum", 0, 0));
- title = "Track Momentum - All Tracks";
- histo1D = aida.histogram1D(title, 50, 0, 5);
- PlotUtils.setup1DRegion(plotters.get(plotterIndex), title, 0, "Momentum [GeV]", histo1D);
- title = "Track Momentum - Tracks Within Acceptance";
- histo1D = aida.histogram1D(title, 50, 0, 5);
- plotters.get(plotterIndex).region(0).plot(histo1D);
- title = "Track Momentum - Tracks With All Layers Hit";
- histo1D = aida.histogram1D(title, 50, 0, 5);
- plotters.get(plotterIndex).region(0).plot(histo1D);
- plotterIndex++;
- }
+ }*/
+
//--- Track Fit Chi Squared ---//
//-----------------------------//
- if(enableChiSquaredPlots){
- plotters.add(PlotUtils.setupPlotter("Track Chi Squared", 0, 0));
- title = "Chi Squared - All Tracks";
- histo1D = aida.histogram1D(title, 50, 0, 50);
- PlotUtils.setup1DRegion(plotters.get(plotterIndex), title, 0, "Chi Squared", histo1D);
- title = "Chi Squared - Tracks Within Acceptance";
- histo1D = aida.histogram1D(title, 50, 0, 50);
- plotters.get(plotterIndex).region(0).plot(histo1D);
- title = "Chi Squared - Tracks With All Layers Hit";
- histo1D = aida.histogram1D(title, 50, 0, 50);
- plotters.get(plotterIndex).region(0).plot(histo1D);
+ /*if(enableChiSquaredPlots){
+ plotters.add(PlotUtils.setupPlotter("Track Chi Squared", 0, 0));
+ title = "Chi Squared - All Tracks";
+ histo1D = aida.histogram1D(title, 50, 0, 50);
+ PlotUtils.setup1DRegion(plotters.get(plotterIndex), title, 0, "Chi Squared", histo1D);
+ title = "Chi Squared - Tracks Within Acceptance";
+ histo1D = aida.histogram1D(title, 50, 0, 50);
+ plotters.get(plotterIndex).region(0).plot(histo1D);
+ title = "Chi Squared - Tracks With All Layers Hit";
+ histo1D = aida.histogram1D(title, 50, 0, 50);
+ plotters.get(plotterIndex).region(0).plot(histo1D);
plotterIndex++;
- }
+ }*/
//--- Track Position Plots ---//
//----------------------------//
- if(enableTrackPositionPlots){
- int layerNumber = 1;
- SiSensor sensor = null;
- IPlotterStyle style = aida.analysisFactory().createPlotterFactory().createPlotterStyle();
+ /*if(enableTrackPositionPlots){
+ int layerNumber = 1;
+ SiSensor sensor = null;
+ IPlotterStyle style = aida.analysisFactory().createPlotterFactory().createPlotterStyle();
for(int index = 1; index < 6; index++){
plotters.add(PlotUtils.setupPlotter("Track Position - Layer " + index, 2, 3));
- title = "Track Position - Layer " + index + " - Tracks Within Acceptance";
+ title = "Track Position - Layer " + index + " - Tracks Within Acceptance";
cloud2D = aida.cloud2D(title);
PlotUtils.setup2DRegion(plotters.get(plotterIndex), title, 0, "x [mm]", "y [mm]", cloud2D, style);
title = "Track Position - Layer " + index + " - Tracks With All Layers Hit";
@@ -191,6 +238,7 @@
//sensor = SvtUtils.getInstance().getBottomSensor(layerNumber, 0);
//title = SvtUtils.getInstance().getDescription(sensor) + " - Occupancy";
histo1D = aida.histogram1D(title, 640, 0, 639);
+
histos1D.add(histo1D);
PlotUtils.setup1DRegion(plotters.get(plotterIndex), title, 2, "Channel #", histo1D);
//sensor = SvtUtils.getInstance().getTopSensor(layerNumber, 0);
@@ -212,9 +260,9 @@
layerNumber++;
plotterIndex++;
}
- }
-
- for (IPlotter plotter : plotters) {
+ }*/
+
+ for (IPlotter plotter : plotters.values()) {
plotter.show();
}
}
@@ -222,9 +270,9 @@
/**
* .
*/
- private Hep3Vector getStripPosition(SiSensor sensor, int physicalChannel){
+ /* private Hep3Vector getStripPosition(SiSensor sensor, int physicalChannel){
return stripPositions.get(sensor).get(physicalChannel);
- }
+ }*/
/**
* Print a debug message if they are enabled.
@@ -251,140 +299,153 @@
//List<Cluster> ecalClusters = event.get(Cluster.class, ecalClustersCollectionName);
for(Track track : tracks){
-
- ecalClusterTrackMatch = false;
-
+
+ // Check that the track has the required number of hits. The number of hits
+ // required to make a track is set in the tracking strategy.
+ if(track.getTrackerHits().size() != this.hitsOnTrack){
+ System.out.println("This track doesn't have the required number of hits.");
+ continue;
+ }
+
+ // Calculate the momentum of the track
+ double momentum = (new BasicHep3Vector(track.getTrackStates().get(0).getMomentum())).magnitude();
+
+ if (enableMomentumPlots) {
+ trackMomentumPlots.get("Track Momentum").fill(momentum);
+ }
+
+ // Find which of the layers isn't being used in the track fit
+ int unusedLayer = this.getUnusedSvtLayer(track.getTrackerHits());
+
+ // 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 (enableMomentumPlots) {
+ trackMomentumPlots.get("Track Momentum - Tracks Within Acceptance").fill(momentum);
+ }
+ //ecalClusterTrackMatch = false;
+
// Check if there is an Ecal cluster in the same detector volume as the track
- /*for(Cluster ecalCluster : ecalClusters){
- if(ecalCluster.getPosition()[1] > 0 && trkUtil.getZ0() > 0){
- ecalClusterTrackMatch = true;
- break;
- }
- else if(ecalCluster.getPosition()[1] < 0 && trkUtil.getZ0() < 0){
- ecalClusterTrackMatch = true;
- break;
- }
- }*/
-
- /*
- if(!ecalClusterTrackMatch){
- if(debug) System.out.println(this.getClass().getSimpleName() + ": No matching Ecal cluster found");
- continue;
- }*/
-
- // Check that the track is associated with four hits only. This should
- // be the case since the strategy is only requiring four hits to fit
- // a track and is not requiring an extending layer
- if(track.getTrackerHits().size() != 4){
- System.out.println(this.getClass().getSimpleName() + ": This track is composed of " + track.getTrackerHits().size() + ". Skipping event..." );
+ /*for(Cluster ecalCluster : ecalClusters){
+ if(ecalCluster.getPosition()[1] > 0 && trkUtil.getZ0() > 0){
+ ecalClusterTrackMatch = true;
+ break;
+ }
+ else if(ecalCluster.getPosition()[1] < 0 && trkUtil.getZ0() < 0){
+ ecalClusterTrackMatch = true;
+ break;
+ }
+ }*/
+
+ /*
+ if(!ecalClusterTrackMatch){
+ if(debug) System.out.println(this.getClass().getSimpleName() + ": No matching Ecal cluster found");
continue;
- }
-
- // Apply a momentum cut? Probably ...
- // Calculate the track momentum
- double momentum = Math.sqrt(track.getTrackStates().get(0).getMomentum()[0]*track.getTrackStates().get(0).getMomentum()[0] + track.getTrackStates().get(0).getMomentum()[1]*track.getTrackStates().get(0).getMomentum()[1] + track.getTrackStates().get(0).getMomentum()[2]*track.getTrackStates().get(0).getMomentum()[2]);
- if(momentum < 0.5 /* GeV */) continue;
- if(enableMomentumPlots)
- aida.histogram1D("Track Momentum - All Tracks").fill(momentum);
-
- if(enableChiSquaredPlots)
- aida.histogram1D("Chi Squared - All Tracks").fill(track.getChi2());
-
- // Find which layer is not being used to fit the track
- int layer = this.findMissingFitLayer(track.getTrackerHits());
- int arrayPosition = (layer - 1)/2;
-
- // Find if the track is within the acceptance of the layer not being used in
- // the fit
- if(!isWithinAcceptance(track, layer)) continue;
- if(TrackUtils.getZ0(track) > 0){
- numberOfTopTracks++;
- topTracksPerMissingLayer[arrayPosition]++;
- } else {
- numberOfBottomTracks++;
- bottomTracksPerMissingLayer[arrayPosition]++;
- }
-
- if(enableMomentumPlots)
- aida.histogram1D("Track Momentum - Tracks Within Acceptance").fill(momentum);
- if(enableChiSquaredPlots)
- aida.histogram1D("Chi Squared - Tracks Within Acceptance").fill(track.getChi2());
-
+ }*/
+
+
+ //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);
+ /*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){
- String title = "Track Position - Layer " + layerNumber + " - Difference";
- //aida.histogram2D(title).fill(trackPos.y(), trackPos.z());
+ 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){
+ String title = "Track Position - Layer " + layerNumber + " - Difference";
+ //aida.histogram2D(title).fill(trackPos.y(), trackPos.z());
aida.cloud2D(title).fill(frontTrackPos.y(), frontTrackPos.z());
title = "Track Position - Layer " + layerNumber + " - Tracks With All Layers Hit";
//aida.histogram2D(title).fill(trackPos.y(), trackPos.z());
aida.cloud2D(title).fill(frontTrackPos.y(), frontTrackPos.z());
}
-
- List<SiSensor> sensors = new ArrayList<SiSensor>();
- if(TrackUtils.getZ0(track) > 0){
- //sensors.add(SvtUtils.getInstance().getTopSensor(layer, 0));
- //sensors.add(SvtUtils.getInstance().getTopSensor(layer+1, 0));
- } else {
- //sensors.add(SvtUtils.getInstance().getBottomSensor(layer, 0));
- //sensors.add(SvtUtils.getInstance().getBottomSensor(layer+1, 0));
- }
- //aida.histogram1D(SvtUtils.getInstance().getDescription(sensors.get(0)) + " - Occupancy").fill(this.findIntersectingChannel(frontTrackPos, sensors.get(0)));
+
+ List<SiSensor> sensors = new ArrayList<SiSensor>();
+ if(TrackUtils.getZ0(track) > 0){
+ //sensors.add(SvtUtils.getInstance().getTopSensor(layer, 0));
+ //sensors.add(SvtUtils.getInstance().getTopSensor(layer+1, 0));
+ } else {
+ //sensors.add(SvtUtils.getInstance().getBottomSensor(layer, 0));
+ //sensors.add(SvtUtils.getInstance().getBottomSensor(layer+1, 0));
+ }
+ //aida.histogram1D(SvtUtils.getInstance().getDescription(sensors.get(0)) + " - Occupancy").fill(this.findIntersectingChannel(frontTrackPos, sensors.get(0)));
//aida.histogram1D(SvtUtils.getInstance().getDescription(sensors.get(1)) + " - Occupancy").fill(this.findIntersectingChannel(rearTrackPos, sensors.get(1)));
-
+
if(debug)
- System.out.println(this.getClass().getSimpleName() + ": Stereo hit was not found.");
- }
- }
-
- private int findMissingFitLayer(List<TrackerHit> trkHits){
- int[] layer = new int[5];
- for(TrackerHit trkHit : trkHits){
- HelicalTrackHit stereoHit = (HelicalTrackHit) trkHit;
- int arrayPosition = (stereoHit.Layer() - 1)/2;
- layer[arrayPosition]++;
- }
-
- for(int index = 0; index < layer.length; index++){
- if(layer[index] == 0) return (2*index + 1);
+ System.out.println(this.getClass().getSimpleName() + ": Stereo hit was not found.");*/
+ }
+ }
+
+ /**
+ * Find which of the layers is not being used in the track fit
+ *
+ * @param hits : List of stereo hits associated with a track
+ * @return Layer not used in the track fit
+ */
+ private int getUnusedSvtLayer(List<TrackerHit> hits) {
+
+ int[] svtLayer = new int[6];
+ for (TrackerHit hit : hits) {
+ HelicalTrackHit stereoHit = (HelicalTrackHit) hit;
+ int layer = (stereoHit.Layer() - 1)/2;
+ svtLayer[layer]++;
+ }
+
+ for(int layer = 0; layer < svtLayer.length; layer++){
+ if(svtLayer[layer] == 0) return (2*layer + 1);
}
return -1;
}
-
- private boolean isWithinAcceptance(Track track, int layer){
-
-
-
+
+ /**
+ * Check if a track lies within the acceptance of a layer.
+ *
+ */
+ // TODO: Move this to a utility class
+ private boolean isWithinAcceptance(Track track, int layer) {
+
+
+
List<HpsSiSensor> sensors = new ArrayList<HpsSiSensor>();
- if(TrackUtils.getZ0(track) > 0){
+ /*if(TrackUtils.getZ0(track) > 0){
//sensors.add(SvtUtils.getInstance().getTopSensor(layer, 0));
//sensors.add(SvtUtils.getInstance().getTopSensor(layer + 1, 0));
} 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();
@@ -393,14 +454,14 @@
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;
+// 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;
}
@@ -411,35 +472,35 @@
*
*/
public int findIntersectingChannel(Hep3Vector trackPosition, SiSensor sensor){
-
- //--- Check that the track doesn't pass through a region of bad channels ---//
- //--------------------------------------------------------------------------//
-
- //Rotate the track position to the JLab coordinate system
- this.printDebug("Track position in tracking frame: " + trackPosition.toString());
- Hep3Vector trackPositionDet = VecOp.mult(VecOp.inverse(this.trackerHitUtils.detToTrackRotationMatrix()), trackPosition);
- this.printDebug("Track position in JLab frame " + trackPositionDet.toString());
- // Rotate the track to the sensor coordinates
- ITransform3D globalToLocal = sensor.getReadoutElectrodes(ChargeCarrier.HOLE).getGlobalToLocal();
- globalToLocal.transform(trackPositionDet);
- this.printDebug("Track position in sensor electrodes frame " + trackPositionDet.toString());
-
- // Find the closest channel to the track position
- double deltaY = Double.MAX_VALUE;
- int intersectingChannel = 0;
- for(int physicalChannel= 0; physicalChannel < 639; physicalChannel++){
- /*this.printDebug(SvtUtils.getInstance().getDescription(sensor) + " : Channel " + physicalChannel
- + " : Strip Position " + stripPositions.get(sensor).get(physicalChannel));
- this.printDebug(SvtUtils.getInstance().getDescription(sensor) + ": Channel " + physicalChannel
- + " : Delta Y: " + Math.abs(trackPositionDet.x() - stripPositions.get(sensor).get(physicalChannel).x()));*/
- if(Math.abs(trackPositionDet.x() - stripPositions.get(sensor).get(physicalChannel).x()) < deltaY ){
- deltaY = Math.abs(trackPositionDet.x() - stripPositions.get(sensor).get(physicalChannel).x());
- intersectingChannel = physicalChannel;
- }
- }
-
-
- return intersectingChannel;
+
+ //--- Check that the track doesn't pass through a region of bad channels ---//
+ //--------------------------------------------------------------------------//
+
+ //Rotate the track position to the JLab coordinate system
+ this.printDebug("Track position in tracking frame: " + trackPosition.toString());
+ Hep3Vector trackPositionDet = VecOp.mult(VecOp.inverse(this.trackerHitUtils.detToTrackRotationMatrix()), trackPosition);
+ this.printDebug("Track position in JLab frame " + trackPositionDet.toString());
+ // Rotate the track to the sensor coordinates
+ ITransform3D globalToLocal = sensor.getReadoutElectrodes(ChargeCarrier.HOLE).getGlobalToLocal();
+ globalToLocal.transform(trackPositionDet);
+ this.printDebug("Track position in sensor electrodes frame " + trackPositionDet.toString());
+
+ // Find the closest channel to the track position
+ double deltaY = Double.MAX_VALUE;
+ int intersectingChannel = 0;
+ for(int physicalChannel= 0; physicalChannel < 639; physicalChannel++){
+ /*this.printDebug(SvtUtils.getInstance().getDescription(sensor) + " : Channel " + physicalChannel
+ + " : Strip Position " + stripPositions.get(sensor).get(physicalChannel));
+ this.printDebug(SvtUtils.getInstance().getDescription(sensor) + ": Channel " + physicalChannel
+ + " : Delta Y: " + Math.abs(trackPositionDet.x() - stripPositions.get(sensor).get(physicalChannel).x()));*/
+ /*if(Math.abs(trackPositionDet.x() - stripPositions.get(sensor).get(physicalChannel).x()) < deltaY ){
+ deltaY = Math.abs(trackPositionDet.x() - stripPositions.get(sensor).get(physicalChannel).x());
+ intersectingChannel = physicalChannel;
+ }*/
+ }
+
+
+ return intersectingChannel;
}
/**
@@ -447,64 +508,64 @@
*/
public boolean sensorContainsTrack(Hep3Vector trackPosition, HpsSiSensor sensor){
-
- if(maskBadChannels){
- int intersectingChannel = this.findIntersectingChannel(trackPosition, sensor);
- if(intersectingChannel == 0 || intersectingChannel == 638) return false;
-
- if(sensor.isBadChannel(intersectingChannel)
- || sensor.isBadChannel(intersectingChannel+1)
- || sensor.isBadChannel(intersectingChannel-1)){
- this.printDebug("Track intersects a bad channel!");
- return false;
- }
- }
+
+ if(maskBadChannels){
+ int intersectingChannel = this.findIntersectingChannel(trackPosition, sensor);
+ if(intersectingChannel == 0 || intersectingChannel == 638) return false;
+
+ if(sensor.isBadChannel(intersectingChannel)
+ || sensor.isBadChannel(intersectingChannel+1)
+ || sensor.isBadChannel(intersectingChannel-1)){
+ this.printDebug("Track intersects a bad channel!");
+ return false;
+ }
+ }
ITransform3D localToGlobal = sensor.getGeometry().getLocalToGlobal();
-
+
Hep3Vector sensorPos = sensor.getGeometry().getPosition();
Box sensorSolid = (Box) sensor.getGeometry().getLogicalVolume().getSolid();
Polygon3D sensorFace = sensorSolid.getFacesNormalTo(new BasicHep3Vector(0, 0, 1)).get(0);
List<Point3D> vertices = new ArrayList<Point3D>();
for(int index = 0; index < 4; index++){
- vertices.add(new Point3D());
+ vertices.add(new Point3D());
}
for(Point3D vertex : sensorFace.getVertices()){
if(vertex.y() < 0 && vertex.x() > 0){
- localToGlobal.transform(vertex);
+ 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()));
+ 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);
+ 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() + ": Transformed Vertex 2 Position: " + localToGlobal.transformed(vertex).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);
+ 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() + ": Transformed Vertex 3 Position: " + localToGlobal.transformed(vertex).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);
+ 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() + ": Transformed Vertex 4 Position: " + localToGlobal.transformed(vertex).toString());
+ //System.out.println(this.getClass().getSimpleName() + ": Transformed Vertex 4 Position: " + localToGlobal.transformed(vertex).toString());
}
}
}
@@ -531,30 +592,30 @@
System.out.println("%====================== Hit Efficiencies ==========================%");
System.out.println("%===================================================================% \n%");
if(numberOfTopTracks > 0){
- double topEfficiency = numberOfTopTracksWithHitOnMissingLayer/numberOfTopTracks;
- System.out.println("% Top Hit Efficiency: " + numberOfTopTracksWithHitOnMissingLayer + "/" +
- numberOfTopTracks + " = " + topEfficiency*100 + "%");
- System.out.println("% Top Hit Efficiency Error: sigma poisson = "
- + topEfficiency*Math.sqrt((1/numberOfTopTracksWithHitOnMissingLayer) + (1/numberOfTopTracks))*100 + "%");
- System.out.println("% Top Hit Efficiency Error: sigma binomial = "
- + (1/numberOfTopTracks)*Math.sqrt(numberOfTopTracksWithHitOnMissingLayer*(1-topEfficiency))*100 + "%");
+ double topEfficiency = numberOfTopTracksWithHitOnMissingLayer/numberOfTopTracks;
+ System.out.println("% Top Hit Efficiency: " + numberOfTopTracksWithHitOnMissingLayer + "/" +
+ numberOfTopTracks + " = " + topEfficiency*100 + "%");
+ System.out.println("% Top Hit Efficiency Error: sigma poisson = "
+ + topEfficiency*Math.sqrt((1/numberOfTopTracksWithHitOnMissingLayer) + (1/numberOfTopTracks))*100 + "%");
+ System.out.println("% Top Hit Efficiency Error: sigma binomial = "
+ + (1/numberOfTopTracks)*Math.sqrt(numberOfTopTracksWithHitOnMissingLayer*(1-topEfficiency))*100 + "%");
}
if(numberOfBottomTracks > 0){
- double bottomEfficiency = numberOfBottomTracksWithHitOnMissingLayer/numberOfBottomTracks;
- System.out.println("% Bottom Hit Efficiency: " + numberOfBottomTracksWithHitOnMissingLayer + "/"
- + numberOfBottomTracks + " = " + bottomEfficiency*100 + "%");
- System.out.println("% Bottom Hit Efficiency Error: sigma poisson= "
- + bottomEfficiency*Math.sqrt((1/numberOfBottomTracksWithHitOnMissingLayer) + (1/numberOfBottomTracks))*100 + "%");
- System.out.println("% Top Hit Efficiency Error: sigma binomial = "
- + (1/numberOfBottomTracks)*Math.sqrt(numberOfBottomTracksWithHitOnMissingLayer*(1-bottomEfficiency))*100 + "%");
+ double bottomEfficiency = numberOfBottomTracksWithHitOnMissingLayer/numberOfBottomTracks;
+ System.out.println("% Bottom Hit Efficiency: " + numberOfBottomTracksWithHitOnMissingLayer + "/"
+ + numberOfBottomTracks + " = " + bottomEfficiency*100 + "%");
+ System.out.println("% Bottom Hit Efficiency Error: sigma poisson= "
+ + bottomEfficiency*Math.sqrt((1/numberOfBottomTracksWithHitOnMissingLayer) + (1/numberOfBottomTracks))*100 + "%");
+ System.out.println("% Top Hit Efficiency Error: sigma binomial = "
+ + (1/numberOfBottomTracks)*Math.sqrt(numberOfBottomTracksWithHitOnMissingLayer*(1-bottomEfficiency))*100 + "%");
}
/* for(int index = 0; index < topTracksWithHitOnMissingLayer.length; index++){
- if(topTracksPerMissingLayer[index] > 0)
- System.out.println("% Top Layer " + (index+1) + ": " + (topTracksWithHitOnMissingLayer[index]/topTracksPerMissingLayer[index])*100 + "%");
+ if(topTracksPerMissingLayer[index] > 0)
+ System.out.println("% Top Layer " + (index+1) + ": " + (topTracksWithHitOnMissingLayer[index]/topTracksPerMissingLayer[index])*100 + "%");
}
for(int index = 0; index < bottomTracksWithHitOnMissingLayer.length; index++){
- if(bottomTracksPerMissingLayer[index] > 0)
- System.out.println("% Bottom Layer " + (index+1) + ": " + (bottomTracksWithHitOnMissingLayer[index]/bottomTracksPerMissingLayer[index])*100 + "%");
+ if(bottomTracksPerMissingLayer[index] > 0)
+ System.out.println("% Bottom Layer " + (index+1) + ": " + (bottomTracksWithHitOnMissingLayer[index]/bottomTracksPerMissingLayer[index])*100 + "%");
}*/
System.out.println("% \n%===================================================================%");
}
|