Formatting changes
[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 \r
46     /**\r
47      * Creates a new PCAPanel object.\r
48      *\r
49      * @param av DOCUMENT ME!\r
50      * @param s DOCUMENT ME!\r
51      */\r
52     public PCAPanel(AlignViewport av, SequenceI[] s)\r
53     {\r
54         this.av = av;\r
55 \r
56         if ((av.getSelectionGroup() != null) &&\r
57                 (av.getSelectionGroup().getSize() > 3))\r
58         {\r
59             s = new Sequence[av.getSelectionGroup().getSize()];\r
60 \r
61             for (int i = 0; i < s.length; i++)\r
62             {\r
63                 s[i] = av.getSelectionGroup().getSequenceAt(i);\r
64             }\r
65         }\r
66 \r
67         if (s == null)\r
68         {\r
69             s = new Sequence[av.getAlignment().getHeight()];\r
70 \r
71             for (int i = 0; i < av.getAlignment().getHeight(); i++)\r
72             {\r
73                 s[i] = av.getAlignment().getSequenceAt(i);\r
74             }\r
75         }\r
76 \r
77         //////////////////////This part was done in PCATHread originally. Is it too slow???\r
78         pca = new PCA(s);\r
79         pca.run();\r
80 \r
81         // Now find the component coordinates\r
82         int ii = 0;\r
83 \r
84         while ((ii < s.length) && (s[ii] != null))\r
85         {\r
86             ii++;\r
87         }\r
88 \r
89         double[][] comps = new double[ii][ii];\r
90 \r
91         for (int i = 0; i < ii; i++)\r
92         {\r
93             if (pca.getEigenvalue(i) > 1e-4)\r
94             {\r
95                 comps[i] = pca.component(i);\r
96             }\r
97         }\r
98 \r
99         //////////////////\r
100         xCombobox.setSelectedIndex(0);\r
101         yCombobox.setSelectedIndex(1);\r
102         zCombobox.setSelectedIndex(2);\r
103 \r
104         top = pca.getM().rows - 1;\r
105 \r
106         Vector points = new Vector();\r
107         float[][] scores = pca.getComponents(top - 1, top - 2, top - 3, 100);\r
108 \r
109         for (int i = 0; i < pca.getM().rows; i++)\r
110         {\r
111             SequencePoint sp = new SequencePoint(s[i], scores[i]);\r
112             points.addElement(sp);\r
113         }\r
114 \r
115         rc = new RotatableCanvas(av, points, pca.getM().rows);\r
116 \r
117         //rc.printPoints();\r
118         add(rc, BorderLayout.CENTER);\r
119     }\r
120 \r
121     /**\r
122      * DOCUMENT ME!\r
123      */\r
124     public void run()\r
125     {\r
126         // do stuff\r
127     }\r
128 \r
129     /**\r
130      * DOCUMENT ME!\r
131      */\r
132     void doDimensionChange()\r
133     {\r
134         if (top == 0)\r
135         {\r
136             return;\r
137         }\r
138 \r
139         int dim1 = top - xCombobox.getSelectedIndex();\r
140         int dim2 = top - yCombobox.getSelectedIndex();\r
141         int dim3 = top - zCombobox.getSelectedIndex();\r
142 \r
143         float[][] scores = pca.getComponents(dim1, dim2, dim3, 100);\r
144 \r
145         for (int i = 0; i < pca.getM().rows; i++)\r
146         {\r
147             ((SequencePoint) rc.points.elementAt(i)).coord = scores[i];\r
148         }\r
149 \r
150         rc.img = null;\r
151         rc.rotmat.setIdentity();\r
152         rc.initAxes();\r
153         rc.paint(rc.getGraphics());\r
154     }\r
155 \r
156     /**\r
157      * DOCUMENT ME!\r
158      *\r
159      * @param e DOCUMENT ME!\r
160      */\r
161     protected void xCombobox_actionPerformed(ActionEvent e)\r
162     {\r
163         doDimensionChange();\r
164     }\r
165 \r
166     /**\r
167      * DOCUMENT ME!\r
168      *\r
169      * @param e DOCUMENT ME!\r
170      */\r
171     protected void yCombobox_actionPerformed(ActionEvent e)\r
172     {\r
173         doDimensionChange();\r
174     }\r
175 \r
176     /**\r
177      * DOCUMENT ME!\r
178      *\r
179      * @param e DOCUMENT ME!\r
180      */\r
181     protected void zCombobox_actionPerformed(ActionEvent e)\r
182     {\r
183         doDimensionChange();\r
184     }\r
185 }\r