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] == '/');
+ }
+}
|