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