Merge branch 'develop' into features/JAL-250_hideredundantseqs
[jalview.git] / src / jalview / analysis / scoremodels / DistanceScoreModel.java
 package jalview.analysis.scoremodels;
 
 import jalview.api.analysis.ScoreModelI;
+import jalview.api.analysis.SimilarityParamsI;
 import jalview.datamodel.AlignmentView;
-import jalview.util.Comparison;
+import jalview.math.MatrixI;
 
-public class PIDScoreModel implements ScoreModelI
+public abstract class DistanceScoreModel implements ScoreModelI
 {
-
+  /**
+   * A similarity score is calculated by first computing a distance score, and
+   * then reversing the min-max range of the score values
+   */
   @Override
-  public float[][] findDistances(AlignmentView seqData)
+  public MatrixI findSimilarities(AlignmentView seqData,
+          SimilarityParamsI options)
   {
-    String[] sequenceString = seqData
-            .getSequenceStrings(Comparison.GapChars.charAt(0));
-    int noseqs = sequenceString.length;
-    float[][] distance = new float[noseqs][noseqs];
-    for (int i = 0; i < (noseqs - 1); i++)
-    {
-      for (int j = i; j < noseqs; j++)
-      {
-        if (j == i)
-        {
-          distance[i][i] = 0;
-        }
-        else
-        {
-          distance[i][j] = 100 - Comparison.PID(sequenceString[i],
-                  sequenceString[j]);
+    MatrixI distances = findDistances(seqData, options);
 
-          distance[j][i] = distance[i][j];
-        }
-      }
-    }
-    return distance;
-  }
+    MatrixI similarities = distanceToSimilarity(distances);
 
-  @Override
-  public String getName()
-  {
-    return "PID";
+    return similarities;
   }
 
-  @Override
-  public boolean isDNA()
+  /**
+   * Converts distance scores to similarity scores, by reversing the range of
+   * score values so that max becomes min and vice versa. The input matrix is
+   * not modified.
+   * 
+   * @param distances
+   */
+  public static MatrixI distanceToSimilarity(MatrixI distances)
   {
-    return true;
-  }
+    MatrixI similarities = distances.copy();
 
-  @Override
-  public boolean isProtein()
-  {
-    return true;
-  }
+    similarities.reverseRange(false);
 
+    return similarities;
+  }
 }