JAL-1767 save PCA D and E vectors instead of 'details' text
[jalview.git] / src / jalview / analysis / PCA.java
index b3268df..d51f00e 100755 (executable)
@@ -22,6 +22,7 @@ package jalview.analysis;
 
 import jalview.api.analysis.ScoreModelI;
 import jalview.api.analysis.SimilarityParamsI;
+import jalview.bin.Cache;
 import jalview.datamodel.AlignmentView;
 import jalview.datamodel.Point;
 import jalview.math.MatrixI;
@@ -47,11 +48,9 @@ public class PCA implements Runnable
    */
   private MatrixI pairwiseScores;
 
-  private MatrixI afterTred;
+  private MatrixI tridiagonal;
 
-  private MatrixI eigenvector;
-
-  private String details;
+  private MatrixI eigenMatrix;
 
   /**
    * Constructor given the sequences to compute for, the similarity model to
@@ -78,7 +77,7 @@ public class PCA implements Runnable
    */
   public double getEigenvalue(int i)
   {
-    return eigenvector.getD()[i];
+    return eigenMatrix.getD()[i];
   }
 
   /**
@@ -147,10 +146,10 @@ public class PCA implements Runnable
 
     for (int i = 0; i < pairwiseScores.width(); i++)
     {
-      out += (pairwiseScores.getValue(row, i) * eigenvector.getValue(i, n));
+      out += (pairwiseScores.getValue(row, i) * eigenMatrix.getValue(i, n));
     }
 
-    return out / eigenvector.getD()[n];
+    return out / eigenMatrix.getD()[n];
   }
 
   /**
@@ -161,32 +160,38 @@ public class PCA implements Runnable
    */
   public String getDetails()
   {
-    return details;
-    /*
     StringBuilder sb = new StringBuilder(1024);
     sb.append("PCA calculation using ").append(scoreModel.getName())
             .append(" sequence similarity matrix\n========\n\n");
     PrintStream ps = wrapOutputBuffer(sb);
     
+    /*
+     * pairwise similarity scores
+     */
     sb.append(" --- OrigT * Orig ---- \n");
     pairwiseScores.print(ps, "%8.2f");
     
+    /*
+     * tridiagonal matrix, with D and E vectors
+     */
     sb.append(" ---Tridiag transform matrix ---\n");
     sb.append(" --- D vector ---\n");
-    afterTred.printD(ps, "%15.4e");
+    tridiagonal.printD(ps, "%15.4e");
     ps.println();
     sb.append("--- E vector ---\n");
-    afterTred.printE(ps, "%15.4e");
+    tridiagonal.printE(ps, "%15.4e");
     ps.println();
     
+    /*
+     * eigenvalues matrix, with D vector
+     */
     sb.append(" --- New diagonalization matrix ---\n");
-    eigenvector.print(ps, "%8.2f");
+    eigenMatrix.print(ps, "%8.2f");
     sb.append(" --- Eigenvalues ---\n");
-    eigenvector.printD(ps, "%15.4e");
+    eigenMatrix.printD(ps, "%15.4e");
     ps.println();
     
     return sb.toString();
-    */
   }
 
   /**
@@ -195,53 +200,29 @@ public class PCA implements Runnable
   @Override
   public void run()
   {
-    /*
-     * 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);
-
     try
     {
-      eigenvector = scoreModel.findSimilarities(seqs, similarityParams);
-
-      sb.append(" --- OrigT * Orig ---- \n");
-      eigenvector.print(ps, "%8.2f");
-
-      pairwiseScores = eigenvector.copy();
-
-      eigenvector.tred();
-
-      afterTred = eigenvector.copy();
-
-      sb.append(" ---Tridiag transform matrix ---\n");
-      sb.append(" --- D vector ---\n");
-      afterTred.printD(ps, "%15.4e");
-      ps.println();
-      sb.append("--- E vector ---\n");
-      afterTred.printE(ps, "%15.4e");
-      ps.println();
-
-      // Now produce the diagonalization matrix
-      eigenvector.tqli();
+      /*
+       * sequence pairwise similarity scores
+       */
+      pairwiseScores = scoreModel.findSimilarities(seqs, similarityParams);
+
+      /*
+       * tridiagonal matrix
+       */
+      tridiagonal = pairwiseScores.copy();
+      tridiagonal.tred();
+
+      /*
+       * the diagonalization matrix
+       */
+      eigenMatrix = tridiagonal.copy();
+      eigenMatrix.tqli();
     } catch (Exception q)
     {
+      Cache.log.error("Error computing PCA:  " + q.getMessage());
       q.printStackTrace();
-      sb.append("\n*** Unexpected exception when performing PCA ***\n"
-              + q.getLocalizedMessage());
-      sb.append(
-              "*** Matrices below may not be fully diagonalised. ***\n");
     }
-
-    sb.append(" --- New diagonalization matrix ---\n");
-    eigenvector.print(ps, "%8.2f");
-    sb.append(" --- Eigenvalues ---\n");
-    eigenvector.printD(ps, "%15.4e");
-    ps.println();
-
-    details = sb.toString();
   }
 
   /**
@@ -300,16 +281,21 @@ public class PCA implements Runnable
 
   public MatrixI getEigenmatrix()
   {
-    return eigenvector;
+    return eigenMatrix;
   }
 
   public void setEigenmatrix(MatrixI m)
   {
-    eigenvector = m;
+    eigenMatrix = m;
+  }
+
+  public MatrixI getTridiagonal()
+  {
+    return tridiagonal;
   }
 
-  public void setDetails(String d)
+  public void setTridiagonal(MatrixI tridiagonal)
   {
-    details = d;
+    this.tridiagonal = tridiagonal;
   }
 }