/*\r
-* Jalview - A Sequence Alignment Editor and Viewer\r
-* Copyright (C) 2005 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
+ * 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.datamodel.*;\r
-\r
-import jalview.math.*;\r
-\r
-import jalview.util.*;\r
-\r
import java.io.*;\r
\r
+import jalview.datamodel.*;\r
+import jalview.math.*;\r
\r
/**\r
* Performs Principal Component Analysis on given sequences\r
* @author $author$\r
* @version $Revision$\r
*/\r
-public class PCA implements Runnable\r
+public class PCA\r
+ implements Runnable\r
{\r
- Matrix m;\r
- Matrix symm;\r
- Matrix m2;\r
- double[] eigenvalue;\r
- Matrix eigenvector;\r
-\r
-\r
- /**\r
- * Creates a new PCA object.\r
- *\r
- * @param s Set of sequences to perform PCA on\r
- */\r
- public PCA(SequenceI[] s)\r
+ Matrix m;\r
+ Matrix symm;\r
+ Matrix m2;\r
+ double[] eigenvalue;\r
+ Matrix eigenvector;\r
+ StringBuffer details = new StringBuffer();\r
+\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
+\r
+ while ( (ii < s.length) && (s[ii] != null))\r
{\r
+ bs[ii] = new BinarySequence(s[ii]);\r
+ bs[ii].encode();\r
+ ii++;\r
+ }\r
\r
- BinarySequence[] bs = new BinarySequence[s.length];\r
- int ii = 0;\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
-\r
- BinarySequence[] bs2 = new BinarySequence[s.length];\r
- ii = 0;\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
- //System.out.println("Created binary encoding");\r
- //printMemory(rt);\r
- int count = 0;\r
-\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
-\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
-\r
- }\r
-\r
- /**\r
- * Returns the matrix used in PCA calculation\r
- *\r
- * @return java.math.Matrix object\r
- */\r
+ BinarySequence[] bs2 = new BinarySequence[s.length];\r
+ ii = 0;\r
\r
- public Matrix getM()\r
- {\r
- return m;\r
- }\r
-\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
+ while ( (ii < s.length) && (s[ii] != null))\r
{\r
- return eigenvector.d[i];\r
+ bs2[ii] = new BinarySequence(s[ii]);\r
+ bs2[ii].blosumEncode();\r
+ ii++;\r
}\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
+ //System.out.println("Created binary encoding");\r
+ //printMemory(rt);\r
+ int count = 0;\r
+\r
+ while ( (count < bs.length) && (bs[count] != null))\r
{\r
- float[][] out = new float[m.rows][3];\r
+ count++;\r
+ }\r
\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
+ double[][] seqmat = new double[count][bs[0].getDBinary().length];\r
+ double[][] seqmat2 = new double[count][bs2[0].getDBinary().length];\r
+ int i = 0;\r
\r
- return out;\r
+ while (i < count)\r
+ {\r
+ seqmat[i] = bs[i].getDBinary();\r
+ seqmat2[i] = bs2[i].getDBinary();\r
+ i++;\r
}\r
\r
- /**\r
- * DOCUMENT ME!\r
- *\r
- * @param n DOCUMENT ME!\r
- *\r
- * @return DOCUMENT ME!\r
- */\r
- public double[] component(int n)\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
+\r
+ }\r
+\r
+ /**\r
+ * Returns the matrix used in PCA calculation\r
+ *\r
+ * @return java.math.Matrix object\r
+ */\r
+\r
+ public Matrix getM()\r
+ {\r
+ return m;\r
+ }\r
+\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
+\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
{\r
- // n = index of eigenvector\r
- double[] out = new double[m.rows];\r
-\r
- for (int i = 0; i < m.rows; i++)\r
- {\r
- out[i] = component(i, n);\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
+ return out;\r
+ }\r
+\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
+ {\r
+ out[i] = component(i, n);\r
}\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
+ return out;\r
+ }\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
{\r
- double out = 0.0;\r
+ out += (symm.value[row][i] * eigenvector.value[i][n]);\r
+ }\r
\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
\r
- return out / eigenvector.d[n];\r
- }\r
+ public String getDetails()\r
+ {\r
+ return details.toString();\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ */\r
+ public void run()\r
+ {\r
+ Matrix mt = m.transpose();\r
\r
+ details.append(" --- OrigT * Orig ---- \n");\r
+ eigenvector = mt.preMultiply(m2);\r
\r
- /**\r
- * DOCUMENT ME!\r
- */\r
- public void run()\r
+ PrintStream ps = new PrintStream(System.out)\r
{\r
- Matrix mt = m.transpose();\r
-\r
- // System.out.println(" --- OrigT * Orig ---- ");\r
- eigenvector = mt.preMultiply(m2);\r
-\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
-\r
- long tend = System.currentTimeMillis();\r
-\r
- //taps.println("Time take for tred = " + (tend-tstart) + "ms");\r
- //taps.println(" ---Tridiag transform matrix ---");\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
- // Now produce the diagonalization matrix\r
- tstart = System.currentTimeMillis();\r
- eigenvector.tqli();\r
- tend = System.currentTimeMillis();\r
-\r
- //System.out.println("Time take for tqli = " + (tend-tstart) + " ms");\r
- //System.out.println(" --- New diagonalization matrix ---");\r
- //System.out.println(" --- Eigenvalues ---");\r
- //eigenvector.printD(taps);\r
- //System.out.println();\r
- // for (int i=0; i < eigenvector.cols; i++) {\r
- // checkEigenvector(i,taps);\r
- // taps.println();\r
- // }\r
- // taps.println();\r
- // taps.println("Transformed sequences = ");\r
- // Matrix trans = m.preMultiply(eigenvector);\r
- // trans.print(System.out);\r
- }\r
+ public void print(String x)\r
+ {\r
+ details.append(x);\r
+ }\r
+\r
+ public void println()\r
+ {\r
+ details.append("\n");\r
+ }\r
+ };\r
+\r
+ eigenvector.print(ps);\r
+\r
+ symm = eigenvector.copy();\r
+\r
+ eigenvector.tred();\r
+\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
+ eigenvector.tqli();\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