JAL-789 pairwise alignment via calculations dialog, allowing score model to be changed
authorJames Procter <j.procter@dundee.ac.uk>
Sat, 16 Dec 2023 08:43:06 +0000 (08:43 +0000)
committerJim Procter <jprocter@dundee.ac.uk>
Fri, 24 May 2024 13:25:09 +0000 (14:25 +0100)
merged in with feature/JAL-4159_pasimap

src/jalview/analysis/AlignSeq.java
src/jalview/gui/CalculationChooser.java
src/jalview/gui/PaSiMapPanel.java
src/jalview/gui/PairwiseAlignPanel.java

index 1abbda7..757c8d1 100755 (executable)
@@ -24,6 +24,7 @@ import jalview.analysis.scoremodels.PIDModel;
 import jalview.analysis.scoremodels.ScoreMatrix;
 import jalview.analysis.scoremodels.ScoreModels;
 import jalview.analysis.scoremodels.SimilarityParams;
+import jalview.api.analysis.SimilarityParamsI;
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.Mapping;
@@ -1500,6 +1501,8 @@ public class AlignSeq
 
   public void setScoreMatrix(ScoreMatrix sm)
   {
-    this.scoreMatrix = sm;
+       if (sm != null) {
+               scoreMatrix = sm;
+       }
   }
 }
index c9737a1..bf67a44 100644 (file)
@@ -63,6 +63,7 @@ import javax.swing.event.InternalFrameEvent;
 
 import jalview.analysis.AlignmentUtils;
 import jalview.analysis.TreeBuilder;
+import jalview.analysis.scoremodels.ScoreMatrix;
 import jalview.analysis.scoremodels.ScoreModels;
 import jalview.analysis.scoremodels.SimilarityParams;
 import jalview.api.analysis.ScoreModelI;
@@ -87,6 +88,9 @@ public class CalculationChooser extends JPanel
 
   private static final Font VERDANA_11PT = new Font("Verdana", 0, 11);
 
+
+  private static final int MIN_PAIRWISE_SELECTION = 2;
+
   private static final int MIN_TREE_SELECTION = 3;
 
   private static final int MIN_PCA_SELECTION = 4;
@@ -113,6 +117,8 @@ public class CalculationChooser extends JPanel
 
   AlignFrame af;
 
+  JRadioButton pairwise;
+
   JRadioButton pca;
 
   JRadioButton pasimap;        
@@ -209,6 +215,9 @@ public class CalculationChooser extends JPanel
     averageDistance = new JRadioButton(
             MessageManager.getString("label.tree_calc_av"));
     averageDistance.setOpaque(false);
+    
+    pairwise = new JRadioButton(MessageManager.getString("label.pairwise_alignment"));
+    pairwise.setOpaque(false);
 
     JPanel calcChoicePanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
     calcChoicePanel.setOpaque(false);
@@ -242,12 +251,14 @@ public class CalculationChooser extends JPanel
     treePanel.add(averageDistance);
 
     calcChoicePanel.add(treePanel);
+    calcChoicePanel.add(pairwise,FlowLayout.CENTER);
 
     ButtonGroup calcTypes = new ButtonGroup();
     calcTypes.add(pca);
     calcTypes.add(pasimap);
     calcTypes.add(neighbourJoining);
     calcTypes.add(averageDistance);
+    calcTypes.add(pairwise);
 
     ActionListener calcChanged = new ActionListener()
     {
@@ -266,7 +277,7 @@ public class CalculationChooser extends JPanel
     //to do    
     ssSourceDropdown = buildSSSourcesOptionsList();
     ssSourceDropdown.setVisible(false); // Initially hide the dropdown
-
+    pairwise.addActionListener(calcChanged);
     /*
      * score models drop-down - with added tooltips!
      */
@@ -394,8 +405,10 @@ public class CalculationChooser extends JPanel
             MIN_TREE_SELECTION);
     boolean checkAverageDistance = checkEnabled(averageDistance, size,
             MIN_TREE_SELECTION);
+    boolean checkPairwise = checkEnabled(pairwise, size,
+            MIN_PAIRWISE_SELECTION);
 
-    if (checkPca || checkPasimap || checkNeighbourJoining || checkAverageDistance)
+    if (checkPca || checkPasimap || checkPca || checkNeighbourJoining || checkAverageDistance || checkPairwise)
     {
       calculate.setToolTipText(null);
       calculate.setEnabled(true);
@@ -651,6 +664,7 @@ public class CalculationChooser extends JPanel
   {
     boolean doPCA = pca.isSelected();
     boolean doPaSiMap = pasimap.isSelected();
+    boolean doPairwise= pairwise.isSelected();
     String modelName = modelNames.getSelectedItem() == null ? "" : modelNames.getSelectedItem().toString();
     String ssSource = "";
     Object selectedItem = ssSourceDropdown.getSelectedItem();
@@ -663,22 +677,35 @@ public class CalculationChooser extends JPanel
       params.setSecondaryStructureSource(ssSource);
     }
 
-    if (doPCA && !doPaSiMap)
+    if (doPCA)
     {
       openPcaPanel(modelName, params);
-    }
-    else if (doPaSiMap && !doPCA)
-    {
-      openPasimapPanel(modelName, params);
-    }
-    else
-    {
-      openTreePanel(modelName, params);
-    }
+       } else if (doPaSiMap) {
+               openPasimapPanel(modelName, params);
+       } else if (doPairwise) {
+               openPairwisePanel(modelName, params);
+       } else {
+               openTreePanel(modelName, params);
+       }
 
     closeFrame();
   }
 
+  private void openPairwisePanel(String modelName, SimilarityParamsI params)
+  {
+    ScoreModelI sm = ScoreModels.getInstance().getScoreModel(modelName, af.alignPanel);
+    if (sm==null || !(sm instanceof ScoreMatrix))
+    {
+      return;
+    }
+    JInternalFrame frame = new JInternalFrame();
+    frame.setFrameIcon(null);
+    frame.setContentPane(new PairwiseAlignPanel(af.getViewport(),(ScoreMatrix)sm));
+    Desktop.addInternalFrame(frame,
+            MessageManager.getString("action.pairwise_alignment"), 600,
+            500);    
+  }
+
   /**
    * Open a new Tree panel on the desktop
    * 
index 4a2d19d..3bf731d 100644 (file)
@@ -212,7 +212,7 @@ public class PaSiMapPanel extends GPaSiMapPanel
       }
       
       PairwiseAlignPanel pap = new PairwiseAlignPanel(av, selGroup, true,
-              GAP_OPEN_COST, GAP_EXTEND_COST, false);
+              GAP_OPEN_COST, GAP_EXTEND_COST, false, null);
       System.out.println(pap != null);
       setPairwiseAlignPanel(pap);
       getPasimapModel().calculate(pap);
index 8b59197..e8b130e 100755 (executable)
@@ -22,6 +22,8 @@ package jalview.gui;
 
 import jalview.analysis.AlignSeq;
 import jalview.analysis.scoremodels.ScoreMatrix;
+import jalview.api.analysis.ScoreModelI;
+import jalview.api.analysis.SimilarityParamsI;
 import jalview.datamodel.Alignment;
 import jalview.datamodel.AlignmentView;
 import jalview.datamodel.SequenceGroup;
@@ -86,20 +88,34 @@ public class PairwiseAlignPanel extends GPairwiseAlignPanel
    * Creates a new PairwiseAlignPanel object.
    * 
    * @param viewport
-   *          DOCUMENT ME!
+   *          contains selected sequences to align
    * @param endGaps ~ toggle gaps and the beginning and end of sequences
    */
   public PairwiseAlignPanel(AlignmentViewport viewport)
   {
-    this(viewport, null, false, 120, 20, true);        // default penalties used in AlignSeq
+    this(viewport, null, false, 120, 20, true, null);  // default penalties used in AlignSeq
+  }
+  public PairwiseAlignPanel(AlignmentViewport viewport, ScoreMatrix params)
+  {
+    this(viewport, null, false, 120, 20, true,params); // default penalties used in AlignSeq
   }
   public PairwiseAlignPanel(AlignmentViewport viewport, boolean endGaps, int gapOpenCost, int gapExtendCost)
   {
-    this(viewport, null, endGaps, gapOpenCost, gapExtendCost, true);
+    this(viewport, null, endGaps, gapOpenCost, gapExtendCost, true, null);
   }
 
+  /**
+   * Create a new pairwise alignpanel with specified parameters and score model, and optionally start the calculation
+   * @param viewport
+   * @param selection
+   * @param endGaps
+   * @param gapOpenCost
+   * @param gapExtendCost
+   * @param run
+   * @param scoreMatrix
+   */
   public PairwiseAlignPanel(AlignmentViewport viewport, SequenceGroup selection, boolean  endGaps,
-          int gapOpenCost, int gapExtendCost, boolean run)
+          int gapOpenCost, int gapExtendCost, boolean run, ScoreMatrix scoreMatrix)
   {
     super();
     this.av = viewport;
@@ -108,9 +124,11 @@ public class PairwiseAlignPanel extends GPairwiseAlignPanel
     this.endGaps = endGaps;
     this.selection = selection;
     this.total = MiscMath.combinations(av.getAlignment().getHeight(), 2);
-
-    if (run)
-      calculate();
+    
+    if (run) {
+      calculate(scoreMatrix);
+    }
+    
     System.out.println("Creating pap");
   }
   
@@ -178,10 +196,12 @@ public class PairwiseAlignPanel extends GPairwiseAlignPanel
       {
         AlignSeq as = new AlignSeq(seqs[i], seqStrings[i], seqs[j],
                 seqStrings[j], type, GAP_OPEN_COST, GAP_EXTEND_COST);
-        if (sm != null)
-         as.setScoreMatrix(sm);
 
-        if (as.s1str.length() == 0 || as.s2str.length() == 0)
+        if (sm != null) {
+                       as.setScoreMatrix(sm);
+               }
+
+               if (as.s1str.length() == 0 || as.s2str.length() == 0)
         {
           continue;
         }