JAL-2403 improved ScoreModelI hierarchy as per Kira's review suggestions
[jalview.git] / src / jalview / analysis / scoremodels / PIDModel.java
index 3e940af..d537e33 100644 (file)
@@ -2,7 +2,6 @@ package jalview.analysis.scoremodels;
 
 import jalview.api.analysis.PairwiseScoreModelI;
 import jalview.api.analysis.SimilarityParamsI;
-import jalview.api.analysis.SimilarityScoreModelI;
 import jalview.datamodel.AlignmentView;
 import jalview.math.Matrix;
 import jalview.math.MatrixI;
@@ -11,7 +10,7 @@ import jalview.util.Comparison;
 /**
  * A class to provide sequence pairwise similarity based on residue identity
  */
-public class PIDModel implements SimilarityScoreModelI,
+public class PIDModel extends SimilarityScoreModel implements
         PairwiseScoreModelI
 {
   private static final String NAME = "PID";
@@ -77,12 +76,42 @@ public class PIDModel implements SimilarityScoreModelI,
     return c;
   }
 
+  /**
+   * Computes similarity scores based on pairwise percentage identity of
+   * sequences. For consistency with Jalview 2.10.1's SeqSpace mode PCA
+   * calculation, the percentage scores are rescaled to the width of the
+   * sequences (as if counts of identical residues).
+   */
   @Override
   public MatrixI findSimilarities(AlignmentView seqData,
           SimilarityParamsI options)
   {
     String[] seqs = seqData.getSequenceStrings(Comparison.GAP_DASH);
-    return findSimilarities(seqs, options);
+
+    MatrixI result = findSimilarities(seqs, options);
+
+    result.multiply(seqData.getWidth() / 100d);
+
+    return result;
+  }
+
+  /**
+   * A distance score is computed in the usual way (by reversing the range of
+   * the similarity score results), and then rescaled to percentage values
+   * (reversing the rescaling to count values done in findSimilarities)
+   */
+  @Override
+  public MatrixI findDistances(AlignmentView seqData,
+          SimilarityParamsI options)
+  {
+    MatrixI result = super.findDistances(seqData, options);
+
+    if (seqData.getWidth() != 0)
+    {
+      result.multiply(100d / seqData.getWidth());
+    }
+
+    return result;
   }
 
   /**