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.util.MessageManager;
private static final int MIN_PCA_SELECTION = 4;
+ private static final int MIN_PASIMAP_SELECTION = 4; //&! <++>!! chekc how many
+
AlignFrame af;
JRadioButton pca;
+ JRadioButton pasimap; //&! initialize JRadioButton object for pasimap
+
JRadioButton neighbourJoining;
JRadioButton averageDistance;
final ComboBoxTooltipRenderer renderer = new ComboBoxTooltipRenderer();
- List<String> tips = new ArrayList<String>();
+ List<String> tips = new ArrayList<>();
/*
* the most recently opened PCA results panel
*/
private PCAPanel pcaPanel;
+ //&!
+ private PaSiMapPanel pasimapPanel;
+
/**
* Constructor
*
pca = new JRadioButton(
MessageManager.getString("label.principal_component_analysis"));
pca.setOpaque(false);
+
+ pasimap = new JRadioButton( // create the JRadioButton for pasimap with label.pasimap as its text
+ MessageManager.getString("label.pasimap"));
+ pasimap.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);
pcaBorderless.add(pca, FlowLayout.LEFT);
calcChoicePanel.add(pcaBorderless, FlowLayout.LEFT);
+ //&! create pasimap panel
+ JPanel pasimapBorderless = new JPanel(new FlowLayout(FlowLayout.LEFT)); // create new JPanel (button) for pasimap
+ pasimapBorderless.setBorder(
+ BorderFactory.createEmptyBorder(2, b.left, 2, b.right)); // set border (margin) for button (same as treePanel and pca)
+ pasimapBorderless.setOpaque(false); // false -> stops every pixel inside border from being painted
+ pasimapBorderless.add(pasimap, FlowLayout.LEFT); // add pasimap button to the JPanel
+ calcChoicePanel.add(pasimapBorderless, FlowLayout.LEFT); // add button with border and everything to the overall ChoicePanel
+
treePanel.add(neighbourJoining);
treePanel.add(averageDistance);
ButtonGroup calcTypes = new ButtonGroup();
calcTypes.add(pca);
+ calcTypes.add(pasimap); //&! add pasimap to the calculation types
calcTypes.add(neighbourJoining);
calcTypes.add(averageDistance);
}
};
pca.addActionListener(calcChanged);
+ pasimap.addActionListener(calcChanged); // add the calcChanged ActionListener to pasimap --> <++> idk
neighbourJoining.addActionListener(calcChanged);
averageDistance.addActionListener(calcChanged);
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);
};
});
+ validateCalcTypes();
frame.setLayer(JLayeredPane.PALETTE_LAYER);
}
* return value of true means enabled and selected
*/
boolean checkPca = checkEnabled(pca, size, MIN_PCA_SELECTION);
+ boolean checkPasimap = checkEnabled(pasimap, size, MIN_PASIMAP_SELECTION); // check if pasimap is enabled and min_size is fulfilled
boolean checkNeighbourJoining = checkEnabled(neighbourJoining, size,
MIN_TREE_SELECTION);
boolean checkAverageDistance = checkEnabled(averageDistance, size,
MIN_TREE_SELECTION);
- if (checkPca || checkNeighbourJoining || checkAverageDistance)
+ if (checkPca || checkPasimap || checkNeighbourJoining || checkAverageDistance)
{
calculate.setToolTipText(null);
calculate.setEnabled(true);
*/
protected JComboBox<String> buildModelOptionsList()
{
- final JComboBox<String> scoreModelsCombo = new JComboBox<String>();
+ final JComboBox<String> scoreModelsCombo = new JComboBox<>();
scoreModelsCombo.setRenderer(renderer);
/*
{
Object curSel = comboBox.getSelectedItem();
toolTips.clear();
- DefaultComboBoxModel<String> model = new DefaultComboBoxModel<String>();
+ DefaultComboBoxModel<String> model = new DefaultComboBoxModel<>();
+
+ /*
+ * select the score models applicable to the alignment type
+ */
+ boolean nucleotide = af.getViewport().getAlignment().isNucleotide();
+ List<ScoreModelI> 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);
}
/**
+ * 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).
+ * <p>
+ * 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<ScoreModelI> getApplicableScoreModels(
+ boolean nucleotide, boolean forPca)
+ {
+ List<ScoreModelI> 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()
{
boolean doPCA = pca.isSelected();
+ boolean doPaSiMap = pasimap.isSelected();
String modelName = modelNames.getSelectedItem().toString();
SimilarityParamsI params = getSimilarityParameters(doPCA);
- if (doPCA)
+ if (doPCA && !doPaSiMap)
{
openPcaPanel(modelName, params);
}
+ else if (doPaSiMap && !doPCA)
+ {
+ openPasimapPanel(modelName, params);
+ }
else
{
openTreePanel(modelName, params);
}
- // closeFrame();
+ closeFrame();
}
/**
JvOptionPane.WARNING_MESSAGE);
return;
}
+
+ /*
+ * construct the panel and kick off its calculation thread
+ */
pcaPanel = new PCAPanel(af.alignPanel, modelName, params);
+ new Thread(pcaPanel).start();
+
+ }
+
+ /**
+ * Open a new PaSiMap panel on the desktop
+ *
+ * @param modelName
+ * @param params
+ */
+ protected void openPasimapPanel(String modelName, SimilarityParamsI params)
+ {
+ AlignViewport viewport = af.getViewport();
+
+ /*
+ * gui validation shouldn't allow insufficient sequences here, but leave
+ * this check in in case this method gets exposed programmatically in future
+ */
+ if (((viewport.getSelectionGroup() != null)
+ && (viewport.getSelectionGroup().getSize() < MIN_PASIMAP_SELECTION)
+ && (viewport.getSelectionGroup().getSize() > 0))
+ || (viewport.getAlignment().getHeight() < MIN_PASIMAP_SELECTION))
+ {
+ JvOptionPane.showInternalMessageDialog(this,
+ MessageManager.formatMessage(
+ "label.you_need_at_least_n_sequences",
+ MIN_PASIMAP_SELECTION),
+ MessageManager
+ .getString("label.sequence_selection_insufficient"),
+ JvOptionPane.WARNING_MESSAGE);
+ return;
+ }
+
+ /*
+ * construct the panel and kick off its calculation thread
+ */
+ //&! change to PaSiMapPanel
+ pasimapPanel = new PaSiMapPanel(af.alignPanel, modelName, params);
+ new Thread(pasimapPanel).start();
+
}
/**