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