package signalproc.output; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.util.Vector; import javax.swing.JTabbedPane; import javax.swing.JTree; import org.trianacode.gui.panels.ParameterPanel; import org.trianacode.gui.windows.WindowButtonConstants; import org.trianacode.taskgraph.event.ParameterUpdateEvent; import org.trianacode.taskgraph.event.TaskListener; import org.trianacode.taskgraph.event.TaskNodeEvent; import org.trianacode.taskgraph.event.TaskPropertyEvent; import hep.aida.IAnalysisFactory; import hep.aida.ICloud1D; import hep.aida.IHistogramFactory; import hep.aida.IPlotter; import hep.aida.IPlotterRegion; import jas.aida.gui.JASGUIAnalysisFactory; import triana.types.GraphType; /** * Used by Histogrammer to plot graphs on the client side. * * @author David Churches * @version $Revision $ */ public class HistogrammerPanel extends ParameterPanel implements TaskListener, ItemListener, ActionListener { private JTree jTree; private IAnalysisFactory af; private IPlotter plotter; private IPlotterRegion plotterRegion; private IHistogramFactory hf; private JTabbedPane tabs; private ICloud1D h1d; Vector dh = new Vector(); Vector histograms = new Vector(); /** * A flag indicating whether this is the first set of data or not */ private boolean first = true; /** * Creates a new HistogrammerPanel. */ public HistogrammerPanel() { super(); } /** * @return false so that the auto commit box is not shown */ public boolean isAutoCommitVisible() { return false; } /** * Overridden to return WindowButtonConstants.OK_BUTTON only. */ public byte getPreferredButtons() { return WindowButtonConstants.OK_BUTTON; } /** * Overridden to return false, suggesting that the panel prefers to be allowed to be hidden behind the main Triana * window. */ public boolean isAlwaysOnTopPreferred() { return false; } /** * Initialises the panel. */ public void init() { initPanel(); getTask().addTaskListener(this); } /** * A empty method as the graph is updated through its task listener interface. */ public void run() { } /** * A empty method as the graph is updated through its task listener interface. */ public void reset() { } /** * Disposes of the graph window and removes this panel as a task listener. */ public void dispose() { getTask().removeTaskListener(this); } private void initPanel() { setLayout(new BorderLayout()); setSize(400, 400); jTree = new JTree(new javax.swing.tree.DefaultMutableTreeNode("/")); tabs = new JTabbedPane(); add(tabs, BorderLayout.CENTER); } public void graphData(GraphType graph, int port) { double[] data, range; Component parent = this; while ((parent != null) && (!(parent instanceof Window))) { parent = parent.getParent(); } if ((parent != null) && (!parent.isVisible())) { parent.setVisible(true); } if (first) { System.out.println("first=true"); af = new JASGUIAnalysisFactory(jTree, tabs); hf = af.createHistogramFactory(af.createTreeFactory().create()); // plotter is an object of type JASGUIPlotter, which itself extends JASPlotter plotter = af.createPlotterFactory().create(graph.getTitle()); //plotterRegion is an object of type JASPlotterRegion plotterRegion = plotter.createRegion(0, 0, 1, 1); h1d = hf.createCloud1D("hist1", "Histogram"); data = (double[]) graph.getGraphArrayReal(0); dh.addElement(data); range = calculateRange(data); for (int i = 0; i < graph.getDimensionLengths(0); i++) { h1d.fill(data[i]); } histograms.addElement(h1d); plotterRegion.plot((ICloud1D) histograms.elementAt(port)); plotter.show(); first = false; } else { System.out.println("first=false"); try { dh.elementAt(port); System.out.println("retrieving dh.elementAt(" + port + ")"); dh.removeElementAt(port); data = (double[]) graph.getGraphArrayReal(0); dh.insertElementAt(data, port); ICloud1D temp = (ICloud1D) histograms.elementAt(port); temp.reset(); for (int i = 0; i < graph.getDimensionLengths(0); i++) { temp.fill(data[i]); } range = calculateRange(data); plotter.refresh(); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("no data at this point in the vector!!"); data = (double[]) graph.getGraphArrayReal(0); dh.insertElementAt(data, port); ICloud1D hist = hf.createCloud1D("hist1", "Histogram"); for (int i = 0; i < graph.getDimensionLengths(0); i++) { hist.fill(data[i]); } histograms.insertElementAt(hist, port); range = calculateRange(data); plotterRegion.plot((ICloud1D) histograms.elementAt(port)); } } } public double[] calculateRange(double[] data) { double xMin, xMax; double[] range = new double[2]; xMin = data[0]; xMax = data[0]; int index = 0; for (int count = 0; count < data.length; count++) { if (xMin > data[count]) { xMin = data[count]; } if (xMax < data[count]) { xMax = data[count]; } } range[0] = xMin - Math.abs((xMin / 10)); range[1] = xMax + Math.abs((xMax / 10)); return range; } public void actionPerformed(ActionEvent ev) { } public void itemStateChanged(ItemEvent ev) { } /** * Updates the graph when the HistogrammerData parameter is changed. */ public void parameterUpdated(ParameterUpdateEvent event) { String paramname = event.getParameterName(); if (paramname.startsWith("HistogrammerData") && (getTask().getParameter(paramname) != null)) { try { GraphType graphdata = (GraphType) getTask().getParameter(paramname); if (graphdata != null) { int port = Integer.parseInt(paramname.substring(paramname.lastIndexOf('_') + 1)); graphData(graphdata, port); } } catch (ClassCastException except) { System.out.println("HistogrammerPanel: Invalid parameter format"); } } } public void taskPropertyUpdate(TaskPropertyEvent event) { } public void nodeAdded(TaskNodeEvent event) { } public void nodeRemoved(TaskNodeEvent event) { //dh.removeElementAt(node.getNodeIndex()); //ICloud1D temp = (ICloud1D)histograms.elementAt(node.getNodeIndex()); //temp.reset(); //histograms.removeElementAt(node.getNodeIndex()); //plotter.refresh(); } class dataHolder { Vector dataSets = new Vector(); void addData(double[] data) { dataSets.addElement(data); } double[] getData(int port) { if (dataSets.elementAt(port) == null) { return null; } else { return (double[]) dataSets.elementAt(port); } } } }