From 6ed2dabde1584f0fc3bb3af66f151a14664ffaf8 Mon Sep 17 00:00:00 2001 From: MorellThomas Date: Sat, 8 Jul 2023 18:17:55 +0200 Subject: [PATCH] Includes the PaSiMap button in the CalculationChooser --- resources/lang/Messages.properties | 3 +- resources/lang/Messages_es.properties | 3 +- src/jalview/gui/CalculationChooser.java | 71 +++++++++++++++++++++++++++++-- 3 files changed, 72 insertions(+), 5 deletions(-) diff --git a/resources/lang/Messages.properties b/resources/lang/Messages.properties index 3843ddb..980e9bc 100644 --- a/resources/lang/Messages.properties +++ b/resources/lang/Messages.properties @@ -83,7 +83,7 @@ action.scale_right = Scale Right action.by_tree_order = By Tree Order action.sort = Sort action.calculate_tree = Calculate Tree... -action.calculate_tree_pca = Calculate Tree or PCA... +action.calculate_tree_pca = Calculate Tree, PCA or PaSiMap... action.help = Help action.by_annotation = By Annotation... action.invert_sequence_selection = Invert Sequence Selection @@ -170,6 +170,7 @@ label.amend = Amend label.undo_command = Undo {0} label.redo_command = Redo {0} label.principal_component_analysis = Principal Component Analysis +label.pasimap = PaSiMap label.average_distance_identity = Average Distance Using % Identity label.neighbour_joining_identity = Neighbour Joining Using % Identity label.choose_calculation = Choose Calculation diff --git a/resources/lang/Messages_es.properties b/resources/lang/Messages_es.properties index d0bfd65..547d95b 100644 --- a/resources/lang/Messages_es.properties +++ b/resources/lang/Messages_es.properties @@ -81,7 +81,7 @@ action.scale_right = Escala derecha action.by_tree_order = Por orden del árbol action.sort = Ordenar action.calculate_tree = Calcular árbol... -action.calculate_tree_pca = Calcular árbol o ACP... +action.calculate_tree_pca = Calcular árbol, ACP o PaSiMap... action.help = Ayuda action.by_annotation = Por anotación... action.invert_sequence_selection = Invertir selección de secuencias @@ -164,6 +164,7 @@ label.amend = Modificar label.undo_command = Deshacer {0} label.redo_command = Rehacer {0} label.principal_component_analysis = Análisis del Componente Principal +label.pasimap = PaSiMap label.average_distance_identity = Distancia Media Usando % de Identidad label.neighbour_joining_identity = Unir vecinos utilizando % de Identidad label.choose_calculation = Elegir el cálculo diff --git a/src/jalview/gui/CalculationChooser.java b/src/jalview/gui/CalculationChooser.java index f7e5413..0f6c257 100644 --- a/src/jalview/gui/CalculationChooser.java +++ b/src/jalview/gui/CalculationChooser.java @@ -80,10 +80,14 @@ public class CalculationChooser extends JPanel 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; @@ -111,6 +115,9 @@ public class CalculationChooser extends JPanel */ private PCAPanel pcaPanel; + //&! change to PaSiMapPanel + private PCAPanel pasimapPanel; + /** * Constructor * @@ -157,6 +164,10 @@ public class CalculationChooser extends JPanel 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); @@ -186,6 +197,14 @@ public class CalculationChooser extends JPanel 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); @@ -193,6 +212,7 @@ public class CalculationChooser extends JPanel ButtonGroup calcTypes = new ButtonGroup(); calcTypes.add(pca); + calcTypes.add(pasimap); //&! add pasimap to the calculation types calcTypes.add(neighbourJoining); calcTypes.add(averageDistance); @@ -205,6 +225,7 @@ public class CalculationChooser extends JPanel } }; pca.addActionListener(calcChanged); + pasimap.addActionListener(calcChanged); // add the calcChanged ActionListener to pasimap --> <++> idk neighbourJoining.addActionListener(calcChanged); averageDistance.addActionListener(calcChanged); @@ -314,12 +335,13 @@ public class CalculationChooser extends JPanel * 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); @@ -514,19 +536,24 @@ public class CalculationChooser extends JPanel 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(); } /** @@ -598,6 +625,44 @@ public class CalculationChooser extends JPanel } /** + * 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 PCAPanel(af.alignPanel, modelName, params); + new Thread(pasimapPanel).start(); + + } + + /** * */ protected void closeFrame() -- 1.7.10.2