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;
+ }
}