Takes string[] instead of seq[]
[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, ActionListener, ItemListener\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(false) > 3)\r
61     {\r
62       seqs = new Sequence[av.getSelectionGroup().getSize(false)];\r
63       for (int i = 0; i < av.getSelectionGroup().getSize(false); 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   public void actionPerformed(ActionEvent evt)\r
160   {\r
161     values_actionPerformed();\r
162   }\r
163 \r
164   public void itemStateChanged(ItemEvent evt)\r
165   {\r
166     if(evt.getSource()==xCombobox)\r
167       xCombobox_actionPerformed();\r
168     else if(evt.getSource()==yCombobox)\r
169       yCombobox_actionPerformed();\r
170     else if(evt.getSource()==zCombobox)\r
171       zCombobox_actionPerformed();\r
172   }\r
173 \r
174 \r
175   protected void xCombobox_actionPerformed()\r
176   {\r
177     doDimensionChange();\r
178   }\r
179 \r
180   protected void yCombobox_actionPerformed()\r
181   {\r
182     doDimensionChange();\r
183   }\r
184 \r
185   protected void zCombobox_actionPerformed()\r
186   {\r
187     doDimensionChange();\r
188   }\r
189 \r
190   public void values_actionPerformed()\r
191   {\r
192 \r
193     CutAndPasteTransfer cap = new CutAndPasteTransfer(false, null);\r
194     Frame frame = new Frame();\r
195     frame.add(cap);\r
196     jalview.bin.JalviewLite.addFrame(frame, "PCA details", 500, 500);\r
197 \r
198       cap.setText(pca.getDetails());\r
199   }\r
200 \r
201   public void labels_itemStateChanged(ItemEvent itemEvent)\r
202   {\r
203     rc.showLabels( labels.getState() );\r
204   }\r
205   Panel jPanel2 = new Panel();\r
206   Label jLabel1 = new Label();\r
207   Label jLabel2 = new Label();\r
208   Label jLabel3 = new Label();\r
209   protected Choice xCombobox = new Choice();\r
210   protected Choice yCombobox = new Choice();\r
211   protected Choice zCombobox = new Choice();\r
212   FlowLayout flowLayout1 = new FlowLayout();\r
213   BorderLayout borderLayout1 = new BorderLayout();\r
214   MenuBar menuBar1 = new MenuBar();\r
215   Menu menu1 = new Menu();\r
216   Menu menu2 = new Menu();\r
217   protected CheckboxMenuItem labels = new CheckboxMenuItem();\r
218   MenuItem values = new MenuItem();\r
219 \r
220   private void jbInit()\r
221       throws Exception\r
222   {\r
223     this.setLayout(borderLayout1);\r
224     jPanel2.setLayout(flowLayout1);\r
225     jLabel1.setFont(new java.awt.Font("Verdana", 0, 12));\r
226     jLabel1.setText("x=");\r
227     jLabel2.setFont(new java.awt.Font("Verdana", 0, 12));\r
228     jLabel2.setText("y=");\r
229     jLabel3.setFont(new java.awt.Font("Verdana", 0, 12));\r
230     jLabel3.setText("z=");\r
231     jPanel2.setBackground(Color.white);\r
232     zCombobox.setFont(new java.awt.Font("Verdana", 0, 12));\r
233     zCombobox.addItemListener(this);\r
234     yCombobox.setFont(new java.awt.Font("Verdana", 0, 12));\r
235     yCombobox.addItemListener(this);\r
236     xCombobox.setFont(new java.awt.Font("Verdana", 0, 12));\r
237     xCombobox.addItemListener(this);\r
238     this.setMenuBar(menuBar1);\r
239     menu1.setLabel("File");\r
240     menu2.setLabel("View");\r
241     labels.setLabel("Labels");\r
242     labels.addItemListener(this);\r
243     values.setLabel("Output Values...");\r
244     values.addActionListener(this);\r
245     this.add(jPanel2, BorderLayout.SOUTH);\r
246     jPanel2.add(jLabel1, null);\r
247     jPanel2.add(xCombobox, null);\r
248     jPanel2.add(jLabel2, null);\r
249     jPanel2.add(yCombobox, null);\r
250     jPanel2.add(jLabel3, null);\r
251     jPanel2.add(zCombobox, null);\r
252     menuBar1.add(menu1);\r
253     menuBar1.add(menu2);\r
254     menu2.add(labels);\r
255     menu1.add(values);\r
256   }\r
257 \r
258 }\r