JAL-1807 Bob's JalviewJS prototype first commit
[jalviewjs.git] / site / j2s / jalview / appletgui / PCAPanel.js
1 Clazz.declarePackage ("jalview.appletgui");\r
2 Clazz.load (["jalview.appletgui.EmbmenuFrame", "java.awt.event.ActionListener", "$.ItemListener", "awt2swing.Button", "$.CheckboxMenuItem", "$.Choice", "$.Label", "$.Menu", "$.MenuBar", "$.MenuItem", "$.Panel", "java.awt.BorderLayout", "$.FlowLayout"], "jalview.appletgui.PCAPanel", ["awt2swing.Frame", "jalview.appletgui.AlignFrame", "$.CutAndPasteTransfer", "$.RotatableCanvas", "jalview.bin.JalviewLite", "jalview.datamodel.Alignment", "jalview.util.MessageManager", "jalview.viewmodel.PCAModel", "java.awt.Color", "$.Font", "java.lang.Thread"], function () {\r
3 c$ = Clazz.decorateAsClass (function () {\r
4 this.rc = null;\r
5 this.av = null;\r
6 this.pcaModel = null;\r
7 this.top = 0;\r
8 this.jPanel2 = null;\r
9 this.jLabel1 = null;\r
10 this.jLabel2 = null;\r
11 this.jLabel3 = null;\r
12 this.xCombobox = null;\r
13 this.yCombobox = null;\r
14 this.zCombobox = null;\r
15 this.resetButton = null;\r
16 this.flowLayout1 = null;\r
17 this.borderLayout1 = null;\r
18 this.menuBar1 = null;\r
19 this.menu1 = null;\r
20 this.menu2 = null;\r
21 this.calcSettings = null;\r
22 this.labels = null;\r
23 this.protSetting = null;\r
24 this.nuclSetting = null;\r
25 this.values = null;\r
26 this.inputData = null;\r
27 Clazz.instantialize (this, arguments);\r
28 }, jalview.appletgui, "PCAPanel", jalview.appletgui.EmbmenuFrame, [Runnable, java.awt.event.ActionListener, java.awt.event.ItemListener]);\r
29 Clazz.prepareFields (c$, function () {\r
30 this.jPanel2 =  new awt2swing.Panel ();\r
31 this.jLabel1 =  new awt2swing.Label ();\r
32 this.jLabel2 =  new awt2swing.Label ();\r
33 this.jLabel3 =  new awt2swing.Label ();\r
34 this.xCombobox =  new awt2swing.Choice ();\r
35 this.yCombobox =  new awt2swing.Choice ();\r
36 this.zCombobox =  new awt2swing.Choice ();\r
37 this.resetButton =  new awt2swing.Button ();\r
38 this.flowLayout1 =  new java.awt.FlowLayout ();\r
39 this.borderLayout1 =  new java.awt.BorderLayout ();\r
40 this.menuBar1 =  new awt2swing.MenuBar ();\r
41 this.menu1 =  new awt2swing.Menu ();\r
42 this.menu2 =  new awt2swing.Menu ();\r
43 this.calcSettings =  new awt2swing.Menu ();\r
44 this.labels =  new awt2swing.CheckboxMenuItem ();\r
45 this.protSetting =  new awt2swing.CheckboxMenuItem ();\r
46 this.nuclSetting =  new awt2swing.CheckboxMenuItem ();\r
47 this.values =  new awt2swing.MenuItem ();\r
48 this.inputData =  new awt2swing.MenuItem ();\r
49 });\r
50 Clazz.makeConstructor (c$, \r
51 function (av) {\r
52 Clazz.superConstructor (this, jalview.appletgui.PCAPanel, []);\r
53 try {\r
54 this.jbInit ();\r
55 } catch (e) {\r
56 if (Clazz.exceptionOf (e, Exception)) {\r
57 e.printStackTrace ();\r
58 } else {\r
59 throw e;\r
60 }\r
61 }\r
62 for (var i = 1; i < 8; i++) {\r
63 this.xCombobox.addItem ("dim " + i);\r
64 this.yCombobox.addItem ("dim " + i);\r
65 this.zCombobox.addItem ("dim " + i);\r
66 }\r
67 this.av = av;\r
68 var selected = av.getSelectionGroup () != null && av.getSelectionGroup ().getSize () > 0;\r
69 var seqstrings = av.getAlignmentView (selected);\r
70 var nucleotide = av.getAlignment ().isNucleotide ();\r
71 var seqs;\r
72 if (!selected) {\r
73 seqs = av.getAlignment ().getSequencesArray ();\r
74 } else {\r
75 seqs = av.getSelectionGroup ().getSequencesInOrder (av.getAlignment ());\r
76 }var sq = seqstrings.getSequences ();\r
77 var length = sq[0].getWidth ();\r
78 for (var i = 0; i < seqs.length; i++) {\r
79 if (sq[i].getWidth () != length) {\r
80 System.out.println ("Sequences must be equal length for PCA analysis");\r
81 return;\r
82 }}\r
83 this.pcaModel =  new jalview.viewmodel.PCAModel (seqstrings, seqs, nucleotide);\r
84 this.rc =  new jalview.appletgui.RotatableCanvas (av);\r
85 this.embedMenuIfNeeded (this.rc);\r
86 this.add (this.rc, "Center");\r
87 jalview.bin.JalviewLite.addFrame (this, jalview.util.MessageManager.getString ("label.principal_component_analysis"), 475, 400);\r
88 var worker =  new Thread (this);\r
89 worker.start ();\r
90 }, "jalview.appletgui.AlignViewport");\r
91 Clazz.overrideMethod (c$, "run", \r
92 function () {\r
93 this.calcSettings.setEnabled (false);\r
94 this.rc.setEnabled (false);\r
95 try {\r
96 this.nuclSetting.setState (this.pcaModel.isNucleotide ());\r
97 this.protSetting.setState (!this.pcaModel.isNucleotide ());\r
98 this.pcaModel.run ();\r
99 this.xCombobox.select (new Integer (0));\r
100 this.yCombobox.select (new Integer (1));\r
101 this.zCombobox.select (new Integer (2));\r
102 this.pcaModel.updateRc (this.rc);\r
103 this.top = this.pcaModel.getTop ();\r
104 } catch (x) {\r
105 if (Clazz.exceptionOf (x, OutOfMemoryError)) {\r
106 System.err.println ("Out of memory when calculating PCA.");\r
107 return;\r
108 } else {\r
109 throw x;\r
110 }\r
111 }\r
112 this.calcSettings.setEnabled (true);\r
113 this.rc.setEnabled (true);\r
114 this.rc.repaint ();\r
115 this.repaint ();\r
116 });\r
117 Clazz.defineMethod (c$, "doDimensionChange", \r
118 function () {\r
119 if (this.top == 0) {\r
120 return;\r
121 }var dim1 = this.top - this.xCombobox.getSelectedIndex ();\r
122 var dim2 = this.top - this.yCombobox.getSelectedIndex ();\r
123 var dim3 = this.top - this.zCombobox.getSelectedIndex ();\r
124 this.pcaModel.updateRcView (dim1, dim2, dim3);\r
125 this.rc.img = null;\r
126 this.rc.rotmat.setIdentity ();\r
127 this.rc.initAxes ();\r
128 this.rc.paint (this.rc.getGraphics ());\r
129 });\r
130 Clazz.overrideMethod (c$, "actionPerformed", \r
131 function (evt) {\r
132 if (evt.getSource () === this.inputData) {\r
133 this.showOriginalData ();\r
134 }if (evt.getSource () === this.resetButton) {\r
135 this.xCombobox.select (new Integer (0));\r
136 this.yCombobox.select (new Integer (1));\r
137 this.zCombobox.select (new Integer (2));\r
138 this.doDimensionChange ();\r
139 }if (evt.getSource () === this.values) {\r
140 this.values_actionPerformed ();\r
141 }}, "java.awt.event.ActionEvent");\r
142 Clazz.overrideMethod (c$, "itemStateChanged", \r
143 function (evt) {\r
144 if (evt.getSource () === this.xCombobox) {\r
145 this.xCombobox_actionPerformed ();\r
146 } else if (evt.getSource () === this.yCombobox) {\r
147 this.yCombobox_actionPerformed ();\r
148 } else if (evt.getSource () === this.zCombobox) {\r
149 this.zCombobox_actionPerformed ();\r
150 } else if (evt.getSource () === this.labels) {\r
151 this.labels_itemStateChanged (evt);\r
152 } else if (evt.getSource () === this.nuclSetting) {\r
153 if (!this.pcaModel.isNucleotide ()) {\r
154 this.pcaModel.setNucleotide (true);\r
155  new Thread (this).start ();\r
156 }} else if (evt.getSource () === this.protSetting) {\r
157 if (this.pcaModel.isNucleotide ()) {\r
158 this.pcaModel.setNucleotide (false);\r
159  new Thread (this).start ();\r
160 }}}, "java.awt.event.ItemEvent");\r
161 Clazz.defineMethod (c$, "xCombobox_actionPerformed", \r
162 function () {\r
163 this.doDimensionChange ();\r
164 });\r
165 Clazz.defineMethod (c$, "yCombobox_actionPerformed", \r
166 function () {\r
167 this.doDimensionChange ();\r
168 });\r
169 Clazz.defineMethod (c$, "zCombobox_actionPerformed", \r
170 function () {\r
171 this.doDimensionChange ();\r
172 });\r
173 Clazz.defineMethod (c$, "values_actionPerformed", \r
174 function () {\r
175 var cap =  new jalview.appletgui.CutAndPasteTransfer (false, null);\r
176 var frame =  new awt2swing.Frame ();\r
177 frame.add (cap);\r
178 jalview.bin.JalviewLite.addFrame (frame, jalview.util.MessageManager.getString ("label.pca_details"), 500, 500);\r
179 cap.setText (this.pcaModel.getDetails ());\r
180 });\r
181 Clazz.defineMethod (c$, "showOriginalData", \r
182 function () {\r
183 var gc = '-';\r
184 try {\r
185 gc = this.av.getGapCharacter ();\r
186 } catch (ex) {\r
187 if (Clazz.exceptionOf (ex, Exception)) {\r
188 } else {\r
189 throw ex;\r
190 }\r
191 }\r
192 ;var alAndColsel = this.pcaModel.getSeqtrings ().getAlignmentAndColumnSelection (gc);\r
193 if (alAndColsel != null && alAndColsel[0] != null) {\r
194 var al =  new jalview.datamodel.Alignment (alAndColsel[0]);\r
195 var af =  new jalview.appletgui.AlignFrame (al, this.av.applet, "Original Data for PCA", false);\r
196 af.viewport.setHiddenColumns (alAndColsel[1]);\r
197 }});\r
198 Clazz.defineMethod (c$, "labels_itemStateChanged", \r
199 function (itemEvent) {\r
200 this.rc.showLabels (this.labels.getState ());\r
201 }, "java.awt.event.ItemEvent");\r
202 Clazz.defineMethod (c$, "jbInit", \r
203  function () {\r
204 this.setLayout (this.borderLayout1);\r
205 this.jPanel2.setLayout (this.flowLayout1);\r
206 this.jLabel1.setFont ( new java.awt.Font ("Verdana", 0, 12));\r
207 this.jLabel1.setText ("x=");\r
208 this.jLabel2.setFont ( new java.awt.Font ("Verdana", 0, 12));\r
209 this.jLabel2.setText ("y=");\r
210 this.jLabel3.setFont ( new java.awt.Font ("Verdana", 0, 12));\r
211 this.jLabel3.setText ("z=");\r
212 this.jPanel2.setBackground (java.awt.Color.white);\r
213 this.zCombobox.setFont ( new java.awt.Font ("Verdana", 0, 12));\r
214 this.zCombobox.addItemListener (this);\r
215 this.yCombobox.setFont ( new java.awt.Font ("Verdana", 0, 12));\r
216 this.yCombobox.addItemListener (this);\r
217 this.xCombobox.setFont ( new java.awt.Font ("Verdana", 0, 12));\r
218 this.xCombobox.addItemListener (this);\r
219 this.resetButton.setFont ( new java.awt.Font ("Verdana", 0, 12));\r
220 this.resetButton.setLabel (jalview.util.MessageManager.getString ("action.reset"));\r
221 this.resetButton.addActionListener (this);\r
222 this.setMenuBar (this.menuBar1);\r
223 this.menu1.setLabel (jalview.util.MessageManager.getString ("action.file"));\r
224 this.menu2.setLabel (jalview.util.MessageManager.getString ("action.view"));\r
225 this.calcSettings.setLabel (jalview.util.MessageManager.getString ("action.change_params"));\r
226 this.labels.setLabel (jalview.util.MessageManager.getString ("label.labels"));\r
227 this.labels.addItemListener (this);\r
228 this.values.setLabel (jalview.util.MessageManager.getString ("label.output_values"));\r
229 this.values.addActionListener (this);\r
230 this.inputData.setLabel (jalview.util.MessageManager.getString ("label.input_data"));\r
231 this.nuclSetting.setLabel (jalview.util.MessageManager.getString ("label.nucleotide_matrix"));\r
232 this.nuclSetting.addItemListener (this);\r
233 this.protSetting.setLabel (jalview.util.MessageManager.getString ("label.protein_matrix"));\r
234 this.protSetting.addItemListener (this);\r
235 this.add (this.jPanel2, "South");\r
236 this.jPanel2.add (this.jLabel1, null);\r
237 this.jPanel2.add (this.xCombobox, null);\r
238 this.jPanel2.add (this.jLabel2, null);\r
239 this.jPanel2.add (this.yCombobox, null);\r
240 this.jPanel2.add (this.jLabel3, null);\r
241 this.jPanel2.add (this.zCombobox, null);\r
242 this.jPanel2.add (this.resetButton, null);\r
243 this.menuBar1.add (this.menu1);\r
244 this.menuBar1.add (this.menu2);\r
245 this.menuBar1.add (this.calcSettings);\r
246 this.menu2.add (this.labels);\r
247 this.menu1.add (this.values);\r
248 this.menu1.add (this.inputData);\r
249 this.calcSettings.add (this.nuclSetting);\r
250 this.calcSettings.add (this.protSetting);\r
251 this.inputData.addActionListener (this);\r
252 });\r
253 });\r