package statalign.postprocess.plugins; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Enumeration; import javax.swing.AbstractButton; import javax.swing.ButtonGroup; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JToggleButton; import javax.swing.JToolBar; import statalign.base.InputData; import statalign.base.State; import statalign.model.ext.ModelExtManager; import statalign.postprocess.Postprocess; import statalign.postprocess.gui.StructureGUI; import statalign.postprocess.utils.RNAFoldingTools; import fr.orsay.lri.varna.exceptions.ExceptionNonEqualLength; import fr.orsay.lri.varna.models.rna.RNA; public class Structure extends statalign.postprocess.Postprocess { /** * Postprocess which handles the consensus structure generated by PPFold. * * @author Preeti Arunapuram */ public String title; private JPanel pan = new JPanel(new BorderLayout()); private StructureGUI gui; private ArrayList<JComponent> toolbar; private ButtonGroup group; public static float[][] probMatrix; public static float[] singleMatrix; public static String currentSequence; public static String currentDotBracketStructure; //public boolean probMode = true; public Structure() { sampling = true; screenable = true; outputable = true; // postprocessable = true; // postprocessWrite = true; hasToolBar = true; rnaAssociated = true; selected = false; } @Override public void init(ModelExtManager manager) { toolbar = new ArrayList<JComponent>(); createToolBar(); } @Override public String getTabName() { return "PPFold Consensus Structure"; } @Override public Icon getIcon() { // TODO Auto-generated method stub return new ImageIcon("icons/test1.png"); } @Override public JPanel getJPanel() { // TODO Auto-generated method stub //pan = new JPanel(new BorderLayout()); return pan; } @Override public void reloadPanel() { pan = new JPanel(new BorderLayout()); } @Override public String getTip() { // TODO Auto-generated method stub return "Consensus structure"; } @Override public double getTabOrder() { return 9.0d; } @Override public void setSampling(boolean enabled) { // TODO Auto-generated method stub sampling = enabled; } @Override public String[] getDependencies() { return new String[] { "statalign.postprocess.plugins.PPFold"}; } public PPFold ppfold; @Override public void refToDependencies(Postprocess[] plugins) { ppfold = (PPFold) plugins[0]; } public static void updateBasePairMatrix(float[][] newMatrix) { probMatrix = newMatrix; } public static void updateSingleMatrix(float[] newMatrix) { singleMatrix = newMatrix; } public static void updateStructure() { RNAFoldingTools rnaTools = new RNAFoldingTools(); int[] pairedSites = rnaTools.getPosteriorDecodingConsensusStructureMultiThreaded(probMatrix); currentDotBracketStructure = RNAFoldingTools.getDotBracketStringFromPairedSites(pairedSites); } public void updateSequence() { currentSequence = ppfold.getSequenceByName(ppfold.getSequences(), ppfold.getRefName()).replaceAll("-", "");; } @Override public ArrayList<JComponent> getToolBarItems() { return toolbar; } private void createToolBar() { toolbar.add(new JToolBar.Separator()); group = new ButtonGroup(); JToggleButton normalButton = new JToggleButton(new ImageIcon(ClassLoader.getSystemResource("icons/normalRNA.png"))); //JToggleButton normalButton = new JToggleButton(new ImageIcon(ClassLoader.getSystemResource("icons/phylogram.png"))); String text = "Nucleotide mode: color by nucleotide base."; normalButton.setToolTipText(text); normalButton.setActionCommand(text); normalButton.setEnabled(false); normalButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { RNA.probMode = false; gui.probMode = false; gui.repaint(); } }); JToggleButton probButton = new JToggleButton(new ImageIcon(ClassLoader.getSystemResource("icons/probRNA.png"))); String probText = "Probability mode: color gradient depends on probability of base-pairing."; probButton.setToolTipText(probText); probButton.setActionCommand(probText); probButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { RNA.probMode = true; gui.probMode = true; gui.repaint(); } }); group.add(normalButton); group.add(probButton); //JPanel panel = new JPanel(new BorderLayout(1,3)); toolbar.add(normalButton); toolbar.add(probButton); // JLabel ta = new JLabel(" " + "PPFold Consensus Structure"); // ta.setFont(new Font("Monospaced",Font.CENTER_BASELINE,14)); // ta.setOpaque(false); // // toolbar.add(ta); probButton.setSelected(true); } @Override public void beforeFirstSample(InputData input) { if(show) { Enumeration<AbstractButton> buttons = group.getElements(); while (buttons.hasMoreElements()) { buttons.nextElement().setEnabled(true); } pan.removeAll(); title = input.title; try { gui = new StructureGUI(title); } catch (ExceptionNonEqualLength e) { // TODO Auto-generated catch block e.printStackTrace(); } JScrollPane scroll = new JScrollPane(gui); pan.add(scroll, BorderLayout.CENTER); if(pan.getParent() != null) { pan.getParent().validate(); } } } @Override public void newSample(State state, int no, int total) { if(sampling) { if(ppfold.samplingAndAveragingPPfold) { updateSequence(); updateStructure(); } //gui.updateAndDraw(currentSequence, currentDotBracketStructure); } if(show) { if(ppfold.samplingAndAveragingPPfold) { gui.updateAndDraw(currentSequence, currentDotBracketStructure); } } } @Override public void afterLastSample() { } }