JAL-1767 minor field tidying prior to functional changes
[jalview.git] / src / jalview / analysis / PCA.java
index 5d2e7e7..d11d322 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;
 
@@ -35,30 +32,37 @@ import java.io.PrintStream;
  */
 public class PCA implements Runnable
 {
-  boolean jvCalcMode = true;
-
-  MatrixI symm;
+  /*
+   * inputs
+   */
+  final private AlignmentView seqs;
 
-  double[] eigenvalue;
+  final private ScoreModelI scoreModel;
 
-  MatrixI eigenvector;
+  final private SimilarityParamsI similarityParams;
 
-  StringBuilder details = new StringBuilder(1024);
+  /*
+   * outputs
+   */
+  private MatrixI symm;
 
-  private AlignmentView seqs;
+  private MatrixI eigenvector;
 
-  private ScoreModelI scoreModel;
-  
-  private SimilarityParamsI similarityParams;
+  private String details;
 
-  public PCA(AlignmentView s, ScoreModelI sm, SimilarityParamsI options)
+  /**
+   * Constructor given the sequences to compute for, the similarity model to
+   * use, and a set of parameters for sequence comparison
+   * 
+   * @param sequences
+   * @param sm
+   * @param options
+   */
+  public PCA(AlignmentView sequences, ScoreModelI sm, SimilarityParamsI options)
   {
-    this.seqs = s;
-    this.similarityParams = options;
+    this.seqs = sequences;
     this.scoreModel = sm;
-    
-    details.append("PCA calculation using " + sm.getName()
-            + " sequence similarity matrix\n========\n\n");
+    this.similarityParams = options;
   }
 
   /**
@@ -145,53 +149,47 @@ public class PCA implements Runnable
     return out / eigenvector.getD()[n];
   }
 
+  /**
+   * Answers a formatted text report of the PCA calculation results (matrices
+   * and eigenvalues) suitable for display
+   * 
+   * @return
+   */
   public String getDetails()
   {
-    return details.toString();
+    return details;
   }
 
   /**
-   * DOCUMENT ME!
+   * Performs the PCA calculation
    */
   @Override
   public void run()
   {
-    PrintStream ps = new PrintStream(System.out)
-    {
-      @Override
-      public void print(String x)
-      {
-        details.append(x);
-      }
-
-      @Override
-      public void println()
-      {
-        details.append("\n");
-      }
-    };
+    /*
+     * print details to a string buffer as they are computed
+     */
+    StringBuilder sb = new StringBuilder(1024);
+    sb.append("PCA calculation using ").append(scoreModel.getName())
+            .append(" sequence similarity matrix\n========\n\n");
+    PrintStream ps = wrapOutputBuffer(sb);
 
-    // long now = System.currentTimeMillis();
     try
     {
-      details.append("PCA Calculation Mode is "
-              + (jvCalcMode ? "Jalview variant" : "Original SeqSpace")
-              + "\n");
+      eigenvector = scoreModel.findSimilarities(seqs, similarityParams);
 
-      eigenvector = computeSimilarity(seqs);
-
-      details.append(" --- OrigT * Orig ---- \n");
+      sb.append(" --- OrigT * Orig ---- \n");
       eigenvector.print(ps, "%8.2f");
 
       symm = eigenvector.copy();
 
       eigenvector.tred();
 
-      details.append(" ---Tridiag transform matrix ---\n");
-      details.append(" --- D vector ---\n");
+      sb.append(" ---Tridiag transform matrix ---\n");
+      sb.append(" --- D vector ---\n");
       eigenvector.printD(ps, "%15.4e");
       ps.println();
-      details.append("--- E vector ---\n");
+      sb.append("--- E vector ---\n");
       eigenvector.printE(ps, "%15.4e");
       ps.println();
 
@@ -200,73 +198,45 @@ public class PCA implements Runnable
     } catch (Exception q)
     {
       q.printStackTrace();
-      details.append("\n*** Unexpected exception when performing PCA ***\n"
+      sb.append("\n*** Unexpected exception when performing PCA ***\n"
               + q.getLocalizedMessage());
-      details.append("*** Matrices below may not be fully diagonalised. ***\n");
+      sb.append(
+              "*** Matrices below may not be fully diagonalised. ***\n");
     }
 
-    details.append(" --- New diagonalization matrix ---\n");
+    sb.append(" --- New diagonalization matrix ---\n");
     eigenvector.print(ps, "%8.2f");
-    details.append(" --- Eigenvalues ---\n");
+    sb.append(" --- Eigenvalues ---\n");
     eigenvector.printD(ps, "%15.4e");
     ps.println();
-    /*
-     * for (int seq=0;seq<symm.rows;seq++) { ps.print("\"Seq"+seq+"\""); for
-     * (int ev=0;ev<symm.rows; ev++) {
-     * 
-     * ps.print(","+component(seq, ev)); } ps.println(); }
-     */
-    // System.out.println(("PCA.run() took "
-    // + (System.currentTimeMillis() - now) + "ms"));
+
+    details = sb.toString();
   }
 
   /**
-   * 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.
+   * Returns a PrintStream that wraps (sends its output to) the given
+   * StringBuilder
    * 
-   * @param av
+   * @param sb
    * @return
    */
-  MatrixI computeSimilarity(AlignmentView av)
+  protected PrintStream wrapOutputBuffer(StringBuilder sb)
   {
-    MatrixI result = null;
-    if (scoreModel instanceof SimilarityScoreModelI)
+    PrintStream ps = new PrintStream(System.out)
     {
-      result = ((SimilarityScoreModelI) scoreModel).findSimilarities(av,
-              similarityParams);
-      if (scoreModel instanceof PIDModel)
+      @Override
+      public void print(String x)
       {
-        /*
-         * scale % identities to width of alignment for backwards
-         * compatibility with Jalview 2.10.1 SeqSpace PCA calculation 
-         */
-        result.multiply(av.getWidth() / 100d);
+        sb.append(x);
       }
-    }
-    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);
-      result.reverseRange(false);
-    }
-    else
-    {
-      System.err
-              .println("Unexpected type of score model, cannot calculate similarity");
-    }
 
-    return result;
-  }
-
-  public void setJvCalcMode(boolean calcMode)
-  {
-    this.jvCalcMode = calcMode;
+      @Override
+      public void println()
+      {
+        sb.append("\n");
+      }
+    };
+    return ps;
   }
 
   /**