X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fanalysis%2FPCA.java;h=4d691c0f01264683c52e9a5ea59fa4c1851dc35e;hb=f932cb5bb08dce9d7441c788d6996efaef53d15a;hp=ecbe4ab45d75930e4118305b31f3733acf2feab1;hpb=588042b69abf8e60bcc950b24c283933c7dd422f;p=jalview.git diff --git a/src/jalview/analysis/PCA.java b/src/jalview/analysis/PCA.java index ecbe4ab..4d691c0 100755 --- a/src/jalview/analysis/PCA.java +++ b/src/jalview/analysis/PCA.java @@ -22,31 +22,35 @@ import jalview.datamodel.*; import jalview.math.*; -import jalview.util.*; -import java.awt.*; - -import java.io.*; - - -public class PCA implements Runnable { +/** + * Performs Principal Component Analysis on given sequences + * + * @author $author$ + * @version $Revision$ + */ +public class PCA implements Runnable +{ Matrix m; Matrix symm; Matrix m2; double[] eigenvalue; Matrix eigenvector; - public PCA(Matrix m) { - this.m = m; - } - public PCA(SequenceI[] s) { - Runtime rt = Runtime.getRuntime(); + /** + * Creates a new PCA object. + * + * @param s Set of sequences to perform PCA on + */ + public PCA(SequenceI[] s) + { BinarySequence[] bs = new BinarySequence[s.length]; int ii = 0; - while ((ii < s.length) && (s[ii] != null)) { + while ((ii < s.length) && (s[ii] != null)) + { bs[ii] = new BinarySequence(s[ii]); bs[ii].encode(); ii++; @@ -55,7 +59,8 @@ public class PCA implements Runnable { BinarySequence[] bs2 = new BinarySequence[s.length]; ii = 0; - while ((ii < s.length) && (s[ii] != null)) { + while ((ii < s.length) && (s[ii] != null)) + { bs2[ii] = new BinarySequence(s[ii]); bs2[ii].blosumEncode(); ii++; @@ -65,7 +70,8 @@ public class PCA implements Runnable { //printMemory(rt); int count = 0; - while ((count < bs.length) && (bs[count] != null)) { + while ((count < bs.length) && (bs[count] != null)) + { count++; } @@ -73,7 +79,8 @@ public class PCA implements Runnable { double[][] seqmat2 = new double[count][bs2[0].getDBinary().length]; int i = 0; - while (i < count) { + while (i < count) + { seqmat[i] = bs[i].getDBinary(); seqmat2[i] = bs2[i].getDBinary(); i++; @@ -85,34 +92,47 @@ public class PCA implements Runnable { m = new Matrix(seqmat, count, bs[0].getDBinary().length); m2 = new Matrix(seqmat2, count, bs2[0].getDBinary().length); - //System.out.println("Created matrix"); - printMemory(rt); - } + } - public static void printMemory(Runtime rt) { - System.out.println("PCA:Free memory = " + rt.freeMemory()); - } + /** + * Returns the matrix used in PCA calculation + * + * @return java.math.Matrix object + */ - public Matrix getM() { + public Matrix getM() + { return m; - } - - public double[] getEigenvector(int i) { - return eigenvector.getColumn(i); - } - - public double getEigenvalue(int i) { + } + + /** + * Returns Eigenvalue + * + * @param i Index of diagonal within matrix + * + * @return Returns value of diagonal from matrix + */ + public double getEigenvalue(int i) + { return eigenvector.d[i]; } - public float[][] getComponents(int l, int n, int mm) { - return getComponents(l, n, mm, 1); - } - - public float[][] getComponents(int l, int n, int mm, float factor) { + /** + * DOCUMENT ME! + * + * @param l DOCUMENT ME! + * @param n DOCUMENT ME! + * @param mm DOCUMENT ME! + * @param factor DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public float[][] getComponents(int l, int n, int mm, float factor) + { float[][] out = new float[m.rows][3]; - for (int i = 0; i < m.rows; i++) { + for (int i = 0; i < m.rows; i++) + { out[i][0] = (float) component(i, l) * factor; out[i][1] = (float) component(i, n) * factor; out[i][2] = (float) component(i, mm) * factor; @@ -121,51 +141,52 @@ public class PCA implements Runnable { return out; } - public double[] component(int n) { + /** + * DOCUMENT ME! + * + * @param n DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public double[] component(int n) + { // n = index of eigenvector double[] out = new double[m.rows]; - for (int i = 0; i < m.rows; i++) { + for (int i = 0; i < m.rows; i++) + { out[i] = component(i, n); } return out; } - public double component(int row, int n) { + /** + * DOCUMENT ME! + * + * @param row DOCUMENT ME! + * @param n DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + double component(int row, int n) + { double out = 0.0; - for (int i = 0; i < symm.cols; i++) { + for (int i = 0; i < symm.cols; i++) + { out += (symm.value[row][i] * eigenvector.value[i][n]); } return out / eigenvector.d[n]; } - public void checkEigenvector(int n, PrintStream ps) { - ps.println(" --- Eigenvector " + n + " --- "); - - double[] eigenv = eigenvector.getColumn(n); - - for (int i = 0; i < eigenv.length; i++) { - Format.print(ps, "%15.4f", eigenv[i]); - } - - System.out.println(); - - double[] neigenv = symm.vectorPostMultiply(eigenv); - System.out.println(" --- symmat * eigenv / lambda --- "); - - if (eigenvector.d[n] > 1e-4) { - for (int i = 0; i < neigenv.length; i++) { - Format.print(System.out, "%15.4f", neigenv[i] / eigenvector.d[n]); - } - } - - System.out.println(); - } - public void run() { + /** + * DOCUMENT ME! + */ + public void run() + { Matrix mt = m.transpose(); // System.out.println(" --- OrigT * Orig ---- ");