X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FCalculationChooser.java;h=c43d59b8c1f5d3983e14ba43449d40b32e955f15;hb=f96e6a945e2df8a844f428c08cfc08210d937fc0;hp=811957ba92b37387d686ecb8f25798d076e32d71;hpb=9fe1833d6a0e8275886edf3c7a43c73346dbab45;p=jalview.git diff --git a/src/jalview/gui/CalculationChooser.java b/src/jalview/gui/CalculationChooser.java index 811957b..c43d59b 100644 --- a/src/jalview/gui/CalculationChooser.java +++ b/src/jalview/gui/CalculationChooser.java @@ -27,7 +27,9 @@ import jalview.analysis.scoremodels.ScoreModels; import jalview.analysis.scoremodels.SimilarityParams; import jalview.api.analysis.ScoreModelI; import jalview.api.analysis.SimilarityParamsI; +import jalview.bin.Cache; import jalview.datamodel.SequenceGroup; +import jalview.ext.archaeopteryx.AptxInit; import jalview.util.MessageManager; import java.awt.BorderLayout; @@ -107,6 +109,11 @@ public class CalculationChooser extends JPanel List tips = new ArrayList<>(); + /* + * the most recently opened PCA results panel + */ + private PCAPanel pcaPanel; + /** * Constructor * @@ -152,12 +159,15 @@ public class CalculationChooser extends JPanel pca = new JRadioButton( MessageManager.getString("label.principal_component_analysis")); pca.setOpaque(false); + neighbourJoining = new JRadioButton( MessageManager.getString("label.tree_calc_nj")); neighbourJoining.setSelected(true); + neighbourJoining.setOpaque(false); + averageDistance = new JRadioButton( MessageManager.getString("label.tree_calc_av")); - neighbourJoining.setOpaque(false); + averageDistance.setOpaque(false); JPanel calcChoicePanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); calcChoicePanel.setOpaque(false); @@ -166,8 +176,8 @@ public class CalculationChooser extends JPanel JPanel treePanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); treePanel.setOpaque(false); - treePanel.setBorder(BorderFactory - .createTitledBorder(MessageManager.getString("label.tree"))); + JvSwingUtils.createTitledBorder(treePanel, + MessageManager.getString("label.tree"), true); // then copy the inset dimensions for the border-less PCA panel JPanel pcaBorderless = new JPanel(new FlowLayout(FlowLayout.LEFT)); @@ -267,9 +277,9 @@ public class CalculationChooser extends JPanel setMinimumSize(new Dimension(325, height - 10)); String title = MessageManager.getString("label.choose_calculation"); - if (af.getViewport().viewName != null) + if (af.getViewport().getViewName() != null) { - title = title + " (" + af.getViewport().viewName + ")"; + title = title + " (" + af.getViewport().getViewName() + ")"; } Desktop.addInternalFrame(frame, title, width, height, false); @@ -287,6 +297,7 @@ public class CalculationChooser extends JPanel }; }); + validateCalcTypes(); frame.setLayer(JLayeredPane.PALETTE_LAYER); } @@ -416,38 +427,40 @@ public class CalculationChooser extends JPanel Object curSel = comboBox.getSelectedItem(); toolTips.clear(); DefaultComboBoxModel model = new DefaultComboBoxModel<>(); + /* + * select the score models applicable to the alignment type + */ + boolean nucleotide = af.getViewport().getAlignment().isNucleotide(); + List models = getApplicableScoreModels(nucleotide, + pca.isSelected()); /* * now we can actually add entries to the combobox, * remembering their descriptions for tooltips */ - ScoreModels scoreModels = ScoreModels.getInstance(); boolean selectedIsPresent = false; - for (ScoreModelI sm : scoreModels.getModels()) + for (ScoreModelI sm : models) { - boolean nucleotide = af.getViewport().getAlignment().isNucleotide(); - if (sm.isDNA() && nucleotide || sm.isProtein() && !nucleotide) + if (curSel != null && sm.getName().equals(curSel)) { - if (curSel != null && sm.getName().equals(curSel)) - { - selectedIsPresent = true; - curSel = sm.getName(); - } - model.addElement(sm.getName()); - - /* - * tooltip is description if provided, else text lookup with - * fallback on the model name - */ - String tooltip = sm.getDescription(); - if (tooltip == null) - { - tooltip = MessageManager.getStringOrReturn("label.score_model_", - sm.getName()); - } - toolTips.add(tooltip); + selectedIsPresent = true; + curSel = sm.getName(); } + model.addElement(sm.getName()); + + /* + * tooltip is description if provided, else text lookup with + * fallback on the model name + */ + String tooltip = sm.getDescription(); + if (tooltip == null) + { + tooltip = MessageManager.getStringOrReturn("label.score_model_", + sm.getName()); + } + toolTips.add(tooltip); } + if (selectedIsPresent) { model.setSelectedItem(curSel); @@ -457,6 +470,47 @@ public class CalculationChooser extends JPanel } /** + * Builds a list of score models which are applicable for the alignment and + * calculation type (peptide or generic models for protein, nucleotide or + * generic models for nucleotide). + *

+ * As a special case, includes BLOSUM62 as an extra option for nucleotide PCA. + * This is for backwards compatibility with Jalview prior to 2.8 when BLOSUM62 + * was the only score matrix supported. This is included if property + * BLOSUM62_PCA_FOR_NUCLEOTIDE is set to true in the Jalview properties file. + * + * @param nucleotide + * @param forPca + * @return + */ + protected static List getApplicableScoreModels( + boolean nucleotide, boolean forPca) + { + List filtered = new ArrayList<>(); + + ScoreModels scoreModels = ScoreModels.getInstance(); + for (ScoreModelI sm : scoreModels.getModels()) + { + if (!nucleotide && sm.isProtein() || nucleotide && sm.isDNA()) + { + filtered.add(sm); + } + } + + /* + * special case: add BLOSUM62 as last option for nucleotide PCA, + * for backwards compatibility with Jalview < 2.8 (JAL-2962) + */ + if (nucleotide && forPca + && Cache.getDefault("BLOSUM62_PCA_FOR_NUCLEOTIDE", false)) + { + filtered.add(scoreModels.getBlosum62()); + } + + return filtered; + } + + /** * Open and calculate the selected tree or PCA on 'OK' */ protected void calculate_actionPerformed() @@ -471,14 +525,11 @@ public class CalculationChooser extends JPanel } else { + createTree(substitutionMatrix, params); + + + - String treeAlgo = determineTreeAlgo(); - TreeCalculator treeCalculator = new TreeCalculator(treeAlgo, - substitutionMatrix, params); - TreeBuilder calculatedTree = treeCalculator - .makeTree(af.getViewport()); - TreeModel tree = new TreeModel(calculatedTree); - openTreePanel(tree, treeAlgo, params); } @@ -486,6 +537,21 @@ public class CalculationChooser extends JPanel // closeFrame(); } + protected void createTree(String substitutionMatrix, + SimilarityParamsI params) + { + String treeAlgo = determineTreeAlgo(); + TreeCalculator treeCalculator = new TreeCalculator(treeAlgo, + substitutionMatrix, params); + TreeBuilder calculatedTree = treeCalculator.makeTree(af.getViewport()); + + AptxInit.createInstance(calculatedTree); + + TreeModel tree = new TreeModel(calculatedTree); + openTreePanel(tree, treeAlgo, substitutionMatrix); + } + + protected String determineTreeAlgo() // to be modified & expanded { String treeAlgorithm = neighbourJoining.isSelected() @@ -519,7 +585,7 @@ public class CalculationChooser extends JPanel * @param treeAlgo */ protected void openTreePanel(TreeModel tree, String treeAlgo, - SimilarityParamsI params) + String substitutionMatrix) { /* * gui validation shouldn't allow insufficient sequences here, but leave @@ -527,7 +593,7 @@ public class CalculationChooser extends JPanel */ checkEnoughSequences(af.getViewport()); - af.newTreePanel(tree, treeAlgo, params); + af.newTreePanel(tree, treeAlgo, substitutionMatrix); } /** @@ -558,7 +624,13 @@ public class CalculationChooser extends JPanel JvOptionPane.WARNING_MESSAGE); return; } - new PCAPanel(af.alignPanel, modelName, params); + + /* + * construct the panel and kick off its calculation thread + */ + pcaPanel = new PCAPanel(af.alignPanel, modelName, params); + new Thread(pcaPanel).start(); + } /** @@ -600,7 +672,6 @@ public class CalculationChooser extends JPanel */ boolean matchGap = doPCA ? false : treeMatchGaps; - return new SimilarityParams(includeGapGap, matchGap, includeGapResidue, matchOnShortestLength); } @@ -617,4 +688,9 @@ public class CalculationChooser extends JPanel { } } + + public PCAPanel getPcaPanel() + { + return pcaPanel; + } }