Print

Print


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