*/
package jalview.analysis;
-import jalview.analysis.scoremodels.SimilarityParams;
+import jalview.analysis.scoremodels.PIDModel;
import jalview.api.analysis.DistanceScoreModelI;
import jalview.api.analysis.ScoreModelI;
+import jalview.api.analysis.SimilarityParamsI;
import jalview.api.analysis.SimilarityScoreModelI;
import jalview.datamodel.AlignmentView;
import jalview.math.MatrixI;
private AlignmentView seqs;
private ScoreModelI scoreModel;
+
+ private SimilarityParamsI similarityParams;
- public PCA(AlignmentView s, ScoreModelI sm)
+ public PCA(AlignmentView s, ScoreModelI sm, SimilarityParamsI options)
{
this.seqs = s;
-
- scoreModel = sm;
+ this.similarityParams = options;
+ this.scoreModel = sm;
+
details.append("PCA calculation using " + sm.getName()
+ " sequence similarity matrix\n========\n\n");
}
* Computes a pairwise similarity matrix for the given sequence regions using
* the configured score model. If the score model is a similarity model, then
* it computes the result directly. If it is a distance model, then use it to
- * compute pairwise distances, and convert these to similarity scores by
- * substracting from the maximum value.
+ * compute pairwise distances, and convert these to similarity scores.
*
* @param av
* @return
MatrixI computeSimilarity(AlignmentView av)
{
MatrixI result = null;
- // TODO pass choice of params from GUI in constructo
if (scoreModel instanceof SimilarityScoreModelI)
{
result = ((SimilarityScoreModelI) scoreModel).findSimilarities(av,
- SimilarityParams.SeqSpace);
+ similarityParams);
+ if (scoreModel instanceof PIDModel)
+ {
+ /*
+ * scale % identities to width of alignment for backwards
+ * compatibility with Jalview 2.10.1 SeqSpace PCA calculation
+ */
+ result.multiply(av.getWidth() / 100d);
+ }
}
else if (scoreModel instanceof DistanceScoreModelI)
{
+ /*
+ * find distances and convert to similarity scores
+ * reverseRange(false) preserves but reverses the min-max range
+ */
result = ((DistanceScoreModelI) scoreModel).findDistances(av,
- SimilarityParams.SeqSpace);
+ similarityParams);
result.reverseRange(false);
}
else