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%===================================================================%"); }