d1005c2eb2a49a2b5cf1a555e11f0b03f8928586
[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 import javax.swing.JOptionPane;\r
32 \r
33 \r
34 /**\r
35  * DOCUMENT ME!\r
36  *\r
37  * @author $author$\r
38  * @version $Revision$\r
39  */\r
40 public class PCAPanel extends GPCAPanel implements Runnable\r
41 {\r
42     PCA pca;\r
43     int top;\r
44     RotatableCanvas rc;\r
45     AlignViewport av;\r
46     SequenceI [] seqs;\r
47 \r
48     /**\r
49      * Creates a new PCAPanel object.\r
50      *\r
51      * @param av DOCUMENT ME!\r
52      * @param s DOCUMENT ME!\r
53      */\r
54     public PCAPanel(AlignViewport av, SequenceI[] s)\r
55     {\r
56         this.av = av;\r
57 \r
58         if ((av.getSelectionGroup() != null) &&\r
59                 (av.getSelectionGroup().getSize() > 3))\r
60         {\r
61             seqs = new Sequence[av.getSelectionGroup().getSize()];\r
62 \r
63             for (int i = 0; i < s.length; i++)\r
64             {\r
65                 seqs[i] = av.getSelectionGroup().getSequenceAt(i);\r
66             }\r
67         }\r
68 \r
69         if (s == null)\r
70         {\r
71             seqs = new Sequence[av.getAlignment().getHeight()];\r
72 \r
73             for (int i = 0; i < av.getAlignment().getHeight(); i++)\r
74             {\r
75                 seqs[i] = av.getAlignment().getSequenceAt(i);\r
76             }\r
77         }\r
78 \r
79 \r
80         rc = new RotatableCanvas(av);\r
81         add(rc, BorderLayout.CENTER);\r
82         Thread worker = new Thread(this);\r
83         worker.start();\r
84     }\r
85 \r
86 \r
87 \r
88     /**\r
89      * DOCUMENT ME!\r
90      */\r
91     public void run()\r
92     {\r
93       try{\r
94         pca = new PCA(seqs);\r
95         pca.run();\r
96 \r
97         // Now find the component coordinates\r
98         int ii = 0;\r
99 \r
100         while ( (ii < seqs.length) && (seqs[ii] != null))\r
101         {\r
102           ii++;\r
103         }\r
104 \r
105         double[][] comps = new double[ii][ii];\r
106 \r
107         for (int i = 0; i < ii; i++)\r
108         {\r
109           if (pca.getEigenvalue(i) > 1e-4)\r
110           {\r
111             comps[i] = pca.component(i);\r
112           }\r
113         }\r
114 \r
115         //////////////////\r
116         xCombobox.setSelectedIndex(0);\r
117         yCombobox.setSelectedIndex(1);\r
118         zCombobox.setSelectedIndex(2);\r
119 \r
120         top = pca.getM().rows - 1;\r
121 \r
122         Vector points = new Vector();\r
123         float[][] scores = pca.getComponents(top - 1, top - 2, top - 3, 100);\r
124 \r
125         for (int i = 0; i < pca.getM().rows; i++)\r
126         {\r
127           SequencePoint sp = new SequencePoint(seqs[i], scores[i]);\r
128           points.addElement(sp);\r
129         }\r
130 \r
131         rc.setPoints(points, pca.getM().rows);\r
132         rc.repaint();\r
133         seqs = null;\r
134       }\r
135      catch(OutOfMemoryError er)\r
136       { JOptionPane.showInternalMessageDialog(Desktop.desktop,\r
137                                               "Out of memory calculating PCA!!"\r
138                                               +\r
139                                               "\nSee help files for increasing Java Virtual Machine memory."\r
140                                               , "Out of memory",\r
141                                               JOptionPane.WARNING_MESSAGE);\r
142         System.out.println("PCAPanel: "+er);\r
143 \r
144       }\r
145 \r
146     }\r
147 \r
148     /**\r
149      * DOCUMENT ME!\r
150      */\r
151     void doDimensionChange()\r
152     {\r
153         if (top == 0)\r
154         {\r
155             return;\r
156         }\r
157 \r
158         int dim1 = top - xCombobox.getSelectedIndex();\r
159         int dim2 = top - yCombobox.getSelectedIndex();\r
160         int dim3 = top - zCombobox.getSelectedIndex();\r
161 \r
162         float[][] scores = pca.getComponents(dim1, dim2, dim3, 100);\r
163 \r
164         for (int i = 0; i < pca.getM().rows; i++)\r
165         {\r
166             ((SequencePoint) rc.points.elementAt(i)).coord = scores[i];\r
167         }\r
168 \r
169         rc.img = null;\r
170         rc.rotmat.setIdentity();\r
171         rc.initAxes();\r
172         rc.paint(rc.getGraphics());\r
173     }\r
174 \r
175     /**\r
176      * DOCUMENT ME!\r
177      *\r
178      * @param e DOCUMENT ME!\r
179      */\r
180     protected void xCombobox_actionPerformed(ActionEvent e)\r
181     {\r
182         doDimensionChange();\r
183     }\r
184 \r
185     /**\r
186      * DOCUMENT ME!\r
187      *\r
188      * @param e DOCUMENT ME!\r
189      */\r
190     protected void yCombobox_actionPerformed(ActionEvent e)\r
191     {\r
192         doDimensionChange();\r
193     }\r
194 \r
195     /**\r
196      * DOCUMENT ME!\r
197      *\r
198      * @param e DOCUMENT ME!\r
199      */\r
200     protected void zCombobox_actionPerformed(ActionEvent e)\r
201     {\r
202         doDimensionChange();\r
203     }\r
204 }\r