after merge
[jalview.git] / src / jalview / appletgui / 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 \r
20 package jalview.appletgui;\r
21 \r
22 import java.util.*;\r
23 \r
24 import java.awt.*;\r
25 import java.awt.event.*;\r
26 \r
27 import jalview.analysis.*;\r
28 import jalview.datamodel.*;\r
29 \r
30 \r
31 public class PCAPanel\r
32     extends Frame implements Runnable\r
33 {\r
34   PCA pca;\r
35   int top;\r
36   RotatableCanvas rc;\r
37   AlignViewport av;\r
38   SequenceI [] seqs;\r
39 \r
40 \r
41   public PCAPanel(AlignViewport av)\r
42   {\r
43     try\r
44     {\r
45       jbInit();\r
46     }\r
47     catch (Exception e)\r
48     {\r
49       e.printStackTrace();\r
50     }\r
51 \r
52     for (int i = 1; i < 8; i++)\r
53     {\r
54       xCombobox.addItem("dim " + i);\r
55       yCombobox.addItem("dim " + i);\r
56       zCombobox.addItem("dim " + i);\r
57     }\r
58 \r
59     this.av = av;\r
60     if (av.getSelectionGroup()!=null && av.getSelectionGroup().getSize() > 3)\r
61     {\r
62       seqs = new Sequence[av.getSelectionGroup().getSize()];\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       for (int i = 0; i < av.getAlignment().getHeight(); i++)\r
72       {\r
73         seqs[i] = av.getAlignment().getSequenceAt(i);\r
74       }\r
75     }\r
76 \r
77     rc = new RotatableCanvas(av);\r
78     add(rc, BorderLayout.CENTER);\r
79 \r
80     jalview.bin.JalviewLite.addFrame(this, "Principal component analysis",\r
81                                        400, 400);\r
82 \r
83 \r
84     Thread worker = new Thread(this);\r
85     worker.start();\r
86   }\r
87 \r
88   /**\r
89    * DOCUMENT ME!\r
90    */\r
91   public void run()\r
92   {\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.select(0);\r
116               yCombobox.select(1);\r
117               zCombobox.select(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               this.repaint();\r
134   }\r
135 \r
136   void doDimensionChange()\r
137   {\r
138     if (top == 0)\r
139     {\r
140       return;\r
141     }\r
142 \r
143     int dim1 = top - xCombobox.getSelectedIndex();\r
144     int dim2 = top - yCombobox.getSelectedIndex();\r
145     int dim3 = top - zCombobox.getSelectedIndex();\r
146 \r
147     float[][] scores = pca.getComponents(dim1, dim2, dim3, 100);\r
148     for (int i = 0; i < pca.getM().rows; i++)\r
149     {\r
150       ( (SequencePoint) rc.points.elementAt(i)).coord = scores[i];\r
151     }\r
152 \r
153     rc.img = null;\r
154     rc.rotmat.setIdentity();\r
155     rc.initAxes();\r
156     rc.paint(rc.getGraphics());\r
157   }\r
158 \r
159   protected void xCombobox_actionPerformed(ActionEvent e)\r
160   {\r
161     doDimensionChange();\r
162   }\r
163 \r
164   protected void yCombobox_actionPerformed(ActionEvent e)\r
165   {\r
166     doDimensionChange();\r
167   }\r
168 \r
169   protected void zCombobox_actionPerformed(ActionEvent e)\r
170   {\r
171     doDimensionChange();\r
172   }\r
173 \r
174   public void values_actionPerformed(ActionEvent actionEvent)\r
175   {\r
176 \r
177     CutAndPasteTransfer cap = new CutAndPasteTransfer(false, null);\r
178     Frame frame = new Frame();\r
179     frame.add(cap);\r
180     jalview.bin.JalviewLite.addFrame(frame, "PCA details", 500, 500);\r
181 \r
182       cap.setText(pca.getDetails());\r
183   }\r
184 \r
185   public void labels_itemStateChanged(ItemEvent itemEvent)\r
186   {\r
187     rc.showLabels( labels.getState() );\r
188   }\r
189   Panel jPanel2 = new Panel();\r
190   Label jLabel1 = new Label();\r
191   Label jLabel2 = new Label();\r
192   Label jLabel3 = new Label();\r
193   protected Choice xCombobox = new Choice();\r
194   protected Choice yCombobox = new Choice();\r
195   protected Choice zCombobox = new Choice();\r
196   FlowLayout flowLayout1 = new FlowLayout();\r
197   BorderLayout borderLayout1 = new BorderLayout();\r
198   MenuBar menuBar1 = new MenuBar();\r
199   Menu menu1 = new Menu();\r
200   Menu menu2 = new Menu();\r
201   protected CheckboxMenuItem labels = new CheckboxMenuItem();\r
202   MenuItem values = new MenuItem();\r
203 \r
204   private void jbInit()\r
205       throws Exception\r
206   {\r
207     this.setLayout(borderLayout1);\r
208     jPanel2.setLayout(flowLayout1);\r
209     jLabel1.setFont(new java.awt.Font("Verdana", 0, 12));\r
210     jLabel1.setText("x=");\r
211     jLabel2.setFont(new java.awt.Font("Verdana", 0, 12));\r
212     jLabel2.setText("y=");\r
213     jLabel3.setFont(new java.awt.Font("Verdana", 0, 12));\r
214     jLabel3.setText("z=");\r
215     jPanel2.setBackground(Color.white);\r
216     zCombobox.setFont(new java.awt.Font("Verdana", 0, 12));\r
217     zCombobox.addItemListener(new java.awt.event.ItemListener()\r
218     {\r
219       public void itemStateChanged(ItemEvent e)\r
220       {\r
221         zCombobox_actionPerformed(null);\r
222       }\r
223     });\r
224     yCombobox.setFont(new java.awt.Font("Verdana", 0, 12));\r
225     yCombobox.addItemListener(new java.awt.event.ItemListener()\r
226     {\r
227       public void itemStateChanged(ItemEvent e)\r
228       {\r
229         yCombobox_actionPerformed(null);\r
230       }\r
231     });\r
232     xCombobox.setFont(new java.awt.Font("Verdana", 0, 12));\r
233     xCombobox.addItemListener(new java.awt.event.ItemListener()\r
234     {\r
235       public void itemStateChanged(ItemEvent e)\r
236       {\r
237         xCombobox_actionPerformed(null);\r
238       }\r
239     });\r
240     this.setMenuBar(menuBar1);\r
241     menu1.setLabel("File");\r
242     menu2.setLabel("View");\r
243     labels.setLabel("Labels");\r
244     labels.addItemListener(new ItemListener()\r
245     {\r
246       public void itemStateChanged(ItemEvent itemEvent)\r
247       {\r
248         labels_itemStateChanged(itemEvent);\r
249       }\r
250     });\r
251     values.setLabel("Output Values...");\r
252     values.addActionListener(new ActionListener()\r
253     {\r
254       public void actionPerformed(ActionEvent actionEvent)\r
255       {\r
256         values_actionPerformed(actionEvent);\r
257       }\r
258     });\r
259     this.add(jPanel2, BorderLayout.SOUTH);\r
260     jPanel2.add(jLabel1, null);\r
261     jPanel2.add(xCombobox, null);\r
262     jPanel2.add(jLabel2, null);\r
263     jPanel2.add(yCombobox, null);\r
264     jPanel2.add(jLabel3, null);\r
265     jPanel2.add(zCombobox, null);\r
266     menuBar1.add(menu1);\r
267     menuBar1.add(menu2);\r
268     menu2.add(labels);\r
269     menu1.add(values);\r
270   }\r
271 \r
272 }\r