X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fanalysis%2FPCA.java;h=c11610a28bc9e5f0fdc76aab450510827b7b6ba0;hb=7bc226b58110fa26d9dbd3f0c78095d06909ffc3;hp=7f3a06a8f6a1f6fe8091bcdc3c6a95935d491c4a;hpb=3481e71f3b4b1d7e703e10422a6ebbb4ecc9f21b;p=jalview.git diff --git a/src/jalview/analysis/PCA.java b/src/jalview/analysis/PCA.java index 7f3a06a..c11610a 100755 --- a/src/jalview/analysis/PCA.java +++ b/src/jalview/analysis/PCA.java @@ -1,33 +1,57 @@ -// PCA.java with an irrelevant comment - +/* + * Jalview - A Sequence Alignment Editor and Viewer + * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ package jalview.analysis; -import jalview.math.*; -import jalview.datamodel.*; -import jalview.util.*; - -import java.awt.*; import java.io.*; -public class PCA implements Runnable { +import jalview.datamodel.*; +import jalview.math.*; + +/** + * 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; + StringBuffer details = new StringBuffer(); - 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(String[] 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++; @@ -35,157 +59,181 @@ 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++; } - //System.out.println("Created binary encoding"); //printMemory(rt); + int count = 0; - int count=0; - while (count < bs.length && bs[count] != null) { + while ( (count < bs.length) && (bs[count] != null)) + { count++; } + double[][] seqmat = new double[count][bs[0].getDBinary().length]; double[][] seqmat2 = new double[count][bs2[0].getDBinary().length]; - int i=0; - while (i < count) { + int i = 0; + + while (i < count) + { seqmat[i] = bs[i].getDBinary(); seqmat2[i] = bs2[i].getDBinary(); i++; } + //System.out.println("Created array"); //printMemory(rt); // System.out.println(" --- Original matrix ---- "); - m = new Matrix(seqmat,count,bs[0].getDBinary().length); - m2 = new Matrix(seqmat2,count,bs2[0].getDBinary().length); + 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("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++) { - out[i][0] = (float)component(i,l)*factor; - out[i][1] = (float)component(i,n)*factor; - out[i][2] = (float)component(i,mm)*factor; + 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; } + 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++) { - out[i] = component(i,n); + 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++) { - out += symm.value[row][i] * eigenvector.value[i][n]; + for (int i = 0; i < symm.cols; i++) + { + out += (symm.value[row][i] * eigenvector.value[i][n]); } - return out/eigenvector.d[n]; + + return out / eigenvector.d[n]; } - public void checkEigenvector(int n,PrintStream ps) { - ps.println(" --- Eigenvector " + n + " --- "); + public String getDetails() + { + return details.toString(); + } - double[] eigenv = eigenvector.getColumn(n); + /** + * DOCUMENT ME! + */ + public void run() + { + Matrix mt = m.transpose(); - for (int i=0; i < eigenv.length;i++) { - Format.print(ps,"%15.4f",eigenv[i]); - } + details.append(" --- OrigT * Orig ---- \n"); + eigenvector = mt.preMultiply(m2); - System.out.println(); + PrintStream ps = new PrintStream(System.out) + { + public void print(String x) + { + details.append(x); + } - 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]); + public void println() + { + details.append("\n"); } - } - System.out.println(); - } + }; + + eigenvector.print(ps); - public void run() { - Matrix mt = m.transpose(); - // System.out.println(" --- OrigT * Orig ---- "); - eigenvector = mt.preMultiply(m2); - // eigenvector.print(System.out); symm = eigenvector.copy(); - //TextArea ta = new TextArea(25,72); - //TextAreaPrintStream taps = new TextAreaPrintStream(System.out,ta); - //Frame f = new Frame("PCA output"); - //f.resize(500,500); - //f.setLayout(new BorderLayout()); - //f.add("Center",ta); - //f.show(); - //symm.print(taps); - long tstart = System.currentTimeMillis(); eigenvector.tred(); - long tend = System.currentTimeMillis(); - //taps.println("Time take for tred = " + (tend-tstart) + "ms"); - //taps.println(" ---Tridiag transform matrix ---"); - //taps.println(" --- D vector ---"); - //eigenvector.printD(taps); - //taps.println(); - //taps.println(" --- E vector ---"); - // eigenvector.printE(taps); - //taps.println(); + details.append(" ---Tridiag transform matrix ---\n"); + details.append(" --- D vector ---\n"); + eigenvector.printD(ps); + ps.println(); + details.append("--- E vector ---\n"); + eigenvector.printE(ps); + ps.println(); // Now produce the diagonalization matrix - tstart = System.currentTimeMillis(); eigenvector.tqli(); - tend = System.currentTimeMillis(); - //System.out.println("Time take for tqli = " + (tend-tstart) + " ms"); - - //System.out.println(" --- New diagonalization matrix ---"); - - //System.out.println(" --- Eigenvalues ---"); - //eigenvector.printD(taps); - - //System.out.println(); - - // for (int i=0; i < eigenvector.cols; i++) { - // checkEigenvector(i,taps); - // taps.println(); - // } + details.append(" --- New diagonalization matrix ---\n"); + details.append(" --- Eigenvalues ---\n"); + eigenvector.printD(ps); + ps.println(); // taps.println(); // taps.println("Transformed sequences = "); // Matrix trans = m.preMultiply(eigenvector); // trans.print(System.out); } - }