JAL-2416 tidy up after switch from ' ' to '-' in score matrices
[jalview.git] / src / jalview / analysis / scoremodels / ScoreMatrix.java
index b73f826..f7da9f3 100644 (file)
@@ -30,10 +30,18 @@ import jalview.util.Comparison;
 
 import java.util.Arrays;
 
+/**
+ * A class that models a substitution score matrix for any given alphabet of
+ * symbols
+ */
 public class ScoreMatrix implements SimilarityScoreModelI,
         PairwiseScoreModelI
 {
-  private static final char GAP_CHARACTER = Comparison.GAP_DASH;
+  /*
+   * this fields records which gap character (if any) is used in the alphabet;
+   * space, dash or dot are recognised as gap symbols
+   */
+  private char gapCharacter = '0';
 
   /*
    * Jalview 2.10.1 treated gaps as X (peptide) or N (nucleotide)
@@ -132,17 +140,25 @@ public class ScoreMatrix implements SimilarityScoreModelI,
    * Mappings are added automatically for lower case symbols (for non case
    * sensitive scoring), unless they are explicitly present in the alphabet (are
    * scored separately in the score matrix).
+   * <p>
+   * the gap character (space, dash or dot) included in the alphabet (if any) is
+   * recorded in a field
    * 
    * @param alphabet
    * @return
    */
-  static short[] buildSymbolIndex(char[] alphabet)
+  short[] buildSymbolIndex(char[] alphabet)
   {
     short[] index = new short[MAX_ASCII + 1];
     Arrays.fill(index, UNMAPPED);
     short pos = 0;
     for (char c : alphabet)
     {
+      if (Comparison.isGap(c))
+      {
+        gapCharacter = c;
+      }
+
       if (c <= MAX_ASCII)
       {
         index[c] = pos;
@@ -229,6 +245,19 @@ public class ScoreMatrix implements SimilarityScoreModelI,
   }
 
   /**
+   * Answers the matrix index for the gap character, or -1 if unmapped in the
+   * matrix. Use this method only if using <code>getMatrix</code> in order to
+   * compute scores directly (without symbol lookup) for efficiency.
+   * 
+   * @return
+   * @see #getMatrix()
+   */
+  public int getGapIndex()
+  {
+    return getMatrixIndex(gapCharacter);
+  }
+
+  /**
    * Returns the pairwise score for substituting c with d, or zero if c or d is
    * an unscored or unexpected character
    */
@@ -365,7 +394,7 @@ public class ScoreMatrix implements SimilarityScoreModelI,
           SimilarityParamsI options)
   {
     char gapChar = scoreGapAsAny ? (seqstrings.isNa() ? 'N' : 'X')
-            : Comparison.GAP_DASH;
+            : gapCharacter;
     String[] seqs = seqstrings.getSequenceStrings(gapChar);
     return findSimilarities(seqs, options);
   }
@@ -424,8 +453,8 @@ public class ScoreMatrix implements SimilarityScoreModelI,
         }
       }
 
-      char c1 = i >= len1 ? GAP_CHARACTER : seq1.charAt(i);
-      char c2 = i >= len2 ? GAP_CHARACTER : seq2.charAt(i);
+      char c1 = i >= len1 ? gapCharacter : seq1.charAt(i);
+      char c2 = i >= len2 ? gapCharacter : seq2.charAt(i);
       boolean gap1 = Comparison.isGap(c1);
       boolean gap2 = Comparison.isGap(c2);