JAL-2361 make a modified saved scheme the backout checkpoint for Cancel
[jalview.git] / src / jalview / viewmodel / PCAModel.java
index 3b6829e..0623dab 100644 (file)
@@ -30,6 +30,13 @@ import java.util.Vector;
 
 public class PCAModel
 {
+  /*
+   * Jalview 2.10.1 treated gaps as X (peptide) or N (nucleotide)
+   * for pairwise scoring; 2.10.2 uses gap score (last column) in
+   * score matrix (JAL-2397)
+   * Set this flag to true (via Groovy) for 2.10.1 behaviour
+   */
+  private static boolean scoreGapAsAny = false;
 
   public PCAModel(AlignmentView seqstrings2, SequenceI[] seqs2,
           boolean nucleotide2)
@@ -69,7 +76,9 @@ public class PCAModel
 
   public void run()
   {
-    pca = new PCA(seqstrings.getSequenceStrings(' '), nucleotide,
+    char gapChar = scoreGapAsAny ? (nucleotide ? 'N' : 'X') : ' ';
+    String[] sequenceStrings = seqstrings.getSequenceStrings(gapChar);
+    pca = new PCA(sequenceStrings, nucleotide,
             score_matrix);
     pca.setJvCalcMode(jvCalcMode);
     pca.run();
@@ -82,12 +91,14 @@ public class PCAModel
       ii++;
     }
 
-    top = pca.getM().height() - 1;
+    int height = pca.getHeight();
+    // top = pca.getM().height() - 1;
+    top = height - 1;
 
     points = new Vector<SequencePoint>();
     float[][] scores = pca.getComponents(top - 1, top - 2, top - 3, 100);
 
-    for (int i = 0; i < pca.getM().height(); i++)
+    for (int i = 0; i < height; i++)
     {
       SequencePoint sp = new SequencePoint(seqs[i], scores[i]);
       points.addElement(sp);
@@ -96,7 +107,7 @@ public class PCAModel
 
   public void updateRc(RotatableCanvasI rc)
   {
-    rc.setPoints(points, pca.getM().height());
+    rc.setPoints(points, pca.getHeight());
   }
 
   public boolean isNucleotide()
@@ -134,7 +145,7 @@ public class PCAModel
     // note: actual indices for components are dim1-1, etc (patch for JAL-1123)
     float[][] scores = pca.getComponents(dim1 - 1, dim2 - 1, dim3 - 1, 100);
 
-    for (int i = 0; i < pca.getM().height(); i++)
+    for (int i = 0; i < pca.getHeight(); i++)
     {
       points.elementAt(i).coord = scores[i];
     }