7bcea33071d4f2f7f208bd471680ed430cc3c097
[jalview.git] / src / jalview / gui / Jalview2XML_V1.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.4)\r
3  * Copyright (C) 2008 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 java.io.*;\r
22 import java.net.*;\r
23 import java.util.*;\r
24 import java.util.jar.*;\r
25 \r
26 import javax.swing.*;\r
27 \r
28 import org.exolab.castor.xml.*;\r
29 import jalview.binding.*;\r
30 import jalview.schemes.*;\r
31 import jalview.util.jarInputStreamProvider;\r
32 \r
33 /**\r
34  * DOCUMENT ME!\r
35  * \r
36  * @author $author$\r
37  * @version $Revision$\r
38  */\r
39 public class Jalview2XML_V1\r
40 {\r
41   boolean raiseGUI = true;\r
42 \r
43   public Jalview2XML_V1()\r
44   {\r
45 \r
46   };\r
47 \r
48   public Jalview2XML_V1(boolean raiseGUI)\r
49   {\r
50     this.raiseGUI = raiseGUI;\r
51   };\r
52 \r
53   jalview.schemes.UserColourScheme GetUserColourScheme(\r
54           JalviewModelSequence jms, String id)\r
55   {\r
56     UserColours[] uc = jms.getUserColours();\r
57     UserColours colours = null;\r
58 \r
59     for (int i = 0; i < uc.length; i++)\r
60     {\r
61       if (uc[i].getId().equals(id))\r
62       {\r
63         colours = uc[i];\r
64 \r
65         break;\r
66       }\r
67     }\r
68 \r
69     int csize = colours.getUserColourScheme().getColourCount();\r
70     java.awt.Color[] newColours = new java.awt.Color[csize];\r
71 \r
72     for (int i = 0; i < csize; i++)\r
73     {\r
74       newColours[i] = new java.awt.Color(Integer.parseInt(colours\r
75               .getUserColourScheme().getColour(i).getRGB(), 16));\r
76     }\r
77 \r
78     return new jalview.schemes.UserColourScheme(newColours);\r
79   }\r
80 \r
81   /**\r
82    * DOCUMENT ME!\r
83    * \r
84    * @param file\r
85    *                DOCUMENT ME!\r
86    */\r
87   public AlignFrame LoadJalviewAlign(final jarInputStreamProvider jprovider)\r
88   {\r
89     final String file  = jprovider.getFilename();\r
90     jalview.gui.AlignFrame af = null;\r
91 \r
92     try\r
93     {\r
94       JarInputStream jin = null;\r
95       JarEntry jarentry = null;\r
96       int entryCount = 1;\r
97 \r
98       do\r
99       {\r
100         jin = jprovider.getJarInputStream();\r
101 \r
102         for (int i = 0; i < entryCount; i++)\r
103         {\r
104           jarentry = jin.getNextJarEntry();\r
105         }\r
106 \r
107         class NoDescIDResolver implements IDResolver\r
108         {\r
109           public Object resolve(String idref)\r
110           {\r
111             System.out.println(idref + " used");\r
112             return null;\r
113           }\r
114         }\r
115 \r
116         if (jarentry != null)\r
117         {\r
118           InputStreamReader in = new InputStreamReader(jin, "UTF-8");\r
119           JalviewModel object = new JalviewModel();\r
120 \r
121           object = (JalviewModel) object.unmarshal(in);\r
122 \r
123           af = LoadFromObject(object, file);\r
124           entryCount++;\r
125         }\r
126       } while (jarentry != null);\r
127     } catch (final java.net.UnknownHostException ex)\r
128     {\r
129       ex.printStackTrace();\r
130       if (raiseGUI)\r
131       {\r
132         javax.swing.SwingUtilities.invokeLater(new Runnable()\r
133         {\r
134           public void run()\r
135           {\r
136 \r
137             System.err.println("Couldn't locate Jalview XML file : " + ex\r
138                     + "\n");\r
139             JOptionPane.showInternalMessageDialog(Desktop.desktop,\r
140                     "Couldn't locate " + file, "URL not found",\r
141                     JOptionPane.WARNING_MESSAGE);\r
142           }\r
143         });\r
144       }\r
145       ;\r
146     } catch (Exception ex)\r
147     {\r
148       System.err.println("Exception whilst loading jalview XML file : ");\r
149       ex.printStackTrace();\r
150       if (raiseGUI)\r
151       {\r
152         javax.swing.SwingUtilities.invokeLater(new Runnable()\r
153         {\r
154           public void run()\r
155           {\r
156 \r
157             JOptionPane.showInternalMessageDialog(Desktop.desktop,\r
158                     "Error loading  " + file, "Error loading Jalview file",\r
159                     JOptionPane.WARNING_MESSAGE);\r
160           }\r
161         });\r
162       }\r
163     }\r
164 \r
165     return af;\r
166   }\r
167 \r
168   AlignFrame LoadFromObject(JalviewModel object, String file)\r
169   {\r
170     Vector seqids = new Vector();\r
171     SequenceSet vamsasSet = object.getVamsasModel().getSequenceSet(0);\r
172     Sequence[] vamsasSeq = vamsasSet.getSequence();\r
173 \r
174     JalviewModelSequence jms = object.getJalviewModelSequence();\r
175 \r
176     // ////////////////////////////////\r
177     // LOAD SEQUENCES\r
178     jalview.datamodel.Sequence[] jseqs = new jalview.datamodel.Sequence[vamsasSeq.length];\r
179     JSeq[] JSEQ = object.getJalviewModelSequence().getJSeq();\r
180     for (int i = 0; i < vamsasSeq.length; i++)\r
181     {\r
182       jseqs[i] = new jalview.datamodel.Sequence(vamsasSeq[i].getName(),\r
183               vamsasSeq[i].getSequence());\r
184       jseqs[i].setStart(JSEQ[i].getStart());\r
185       jseqs[i].setEnd(JSEQ[i].getEnd());\r
186       seqids.add(jseqs[i]);\r
187     }\r
188 \r
189     // /SequenceFeatures are added to the DatasetSequence,\r
190     // so we must create the dataset before loading features\r
191     // ///////////////////////////////\r
192     jalview.datamodel.Alignment al = new jalview.datamodel.Alignment(jseqs);\r
193     al.setDataset(null);\r
194     // ///////////////////////////////\r
195 \r
196     for (int i = 0; i < vamsasSeq.length; i++)\r
197     {\r
198       if (JSEQ[i].getFeaturesCount() > 0)\r
199       {\r
200         Features[] features = JSEQ[i].getFeatures();\r
201         for (int f = 0; f < features.length; f++)\r
202         {\r
203           jalview.datamodel.SequenceFeature sf = new jalview.datamodel.SequenceFeature(\r
204                   features[f].getType(), features[f].getDescription(),\r
205                   features[f].getStatus(), features[f].getBegin(),\r
206                   features[f].getEnd(), null);\r
207 \r
208           al.getSequenceAt(i).getDatasetSequence().addSequenceFeature(sf);\r
209         }\r
210       }\r
211       if (JSEQ[i].getPdbidsCount() > 0)\r
212       {\r
213         Pdbids[] ids = JSEQ[i].getPdbids();\r
214         for (int p = 0; p < ids.length; p++)\r
215         {\r
216           jalview.datamodel.PDBEntry entry = new jalview.datamodel.PDBEntry();\r
217           entry.setId(ids[p].getId());\r
218           entry.setType(ids[p].getType());\r
219           al.getSequenceAt(i).getDatasetSequence().addPDBId(entry);\r
220         }\r
221 \r
222       }\r
223     }\r
224 \r
225     // ///////////////////////////////\r
226     // ////////////////////////////////\r
227     // LOAD ANNOTATIONS\r
228     if (vamsasSet.getAnnotation() != null)\r
229     {\r
230       Annotation[] an = vamsasSet.getAnnotation();\r
231 \r
232       for (int i = 0; i < an.length; i++)\r
233       {\r
234         AnnotationElement[] ae = an[i].getAnnotationElement();\r
235         jalview.datamodel.Annotation[] anot = new jalview.datamodel.Annotation[al\r
236                 .getWidth()];\r
237 \r
238         for (int aa = 0; aa < ae.length; aa++)\r
239         {\r
240           anot[ae[aa].getPosition()] = new jalview.datamodel.Annotation(\r
241                   ae[aa].getDisplayCharacter(), ae[aa].getDescription(),\r
242                   ae[aa].getSecondaryStructure().charAt(0), ae[aa]\r
243                           .getValue());\r
244         }\r
245 \r
246         jalview.datamodel.AlignmentAnnotation jaa = null;\r
247 \r
248         if (an[i].getGraph())\r
249         {\r
250           jaa = new jalview.datamodel.AlignmentAnnotation(an[i].getLabel(),\r
251                   an[i].getDescription(), anot, 0, 0,\r
252                   jalview.datamodel.AlignmentAnnotation.BAR_GRAPH);\r
253         }\r
254         else\r
255         {\r
256           jaa = new jalview.datamodel.AlignmentAnnotation(an[i].getLabel(),\r
257                   an[i].getDescription(), anot);\r
258         }\r
259 \r
260         al.addAnnotation(jaa);\r
261       }\r
262     }\r
263 \r
264     // ///////////////////////////////\r
265     // LOAD VIEWPORT\r
266     Viewport[] views = jms.getViewport();\r
267     Viewport view = views[0]; // DEAL WITH MULTIPLE VIEWPORTS LATER\r
268 \r
269     AlignFrame af = new AlignFrame(al, view.getWidth(), view.getHeight());\r
270 \r
271     af.setFileName(file, "Jalview");\r
272 \r
273     for (int i = 0; i < JSEQ.length; i++)\r
274     {\r
275       af.viewport.setSequenceColour(af.viewport.alignment.getSequenceAt(i),\r
276               new java.awt.Color(JSEQ[i].getColour()));\r
277     }\r
278 \r
279     // af.changeColour() );\r
280     // ///////////////////////\r
281     // LOAD GROUPS\r
282     if (jms.getJGroupCount() > 0)\r
283     {\r
284       JGroup[] groups = jms.getJGroup();\r
285 \r
286       for (int i = 0; i < groups.length; i++)\r
287       {\r
288         ColourSchemeI cs = null;\r
289 \r
290         if (groups[i].getColour() != null)\r
291         {\r
292           if (groups[i].getColour().startsWith("ucs"))\r
293           {\r
294             cs = GetUserColourScheme(jms, groups[i].getColour());\r
295           }\r
296           else\r
297           {\r
298             cs = ColourSchemeProperty.getColour(al, groups[i].getColour());\r
299           }\r
300 \r
301           if (cs != null)\r
302           {\r
303             cs.setThreshold(groups[i].getPidThreshold(), true);\r
304           }\r
305 \r
306         }\r
307 \r
308         Vector seqs = new Vector();\r
309         int[] ids = groups[i].getSeq();\r
310 \r
311         for (int s = 0; s < ids.length; s++)\r
312         {\r
313           seqs.addElement((jalview.datamodel.SequenceI) seqids\r
314                   .elementAt(ids[s]));\r
315         }\r
316 \r
317         jalview.datamodel.SequenceGroup sg = new jalview.datamodel.SequenceGroup(\r
318                 seqs, groups[i].getName(), cs, groups[i].getDisplayBoxes(),\r
319                 groups[i].getDisplayText(), groups[i].getColourText(),\r
320                 groups[i].getStart(), groups[i].getEnd());\r
321 \r
322         sg\r
323                 .setOutlineColour(new java.awt.Color(groups[i]\r
324                         .getOutlineColour()));\r
325 \r
326         if (groups[i].getConsThreshold() != 0)\r
327         {\r
328           jalview.analysis.Conservation c = new jalview.analysis.Conservation(\r
329                   "All", ResidueProperties.propHash, 3, sg\r
330                           .getSequences(null), 0, sg.getWidth() - 1);\r
331           c.calculate();\r
332           c.verdict(false, 25);\r
333           sg.cs.setConservation(c);\r
334         }\r
335 \r
336         al.addGroup(sg);\r
337       }\r
338     }\r
339 \r
340     af.setBounds(view.getXpos(), view.getYpos(), view.getWidth(), view\r
341             .getHeight());\r
342     af.viewport.setStartRes(view.getStartRes());\r
343     af.viewport.setStartSeq(view.getStartSeq());\r
344     af.viewport.setShowAnnotation(view.getShowAnnotation());\r
345     af.viewport.setAbovePIDThreshold(view.getPidSelected());\r
346     af.viewport.setColourText(view.getShowColourText());\r
347     af.viewport.setConservationSelected(view.getConservationSelected());\r
348     af.viewport.setShowJVSuffix(view.getShowFullId());\r
349     af.viewport.setFont(new java.awt.Font(view.getFontName(), view\r
350             .getFontStyle(), view.getFontSize()));\r
351     af.alignPanel.fontChanged();\r
352 \r
353     af.viewport.setRenderGaps(view.getRenderGaps());\r
354     af.viewport.setWrapAlignment(view.getWrapAlignment());\r
355     af.alignPanel.setWrapAlignment(view.getWrapAlignment());\r
356     af.viewport.setShowAnnotation(view.getShowAnnotation());\r
357     af.alignPanel.setAnnotationVisible(view.getShowAnnotation());\r
358     af.viewport.setShowBoxes(view.getShowBoxes());\r
359     af.viewport.setShowText(view.getShowText());\r
360 \r
361     ColourSchemeI cs = null;\r
362 \r
363     if (view.getBgColour() != null)\r
364     {\r
365       if (view.getBgColour().startsWith("ucs"))\r
366       {\r
367         cs = GetUserColourScheme(jms, view.getBgColour());\r
368       }\r
369       else\r
370       {\r
371         cs = ColourSchemeProperty.getColour(al, view.getBgColour());\r
372       }\r
373 \r
374       if (cs != null)\r
375       {\r
376         cs.setThreshold(view.getPidThreshold(), true);\r
377         cs.setConsensus(af.viewport.hconsensus);\r
378       }\r
379     }\r
380 \r
381     af.viewport.setGlobalColourScheme(cs);\r
382     af.viewport.setColourAppliesToAllGroups(false);\r
383     af.changeColour(cs);\r
384     if (view.getConservationSelected() && cs != null)\r
385     {\r
386       cs.setConservationInc(view.getConsThreshold());\r
387     }\r
388 \r
389     af.viewport.setColourAppliesToAllGroups(true);\r
390     af.viewport.showSequenceFeatures = view.getShowSequenceFeatures();\r
391 \r
392     if (jms.getFeatureSettings() != null)\r
393     {\r
394       af.viewport.featuresDisplayed = new Hashtable();\r
395       String[] renderOrder = new String[jms.getFeatureSettings()\r
396               .getSettingCount()];\r
397       for (int fs = 0; fs < jms.getFeatureSettings().getSettingCount(); fs++)\r
398       {\r
399         Setting setting = jms.getFeatureSettings().getSetting(fs);\r
400 \r
401         af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(\r
402                 setting.getType(), new java.awt.Color(setting.getColour()));\r
403 \r
404         renderOrder[fs] = setting.getType();\r
405 \r
406         if (setting.getDisplay())\r
407         {\r
408           af.viewport.featuresDisplayed.put(setting.getType(), new Integer(\r
409                   setting.getColour()));\r
410         }\r
411       }\r
412       af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().renderOrder = renderOrder;\r
413     }\r
414 \r
415     af.setMenusFromViewport(af.viewport);\r
416 \r
417     Desktop.addInternalFrame(af, view.getTitle(), view.getWidth(), view\r
418             .getHeight());\r
419 \r
420     // LOAD TREES\r
421     // /////////////////////////////////////\r
422     if (jms.getTreeCount() > 0)\r
423     {\r
424       try\r
425       {\r
426         for (int t = 0; t < jms.getTreeCount(); t++)\r
427         {\r
428 \r
429           Tree tree = jms.getTree(t);\r
430 \r
431           TreePanel tp = af.ShowNewickTree(new jalview.io.NewickFile(tree\r
432                   .getNewick()), tree.getTitle(), tree.getWidth(), tree\r
433                   .getHeight(), tree.getXpos(), tree.getYpos());\r
434 \r
435           tp.fitToWindow.setState(tree.getFitToWindow());\r
436           tp.fitToWindow_actionPerformed(null);\r
437 \r
438           if (tree.getFontName() != null)\r
439           {\r
440             tp.setTreeFont(new java.awt.Font(tree.getFontName(), tree\r
441                     .getFontStyle(), tree.getFontSize()));\r
442           }\r
443           else\r
444           {\r
445             tp.setTreeFont(new java.awt.Font(view.getFontName(), view\r
446                     .getFontStyle(), tree.getFontSize()));\r
447           }\r
448 \r
449           tp.showPlaceholders(tree.getMarkUnlinked());\r
450           tp.showBootstrap(tree.getShowBootstrap());\r
451           tp.showDistances(tree.getShowDistances());\r
452 \r
453           tp.treeCanvas.threshold = tree.getThreshold();\r
454 \r
455           if (tree.getCurrentTree())\r
456           {\r
457             af.viewport.setCurrentTree(tp.getTree());\r
458           }\r
459         }\r
460 \r
461       } catch (Exception ex)\r
462       {\r
463         ex.printStackTrace();\r
464       }\r
465 \r
466     }\r
467 \r
468     return af;\r
469   }\r
470 }\r