2 * Jalview - A Sequence Alignment Editor and Viewer
\r
3 * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
\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
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
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
20 package jalview.gui;
\r
24 import java.util.jar.*;
\r
26 import jalview.binding.*;
\r
27 import jalview.schemes.*;
\r
28 import javax.swing.JInternalFrame;
\r
29 import java.net.URL;
\r
30 import jalview.io.SequenceFeatureFetcher;
\r
33 public class Jalview2XML
\r
36 // SAVES SEVERAL ALIGNEMENT WINDOWS TO SAME JARFILE
\r
37 public static void SaveState(File statefile)
\r
39 long creation = System.currentTimeMillis();
\r
40 JInternalFrame[] frames = Desktop.desktop.getAllFrames();
\r
45 FileOutputStream fos = new FileOutputStream(statefile);
\r
46 JarOutputStream jout = new JarOutputStream(fos);
\r
47 //NOTE UTF-8 MUST BE USED FOR WRITING UNICODE CHARS
\r
48 ////////////////////////////////////////////////////
\r
49 PrintWriter out = new PrintWriter(new OutputStreamWriter(jout, "UTF-8"));
\r
51 Vector shortNames = new Vector();
\r
53 for (int i = frames.length-1; i > -1; i--)
\r
55 if (frames[i] instanceof AlignFrame)
\r
57 AlignFrame af = (AlignFrame) frames[i];
\r
59 String shortName = af.getTitle();
\r
61 if(shortName.indexOf(File.separatorChar)>-1)
\r
62 shortName = shortName.substring(
\r
63 shortName.lastIndexOf(File.separatorChar)+1);
\r
66 while( shortNames.contains(shortName) )
\r
68 if(shortName.endsWith("_"+(count-1)))
\r
69 shortName = shortName.substring(0, shortName.lastIndexOf("_"));
\r
71 shortName = shortName.concat("_"+count);
\r
74 shortNames.addElement(shortName);
\r
76 if(!shortName.endsWith(".xml"))
\r
77 shortName = shortName+".xml";
\r
79 SaveState( af, creation, shortName, jout, out);
\r
85 catch(Exception ex){ex.printStackTrace();}
\r
88 // USE THIS METHOD TO SAVE A SINGLE ALIGNMENT WINDOW
\r
89 public static void SaveState( AlignFrame af, String jarFile, String fileName)
\r
92 FileOutputStream fos = new FileOutputStream(jarFile);
\r
93 JarOutputStream jout = new JarOutputStream(fos);
\r
94 //NOTE UTF-8 MUST BE USED FOR WRITING UNICODE CHARS
\r
95 ////////////////////////////////////////////////////
\r
96 PrintWriter out = new PrintWriter(new OutputStreamWriter(jout, "UTF-8"));
\r
98 SaveState(af, System.currentTimeMillis(), fileName, jout, out);
\r
101 }catch(Exception ex){}
\r
104 public static void SaveState( AlignFrame af, long timeStamp,
\r
105 String fileName, JarOutputStream jout, PrintWriter out)
\r
108 Vector seqids = new Vector();
\r
109 Vector userColours = new Vector();
\r
111 AlignViewport av = af.viewport;
\r
113 JalviewModel object = new JalviewModel();
\r
114 object.setVamsasModel( new VamsasModel() );
\r
116 object.setCreationDate( new java.util.Date(timeStamp) );
\r
118 jalview.datamodel.AlignmentI jal = af.viewport.alignment;
\r
120 SequenceSet vamsasSet = new SequenceSet();
\r
121 Sequence vamsasSeq;
\r
122 JalviewModelSequence jms = new JalviewModelSequence();
\r
124 vamsasSet.setGapChar(jal.getGapCharacter()+"");
\r
131 for(int i=0; i<jal.getHeight(); i++)
\r
133 seqids.add(jal.getSequenceAt(i));
\r
135 vamsasSeq = new Sequence( );
\r
136 vamsasSeq.setId(id+"");
\r
137 vamsasSeq.setName(jal.getSequenceAt(i).getName());
\r
138 vamsasSeq.setSequence(jal.getSequenceAt(i).getSequence());
\r
141 jseq.setStart(jal.getSequenceAt(i).getStart());
\r
142 jseq.setEnd(jal.getSequenceAt(i).getEnd());
\r
144 jseq.setColour(jal.getSequenceAt(i).getColor().getRGB());
\r
149 vamsasSet.addSequence(vamsasSeq);
\r
154 if(af.viewport.currentTree!=null)
\r
156 object.getVamsasModel().addTree(af.viewport.currentTree.toString());
\r
160 if(jal.getAlignmentAnnotation()!=null)
\r
163 jalview.datamodel.AlignmentAnnotation [] aa = jal.getAlignmentAnnotation();
\r
164 for(int i=0; i<aa.length; i++)
\r
166 if(aa[i].label.equals("Quality")
\r
167 || aa[i].label.equals("Conservation")
\r
168 || aa[i].label.equals("Consensus"))
\r
171 Annotation an = new Annotation();
\r
172 an.setDescription(aa[i].description);
\r
173 an.setGraph(aa[i].isGraph);
\r
174 an.setLabel(aa[i].label);
\r
176 AnnotationElement ae;
\r
178 for(int a=0; a<aa[i].annotations.length; a++)
\r
180 if(aa[i]==null || aa[i].annotations[a]==null)
\r
183 ae = new AnnotationElement();
\r
184 ae.setDescription(aa[i].annotations[a].description);
\r
185 ae.setDisplayCharacter(aa[i].annotations[a].displayCharacter);
\r
186 ae.setValue(aa[i].annotations[a].value);
\r
188 ae.setSecondaryStructure(aa[i].annotations[a].secondaryStructure+"");
\r
189 an.addAnnotationElement(ae);
\r
192 vamsasSet.addAnnotation(an);
\r
198 if(jal.getGroups()!=null)
\r
200 JGroup [] groups = new JGroup[jal.getGroups().size()];
\r
201 for(int i=0; i<groups.length; i++)
\r
203 groups[i] = new JGroup();
\r
204 jalview.datamodel.SequenceGroup sg
\r
205 = (jalview.datamodel.SequenceGroup)jal.getGroups().elementAt(i);
\r
206 groups[i].setStart( sg.getStartRes() );
\r
207 groups[i].setEnd( sg.getEndRes() );
\r
208 groups[i].setName( sg.getName());
\r
210 if(sg.cs instanceof ConservationColourScheme)
\r
211 groups[i].setConsThreshold( ((ConservationColourScheme)sg.cs).inc);
\r
213 if (sg.cs instanceof ResidueColourScheme)
\r
214 groups[i].setPidThreshold( ( (ResidueColourScheme) sg.cs).getThreshold());
\r
215 else if (sg.cs instanceof ScoreColourScheme)
\r
216 groups[i].setPidThreshold( ( (ScoreColourScheme) sg.cs).getThreshold());
\r
219 if (sg.cs instanceof jalview.schemes.UserColourScheme)
\r
220 groups[i].setColour(SetUserColourScheme(sg.cs, userColours, jms));
\r
222 groups[i].setColour(ColourSchemeProperty.getColourName(sg.cs));
\r
224 groups[i].setOutlineColour(sg.getOutlineColour().getRGB());
\r
225 groups[i].setDisplayBoxes(sg.getDisplayBoxes());
\r
226 groups[i].setDisplayText(sg.getDisplayText());
\r
227 groups[i].setColourText(sg.getColourText());
\r
229 for(int s=0; s<sg.getSize(); s++)
\r
231 jalview.datamodel.Sequence seq = (jalview.datamodel.Sequence)sg.getSequenceAt(s);
\r
232 int index = seqids.indexOf(seq);
\r
233 groups[i].addSeq(index);
\r
237 jms.setJGroup(groups);
\r
241 ///////////SAVE VIEWPORT
\r
242 Viewport view = new Viewport();
\r
243 view.setTitle(af.getTitle());
\r
244 view.setXpos(af.getX());
\r
245 view.setYpos(af.getY());
\r
246 view.setWidth(af.getWidth());
\r
247 view.setHeight(af.getHeight());
\r
248 view.setStartRes(av.startRes);
\r
249 view.setStartSeq(av.startSeq);
\r
252 if( av.getGlobalColourScheme() instanceof jalview.schemes.UserColourScheme)
\r
253 view.setBgColour( SetUserColourScheme(av.getGlobalColourScheme(),
\r
254 userColours, jms) );
\r
256 view.setBgColour( ColourSchemeProperty.getColourName
\r
257 ( av.getGlobalColourScheme()));
\r
259 ColourSchemeI cs = av.getGlobalColourScheme();
\r
260 if(cs instanceof ConservationColourScheme)
\r
261 view.setConsThreshold( ((ConservationColourScheme)cs).inc);
\r
263 if (cs instanceof ResidueColourScheme)
\r
264 view.setPidThreshold( ( (ResidueColourScheme) cs).getThreshold());
\r
265 else if (cs instanceof ScoreColourScheme)
\r
266 view.setPidThreshold( ( (ScoreColourScheme) cs).getThreshold());
\r
269 view.setConservationSelected(av.getConservationSelected());
\r
270 view.setPidSelected(av.getAbovePIDThreshold());
\r
271 view.setFontName(av.font.getFontName());
\r
272 view.setFontSize(av.font.getSize());
\r
273 view.setFontStyle(av.font.getStyle());
\r
274 view.setRenderGaps(av.renderGaps);
\r
275 view.setShowAnnotation(av.getShowAnnotation());
\r
276 view.setShowBoxes(av.getShowBoxes());
\r
277 view.setShowColourText(av.getColourText());
\r
278 view.setShowConservation(av.showConservation);
\r
279 view.setShowFullId(av.getShowFullId());
\r
280 view.setShowIdentity(av.showIdentity);
\r
281 view.setShowQuality(av.showQuality);
\r
282 view.setShowSequenceFeatures(av.showSequenceFeatures);
\r
283 view.setShowText(av.getShowText());
\r
284 view.setWrapAlignment(av.getWrapAlignment());
\r
286 jms.addViewport( view );
\r
288 object.setJalviewModelSequence(jms);
\r
289 object.getVamsasModel().addSequenceSet(vamsasSet);
\r
294 if(!fileName.endsWith(".xml"))
\r
295 fileName = fileName+".xml";
\r
297 JarEntry entry = new JarEntry(fileName);
\r
298 jout.putNextEntry(entry);
\r
300 object.marshal(out);
\r
302 catch (Exception ex)
\r
304 ex.printStackTrace();
\r
308 static String SetUserColourScheme(jalview.schemes.ColourSchemeI cs,
\r
309 Vector userColours,
\r
310 JalviewModelSequence jms)
\r
313 jalview.schemes.UserColourScheme ucs = (jalview.schemes.UserColourScheme)cs;
\r
314 if (!userColours.contains(ucs))
\r
316 userColours.add(ucs);
\r
317 java.awt.Color [] colours = ucs.getColours();
\r
318 jalview.binding.UserColours uc = new jalview.binding.UserColours();
\r
319 jalview.binding.UserColourScheme jbucs = new jalview.binding.UserColourScheme();
\r
320 for(int i=0; i<colours.length; i++)
\r
322 jalview.binding.Colour col = new jalview.binding.Colour();
\r
323 col.setRGB( jalview.util.Format.getHexString(colours[i]) );
\r
324 jbucs.addColour(col);
\r
326 id = "ucs"+userColours.indexOf(ucs);
\r
328 uc.setUserColourScheme(jbucs);
\r
329 jms.addUserColours(uc);
\r
334 static jalview.schemes.UserColourScheme GetUserColourScheme(JalviewModelSequence jms, String id)
\r
336 UserColours [] uc = jms.getUserColours();
\r
337 UserColours colours=null;
\r
338 for(int i=0; i<uc.length; i++)
\r
340 if(uc[i].getId().equals(id))
\r
341 { colours = uc[i]; break; }
\r
343 int csize = colours.getUserColourScheme().getColourCount();
\r
344 java.awt.Color [] newColours = new java.awt.Color[csize];
\r
346 for(int i=0; i<csize;i++)
\r
347 newColours[i] = new java.awt.Color(
\r
348 Integer.parseInt( colours.getUserColourScheme().getColour(i).getRGB(), 16) );
\r
350 return new jalview.schemes.UserColourScheme(newColours);
\r
355 public static void LoadJalviewAlign(String file)
\r
357 JalviewModel object = new JalviewModel();
\r
359 //UNMARSHALLER SEEMS TO CLOSE JARINPUTSTREAM, MOST ANNOYING
\r
362 if( file.startsWith("http://"))
\r
363 url = new URL(file);
\r
365 JarInputStream jin = null;
\r
366 JarEntry jarentry=null;
\r
367 int entryCount = 1;
\r
370 jin = new JarInputStream(url.openStream());
\r
372 jin = new JarInputStream(new FileInputStream(file));
\r
374 for(int i=0; i<entryCount; i++)
\r
375 jarentry = jin.getNextJarEntry();
\r
379 InputStreamReader in = new InputStreamReader(jin, "UTF-8");
\r
380 object = (JalviewModel) object.unmarshal(in);
\r
381 LoadFromObject(object);
\r
384 }while(jarentry!=null);
\r
387 catch(Exception ex)
\r
388 { System.err.println("Exception whilst loading jalview XML file : "+ex+"\n");
\r
389 ex.printStackTrace(); return; }
\r
393 static void LoadFromObject(JalviewModel object)
\r
395 Vector seqids = new Vector();
\r
396 SequenceSet vamsasSet = object.getVamsasModel().getSequenceSet(0);
\r
397 Sequence [] vamsasSeq = vamsasSet.getSequence();
\r
399 JalviewModelSequence jms = object.getJalviewModelSequence();
\r
400 //////////////////////////////////
\r
402 jalview.datamodel.Sequence [] jseqs = new jalview.datamodel.Sequence[vamsasSeq.length];
\r
403 JSeq [] JSEQ = object.getJalviewModelSequence().getJSeq();
\r
404 for(int i=0; i<vamsasSeq.length; i++)
\r
406 jseqs[i] = new jalview.datamodel.Sequence(vamsasSeq[i].getName(),
\r
407 vamsasSeq[i].getSequence());
\r
409 jseqs[i].setStart( JSEQ[i].getStart());
\r
410 jseqs[i].setEnd( JSEQ[i].getEnd());
\r
411 jseqs[i].setColor( new java.awt.Color(JSEQ[i].getColour()) );
\r
412 seqids.add(jseqs[i]);
\r
415 /////////////////////////////////
\r
416 jalview.datamodel.Alignment al = new jalview.datamodel.Alignment(jseqs);
\r
417 /////////////////////////////////
\r
419 //////////////////////////////////
\r
421 if(vamsasSet.getAnnotation()!=null)
\r
423 Annotation[] an = vamsasSet.getAnnotation();
\r
424 for (int i = 0; i < an.length; i++)
\r
426 AnnotationElement[] ae = an[i].getAnnotationElement();
\r
427 jalview.datamodel.Annotation anot[]
\r
428 = new jalview.datamodel.Annotation[al.getWidth()];
\r
429 for (int aa = 0; aa < ae.length; aa++)
\r
431 anot[ae[aa].getPosition()]
\r
432 = new jalview.datamodel.Annotation(
\r
433 ae[aa].getDisplayCharacter(),
\r
434 ae[aa].getDescription(),
\r
435 ae[aa].getSecondaryStructure().charAt(0),
\r
441 jalview.datamodel.AlignmentAnnotation jaa = null;
\r
442 if(an[i].getGraph())
\r
443 jaa = new jalview.datamodel.AlignmentAnnotation(an[i].getLabel(),
\r
444 an[i].getDescription(), anot,
\r
447 jaa = new jalview.datamodel.AlignmentAnnotation(an[i].getLabel(),
\r
448 an[i].getDescription(), anot);
\r
449 al.addAnnotation(jaa);
\r
453 /////////////////////////////////
\r
455 Viewport[] views = jms.getViewport();
\r
456 Viewport view = views[0]; // DEAL WITH MULTIPLE VIEWPORTS LATER
\r
458 AlignFrame af = new AlignFrame(al);
\r
459 // af.changeColour() );
\r
461 /////////////////////////
\r
463 if (jms.getJGroupCount()>0)
\r
465 JGroup[] groups = jms.getJGroup();
\r
466 for (int i = 0; i < groups.length; i++)
\r
468 ColourSchemeI cs=null;
\r
469 if(groups[i].getColour()!=null)
\r
471 if (groups[i].getColour().startsWith("ucs"))
\r
472 cs = GetUserColourScheme(jms, groups[i].getColour());
\r
474 cs = ColourSchemeProperty.getColour(al, groups[i].getColour());
\r
476 if (cs instanceof ResidueColourScheme)
\r
477 ( (ResidueColourScheme) cs).setThreshold(groups[i].getPidThreshold());
\r
478 else if (cs instanceof ScoreColourScheme)
\r
479 ( (ScoreColourScheme) cs).setThreshold(groups[i].getPidThreshold());
\r
482 jalview.datamodel.SequenceGroup sg = new jalview.datamodel.SequenceGroup
\r
483 (groups[i].getName(),
\r
485 groups[i].getDisplayBoxes(),
\r
486 groups[i].getDisplayText(),
\r
487 groups[i].getColourText(),
\r
488 groups[i].getStart(),
\r
489 groups[i].getEnd()) ;
\r
490 sg.setOutlineColour( new java.awt.Color(groups[i].getOutlineColour()));
\r
491 int [] ids = groups[i].getSeq();
\r
492 for(int s=0; s<ids.length; s++)
\r
493 sg.addSequence( (jalview.datamodel.SequenceI)seqids.elementAt( ids[s] ));
\r
495 if(groups[i].getConsThreshold()!=0)
\r
497 jalview.analysis.Conservation c = new jalview.analysis.Conservation("All",
\r
498 ResidueProperties.propHash, 3,
\r
500 sg.getWidth() - 1);
\r
502 c.verdict(false, 25);
\r
503 cs = new ConservationColourScheme(c, cs);
\r
513 Desktop.addInternalFrame(af, view.getTitle(), AlignFrame.NEW_WINDOW_WIDTH, AlignFrame.NEW_WINDOW_HEIGHT);
\r
514 af.setBounds(view.getXpos(), view.getYpos(), view.getWidth(), view.getHeight());
\r
515 af.viewport.setStartRes( view.getStartRes() );
\r
516 af.viewport.setStartSeq( view.getStartSeq() );
\r
517 af.viewport.showConservation = view.getShowConservation();
\r
518 af.viewport.showQuality = view.getShowQuality();
\r
519 af.viewport.showIdentity= view.getShowIdentity();
\r
520 af.viewport.setAbovePIDThreshold( view.getPidSelected() );
\r
521 af.viewport.setColourText( view.getShowColourText() );
\r
522 af.viewport.setConservationSelected( view.getConservationSelected());
\r
523 af.viewport.setShowFullId( view.getShowFullId());
\r
524 af.viewport.setFont( new java.awt.Font( view.getFontName(),
\r
525 view.getFontStyle(),
\r
526 view.getFontSize()));
\r
527 af.alignPanel.fontChanged();
\r
529 af.sequenceFeatures_actionPerformed(null);
\r
530 af.viewport.setRenderGaps( view.getRenderGaps() );
\r
532 af.viewport.setWrapAlignment( view.getWrapAlignment() );
\r
533 if(view.getWrapAlignment())
\r
535 af.alignPanel.setWrapAlignment(view.getWrapAlignment());
\r
539 af.viewport.setShowAnnotation(view.getShowAnnotation());
\r
540 af.alignPanel.setAnnotationVisible(view.getShowAnnotation());
\r
543 af.viewport.setShowBoxes( view.getShowBoxes() );
\r
544 af.viewport.setShowText( view.getShowText() );
\r
546 ColourSchemeI cs=null;
\r
547 if(view.getBgColour()!=null)
\r
550 if (view.getBgColour().startsWith("ucs"))
\r
551 cs = GetUserColourScheme(jms, view.getBgColour());
\r
553 cs = ColourSchemeProperty.getColour(al, view.getBgColour());
\r
555 if (cs instanceof ConservationColourScheme)
\r
556 ( (ConservationColourScheme) cs).inc = view.getConsThreshold();
\r
558 if (cs instanceof ResidueColourScheme)
\r
559 ( (ResidueColourScheme) cs).setThreshold(view.getPidThreshold());
\r
560 else if (cs instanceof ScoreColourScheme)
\r
561 ( (ScoreColourScheme) cs).setThreshold(view.getPidThreshold());
\r
564 af.viewport.setGlobalColourScheme( cs );
\r
567 af.viewport.setColourAppliesToAllGroups(false);
\r
568 af.changeColour(af.viewport.getGlobalColourScheme());
\r
569 af.viewport.setColourAppliesToAllGroups(true);
\r
571 System.out.println(view.getShowSequenceFeatures());
\r
572 if( view.getShowSequenceFeatures() );
\r
574 SequenceFeatureFetcher sft = new SequenceFeatureFetcher(al, af.alignPanel);
\r
577 //LOAD TREES - THIS RELEASE ONLY ALLOWS 1 TREE
\r
578 if(object.getVamsasModel().getTreeCount()>0)
\r
581 af.ShowNewickTree(new jalview.io.NewickFile(
\r
582 (String)object.getVamsasModel().getTree(0)), "Tree");
\r
583 }catch(Exception ex){ex.printStackTrace();}
\r