JAL-1807 still testing
[jalviewjs.git] / unused / appletgui / PCAPanel.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)\r
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors\r
4  * \r
5  * This file is part of Jalview.\r
6  * \r
7  * Jalview is free software: you can redistribute it and/or\r
8  * modify it under the terms of the GNU General Public License \r
9  * as published by the Free Software Foundation, either version 3\r
10  * of the License, or (at your option) any later version.\r
11  *  \r
12  * Jalview is distributed in the hope that it will be useful, but \r
13  * WITHOUT ANY WARRANTY; without even the implied warranty \r
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR \r
15  * PURPOSE.  See the GNU General Public License for more details.\r
16  * \r
17  * You should have received a copy of the GNU General Public License\r
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.\r
19  * The Jalview Authors are detailed in the 'AUTHORS' file.\r
20  */\r
21 package jalview.appletgui;\r
22 \r
23 import jalview.bin.JalviewLite;\r
24 import jalview.datamodel.Alignment;\r
25 import jalview.datamodel.AlignmentView;\r
26 import jalview.datamodel.ColumnSelection;\r
27 import jalview.datamodel.SeqCigar;\r
28 import jalview.datamodel.SequenceI;\r
29 import jalview.util.MessageManager;\r
30 import jalview.viewmodel.PCAModel;\r
31 \r
32 import java.awt.BorderLayout;\r
33 import javax.swing.JButton;\r
34 import javax.swing.JCheckBoxMenuItem;\r
35 import java.awt.Color;\r
36 import java.awt.FlowLayout;\r
37 import javax.swing.JFrame;\r
38 import javax.swing.JLabel;\r
39 import javax.swing.JMenu;\r
40 import javax.swing.JMenuBar;\r
41 import javax.swing.JMenuItem;\r
42 import javax.swing.JPanel;\r
43 import java.awt.event.ActionEvent;\r
44 import java.awt.event.ActionListener;\r
45 import java.awt.event.ItemEvent;\r
46 import java.awt.event.ItemListener;\r
47 \r
48 public class PCAPanel extends EmbmenuFrame implements Runnable,\r
49         ActionListener, ItemListener\r
50 {\r
51   RotatableCanvas rc;\r
52 \r
53   AlignViewport av;\r
54 \r
55   PCAModel pcaModel;\r
56 \r
57   int top = 0;\r
58 \r
59   public PCAPanel(AlignViewport av)\r
60   {\r
61     try\r
62     {\r
63       jbInit();\r
64     } catch (Exception e)\r
65     {\r
66       e.printStackTrace();\r
67     }\r
68 \r
69     for (int i = 1; i < 8; i++)\r
70     {\r
71       xCombobox.addItem("dim " + i);\r
72       yCombobox.addItem("dim " + i);\r
73       zCombobox.addItem("dim " + i);\r
74     }\r
75 \r
76     this.av = av;\r
77     boolean selected = av.getSelectionGroup() != null\r
78             && av.getSelectionGroup().getSize() > 0;\r
79     AlignmentView seqstrings = av.getAlignmentView(selected);\r
80     boolean nucleotide = av.getAlignment().isNucleotide();\r
81     SequenceI[] seqs;\r
82     if (!selected)\r
83     {\r
84       seqs = av.getAlignment().getSequencesArray();\r
85     }\r
86     else\r
87     {\r
88       seqs = av.getSelectionGroup().getSequencesInOrder(av.getAlignment());\r
89     }\r
90     SeqCigar sq[] = seqstrings.getSequences();\r
91     int length = sq[0].getWidth();\r
92 \r
93     for (int i = 0; i < seqs.length; i++)\r
94     {\r
95       if (sq[i].getWidth() != length)\r
96       {\r
97         System.out\r
98                 .println("Sequences must be equal length for PCA analysis");\r
99         return;\r
100       }\r
101     }\r
102     pcaModel = new PCAModel(seqstrings, seqs, nucleotide);\r
103 \r
104     rc = new RotatableCanvas(av);\r
105     embedMenuIfNeeded(rc);\r
106     add(rc, BorderLayout.CENTER);\r
107 \r
108     JalviewLite.addFrame(this,\r
109             MessageManager.getString("label.principal_component_analysis"),\r
110             475, 400);\r
111 \r
112     Thread worker = new Thread(this);\r
113     worker.start();\r
114   }\r
115 \r
116   /**\r
117    * DOCUMENT ME!\r
118    */\r
119   public void run()\r
120   {\r
121     // TODO progress indicator\r
122     calcSettings.setEnabled(false);\r
123     rc.setEnabled(false);\r
124     try\r
125     {\r
126       nuclSetting.setState(pcaModel.isNucleotide());\r
127       protSetting.setState(!pcaModel.isNucleotide());\r
128       pcaModel.run();\r
129       // ////////////////\r
130       xCombobox.select(0);\r
131       yCombobox.select(1);\r
132       zCombobox.select(2);\r
133 \r
134       pcaModel.updateRc(rc);\r
135       // rc.invalidate();\r
136       top = pcaModel.getTop();\r
137     } catch (OutOfMemoryError x)\r
138     {\r
139       System.err.println("Out of memory when calculating PCA.");\r
140       return;\r
141     }\r
142     calcSettings.setEnabled(true);\r
143 \r
144     // TODO revert progress indicator\r
145     rc.setEnabled(true);\r
146     rc.repaint();\r
147     this.repaint();\r
148   }\r
149 \r
150   void doDimensionChange()\r
151   {\r
152     if (top == 0)\r
153     {\r
154       return;\r
155     }\r
156 \r
157     int dim1 = top - xCombobox.getSelectedIndex();\r
158     int dim2 = top - yCombobox.getSelectedIndex();\r
159     int dim3 = top - zCombobox.getSelectedIndex();\r
160     pcaModel.updateRcView(dim1, dim2, dim3);\r
161     rc.img = null;\r
162     rc.rotmat.setIdentity();\r
163     rc.initAxes();\r
164     rc.paint(rc.getGraphics());\r
165   }\r
166 \r
167   public void actionPerformed(ActionEvent evt)\r
168   {\r
169     if (evt.getSource() == inputData)\r
170     {\r
171       showOriginalData();\r
172     }\r
173     if (evt.getSource() == resetButton)\r
174     {\r
175       xCombobox.select(0);\r
176       yCombobox.select(1);\r
177       zCombobox.select(2);\r
178       doDimensionChange();\r
179     }\r
180     if (evt.getSource() == values)\r
181     {\r
182       values_actionPerformed();\r
183     }\r
184   }\r
185 \r
186   public void itemStateChanged(ItemEvent evt)\r
187   {\r
188     if (evt.getSource() == xCombobox)\r
189     {\r
190       xCombobox_actionPerformed();\r
191     }\r
192     else if (evt.getSource() == yCombobox)\r
193     {\r
194       yCombobox_actionPerformed();\r
195     }\r
196     else if (evt.getSource() == zCombobox)\r
197     {\r
198       zCombobox_actionPerformed();\r
199     }\r
200     else if (evt.getSource() == labels)\r
201     {\r
202       labels_itemStateChanged(evt);\r
203     }\r
204     else if (evt.getSource() == nuclSetting)\r
205     {\r
206       if (!pcaModel.isNucleotide())\r
207       {\r
208         pcaModel.setNucleotide(true);\r
209         new Thread(this).start();\r
210       }\r
211     }\r
212     else if (evt.getSource() == protSetting)\r
213     {\r
214       if (pcaModel.isNucleotide())\r
215       {\r
216         pcaModel.setNucleotide(false);\r
217         new Thread(this).start();\r
218       }\r
219     }\r
220   }\r
221 \r
222   protected void xCombobox_actionPerformed()\r
223   {\r
224     doDimensionChange();\r
225   }\r
226 \r
227   protected void yCombobox_actionPerformed()\r
228   {\r
229     doDimensionChange();\r
230   }\r
231 \r
232   protected void zCombobox_actionPerformed()\r
233   {\r
234     doDimensionChange();\r
235   }\r
236 \r
237   public void values_actionPerformed()\r
238   {\r
239 \r
240     CutAndPasteTransfer cap = new CutAndPasteTransfer(false, null);\r
241     JFrame frame = new JFrame();\r
242     frame.add(cap);\r
243     JalviewLite.addFrame(frame,\r
244             MessageManager.getString("label.pca_details"), 500, 500);\r
245 \r
246     cap.setText(pcaModel.getDetails());\r
247   }\r
248 \r
249   void showOriginalData()\r
250   {\r
251     // decide if av alignment is sufficiently different to original data to\r
252     // warrant a new window to be created\r
253     // create new alignmnt window with hidden regions (unhiding hidden regions\r
254     // yields unaligned seqs)\r
255     // or create a selection box around columns in alignment view\r
256     // test Alignment(SeqCigar[])\r
257     char gc = '-';\r
258     try\r
259     {\r
260       // we try to get the associated view's gap character\r
261       // but this may fail if the view was closed...\r
262       gc = av.getGapCharacter();\r
263     } catch (Exception ex)\r
264     {\r
265     }\r
266     ;\r
267     Object[] alAndColsel = pcaModel.getSeqtrings()\r
268             .getAlignmentAndColumnSelection(gc);\r
269 \r
270     if (alAndColsel != null && alAndColsel[0] != null)\r
271     {\r
272       Alignment al = new Alignment((SequenceI[]) alAndColsel[0]);\r
273       AlignFrame af = new AlignFrame(al, av.applet,\r
274               "Original Data for PCA", false);\r
275 \r
276       af.viewport.setHiddenColumns((ColumnSelection) alAndColsel[1]);\r
277     }\r
278   }\r
279 \r
280   public void labels_itemStateChanged(ItemEvent itemEvent)\r
281   {\r
282     rc.showLabels(labels.isSelected());\r
283   }\r
284 \r
285   JPanel jPanel2 = new JPanel();\r
286 \r
287   JLabel jLabel1 = new JLabel();\r
288 \r
289   JLabel jLabel2 = new JLabel();\r
290 \r
291   JLabel jLabel3 = new JLabel();\r
292 \r
293   protected Choice xCombobox = new Choice();\r
294 \r
295   protected Choice yCombobox = new Choice();\r
296 \r
297   protected Choice zCombobox = new Choice();\r
298 \r
299   protected JButton resetButton = new JButton();\r
300 \r
301   FlowLayout flowLayout1 = new FlowLayout();\r
302 \r
303   BorderLayout borderLayout1 = new BorderLayout();\r
304 \r
305   JMenuBar menuBar1 = new JMenuBar();\r
306 \r
307   JMenu menu1 = new JMenu();\r
308 \r
309   JMenu menu2 = new JMenu();\r
310 \r
311   JMenu calcSettings = new JMenu();\r
312 \r
313   protected JCheckBoxMenuItem labels = new JCheckBoxMenuItem();\r
314 \r
315   protected JCheckBoxMenuItem protSetting = new JCheckBoxMenuItem();\r
316 \r
317   protected JCheckBoxMenuItem nuclSetting = new JCheckBoxMenuItem();\r
318 \r
319   JMenuItem values = new JMenuItem();\r
320 \r
321   JMenuItem inputData = new JMenuItem();\r
322 \r
323   private void jbInit() throws Exception\r
324   {\r
325     this.setLayout(borderLayout1);\r
326     jPanel2.setLayout(flowLayout1);\r
327     jLabel1.setFont(new java.awt.Font("Verdana", 0, 12));\r
328     jLabel1.setText("x=");\r
329     jLabel2.setFont(new java.awt.Font("Verdana", 0, 12));\r
330     jLabel2.setText("y=");\r
331     jLabel3.setFont(new java.awt.Font("Verdana", 0, 12));\r
332     jLabel3.setText("z=");\r
333     jPanel2.setBackground(Color.white);\r
334     zCombobox.setFont(new java.awt.Font("Verdana", 0, 12));\r
335     zCombobox.addItemListener(this);\r
336     yCombobox.setFont(new java.awt.Font("Verdana", 0, 12));\r
337     yCombobox.addItemListener(this);\r
338     xCombobox.setFont(new java.awt.Font("Verdana", 0, 12));\r
339     xCombobox.addItemListener(this);\r
340     resetButton.setFont(new java.awt.Font("Verdana", 0, 12));\r
341     resetButton.setLabel(MessageManager.getString("action.reset"));\r
342     resetButton.addActionListener(this);\r
343     this.setJMenuBar(menuBar1);\r
344     menu1.setLabel(MessageManager.getString("action.file"));\r
345     menu2.setLabel(MessageManager.getString("action.view"));\r
346     calcSettings.setLabel(MessageManager.getString("action.change_params"));\r
347     labels.setLabel(MessageManager.getString("label.labels"));\r
348     labels.addItemListener(this);\r
349     values.setLabel(MessageManager.getString("label.output_values"));\r
350     values.addActionListener(this);\r
351     inputData.setLabel(MessageManager.getString("label.input_data"));\r
352     nuclSetting.setLabel(MessageManager\r
353             .getString("label.nucleotide_matrix"));\r
354     nuclSetting.addItemListener(this);\r
355     protSetting.setLabel(MessageManager.getString("label.protein_matrix"));\r
356     protSetting.addItemListener(this);\r
357     this.add(jPanel2, BorderLayout.SOUTH);\r
358     jPanel2.add(jLabel1, null);\r
359     jPanel2.add(xCombobox, null);\r
360     jPanel2.add(jLabel2, null);\r
361     jPanel2.add(yCombobox, null);\r
362     jPanel2.add(jLabel3, null);\r
363     jPanel2.add(zCombobox, null);\r
364     jPanel2.add(resetButton, null);\r
365     menuBar1.add(menu1);\r
366     menuBar1.add(menu2);\r
367     menuBar1.add(calcSettings);\r
368     menu2.add(labels);\r
369     menu1.add(values);\r
370     menu1.add(inputData);\r
371     calcSettings.add(nuclSetting);\r
372     calcSettings.add(protSetting);\r
373     inputData.addActionListener(this);\r
374   }\r
375 \r
376 }\r