Use selectionGroup to find chosen sequences
[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)\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 < av.getSelectionGroup().getSize(); i++)\r
64             {\r
65                 seqs[i] = av.getSelectionGroup().getSequenceAt(i);\r
66             }\r
67         }\r
68         else\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       try{\r
93         pca = new PCA(seqs);\r
94         pca.run();\r
95 \r
96         // Now find the component coordinates\r
97         int ii = 0;\r
98 \r
99         while ( (ii < seqs.length) && (seqs[ii] != null))\r
100         {\r
101           ii++;\r
102         }\r
103 \r
104         double[][] comps = new double[ii][ii];\r
105 \r
106         for (int i = 0; i < ii; i++)\r
107         {\r
108           if (pca.getEigenvalue(i) > 1e-4)\r
109           {\r
110             comps[i] = pca.component(i);\r
111           }\r
112         }\r
113 \r
114         //////////////////\r
115         xCombobox.setSelectedIndex(0);\r
116         yCombobox.setSelectedIndex(1);\r
117         zCombobox.setSelectedIndex(2);\r
118 \r
119         top = pca.getM().rows - 1;\r
120 \r
121         Vector points = new Vector();\r
122         float[][] scores = pca.getComponents(top - 1, top - 2, top - 3, 100);\r
123 \r
124         for (int i = 0; i < pca.getM().rows; i++)\r
125         {\r
126           SequencePoint sp = new SequencePoint(seqs[i], scores[i]);\r
127           points.addElement(sp);\r
128         }\r
129 \r
130         rc.setPoints(points, pca.getM().rows);\r
131         rc.repaint();\r
132         seqs = null;\r
133       }\r
134      catch(OutOfMemoryError er)\r
135       { JOptionPane.showInternalMessageDialog(Desktop.desktop,\r
136                                               "Out of memory calculating PCA!!"\r
137                                               +\r
138                                               "\nSee help files for increasing Java Virtual Machine memory."\r
139                                               , "Out of memory",\r
140                                               JOptionPane.WARNING_MESSAGE);\r
141         System.out.println("PCAPanel: "+er);\r
142         System.gc();\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