5 import java.util.jar.*;
\r
7 import jalview.binding.*;
\r
8 import jalview.schemes.*;
\r
9 import javax.swing.JInternalFrame;
\r
12 public class Jalview2XML
\r
15 // SAVES SEVERAL ALIGNEMENT WINDOWS TO SAME JARFILE
\r
16 public static void SaveState(File statefile)
\r
18 long creation = System.currentTimeMillis();
\r
19 JInternalFrame[] frames = Desktop.desktop.getAllFrames();
\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
27 Vector shortNames = new Vector();
\r
28 for (int i = 0; i < frames.length; i++)
\r
30 if (frames[i] instanceof AlignFrame)
\r
32 AlignFrame af = (AlignFrame) frames[i];
\r
34 String shortName = af.getTitle();
\r
36 shortName = shortName.replace('/', '_');
\r
37 shortName = shortName.replace('\\', '_');
\r
40 while( shortNames.contains(shortName) )
\r
42 if(shortName.endsWith("_"+(count-1)))
\r
43 shortName = shortName.substring(0, shortName.lastIndexOf("_"));
\r
45 shortName = shortName.concat("_"+count);
\r
48 shortNames.addElement(shortName);
\r
50 if(!shortName.endsWith(".xml"))
\r
51 shortName = shortName+".xml";
\r
53 SaveState( af, creation, shortName, jout, out);
\r
59 catch(Exception ex){ex.printStackTrace();}
\r
62 // USE THIS METHOD TO SAVE A SINGLE ALIGNMENT WINDOW
\r
63 public static void SaveState( AlignFrame af, String jarFile, String fileName)
\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
72 SaveState(af, System.currentTimeMillis(), fileName, jout, out);
\r
75 }catch(Exception ex){}
\r
78 public static void SaveState( AlignFrame af, long timeStamp,
\r
79 String fileName, JarOutputStream jout, PrintWriter out)
\r
82 Vector seqids = new Vector();
\r
83 Vector userColours = new Vector();
\r
85 AlignViewport av = af.viewport;
\r
87 JalviewModel object = new JalviewModel();
\r
88 object.setVamsasModel( new VamsasModel() );
\r
90 object.setCreationDate( new java.util.Date(timeStamp) );
\r
92 jalview.datamodel.AlignmentI jal = af.viewport.alignment;
\r
94 SequenceSet vamsasSet = new SequenceSet();
\r
96 JalviewModelSequence jms = new JalviewModelSequence();
\r
98 vamsasSet.setGapChar(jal.getGapCharacter()+"");
\r
105 for(int i=0; i<jal.getHeight(); i++)
\r
107 seqids.add(jal.getSequenceAt(i));
\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
115 jseq.setStart(jal.getSequenceAt(i).getStart());
\r
116 jseq.setEnd(jal.getSequenceAt(i).getEnd());
\r
118 jseq.setColour(jal.getSequenceAt(i).getColor().getRGB());
\r
123 vamsasSet.addSequence(vamsasSeq);
\r
128 if(af.viewport.currentTree!=null)
\r
130 object.getVamsasModel().addTree(af.viewport.currentTree.toString());
\r
134 if(jal.getAlignmentAnnotation()!=null)
\r
137 jalview.datamodel.AlignmentAnnotation [] aa = jal.getAlignmentAnnotation();
\r
138 for(int i=0; i<aa.length; i++)
\r
140 if(aa[i].label.equals("Quality")
\r
141 || aa[i].label.equals("Conservation")
\r
142 || aa[i].label.equals("Consensus"))
\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
150 AnnotationElement ae;
\r
152 for(int a=0; a<aa[i].annotations.length; a++)
\r
154 if(aa[i]==null || aa[i].annotations[a]==null)
\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
162 ae.setSecondaryStructure(aa[i].annotations[a].secondaryStructure+"");
\r
163 an.addAnnotationElement(ae);
\r
166 vamsasSet.addAnnotation(an);
\r
172 if(jal.getGroups()!=null)
\r
174 JGroup [] groups = new JGroup[jal.getGroups().size()];
\r
175 for(int i=0; i<groups.length; i++)
\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
184 if(sg.cs instanceof ConservationColourScheme)
\r
185 groups[i].setConsThreshold( ((ConservationColourScheme)sg.cs).inc);
\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
193 if (sg.cs instanceof jalview.schemes.UserColourScheme)
\r
194 groups[i].setColour(SetUserColourScheme(sg.cs, userColours, jms));
\r
196 groups[i].setColour(ColourSchemeProperty.getColourName(sg.cs));
\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
203 for(int s=0; s<sg.getSize(); s++)
\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
211 jms.setJGroup(groups);
\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
226 if( av.getGlobalColourScheme() instanceof jalview.schemes.UserColourScheme)
\r
227 view.setBgColour( SetUserColourScheme(av.getGlobalColourScheme(),
\r
228 userColours, jms) );
\r
230 view.setBgColour( ColourSchemeProperty.getColourName
\r
231 ( av.getGlobalColourScheme()));
\r
233 ColourSchemeI cs = av.getGlobalColourScheme();
\r
234 if(cs instanceof ConservationColourScheme)
\r
235 view.setConsThreshold( ((ConservationColourScheme)cs).inc);
\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
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
260 jms.addViewport( view );
\r
262 object.setJalviewModelSequence(jms);
\r
263 object.getVamsasModel().addSequenceSet(vamsasSet);
\r
268 if(!fileName.endsWith(".xml"))
\r
269 fileName = fileName+".xml";
\r
271 JarEntry entry = new JarEntry(fileName);
\r
272 jout.putNextEntry(entry);
\r
274 object.marshal(out);
\r
276 catch (Exception ex)
\r
278 ex.printStackTrace();
\r
282 static String SetUserColourScheme(jalview.schemes.ColourSchemeI cs,
\r
283 Vector userColours,
\r
284 JalviewModelSequence jms)
\r
287 jalview.schemes.UserColourScheme ucs = (jalview.schemes.UserColourScheme)cs;
\r
288 if (!userColours.contains(ucs))
\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
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
300 id = "ucs"+userColours.indexOf(ucs);
\r
302 uc.setUserColourScheme(jbucs);
\r
303 jms.addUserColours(uc);
\r
308 static jalview.schemes.UserColourScheme GetUserColourScheme(JalviewModelSequence jms, String id)
\r
310 UserColours [] uc = jms.getUserColours();
\r
311 UserColours colours=null;
\r
312 for(int i=0; i<uc.length; i++)
\r
314 if(uc[i].getId().equals(id))
\r
315 { colours = uc[i]; break; }
\r
317 int csize = colours.getUserColourScheme().getColourCount();
\r
318 java.awt.Color [] newColours = new java.awt.Color[csize];
\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
324 return new jalview.schemes.UserColourScheme(newColours);
\r
329 public static void LoadJalviewAlign(String file)
\r
331 JalviewModel object = new JalviewModel();
\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
338 jin = new JarInputStream(new FileInputStream(file));
\r
339 for(int i=0; i<entryCount; i++)
\r
340 jarentry = jin.getNextJarEntry();
\r
344 InputStreamReader in = new InputStreamReader(jin, "UTF-8");
\r
345 object = (JalviewModel) object.unmarshal(in);
\r
346 LoadFromObject(object);
\r
349 }while(jarentry!=null);
\r
352 catch(Exception ex)
\r
353 { System.err.println("Exception whilst loading jalview XML file : "+ex+"\n");
\r
354 ex.printStackTrace(); return; }
\r
358 static void LoadFromObject(JalviewModel object)
\r
360 Vector seqids = new Vector();
\r
361 SequenceSet vamsasSet = object.getVamsasModel().getSequenceSet(0);
\r
362 Sequence [] vamsasSeq = vamsasSet.getSequence();
\r
364 JalviewModelSequence jms = object.getJalviewModelSequence();
\r
365 //////////////////////////////////
\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
371 jseqs[i] = new jalview.datamodel.Sequence(vamsasSeq[i].getName(),
\r
372 vamsasSeq[i].getSequence());
\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
380 /////////////////////////////////
\r
381 jalview.datamodel.Alignment al = new jalview.datamodel.Alignment(jseqs);
\r
382 /////////////////////////////////
\r
384 //////////////////////////////////
\r
386 if(vamsasSet.getAnnotation()!=null)
\r
388 Annotation[] an = vamsasSet.getAnnotation();
\r
389 for (int i = 0; i < an.length; i++)
\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
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
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
412 jaa = new jalview.datamodel.AlignmentAnnotation(an[i].getLabel(),
\r
413 an[i].getDescription(), anot);
\r
414 al.addAnnotation(jaa);
\r
418 /////////////////////////////////
\r
420 Viewport[] views = jms.getViewport();
\r
421 Viewport view = views[0]; // DEAL WITH MULTIPLE VIEWPORTS LATER
\r
423 AlignFrame af = new AlignFrame(al);
\r
424 // af.changeColour() );
\r
426 /////////////////////////
\r
428 if (jms.getJGroupCount()>0)
\r
430 JGroup[] groups = jms.getJGroup();
\r
431 for (int i = 0; i < groups.length; i++)
\r
433 ColourSchemeI cs=null;
\r
434 if(groups[i].getColour().startsWith("ucs"))
\r
435 cs = GetUserColourScheme(jms,groups[i].getColour());
\r
437 cs = ColourSchemeProperty.getColour(al, groups[i].getColour() );
\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
444 jalview.datamodel.SequenceGroup sg = new jalview.datamodel.SequenceGroup
\r
445 (groups[i].getName(),
\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
457 if(groups[i].getConsThreshold()!=0)
\r
459 jalview.analysis.Conservation c = new jalview.analysis.Conservation("All",
\r
460 ResidueProperties.propHash, 3,
\r
462 sg.getWidth() - 1);
\r
464 c.verdict(false, 25);
\r
465 cs = new ConservationColourScheme(c, cs);
\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
492 af.viewport.setWrapAlignment( view.getWrapAlignment() );
\r
493 if(view.getWrapAlignment())
\r
495 af.alignPanel.setWrapAlignment(view.getWrapAlignment());
\r
499 af.viewport.setShowAnnotation(view.getShowAnnotation());
\r
500 af.alignPanel.setAnnotationVisible(view.getShowAnnotation());
\r
503 af.viewport.setShowBoxes( view.getShowBoxes() );
\r
504 af.viewport.setShowText( view.getShowText() );
\r
506 ColourSchemeI cs=null;
\r
507 if (view.getBgColour().startsWith("ucs"))
\r
508 cs = GetUserColourScheme(jms, view.getBgColour());
\r
510 cs = ColourSchemeProperty.getColour(al, view.getBgColour());
\r
511 af.viewport.setGlobalColourScheme( cs );
\r
513 if(cs instanceof ConservationColourScheme)
\r
514 ( (ConservationColourScheme) cs).inc = view.getConsThreshold();
\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
521 af.viewport.setColourAppliesToAllGroups(false);
\r
522 af.changeColour(af.viewport.getGlobalColourScheme());
\r
523 af.viewport.setColourAppliesToAllGroups(true);
\r
526 //LOAD TREES - THIS RELEASE ONLY ALLOWS 1 TREE
\r
527 if(object.getVamsasModel().getTreeCount()>0)
\r
530 af.ShowNewickTree(new jalview.io.NewickFile(
\r
531 (String)object.getVamsasModel().getTree(0)), "Tree");
\r
532 }catch(Exception ex){ex.printStackTrace();}
\r