fa8e50b73c36da8daa48e03fa4b0bcd61c34217e
[jalview.git] / src / jalview / gui / Jalview2XML.java
1 package jalview.gui;\r
2 \r
3 import java.io.*;\r
4 import java.util.*;\r
5 import java.util.jar.*;\r
6 \r
7 import jalview.binding.*;\r
8 import jalview.schemes.*;\r
9 import javax.swing.JInternalFrame;\r
10 import java.net.URL;\r
11 \r
12 \r
13 public class Jalview2XML\r
14 {\r
15 \r
16   // SAVES SEVERAL ALIGNEMENT WINDOWS TO SAME JARFILE\r
17   public static void SaveState(File statefile)\r
18   {\r
19       long creation = System.currentTimeMillis();\r
20       JInternalFrame[] frames = Desktop.desktop.getAllFrames();\r
21       if(frames==null)\r
22         return;\r
23 \r
24       try{\r
25         FileOutputStream fos = new FileOutputStream(statefile);\r
26         JarOutputStream jout = new JarOutputStream(fos);\r
27         //NOTE UTF-8 MUST BE USED FOR WRITING UNICODE CHARS\r
28         ////////////////////////////////////////////////////\r
29         PrintWriter out = new PrintWriter(new OutputStreamWriter(jout, "UTF-8"));\r
30 \r
31         Vector shortNames = new Vector();\r
32         //REVERSE ORDER\r
33         for (int i = frames.length-1; i > -1; i--)\r
34         {\r
35           if (frames[i] instanceof AlignFrame)\r
36           {\r
37             AlignFrame af = (AlignFrame) frames[i];\r
38 \r
39             String shortName = af.getTitle();\r
40 \r
41             if(shortName.indexOf(File.separatorChar)>-1)\r
42               shortName = shortName.substring(\r
43                     shortName.lastIndexOf(File.separatorChar)+1);\r
44 \r
45             int count=1;\r
46             while( shortNames.contains(shortName) )\r
47             {\r
48               if(shortName.endsWith("_"+(count-1)))\r
49                 shortName = shortName.substring(0, shortName.lastIndexOf("_"));\r
50 \r
51               shortName = shortName.concat("_"+count);\r
52               count++;\r
53             }\r
54             shortNames.addElement(shortName);\r
55 \r
56             if(!shortName.endsWith(".xml"))\r
57               shortName = shortName+".xml";\r
58 \r
59             SaveState( af, creation, shortName, jout, out);\r
60            }\r
61         }\r
62         out.close();\r
63         jout.close();\r
64       }\r
65       catch(Exception ex){ex.printStackTrace();}\r
66   }\r
67 \r
68   // USE THIS METHOD TO SAVE A SINGLE ALIGNMENT WINDOW\r
69   public static void SaveState( AlignFrame af, String jarFile, String fileName)\r
70   {\r
71     try{\r
72       FileOutputStream fos = new FileOutputStream(jarFile);\r
73       JarOutputStream jout = new JarOutputStream(fos);\r
74       //NOTE UTF-8 MUST BE USED FOR WRITING UNICODE CHARS\r
75       ////////////////////////////////////////////////////\r
76       PrintWriter out = new PrintWriter(new OutputStreamWriter(jout, "UTF-8"));\r
77 \r
78       SaveState(af, System.currentTimeMillis(), fileName, jout, out);\r
79       out.close();\r
80       jout.close();\r
81     }catch(Exception ex){}\r
82   }\r
83 \r
84   public static void SaveState( AlignFrame af, long timeStamp,\r
85       String fileName, JarOutputStream jout, PrintWriter out)\r
86   {\r
87 \r
88     Vector seqids = new Vector();\r
89     Vector userColours = new Vector();\r
90 \r
91     AlignViewport av = af.viewport;\r
92 \r
93     JalviewModel object = new JalviewModel();\r
94     object.setVamsasModel( new VamsasModel() );\r
95 \r
96     object.setCreationDate( new java.util.Date(timeStamp) );\r
97 \r
98     jalview.datamodel.AlignmentI jal = af.viewport.alignment;\r
99 \r
100     SequenceSet vamsasSet = new SequenceSet();\r
101     Sequence vamsasSeq;\r
102     JalviewModelSequence jms = new JalviewModelSequence();\r
103 \r
104     vamsasSet.setGapChar(jal.getGapCharacter()+"");\r
105 \r
106     JSeq jseq;\r
107 \r
108 \r
109     //SAVE SEQUENCES\r
110     int id = 0;\r
111     for(int i=0; i<jal.getHeight(); i++)\r
112     {\r
113       seqids.add(jal.getSequenceAt(i));\r
114 \r
115       vamsasSeq = new Sequence( );\r
116       vamsasSeq.setId(id+"");\r
117       vamsasSeq.setName(jal.getSequenceAt(i).getName());\r
118       vamsasSeq.setSequence(jal.getSequenceAt(i).getSequence());\r
119 \r
120       jseq = new JSeq();\r
121       jseq.setStart(jal.getSequenceAt(i).getStart());\r
122       jseq.setEnd(jal.getSequenceAt(i).getEnd());\r
123 \r
124       jseq.setColour(jal.getSequenceAt(i).getColor().getRGB());\r
125 \r
126       jseq.setId( id );\r
127 \r
128       jms.addJSeq(jseq);\r
129       vamsasSet.addSequence(vamsasSeq);\r
130       id++;\r
131     }\r
132 \r
133     //SAVE TREES\r
134     if(af.viewport.currentTree!=null)\r
135     {\r
136       object.getVamsasModel().addTree(af.viewport.currentTree.toString());\r
137     }\r
138 \r
139     //SAVE ANNOTATIONS\r
140     if(jal.getAlignmentAnnotation()!=null)\r
141     {\r
142 \r
143       jalview.datamodel.AlignmentAnnotation [] aa = jal.getAlignmentAnnotation();\r
144       for(int i=0; i<aa.length; i++)\r
145       {\r
146         if(aa[i].label.equals("Quality")\r
147         || aa[i].label.equals("Conservation")\r
148         || aa[i].label.equals("Consensus"))\r
149        {    continue;}\r
150 \r
151         Annotation an = new Annotation();\r
152         an.setDescription(aa[i].description);\r
153         an.setGraph(aa[i].isGraph);\r
154         an.setLabel(aa[i].label);\r
155 \r
156         AnnotationElement ae;\r
157 \r
158         for(int a=0; a<aa[i].annotations.length; a++)\r
159         {\r
160           if(aa[i]==null || aa[i].annotations[a]==null)\r
161             continue;\r
162 \r
163           ae = new AnnotationElement();\r
164           ae.setDescription(aa[i].annotations[a].description);\r
165           ae.setDisplayCharacter(aa[i].annotations[a].displayCharacter);\r
166           ae.setValue(aa[i].annotations[a].value);\r
167           ae.setPosition(a);\r
168           ae.setSecondaryStructure(aa[i].annotations[a].secondaryStructure+"");\r
169           an.addAnnotationElement(ae);\r
170         }\r
171 \r
172         vamsasSet.addAnnotation(an);\r
173       }\r
174 \r
175     }\r
176 \r
177     //SAVE GROUPS\r
178     if(jal.getGroups()!=null)\r
179     {\r
180       JGroup [] groups = new JGroup[jal.getGroups().size()];\r
181       for(int i=0; i<groups.length; i++)\r
182       {\r
183         groups[i] = new JGroup();\r
184         jalview.datamodel.SequenceGroup sg\r
185             = (jalview.datamodel.SequenceGroup)jal.getGroups().elementAt(i);\r
186         groups[i].setStart( sg.getStartRes() );\r
187         groups[i].setEnd( sg.getEndRes() );\r
188         groups[i].setName( sg.getName());\r
189 \r
190         if(sg.cs instanceof ConservationColourScheme)\r
191           groups[i].setConsThreshold( ((ConservationColourScheme)sg.cs).inc);\r
192 \r
193         if (sg.cs instanceof ResidueColourScheme)\r
194           groups[i].setPidThreshold( ( (ResidueColourScheme) sg.cs).getThreshold());\r
195         else if (sg.cs instanceof ScoreColourScheme)\r
196           groups[i].setPidThreshold( ( (ScoreColourScheme) sg.cs).getThreshold());\r
197 \r
198 \r
199         if (sg.cs instanceof jalview.schemes.UserColourScheme)\r
200           groups[i].setColour(SetUserColourScheme(sg.cs, userColours, jms));\r
201         else\r
202           groups[i].setColour(ColourSchemeProperty.getColourName(sg.cs));\r
203 \r
204         groups[i].setOutlineColour(sg.getOutlineColour().getRGB());\r
205         groups[i].setDisplayBoxes(sg.getDisplayBoxes());\r
206         groups[i].setDisplayText(sg.getDisplayText());\r
207         groups[i].setColourText(sg.getColourText());\r
208 \r
209         for(int s=0; s<sg.getSize(); s++)\r
210         {\r
211           jalview.datamodel.Sequence seq = (jalview.datamodel.Sequence)sg.getSequenceAt(s);\r
212           int index = seqids.indexOf(seq);\r
213           groups[i].addSeq(index);\r
214         }\r
215 \r
216       }\r
217       jms.setJGroup(groups);\r
218 \r
219     }\r
220 \r
221     ///////////SAVE VIEWPORT\r
222     Viewport view = new Viewport();\r
223    view.setTitle(af.getTitle());\r
224    view.setXpos(af.getX());\r
225    view.setYpos(af.getY());\r
226    view.setWidth(af.getWidth());\r
227    view.setHeight(af.getHeight());\r
228    view.setStartRes(av.startRes);\r
229    view.setStartSeq(av.startSeq);\r
230 \r
231 \r
232  if( av.getGlobalColourScheme() instanceof jalview.schemes.UserColourScheme)\r
233    view.setBgColour( SetUserColourScheme(av.getGlobalColourScheme(),\r
234                                          userColours, jms) );\r
235  else\r
236    view.setBgColour( ColourSchemeProperty.getColourName\r
237                      ( av.getGlobalColourScheme()));\r
238 \r
239    ColourSchemeI cs = av.getGlobalColourScheme();\r
240    if(cs instanceof ConservationColourScheme)\r
241      view.setConsThreshold( ((ConservationColourScheme)cs).inc);\r
242 \r
243    if (cs instanceof ResidueColourScheme)\r
244      view.setPidThreshold( ( (ResidueColourScheme) cs).getThreshold());\r
245   else if (cs instanceof ScoreColourScheme)\r
246      view.setPidThreshold( ( (ScoreColourScheme) cs).getThreshold());\r
247 \r
248 \r
249    view.setConservationSelected(av.getConservationSelected());\r
250    view.setPidSelected(av.getAbovePIDThreshold());\r
251    view.setFontName(av.font.getFontName());\r
252    view.setFontSize(av.font.getSize());\r
253    view.setFontStyle(av.font.getStyle());\r
254    view.setRenderGaps(av.renderGaps);\r
255    view.setShowAnnotation(av.getShowAnnotation());\r
256    view.setShowBoxes(av.getShowBoxes());\r
257    view.setShowColourText(av.getColourText());\r
258    view.setShowConservation(av.showConservation);\r
259    view.setShowFullId(av.getShowFullId());\r
260    view.setShowIdentity(av.showIdentity);\r
261    view.setShowQuality(av.showQuality);\r
262    view.setShowSequenceFeatures(av.showSequenceFeatures);\r
263    view.setShowText(av.getShowText());\r
264    view.setWrapAlignment(av.getWrapAlignment());\r
265 \r
266    jms.addViewport( view );\r
267 \r
268     object.setJalviewModelSequence(jms);\r
269     object.getVamsasModel().addSequenceSet(vamsasSet);\r
270 \r
271 \r
272     try\r
273     {\r
274      if(!fileName.endsWith(".xml"))\r
275               fileName = fileName+".xml";\r
276 \r
277      JarEntry entry = new JarEntry(fileName);\r
278      jout.putNextEntry(entry);\r
279 \r
280       object.marshal(out);\r
281     }\r
282     catch (Exception ex)\r
283     {\r
284       ex.printStackTrace();\r
285     }\r
286   }\r
287 \r
288   static String SetUserColourScheme(jalview.schemes.ColourSchemeI cs,\r
289                                     Vector userColours,\r
290                                     JalviewModelSequence jms)\r
291   {\r
292     String id=null;\r
293     jalview.schemes.UserColourScheme ucs = (jalview.schemes.UserColourScheme)cs;\r
294     if (!userColours.contains(ucs))\r
295     {\r
296       userColours.add(ucs);\r
297       java.awt.Color [] colours = ucs.getColours();\r
298       jalview.binding.UserColours uc = new jalview.binding.UserColours();\r
299       jalview.binding.UserColourScheme jbucs = new jalview.binding.UserColourScheme();\r
300       for(int i=0; i<colours.length; i++)\r
301       {\r
302              jalview.binding.Colour col = new jalview.binding.Colour();\r
303              col.setRGB( jalview.util.Format.getHexString(colours[i]) );\r
304              jbucs.addColour(col);\r
305       }\r
306       id = "ucs"+userColours.indexOf(ucs);\r
307       uc.setId(id);\r
308       uc.setUserColourScheme(jbucs);\r
309       jms.addUserColours(uc);\r
310     }\r
311     return id;\r
312   }\r
313 \r
314   static jalview.schemes.UserColourScheme GetUserColourScheme(JalviewModelSequence jms, String id)\r
315   {\r
316     UserColours [] uc = jms.getUserColours();\r
317     UserColours colours=null;\r
318     for(int i=0; i<uc.length; i++)\r
319     {\r
320        if(uc[i].getId().equals(id))\r
321        {  colours = uc[i]; break;  }\r
322     }\r
323     int csize = colours.getUserColourScheme().getColourCount();\r
324     java.awt.Color [] newColours = new java.awt.Color[csize];\r
325 \r
326     for(int i=0; i<csize;i++)\r
327       newColours[i] = new java.awt.Color(\r
328         Integer.parseInt( colours.getUserColourScheme().getColour(i).getRGB(), 16) );\r
329 \r
330     return  new jalview.schemes.UserColourScheme(newColours);\r
331 \r
332   }\r
333 \r
334 \r
335   public static void LoadJalviewAlign(String file)\r
336   {\r
337     JalviewModel object = new JalviewModel();\r
338     try{\r
339       //UNMARSHALLER SEEMS TO CLOSE JARINPUTSTREAM, MOST ANNOYING\r
340 \r
341       URL url = null;\r
342       if( file.startsWith("http://"))\r
343        url = new URL(file);\r
344 \r
345       JarInputStream jin = null;\r
346       JarEntry jarentry=null;\r
347       int entryCount = 1;\r
348       do{\r
349         if (url != null)\r
350           jin = new JarInputStream(url.openStream());\r
351         else\r
352           jin = new JarInputStream(new FileInputStream(file));\r
353 \r
354         for(int i=0; i<entryCount; i++)\r
355           jarentry = jin.getNextJarEntry();\r
356 \r
357         if(jarentry!=null)\r
358         {\r
359           InputStreamReader in = new InputStreamReader(jin, "UTF-8");\r
360           object = (JalviewModel) object.unmarshal(in);\r
361           LoadFromObject(object);\r
362           entryCount++;\r
363         }\r
364       }while(jarentry!=null);\r
365 \r
366     }\r
367     catch(Exception ex)\r
368     {   System.err.println("Exception whilst loading jalview XML file : "+ex+"\n");\r
369      ex.printStackTrace(); return; }\r
370 \r
371   }\r
372 \r
373   static void LoadFromObject(JalviewModel object)\r
374   {\r
375      Vector seqids = new Vector();\r
376      SequenceSet vamsasSet = object.getVamsasModel().getSequenceSet(0);\r
377      Sequence [] vamsasSeq = vamsasSet.getSequence();\r
378 \r
379      JalviewModelSequence jms = object.getJalviewModelSequence();\r
380      //////////////////////////////////\r
381      //LOAD SEQUENCES\r
382      jalview.datamodel.Sequence [] jseqs = new jalview.datamodel.Sequence[vamsasSeq.length];\r
383      JSeq [] JSEQ = object.getJalviewModelSequence().getJSeq();\r
384      for(int i=0; i<vamsasSeq.length; i++)\r
385      {\r
386        jseqs[i] = new jalview.datamodel.Sequence(vamsasSeq[i].getName(),\r
387                                                  vamsasSeq[i].getSequence());\r
388 \r
389        jseqs[i].setStart( JSEQ[i].getStart());\r
390        jseqs[i].setEnd( JSEQ[i].getEnd());\r
391        jseqs[i].setColor( new java.awt.Color(JSEQ[i].getColour()) );\r
392        seqids.add(jseqs[i]);\r
393      }\r
394 \r
395      /////////////////////////////////\r
396      jalview.datamodel.Alignment al = new jalview.datamodel.Alignment(jseqs);\r
397      /////////////////////////////////\r
398 \r
399      //////////////////////////////////\r
400      //LOAD ANNOTATIONS\r
401      if(vamsasSet.getAnnotation()!=null)\r
402      {\r
403        Annotation[] an = vamsasSet.getAnnotation();\r
404        for (int i = 0; i < an.length; i++)\r
405        {\r
406          AnnotationElement[] ae = an[i].getAnnotationElement();\r
407          jalview.datamodel.Annotation anot[]\r
408              = new jalview.datamodel.Annotation[al.getWidth()];\r
409          for (int aa = 0; aa < ae.length; aa++)\r
410          {\r
411            anot[ae[aa].getPosition()]\r
412                = new jalview.datamodel.Annotation(\r
413                    ae[aa].getDisplayCharacter(),\r
414                    ae[aa].getDescription(),\r
415                    ae[aa].getSecondaryStructure().charAt(0),\r
416                    ae[aa].getValue()\r
417                );\r
418          }\r
419 \r
420 \r
421           jalview.datamodel.AlignmentAnnotation jaa = null;\r
422           if(an[i].getGraph())\r
423             jaa = new jalview.datamodel.AlignmentAnnotation(an[i].getLabel(),\r
424                                         an[i].getDescription(), anot,\r
425                                         0,0,1);\r
426           else\r
427             jaa = new jalview.datamodel.AlignmentAnnotation(an[i].getLabel(),\r
428                                         an[i].getDescription(), anot);\r
429           al.addAnnotation(jaa);\r
430        }\r
431      }\r
432 \r
433       /////////////////////////////////\r
434       // LOAD VIEWPORT\r
435       Viewport[] views = jms.getViewport();\r
436       Viewport view = views[0]; // DEAL WITH MULTIPLE VIEWPORTS LATER\r
437 \r
438       AlignFrame af = new AlignFrame(al);\r
439     //  af.changeColour() );\r
440 \r
441     /////////////////////////\r
442     //LOAD GROUPS\r
443     if (jms.getJGroupCount()>0)\r
444     {\r
445       JGroup[] groups = jms.getJGroup();\r
446       for (int i = 0; i < groups.length; i++)\r
447       {\r
448        ColourSchemeI cs=null;\r
449        if(groups[i].getColour()!=null)\r
450        {\r
451          if (groups[i].getColour().startsWith("ucs"))\r
452            cs = GetUserColourScheme(jms, groups[i].getColour());\r
453          else\r
454            cs = ColourSchemeProperty.getColour(al, groups[i].getColour());\r
455 \r
456          if (cs instanceof ResidueColourScheme)\r
457            ( (ResidueColourScheme) cs).setThreshold(groups[i].getPidThreshold());\r
458          else if (cs instanceof ScoreColourScheme)\r
459            ( (ScoreColourScheme) cs).setThreshold(groups[i].getPidThreshold());\r
460        }\r
461 \r
462         jalview.datamodel.SequenceGroup sg = new jalview.datamodel.SequenceGroup\r
463                 (groups[i].getName(),\r
464                  cs,\r
465                  groups[i].getDisplayBoxes(),\r
466                  groups[i].getDisplayText(),\r
467                  groups[i].getColourText(),\r
468                  groups[i].getStart(),\r
469                  groups[i].getEnd()) ;\r
470         sg.setOutlineColour( new java.awt.Color(groups[i].getOutlineColour()));\r
471         int [] ids = groups[i].getSeq();\r
472         for(int s=0; s<ids.length; s++)\r
473             sg.addSequence( (jalview.datamodel.SequenceI)seqids.elementAt( ids[s] ));\r
474 \r
475         if(groups[i].getConsThreshold()!=0)\r
476         {\r
477           jalview.analysis.Conservation c = new jalview.analysis.Conservation("All",\r
478               ResidueProperties.propHash, 3,\r
479               sg.sequences, 0,\r
480               sg.getWidth() - 1);\r
481           c.calculate();\r
482           c.verdict(false, 25);\r
483           cs = new ConservationColourScheme(c, cs);\r
484           sg.cs = cs;\r
485         }\r
486 \r
487 \r
488         al.addGroup(sg);\r
489       }\r
490     }\r
491 \r
492 \r
493     Desktop.addInternalFrame(af, view.getTitle(), AlignFrame.NEW_WINDOW_WIDTH, AlignFrame.NEW_WINDOW_HEIGHT);\r
494     af.setBounds(view.getXpos(), view.getYpos(), view.getWidth(), view.getHeight());\r
495     af.viewport.setStartRes( view.getStartRes() );\r
496     af.viewport.setStartSeq( view.getStartSeq() );\r
497     af.viewport.showConservation = view.getShowConservation();\r
498     af.viewport.showQuality = view.getShowQuality();\r
499     af.viewport.showIdentity= view.getShowIdentity();\r
500     af.viewport.setAbovePIDThreshold( view.getPidSelected() );\r
501     af.viewport.setColourText( view.getShowColourText() );\r
502     af.viewport.setConservationSelected( view.getConservationSelected());\r
503     af.viewport.setShowFullId( view.getShowFullId());\r
504     af.viewport.setFont( new java.awt.Font( view.getFontName(),\r
505                                             view.getFontStyle(),\r
506                                             view.getFontSize()));\r
507     af.alignPanel.fontChanged();\r
508     af.viewport.setRenderGaps( view.getRenderGaps() );\r
509 \r
510     af.viewport.setWrapAlignment( view.getWrapAlignment() );\r
511     if(view.getWrapAlignment())\r
512     {\r
513       af.alignPanel.setWrapAlignment(view.getWrapAlignment());\r
514     }\r
515     else\r
516     {\r
517       af.viewport.setShowAnnotation(view.getShowAnnotation());\r
518       af.alignPanel.setAnnotationVisible(view.getShowAnnotation());\r
519     }\r
520 \r
521     af.viewport.setShowBoxes( view.getShowBoxes() );\r
522     af.viewport.setShowText( view.getShowText() );\r
523 \r
524     ColourSchemeI cs=null;\r
525     if(view.getBgColour()!=null)\r
526     {\r
527 \r
528       if (view.getBgColour().startsWith("ucs"))\r
529         cs = GetUserColourScheme(jms, view.getBgColour());\r
530       else\r
531         cs = ColourSchemeProperty.getColour(al, view.getBgColour());\r
532 \r
533       if (cs instanceof ConservationColourScheme)\r
534         ( (ConservationColourScheme) cs).inc = view.getConsThreshold();\r
535 \r
536       if (cs instanceof ResidueColourScheme)\r
537         ( (ResidueColourScheme) cs).setThreshold(view.getPidThreshold());\r
538       else if (cs instanceof ScoreColourScheme)\r
539         ( (ScoreColourScheme) cs).setThreshold(view.getPidThreshold());\r
540 \r
541     }\r
542     af.viewport.setGlobalColourScheme( cs );\r
543 \r
544 \r
545     af.viewport.setColourAppliesToAllGroups(false);\r
546     af.changeColour(af.viewport.getGlobalColourScheme());\r
547     af.viewport.setColourAppliesToAllGroups(true);\r
548 \r
549 \r
550     //LOAD TREES - THIS RELEASE ONLY ALLOWS 1 TREE\r
551     if(object.getVamsasModel().getTreeCount()>0)\r
552     {\r
553       try{\r
554         af.ShowNewickTree(new jalview.io.NewickFile(\r
555             (String)object.getVamsasModel().getTree(0)), "Tree");\r
556       }catch(Exception ex){ex.printStackTrace();}\r
557     }\r
558 \r
559   }\r
560 }\r
561 \r
562 \r
563 \r