package statalign.postprocess.gui; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.util.ArrayList; import javax.swing.JPanel; import statalign.postprocess.plugins.VisualDistance; public class DistanceGUI extends JPanel { /** * * * @author Preeti Arunapuram */ private static final Font LLT_FONT = new Font("Dialog", Font.PLAIN, 10); private static final long serialVersionUID = 1L; //private JPanel parent; public String title; private VisualDistance owner; int distance = 1; public static final int OFFSET_X = 50; public static final int TITLE_X = 100; public static final int TITLE_Y = 30; public DistanceGUI(String title, VisualDistance owner) { this.title = title; this.owner = owner; } public void paintComponent(Graphics gr) { super.paintComponent(gr); Graphics2D g2 = (Graphics2D)gr; final int border = 10; g2.setColor(Color.WHITE); g2.fillRect(0, 0, getWidth(), getHeight()); g2.setColor(Color.black); int maxWidth = getWidth()-50-border; int maxHeight = getHeight()-2*border; int minX = border; int minY = border+30; g2.drawLine(50+minX, minY, 50+minX, maxHeight); g2.drawLine(50+minX, minY, 40+minX, 10+minY); g2.drawLine(50+minX, minY, 60+minX, 10+minY); g2.drawLine(50+minX, maxHeight, maxWidth + 50, maxHeight); g2.drawLine(maxWidth + 50, maxHeight, maxWidth + 40, maxHeight - 10); g2.drawLine(maxWidth + 50, maxHeight, maxWidth + 40, maxHeight + 10); ArrayList<Double> list = owner.distances; // finding the maximum and minimum double maxLik = 1.0, minLik = 0.0; for (int i = 0; i < list.size(); i++) { double x = list.get(i); if (x < minLik) { minLik = x; } if (x > maxLik) { maxLik = x; } } /*if (minLik > -0.1) { maxLik = 0.0; }*/ g2.setFont(new Font("SANS_SERIF", Font.BOLD, 16)); g2.rotate(Math.PI/2); //g2.rotate(-Math.PI*3/2); g2.setFont(new Font("SANS_SERIF", Font.PLAIN, 14)); String yaxis = "Similarity (1st alignment, current)"; g2.drawString(yaxis, (this.getHeight()-g2.getFontMetrics().stringWidth(yaxis))/2+5, -31); g2.setFont(new Font("SANS_SERIF", Font.BOLD, 16)); //g2.rotate(Math.PI*3/2); g2.rotate(Math.PI*1.5); g2.drawString("Sample", 700, 15+maxHeight); g2.drawString("" + ((int) maxLik), minX, 15+minY); g2.drawString("" + ((int) minLik), minX, maxHeight); // drawing the loglikelihood trace if (list.size() == 0) { g2.drawString("Waiting for data..", 100, 30); return; } g2.setColor(Color.BLACK); g2.setFont(new Font("SANS_SERIF", Font.BOLD, 16)); g2.drawString(title, TITLE_X, TITLE_Y); g2.setFont(new Font("MONOSPACED", Font.PLAIN, 12)); g2.setColor(Color.BLUE); double actual; double next = 1; for (int i = 0; i < list.size() - 1; i++) { actual = next; next = list.get(i); g2.drawLine(minX+(1000-border) * i * 2 / 300 + 50, minY+(int) ((maxLik - actual) * (maxHeight-border) / (maxLik - minLik + 1.0)), (minX+(1000-border) * (i + 1) * 2 / 300 + 50), minY+(int) ((maxLik - next) * (maxHeight-border) / (maxLik - minLik + 1.0))); // i++; } } /** * This function tells the minimum size of the panel */ @Override public Dimension getMinimumSize(){ return getPreferredSize(); } /** * This function tells the preferred size of the panel */ @Override public Dimension getPreferredSize() { //int maxWidth = this.getWidth() - 50 - border; return new Dimension(2*OFFSET_X + 7*(owner.mcmc.mcmcpars.cycles/owner.mcmc.mcmcpars.sampRate), TITLE_Y + 30); // if (alignment != null && alignment[0] != null) { // return new Dimension((alignment[0].length() + 3) * COLUMN_WIDTH + 6 * OFFSET_X, 100); // } else { // return new Dimension(0,100); // } } }