LISTSERV mailing list manager LISTSERV 16.5

Help for HPS-SVN Archives


HPS-SVN Archives

HPS-SVN Archives


HPS-SVN@LISTSERV.SLAC.STANFORD.EDU


View:

Message:

[

First

|

Previous

|

Next

|

Last

]

By Topic:

[

First

|

Previous

|

Next

|

Last

]

By Author:

[

First

|

Previous

|

Next

|

Last

]

Font:

Proportional Font

LISTSERV Archives

LISTSERV Archives

HPS-SVN Home

HPS-SVN Home

HPS-SVN  September 2015

HPS-SVN September 2015

Subject:

r3666 - in /java/trunk/users/src/main/java/org/hps/users/kmccarty/plots: ./ formatter/

From:

[log in to unmask]

Reply-To:

Notification of commits to the hps svn repository <[log in to unmask]>

Date:

Tue, 22 Sep 2015 19:11:49 -0000

Content-Type:

text/plain

Parts/Attachments:

Parts/Attachments

text/plain (1797 lines)

Author: [log in to unmask]
Date: Tue Sep 22 12:11:46 2015
New Revision: 3666

Log:
Added AIDA plot formatting framework.

Added:
    java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/PlotsFormatter.java
    java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/
    java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/InvariantMassPlotsFormatter.java
    java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/MTEPlotFormatter.java
    java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/MTETriggerPlotsFormatter.java
    java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/ParticleMCAnalysisPlotsFormatter.java   (with props)
    java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/SingleTriggerPlotsFormatter.java   (with props)
    java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/TridentTrackFormatter.java
    java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/TriggerPlotsFormat.java

Added: java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/PlotsFormatter.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/PlotsFormatter.java	(added)
+++ java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/PlotsFormatter.java	Tue Sep 22 12:11:46 2015
@@ -0,0 +1,127 @@
+package org.hps.users.kmccarty.plots;
+
+import hep.aida.ref.plotter.PlotterRegion;
+import jas.hist.JASHist1DHistogramStyle;
+import jas.hist.JASHist2DHistogramStyle;
+
+import java.awt.Color;
+import java.awt.Font;
+
+public class PlotsFormatter {
+	// Define plot fonts.
+	public static final Font BASIC_FONT = new Font("Calibri", Font.PLAIN, 30);
+	public static final Font AXIS_FONT  = new Font("Calibri", Font.BOLD,  35);
+	public static final Font TITLE_FONT = new Font("Calibri", Font.BOLD,  45);
+	
+	// Defines the color style options for plot data.
+	public static enum ColorStyle {
+		 MS_BLUE(new Color( 79, 129, 189), new Color( 36,  64,  97)), MS_ORANGE(new Color(247, 150,  70), new Color(152,  72,   6)),
+		  MS_RED(new Color(192,  80,  77), new Color( 99,  36,  35)),      GREY(new Color(166, 166, 166), new Color( 89,  89,  89)),
+		MS_GREEN(new Color(155, 187,  89), new Color( 79,  98,  40)),   CRIMSON(new Color(161,   0,   0), new Color(104,   0,   0)),
+		    RUST(new Color(161,  80,   0), new Color(105,  80,   0)),    YELLOW(new Color(161, 161,   0), new Color(122, 109,   8)),
+		  FOREST(new Color( 65, 102,   0), new Color( 37,  79,   0)),     GREEN(new Color(  7, 132,  70), new Color(  7,  82,  30)),
+		    TEAL(new Color(  0, 130, 130), new Color(  0,  90, 100)),  CERULEAN(new Color(  0,  86, 130), new Color(  0,  28,  83)),
+		    BLUE(new Color(  0,  33, 203), new Color(  0,   0, 137)),    INDIGO(new Color( 68,  10, 127), new Color(  0,   0,  61)),
+		  PURPLE(new Color(106,   0, 106), new Color( 63,   0,  56)),   FUSCHIA(new Color(119,   0,  60), new Color( 60,   0,  60));
+		
+		private final Color fillColor;
+		private final Color lineColor;
+		
+		private ColorStyle(Color fillColor, Color lineColor) {
+			this.fillColor = fillColor;
+			this.lineColor = lineColor;
+		}
+		
+		public Color getFillColor() { return fillColor; }
+		
+		public Color getLineColor() { return lineColor; }
+	};
+	
+	/**
+	 * Sets the plot display formatting for 1D plots.
+	 * @param region - The plotter region to format.
+	 * @param color - The data color settings to use.
+	 */
+	public static final void setDefault1DStyle(PlotterRegion region, ColorStyle[] color) {
+		// Get the names of each plot on in the region.
+		String[] dataNames = region.getAllDataNames();
+		
+		// Check whether this is an overlay plot. Overlay plots contain
+		// more than one data name.
+		boolean overlay = (dataNames.length > 1 ? true : false);
+		
+		// Iterate over each plot in the region.
+		for(int i = 0; i < dataNames.length; i++) {
+			// Set the overlay style if needed.
+			if(overlay) {
+				// Get the fill style for the current data type.
+				JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle();
+				
+				// Set the histogram style to display thick-lined bars
+				// with no fill. The color is set by the "color" argument.
+				fillStyle.setHistogramFill(false);
+				fillStyle.setHistogramBarLineWidth(3);
+				fillStyle.setHistogramBarLineColor(color[i].getFillColor());
+				
+				// Set the legend text style.
+				region.getPlot().getLegend().setFont(new Font("Calibri", Font.PLAIN, 20));
+			}
+			
+			// Otherwise, set the fill style for a single plot.
+			else {
+				// Get the fill style for the current data type.
+				JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle();
+				
+				// Set the histogram style to display thick-lined bars
+				// with a fill color. The colors are defined by the
+				// "color" argument.
+				fillStyle.setHistogramBarLineWidth(3);
+				fillStyle.setHistogramBarColor(color[i].getFillColor());
+				fillStyle.setHistogramBarLineColor(color[i].getLineColor());
+			}
+			
+			// Set the statistics box style.
+			region.getPlot().getStats().setVisible(true);
+			region.getPlot().getStats().setFont(BASIC_FONT);
+			
+			// Set the title font.
+			region.getPlot().getTitleObject().setFont(TITLE_FONT);
+			
+			// Set the axis tick-mark fonts.
+			region.getPlot().getXAxis().setFont(BASIC_FONT);
+			region.getPlot().getYAxis().setFont(BASIC_FONT);
+			region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT);
+			region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT);
+		}
+	}
+	
+	/**
+	 * Sets the plot display formatting for 1D plots.
+	 * @param region - The plotter region to format.
+	 */
+	public static final void setDefault2DStyle(PlotterRegion region, boolean logarithmic) {
+		// Get the fill style object. 2D plots should never be overlay
+		// plots, so there should only ever be one data name.
+		JASHist2DHistogramStyle fillStyle = (JASHist2DHistogramStyle) region.getDataForName(region.getAllDataNames()[0]).getStyle();
+		
+		// Set the fill style for a two-dimensional plot.
+		if(logarithmic) { fillStyle.setLogZ(true); }
+		fillStyle.setHistStyle(JASHist2DHistogramStyle.STYLE_COLORMAP);
+		fillStyle.setColorMapScheme(JASHist2DHistogramStyle.COLORMAP_RAINBOW);
+		
+		// Make the statistics box invisible.
+		region.getPlot().getStats().setVisible(false);
+		
+		// Set the general plot font (which is also the z-axis font).
+		region.getPlot().setFont(BASIC_FONT);
+		
+		// Set the title font.
+		region.getPlot().getTitleObject().setFont(TITLE_FONT);
+		
+		// Set the axis tick-mark fonts.
+		region.getPlot().getXAxis().setFont(BASIC_FONT);
+		region.getPlot().getYAxis().setFont(BASIC_FONT);
+		region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT);
+		region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT);
+	}
+}

Added: java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/InvariantMassPlotsFormatter.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/InvariantMassPlotsFormatter.java	(added)
+++ java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/InvariantMassPlotsFormatter.java	Tue Sep 22 12:11:46 2015
@@ -0,0 +1,335 @@
+package org.hps.users.kmccarty.plots.formatter;
+
+import jas.hist.JASHist1DHistogramStyle;
+import jas.hist.JASHist2DHistogramStyle;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.io.IOException;
+
+import org.lcsim.util.aida.AIDA;
+
+import hep.aida.IAnalysisFactory;
+import hep.aida.IHistogram;
+import hep.aida.IHistogram1D;
+import hep.aida.IHistogram2D;
+import hep.aida.IPlotter;
+import hep.aida.IPlotterFactory;
+import hep.aida.ITree;
+import hep.aida.ref.plotter.PlotterRegion;
+
+public class InvariantMassPlotsFormatter {
+	// Define plot fonts.
+	private static final Font BASIC_FONT = new Font("Calibri", Font.PLAIN, 20);
+	private static final Font AXIS_FONT  = new Font("Calibri", Font.BOLD,  25);
+	private static final Font TITLE_FONT = new Font("Calibri", Font.BOLD,  35);
+	
+	// Defines the color style options for plot data.
+	private enum ColorStyle {
+		 MS_BLUE(new Color( 79, 129, 189), new Color( 36,  64,  97)), MS_ORANGE(new Color(247, 150,  70), new Color(152,  72,   6)),
+		  MS_RED(new Color(192,  80,  77), new Color( 99,  36,  35)),      GREY(new Color(166, 166, 166), new Color( 89,  89,  89)),
+		MS_GREEN(new Color(155, 187,  89), new Color( 79,  98,  40)),   CRIMSON(new Color(161,   0,   0), new Color(104,   0,   0)),
+		    RUST(new Color(161,  80,   0), new Color(105,  80,   0)),    YELLOW(new Color(161, 161,   0), new Color(122, 109,   8)),
+		  FOREST(new Color( 65, 102,   0), new Color( 37,  79,   0)),     GREEN(new Color(  7, 132,  70), new Color(  7,  82,  30)),
+		    TEAL(new Color(  0, 130, 130), new Color(  0,  90, 100)),  CERULEAN(new Color(  0,  86, 130), new Color(  0,  28,  83)),
+		    BLUE(new Color(  0,  33, 203), new Color(  0,   0, 137)),    INDIGO(new Color( 68,  10, 127), new Color(  0,   0,  61)),
+		  PURPLE(new Color(106,   0, 106), new Color( 63,   0,  56)),   FUSCHIA(new Color(119,   0,  60), new Color( 60,   0,  60));
+		
+		private final Color fillColor;
+		private final Color lineColor;
+		
+		private ColorStyle(Color fillColor, Color lineColor) {
+			this.fillColor = fillColor;
+			this.lineColor = lineColor;
+		}
+		
+		public Color getFillColor() { return fillColor; }
+		
+		public Color getLineColor() { return lineColor; }
+	};
+		
+	/**
+	 * Loads all plots in a file and formats them according to the
+	 * indicated style.
+	 * @param args - Unused default executable parameter.
+	 * @throws IOException Occurs if there is an issue opening the file.
+	 */
+	public static void main(String[] args) throws IOException {
+		// Define the root directory for the plots.
+		String rootDir = "D:\\cygwin64\\home\\Kyle\\";
+		
+		// Define the new name of the file containing the trigger plots.
+		String[] plotFile = {
+				rootDir + "temp.aida"
+		};
+		
+		// Define the run numbers for each file.
+		String[] runNumber = { "1 Hits", "2 Hits" };
+		
+		// Define the scaling factors for each plot.
+		double scaleFactor = 13.254;
+		
+		// Get the plots file and open it.
+		IAnalysisFactory af = IAnalysisFactory.create();
+		ITree[] tree = new ITree[plotFile.length];
+		for(int i = 0; i < plotFile.length; i++) {
+			tree[i] = af.createTreeFactory().create(plotFile[i]);
+			if(tree[i] == null) { throw new IllegalArgumentException("Unable to load plot file."); }
+		}
+		
+		// Get the histograms.
+		IHistogram1D[] invariantMassPlots = new IHistogram1D[3];
+		invariantMassPlots[0] = (IHistogram1D) tree[0].find("Trident Analysis/Particle Invariant Mass (1 Hit)");
+		invariantMassPlots[1] = (IHistogram1D) tree[0].find("Trident Analysis/Particle Invariant Mass (2 Hit)");
+		IHistogram1D electronEnergyPlot = (IHistogram1D) tree[0].find("Trident Analysis/Electron Energy");
+		IHistogram1D positronEnergyPlot = (IHistogram1D) tree[0].find("Trident Analysis/Positron Energy");
+		IHistogram1D energySumPlot = (IHistogram1D) tree[0].find("Trident Analysis/Energy Sum Distribution");
+		IHistogram2D energySum2DPlot = (IHistogram2D) tree[0].find("Trident Analysis/2D Energy Distribution");
+		IHistogram1D tridentElectronEnergyPlot = (IHistogram1D) tree[0].find("Trident Analysis/Trident Electron Energy");
+		IHistogram1D tridentPositronEnergyPlot = (IHistogram1D) tree[0].find("Trident Analysis/Trident Positron Energy");
+		
+		// Define the plot titles and arrays.
+		IHistogram[] plots = { electronEnergyPlot, positronEnergyPlot, energySumPlot, tridentElectronEnergyPlot, tridentPositronEnergyPlot };
+		String[] titles = { "Electron Energy", "Positron Energy", "Energy Sum", "Trident Electron Energy", "Trident Positron Energy" };
+		String[] xTitles = { "Energy (GeV)", "Energy (GeV)", "Energy Sum (GeV)", "Energy (GeV)", "Energy (GeV)" };
+		
+		// Re-bin the histograms to have 5-times larger bins. First,
+		// get the bin count and upper and lower bounds of the plot.
+		int bins = invariantMassPlots[0].axis().bins();
+		double low = invariantMassPlots[0].axis().binLowerEdge(0);
+		double high = invariantMassPlots[0].axis().binUpperEdge(invariantMassPlots[0].axis().bins() - 1);
+		
+		// Create new plots with the larger bin sizes.
+		AIDA aida = AIDA.defaultInstance();
+		IHistogram1D[] newPlot = new IHistogram1D[2];
+		newPlot[0] = aida.histogram1D("Particle Invariant Mass (1 Hit)", bins / 5, low, high);
+		newPlot[1] = aida.histogram1D("Particle Invariant Mass (2 Hit)", bins / 5, low, high);
+		
+		// Populate the new plots with the data from the old ones.
+		for(int j = 0; j < 2; j++) {
+			for(int i = 0; i < bins; i++) {
+				int entries = invariantMassPlots[j].binEntries(i);
+				double center = invariantMassPlots[j].axis().binCenter(i);
+				for(int k = 0; k < entries; k++) {
+					newPlot[j].fill(center);
+				}
+			}
+		}
+		
+		// Replace the old plots.
+		invariantMassPlots = newPlot;
+		
+		// Create a plotter factory.
+		IPlotterFactory plotterFactory = af.createPlotterFactory();
+		
+		// Format and display the basic histograms.
+		for(int i = 0; i < plots.length; i++) {
+			// Scale the histogram by the appropriate scaling factor.
+			plots[i].scale(1.0 / scaleFactor);
+			
+			// Create a plotter and plotting region for the plot.
+			IPlotter plotter = plotterFactory.create(titles[i]);
+			plotter.createRegions(1);
+			plotter.region(0).plot(plots[i]);
+			
+			// Format the axis labels.
+			PlotterRegion region = (PlotterRegion) plotter.region(0);
+			region.getPlot().setTitle(titles[i]);
+			region.getPlot().getXAxis().setLabel(xTitles[i]);
+			region.getPlot().getYAxis().setLabel("Rate (Hz)");
+			
+			// Format the fonts and general plot presentation.
+			setDefault1DStyle(region, new ColorStyle[] { ColorStyle.GREY });
+			
+			// Show the plot.
+			plotter.setParameter("plotterWidth", "2000");
+			plotter.setParameter("plotterHeight", "1200");
+			plotter.show();
+		}
+		
+		// Format and display the 2D histogram.
+		energySum2DPlot.scale(1.0 / scaleFactor);
+		IPlotter plotter2D = plotterFactory.create("2D Energy Sum");
+		plotter2D.createRegions(1);
+		plotter2D.region(0).plot(energySum2DPlot);
+		
+		// Format the axis labels.
+		PlotterRegion region2D = (PlotterRegion) plotter2D.region(0);
+		region2D.getPlot().setTitle("2D Energy Sum");
+		region2D.getPlot().getXAxis().setLabel("Electron Energy (GeV)");
+		region2D.getPlot().getYAxis().setLabel("Positron Energy (GeV)");
+		
+		// Format the fonts and general plot presentation.
+		setDefault2DStyle(region2D, false);
+		
+		// Show the plot.
+		plotter2D.setParameter("plotterWidth", "2000");
+		plotter2D.setParameter("plotterHeight", "1200");
+		plotter2D.show();
+		
+		// Format and display the histograms.
+		for(int i = 0; i < 2; i++) {
+			// Scale the histogram by the appropriate scaling factor.
+			invariantMassPlots[i].scale(1.0 / scaleFactor);
+			
+			// Create a plotter and plotting region for the plot.
+			IPlotter plotter = plotterFactory.create("Particle Invariant Mass (" + runNumber[i] + ")");
+			plotter.createRegions(1);
+			plotter.region(0).plot(invariantMassPlots[i]);
+			
+			// Format the axis labels.
+			PlotterRegion region = (PlotterRegion) plotter.region(0);
+			region.getPlot().setTitle("Particle Invariant Mass (" + runNumber[i] + ")");
+			region.getPlot().getXAxis().setLabel("Invariant Mass (GeV)");
+			region.getPlot().getYAxis().setLabel("Rate (Hz)");
+			
+			// Format the fonts and general plot presentation.
+			setDefault1DStyle(region, new ColorStyle[] { ColorStyle.GREY });
+			
+			// Show the plot.
+			plotter.setParameter("plotterWidth", "2000");
+			plotter.setParameter("plotterHeight", "1200");
+			plotter.show();
+		}
+		
+		// Note which plot is the numerator and which is the denominator.
+		int numerator   = 0;
+		int denominator = 1;
+		
+		// Create a new histogram to display the ratios of the rates.
+		IHistogram1D ratioPlot = AIDA.defaultInstance().histogram1D("Invariant Mass Ratio (" + runNumber[numerator] + " / "
+				+ runNumber[denominator] + ")", invariantMassPlots[0].axis().bins(),
+				invariantMassPlots[0].axis().lowerEdge(), invariantMassPlots[0].axis().upperEdge());
+		
+		// Iterate over each bin.
+		for(int bin = 0; bin < invariantMassPlots[0].axis().bins(); bin++) {
+			// Calculate the ratio.
+			double ratio = invariantMassPlots[numerator].binHeight(bin) / invariantMassPlots[denominator].binHeight(bin);
+			
+			// If the ratio is either not a number of infinite, skip
+			// this bin.
+			if(Double.isNaN(ratio) || Double.isInfinite(ratio)) { continue; }
+			
+			// Populate the ratio plot bin.
+			ratioPlot.fill(invariantMassPlots[0].axis().binCenter(bin), ratio);
+		}
+		
+		// Create a plotter and plotting region for the plot.
+		IPlotter plotter = plotterFactory.create("Invariant Mass Ratio (5411 / 5554)");
+		plotter.createRegions(1);
+		plotter.region(0).plot(ratioPlot);
+		
+		// Format the axis labels.
+		PlotterRegion region = (PlotterRegion) plotter.region(0);
+		region.getPlot().setTitle("Invariant Mass Ratio (" + runNumber[numerator] + " / " + runNumber[denominator] + ")");
+		region.getPlot().getXAxis().setLabel("Invariant Mass (GeV)");
+		region.getPlot().getXAxis().setMin(0.010);
+		region.getPlot().getXAxis().setMax(0.060);
+		region.getPlot().getYAxis().setLabel("Ratio");
+		
+		// Format the fonts and general plot presentation.
+		setDefault1DStyle(region, new ColorStyle[] { ColorStyle.GREY });
+		
+		// Disable the error bars.
+		JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(region.getAllDataNames()[0]).getStyle();
+		fillStyle.setShowErrorBars(false);
+		
+		// Show the plot.
+		plotter.setParameter("plotterWidth", "2000");
+		plotter.setParameter("plotterHeight", "1200");
+		plotter.show();
+		
+		// Close the trees.
+		for(int i = 0; i < plotFile.length; i++) {
+			tree[i].close();
+		}
+	}
+	
+	/**
+	 * Sets the plot display formatting for 1D plots.
+	 * @param region - The plotter region to format.
+	 * @param color - The data color settings to use.
+	 */
+	private static final void setDefault1DStyle(PlotterRegion region, ColorStyle[] color) {
+		// Get the names of each plot on in the region.
+		String[] dataNames = region.getAllDataNames();
+		
+		// Check whether this is an overlay plot. Overlay plots contain
+		// more than one data name.
+		boolean overlay = (dataNames.length > 1 ? true : false);
+		
+		// Iterate over each plot in the region.
+		for(int i = 0; i < dataNames.length; i++) {
+			// Set the overlay style if needed.
+			if(overlay) {
+				// Get the fill style for the current data type.
+				JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle();
+				
+				// Set the histogram style to display thick-lined bars
+				// with no fill. The color is set by the "color" argument.
+				fillStyle.setHistogramFill(false);
+				fillStyle.setHistogramBarLineWidth(3);
+				fillStyle.setHistogramBarLineColor(color[i].getFillColor());
+				
+				// Set the legend text style.
+				region.getPlot().getLegend().setFont(new Font("Calibri", Font.PLAIN, 20));
+			}
+			
+			// Otherwise, set the fill style for a single plot.
+			else {
+				// Get the fill style for the current data type.
+				JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle();
+				
+				// Set the histogram style to display thick-lined bars
+				// with a fill color. The colors are defined by the
+				// "color" argument.
+				fillStyle.setHistogramBarLineWidth(3);
+				fillStyle.setHistogramBarColor(color[i].getFillColor());
+				fillStyle.setHistogramBarLineColor(color[i].getLineColor());
+			}
+			
+			// Set the statistics box style.
+			region.getPlot().getStats().setVisible(true);
+			region.getPlot().getStats().setFont(BASIC_FONT);
+			
+			// Set the title font.
+			region.getPlot().getTitleObject().setFont(TITLE_FONT);
+			
+			// Set the axis tick-mark fonts.
+			region.getPlot().getXAxis().setFont(BASIC_FONT);
+			region.getPlot().getYAxis().setFont(BASIC_FONT);
+			region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT);
+			region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT);
+		}
+	}
+	
+	/**
+	 * Sets the plot display formatting for 1D plots.
+	 * @param region - The plotter region to format.
+	 */
+	private static final void setDefault2DStyle(PlotterRegion region, boolean logarithmic) {
+		// Get the fill style object. 2D plots should never be overlay
+		// plots, so there should only ever be one data name.
+		JASHist2DHistogramStyle fillStyle = (JASHist2DHistogramStyle) region.getDataForName(region.getAllDataNames()[0]).getStyle();
+		
+		// Set the fill style for a two-dimensional plot.
+		if(logarithmic) { fillStyle.setLogZ(true); }
+		fillStyle.setHistStyle(JASHist2DHistogramStyle.STYLE_COLORMAP);
+		fillStyle.setColorMapScheme(JASHist2DHistogramStyle.COLORMAP_RAINBOW);
+		
+		// Make the statistics box invisible.
+		region.getPlot().getStats().setVisible(false);
+		
+		// Set the general plot font (which is also the z-axis font).
+		region.getPlot().setFont(BASIC_FONT);
+		
+		// Set the title font.
+		region.getPlot().getTitleObject().setFont(TITLE_FONT);
+		
+		// Set the axis tick-mark fonts.
+		region.getPlot().getXAxis().setFont(BASIC_FONT);
+		region.getPlot().getYAxis().setFont(BASIC_FONT);
+		region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT);
+		region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT);
+	}
+}

Added: java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/MTEPlotFormatter.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/MTEPlotFormatter.java	(added)
+++ java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/MTEPlotFormatter.java	Tue Sep 22 12:11:46 2015
@@ -0,0 +1,326 @@
+package org.hps.users.kmccarty.plots.formatter;
+
+import jas.hist.JASHist1DHistogramStyle;
+import jas.hist.JASHist2DHistogramStyle;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.io.IOException;
+import java.util.List;
+
+import org.lcsim.util.aida.AIDA;
+
+import hep.aida.IAnalysisFactory;
+import hep.aida.IHistogram1D;
+import hep.aida.IHistogram2D;
+import hep.aida.IPlotter;
+import hep.aida.IPlotterFactory;
+import hep.aida.ITree;
+import hep.aida.ref.plotter.PlotterRegion;
+
+public class MTEPlotFormatter {
+	// Define plot fonts.
+	private static final Font BASIC_FONT = new Font("Calibri", Font.PLAIN, 20);
+	private static final Font AXIS_FONT  = new Font("Calibri", Font.BOLD,  25);
+	private static final Font TITLE_FONT = new Font("Calibri", Font.BOLD,  35);
+	
+	// Defines the color style options for plot data.
+	private enum ColorStyle {
+		 MS_BLUE(new Color( 79, 129, 189), new Color( 36,  64,  97)), MS_ORANGE(new Color(247, 150,  70), new Color(152,  72,   6)),
+		  MS_RED(new Color(192,  80,  77), new Color( 99,  36,  35)),      GREY(new Color(166, 166, 166), new Color( 89,  89,  89)),
+		MS_GREEN(new Color(155, 187,  89), new Color( 79,  98,  40)),   CRIMSON(new Color(161,   0,   0), new Color(104,   0,   0)),
+		    RUST(new Color(161,  80,   0), new Color(105,  80,   0)),    YELLOW(new Color(161, 161,   0), new Color(122, 109,   8)),
+		  FOREST(new Color( 65, 102,   0), new Color( 37,  79,   0)),     GREEN(new Color(  7, 132,  70), new Color(  7,  82,  30)),
+		    TEAL(new Color(  0, 130, 130), new Color(  0,  90, 100)),  CERULEAN(new Color(  0,  86, 130), new Color(  0,  28,  83)),
+		    BLUE(new Color(  0,  33, 203), new Color(  0,   0, 137)),    INDIGO(new Color( 68,  10, 127), new Color(  0,   0,  61)),
+		  PURPLE(new Color(106,   0, 106), new Color( 63,   0,  56)),   FUSCHIA(new Color(119,   0,  60), new Color( 60,   0,  60));
+		
+		private final Color fillColor;
+		private final Color lineColor;
+		
+		private ColorStyle(Color fillColor, Color lineColor) {
+			this.fillColor = fillColor;
+			this.lineColor = lineColor;
+		}
+		
+		public Color getFillColor() { return fillColor; }
+		
+		public Color getLineColor() { return lineColor; }
+	};
+		
+	/**
+	 * Loads all plots in a file and formats them according to the
+	 * indicated style.
+	 * @param args - Unused default executable parameter.
+	 * @throws IOException Occurs if there is an issue opening the file.
+	 */
+	public static void main(String[] args) throws IOException {
+		// Define the root directory for the plots.
+		String rootDir = "D:\\cygwin64\\home\\Kyle\\";
+		
+		// Define the new name of the file containing the trigger plots.
+		String plotFile = rootDir + "temp.aida";
+		
+		// Define the scaling factors for each plot.
+		double scaleFactor = 1;
+		
+		// Get the plots file and open it.
+		IAnalysisFactory af = IAnalysisFactory.create();
+		ITree tree = af.createTreeFactory().create(plotFile);
+		if(tree == null) { throw new IllegalArgumentException("Unable to load plot file."); }
+		
+		// Define index references for each event type.
+		int MOLLER  = 0;
+		int TRIDENT = 1;
+		int ELASTIC = 2;
+		
+		// Get the histograms.
+		IHistogram1D[] trackCountPlots = new IHistogram1D[3];
+		trackCountPlots[MOLLER]  = (IHistogram1D) tree.find("MTE Analysis/Møller Event Tracks");
+		trackCountPlots[TRIDENT] = (IHistogram1D) tree.find("MTE Analysis/Trident Event Tracks");
+		trackCountPlots[ELASTIC] = (IHistogram1D) tree.find("MTE Analysis/Elastic Event Tracks");
+		
+		IHistogram1D[] energyPlots = new IHistogram1D[3];
+		energyPlots[MOLLER]  = (IHistogram1D) tree.find("MTE Analysis/Møller Electron Energy Distribution");
+		energyPlots[TRIDENT] = (IHistogram1D) tree.find("MTE Analysis/Trident Electron Energy Distribution");
+		energyPlots[ELASTIC] = (IHistogram1D) tree.find("MTE Analysis/Elastic Energy Distribution");
+		
+		IHistogram1D[] energySumPlots = new IHistogram1D[2];
+		energySumPlots[MOLLER]  = (IHistogram1D) tree.find("MTE Analysis/Møller Energy Sum Distribution");
+		energySumPlots[TRIDENT] = (IHistogram1D) tree.find("MTE Analysis/Trident Energy Sum Distribution");
+		
+		IHistogram2D[] energy2DPlots = new IHistogram2D[2];
+		energy2DPlots[MOLLER]  = (IHistogram2D) tree.find("MTE Analysis/Møller 2D Energy Distribution");
+		energy2DPlots[TRIDENT] = (IHistogram2D) tree.find("MTE Analysis/Trident 2D Energy Distribution");
+		
+		// Create a plotter factory.
+		IPlotterFactory plotterFactory = af.createPlotterFactory();
+		
+		// Format the track count plots.
+		for(IHistogram1D trackCountPlot : trackCountPlots) {
+			// Create a plotter and plotting region for the plot.
+			IPlotter plotter = plotterFactory.create(trackCountPlot.title());
+			plotter.createRegions(1);
+			plotter.region(0).plot(trackCountPlot);
+			
+			// Format the axis labels.
+			PlotterRegion region = (PlotterRegion) plotter.region(0);
+			region.getPlot().setTitle(trackCountPlot.title());
+			region.getPlot().getXAxis().setLabel("Number of Tracks");
+			region.getPlot().getYAxis().setLabel("Count");
+			
+			// Format the fonts and general plot presentation.
+			setDefault1DStyle(region, new ColorStyle[] { ColorStyle.GREY });
+			
+			// Show the plot.
+			plotter.setParameter("plotterWidth", "2000");
+			plotter.setParameter("plotterHeight", "1200");
+			plotter.show();
+		}
+		
+		// Format the electron energy plots.
+		for(IHistogram1D energyPlot : energyPlots) {
+			// Create a plotter and plotting region for the plot.
+			IPlotter plotter = plotterFactory.create(energyPlot.title());
+			plotter.createRegions(1);
+			plotter.region(0).plot(energyPlot);
+			
+			// Format the axis labels.
+			PlotterRegion region = (PlotterRegion) plotter.region(0);
+			region.getPlot().setTitle(energyPlot.title());
+			region.getPlot().getXAxis().setLabel("Track Energy (GeV)");
+			region.getPlot().getYAxis().setLabel("Count");
+			
+			// Format the fonts and general plot presentation.
+			setDefault1DStyle(region, new ColorStyle[] { ColorStyle.GREY });
+			
+			// Show the plot.
+			plotter.setParameter("plotterWidth", "2000");
+			plotter.setParameter("plotterHeight", "1200");
+			plotter.show();
+		}
+		
+		// Format the energy sum plots.
+		for(IHistogram1D energySumPlot : energySumPlots) {
+			// Create a plotter and plotting region for the plot.
+			IPlotter plotter = plotterFactory.create(energySumPlot.title());
+			plotter.createRegions(1);
+			plotter.region(0).plot(energySumPlot);
+			
+			// Format the axis labels.
+			PlotterRegion region = (PlotterRegion) plotter.region(0);
+			region.getPlot().setTitle(energySumPlot.title());
+			region.getPlot().getXAxis().setLabel("Track Energy (GeV)");
+			region.getPlot().getYAxis().setLabel("Count");
+			
+			// Format the fonts and general plot presentation.
+			setDefault1DStyle(region, new ColorStyle[] { ColorStyle.GREY });
+			
+			// Show the plot.
+			plotter.setParameter("plotterWidth", "2000");
+			plotter.setParameter("plotterHeight", "1200");
+			plotter.show();
+		}
+		
+		// Format the 2D energy sum plots.
+		for(IHistogram2D energy2DPlot : energy2DPlots) {
+			// Create a plotter and plotting region for the plot.
+			IPlotter plotter = plotterFactory.create(energy2DPlot.title());
+			plotter.createRegions(1);
+			plotter.region(0).plot(energy2DPlot);
+			
+			// Format the axis labels.
+			PlotterRegion region = (PlotterRegion) plotter.region(0);
+			region.getPlot().setTitle(energy2DPlot.title());
+			region.getPlot().getXAxis().setLabel("First Track Energy (GeV)");
+			region.getPlot().getYAxis().setLabel("Second Track Energy (GeV)");
+			
+			
+			// Format the fonts and general plot presentation.
+			setDefault2DStyle(region, false);
+			
+			// Show the plot.
+			plotter.setParameter("plotterWidth", "2000");
+			plotter.setParameter("plotterHeight", "1200");
+			plotter.show();
+		}
+		
+		// Disable the error bars.
+		//JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(region.getAllDataNames()[0]).getStyle();
+		//fillStyle.setShowErrorBars(false);
+		
+		// Close the tree.
+		tree.close();
+	}
+	
+	/**
+	 * Sets the plot display formatting for 1D plots.
+	 * @param region - The plotter region to format.
+	 * @param color - The data color settings to use.
+	 */
+	private static final void setDefault1DStyle(PlotterRegion region, ColorStyle[] color) {
+		// Get the names of each plot on in the region.
+		String[] dataNames = region.getAllDataNames();
+		
+		// Check whether this is an overlay plot. Overlay plots contain
+		// more than one data name.
+		boolean overlay = (dataNames.length > 1 ? true : false);
+		
+		// Iterate over each plot in the region.
+		for(int i = 0; i < dataNames.length; i++) {
+			// Set the overlay style if needed.
+			if(overlay) {
+				// Get the fill style for the current data type.
+				JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle();
+				
+				// Set the histogram style to display thick-lined bars
+				// with no fill. The color is set by the "color" argument.
+				fillStyle.setHistogramFill(false);
+				fillStyle.setHistogramBarLineWidth(3);
+				fillStyle.setHistogramBarLineColor(color[i].getFillColor());
+				
+				// Set the legend text style.
+				region.getPlot().getLegend().setFont(new Font("Calibri", Font.PLAIN, 20));
+			}
+			
+			// Otherwise, set the fill style for a single plot.
+			else {
+				// Get the fill style for the current data type.
+				JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle();
+				
+				// Set the histogram style to display thick-lined bars
+				// with a fill color. The colors are defined by the
+				// "color" argument.
+				fillStyle.setHistogramBarLineWidth(3);
+				fillStyle.setHistogramBarColor(color[i].getFillColor());
+				fillStyle.setHistogramBarLineColor(color[i].getLineColor());
+			}
+			
+			// Set the statistics box style.
+			region.getPlot().getStats().setVisible(true);
+			region.getPlot().getStats().setFont(BASIC_FONT);
+			
+			// Set the title font.
+			region.getPlot().getTitleObject().setFont(TITLE_FONT);
+			
+			// Set the axis tick-mark fonts.
+			region.getPlot().getXAxis().setFont(BASIC_FONT);
+			region.getPlot().getYAxis().setFont(BASIC_FONT);
+			region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT);
+			region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT);
+		}
+	}
+	
+	/**
+	 * Sets the plot display formatting for 1D plots.
+	 * @param region - The plotter region to format.
+	 */
+	private static final void setDefault2DStyle(PlotterRegion region, boolean logarithmic) {
+		// Get the fill style object. 2D plots should never be overlay
+		// plots, so there should only ever be one data name.
+		JASHist2DHistogramStyle fillStyle = (JASHist2DHistogramStyle) region.getDataForName(region.getAllDataNames()[0]).getStyle();
+		
+		// Set the fill style for a two-dimensional plot.
+		if(logarithmic) { fillStyle.setLogZ(true); }
+		fillStyle.setHistStyle(JASHist2DHistogramStyle.STYLE_COLORMAP);
+		fillStyle.setColorMapScheme(JASHist2DHistogramStyle.COLORMAP_RAINBOW);
+		
+		// Make the statistics box invisible.
+		region.getPlot().getStats().setVisible(false);
+		
+		// Set the general plot font (which is also the z-axis font).
+		region.getPlot().setFont(BASIC_FONT);
+		
+		// Set the title font.
+		region.getPlot().getTitleObject().setFont(TITLE_FONT);
+		
+		// Set the axis tick-mark fonts.
+		region.getPlot().getXAxis().setFont(BASIC_FONT);
+		region.getPlot().getYAxis().setFont(BASIC_FONT);
+		region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT);
+		region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT);
+	}
+	
+	/**
+	 * Recursive method that gets all object names from a tree that
+	 * are not directories. Method should not be called directly, but
+	 * rather called only through the <code>getHistograms(ITree)</code>
+	 * method.
+	 * @param tree - The tree from which to obtain the object names.
+	 * @param directory - The directory in which to search for objects.
+	 * @param list - The list in which to place the objects.
+	 * @return Returns the <code>List</code> collection that was given
+	 * as an argument.
+	 */
+	private static final List<String> getHistograms(ITree tree, String directory, List<String> list) {
+		// Get the list of objects in the directory.
+		String[] treeObjects = tree.listObjectNames(directory);
+		
+		// Print the objects.
+		for(String objectName : treeObjects) {
+			// Check if the object is a directory.
+			boolean isDirectory = isDirectory(objectName);
+			
+			// If the object is a directory, get the histograms from it.
+			if(isDirectory) {
+				getHistograms(tree, objectName, list);
+			}
+			
+			// If the object is a plot, add it to the list.
+			else { list.add(objectName); }
+		}
+		
+		// Return the list.
+		return list;
+	}
+	
+	/**
+	 * Checks whether a tree object is a directory.
+	 * @param object - The object to check.
+	 * @return Returns <code>true</code> if the object is a directory
+	 * and <code>false</code> otherwise.
+	 */
+	private static final boolean isDirectory(String object) {
+		return (object.toCharArray()[object.length() - 1] == '/');
+	}
+}

Added: java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/MTETriggerPlotsFormatter.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/MTETriggerPlotsFormatter.java	(added)
+++ java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/MTETriggerPlotsFormatter.java	Tue Sep 22 12:11:46 2015
@@ -0,0 +1,178 @@
+package org.hps.users.kmccarty.plots.formatter;
+
+import java.io.IOException;
+
+import org.hps.users.kmccarty.plots.FormattedPlot1D;
+import org.hps.users.kmccarty.plots.FormattedPlot2D;
+import org.hps.users.kmccarty.plots.PlotFormatModule;
+import org.hps.users.kmccarty.plots.PlotsFormatter;
+import org.hps.users.kmccarty.plots.PlotsFormatter.ColorStyle;
+
+import hep.aida.IAnalysisFactory;
+import hep.aida.IHistogram1D;
+import hep.aida.IHistogram2D;
+import hep.aida.ITree;
+
+
+public class MTETriggerPlotsFormatter {
+	public static void main(String[] args) throws IllegalArgumentException, IOException {
+		// Define the root directory for the plots.
+		String rootDir = "D:\\cygwin64\\home\\Kyle\\";
+		
+		// Define the new name of the file containing the trigger plots.
+		String plotFile = rootDir + "5772-ana.aida";
+		
+		// Get the plots file and open it.
+		IAnalysisFactory af = IAnalysisFactory.create();
+		ITree tree = af.createTreeFactory().create(plotFile);
+		if(tree == null) { throw new IllegalArgumentException("Unable to load plot file."); }
+		
+		// Define the 1D trigger plot names for Møllers and tridents.
+		String[] plotNames1D = { "Cluster Hit Count", "Cluster Seed Energy", "Cluster Total Energy",
+				"Pair Coplanarity", "Pair Energy Difference", "Pair Energy Slope", "Pair Energy Sum" };
+		String[] displayNames1D = { "Cluster Hit Count", "Cluster Seed Energy", "Cluster Total Energy",
+				"Pair Coplanarity", "Pair Energy Difference", "Pair Energy Slope", "Pair Energy Sum" };
+		String[] xAxisNames1D = { "Hit Count", "Seed Energy (GeV)", "Total Energy (GeV)",
+				"Coplanarity (Degrees)", "Energy Difference (GeV)", "Energy Slope (GeV)", "Energy Sum (GeV)" };
+		String yAxisName1D = "Count";
+		
+		// Define the 2D trigger plot names for Møllers and tridents.
+		String[] plotNames2D = { "Cluster Seed", "Pair Energy Sum 2D" };
+		String[] displayNames2D = { "Cluster Seed Distribution", "2D Energy Sum" };
+		String[] xAxisNames2D = { "x-Index", "Second Cluster Energy (GeV)" };
+		String[] yAxisNames2D = { "y-Index", "First Cluster Energy (GeV)" };
+		
+		// Define the 1D trigger plot names for elastics.
+		String[] plotNamesElastic1D = { "Cluster Hit Count", "Cluster Seed Energy", "Cluster Total Energy" };
+		String[] displayNamesElastic1D = { "Cluster Hit Count", "Cluster Seed Energy", "Cluster Total Energy" };
+		String[] xAxisNamesElastic1D = { "Hit Count", "Seed Energy (GeV)", "Total Energy (GeV)" };
+		String yAxisNameElastic1D = "Count";
+		
+		// Define the 2D trigger plot names for elastics.
+		String[] plotNamesElastic2D = { "Cluster Seed" };
+		String[] displayNamesElastic2D = { "Cluster Seed Distribution" };
+		String[] xAxisNamesElastic2D = { "x-Index" };
+		String[] yAxisNamesElastic2D = { "y-Index" };
+		
+		// Define the Møller, trident, and elastic prefixes.
+		String allPrefix = "All Trigger Plots/Pair Plots/";
+		String møllerPrefix = "Møller Trigger Plots/Pair Plots/";
+		String tridentPrefix = "Trident Trigger Plots/Pair Plots/";
+		String elasticPrefix = "Elastic Trigger Plots/Singles Plots/";
+		String allSinglesPrefix = "All Trigger Plots/Singles Plots/";
+		
+		// Define the plot type prefix.
+		String allTypeName = "All Pairs - ";
+		String møllerTypeName = "Møller - ";
+		String tridentTypeName = "Trident - ";
+		String elasticTypeName = "Elastic - ";
+		String allSinglesTypeName = "All Singles - ";
+		
+		// Define the plot type colors.
+		ColorStyle allColor = PlotsFormatter.ColorStyle.GREY;
+		ColorStyle møllerColor = PlotsFormatter.ColorStyle.MS_BLUE;
+		ColorStyle tridentColor = PlotsFormatter.ColorStyle.MS_ORANGE;
+		ColorStyle elasticColor = PlotsFormatter.ColorStyle.MS_GREEN;
+		
+		// Create a plot formatting module.
+		PlotFormatModule module = new PlotFormatModule();
+		
+		// Get the histograms and add them to the module. Start with the
+		// trident and Møller plots.
+		for(int i = 0; i < plotNames1D.length; i++) {
+			// Get the Møller and trident plots.
+			IHistogram1D allPlot = (IHistogram1D) tree.find(allPrefix + plotNames1D[i]);
+			IHistogram1D møllerPlot = (IHistogram1D) tree.find(møllerPrefix + plotNames1D[i]);
+			IHistogram1D tridentPlot = (IHistogram1D) tree.find(tridentPrefix + plotNames1D[i]);
+			
+			// Make a formatted plot for each.
+			FormattedPlot1D allFormattedPlot = new FormattedPlot1D(allPlot, allColor, xAxisNames1D[i], yAxisName1D, allTypeName + displayNames1D[i]);
+			FormattedPlot1D møllerFormattedPlot = new FormattedPlot1D(møllerPlot, møllerColor, xAxisNames1D[i], yAxisName1D, møllerTypeName + displayNames1D[i]);
+			FormattedPlot1D tridentFormattedPlot = new FormattedPlot1D(tridentPlot, tridentColor, xAxisNames1D[i], yAxisName1D, tridentTypeName + displayNames1D[i]);
+			
+			// Add them to the module.
+			module.addPlot1D(allFormattedPlot);
+			module.addPlot1D(møllerFormattedPlot);
+			module.addPlot1D(tridentFormattedPlot);
+		}
+		for(int i = 0; i < plotNames2D.length; i++) {
+			// Get the Møller and trident plots.
+			IHistogram2D allPlot = (IHistogram2D) tree.find(allPrefix + plotNames2D[i]);
+			IHistogram2D møllerPlot = (IHistogram2D) tree.find(møllerPrefix + plotNames2D[i]);
+			IHistogram2D tridentPlot = (IHistogram2D) tree.find(tridentPrefix + plotNames2D[i]);
+			
+			// Make a formatted plot for each.
+			FormattedPlot2D allFormattedPlot = new FormattedPlot2D(allPlot, i == 0 ? true : false, xAxisNames2D[i], yAxisNames2D[i], allTypeName + displayNames2D[i]);
+			FormattedPlot2D møllerFormattedPlot = new FormattedPlot2D(møllerPlot, i == 0 ? true : false, xAxisNames2D[i], yAxisNames2D[i], møllerTypeName + displayNames2D[i]);
+			FormattedPlot2D tridentFormattedPlot = new FormattedPlot2D(tridentPlot, i == 0 ? true : false, xAxisNames2D[i], yAxisNames2D[i], tridentTypeName + displayNames2D[i]);
+			
+			// Add them to the module.
+			module.addPlot2D(allFormattedPlot);
+			module.addPlot2D(møllerFormattedPlot);
+			module.addPlot2D(tridentFormattedPlot);
+		}
+		
+		// Get the histograms for the elastic plots and add them to the module.
+		for(int i = 0; i < plotNamesElastic1D.length; i++) {
+			// Get the Møller and trident plots.
+			IHistogram1D allPlot = (IHistogram1D) tree.find(allSinglesPrefix + plotNames1D[i]);
+			IHistogram1D elasticPlot = (IHistogram1D) tree.find(elasticPrefix + plotNames1D[i]);
+			
+			// Make a formatted plot for each.
+			FormattedPlot1D allFormattedPlot = new FormattedPlot1D(allPlot, allColor, xAxisNamesElastic1D[i], yAxisNameElastic1D,
+					allSinglesTypeName + displayNamesElastic1D[i]);
+			FormattedPlot1D elasticFormattedPlot = new FormattedPlot1D(elasticPlot, elasticColor, xAxisNamesElastic1D[i], yAxisNameElastic1D,
+					elasticTypeName + displayNamesElastic1D[i]);
+			
+			// Add them to the module.
+			module.addPlot1D(allFormattedPlot);
+			module.addPlot1D(elasticFormattedPlot);
+		}
+		for(int i = 0; i < plotNamesElastic2D.length; i++) {
+			// Get the Møller and trident plots.
+			IHistogram2D allPlot = (IHistogram2D) tree.find(allPrefix + plotNamesElastic2D[i]);
+			IHistogram2D elasticPlot = (IHistogram2D) tree.find(møllerPrefix + plotNamesElastic2D[i]);
+			
+			// Make a formatted plot for each.
+			FormattedPlot2D allFormattedPlot = new FormattedPlot2D(allPlot, i == 0 ? true : false, xAxisNamesElastic2D[i], yAxisNamesElastic2D[i],
+					allSinglesTypeName + plotNames2D[i]);
+			FormattedPlot2D elasticFormattedPlot = new FormattedPlot2D(elasticPlot, i == 0 ? true : false, xAxisNamesElastic2D[i], yAxisNamesElastic2D[i],
+					elasticTypeName + displayNamesElastic2D[i]);
+			
+			// Add them to the module.
+			module.addPlot2D(allFormattedPlot);
+			module.addPlot2D(elasticFormattedPlot);
+		}
+		
+		// Add the MTE plots to the module.
+		module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Elastic Energy Distribution"), elasticColor,
+				"Momentum (GeV)", "Count", "Elastic - Momentum"));
+		module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Elastic Event Tracks"), elasticColor,
+				"Tracks", "Count", "Elastic - Tracks in Event"));
+		
+		module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Møller Energy Sum Distribution"), møllerColor,
+				"Momentum Sum (GeV)", "Count", "Møller - Momentum Sum"));
+		module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Møller Electron Energy Distribution"), møllerColor,
+				"Momentum (GeV)", "Count", "Møller - Momentum (Electron)"));
+		module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Møller Time Coincidence Distribution (All Møller Cuts)"), møllerColor,
+				"Time (ns)", "Count", "Møller - Time Coincidence"));
+		module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Møller Event Tracks"), møllerColor,
+				"Tracks", "Count", "Møller - Tracks in Event"));
+		module.addPlot2D(new FormattedPlot2D((IHistogram2D) tree.find("MTE Analysis/Møller 2D Energy Distribution"), false,
+				"First Track Momentum (GeV)", "Second Track Momentum (GeV)", "Møller - 2D Momentum Sum"));
+		
+		module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Trident Energy Sum Distribution"), tridentColor,
+				"Momentum Sum (GeV)", "Count", "Trident - Momentum Sum"));
+		module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Trident Electron Energy Distribution"), tridentColor,
+				"Momentum (GeV)", "Count", "Trident - Momentum (Electron)"));
+		module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Trident Positron Energy Distribution"), tridentColor,
+				"Momentum (GeV)", "Count", "Trident - Momentum (Positron)"));
+		module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Trident Event Tracks"), tridentColor,
+				"Tracks", "Count", "Trident - Tracks in Event"));
+		module.addPlot2D(new FormattedPlot2D((IHistogram2D) tree.find("MTE Analysis/Trident 2D Energy Distribution"), false,
+				"First Track Momentum (GeV)", "Second Track Momentum (GeV)", "Trident - 2D Momentum Sum"));
+		
+		// Display the plots.
+		module.savePlots("C:\\Users\\Kyle\\Desktop\\EnergyShift\\TestPrint\\");
+	}
+}

Added: java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/ParticleMCAnalysisPlotsFormatter.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/ParticleMCAnalysisPlotsFormatter.java	(added)
+++ java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/ParticleMCAnalysisPlotsFormatter.java	Tue Sep 22 12:11:46 2015
@@ -0,0 +1,55 @@
+package org.hps.users.kmccarty.plots.formatter;
+
+import java.io.IOException;
+
+import hep.aida.IAnalysisFactory;
+import hep.aida.IHistogram1D;
+import hep.aida.IHistogram2D;
+import hep.aida.ITree;
+
+import org.hps.users.kmccarty.plots.FormattedPlot1D;
+import org.hps.users.kmccarty.plots.FormattedPlot2D;
+import org.hps.users.kmccarty.plots.PlotFormatModule;
+import org.hps.users.kmccarty.plots.PlotsFormatter.ColorStyle;
+
+public class ParticleMCAnalysisPlotsFormatter {
+	public static void main(String[] args) throws IllegalArgumentException, IOException {
+		// Define the root directory for the plots.
+		String rootDir = "D:\\cygwin64\\home\\Kyle\\";
+		
+		// Define the new name of the file containing the trigger plots.
+		String plotFile = rootDir + "moller-mc-out_triggerPlots.aida";
+		
+		// Get the plots file and open it.
+		IAnalysisFactory af = IAnalysisFactory.create();
+		ITree tree = af.createTreeFactory().create(plotFile);
+		if(tree == null) { throw new IllegalArgumentException("Unable to load plot file."); }
+		
+		// Create a plot formatting module.
+		PlotFormatModule module = new PlotFormatModule();
+		
+		// Define the plot color.
+		ColorStyle plotColor = ColorStyle.MS_BLUE;
+		
+		// Define the plots to be read.
+		module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MC Analysis/Electron Energy Distribution"),
+				plotColor, "Electron Energy (GeV)", "Count", "Electron Energy Distribution"));
+		module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MC Analysis/Electron\\Electron Momentum Sum Distribution"),
+				plotColor, "Momentum Sum (GeV)", "Count", "Momentum Sum Distribution"));
+		module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MC Analysis/Electron\\Electron Pair Angle Distribution"),
+				plotColor, "Momentum Sum (GeV)", "Count", "Pair Angle Distribution"));
+		module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MC Analysis/Particle x-Momentum Distribution"),
+				plotColor, "Momentum (GeV)", "Count", "Particle x-Momentum Distribution"));
+		module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MC Analysis/Particle y-Momentum Distribution"),
+				plotColor, "Momentum (GeV)", "Count", "Particle y-Momentum Distribution"));
+		module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MC Analysis/Particle z-Momentum Distribution"),
+				plotColor, "Momentum (GeV)", "Count", "Particle z-Momentum Distribution"));
+		module.addPlot2D(new FormattedPlot2D((IHistogram2D) tree.find("MC Analysis/Electron\\Electron 2D Momentum Distribution"),
+				true, "Particle 1 Momentum (GeV)", "Particle 2 Momentum (GeV)", "2D Momentum Sum Distribution"));
+		module.addPlot2D(new FormattedPlot2D((IHistogram2D) tree.find("MC Analysis/Particle Momentum Distribution"),
+				true, "px (GeV)", "py (GeV)", "Particle x/y Momentum Distribution"));
+		
+		// Display the plots.
+		module.displayPlots();
+	}
+}

Added: java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/SingleTriggerPlotsFormatter.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/SingleTriggerPlotsFormatter.java	(added)
+++ java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/SingleTriggerPlotsFormatter.java	Tue Sep 22 12:11:46 2015
@@ -0,0 +1,163 @@
+package org.hps.users.kmccarty.plots.formatter;
+
+import java.io.IOException;
+
+import org.hps.users.kmccarty.plots.FormattedPlot1D;
+import org.hps.users.kmccarty.plots.FormattedPlot2D;
+import org.hps.users.kmccarty.plots.PlotFormatModule;
+import org.hps.users.kmccarty.plots.PlotsFormatter;
+
+import hep.aida.IAnalysisFactory;
+import hep.aida.IHistogram1D;
+import hep.aida.IHistogram2D;
+import hep.aida.ITree;
+
+public class SingleTriggerPlotsFormatter {
+	
+	public static void main(String[] args) throws IllegalArgumentException, IOException {
+		// Define the root directory for the plots.
+		String rootDir = "D:\\cygwin64\\home\\Kyle\\";
+		
+		// Define the new name of the file containing the trigger plots.
+		String plotFile = rootDir + "trident-readout-full.aida";
+		
+		// Get the plots file and open it.
+		IAnalysisFactory af = IAnalysisFactory.create();
+		ITree tree = af.createTreeFactory().create(plotFile);
+		if(tree == null) { throw new IllegalArgumentException("Unable to load plot file."); }
+		
+		// Define plots variables.
+		int UNCUT     = 0;
+		int TRIGGERED = 1;
+		String[] plotsDir = { "NoCuts/", "PassedAll/" };
+		int PLOT_HIT_COUNT      = 0;
+		int PLOT_SEED_ENERGY    = 1;
+		int PLOT_CLUSTER_ENERGY = 2;
+		int PLOT_COPLANARITY    = 3;
+		int PLOT_ENERGY_SUM     = 4;
+		int PLOT_ENERGY_DIFF    = 5;
+		int PLOT_ENERGY_SLOPE   = 6;
+		int PLOT_SEED_DIST      = 0;
+		int PLOT_ENERGY_SUM_2D  = 1;
+		
+		// Define the internal plot names.
+		String[] plotNameInternal1D = new String[7];
+		String[] plotNameInternal2D = new String[2];
+		plotNameInternal1D[PLOT_HIT_COUNT]      = "Cluster Hit Count";
+		plotNameInternal1D[PLOT_SEED_ENERGY]    = "Cluster Seed Energy";
+		plotNameInternal1D[PLOT_CLUSTER_ENERGY] = "Cluster Total Energy";
+		plotNameInternal1D[PLOT_COPLANARITY]    = "Pair Coplanarity";
+		plotNameInternal1D[PLOT_ENERGY_SUM]     = "Pair Energy Sum";
+		plotNameInternal1D[PLOT_ENERGY_DIFF]    = "Pair Energy Difference";
+		plotNameInternal1D[PLOT_ENERGY_SLOPE]   = "Pair Energy Slope";
+		plotNameInternal2D[PLOT_SEED_DIST]      = "Cluster Seed";
+		plotNameInternal2D[PLOT_ENERGY_SUM_2D]  = "Pair Energy Sum 2D";
+		
+		// Define the plot display names.
+		String[] plotName1D = new String[7];
+		String[] plotName2D = new String[2];
+		for(int j = 0; j < plotNameInternal1D.length; j++) {
+			plotName1D[j] = plotNameInternal1D[j];
+		}
+		for(int j = 0; j < plotNameInternal2D.length; j++) {
+			plotName2D[j] = plotNameInternal2D[j];
+		}
+		plotName1D[PLOT_ENERGY_SUM]    = "1D Pair Energy Sum";
+		plotName2D[PLOT_SEED_DIST]     = "Cluster Seed Distribution";
+		plotName2D[PLOT_ENERGY_SUM_2D] = "2D Pair Energy Sum";
+		
+		String[] xTitles1D = new String[plotName1D.length];
+		String[] xTitles2D = new String[plotName2D.length];
+		xTitles1D[PLOT_HIT_COUNT]      = "Hit Count";
+		xTitles1D[PLOT_SEED_ENERGY]    = "Seed Energy (GeV)";
+		xTitles1D[PLOT_CLUSTER_ENERGY] = "Cluster Energy (GeV)";
+		xTitles1D[PLOT_COPLANARITY]    = "Coplanarity Angle (Degrees)";
+		xTitles1D[PLOT_ENERGY_SUM]     = "Energy Sum (GeV)";
+		xTitles1D[PLOT_ENERGY_DIFF]    = "Energy Difference (GeV)";
+		xTitles1D[PLOT_ENERGY_SLOPE]   = "Energy Slope (GeV)";
+		xTitles2D[PLOT_SEED_DIST]      = "x-Index";
+		xTitles2D[PLOT_ENERGY_SUM_2D]  = "First Cluster Energy (GeV)";
+		String yTitle1D = "Count";
+		String[] yTitles2D = new String[plotName2D.length];
+		yTitles2D[PLOT_SEED_DIST]      = "y-Index";
+		yTitles2D[PLOT_ENERGY_SUM_2D]  = "Second Cluster Energy (GeV)";
+		
+		// Define axis ranges.
+		double[] axisRanges1D = new double[plotName1D.length];
+		axisRanges1D[PLOT_HIT_COUNT]      = -1;
+		axisRanges1D[PLOT_SEED_ENERGY]    = 1.1;
+		axisRanges1D[PLOT_CLUSTER_ENERGY] = 1.1;
+		axisRanges1D[PLOT_COPLANARITY]    = 180;
+		axisRanges1D[PLOT_ENERGY_SUM]     = 2.2;
+		axisRanges1D[PLOT_ENERGY_DIFF]    = 1.1;
+		axisRanges1D[PLOT_ENERGY_SLOPE]   = 2.4;
+		double[] xAxisRanges2D = new double[plotName2D.length];
+		double[] yAxisRanges2D = new double[plotName2D.length];
+		xAxisRanges2D[PLOT_SEED_DIST]      = -1;
+		xAxisRanges2D[PLOT_ENERGY_SUM_2D]  = 1.1;
+		yAxisRanges2D[PLOT_SEED_DIST]      = -1;
+		yAxisRanges2D[PLOT_ENERGY_SUM_2D]  = 1.1;
+		
+		// Define the plot names.
+		String[][] plotLocations1D = new String[plotsDir.length][plotNameInternal1D.length];
+		String[][] plotLocations2D = new String[plotsDir.length][plotNameInternal2D.length];
+		for(int i = 0; i < plotsDir.length; i++) {
+			for(int j = 0; j < plotNameInternal1D.length; j++) {
+				plotLocations1D[i][j] = plotsDir[i] + plotNameInternal1D[j];
+			}
+		}
+		for(int i = 0; i < plotsDir.length; i++) {
+			for(int j = 0; j < plotNameInternal2D.length; j++) {
+				plotLocations2D[i][j] = plotsDir[i] + plotNameInternal2D[j];
+			}
+		}
+		
+		// Create a plot formatting module.
+		PlotFormatModule module = new PlotFormatModule();
+		
+		// Load the plot objects.
+		for(int i = 0; i < plotName1D.length; i++) {
+			// Get the uncut and triggered plots.
+			IHistogram1D uncutPlot = (IHistogram1D) tree.find(plotLocations1D[UNCUT][i]);
+			IHistogram1D triggeredPlot = (IHistogram1D) tree.find(plotLocations1D[TRIGGERED][i] + " (Passed All Cuts)");
+			
+			// Make a formatted plot for each.
+			FormattedPlot1D uncutFormattedPlot;
+			FormattedPlot1D triggeredFormattedPlot;
+			if(axisRanges1D[i] != -1) {
+				uncutFormattedPlot = new FormattedPlot1D(uncutPlot, PlotsFormatter.ColorStyle.GREY, xTitles1D[i], yTitle1D, plotName1D[i] + " (No Cuts)", axisRanges1D[i]);
+				triggeredFormattedPlot = new FormattedPlot1D(triggeredPlot, PlotsFormatter.ColorStyle.MS_GREEN, xTitles1D[i], yTitle1D, plotName1D[i] + " (Triggered)", axisRanges1D[i]);
+			} else {
+				uncutFormattedPlot = new FormattedPlot1D(uncutPlot, PlotsFormatter.ColorStyle.GREY, xTitles1D[i], yTitle1D, plotName1D[i] + " (No Cuts)");
+				triggeredFormattedPlot = new FormattedPlot1D(triggeredPlot, PlotsFormatter.ColorStyle.MS_GREEN, xTitles1D[i], yTitle1D, plotName1D[i] + " (Triggered)");
+			}
+			
+			// Add the plots to the module.
+			module.addPlot1D(uncutFormattedPlot);
+			module.addPlot1D(triggeredFormattedPlot);
+		}
+		for(int i = 0; i < plotName2D.length; i++) {
+			// Get the uncut and triggered plots.
+			IHistogram2D uncutPlot = (IHistogram2D) tree.find(plotLocations2D[UNCUT][i]);
+			IHistogram2D triggeredPlot = (IHistogram2D) tree.find(plotLocations2D[TRIGGERED][i] + " (Passed All Cuts)");
+			
+			// Make a formatted plot for each.
+			FormattedPlot2D uncutFormattedPlot;
+			FormattedPlot2D triggeredFormattedPlot;
+			if(xAxisRanges2D[i] != -1) {
+				uncutFormattedPlot = new FormattedPlot2D(uncutPlot, true, xTitles2D[i], yTitles2D[i], plotName2D[i] + " (No Cuts)", xAxisRanges2D[i], yAxisRanges2D[i]);
+				triggeredFormattedPlot = new FormattedPlot2D(triggeredPlot, true, xTitles2D[i], yTitles2D[i], plotName2D[i] + " (Triggered)", xAxisRanges2D[i], yAxisRanges2D[i]);
+			} else {
+				uncutFormattedPlot = new FormattedPlot2D(uncutPlot, true, xTitles2D[i], yTitles2D[i], plotName2D[i] + " (No Cuts)");
+				triggeredFormattedPlot = new FormattedPlot2D(triggeredPlot, true, xTitles2D[i], yTitles2D[i], plotName2D[i] + " (Triggered)");
+			}
+			
+			// Add the plots to the module.
+			module.addPlot2D(uncutFormattedPlot);
+			module.addPlot2D(triggeredFormattedPlot);
+		}
+		
+		// Save the plots.
+		module.savePlots("C:\\Users\\Kyle\\Desktop\\EnergyShift\\MonteCarlo\\Trident\\Trigger\\");
+	}
+}

Added: java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/TridentTrackFormatter.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/TridentTrackFormatter.java	(added)
+++ java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/TridentTrackFormatter.java	Tue Sep 22 12:11:46 2015
@@ -0,0 +1,202 @@
+package org.hps.users.kmccarty.plots.formatter;
+
+import java.io.IOException;
+
+import org.hps.users.kmccarty.plots.PlotsFormatter;
+import org.hps.users.kmccarty.plots.PlotsFormatter.ColorStyle;
+import org.lcsim.util.aida.AIDA;
+
+import hep.aida.IAnalysisFactory;
+import hep.aida.IHistogram;
+import hep.aida.IHistogram1D;
+import hep.aida.IHistogram2D;
+import hep.aida.IPlotter;
+import hep.aida.IPlotterFactory;
+import hep.aida.ITree;
+import hep.aida.ref.plotter.PlotterRegion;
+
+public class TridentTrackFormatter {
+	/**
+	 * Loads all plots in a file and formats them according to the
+	 * indicated style.
+	 * @param args - Unused default executable parameter.
+	 * @throws IOException Occurs if there is an issue opening the file.
+	 */
+	public static void main(String[] args) throws IOException {
+		// Define the root directory for the plots.
+		String rootDir = "D:\\cygwin64\\home\\Kyle\\tmp\\";
+		
+		// Define the new name of the file containing the trigger plots.
+		String plotFile = rootDir + "trident-out.aida";
+		
+		// Get the plots file and open it.
+		IAnalysisFactory af = IAnalysisFactory.create();
+		ITree tree = af.createTreeFactory().create(plotFile);
+		if(tree == null) { throw new IllegalArgumentException("Unable to load plot file."); }
+		
+		// Declare the histogram names.
+		String trackName = "Tracks in Event (All)";
+		String posTrackName = "Tracks in Event (Positive)";
+		String negTrackName = "Tracks in Event (Negative)";
+		String posMomentumName = "Momentum (Positive)";
+		String negMomentumName = "Momentum (Negative)";
+		String energySumName = "Energy Sum";
+		String momentumSumName = "Momentum Sum";
+		String energyMomentumDiffName = "Energy-Momentum Difference";
+		String invariantMassName = "Invariant Mass";
+		String energySum2DName = "2D Energy Sum";
+		String momentumSum2DName = "2D Momentum Sum";
+		String positionName = "Track Cluster Position";
+		
+		// Get the histograms.
+		IHistogram1D[] tracks = {
+				(IHistogram1D) tree.find("Trident Analysis/All/" + trackName),
+				(IHistogram1D) tree.find("Trident Analysis/Cluster/" + trackName)
+		};
+		IHistogram1D[] posTracks = {
+				(IHistogram1D) tree.find("Trident Analysis/All/" + posTrackName),
+				(IHistogram1D) tree.find("Trident Analysis/Cluster/" + posTrackName)
+		};
+		IHistogram1D[] negTracks = {
+				(IHistogram1D) tree.find("Trident Analysis/All/" + negTrackName),
+				(IHistogram1D) tree.find("Trident Analysis/Cluster/" + negTrackName)
+		};
+		IHistogram1D[] posMomentum = {
+				(IHistogram1D) tree.find("Trident Analysis/All/" + posMomentumName),
+				(IHistogram1D) tree.find("Trident Analysis/Cluster/" + posMomentumName)
+		};
+		IHistogram1D[] negMomentum = {
+				(IHistogram1D) tree.find("Trident Analysis/All/" + negMomentumName),
+				(IHistogram1D) tree.find("Trident Analysis/Cluster/" + negMomentumName)
+		};
+		IHistogram1D[] energySum = {
+				(IHistogram1D) tree.find("Trident Analysis/All/" + energySumName),
+				(IHistogram1D) tree.find("Trident Analysis/Cluster/" + energySumName)
+		};
+		IHistogram1D[] momentumSum = {
+				(IHistogram1D) tree.find("Trident Analysis/All/" + momentumSumName),
+				(IHistogram1D) tree.find("Trident Analysis/Cluster/" + momentumSumName)
+		};
+		IHistogram1D[] energyMomentumDiff = {
+				(IHistogram1D) tree.find("Trident Analysis/All/" + energyMomentumDiffName),
+				(IHistogram1D) tree.find("Trident Analysis/Cluster/" + energyMomentumDiffName)
+		};
+		IHistogram1D[] invariantMass = {
+				(IHistogram1D) tree.find("Trident Analysis/All/" + invariantMassName),
+				(IHistogram1D) tree.find("Trident Analysis/Cluster/" + invariantMassName)
+		};
+		IHistogram2D[] energySum2D = {
+				(IHistogram2D) tree.find("Trident Analysis/All/" + energySum2DName),
+				(IHistogram2D) tree.find("Trident Analysis/Cluster/" + energySum2DName)
+		};
+		IHistogram2D[] momentumSum2D = {
+				(IHistogram2D) tree.find("Trident Analysis/All/" + momentumSum2DName),
+				(IHistogram2D) tree.find("Trident Analysis/Cluster/" + momentumSum2DName)
+		};
+		IHistogram2D[] position = {
+				(IHistogram2D) tree.find("Trident Analysis/All/" + positionName),
+				(IHistogram2D) tree.find("Trident Analysis/Cluster/" + positionName)
+		};
+		
+		// Re-bin the histograms to have 5-times larger bins. First,
+		// get the bin count and upper and lower bounds of the plot.
+		int bins = invariantMass[0].axis().bins();
+		double low = invariantMass[0].axis().binLowerEdge(0);
+		double high = invariantMass[0].axis().binUpperEdge(invariantMass[0].axis().bins() - 1);
+		
+		// Create new plots with the larger bin sizes.
+		AIDA aida = AIDA.defaultInstance();
+		IHistogram1D[] newPlot = new IHistogram1D[2];
+		newPlot[0] = aida.histogram1D(invariantMassName, bins / 5, low, high);
+		newPlot[1] = aida.histogram1D("Cluster " + invariantMassName, bins / 5, low, high);
+		
+		// Populate the new plots with the data from the old ones.
+		for(int j = 0; j < 2; j++) {
+			for(int i = 0; i < bins; i++) {
+				int entries = invariantMass[j].binEntries(i);
+				double center = invariantMass[j].axis().binCenter(i);
+				for(int k = 0; k < entries; k++) {
+					newPlot[j].fill(center);
+				}
+			}
+		}
+		
+		// Replace the old plots.
+		invariantMass = newPlot;
+		
+		// Define the scaling factors for each plot.
+		double scaleFactor = 1;
+		
+		// Define the plot titles and arrays for 1D plots.
+		IHistogram[][] plots = { tracks, posTracks, negTracks, posMomentum, negMomentum, energySum, momentumSum, energyMomentumDiff, invariantMass };
+		String[] titles = { trackName, posTrackName, negTrackName, posMomentumName, negMomentumName, energySumName, momentumSumName,
+				energyMomentumDiffName, invariantMassName };
+		String[] xTitles = { "Tracks", "Tracks", "Tracks", "Momentum (GeV)", "Momentum (GeV)", "Energy Sum (GeV)", "Momentum Sum (GeV)",
+				"|E_Cluster - P_Track| (GeV)", "Invariant Mass (GeV)" };
+		String yTitle = "Count";
+		
+		// Define the plot titles and arrays for 2D plots.
+		IHistogram2D[][] plots2D = { energySum2D, momentumSum2D, position };
+		String[] titles2D = { energySum2DName, momentumSum2DName, positionName };
+		String[] xTitles2D = { "Positive Cluster Energy", "Positive Track Momentum", "x-Index" };
+		String[] yTitles2D = { "Negative Cluster Energy", "Negative Track Momentum", "y-Index" };
+		String zTitle2D = "Count";
+		
+		// Create a plotter factory.
+		IPlotterFactory plotterFactory = af.createPlotterFactory();
+		
+		// Format and display the basic histograms.
+		for(int i = 0; i < plots.length; i++) {
+			for(int j = 0; j < 2; j++) {
+				// Scale the histogram by the appropriate scaling factor.
+				plots[i][j].scale(1.0 / scaleFactor);
+				
+				// Create a plotter and plotting region for the plot.
+				IPlotter plotter = plotterFactory.create((j == 1 ? "Cluster " : "") + titles[i]);
+				plotter.createRegions(1);
+				plotter.region(0).plot(plots[i][j]);
+				
+				// Format the axis labels.
+				PlotterRegion region = (PlotterRegion) plotter.region(0);
+				region.getPlot().setTitle((j == 1 ? "Cluster " : "") + titles[i]);
+				region.getPlot().getXAxis().setLabel(xTitles[i]);
+				region.getPlot().getYAxis().setLabel(yTitle);
+				
+				// Format the fonts and general plot presentation.
+				PlotsFormatter.setDefault1DStyle(region, new ColorStyle[] { ColorStyle.GREY });
+				
+				// Show the plot.
+				plotter.setParameter("plotterWidth", "2000");
+				plotter.setParameter("plotterHeight", "1200");
+				plotter.show();
+			}
+		}
+		
+		// Format and display the 2D histogram.
+		for(int i = 0; i < plots2D.length; i++) {
+			for(int j = 0; j < 2; j++) {
+				plots2D[i][j].scale(1.0 / scaleFactor);
+				IPlotter plotter2D = plotterFactory.create((j == 1 ? "Cluster " : "") + titles2D[i]);
+				plotter2D.createRegions(1);
+				plotter2D.region(0).plot(plots2D[i][j]);
+				
+				// Format the axis labels.
+				PlotterRegion region2D = (PlotterRegion) plotter2D.region(0);
+				region2D.getPlot().setTitle((j == 1 ? "Cluster " : "") + titles2D[i]);
+				region2D.getPlot().getXAxis().setLabel(xTitles2D[i]);
+				region2D.getPlot().getYAxis().setLabel(yTitles2D[i]);
+				
+				// Format the fonts and general plot presentation.
+				PlotsFormatter.setDefault2DStyle(region2D, true);
+				
+				// Show the plot.
+				plotter2D.setParameter("plotterWidth", "2000");
+				plotter2D.setParameter("plotterHeight", "1200");
+				plotter2D.show();
+			}
+		}
+		
+		// Close the tree.
+		tree.close();
+	}
+}

Added: java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/TriggerPlotsFormat.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/TriggerPlotsFormat.java	(added)
+++ java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/TriggerPlotsFormat.java	Tue Sep 22 12:11:46 2015
@@ -0,0 +1,345 @@
+package org.hps.users.kmccarty.plots.formatter;
+
+import jas.hist.JASHist1DHistogramStyle;
+import jas.hist.JASHist2DHistogramStyle;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import hep.aida.IAnalysisFactory;
+import hep.aida.IBaseHistogram;
+import hep.aida.IHistogram1D;
+import hep.aida.IHistogram2D;
+import hep.aida.IManagedObject;
+import hep.aida.IPlotter;
+import hep.aida.IPlotterFactory;
+import hep.aida.ITree;
+import hep.aida.ref.plotter.PlotterRegion;
+
+public class TriggerPlotsFormat {
+	// Define plot fonts.
+	private static final Font BASIC_FONT = new Font("Calibri", Font.PLAIN, 20);
+	private static final Font AXIS_FONT  = new Font("Calibri", Font.BOLD,  25);
+	private static final Font TITLE_FONT = new Font("Calibri", Font.BOLD,  35);
+	
+	// Defines the color style options for plot data.
+	private enum ColorStyle {
+		 MS_BLUE(new Color( 79, 129, 189), new Color( 36,  64,  97)), MS_ORANGE(new Color(247, 150,  70), new Color(152,  72,   6)),
+		  MS_RED(new Color(192,  80,  77), new Color( 99,  36,  35)),      GREY(new Color(166, 166, 166), new Color( 89,  89,  89)),
+		MS_GREEN(new Color(155, 187,  89), new Color( 79,  98,  40)),   CRIMSON(new Color(161,   0,   0), new Color(104,   0,   0)),
+		    RUST(new Color(161,  80,   0), new Color(105,  80,   0)),    YELLOW(new Color(161, 161,   0), new Color(122, 109,   8)),
+		  FOREST(new Color( 65, 102,   0), new Color( 37,  79,   0)),     GREEN(new Color(  7, 132,  70), new Color(  7,  82,  30)),
+		    TEAL(new Color(  0, 130, 130), new Color(  0,  90, 100)),  CERULEAN(new Color(  0,  86, 130), new Color(  0,  28,  83)),
+		    BLUE(new Color(  0,  33, 203), new Color(  0,   0, 137)),    INDIGO(new Color( 68,  10, 127), new Color(  0,   0,  61)),
+		  PURPLE(new Color(106,   0, 106), new Color( 63,   0,  56)),   FUSCHIA(new Color(119,   0,  60), new Color( 60,   0,  60));
+		
+		private final Color fillColor;
+		private final Color lineColor;
+		
+		private ColorStyle(Color fillColor, Color lineColor) {
+			this.fillColor = fillColor;
+			this.lineColor = lineColor;
+		}
+		
+		public Color getFillColor() { return fillColor; }
+		
+		public Color getLineColor() { return lineColor; }
+	};
+		
+	/**
+	 * Loads all plots in a file and formats them according to the
+	 * indicated style.
+	 * @param args - Unused default executable parameter.
+	 * @throws IOException Occurs if there is an issue opening the file.
+	 */
+	public static void main(String[] args) throws IOException {
+		// Define the root directory for the plots.
+		String rootDir = "D:\\cygwin64\\home\\Kyle\\"; //plots\\no-cuts\\2-hit\\";
+		
+		// Define the new name of the file containing the trigger plots.
+		String[] plotFile = {
+				rootDir + "5568-ana.aida"
+				//rootDir + "background-ana_triggerPlots.aida"
+				//rootDir + "15MeV-ana_triggerPlots.aida",
+				//rootDir + "30MeV-ana_triggerPlots.aida",
+				//rootDir + "40MeV-ana_triggerPlots.aida",
+				//rootDir + "50MeV-ana_triggerPlots.aida"
+		};
+		
+		// Define the names of each plot. This will be used for the
+		// legend in the case of multiple plots.
+		String[] treeName = {
+			"Background",
+			"15 MeV A'",
+			"30 MeV A'",
+			"40 MeV A'",
+			"50 MeV A'"
+		};
+		
+		// Define the color style for the plots.
+		ColorStyle[] dataColorStyle = {
+				ColorStyle.GREY,
+				ColorStyle.MS_GREEN,
+				ColorStyle.MS_BLUE,
+				ColorStyle.MS_ORANGE,
+				ColorStyle.MS_RED
+		};
+		
+		// Get the plots file and open it.
+		IAnalysisFactory af = IAnalysisFactory.create();
+		ITree[] tree = new ITree[plotFile.length];
+		for(int i = 0; i < plotFile.length; i++) {
+			tree[i] = af.createTreeFactory().create(plotFile[i]);
+			if(tree[i] == null) { throw new IllegalArgumentException("Unable to load plot file."); }
+		}
+		
+		// Get a list of all the histograms in the file.
+		List<List<String>> treeHistograms = new ArrayList<List<String>>(plotFile.length);
+		for(int i = 0; i < plotFile.length; i++) {
+			treeHistograms.add(getHistograms(tree[i]));//, "/PassedAll/"));
+		}
+		
+		// Create a plotter factory.
+		IPlotterFactory plotterFactory = af.createPlotterFactory();
+		
+		// Plot each histogram and format it.
+		for(String histogram : treeHistograms.get(0)) {
+			// Get the plot from the tree and verify that it is a 1D
+			// or 2D histogram. Other types are not supported.
+			IManagedObject histObject = tree[0].find(histogram);
+			if(!(histObject instanceof IHistogram1D) && !(histObject instanceof IHistogram2D)) {
+				continue;
+			}
+			
+			// Obtain the histogram object.
+			IBaseHistogram hist;
+			if(histObject instanceof IHistogram1D) { hist = (IHistogram1D) histObject; }
+			else { hist = (IHistogram2D) histObject; }
+			
+			// Define whether this is an overlay plot and whether
+			// this is a one or two dimensional plot.
+			boolean overlay = plotFile.length > 1;
+			boolean twoDimensional = hist instanceof IHistogram2D;
+			
+			// Generate the plotter and set its title. The plotter will
+			// use the title of the first tree's plot.
+			String plotTitle = hist.title();
+			IPlotter plotter = plotterFactory.create(plotTitle);
+			
+			// For single plots and one-dimensional overlay plots,
+			// there should only be a single plotter region.
+			if(!twoDimensional || !overlay) { plotter.createRegions(1); }
+			
+			// For two-dimensional overlay plots, create a region for
+			// each plot individually.
+			else { plotter.createRegions(2, (int) Math.ceil(plotFile.length / 2.0)); }
+			
+			// Find the histogram in each of the trees and plot them
+			// all on the same region.
+			for(int i = 0; i < plotFile.length; i++) {
+				// Get the histogram from the tree.
+				IManagedObject treeObject = tree[i].find(histogram);
+				IBaseHistogram treeHist;
+				if(treeObject instanceof IHistogram1D) { treeHist = (IHistogram1D) treeObject; }
+				else { treeHist = (IHistogram2D) treeObject; }
+				
+				// Display the plot.
+				if(treeHist != null) {
+					// Set the title of plot to the name associated with
+					// its tree. This ensures that the correct name will
+					// appear on the legend.
+					if(plotFile.length > 1) {
+						treeHist.setTitle(treeName[i]);
+					}
+					
+					// Plot the tree's data in the plotter region.
+					if(!twoDimensional || !overlay) { plotter.region(0).plot(treeHist); }
+					else {
+						plotter.region(i).plot(treeHist);
+						setDefault2DStyle(((PlotterRegion) plotter.region(i)), dataColorStyle);
+					}
+				}
+			}
+			
+			// Format the plot region.
+			if(!twoDimensional) { setDefault1DStyle(((PlotterRegion) plotter.region(0)), dataColorStyle); }
+			else { setDefault2DStyle(((PlotterRegion) plotter.region(0)), dataColorStyle); }
+			
+			// Show the plotter.
+			plotter.region(0).setTitle(plotTitle);
+			//plotter.setParameter("plotterWidth", "1600");
+			//plotter.setParameter("plotterHeight", "1550");
+			plotter.setParameter("plotterWidth", "2000");
+			plotter.setParameter("plotterHeight", "1200");
+			plotter.show();
+		}
+		
+		// Close the trees.
+		for(int i = 0; i < plotFile.length; i++) {
+			tree[i].close();
+		}
+	}
+	
+	/**
+	 * Sets the plot display formatting for 1D plots.
+	 * @param region - The plotter region to format.
+	 * @param color - The data color settings to use.
+	 */
+	private static final void setDefault1DStyle(PlotterRegion region, ColorStyle[] color) {
+		// Get the names of each plot on in the region.
+		String[] dataNames = region.getAllDataNames();
+		
+		// Check whether this is an overlay plot. Overlay plots contain
+		// more than one data name.
+		boolean overlay = (dataNames.length > 1 ? true : false);
+		
+		// Iterate over each plot in the region.
+		for(int i = 0; i < dataNames.length; i++) {
+			// Set the overlay style if needed.
+			if(overlay) {
+				// Get the fill style for the current data type.
+				JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle();
+				
+				// Set the histogram style to display thick-lined bars
+				// with no fill. The color is set by the "color" argument.
+				fillStyle.setHistogramFill(false);
+				fillStyle.setHistogramBarLineWidth(3);
+				fillStyle.setHistogramBarLineColor(color[i].getFillColor());
+				
+				// Set the legend text style.
+				region.getPlot().getLegend().setFont(new Font("Calibri", Font.PLAIN, 20));
+			}
+			
+			// Otherwise, set the fill style for a single plot.
+			else {
+				// Get the fill style for the current data type.
+				JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle();
+				
+				// Set the histogram style to display thick-lined bars
+				// with a fill color. The colors are defined by the
+				// "color" argument.
+				fillStyle.setHistogramBarLineWidth(3);
+				fillStyle.setHistogramBarColor(color[i].getFillColor());
+				fillStyle.setHistogramBarLineColor(color[i].getLineColor());
+			}
+			
+			// Set the statistics box style.
+			region.getPlot().getStats().setVisible(true);
+			region.getPlot().getStats().setFont(BASIC_FONT);
+			
+			// Set the title font.
+			region.getPlot().getTitleObject().setFont(TITLE_FONT);
+			
+			// Set generic axis titles.
+			region.getPlot().getXAxis().setLabel("Data Label (Unit)");
+			region.getPlot().getYAxis().setLabel("Count");
+			
+			// Set the axis tick-mark fonts.
+			region.getPlot().getXAxis().setFont(BASIC_FONT);
+			region.getPlot().getYAxis().setFont(BASIC_FONT);
+			region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT);
+			region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT);
+		}
+	}
+	
+	/**
+	 * Sets the plot display formatting for 1D plots.
+	 * @param region - The plotter region to format.
+	 * @param color - The data color settings to use.
+	 */
+	private static final void setDefault2DStyle(PlotterRegion region, ColorStyle[] color) {
+		// Get the fill style object. 2D plots should never be overlay
+		// plots, so there should only ever be one data name.
+		JASHist2DHistogramStyle fillStyle = (JASHist2DHistogramStyle) region.getDataForName(region.getAllDataNames()[0]).getStyle();
+		
+		// Set the fill style for a two-dimensional plot.
+		fillStyle.setLogZ(true);
+		fillStyle.setHistStyle(JASHist2DHistogramStyle.STYLE_COLORMAP);
+		fillStyle.setColorMapScheme(JASHist2DHistogramStyle.COLORMAP_RAINBOW);
+		
+		// Make the statistics box invisible.
+		region.getPlot().getStats().setVisible(false);
+		
+		// Set the general plot font (which is also the z-axis font).
+		region.getPlot().setFont(BASIC_FONT);
+		
+		// Set the title font.
+		region.getPlot().getTitleObject().setFont(TITLE_FONT);
+		
+		// Set generic axis titles.
+		region.getPlot().getXAxis().setLabel("Data Label (Unit)");
+		region.getPlot().getYAxis().setLabel("Data Label (Unit)");
+		
+		// Set the axis tick-mark fonts.
+		region.getPlot().getXAxis().setFont(BASIC_FONT);
+		region.getPlot().getYAxis().setFont(BASIC_FONT);
+		region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT);
+		region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT);
+	}
+	
+	/**
+	 * Gets a list of all objects that are not directories in a tree.
+	 * @param tree - The tree from which to extract the object names.
+	 * @return Returns the object names as <code>String</code> objects
+	 * in a <code>List</code> collection.
+	 */
+	private static final List<String> getHistograms(ITree tree) {
+		return getHistograms(tree, "/");
+	}
+	
+	/**
+	 * Gets a list of all objects that are not directories in a tree.
+	 * @param tree - The tree from which to extract the object names.
+	 * @return Returns the object names as <code>String</code> objects
+	 * in a <code>List</code> collection.
+	 */
+	private static final List<String> getHistograms(ITree tree, String rootDir) {
+		return getHistograms(tree, rootDir, new ArrayList<String>());
+	}
+	
+	/**
+	 * Recursive method that gets all object names from a tree that
+	 * are not directories. Method should not be called directly, but
+	 * rather called only through the <code>getHistograms(ITree)</code>
+	 * method.
+	 * @param tree - The tree from which to obtain the object names.
+	 * @param directory - The directory in which to search for objects.
+	 * @param list - The list in which to place the objects.
+	 * @return Returns the <code>List</code> collection that was given
+	 * as an argument.
+	 */
+	private static final List<String> getHistograms(ITree tree, String directory, List<String> list) {
+		// Get the list of objects in the directory.
+		String[] treeObjects = tree.listObjectNames(directory);
+		
+		// Print the objects.
+		for(String objectName : treeObjects) {
+			// Check if the object is a directory.
+			boolean isDirectory = isDirectory(objectName);
+			
+			// If the object is a directory, get the histograms from it.
+			if(isDirectory) {
+				getHistograms(tree, objectName, list);
+			}
+			
+			// If the object is a plot, add it to the list.
+			else { list.add(objectName); }
+		}
+		
+		// Return the list.
+		return list;
+	}
+	
+	/**
+	 * Checks whether a tree object is a directory.
+	 * @param object - The object to check.
+	 * @return Returns <code>true</code> if the object is a directory
+	 * and <code>false</code> otherwise.
+	 */
+	private static final boolean isDirectory(String object) {
+		return (object.toCharArray()[object.length() - 1] == '/');
+	}
+}

Top of Message | Previous Page | Permalink

Advanced Options


Options

Log In

Log In

Get Password

Get Password


Search Archives

Search Archives


Subscribe or Unsubscribe

Subscribe or Unsubscribe


Archives

November 2017
August 2017
July 2017
January 2017
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
December 2013
November 2013

ATOM RSS1 RSS2



LISTSERV.SLAC.STANFORD.EDU

Secured by F-Secure Anti-Virus CataList Email List Search Powered by the LISTSERV Email List Manager

Privacy Notice, Security Notice and Terms of Use