Merge branch 'develop' into features/JAL-2393customMatrices
[jalview.git] / src / jalview / analysis / PCA.java
index 738da7d..5d2e7e7 100755 (executable)
  */
 package jalview.analysis;
 
+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;
@@ -46,12 +48,15 @@ public class PCA implements Runnable
   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");
   }
@@ -219,8 +224,7 @@ public class PCA implements Runnable
    * 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
@@ -230,13 +234,26 @@ public class PCA implements Runnable
     MatrixI result = null;
     if (scoreModel instanceof SimilarityScoreModelI)
     {
-      result = ((SimilarityScoreModelI) scoreModel).findSimilarities(av);
+      result = ((SimilarityScoreModelI) scoreModel).findSimilarities(av,
+              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)
     {
-      result = ((DistanceScoreModelI) scoreModel).findDistances(av);
-      double maxDistance = result.getMaxValue();
-      result.subtractAllFrom(maxDistance);
+      /*
+       * find distances and convert to similarity scores
+       * reverseRange(false) preserves but reverses the min-max range
+       */
+      result = ((DistanceScoreModelI) scoreModel).findDistances(av,
+              similarityParams);
+      result.reverseRange(false);
     }
     else
     {