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.JLabel; import javax.swing.JPanel; import statalign.postprocess.plugins.Entropy; import statalign.postprocess.utils.EntropyContainer; /** * This class implements the graphical interface for showing the observed, expected, * and individual sample entropies of a given alignment space. * * @author Preeti Arunapuram * */ public class EntropyGUI extends JPanel { private static final Font LLT_FONT = new Font("Dialog", Font.PLAIN, 10); private static final long serialVersionUID = 1L; // int cornerx, cornery; // private JPanel parent; public String title; private Entropy owner; private JLabel oe = new JLabel("Consensus Entropy"); private JLabel se = new JLabel("Sample Entropy"); public static final int OFFSET_X = 50; public static final int TITLE_X = 100; public static final int TITLE_Y = 30; private int border = 10; /** * Constructor to initialise the GUI for entropy * * @param parent * The main panel * @param owner * The Entropy postprocess handler */ public EntropyGUI(String title, Entropy owner) { // super((int) (panel.getWidth() / 6.6), panel.getHeight() / 13); // this.parent = parent; this.title = title; this.owner = owner; //oe.setBackground(Color.BLUE); //se.setBackground(Color.RED); oe.setForeground(Color.BLUE); se.setForeground(Color.RED); // setFont(new Font("Monospaced", Font.PLAIN, 10)); // setEditable(false); } /** * It updates the graphics of the panel */ @Override public void paintComponent(Graphics gr) { //this.add(oe); //this.add(se); super.paintComponent(gr); Graphics2D g2 = (Graphics2D) gr; 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; 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<EntropyContainer> list = owner.entropyList; // finding the maximum and minimum double maxLik = 20.0, minLik = 0.0; for (int i = 0; i < list.size(); i++) { double x = (list.get(i)).obsEntropy; if (x < minLik) { minLik = x; } if (x + 20 > maxLik) { maxLik = x + 20; } } /*if (minLik > -0.1) { maxLik = 0.0; }*/ g2.setFont(LLT_FONT); //gr.drawString("" + ((int) maxLik), minX, 15+minY); //gr.drawString("" + ((int) minLik), minX, maxHeight); g2.setFont(new Font("SANS_SERIF", Font.BOLD, 16)); g2.rotate(Math.PI/2); g2.drawString("Entropy in bits", maxHeight/2 - 50, -20); g2.rotate(Math.PI*1.5); g2.drawString("Sample", 700, 15+maxHeight); // drawing the entropy if (list.size() <= 1) { g2.drawString("Waiting for data..", TITLE_X, TITLE_Y); 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)); this.add(oe); this.add(se); g2.setColor(Color.BLUE); double actual; double next = (list.get(0)).obsEntropy; for (int i = 0; i < list.size() - 1; i++) { actual = next; next = (list.get(i + 1)).obsEntropy; gr.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++; //gr.setColor(Color.BLUE); //gr.clearRect(minX+(maxWidth-border) * (i + 1) * 2 / 300 + 50, minY+(int) ((maxLik - next) * (maxHeight-border) / (maxLik - minLik + 1.0)), 100, 100); //gr.setColor(Color.WHITE); /*gr.drawString("Observed Entropy", (minX+(maxWidth-border) * (i + 1) * 2 / 300 + 50) + 10, (minY+(int) ((maxLik - next) * (maxHeight-border) / (maxLik - minLik + 1.0))) + 10);*/ //JLabel oe = new JLabel("Observed Entropy"); //oe.setForeground(Color.BLUE); //this.add(oe); oe.setText("Consensus Entropy = " + (list.get(i + 1)).obsEntropy); oe.setLocation((minX+(1000-border) * (i + 1) * 2 / 300 + 50) + 10, minY+(int) ((maxLik - next) * (maxHeight-border) / (maxLik - minLik + 1.0))); } //System.out.println("DRAWING LINES"); /*gr.setColor(Color.GREEN); for (int i = 0; i < list.size() - 1; i++) { actual = next; next = (list.get(i + 1)).expEntropy; //System.out.println("DRAWING LINES"); gr.drawLine(minX+(maxWidth-border) * i * 2 / 300 + 50, minY+(int) ((maxLik - actual) * (maxHeight-border) / (maxLik - minLik + 1.0)), minX+(maxWidth-border) * (i + 1) * 2 / 300 + 50, minY+(int) ((maxLik - next) * (maxHeight-border) / (maxLik - minLik + 1.0))); // i++; }*/ g2.setColor(Color.RED); double actualS; double nextS = (list.get(0)).sampleEntropy; for (int i = 0; i < list.size() - 1; i++) { actualS = nextS; nextS = (list.get(i + 1)).sampleEntropy; //System.out.println("DRAWING LINES"); g2.drawLine(minX+(1000-border) * i * 2 / 300 + 50, minY+(int) ((maxLik - actualS) * (maxHeight-border) / (maxLik - minLik + 1.0)), minX+(1000-border) * (i + 1) * 2 / 300 + 50, minY+(int) ((maxLik - nextS) * (maxHeight-border) / (maxLik - minLik + 1.0))); // i++; //JLabel se = new JLabel("Sample Entropy"); //se.setForeground(Color.RED); //this.add(se); se.setText("Sample Entropy = " + (list.get(i + 1)).sampleEntropy); se.setLocation((minX+(1000-border) * (i + 1) * 2 / 300 + 50) + 10, minY+(int) ((maxLik - nextS) * (maxHeight-border) / (maxLik - minLik + 1.0))); /*if(oe.getY() - se.getY() > 0 && oe.getY() - se.getY() <= 20) { oe.setLocation((minX+(1000-border) * (i + 1) * 2 / 300 + 50) + 10, (minY+(int) ((maxLik - next) * (maxHeight-border) / (maxLik - minLik + 1.0))) - 10); se.setLocation((minX+(1000-border) * (i + 1) * 2 / 300 + 50) + 10, (minY+(int) ((maxLik - nextS) * (maxHeight-border) / (maxLik - minLik + 1.0))) + 10); } else if(se.getY() - oe.getY() > 0 && se.getY() - oe.getY() <= 20) { oe.setLocation((minX+(1000-border) * (i + 1) * 2 / 300 + 50) + 10, (minY+(int) ((maxLik - next) * (maxHeight-border) / (maxLik - minLik + 1.0))) + 10); se.setLocation((minX+(1000-border) * (i + 1) * 2 / 300 + 50) + 10, (minY+(int) ((maxLik - nextS) * (maxHeight-border) / (maxLik - minLik + 1.0))) - 10); }*/ } } /** * 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); // } } }