+/*
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ *
+ * This file is part of Jalview.
+ *
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *
+ * Jalview is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
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.api.analysis.SimilarityScoreModelI;
import jalview.datamodel.AlignmentView;
import jalview.math.Matrix;
import jalview.math.MatrixI;
import jalview.util.Comparison;
/**
- * A class to provide sequence pairwise similarity based on residue identity
+ * A class to provide sequence pairwise similarity based on residue identity.
+ * Instances of this class are immutable and thread-safe, so the same object is
+ * returned from calls to getInstance().
*/
-public class PIDModel implements SimilarityScoreModelI,
- PairwiseScoreModelI
+public class PIDModel extends SimilarityScoreModel
+ implements PairwiseScoreModelI
{
private static final String NAME = "PID";
- private String description;
-
/**
* Constructor
*/
return NAME;
}
+ /**
+ * Answers null for description. If a display name is needed, use getName() or
+ * an internationalized string built from the name.
+ */
@Override
public String getDescription()
{
- return description;
+ return null;
}
@Override
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). This method is thread-safe.
+ */
@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). This
+ * method is thread-safe.
+ */
+ @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;
}
/**
protected MatrixI findSimilarities(String[] seqs,
SimilarityParamsI options)
{
- // TODO reuse code in ScoreMatrix instead somehow
- double[][] values = new double[seqs.length][];
+ /*
+ * calculation is symmetric so just compute lower diagonal
+ */
+ 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 = row; col < seqs.length; col++)
{
double total = computePID(seqs[row], seqs[col], options);
values[row][col] = total;
+ values[col][row] = total;
}
}
return new Matrix(values);
return divideBy == 0 ? 0D : 100D * total / divideBy;
}
+
+ @Override
+ public ScoreModelI getInstance(AlignmentViewPanel avp)
+ {
+ return this;
+ }
}