474a158a5f0235833fafb2c674cd362aa29ed1b4
[jalview.git] / src / jalview / gui / PCAPanel.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4  *\r
5  * This program is free software; you can redistribute it and/or\r
6  * modify it under the terms of the GNU General Public License\r
7  * as published by the Free Software Foundation; either version 2\r
8  * of the License, or (at your option) any later version.\r
9  *\r
10  * This program is distributed in the hope that it will be useful,\r
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  * GNU General Public License for more details.\r
14  *\r
15  * You should have received a copy of the GNU General Public License\r
16  * along with this program; if not, write to the Free Software\r
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18  */\r
19 package jalview.gui;\r
20 \r
21 import jalview.analysis.*;\r
22 \r
23 import jalview.datamodel.*;\r
24 \r
25 import jalview.jbgui.*;\r
26 \r
27 import java.awt.*;\r
28 import java.awt.event.*;\r
29 \r
30 import java.util.*;\r
31 \r
32 \r
33 /**\r
34  * DOCUMENT ME!\r
35  *\r
36  * @author $author$\r
37  * @version $Revision$\r
38  */\r
39 public class PCAPanel extends GPCAPanel implements Runnable\r
40 {\r
41     PCA pca;\r
42     int top;\r
43     RotatableCanvas rc;\r
44     AlignViewport av;\r
45     SequenceI [] seqs;\r
46 \r
47     /**\r
48      * Creates a new PCAPanel object.\r
49      *\r
50      * @param av DOCUMENT ME!\r
51      * @param s DOCUMENT ME!\r
52      */\r
53     public PCAPanel(AlignViewport av, SequenceI[] s)\r
54     {\r
55         this.av = av;\r
56 \r
57         if ((av.getSelectionGroup() != null) &&\r
58                 (av.getSelectionGroup().getSize() > 3))\r
59         {\r
60             seqs = new Sequence[av.getSelectionGroup().getSize()];\r
61 \r
62             for (int i = 0; i < s.length; i++)\r
63             {\r
64                 seqs[i] = av.getSelectionGroup().getSequenceAt(i);\r
65             }\r
66         }\r
67 \r
68         if (s == null)\r
69         {\r
70             seqs = new Sequence[av.getAlignment().getHeight()];\r
71 \r
72             for (int i = 0; i < av.getAlignment().getHeight(); i++)\r
73             {\r
74                 seqs[i] = av.getAlignment().getSequenceAt(i);\r
75             }\r
76         }\r
77 \r
78 \r
79         rc = new RotatableCanvas(av);\r
80         add(rc, BorderLayout.CENTER);\r
81         Thread worker = new Thread(this);\r
82         worker.start();\r
83     }\r
84 \r
85 \r
86 \r
87     /**\r
88      * DOCUMENT ME!\r
89      */\r
90     public void run()\r
91     {\r
92                 pca = new PCA(seqs);\r
93                 pca.run();\r
94 \r
95                 // Now find the component coordinates\r
96                 int ii = 0;\r
97 \r
98                 while ((ii < seqs.length) && (seqs[ii] != null))\r
99                 {\r
100                     ii++;\r
101                 }\r
102 \r
103                 double[][] comps = new double[ii][ii];\r
104 \r
105                 for (int i = 0; i < ii; i++)\r
106                 {\r
107                     if (pca.getEigenvalue(i) > 1e-4)\r
108                     {\r
109                         comps[i] = pca.component(i);\r
110                     }\r
111                 }\r
112 \r
113                 //////////////////\r
114                 xCombobox.setSelectedIndex(0);\r
115                 yCombobox.setSelectedIndex(1);\r
116                 zCombobox.setSelectedIndex(2);\r
117 \r
118                 top = pca.getM().rows - 1;\r
119 \r
120                 Vector points = new Vector();\r
121                 float[][] scores = pca.getComponents(top - 1, top - 2, top - 3, 100);\r
122 \r
123                 for (int i = 0; i < pca.getM().rows; i++)\r
124                 {\r
125                     SequencePoint sp = new SequencePoint(seqs[i], scores[i]);\r
126                     points.addElement(sp);\r
127                 }\r
128 \r
129                 rc.setPoints(points, pca.getM().rows);\r
130                 rc.repaint();\r
131                 seqs = null;\r
132     }\r
133 \r
134     /**\r
135      * DOCUMENT ME!\r
136      */\r
137     void doDimensionChange()\r
138     {\r
139         if (top == 0)\r
140         {\r
141             return;\r
142         }\r
143 \r
144         int dim1 = top - xCombobox.getSelectedIndex();\r
145         int dim2 = top - yCombobox.getSelectedIndex();\r
146         int dim3 = top - zCombobox.getSelectedIndex();\r
147 \r
148         float[][] scores = pca.getComponents(dim1, dim2, dim3, 100);\r
149 \r
150         for (int i = 0; i < pca.getM().rows; i++)\r
151         {\r
152             ((SequencePoint) rc.points.elementAt(i)).coord = scores[i];\r
153         }\r
154 \r
155         rc.img = null;\r
156         rc.rotmat.setIdentity();\r
157         rc.initAxes();\r
158         rc.paint(rc.getGraphics());\r
159     }\r
160 \r
161     /**\r
162      * DOCUMENT ME!\r
163      *\r
164      * @param e DOCUMENT ME!\r
165      */\r
166     protected void xCombobox_actionPerformed(ActionEvent e)\r
167     {\r
168         doDimensionChange();\r
169     }\r
170 \r
171     /**\r
172      * DOCUMENT ME!\r
173      *\r
174      * @param e DOCUMENT ME!\r
175      */\r
176     protected void yCombobox_actionPerformed(ActionEvent e)\r
177     {\r
178         doDimensionChange();\r
179     }\r
180 \r
181     /**\r
182      * DOCUMENT ME!\r
183      *\r
184      * @param e DOCUMENT ME!\r
185      */\r
186     protected void zCombobox_actionPerformed(ActionEvent e)\r
187     {\r
188         doDimensionChange();\r
189     }\r
190 }\r