X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fanalysis%2Fscoremodels%2FScoreMatrix.java;h=b206339805cf4d1f026c15eb34f3987a21a543b9;hb=6265810309656855a08efc090c42bba8856a7163;hp=9bec6e4cd7d795f6d0b621cf34c74f2171619f58;hpb=e5c87d2dd1d3ebceea890ef92c8a6374c62d3c83;p=jalview.git diff --git a/src/jalview/analysis/scoremodels/ScoreMatrix.java b/src/jalview/analysis/scoremodels/ScoreMatrix.java index 9bec6e4..b206339 100644 --- a/src/jalview/analysis/scoremodels/ScoreMatrix.java +++ b/src/jalview/analysis/scoremodels/ScoreMatrix.java @@ -20,7 +20,9 @@ */ package jalview.analysis.scoremodels; +import jalview.api.AlignmentViewPanel; import jalview.api.analysis.PairwiseScoreModelI; +import jalview.api.analysis.ScoreModelI; import jalview.api.analysis.SimilarityParamsI; import jalview.datamodel.AlignmentView; import jalview.math.Matrix; @@ -31,10 +33,11 @@ import java.util.Arrays; /** * A class that models a substitution score matrix for any given alphabet of - * symbols. Instances of this class are immutable and thread-safe. + * symbols. Instances of this class are immutable and thread-safe, so the same + * object is returned from calls to getInstance(). */ -public class ScoreMatrix extends SimilarityScoreModel implements - PairwiseScoreModelI +public class ScoreMatrix extends SimilarityScoreModel + implements PairwiseScoreModelI { private static final char GAP_CHARACTER = Comparison.GAP_DASH; @@ -95,7 +98,9 @@ public class ScoreMatrix extends SimilarityScoreModel implements private float minValue; private float maxValue; - + + private boolean symmetric; + /** * Constructor given a name, symbol alphabet, and matrix of scores for pairs * of symbols. The matrix should be square and of the same size as the @@ -127,8 +132,8 @@ public class ScoreMatrix extends SimilarityScoreModel implements * @param values * Pairwise scores indexed according to the symbol alphabet */ - public ScoreMatrix(String theName, String theDescription, - char[] alphabet, float[][] values) + public ScoreMatrix(String theName, String theDescription, char[] alphabet, + float[][] values) { if (alphabet.length != values.length) { @@ -153,6 +158,8 @@ public class ScoreMatrix extends SimilarityScoreModel implements findMinMax(); + symmetric = checkSymmetry(); + /* * crude heuristic for now... */ @@ -160,6 +167,27 @@ public class ScoreMatrix extends SimilarityScoreModel implements } /** + * Answers true if the matrix is symmetric, else false. Usually, substitution + * matrices are symmetric, which allows calculations to be short cut. + * + * @return + */ + private boolean checkSymmetry() + { + for (int i = 0; i < matrix.length; i++) + { + for (int j = i; j < matrix.length; j++) + { + if (matrix[i][j] != matrix[j][i]) + { + return false; + } + } + } + return true; + } + + /** * Record the minimum and maximum score values */ protected void findMinMax() @@ -451,16 +479,20 @@ public class ScoreMatrix extends SimilarityScoreModel implements * @param params * @return */ - protected MatrixI findSimilarities(String[] seqs, SimilarityParamsI params) + protected MatrixI findSimilarities(String[] seqs, + SimilarityParamsI params) { - double[][] values = new double[seqs.length][]; + double[][] values = new double[seqs.length][seqs.length]; for (int row = 0; row < seqs.length; row++) { - values[row] = new double[seqs.length]; - for (int col = 0; col < seqs.length; col++) + for (int col = symmetric ? row : 0; col < seqs.length; col++) { double total = computeSimilarity(seqs[row], seqs[col], params); values[row][col] = total; + if (symmetric) + { + values[col][row] = total; + } } } return new Matrix(values); @@ -582,4 +614,15 @@ public class ScoreMatrix extends SimilarityScoreModel implements { return maxValue; } + + @Override + public ScoreModelI getInstance(AlignmentViewPanel avp) + { + return this; + } + + public boolean isSymmetric() + { + return symmetric; + } }