package dr.app.tracer.traces;
import dr.app.gui.chart.*;
import dr.inference.trace.Trace;
import dr.inference.trace.TraceCorrelation;
import dr.inference.trace.TraceFactory;
import dr.inference.trace.TraceList;
import jam.framework.Exportable;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* A panel that displays frequency distributions of traces
*
* @author Andrew Rambaut
* @author Alexei Drummond
* @version $Id: FrequencyPanel.java,v 1.1.1.2 2006/04/25 23:00:09 rambaut Exp $
*/
public class FrequencyPanel extends JPanel implements Exportable {
private TraceList traceList = null;
private String traceName = null;
private class Settings {
ChartSetupDialog chartSetupDialog = null;
int minimumBins = 50;
}
private Settings currentSettings = new Settings();
private Map<String, Settings> settingsMap = new HashMap<String, Settings>();
JComboBox binsCombo = new JComboBox(
new Integer[]{10, 20, 50, 100, 200, 500, 1000});
JLabel labelBins;
private JCheckBox showValuesCheckBox = new JCheckBox("Show values on above chart");
// private JChart densityChart = new JChart(new LinearAxis(Axis.AT_MAJOR_TICK_PLUS, Axis.AT_MAJOR_TICK_PLUS), new LinearAxis());
private DiscreteJChart traceChart = new DiscreteJChart(new LinearAxis(Axis.AT_MAJOR_TICK_PLUS, Axis.AT_MAJOR_TICK_PLUS), new LinearAxis());
private JChartPanel chartPanel = new JChartPanel(traceChart, null, "", "Frequency");
/**
* Creates new FrequencyPanel
*/
public FrequencyPanel(final JFrame frame) {
setOpaque(false);
setMinimumSize(new Dimension(300, 150));
setLayout(new BorderLayout());
add(chartPanel, BorderLayout.CENTER);
JToolBar toolBar = new JToolBar();
toolBar.setOpaque(false);
toolBar.setLayout(new FlowLayout(FlowLayout.LEFT));
toolBar.setFloatable(false);
JButton chartSetupButton = new JButton("Axes...");
chartSetupButton.putClientProperty(
"Quaqua.Button.style", "placard"
);
chartSetupButton.setFont(UIManager.getFont("SmallSystemFont"));
toolBar.add(chartSetupButton);
binsCombo.setOpaque(false);
binsCombo.setFont(UIManager.getFont("SmallSystemFont"));
binsCombo.setSelectedItem(currentSettings.minimumBins);
labelBins = new JLabel("Bins:");
labelBins.setFont(UIManager.getFont("SmallSystemFont"));
labelBins.setLabelFor(binsCombo);
toolBar.add(labelBins);
toolBar.add(binsCombo);
// toolBar.add(showValuesCheckBox); //todo
showValuesCheckBox.addActionListener(
new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
validate();
repaint();
}
}
);
add(toolBar, BorderLayout.SOUTH);
chartSetupButton.addActionListener(
new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
if (currentSettings.chartSetupDialog == null) {
currentSettings.chartSetupDialog = new ChartSetupDialog(frame, true, false,
Axis.AT_MAJOR_TICK, Axis.AT_MAJOR_TICK, Axis.AT_ZERO, Axis.AT_MAJOR_TICK);
}
currentSettings.chartSetupDialog.showDialog(traceChart);
validate();
repaint();
}
}
);
binsCombo.addItemListener(
new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent ev) {
currentSettings.minimumBins = (Integer) binsCombo.getSelectedItem();
setupTrace();
}
}
);
}
public void setTrace(TraceList traceList, String traceName) {
this.traceList = traceList;
this.traceName = traceName;
Settings settings = settingsMap.get(traceName);
if (settings == null) {
settings = new Settings();
settingsMap.put(traceName, settings);
}
currentSettings = settings;
binsCombo.setSelectedItem(currentSettings.minimumBins);
setupTrace();
}
private void setupTrace() {
traceChart.removeAllPlots();
if (traceList == null || traceName == null) {
chartPanel.setXAxisTitle("");
chartPanel.setYAxisTitle("");
return;
}
FrequencyPlot plot = null;
int traceIndex = traceList.getTraceIndex(traceName);
Trace trace = traceList.getTrace(traceIndex);
TraceCorrelation td = traceList.getCorrelationStatistics(traceIndex);
if (trace != null) {
Map<Integer, String> categoryDataMap = new HashMap<Integer, String>();
List values = traceList.getValues(traceIndex);
if (trace.getTraceType() == TraceFactory.TraceType.DOUBLE) {
plot = new FrequencyPlot(values, currentSettings.minimumBins, td);
if (td != null) {
plot.setIntervals(td.getUpperHPD(), td.getLowerHPD());
}
traceChart.setXAxis(false, categoryDataMap);
chartPanel.setYAxisTitle("Frequency");
labelBins.setVisible(true);
binsCombo.setVisible(true);
showValuesCheckBox.setVisible(false);
} else if (trace.getTraceType() == TraceFactory.TraceType.INTEGER) {
plot = new FrequencyPlot(values, -1, td);
if (td != null) {
plot.setInCredibleSet(td);
}
traceChart.setXAxis(true, categoryDataMap);
chartPanel.setYAxisTitle("Count");
labelBins.setVisible(false);
binsCombo.setVisible(false);
showValuesCheckBox.setVisible(true);
} else if (trace.getTraceType() == TraceFactory.TraceType.STRING) {
List<Double> intData = new ArrayList<Double>();
for (int v = 0; v < values.size(); v++) {
int index = td.getIndex(values.get(v).toString());
intData.add(v, (double) index);
categoryDataMap.put(index, values.get(v).toString());
}
// System.out.println(trace.getName() + " " + trace.getTraceType());
// System.out.println(td.printCredibleSet() + " " + td.printInCredibleSet() + " " + td.getTraceType());
// for (Integer i : new TreeSet<Integer>(categoryDataMap.keySet())) {
// System.out.println("i = " + i + "; v = " + categoryDataMap.get(i));
// }
plot = new FrequencyPlot(intData, -1, td);
if (td != null) {
plot.setInCredibleSet(td);
}
traceChart.setXAxis(false, categoryDataMap);
chartPanel.setYAxisTitle("Count");
labelBins.setVisible(false);
binsCombo.setVisible(false);
showValuesCheckBox.setVisible(true);
} else {
throw new RuntimeException("Trace type is not recognized: " + trace.getTraceType());
}
if (currentSettings.chartSetupDialog != null) {
currentSettings.chartSetupDialog.applySettings(traceChart);
}
traceChart.addPlot(plot);
}
chartPanel.setXAxisTitle(traceList.getTraceName(traceIndex));
}
public JComponent getExportableComponent() {
return chartPanel;
}
}