-// PCA.java with an irrelevant comment\r
-// PCA.java with two irrelevant comments\r
+/*\r
+ * Jalview - A Sequence Alignment Editor and Viewer\r
+ * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
+ *\r
+ * This program is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU General Public License\r
+ * as published by the Free Software Foundation; either version 2\r
+ * of the License, or (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA\r
+ */\r
package jalview.analysis;\r
\r
-import jalview.math.*;\r
-import jalview.datamodel.*;\r
-import jalview.util.*;\r
-\r
-import java.awt.*;\r
import java.io.*;\r
\r
-public class PCA implements Runnable {\r
+import jalview.datamodel.*;\r
+import jalview.math.*;\r
+\r
+/**\r
+ * Performs Principal Component Analysis on given sequences\r
+ *\r
+ * @author $author$\r
+ * @version $Revision$\r
+ */\r
+public class PCA\r
+ implements Runnable\r
+{\r
Matrix m;\r
Matrix symm;\r
Matrix m2;\r
-\r
double[] eigenvalue;\r
Matrix eigenvector;\r
+ StringBuffer details = new StringBuffer();\r
\r
- public PCA(Matrix m) {\r
- this.m = m;\r
- }\r
-\r
- public PCA(SequenceI[] s) {\r
- Runtime rt = Runtime.getRuntime();\r
+ /**\r
+ * Creates a new PCA object.\r
+ *\r
+ * @param s Set of sequences to perform PCA on\r
+ */\r
+ public PCA(String[] s)\r
+ {\r
\r
BinarySequence[] bs = new BinarySequence[s.length];\r
int ii = 0;\r
- while (ii < s.length && s[ii] != null) {\r
\r
+ while ( (ii < s.length) && (s[ii] != null))\r
+ {\r
bs[ii] = new BinarySequence(s[ii]);\r
bs[ii].encode();\r
ii++;\r
\r
BinarySequence[] bs2 = new BinarySequence[s.length];\r
ii = 0;\r
- while (ii < s.length && s[ii] != null) {\r
\r
+ while ( (ii < s.length) && (s[ii] != null))\r
+ {\r
bs2[ii] = new BinarySequence(s[ii]);\r
bs2[ii].blosumEncode();\r
ii++;\r
}\r
\r
-\r
//System.out.println("Created binary encoding");\r
//printMemory(rt);\r
+ int count = 0;\r
\r
- int count=0;\r
- while (count < bs.length && bs[count] != null) {\r
+ while ( (count < bs.length) && (bs[count] != null))\r
+ {\r
count++;\r
}\r
+\r
double[][] seqmat = new double[count][bs[0].getDBinary().length];\r
double[][] seqmat2 = new double[count][bs2[0].getDBinary().length];\r
- int i=0;\r
- while (i < count) {\r
+ int i = 0;\r
+\r
+ while (i < count)\r
+ {\r
seqmat[i] = bs[i].getDBinary();\r
seqmat2[i] = bs2[i].getDBinary();\r
i++;\r
}\r
+\r
//System.out.println("Created array");\r
//printMemory(rt);\r
// System.out.println(" --- Original matrix ---- ");\r
- m = new Matrix(seqmat,count,bs[0].getDBinary().length);\r
- m2 = new Matrix(seqmat2,count,bs2[0].getDBinary().length);\r
+ m = new Matrix(seqmat, count, bs[0].getDBinary().length);\r
+ m2 = new Matrix(seqmat2, count, bs2[0].getDBinary().length);\r
\r
- //System.out.println("Created matrix");\r
- printMemory(rt);\r
}\r
\r
- public static void printMemory(Runtime rt) {\r
- System.out.println("Free memory = " + rt.freeMemory());\r
- }\r
+ /**\r
+ * Returns the matrix used in PCA calculation\r
+ *\r
+ * @return java.math.Matrix object\r
+ */\r
\r
- public Matrix getM() {\r
+ public Matrix getM()\r
+ {\r
return m;\r
}\r
\r
- public double[] getEigenvector(int i) {\r
- return eigenvector.getColumn(i);\r
- }\r
-\r
- public double getEigenvalue(int i) {\r
+ /**\r
+ * Returns Eigenvalue\r
+ *\r
+ * @param i Index of diagonal within matrix\r
+ *\r
+ * @return Returns value of diagonal from matrix\r
+ */\r
+ public double getEigenvalue(int i)\r
+ {\r
return eigenvector.d[i];\r
}\r
- public float[][] getComponents(int l, int n, int mm) {\r
- return getComponents(l,n,mm,1);\r
- }\r
- public float[][] getComponents(int l, int n, int mm, float factor) {\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param l DOCUMENT ME!\r
+ * @param n DOCUMENT ME!\r
+ * @param mm DOCUMENT ME!\r
+ * @param factor DOCUMENT ME!\r
+ *\r
+ * @return DOCUMENT ME!\r
+ */\r
+ public float[][] getComponents(int l, int n, int mm, float factor)\r
+ {\r
float[][] out = new float[m.rows][3];\r
\r
- for (int i = 0; i < m.rows;i++) {\r
- out[i][0] = (float)component(i,l)*factor;\r
- out[i][1] = (float)component(i,n)*factor;\r
- out[i][2] = (float)component(i,mm)*factor;\r
+ for (int i = 0; i < m.rows; i++)\r
+ {\r
+ out[i][0] = (float) component(i, l) * factor;\r
+ out[i][1] = (float) component(i, n) * factor;\r
+ out[i][2] = (float) component(i, mm) * factor;\r
}\r
+\r
return out;\r
}\r
\r
- public double[] component(int n) {\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param n DOCUMENT ME!\r
+ *\r
+ * @return DOCUMENT ME!\r
+ */\r
+ public double[] component(int n)\r
+ {\r
// n = index of eigenvector\r
double[] out = new double[m.rows];\r
\r
- for (int i=0; i < m.rows; i++) {\r
- out[i] = component(i,n);\r
+ for (int i = 0; i < m.rows; i++)\r
+ {\r
+ out[i] = component(i, n);\r
}\r
+\r
return out;\r
}\r
- public double component(int row, int n) {\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param row DOCUMENT ME!\r
+ * @param n DOCUMENT ME!\r
+ *\r
+ * @return DOCUMENT ME!\r
+ */\r
+ double component(int row, int n)\r
+ {\r
double out = 0.0;\r
\r
- for (int i = 0; i < symm.cols; i++) {\r
- out += symm.value[row][i] * eigenvector.value[i][n];\r
+ for (int i = 0; i < symm.cols; i++)\r
+ {\r
+ out += (symm.value[row][i] * eigenvector.value[i][n]);\r
}\r
- return out/eigenvector.d[n];\r
+\r
+ return out / eigenvector.d[n];\r
}\r
\r
- public void checkEigenvector(int n,PrintStream ps) {\r
- ps.println(" --- Eigenvector " + n + " --- ");\r
+ public String getDetails()\r
+ {\r
+ return details.toString();\r
+ }\r
\r
- double[] eigenv = eigenvector.getColumn(n);\r
+ /**\r
+ * DOCUMENT ME!\r
+ */\r
+ public void run()\r
+ {\r
+ Matrix mt = m.transpose();\r
\r
- for (int i=0; i < eigenv.length;i++) {\r
- Format.print(ps,"%15.4f",eigenv[i]);\r
- }\r
+ details.append(" --- OrigT * Orig ---- \n");\r
+ eigenvector = mt.preMultiply(m2);\r
\r
- System.out.println();\r
+ PrintStream ps = new PrintStream(System.out)\r
+ {\r
+ public void print(String x)\r
+ {\r
+ details.append(x);\r
+ }\r
\r
- double[] neigenv = symm.vectorPostMultiply(eigenv);\r
- System.out.println(" --- symmat * eigenv / lambda --- ");\r
- if (eigenvector.d[n] > 1e-4) {\r
- for (int i=0; i < neigenv.length;i++) {\r
- Format.print(System.out,"%15.4f",neigenv[i]/eigenvector.d[n]);\r
+ public void println()\r
+ {\r
+ details.append("\n");\r
}\r
- }\r
- System.out.println();\r
- }\r
+ };\r
+\r
+ eigenvector.print(ps);\r
\r
- public void run() {\r
- Matrix mt = m.transpose();\r
- // System.out.println(" --- OrigT * Orig ---- ");\r
- eigenvector = mt.preMultiply(m2);\r
- // eigenvector.print(System.out);\r
symm = eigenvector.copy();\r
\r
- //TextArea ta = new TextArea(25,72);\r
- //TextAreaPrintStream taps = new TextAreaPrintStream(System.out,ta);\r
- //Frame f = new Frame("PCA output");\r
- //f.resize(500,500);\r
- //f.setLayout(new BorderLayout());\r
- //f.add("Center",ta);\r
- //f.show();\r
- //symm.print(taps);\r
- long tstart = System.currentTimeMillis();\r
eigenvector.tred();\r
- long tend = System.currentTimeMillis();\r
- //taps.println("Time take for tred = " + (tend-tstart) + "ms");\r
- //taps.println(" ---Tridiag transform matrix ---");\r
\r
- //taps.println(" --- D vector ---");\r
- //eigenvector.printD(taps);\r
- //taps.println();\r
- //taps.println(" --- E vector ---");\r
- // eigenvector.printE(taps);\r
- //taps.println();\r
+ details.append(" ---Tridiag transform matrix ---\n");\r
+ details.append(" --- D vector ---\n");\r
+ eigenvector.printD(ps);\r
+ ps.println();\r
+ details.append("--- E vector ---\n");\r
+ eigenvector.printE(ps);\r
+ ps.println();\r
\r
// Now produce the diagonalization matrix\r
- tstart = System.currentTimeMillis();\r
eigenvector.tqli();\r
- tend = System.currentTimeMillis();\r
- //System.out.println("Time take for tqli = " + (tend-tstart) + " ms");\r
-\r
- //System.out.println(" --- New diagonalization matrix ---");\r
-\r
- //System.out.println(" --- Eigenvalues ---");\r
- //eigenvector.printD(taps);\r
-\r
- //System.out.println();\r
-\r
- // for (int i=0; i < eigenvector.cols; i++) {\r
- // checkEigenvector(i,taps);\r
- // taps.println();\r
- // }\r
\r
+ details.append(" --- New diagonalization matrix ---\n");\r
+ details.append(" --- Eigenvalues ---\n");\r
+ eigenvector.printD(ps);\r
+ ps.println();\r
// taps.println();\r
// taps.println("Transformed sequences = ");\r
// Matrix trans = m.preMultiply(eigenvector);\r
// trans.print(System.out);\r
}\r
-\r
}\r