package dr.app.tracer.traces;
import dr.inference.trace.TraceAnalysis;
import dr.inference.trace.TraceCorrelation;
import dr.inference.trace.TraceFactory;
import dr.inference.trace.TraceList;
import jam.framework.Exportable;
import jam.table.TableRenderer;
import javax.swing.*;
import javax.swing.plaf.BorderUIResource;
import javax.swing.table.AbstractTableModel;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
public class SummaryStatisticsPanel extends JPanel implements Exportable {
static final String NAME_ROW = "name";
static final String MEAN_ROW = "mean";
static final String MODE_ROW = "mode";
static final String STDEV_ROW = "stderr of mean";
static final String STDEV = "stdev";
static final String FREQ_MODE_ROW = "frequency of mode";
static final String VARIANCE_ROW = "variance";
// static final String STDEV_VAR_ROW = "stderr of variance";
static final String GEOMETRIC_MEAN_ROW = "geometric mean";
static final String MEDIAN_ROW = "median";
static final String LOWER_UPPER_ROW = "95% HPD Interval";
static final String CRED_SET_ROW = "95% Credible Set";
static final String INCRED_SET_ROW = "5% Incredible Set";
static final String ACT_ROW = "auto-correlation time (ACT)";
static final String ESS_ROW = "effective sample size (ESS)";
static final String SUM_ESS_ROW = "effective sample size (sum of ESS)";
TraceList[] traceLists = null;
java.util.List<String> traceNames = null;
StatisticsModel statisticsModel;
JTable statisticsTable = null;
JScrollPane scrollPane1 = null;
JPanel topPanel = null;
JSplitPane splitPane1 = null;
int dividerLocation = -1;
FrequencyPanel frequencyPanel = null;
IntervalsPanel intervalsPanel = null;
JComponent currentPanel = null;
public SummaryStatisticsPanel(JFrame frame) {
setOpaque(false);
statisticsModel = new StatisticsModel();
statisticsTable = new JTable(statisticsModel);
statisticsTable.getColumnModel().getColumn(0).setCellRenderer(
new TableRenderer(SwingConstants.RIGHT, new Insets(0, 4, 0, 4)));
statisticsTable.getColumnModel().getColumn(1).setCellRenderer(
new TableRenderer(SwingConstants.LEFT, new Insets(0, 4, 0, 4)));
statisticsTable.addMouseMotionListener(new MouseMotionAdapter(){
public void mouseMoved(MouseEvent e){
Point p = e.getPoint();
int row = statisticsTable.rowAtPoint(p);
if (row == 6) {
Object t = statisticsModel.getValueAt(9,1);
if (!t.equals("-")) {
statisticsTable.setToolTipText("Incredible set : " + t);
}
}
}//end MouseMoved
}); // end MouseMotionAdapter
scrollPane1 = new JScrollPane(statisticsTable,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
topPanel = new JPanel(new BorderLayout(0, 0));
topPanel.setOpaque(false);
topPanel.setBorder(new BorderUIResource.EmptyBorderUIResource(
new java.awt.Insets(0, 0, 6, 0)));
topPanel.add(scrollPane1, BorderLayout.CENTER);
frequencyPanel = new FrequencyPanel(frame);
frequencyPanel.setBorder(new BorderUIResource.EmptyBorderUIResource(
new java.awt.Insets(6, 0, 0, 0)));
intervalsPanel = new IntervalsPanel();
intervalsPanel.setBorder(new BorderUIResource.EmptyBorderUIResource(
new java.awt.Insets(6, 0, 0, 0)));
splitPane1 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, true, topPanel, frequencyPanel);
splitPane1.setOpaque(false);
splitPane1.setBorder(null);
// splitPane1.setBorder(new BorderUIResource.EmptyBorderUIResource(
// new java.awt.Insets(12, 12, 12, 12)));
setLayout(new BorderLayout(0, 0));
add(splitPane1, BorderLayout.CENTER);
splitPane1.setDividerLocation(2000);
}
private void setupDividerLocation() {
if (dividerLocation == -1 || dividerLocation == splitPane1.getDividerLocation()) {
int h0 = topPanel.getHeight();
int h1 = scrollPane1.getViewport().getHeight();
int h2 = statisticsTable.getPreferredSize().height;
dividerLocation = h2 + h0 - h1;
splitPane1.setDividerLocation(dividerLocation);
}
}
public void setTraces(TraceList[] traceLists, java.util.List<String> traceNames) {
this.traceLists = traceLists;
this.traceNames = traceNames;
int divider = splitPane1.getDividerLocation();
statisticsModel.fireTableStructureChanged();
if (traceLists != null && traceNames != null) {
if (traceLists.length == 1 && traceNames.size() == 1) {
statisticsTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
currentPanel = frequencyPanel;
frequencyPanel.setTrace(traceLists[0], traceNames.get(0));
intervalsPanel.setTraces(null, null);
splitPane1.setBottomComponent(frequencyPanel);
} else {
statisticsTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
statisticsTable.getColumnModel().getColumn(0).setPreferredWidth(200);
for (int i = 1; i < statisticsTable.getColumnCount(); i++) {
statisticsTable.getColumnModel().getColumn(i).setPreferredWidth(100);
}
currentPanel = intervalsPanel;
frequencyPanel.setTrace(null, null);
intervalsPanel.setTraces(traceLists, traceNames);
splitPane1.setBottomComponent(intervalsPanel);
}
} else {
currentPanel = statisticsTable;
frequencyPanel.setTrace(null, null);
splitPane1.setBottomComponent(frequencyPanel);
}
splitPane1.setDividerLocation(divider);
statisticsTable.getColumnModel().getColumn(0).setCellRenderer(
new TableRenderer(SwingConstants.RIGHT, new Insets(0, 4, 0, 4)));
for (int i = 1; i < statisticsTable.getColumnCount(); i++) {
statisticsTable.getColumnModel().getColumn(i).setCellRenderer(
new TableRenderer(SwingConstants.LEFT, new Insets(0, 4, 0, 4)));
}
setupDividerLocation();
validate();
repaint();
}
public JComponent getExportableComponent() {
if (currentPanel instanceof Exportable) {
return ((Exportable) currentPanel).getExportableComponent();
}
return currentPanel;
}
public String toString() {
return statisticsModel.toString();
}
class StatisticsModel extends AbstractTableModel {
String[] rowNames = {MEAN_ROW, STDEV_ROW, STDEV, VARIANCE_ROW, MEDIAN_ROW, MODE_ROW, GEOMETRIC_MEAN_ROW,
LOWER_UPPER_ROW, ACT_ROW, ESS_ROW};
public StatisticsModel() {
}
public int getColumnCount() {
if (traceLists != null && traceNames != null) {
return (traceLists.length * traceNames.size()) + 1;
} else {
return 2;
}
}
public int getRowCount() {
return rowNames.length;
}
public Object getValueAt(int row, int col) {
TraceCorrelation tc = null;
if (traceLists != null && traceNames != null && traceNames.size() > 0) {
int colNew = col;
if (col == 0) {
colNew++;
}
int n1 = (colNew - 1) / traceNames.size();
int n2 = (colNew - 1) % traceNames.size();
TraceList tl = traceLists[n1];
int index = tl.getTraceIndex(traceNames.get(n2));
tc = tl.getCorrelationStatistics(index);
} else {
return "-";
}
if (col == 0) {
if (tc != null && tc.getTraceType() != TraceFactory.TraceType.DOUBLE && row == 6) {
return CRED_SET_ROW;
// } else if (tc != null && tc.getTraceType() != TraceFactory.TraceType.DOUBLE && row == 6) {
// return INCRED_SET_ROW;
} else {
return rowNames[row];
}
}
double value = 0.0;
if (tc != null) {
if (row != 0 && !tc.isValid()) return "n/a";
switch (row) {
case 0:
if (tc.getTraceType() == TraceFactory.TraceType.STRING) {
return "n/a";
} else {
value = tc.getMean();
}
break;
case 1:
if (tc.getTraceType() == TraceFactory.TraceType.STRING) {
return "n/a";
} else {
value = tc.getStdErrorOfMean();
}
break;
case 2:
if (tc.getTraceType() == TraceFactory.TraceType.STRING) {
return "n/a";
} else {
value = tc.getStdError();
}
break;
case 3:
if (tc.getTraceType() == TraceFactory.TraceType.STRING) {
return "n/a";
} else {
value = tc.getVariance();
}
break;
case 4:
if (tc.getTraceType() == TraceFactory.TraceType.STRING) {
return "n/a";
} else {
value = tc.getMedian();
}
break;
case 5:
if (tc.getTraceType() == TraceFactory.TraceType.DOUBLE) {
return "n/a";
} else {
return tc.getMode();
}
case 6:
if (!tc.hasGeometricMean()) return "n/a";
value = tc.getGeometricMean();
break;
case 7:
if (tc.getTraceType() == TraceFactory.TraceType.DOUBLE) {
return "[" + TraceAnalysis.formattedNumber(tc.getLowerHPD()) + ", " + TraceAnalysis.formattedNumber(tc.getUpperHPD()) + "]";
} else {
return tc.printCredibleSet();
}
case 8:
value = tc.getACT();
break;
case 9:
value = tc.getESS();
break;
case 10:
if (tc.getTraceType() == TraceFactory.TraceType.DOUBLE) {
return "-";
} else {
return tc.printInCredibleSet();
}
}
} else {
return "-";
}
return TraceAnalysis.formattedNumber(value);
}
public String getColumnName(int column) {
if (column == 0) return "Summary Statistic";
if (traceLists != null && traceNames != null) {
int n1 = (column - 1) / traceNames.size();
int n2 = (column - 1) % traceNames.size();
String columnName = "";
if (traceLists.length > 1) {
columnName += traceLists[n1].getName();
if (traceNames.size() > 1) {
columnName += ": ";
}
}
if (traceNames.size() > 1) {
columnName += traceNames.get(n2);
}
return columnName;
}
return "-";
}
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
public String toString() {
StringBuffer buffer = new StringBuffer();
buffer.append(getColumnName(0));
for (int j = 1; j < getColumnCount(); j++) {
buffer.append("\t");
buffer.append(getColumnName(j));
}
buffer.append("\n");
for (int i = 0; i < getRowCount(); i++) {
buffer.append(getValueAt(i, 0));
for (int j = 1; j < getColumnCount(); j++) {
buffer.append("\t");
buffer.append(getValueAt(i, j));
}
buffer.append("\n");
}
return buffer.toString();
}
}
}