1 package jalview.analysis;
\r
3 import jalview.math.*;
\r
4 import jalview.datamodel.*;
\r
5 import jalview.util.*;
\r
10 public class PCA implements Runnable {
\r
15 double[] eigenvalue;
\r
18 public PCA(Matrix m) {
\r
22 public PCA(SequenceI[] s) {
\r
23 Runtime rt = Runtime.getRuntime();
\r
25 BinarySequence[] bs = new BinarySequence[s.length];
\r
27 while (ii < s.length && s[ii] != null) {
\r
29 bs[ii] = new BinarySequence(s[ii]);
\r
34 BinarySequence[] bs2 = new BinarySequence[s.length];
\r
36 while (ii < s.length && s[ii] != null) {
\r
38 bs2[ii] = new BinarySequence(s[ii]);
\r
39 bs2[ii].blosumEncode();
\r
44 //System.out.println("Created binary encoding");
\r
48 while (count < bs.length && bs[count] != null) {
\r
51 double[][] seqmat = new double[count][bs[0].getDBinary().length];
\r
52 double[][] seqmat2 = new double[count][bs2[0].getDBinary().length];
\r
55 seqmat[i] = bs[i].getDBinary();
\r
56 seqmat2[i] = bs2[i].getDBinary();
\r
59 //System.out.println("Created array");
\r
61 // System.out.println(" --- Original matrix ---- ");
\r
62 m = new Matrix(seqmat,count,bs[0].getDBinary().length);
\r
63 m2 = new Matrix(seqmat2,count,bs2[0].getDBinary().length);
\r
65 //System.out.println("Created matrix");
\r
69 public static void printMemory(Runtime rt) {
\r
70 System.out.println("Free memory = " + rt.freeMemory());
\r
73 public Matrix getM() {
\r
77 public double[] getEigenvector(int i) {
\r
78 return eigenvector.getColumn(i);
\r
81 public double getEigenvalue(int i) {
\r
82 return eigenvector.d[i];
\r
84 public float[][] getComponents(int l, int n, int mm) {
\r
85 return getComponents(l,n,mm,1);
\r
87 public float[][] getComponents(int l, int n, int mm, float factor) {
\r
88 float[][] out = new float[m.rows][3];
\r
90 for (int i = 0; i < m.rows;i++) {
\r
91 out[i][0] = (float)component(i,l)*factor;
\r
92 out[i][1] = (float)component(i,n)*factor;
\r
93 out[i][2] = (float)component(i,mm)*factor;
\r
98 public double[] component(int n) {
\r
99 // n = index of eigenvector
\r
100 double[] out = new double[m.rows];
\r
102 for (int i=0; i < m.rows; i++) {
\r
103 out[i] = component(i,n);
\r
107 public double component(int row, int n) {
\r
110 for (int i = 0; i < symm.cols; i++) {
\r
111 out += symm.value[row][i] * eigenvector.value[i][n];
\r
113 return out/eigenvector.d[n];
\r
116 public void checkEigenvector(int n,PrintStream ps) {
\r
117 ps.println(" --- Eigenvector " + n + " --- ");
\r
119 double[] eigenv = eigenvector.getColumn(n);
\r
121 for (int i=0; i < eigenv.length;i++) {
\r
122 Format.print(ps,"%15.4f",eigenv[i]);
\r
125 System.out.println();
\r
127 double[] neigenv = symm.vectorPostMultiply(eigenv);
\r
128 System.out.println(" --- symmat * eigenv / lambda --- ");
\r
129 if (eigenvector.d[n] > 1e-4) {
\r
130 for (int i=0; i < neigenv.length;i++) {
\r
131 Format.print(System.out,"%15.4f",neigenv[i]/eigenvector.d[n]);
\r
134 System.out.println();
\r
137 public void run() {
\r
138 Matrix mt = m.transpose();
\r
139 // System.out.println(" --- OrigT * Orig ---- ");
\r
140 eigenvector = mt.preMultiply(m2);
\r
141 // eigenvector.print(System.out);
\r
142 symm = eigenvector.copy();
\r
144 //TextArea ta = new TextArea(25,72);
\r
145 //TextAreaPrintStream taps = new TextAreaPrintStream(System.out,ta);
\r
146 //Frame f = new Frame("PCA output");
\r
147 //f.resize(500,500);
\r
148 //f.setLayout(new BorderLayout());
\r
149 //f.add("Center",ta);
\r
151 //symm.print(taps);
\r
152 long tstart = System.currentTimeMillis();
\r
153 eigenvector.tred();
\r
154 long tend = System.currentTimeMillis();
\r
155 //taps.println("Time take for tred = " + (tend-tstart) + "ms");
\r
156 //taps.println(" ---Tridiag transform matrix ---");
\r
158 //taps.println(" --- D vector ---");
\r
159 //eigenvector.printD(taps);
\r
161 //taps.println(" --- E vector ---");
\r
162 // eigenvector.printE(taps);
\r
165 // Now produce the diagonalization matrix
\r
166 tstart = System.currentTimeMillis();
\r
167 eigenvector.tqli();
\r
168 tend = System.currentTimeMillis();
\r
169 //System.out.println("Time take for tqli = " + (tend-tstart) + " ms");
\r
171 //System.out.println(" --- New diagonalization matrix ---");
\r
173 //System.out.println(" --- Eigenvalues ---");
\r
174 //eigenvector.printD(taps);
\r
176 //System.out.println();
\r
178 // for (int i=0; i < eigenvector.cols; i++) {
\r
179 // checkEigenvector(i,taps);
\r
184 // taps.println("Transformed sequences = ");
\r
185 // Matrix trans = m.preMultiply(eigenvector);
\r
186 // trans.print(System.out);
\r