Author: [log in to unmask] Date: Thu Jun 18 17:00:34 2015 New Revision: 3160 Log: Analysis used to study tracks that share hits. Added: java/trunk/users/src/main/java/org/hps/users/omoreno/SharedHitAnalysis.java (with props) Added: java/trunk/users/src/main/java/org/hps/users/omoreno/SharedHitAnalysis.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/omoreno/SharedHitAnalysis.java (added) +++ java/trunk/users/src/main/java/org/hps/users/omoreno/SharedHitAnalysis.java Thu Jun 18 17:00:34 2015 @@ -0,0 +1,308 @@ +package org.hps.users.omoreno; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import hep.aida.IAnalysisFactory; +import hep.aida.IHistogramFactory; +import hep.aida.IPlotterFactory; +import hep.aida.IPlotter; +import hep.aida.IHistogram1D; +import hep.aida.IPlotterStyle; +import hep.aida.ITree; +import hep.aida.ref.rootwriter.RootFileStore; +import hep.physics.vec.BasicHep3Vector; + +import org.lcsim.detector.tracker.silicon.HpsSiSensor; +import org.lcsim.event.EventHeader; +import org.lcsim.event.LCRelation; +import org.lcsim.event.RawTrackerHit; +import org.lcsim.event.RelationalTable; +import org.lcsim.event.Track; +import org.lcsim.event.TrackerHit; +import org.lcsim.event.base.BaseRelationalTable; +import org.lcsim.geometry.Detector; +import org.lcsim.util.Driver; +import org.hps.recon.tracking.TrackUtils; + +public class SharedHitAnalysis extends Driver { + + // Use JFreeChart as the default plotting backend + static { + hep.aida.jfree.AnalysisFactory.register(); + } + + // Collections + private String trackCollectionName = "MatchedTracks"; + private String stereoHitRelationsColName = "HelicalTrackHitRelations"; + private String rotatedHthRelationsColName = "RotatedHelicalTrackHitRelations"; + private String helicalTrackHitsColName = "HelicalTrackHits"; + + // Plotting + ITree tree; + IHistogramFactory histogramFactory; + IPlotterFactory plotterFactory = IAnalysisFactory.create().createPlotterFactory(); + protected Map<String, IPlotter> plotters = new HashMap<String, IPlotter>(); + private Map<String, IHistogram1D> trackPlots = new HashMap<String, IHistogram1D>(); + + private Map<Integer, List<TrackerHit>> topLayerToStereoHit = new HashMap<Integer, List<TrackerHit>>(); + private Map<Integer, List<TrackerHit>> bottomLayerToStereoHit = new HashMap<Integer, List<TrackerHit>>(); + + IPlotterStyle createStyle(int color, String xAxisTitle, String yAxisTitle) { + + // Create a default style + IPlotterStyle style = this.plotterFactory.createPlotterStyle(); + + // Set the style of the X axis + style.xAxisStyle().setLabel(xAxisTitle); + style.xAxisStyle().labelStyle().setFontSize(14); + style.xAxisStyle().setVisible(true); + + // Set the style of the Y axis + style.yAxisStyle().setLabel(yAxisTitle); + style.yAxisStyle().labelStyle().setFontSize(14); + style.yAxisStyle().setVisible(true); + + // Turn off the histogram grid + style.gridStyle().setVisible(false); + + // Set the style of the data + style.dataStyle().lineStyle().setVisible(false); + style.dataStyle().outlineStyle().setVisible(false); + style.dataStyle().outlineStyle().setThickness(4); + style.dataStyle().fillStyle().setVisible(true); + + if (color == 1) { + style.dataStyle().fillStyle().setColor("31, 137, 229, 1"); + style.dataStyle().outlineStyle().setColor("31, 137, 229, 1"); + style.dataStyle().fillStyle().setOpacity(.30); + } else if (color == 2) { + style.dataStyle().fillStyle().setColor("93, 228, 47, 1"); + style.dataStyle().outlineStyle().setColor("93, 228, 47, 1"); + style.dataStyle().fillStyle().setOpacity(.30); + } else if (color == 3) { + style.dataStyle().fillStyle().setColor("255, 38, 38, 1"); + style.dataStyle().outlineStyle().setColor("255, 38, 38, 1"); + style.dataStyle().fillStyle().setOpacity(.70); + } + style.dataStyle().errorBarStyle().setVisible(false); + + // Turn off the legend + style.legendBoxStyle().setVisible(false); + + return style; + } + + + protected void detectorChanged(Detector detector){ + + for (int layer = 1; layer <= 6; layer++) { + + topLayerToStereoHit.put(layer, new ArrayList<TrackerHit>()); + bottomLayerToStereoHit.put(layer, new ArrayList<TrackerHit>()); + } + + tree = IAnalysisFactory.create().createTreeFactory().create(); + histogramFactory = IAnalysisFactory.create().createHistogramFactory(tree); + + plotters.put("Event Information", plotterFactory.create("Event information")); + plotters.get("Event Information").createRegions(2, 3); + + trackPlots.put("Number of tracks", histogramFactory.createHistogram1D("Number of tracks", 10, 0, 10)); + plotters.get("Event Information").region(0).plot(trackPlots.get("Number of tracks")); + + trackPlots.put("chi2", histogramFactory.createHistogram1D("chi2", 40, 0, 40)); + trackPlots.put("chi2 - shared strip hit", histogramFactory.createHistogram1D("chi2 - shared strip hit", 40, 0, 40)); + trackPlots.put("chi2 - l1 Isolation", histogramFactory.createHistogram1D("chi2 - l1 Isolation", 40, 0, 40)); + plotters.get("Event Information").region(2).plot(trackPlots.get("chi2"), this.createStyle(1, "", "")); + plotters.get("Event Information").region(2).plot(trackPlots.get("chi2 - shared strip hit"), this.createStyle(2, "", "")); + plotters.get("Event Information").region(2).plot(trackPlots.get("chi2 - l1 Isolation"), this.createStyle(3, "", "")); + + plotters.put("Track Parameters", plotterFactory.create("Track Parameters")); + plotters.get("Track Parameters").createRegions(3, 3); + + trackPlots.put("doca", histogramFactory.createHistogram1D("doca", 80, -10, 10)); + trackPlots.put("doca - shared strip hit", histogramFactory.createHistogram1D("doca - shared strip hit", 80, -10, 10)); + trackPlots.put("doca - l1 Isolation", histogramFactory.createHistogram1D("doca - l1 Isolation", 80, -10, 10)); + plotters.get("Track Parameters").region(0).plot(trackPlots.get("doca"),this.createStyle(1, "", "")); + plotters.get("Track Parameters").region(0).plot(trackPlots.get("doca - shared strip hit"), this.createStyle(2, "", "")); + plotters.get("Track Parameters").region(0).plot(trackPlots.get("doca - l1 Isolation"), this.createStyle(3, "", "")); + + trackPlots.put("z0", histogramFactory.createHistogram1D("z0", 80, -2, 2)); + trackPlots.put("z0 - shared strip hit", histogramFactory.createHistogram1D("z0 - shared strip hit", 80, -2, 2)); + trackPlots.put("z0 - l1 Isolation", histogramFactory.createHistogram1D("z0 - l1 Isolation", 80, -2, 2)); + plotters.get("Track Parameters").region(1).plot(trackPlots.get("z0"), this.createStyle(1, "", "")); + plotters.get("Track Parameters").region(1).plot(trackPlots.get("z0 - shared strip hit"), this.createStyle(2, "", "")); + plotters.get("Track Parameters").region(1).plot(trackPlots.get("z0 - l1 Isolation"), this.createStyle(3, "", "")); + + trackPlots.put("sin(phi0)", histogramFactory.createHistogram1D("sin(phi0)", 40, -0.2, 0.2)); + trackPlots.put("sin(phi0) - shared strip hit", histogramFactory.createHistogram1D("sin(phi0) - shared strip hit", 40, -0.2, 0.2)); + trackPlots.put("sin(phi0) - l1 Isolation", histogramFactory.createHistogram1D("sin(phi0) - l1 Isolation", 40, -0.2, 0.2)); + plotters.get("Track Parameters").region(2).plot(trackPlots.get("sin(phi0)"), this.createStyle(1, "", "")); + plotters.get("Track Parameters").region(2).plot(trackPlots.get("sin(phi0) - shared strip hit"), this.createStyle(2, "", "")); + plotters.get("Track Parameters").region(2).plot(trackPlots.get("sin(phi0) - l1 Isolation"), this.createStyle(3, "", "")); + + trackPlots.put("curvature", histogramFactory.createHistogram1D("curvature", 50, -0.001, 0.001)); + trackPlots.put("curvature - shared strip hit", histogramFactory.createHistogram1D("curvature - shared strip hit", 50, -0.001, 0.001)); + trackPlots.put("curvature - l1 Isolation", histogramFactory.createHistogram1D("curvature - l1 Isolation", 50, -0.001, 0.001)); + plotters.get("Track Parameters").region(3).plot(trackPlots.get("curvature"), this.createStyle(1, "", "")); + plotters.get("Track Parameters").region(3).plot(trackPlots.get("curvature - shared strip hit"), this.createStyle(2, "", "")); + plotters.get("Track Parameters").region(3).plot(trackPlots.get("curvature - l1 Isolation"), this.createStyle(3, "", "")); + + trackPlots.put("tan_lambda", histogramFactory.createHistogram1D("tan_lambda", 100, -0.1, 0.1)); + trackPlots.put("tan_lambda - shared strip hit", histogramFactory.createHistogram1D("tan_lambda - shared strip hit", 100, -0.1, 0.1)); + trackPlots.put("tan_lambda - l1 Isolation", histogramFactory.createHistogram1D("tan_lambda - l1 Isolation", 100, -0.1, 0.1)); + plotters.get("Track Parameters").region(4).plot(trackPlots.get("tan_lambda"), this.createStyle(1, "", "")); + plotters.get("Track Parameters").region(4).plot(trackPlots.get("tan_lambda - shared strip hit"), this.createStyle(2, "", "")); + plotters.get("Track Parameters").region(4).plot(trackPlots.get("tan_lambda - l1 Isolation"), this.createStyle(3, "", "")); + + for (IPlotter plotter : plotters.values()) { + plotter.show(); + } + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + public void process(EventHeader event){ + + // If the event doesn't have any tracks, skip it + if(!event.hasCollection(Track.class, trackCollectionName)) return; + + // Get the collection of tracks from the event + List<Track> tracks = event.get(Track.class, trackCollectionName); + + // Get the collection of LCRelations between a stereo hit and the strips + // making it up + List<LCRelation> stereoHitRelations = event.get(LCRelation.class, stereoHitRelationsColName); + BaseRelationalTable stereoHitToClusters = new BaseRelationalTable(RelationalTable.Mode.MANY_TO_MANY, RelationalTable.Weighting.UNWEIGHTED); + for (LCRelation relation : stereoHitRelations) { + if (relation != null && relation.getFrom() != null && relation.getTo() != null) { + stereoHitToClusters.add(relation.getFrom(), relation.getTo()); + } + } + + // Get the collection of LCRelations relating RotatedHelicalTrackHits to + // HelicalTrackHits + List<LCRelation> rotatedHthToHthRelations = event.get(LCRelation.class, rotatedHthRelationsColName); + BaseRelationalTable hthToRotatedHth = new BaseRelationalTable(RelationalTable.Mode.ONE_TO_ONE, RelationalTable.Weighting.UNWEIGHTED); + for (LCRelation relation : rotatedHthToHthRelations) { + if (relation != null && relation.getFrom() != null && relation.getTo() != null) { + hthToRotatedHth.add(relation.getFrom(), relation.getTo()); + } + } + + List<TrackerHit> stereoHits = event.get(TrackerHit.class, helicalTrackHitsColName); + this.mapStereoHits(stereoHits); + + // Loop over all of the tracks in the event + for(Track track : tracks){ + + boolean sharedHitTrack = false; + boolean l1Isolation = true; + + // Fill the track parameter plots + + // Loop through all of the stereo hits associated with a track + for (TrackerHit rotatedStereoHit : track.getTrackerHits()) { + + TrackerHit stereoHit = (TrackerHit) hthToRotatedHth.from(rotatedStereoHit); + + // Get the HelicalTrackHit corresponding to the + // RotatedHelicalTrackHit associated with a track + Set<TrackerHit> clusters = stereoHitToClusters.allFrom(stereoHit); + + for (TrackerHit cluster : clusters) { + + Set<TrackerHit> sharedStereoHits = stereoHitToClusters.allTo(cluster); + + if (sharedStereoHits.size() > 1) { + //System.out.println("Multiple stereo hits share a hit"); + + for (TrackerHit sharedStereoHit : sharedStereoHits) { + //System.out.println("Shared stereo hit position: " + (new BasicHep3Vector(sharedStereoHit.getPosition())).toString()); + } + sharedHitTrack = true; + } + } + + HpsSiSensor sensor = (HpsSiSensor) ((RawTrackerHit) stereoHit.getRawHits().get(0)).getDetectorElement(); + int layer = (sensor.getLayerNumber() + 1)/2; + + List<TrackerHit> layerHits; + if (sensor.isTopLayer()) { + layerHits = this.getTopLayerStereoHits(layer); + } else { + layerHits = this.getBottomLayerStereoHits(layer); + } + + if (layerHits.size() > 1 && layer == 1) { + + for (TrackerHit layerHit : layerHits) { + if (layerHit == stereoHit) continue; + + double deltaX = stereoHit.getPosition()[0] - layerHit.getPosition()[0]; + double deltaY = stereoHit.getPosition()[1] - layerHit.getPosition()[1]; + + if (Math.abs(deltaX) < .5 && Math.abs(deltaY) < .5) { + l1Isolation = false; + } + } + } + } + + if (sharedHitTrack) { + trackPlots.get("doca - shared strip hit").fill(TrackUtils.getDoca(track)); + trackPlots.get("z0 - shared strip hit").fill(TrackUtils.getZ0(track)); + trackPlots.get("sin(phi0) - shared strip hit").fill(TrackUtils.getPhi0(track)); + trackPlots.get("curvature - shared strip hit").fill(TrackUtils.getR(track)); + trackPlots.get("tan_lambda - shared strip hit").fill(TrackUtils.getTanLambda(track)); + trackPlots.get("chi2 - shared strip hit").fill(track.getChi2()); + } else { + trackPlots.get("doca").fill(TrackUtils.getDoca(track)); + trackPlots.get("z0").fill(TrackUtils.getZ0(track)); + trackPlots.get("sin(phi0)").fill(TrackUtils.getPhi0(track)); + trackPlots.get("curvature").fill(TrackUtils.getR(track)); + trackPlots.get("tan_lambda").fill(TrackUtils.getTanLambda(track)); + trackPlots.get("chi2").fill(track.getChi2()); + } + + if (l1Isolation) { + trackPlots.get("doca - l1 Isolation").fill(TrackUtils.getDoca(track)); + trackPlots.get("z0 - l1 Isolation").fill(TrackUtils.getZ0(track)); + trackPlots.get("sin(phi0) - l1 Isolation").fill(TrackUtils.getPhi0(track)); + trackPlots.get("curvature - l1 Isolation").fill(TrackUtils.getR(track)); + trackPlots.get("tan_lambda - l1 Isolation").fill(TrackUtils.getTanLambda(track)); + trackPlots.get("chi2 - l1 Isolation").fill(track.getChi2()); + } + } + } + + private void mapStereoHits(List<TrackerHit> stereoHits) { + + for (int layer = 1; layer <= 6; layer++) { + topLayerToStereoHit.get(layer).clear(); + bottomLayerToStereoHit.get(layer).clear();; + } + + for (TrackerHit stereoHit : stereoHits) { + HpsSiSensor sensor = (HpsSiSensor) ((RawTrackerHit) stereoHit.getRawHits().get(0)).getDetectorElement(); + int layer = (sensor.getLayerNumber() + 1)/2; + if (sensor.isTopLayer()) { + topLayerToStereoHit.get(layer).add(stereoHit); + } else { + bottomLayerToStereoHit.get(layer).add(stereoHit); + } + } + } + + private List<TrackerHit> getTopLayerStereoHits(int layer) { + return topLayerToStereoHit.get(layer); + } + + private List<TrackerHit> getBottomLayerStereoHits(int layer) { + return bottomLayerToStereoHit.get(layer); + } +}