Print

Print


Author: [log in to unmask]
Date: Thu Jul  7 15:02:31 2016
New Revision: 4418

Log:
Change definition of signal to noise.  No longer display plots while running.  Move calculation of signal to noise to its own method.

Modified:
    java/trunk/users/src/main/java/org/hps/users/omoreno/SvtClusterAnalysis.java

Modified: java/trunk/users/src/main/java/org/hps/users/omoreno/SvtClusterAnalysis.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/omoreno/SvtClusterAnalysis.java	(original)
+++ java/trunk/users/src/main/java/org/hps/users/omoreno/SvtClusterAnalysis.java	Thu Jul  7 15:02:31 2016
@@ -9,16 +9,14 @@
 import hep.aida.IAnalysisFactory;
 import hep.aida.IHistogram2D;
 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 org.lcsim.util.Driver; 
 import org.lcsim.geometry.Detector;
 import org.lcsim.detector.tracker.silicon.HpsSiSensor;
+import org.lcsim.detector.tracker.silicon.SiSensor;
 import org.lcsim.event.EventHeader;
 import org.lcsim.event.LCRelation;
 import org.lcsim.event.RawTrackerHit;
@@ -27,53 +25,50 @@
 import org.lcsim.event.Track;
 import org.lcsim.event.TrackerHit;
 import org.lcsim.event.base.BaseRelationalTable;
+
 import org.hps.recon.tracking.FittedRawTrackerHit;
 import org.hps.recon.tracking.TrackUtils;
 
 /**
- * 
- * @author Omar Moreno
- *
+ * Analysis driver used to study SVT strip clusters. 
+ *  
+ * @author <a href="mailto:[log in to unmask]">Omar Moreno</a> 
  */
 public class SvtClusterAnalysis extends Driver {
-   
-    
-    // Use JFreeChart as the default plotting backend
-    static { 
-        hep.aida.jfree.AnalysisFactory.register();
-    }
 
     private List<HpsSiSensor> sensors;
     private Map<RawTrackerHit, LCRelation> fittedRawTrackerHitMap = new HashMap<RawTrackerHit, LCRelation>();
     private Map<Track, ReconstructedParticle> reconParticleMap = new HashMap<Track, ReconstructedParticle>();
   
     // Plotting
-    ITree tree; 
-    IHistogramFactory histogramFactory; 
-    IPlotterFactory plotterFactory = IAnalysisFactory.create().createPlotterFactory();
-    protected Map<String, IPlotter> plotters = new HashMap<String, IPlotter>(); 
-    
-    // All clusters
-    private Map<String, IHistogram1D> clusterChargePlots = new HashMap<String, IHistogram1D>();
-    private Map<String, IHistogram1D> singleHitClusterChargePlots = new HashMap<String, IHistogram1D>();
-    private Map<String, IHistogram1D> multHitClusterChargePlots = new HashMap<String, IHistogram1D>();
-    private Map<String, IHistogram1D> signalToNoisePlots = new HashMap<String, IHistogram1D>();
-    private Map<String, IHistogram1D> singleHitSignalToNoisePlots = new HashMap<String, IHistogram1D>();
-    private Map<String, IHistogram1D> multHitSignalToNoisePlots = new HashMap<String, IHistogram1D>();
-    private Map<String, IHistogram1D> clusterSizePlots = new HashMap<String, IHistogram1D>();
-    private Map<String, IHistogram1D> clusterTimePlots = new HashMap<String, IHistogram1D>();
-    private Map<String, IHistogram2D> clusterChargeVsTimePlots = new HashMap<String, IHistogram2D>();
-
-    // Clusters on track
-    private Map<String, IHistogram1D> trackClusterChargePlots = new HashMap<String, IHistogram1D>();
-    private Map<String, IHistogram1D> trackHitSignalToNoisePlots = new HashMap<String, IHistogram1D>();
-    private Map<String, IHistogram1D> trackClusterTimePlots = new HashMap<String, IHistogram1D>();
-    private Map<String, IHistogram2D> trackClusterChargeVsMomentum = new HashMap<String, IHistogram2D>();
-    private Map<String, IHistogram2D> trackClusterChargeVsCosTheta = new HashMap<String, IHistogram2D>();
-    private Map<String, IHistogram2D> trackClusterChargeVsSinPhi = new HashMap<String, IHistogram2D>();
+    private ITree tree = null; 
+    private IHistogramFactory histogramFactory = null; 
+   
+    //----------------//
+    //   Histograms   //
+    //----------------//
+    
+    // Histograms of all clusters in an event
+    private Map<SiSensor, IHistogram1D> clusterChargePlots = new HashMap<SiSensor, IHistogram1D>();
+    private Map<SiSensor, IHistogram1D> singleHitClusterChargePlots = new HashMap<SiSensor, IHistogram1D>();
+    private Map<SiSensor, IHistogram1D> multHitClusterChargePlots = new HashMap<SiSensor, IHistogram1D>();
+    private Map<SiSensor, IHistogram1D> signalToNoisePlots = new HashMap<SiSensor, IHistogram1D>();
+    private Map<SiSensor, IHistogram1D> singleHitSignalToNoisePlots = new HashMap<SiSensor, IHistogram1D>();
+    private Map<SiSensor, IHistogram1D> multHitSignalToNoisePlots = new HashMap<SiSensor, IHistogram1D>();
+    private Map<SiSensor, IHistogram1D> clusterSizePlots = new HashMap<SiSensor, IHistogram1D>();
+    private Map<SiSensor, IHistogram1D> clusterTimePlots = new HashMap<SiSensor, IHistogram1D>();
+    private Map<SiSensor, IHistogram2D> clusterChargeVsTimePlots = new HashMap<SiSensor, IHistogram2D>();
+
+    // Histograms of clusters associated with a track
+    private Map<SiSensor, IHistogram1D> trackClusterChargePlots = new HashMap<SiSensor, IHistogram1D>();
+    private Map<SiSensor, IHistogram1D> trackHitSignalToNoisePlots = new HashMap<SiSensor, IHistogram1D>();
+    private Map<SiSensor, IHistogram1D> trackClusterTimePlots = new HashMap<SiSensor, IHistogram1D>();
+    private Map<SiSensor, IHistogram2D> trackClusterChargeVsMomentum = new HashMap<SiSensor, IHistogram2D>();
+    private Map<SiSensor, IHistogram2D> trackClusterChargeVsCosTheta = new HashMap<SiSensor, IHistogram2D>();
+    private Map<SiSensor, IHistogram2D> trackClusterChargeVsSinPhi = new HashMap<SiSensor, IHistogram2D>();
     
     // Detector name
-    private static final String SUBDETECTOR_NAME = "Tracker";
+    private String subdetectorName = "Tracker";
     
     // Collections
     private String clusterCollectionName = "StripClusterer_SiTrackerHitStrip1D";
@@ -84,38 +79,21 @@
     
     private int runNumber = -1; 
         
+    //-------------//
+    //   Setters   //
+    //-------------//
     
     /**
-     * Default Ctor
+     * Set the name of the sub-detector from which sensors will be retrieved.
+     * 
+     * @param subdetectorName Name of the sub-detector of interest.
      */
+    public void setSubdetectorName(String subdetectorName) { 
+       this.subdetectorName = subdetectorName; 
+    }
+    
+    /** Default Constructor */
     public SvtClusterAnalysis() { }
-    
-    private int computePlotterRegion(HpsSiSensor sensor) {
-
-        if (sensor.getLayerNumber() < 7) {
-            if (sensor.isTopLayer()) {
-                return 6*(sensor.getLayerNumber() - 1); 
-            } else { 
-                return 6*(sensor.getLayerNumber() - 1) + 1;
-            } 
-        } else { 
-        
-            if (sensor.isTopLayer()) {
-                if (sensor.getSide() == HpsSiSensor.POSITRON_SIDE) {
-                    return 6*(sensor.getLayerNumber() - 7) + 2;
-                } else { 
-                    return 6*(sensor.getLayerNumber() - 7) + 3;
-                }
-            } else if (sensor.isBottomLayer()) {
-                if (sensor.getSide() == HpsSiSensor.POSITRON_SIDE) {
-                    return 6*(sensor.getLayerNumber() - 7) + 4;
-                } else {
-                    return 6*(sensor.getLayerNumber() - 7) + 5;
-                }
-            }
-        }
-        return -1; 
-    }
     
     protected void detectorChanged(Detector detector) {
        
@@ -123,7 +101,7 @@
         histogramFactory = IAnalysisFactory.create().createHistogramFactory(tree);
         
         // Get the HpsSiSensor objects from the tracker detector element
-        sensors = detector.getSubdetector(SUBDETECTOR_NAME)
+        sensors = detector.getSubdetector(subdetectorName)
                           .getDetectorElement().findDescendants(HpsSiSensor.class);
    
         // If the detector element had no sensors associated with it, throw
@@ -131,126 +109,55 @@
         if (sensors.size() == 0) {
             throw new RuntimeException("No sensors were found in this detector.");
         }
-       
-        plotters.put("Cluster Amplitude", plotterFactory.create("Cluster Amplitude"));
-        plotters.get("Cluster Amplitude").createRegions(6, 6);
-       
-        plotters.put("Signal to Noise", plotterFactory.create("Signal to Noise"));
-        plotters.get("Signal to Noise").createRegions(6, 6);
-        
-        plotters.put("Cluster Multiplicity", plotterFactory.create("Cluster Multiplicity"));
-        plotters.get("Cluster Multiplicity").createRegions(6, 6);
-        
-        plotters.put("Cluster Time", plotterFactory.create("Cluster Time"));
-        plotters.get("Cluster Time").createRegions(6, 6);
-        
-        plotters.put("Cluster Amplitude vs Cluster Time", plotterFactory.create("Cluster Amplitude vs Cluster Time"));
-        plotters.get("Cluster Amplitude vs Cluster Time").createRegions(6, 6);
-        
-        plotters.put("Cluster Amplitude vs Momentum", plotterFactory.create("Cluster Amplitude vs Momentum"));
-        plotters.get("Cluster Amplitude vs Momentum").createRegions(6, 6);
-        
-        plotters.put("Cluster Amplitude vs cos(theta)", plotterFactory.create("Cluster Amplitude vs cos(theta)"));
-        plotters.get("Cluster Amplitude vs cos(theta)").createRegions(6, 6);
-        
-        plotters.put("Cluster Amplitude vs sin(phi0)", plotterFactory.create("Cluster Amplitude vs sin(phi0)"));
-        plotters.get("Cluster Amplitude vs sin(phi0)").createRegions(6, 6);
-
+        
         for (HpsSiSensor sensor : sensors) { 
-            
-            clusterChargePlots.put(sensor.getName(), 
-                    histogramFactory.createHistogram1D(sensor.getName() + " - Cluster Charge", 100, 0, 5000));
-            plotters.get("Cluster Amplitude").region(this.computePlotterRegion(sensor))
-                                             .plot(clusterChargePlots
-                                             .get(sensor.getName()), this.createStyle(1, "Cluster Amplitude [ADC Counts]", ""));
-       
-            singleHitClusterChargePlots.put(sensor.getName(), 
-                    histogramFactory.createHistogram1D(sensor.getName() + " - Single Hit Cluster Charge", 100, 0, 5000));
-            plotters.get("Cluster Amplitude").region(this.computePlotterRegion(sensor))
-                                             .plot(singleHitClusterChargePlots
-                                             .get(sensor.getName()), this.createStyle(2, "Cluster Amplitude [ADC Counts]", ""));
-
-            multHitClusterChargePlots.put(sensor.getName(), 
-                    histogramFactory.createHistogram1D(sensor.getName() + " - Multiple Hit Cluster Charge", 100, 0, 5000));
-            plotters.get("Cluster Amplitude").region(this.computePlotterRegion(sensor))
-                                             .plot(multHitClusterChargePlots
-                                             .get(sensor.getName()), this.createStyle(2, "Cluster Amplitude [ADC Counts]", ""));
-
-            signalToNoisePlots.put(sensor.getName(), 
-                    histogramFactory.createHistogram1D(sensor.getName() + " - Signal to Noise", 50, 0, 50));
-            plotters.get("Signal to Noise").region(this.computePlotterRegion(sensor))
-                                           .plot(signalToNoisePlots
-                                           .get(sensor.getName()), this.createStyle(1, "Signal to Noise", ""));
-
-            singleHitSignalToNoisePlots.put(sensor.getName(), 
-                    histogramFactory.createHistogram1D(sensor.getName() + " - Single Hit Signal to Noise", 50, 0, 50));
-            plotters.get("Signal to Noise").region(this.computePlotterRegion(sensor))
-                                           .plot(singleHitSignalToNoisePlots
-                                           .get(sensor.getName()), this.createStyle(2, "Signal to Noise", ""));
-        
-            multHitSignalToNoisePlots.put(sensor.getName(), 
-                    histogramFactory.createHistogram1D(sensor.getName() + " - Multiple Hit Signal to Noise", 50, 0, 50));
-            plotters.get("Signal to Noise").region(this.computePlotterRegion(sensor))
-                                           .plot(multHitSignalToNoisePlots
-                                           .get(sensor.getName()), this.createStyle(2, "Signal to Noise", ""));
-
-            clusterSizePlots.put(sensor.getName(),
-                    histogramFactory.createHistogram1D(sensor.getName() + " - Cluster Multiplicity", 10, 0, 10));
-            plotters.get("Cluster Multiplicity").region(this.computePlotterRegion(sensor))
-                                                .plot(clusterSizePlots
-                                                .get(sensor.getName()), this.createStyle(1, "Cluster Multiplicity", ""));
-            
-            clusterTimePlots.put(sensor.getName(),
-                    histogramFactory.createHistogram1D(sensor.getName() + " - Cluster Time", 100, -100, 100));
-            plotters.get("Cluster Time").region(this.computePlotterRegion(sensor))
-                                        .plot(clusterTimePlots
-                                        .get(sensor.getName()), this.createStyle(1, "Cluster Time [ns]", ""));
-
-            trackClusterTimePlots.put(sensor.getName(),
-                    histogramFactory.createHistogram1D(sensor.getName() + " - Track Cluster Time", 100, -100, 100));
-            plotters.get("Cluster Time").region(this.computePlotterRegion(sensor))
-                                        .plot(trackClusterTimePlots
-                                        .get(sensor.getName()), this.createStyle(3, "Cluster Time [ns]", ""));
-            
-            clusterChargeVsTimePlots.put(sensor.getName(),
-                    histogramFactory.createHistogram2D(sensor.getName() + " - Cluster Amplitude vs Time", 100, 0, 5000, 100, -100, 100));
-            plotters.get("Cluster Amplitude vs Cluster Time").region(this.computePlotterRegion(sensor))
-                                                             .plot(clusterChargeVsTimePlots
-                                                             .get(sensor.getName()));
-        
-            trackClusterChargePlots.put(sensor.getName(), 
-                    histogramFactory.createHistogram1D(sensor.getName() + " - Tracker Cluster Charge", 100, 0, 5000));
-            plotters.get("Cluster Amplitude").region(this.computePlotterRegion(sensor))
-                                             .plot(trackClusterChargePlots
-                                             .get(sensor.getName()), this.createStyle(3, "Cluster Amplitude [ADC Counts]", ""));
-        
-            trackHitSignalToNoisePlots.put(sensor.getName(), 
-                    histogramFactory.createHistogram1D(sensor.getName() + " - Track Signal to Noise", 50, 0, 50));
-            plotters.get("Signal to Noise").region(this.computePlotterRegion(sensor))
-                                           .plot(trackHitSignalToNoisePlots
-                                           .get(sensor.getName()), this.createStyle(3, "Signal to Noise", ""));
-        
-            trackClusterChargeVsMomentum.put(sensor.getName(),
-                    histogramFactory.createHistogram2D(sensor.getName() + " - Cluster Amplitude vs Momentum", 100, 0, 1.5, 100, 0, 5000));
-            plotters.get("Cluster Amplitude vs Momentum").region(this.computePlotterRegion(sensor))
-                                                         .plot(trackClusterChargeVsMomentum
-                                                         .get(sensor.getName()));
-        
-            trackClusterChargeVsCosTheta.put(sensor.getName(),
-                    histogramFactory.createHistogram2D(sensor.getName() + " - Cluster Amplitude vs cos(theta)", 100, -0.1, 0.1, 100, 0, 5000));
-            plotters.get("Cluster Amplitude vs cos(theta)").region(this.computePlotterRegion(sensor))
-                                                         .plot(trackClusterChargeVsCosTheta
-                                                         .get(sensor.getName()));
-
-            trackClusterChargeVsSinPhi.put(sensor.getName(),
-                    histogramFactory.createHistogram2D(sensor.getName() + " - Cluster Amplitude vs sin(phi0)", 100, -0.2, 0.2, 100, 0, 5000));
-            plotters.get("Cluster Amplitude vs sin(phi0)").region(this.computePlotterRegion(sensor))
-                                                          .plot(trackClusterChargeVsSinPhi
-                                                          .get(sensor.getName()));
-        }
-        
-        for (IPlotter plotter : plotters.values()) { 
-            plotter.show();
+           
+            // Get the name of the sensor
+            String sensorName = sensor.getName();
+            clusterChargePlots.put(sensor, 
+                    histogramFactory.createHistogram1D(sensorName + " - Cluster Charge", 100, 0, 5000));
+       
+            singleHitClusterChargePlots.put(sensor, 
+                    histogramFactory.createHistogram1D(sensorName + " - Single Hit Cluster Charge", 100, 0, 5000));
+
+            multHitClusterChargePlots.put(sensor, 
+                    histogramFactory.createHistogram1D(sensorName + " - Multiple Hit Cluster Charge", 100, 0, 5000));
+
+            signalToNoisePlots.put(sensor, 
+                    histogramFactory.createHistogram1D(sensorName + " - Signal to Noise", 50, 0, 50));
+
+            singleHitSignalToNoisePlots.put(sensor, 
+                    histogramFactory.createHistogram1D(sensorName + " - Single Hit Signal to Noise", 50, 0, 50));
+        
+            multHitSignalToNoisePlots.put(sensor, 
+                    histogramFactory.createHistogram1D(sensorName + " - Multiple Hit Signal to Noise", 50, 0, 50));
+
+            clusterSizePlots.put(sensor,
+                    histogramFactory.createHistogram1D(sensorName + " - Cluster Multiplicity", 10, 0, 10));
+            
+            clusterTimePlots.put(sensor,
+                    histogramFactory.createHistogram1D(sensorName + " - Cluster Time", 100, -100, 100));
+
+            trackClusterTimePlots.put(sensor,
+                    histogramFactory.createHistogram1D(sensorName + " - Track Cluster Time", 100, -100, 100));
+            
+            clusterChargeVsTimePlots.put(sensor,
+                    histogramFactory.createHistogram2D(sensorName + " - Cluster Amplitude vs Time", 100, 0, 5000, 100, -100, 100));
+        
+            trackClusterChargePlots.put(sensor, 
+                    histogramFactory.createHistogram1D(sensorName + " - Tracker Cluster Charge", 100, 0, 5000));
+        
+            trackHitSignalToNoisePlots.put(sensor, 
+                    histogramFactory.createHistogram1D(sensorName + " - Track Signal to Noise", 50, 0, 50));
+        
+            trackClusterChargeVsMomentum.put(sensor,
+                    histogramFactory.createHistogram2D(sensorName + " - Cluster Amplitude vs Momentum", 100, 0, 1.5, 100, 0, 5000));
+        
+            trackClusterChargeVsCosTheta.put(sensor,
+                    histogramFactory.createHistogram2D(sensorName + " - Cluster Amplitude vs cos(theta)", 100, -0.1, 0.1, 100, 0, 5000));
+
+            trackClusterChargeVsSinPhi.put(sensor,
+                    histogramFactory.createHistogram2D(sensorName + " - Cluster Amplitude vs sin(phi0)", 100, -0.2, 0.2, 100, 0, 5000));
         }
     }
 
@@ -280,47 +187,22 @@
             // Get the sensor associated with this cluster
             HpsSiSensor sensor = (HpsSiSensor) ((RawTrackerHit) cluster.getRawHits().get(0)).getDetectorElement();
             
-            // Get the raw hits composing this cluster and use them to calculate the amplitude of the hit
-            double amplitudeSum = 0;
-            double noise = 0;
-            for (Object rawHitObject : cluster.getRawHits()) {
-
-                RawTrackerHit rawHit = (RawTrackerHit) rawHitObject; 
-                
-                // Get the channel of the raw hit
-                int channel = rawHit.getIdentifierFieldValue("strip");
-                
-                // Add the amplitude of that channel to the total amplitude
-                double amplitude = FittedRawTrackerHit.getAmp(this.getFittedHit(rawHit));
-                amplitudeSum += FittedRawTrackerHit.getAmp(this.getFittedHit(rawHit));
-                
-                // Calculate the mean noise for the channel
-                double channelNoise = 0;
-                for (int sampleN = 0; sampleN < 6; sampleN++) { 
-                    channelNoise += sensor.getNoise(channel, sampleN);
-                }
-                channelNoise = channelNoise/6;
-                
-                noise += channelNoise * amplitude;
-            }
-      
+            Cluster clusterObject = this.calculateSignalToNoise(cluster.getRawHits());
+            
             clusterSizePlots.get(sensor.getName()).fill(cluster.getRawHits().size());
             
-            // Calculate the signal weighted noise
-            noise = noise/amplitudeSum;
-            
             // Fill all plots
-            clusterChargePlots.get(sensor.getName()).fill(amplitudeSum);
-            signalToNoisePlots.get(sensor.getName()).fill(amplitudeSum/noise);
+            clusterChargePlots.get(sensor.getName()).fill(clusterObject.getAmplitude());
+            signalToNoisePlots.get(sensor.getName()).fill(clusterObject.getSignalToNoise());
             clusterTimePlots.get(sensor.getName()).fill(cluster.getTime());
-            clusterChargeVsTimePlots.get(sensor.getName()).fill(amplitudeSum, cluster.getTime());
+            clusterChargeVsTimePlots.get(sensor.getName()).fill(clusterObject.getAmplitude(), cluster.getTime());
             
             if (cluster.getRawHits().size() == 1) { 
-                singleHitClusterChargePlots.get(sensor.getName()).fill(amplitudeSum);
-                singleHitSignalToNoisePlots.get(sensor.getName()).fill(amplitudeSum/noise);
+                singleHitClusterChargePlots.get(sensor.getName()).fill(clusterObject.getAmplitude());
+                singleHitSignalToNoisePlots.get(sensor.getName()).fill(clusterObject.getSignalToNoise());
             } else { 
-                multHitClusterChargePlots.get(sensor.getName()).fill(amplitudeSum);
-                multHitSignalToNoisePlots.get(sensor.getName()).fill(amplitudeSum/noise);
+                multHitClusterChargePlots.get(sensor.getName()).fill(clusterObject.getAmplitude());
+                multHitSignalToNoisePlots.get(sensor.getName()).fill(clusterObject.getSignalToNoise());
             }
         }
        
@@ -367,44 +249,18 @@
                 
                 for (TrackerHit trackCluster : trackClusters) { 
                 
-                    // Get the raw hits composing this cluster and use them to calculate the amplitude of the hit
-                    double amplitudeSum = 0;
-                    double noise = 0;
-                    HpsSiSensor sensor = null;
-
-                    for (Object rawHitObject : trackCluster.getRawHits()) {
-                        RawTrackerHit rawHit = (RawTrackerHit) rawHitObject; 
-                        
-                        sensor = (HpsSiSensor) rawHit.getDetectorElement();
-                       
-                        // Get the channel of the raw hit
-                        int channel = rawHit.getIdentifierFieldValue("strip");
-                
-                        // Add the amplitude of that channel to the total amplitude
-                        double amplitude = FittedRawTrackerHit.getAmp(this.getFittedHit(rawHit));
-                        amplitudeSum += FittedRawTrackerHit.getAmp(this.getFittedHit(rawHit));
-                
-                        // Calculate the mean noise for the channel
-                        double channelNoise = 0;
-                        for (int sampleN = 0; sampleN < 6; sampleN++) { 
-                            channelNoise += sensor.getNoise(channel, sampleN);
-                        }
-                        channelNoise = channelNoise/6;
-                
-                        noise += channelNoise * amplitude;
-                        
-                    }
-
-                    // Calculate the signal weighted noise
-                    noise = noise/amplitudeSum;
+                    // Get the sensor associated with this cluster
+                    HpsSiSensor sensor = (HpsSiSensor) ((RawTrackerHit) trackCluster.getRawHits().get(0)).getDetectorElement();
+
+                    Cluster clusterObject = this.calculateSignalToNoise(trackCluster.getRawHits());
                    
                     // Fill all plots
-                    trackClusterChargePlots.get(sensor.getName()).fill(amplitudeSum);
-                    trackHitSignalToNoisePlots.get(sensor.getName()).fill(amplitudeSum/noise);
-                    trackClusterChargeVsMomentum.get(sensor.getName()).fill(p, amplitudeSum);
-                    trackClusterChargeVsCosTheta.get(sensor.getName()).fill(TrackUtils.getCosTheta(track), amplitudeSum);
-                    trackClusterChargeVsSinPhi.get(sensor.getName()).fill(Math.sin(TrackUtils.getPhi0(track)), amplitudeSum);
-                    //trackClusterTimePlots.get(sensor.getName()).fill(trackCluster.time());
+                    trackClusterChargePlots.get(sensor.getName()).fill(clusterObject.getAmplitude());
+                    trackHitSignalToNoisePlots.get(sensor.getName()).fill(clusterObject.getSignalToNoise());
+                    trackClusterChargeVsMomentum.get(sensor.getName()).fill(p, clusterObject.getAmplitude());
+                    trackClusterChargeVsCosTheta.get(sensor.getName()).fill(TrackUtils.getCosTheta(track), clusterObject.getAmplitude());
+                    trackClusterChargeVsSinPhi.get(sensor.getName()).fill(Math.sin(TrackUtils.getPhi0(track)), clusterObject.getAmplitude());
+                    trackClusterTimePlots.get(sensor.getName()).fill(trackCluster.getTime());
                 }
             }
         }
@@ -425,6 +281,45 @@
     
     }
     
+    private Cluster calculateSignalToNoise(List<Object> rawHitObjects) {
+       
+        double amplitudeSum = 0;
+        double noiseSquared = 0;
+           
+        // Get the sensor associated with this cluster
+        HpsSiSensor sensor = (HpsSiSensor) ((RawTrackerHit) rawHitObjects.get(0)).getDetectorElement();
+           
+        // Loop over all of the RawTrackerHits associated with this object and
+        // calculate the signal to noise. 
+        for (Object rawHitObject : rawHitObjects) {
+
+            // Cast the raw hit object to a RawTrackerHit
+            RawTrackerHit rawHit = (RawTrackerHit) rawHitObject; 
+            
+            // Get the channel of the raw hit
+            int channel = rawHit.getIdentifierFieldValue("strip");
+                
+            
+            // Add the amplitude of that channel to the total amplitude
+            amplitudeSum += FittedRawTrackerHit.getAmp(this.getFittedHit(rawHit));
+                
+            // Calculate the mean noise for the channel
+            double channelNoise = 0;
+            for (int sampleN = 0; sampleN < 6; sampleN++) { 
+                channelNoise += sensor.getNoise(channel, sampleN);
+            }
+            channelNoise = channelNoise/6;
+           
+            noiseSquared += channelNoise*channelNoise;
+            
+        }
+        
+        // Calculate the cluster noise 
+        double noise = Math.sqrt(noiseSquared/rawHitObjects.size());
+            
+        return new Cluster(amplitudeSum, noise);
+    }
+    
     /**
      *  Method that creates a map between a fitted raw hit and it's corresponding raw fit
      *  
@@ -466,48 +361,32 @@
         return reconParticleMap.get(track);
     }
    
-    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(.70);
-        } 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;
+    /**
+     * 
+     * @author omoreno
+     *
+     */
+    private class Cluster { 
+        
+        private double amplitude;
+        private double noise; 
+        
+        /** Default Constructor */ 
+        public Cluster(double amplitude, double noise) {
+            this.amplitude = amplitude; 
+            this.noise = noise; 
+        }
+        
+        public double getAmplitude() { 
+            return this.amplitude; 
+        }
+        
+        public double getNoise() { 
+            return this.noise;
+        }
+        
+        public double getSignalToNoise() { 
+            return this.getAmplitude()/this.getNoise();
+        }
     }
 }