69213af08b8117667964eb09e13eaf0aba712a67
[jalview.git] / src / jalview / io / VamsasDatastore.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2005 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 \r
20 package jalview.io;\r
21 \r
22 import org.vamsas.objects.core.*;\r
23 \r
24 import jalview.gui.*;\r
25 import java.io.*;\r
26 import java.util.jar.*;\r
27 \r
28 /*\r
29 \r
30  static {\r
31  org.exolab.castor.util.LocalConfiguration.getInstance().getProperties().setProperty(\r
32  "org.exolab.castor.serializer", "org.apache.xml.serialize.XMLSerilazizer");\r
33  }\r
34 \r
35 */\r
36 \r
37 public class VamsasDatastore\r
38 {\r
39         AlignViewport av;\r
40         org.exolab.castor.types.Date date\r
41               = new org.exolab.castor.types.Date(new java.util.Date());\r
42 \r
43         public VamsasDatastore(AlignViewport av)\r
44         {\r
45                 this.av = av;\r
46         }\r
47 \r
48         public void store(String file)\r
49         {\r
50           storeVAMSAS(file);\r
51         }\r
52 \r
53 \r
54 \r
55         public VAMSAS storeVAMSAS(String file)\r
56         {\r
57           long time = System.currentTimeMillis();\r
58           VAMSAS vamsas = new VAMSAS();\r
59 \r
60           try\r
61           {\r
62             FileOutputStream fos = new FileOutputStream(file);\r
63             JarOutputStream jout = new JarOutputStream(fos);\r
64 \r
65 \r
66             ////////////////////////////////////////////////////\r
67             //NOTE UTF-8 MUST BE USED FOR WRITING UNICODE CHARS\r
68             PrintWriter out = new PrintWriter(new OutputStreamWriter(jout,\r
69                 "UTF-8"));\r
70 \r
71             jalview.datamodel.AlignmentI jal = av.getAlignment();\r
72 \r
73 \r
74             ///////////////////////////////////////////\r
75             // SAVE THE DATASET\r
76             DataSet dataset = new DataSet();\r
77             vamsas.addDataSet(dataset);\r
78 \r
79             Sequence sequence;\r
80             DbRef dbref;\r
81             for (int i = 0; i < jal.getHeight(); i++)\r
82             {\r
83               sequence = new Sequence();\r
84               sequence.setSequence(jal.getDataset().getSequenceAt(i).getSequence());\r
85               sequence.setName(jal.getDataset().getSequenceAt(i).getName());\r
86               sequence.setStart(jal.getDataset().getSequenceAt(i).getStart());\r
87               sequence.setEnd(jal.getDataset().getSequenceAt(i).getEnd());\r
88 \r
89 \r
90               if(jal.getDataset().getSequenceAt(i).getSequenceFeatures()!=null)\r
91               {\r
92                 int sfSize = jal.getDataset().getSequenceAt(i).getSequenceFeatures().size();\r
93 \r
94                 for (int sf = 0; sf < sfSize; sf++)\r
95                 {\r
96                   jalview.datamodel.SequenceFeature feature =\r
97                       (jalview.datamodel.SequenceFeature)\r
98                       jal.getDataset().getSequenceAt(i).getSequenceFeatures().elementAt(sf);\r
99 \r
100                   DataSetAnnotations dsa = new DataSetAnnotations();\r
101                   dsa.setType(feature.getType());\r
102                   dsa.setBegin(feature.getBegin());\r
103                   dsa.setEnd(feature.getEnd());\r
104                   dsa.setDescription(feature.getDescription());\r
105                   dsa.setStatus(feature.getStatus());\r
106                   dsa.addProvenance(dummyProvenance());\r
107                   dsa.setSeqRef(sequence);\r
108                   dsa.setId("sf"+(time++));\r
109                   dataset.addDataSetAnnotations(dsa);\r
110                 }\r
111               }\r
112 \r
113               if(jal.getDataset().getSequenceAt(i).getDBRef()!=null)\r
114               {\r
115                 java.util.Vector entries = jal.getDataset().getSequenceAt(i).getDBRef();\r
116                 jalview.datamodel.DBRefEntry dbentry;\r
117                 for(int db=0; db<entries.size(); db++)\r
118                 {\r
119                   dbentry = (jalview.datamodel.DBRefEntry)entries.elementAt(db);\r
120                   dbref = new DbRef();\r
121                   dbref.setAccessionId( dbentry.getAccessionId() );\r
122                   dbref.setSource( dbentry.getSource() );\r
123                   dbref.setVersion( dbentry.getVersion() );\r
124                   dbref.setId("db"+(time++));\r
125                   sequence.addDbRef(dbref);\r
126                 }\r
127 \r
128               }\r
129 \r
130 \r
131               if(jal.getDataset().getSequenceAt(i).getVamsasId()==null)\r
132                 sequence.setId("ds" + (time++));\r
133               else\r
134                 sequence.setId(jal.getDataset().getSequenceAt(i).getVamsasId());\r
135 \r
136               dataset.addSequence(sequence);\r
137             }\r
138             dataset.setProvenance(getVamsasProvenance(jal.getDataset().getProvenance()));\r
139             //////////////////////////////////////////////\r
140 \r
141 \r
142             //////////////////////////////////////////////\r
143             //Save the Alignments\r
144             Alignment alignment = new Alignment();\r
145             alignment.setGapChar(av.getGapCharacter() + "");\r
146             AlignmentSequence alseq = null;\r
147             for (int i = 0; i < jal.getHeight(); i++)\r
148             {\r
149               alseq = new AlignmentSequence();\r
150               alseq.setSequence(\r
151                   jal.getSequenceAt(i).getSequence()\r
152                   );\r
153               alseq.setName(jal.getSequenceAt(i).getName());\r
154               alseq.setStart(jal.getSequenceAt(i).getStart());\r
155               alseq.setEnd(jal.getSequenceAt(i).getEnd());\r
156               alseq.setRefid(dataset.getSequence(i));\r
157               alseq.setId("as" + (time++));\r
158               alignment.addAlignmentSequence(alseq);\r
159             }\r
160             alignment.setProvenance(getVamsasProvenance(jal.getProvenance()));\r
161             dataset.addAlignment(alignment);\r
162             //////////////////////////////////////////////\r
163 \r
164 \r
165 \r
166             //////////////////////////////////////////////\r
167             //SAVE ANNOTATIONS\r
168             if (jal.getAlignmentAnnotation() != null)\r
169             {\r
170                 jalview.datamodel.AlignmentAnnotation[] aa = jal.getAlignmentAnnotation();\r
171 \r
172                 for (int i = 0; i < aa.length; i++)\r
173                 {\r
174                     if (aa[i].label.equals("Quality") ||\r
175                             aa[i].label.equals("Conservation") ||\r
176                             aa[i].label.equals("Consensus"))\r
177                     {\r
178                         continue;\r
179                     }\r
180 \r
181                     AlignmentAnnotations an = new AlignmentAnnotations();\r
182 \r
183                     an.setDescription(aa[i].description);\r
184                     an.setGraph(aa[i].isGraph);\r
185                     an.setLabel(aa[i].label);\r
186                     an.setProvenance(dummyProvenance());\r
187 \r
188                     AnnotationElement ae;\r
189 \r
190                     for (int a = 0; a < aa[i].annotations.length; a++)\r
191                     {\r
192                         if ((aa[i] == null) || (aa[i].annotations[a] == null))\r
193                         {\r
194                             continue;\r
195                         }\r
196 \r
197                         ae = new AnnotationElement();\r
198                         ae.setDescription(aa[i].annotations[a].description);\r
199                         ae.setDisplayCharacter(aa[i].annotations[a].displayCharacter);\r
200                         ae.setValue(aa[i].annotations[a].value);\r
201                         ae.setPosition(a);\r
202                         ae.setSecondaryStructure(aa[i].annotations[a].secondaryStructure +\r
203                             "");\r
204                         an.addAnnotationElement(ae);\r
205                     }\r
206 \r
207                     alignment.addAlignmentAnnotations(an);\r
208                 }\r
209             }\r
210             ///////////////////////////////////////////////////////\r
211 \r
212 \r
213           ////////////////////////////////////////////////\r
214           ///SAVE THE TREES\r
215           ///////////////////////////////////\r
216           // FIND ANY ASSOCIATED TREES\r
217           if (Desktop.desktop != null)\r
218           {\r
219             javax.swing.JInternalFrame[] frames = Desktop.desktop.getAllFrames();\r
220 \r
221             for (int t = 0; t < frames.length; t++)\r
222             {\r
223               if (frames[t] instanceof TreePanel)\r
224               {\r
225                 TreePanel tp = (TreePanel) frames[t];\r
226 \r
227                 if (tp.getAlignment() == jal)\r
228                 {\r
229                   Tree tree = new Tree();\r
230                   tree.setTitle(tp.getTitle());\r
231                   Newick newick = new Newick();\r
232                   newick.setContent( tp.getTree().toString() );\r
233                   newick.setTitle( tp.getTitle() );\r
234                   newick.setId("t"+(time++));\r
235                   tree.addNewick( newick );\r
236                   tree.setProvenance(dummyProvenance());\r
237                   alignment.addTree(tree);\r
238                 }\r
239               }\r
240             }\r
241           }\r
242 \r
243 \r
244             JarEntry entry = new JarEntry("vamsas.xml");\r
245             jout.putNextEntry(entry);\r
246 \r
247             vamsas.marshal(out);\r
248 \r
249             out.close();\r
250             jout.close();\r
251 \r
252 \r
253           }\r
254           catch (Exception ex)\r
255           {\r
256             ex.printStackTrace();\r
257           }\r
258 \r
259           return vamsas;\r
260         }\r
261 \r
262         Tree jalview2VamsasTree()\r
263         {\r
264           Tree tree = new Tree();\r
265 \r
266           return tree;\r
267         }\r
268 \r
269 \r
270         public void load(String file)\r
271         {\r
272           VAMSAS vamsas = new VAMSAS() ;\r
273 \r
274           try\r
275           {\r
276             FileInputStream fis = new FileInputStream(file);\r
277             JarInputStream jin = new JarInputStream(fis);\r
278 \r
279 \r
280             ////////////////////////////////////////////////////\r
281             //NOTE UTF-8 MUST BE USED FOR WRITING UNICODE CHARS\r
282             InputStreamReader in = new InputStreamReader(jin, "UTF-8");\r
283             JarEntry jarentry = jin.getNextJarEntry();\r
284             System.out.println("reading: "+jarentry.getName());\r
285             vamsas = (VAMSAS) vamsas.unmarshal(in);\r
286 \r
287 \r
288             /////////////////////////////////////\r
289             /////LOAD DATASET\r
290             DataSet dataset = vamsas.getDataSet(0);\r
291 \r
292             int i, iSize = dataset.getSequenceCount();\r
293             jalview.datamodel.Sequence [] seqs = new jalview.datamodel.Sequence[iSize];\r
294             DbRef [] dbref;\r
295 \r
296             for (i = 0; i < iSize ; i++)\r
297             {\r
298               seqs[i] = new jalview.datamodel.Sequence(\r
299                   dataset.getSequence(i).getName(),\r
300                   dataset.getSequence(i).getSequence(),\r
301                    dataset.getSequence(i).getStart(),\r
302                      dataset.getSequence(i).getEnd()  );\r
303               seqs[i].setVamsasId(dataset.getSequence(i).getId());\r
304 \r
305               if (dataset.getDataSetAnnotations() != null)\r
306               {\r
307                 for (int dsa = 0; dsa < dataset.getDataSetAnnotationsCount(); dsa++)\r
308                 {\r
309                   if (dataset.getDataSetAnnotations(dsa).getSeqRef() ==\r
310                       dataset.getSequence(i))\r
311                   {\r
312                     seqs[i].addSequenceFeature(new jalview.datamodel.\r
313                                                SequenceFeature(\r
314                         dataset.getDataSetAnnotations(dsa).getType(),\r
315                         dataset.getDataSetAnnotations(dsa).getDescription(),\r
316                         dataset.getDataSetAnnotations(dsa).getStatus(),\r
317                         dataset.getDataSetAnnotations(dsa).getBegin(),\r
318                         dataset.getDataSetAnnotations(dsa).getEnd()));\r
319                   }\r
320                 }\r
321               }\r
322               dbref = dataset.getSequence(i).getDbRef();\r
323 \r
324               if(dbref.length>0)\r
325               {\r
326                 for(int db=0; db<dbref.length; db++)\r
327                 {\r
328                   seqs[i].addDBRef( new jalview.datamodel.DBRefEntry\r
329                       (\r
330                            dbref[db].getSource().toString(),\r
331                            dbref[db].getVersion().toString(),\r
332                            dbref[db].getAccessionId().toString()));\r
333                 }\r
334               }\r
335             }\r
336             jalview.datamodel.Alignment jdataset = new jalview.datamodel.Alignment(seqs);\r
337             ////////////////////////////////////////////////\r
338 \r
339 \r
340             //////////////////////////////////////\r
341             ////LOAD ALIGNMENT\r
342             Alignment alignment = dataset.getAlignment(0);\r
343             iSize = alignment.getAlignmentSequenceCount();\r
344             seqs = new jalview.datamodel.Sequence[iSize];\r
345             String id;\r
346             int j, jSize = jdataset.getHeight();\r
347             for (i = 0; i < iSize; i++)\r
348             {\r
349               seqs[i] = new jalview.datamodel.Sequence(\r
350                   alignment.getAlignmentSequence(i).getName(),\r
351                   alignment.getAlignmentSequence(i).getSequence(),\r
352                   alignment.getAlignmentSequence(i).getStart(),\r
353                   alignment.getAlignmentSequence(i).getEnd());\r
354 \r
355               id = ( (Sequence) alignment.getAlignmentSequence(i).getRefid()).getId();\r
356 \r
357              for(j=0; j<jSize; j++)\r
358              {\r
359                if(jdataset.getSequenceAt(j).getVamsasId().equals(id))\r
360                {\r
361                  seqs[i].setDatasetSequence( jdataset.getSequenceAt(j) );\r
362                  break;\r
363                }\r
364              }\r
365             }\r
366             jalview.datamodel.Alignment jal = new jalview.datamodel.Alignment(seqs);\r
367             jal.setDataset(jdataset);\r
368             jal.getDataset().setProvenance(\r
369                 getJalviewProvenance(dataset.getProvenance()));\r
370             jal.setProvenance(\r
371                 getJalviewProvenance(alignment.getProvenance()));\r
372             //////////////////////////////////////////////\r
373 \r
374 \r
375             ////////////////////////////////////////////\r
376             ////LOAD ANNOTATIONS\r
377             ////////////////////\r
378             if (alignment.getAlignmentAnnotationsCount()>0)\r
379             {\r
380               AlignmentAnnotations[] an = alignment.getAlignmentAnnotations();\r
381 \r
382               for (j = 0; j < an.length; j++)\r
383               {\r
384                 boolean topaliBreakpoint = false;\r
385 \r
386                 AnnotationElement[] ae = an[j].getAnnotationElement();\r
387                 jalview.datamodel.Annotation[] anot = new jalview.datamodel.Annotation[jal.\r
388                     getWidth()];\r
389 \r
390                 try{\r
391 \r
392                   for (int aa = 0; aa < ae.length; aa++)\r
393                   {\r
394                     String dc = ae[aa].getDisplayCharacter()==null ? "dc" : ae[aa].getDisplayCharacter();\r
395                     String desc = ae[aa].getDescription()==null ? "desc" : ae[aa].getDescription();\r
396                     String ss = ae[aa].getSecondaryStructure()==null ? "ss" : ae[aa].getSecondaryStructure();\r
397                     float value = ae[aa].getValue();\r
398 \r
399                     if(an[j].getGraph())\r
400                     {\r
401                       dc = value+"";\r
402                       desc = value + "";\r
403                     }\r
404                     anot[ae[aa].getPosition()-1] = new jalview.datamodel.\r
405                         Annotation(dc,desc,ss.charAt(0),value);\r
406 \r
407                     if(desc.equals("TOPALi Partition Breakpoint"))\r
408                       topaliBreakpoint = true;\r
409 \r
410                   }\r
411                 }catch(Exception ex)\r
412                 {\r
413                   ex.printStackTrace();\r
414                   System.out.println("problem parsing annotations\n"+ex);}\r
415 \r
416                 jalview.datamodel.AlignmentAnnotation jaa = null;\r
417 \r
418                 if (an[j].getGraph())\r
419                 {\r
420                   jaa = new jalview.datamodel.AlignmentAnnotation(an[j].getLabel(),\r
421                       an[j].getDescription(), anot, 0, 0, 1);\r
422                 }\r
423                 else\r
424                 {\r
425                   String label = an[j].getLabel();\r
426                   if(topaliBreakpoint)\r
427                     label = "TOPALi Partition Breakpoint";\r
428                   jaa = new jalview.datamodel.AlignmentAnnotation(label,\r
429                       an[j].getDescription(), anot);\r
430                 }\r
431 \r
432                 jal.addAnnotation(jaa);\r
433               }\r
434             }\r
435             /////////////////////////////////\r
436 \r
437             AlignFrame alignFrame = new AlignFrame(jal);\r
438             jalview.gui.Desktop.addInternalFrame(alignFrame, "VAMSAS LOAD",\r
439                                                  AlignFrame.NEW_WINDOW_WIDTH,\r
440                                                  AlignFrame.NEW_WINDOW_HEIGHT);\r
441 \r
442             //LOAD TREES\r
443             ///////////////////////////////////////\r
444             if (alignment.getTreeCount() > 0)\r
445             {\r
446                 for (int t = 0; t < alignment.getTreeCount(); t++)\r
447                 {\r
448                   Tree tree = alignment.getTree(t);\r
449 \r
450                   alignFrame.ShowNewickTree(\r
451                       new jalview.io.NewickFile(tree.getNewick(0).getContent()),\r
452                       tree.getNewick(0).getTitle(),\r
453                       600, 500,\r
454                       t * 20 + 50, t * 20 + 50);\r
455                 }\r
456             }\r
457 \r
458 \r
459             in.close();\r
460             jin.close();\r
461           }\r
462           catch (Exception ex)\r
463           {\r
464             ex.printStackTrace();\r
465           }\r
466 \r
467 \r
468         }\r
469 \r
470 \r
471 \r
472         Provenance getVamsasProvenance(jalview.datamodel.Provenance jprov)\r
473         {\r
474           jalview.datamodel.ProvenanceEntry [] entries = null;\r
475 \r
476 \r
477           Provenance prov = new Provenance();\r
478           org.exolab.castor.types.Date date = new org.exolab.castor.types.Date(\r
479       new java.util.Date());\r
480           Entry provEntry;\r
481 \r
482           if(jprov!=null)\r
483           {\r
484             entries = jprov.getEntries();\r
485             for (int i = 0; i < entries.length; i++)\r
486             {\r
487               provEntry = new Entry();\r
488               try\r
489               {\r
490                 date = new org.exolab.castor.types.Date(entries[i].getDate());\r
491               }\r
492               catch (Exception ex)\r
493               {\r
494                 ex.printStackTrace();\r
495 \r
496                 date = new org.exolab.castor.types.Date(entries[i].getDate());\r
497               }\r
498               provEntry.setDate(date);\r
499               provEntry.setUser(entries[i].getUser());\r
500               provEntry.setAction(entries[i].getAction());\r
501               prov.addEntry(provEntry);\r
502             }\r
503           }\r
504           else\r
505           {\r
506             provEntry = new Entry();\r
507             provEntry.setDate(date);\r
508             provEntry.setUser(System.getProperty("user.name"));\r
509             provEntry.setAction("Jalview");\r
510             prov.addEntry(provEntry);\r
511           }\r
512 \r
513           return prov;\r
514         }\r
515 \r
516         jalview.datamodel.Provenance getJalviewProvenance(Provenance prov)\r
517         {\r
518 \r
519           jalview.datamodel.Provenance jprov = new jalview.datamodel.Provenance();\r
520           for (int i = 0; i < prov.getEntryCount(); i++)\r
521           {\r
522             jprov.addEntry(\r
523                 prov.getEntry(i).getUser(),\r
524                 prov.getEntry(i).getAction(),\r
525                 prov.getEntry(i).getDate().toDate(),\r
526                 prov.getEntry(i).getId()\r
527                 );\r
528           }\r
529 \r
530           return jprov;\r
531         }\r
532 \r
533         Provenance dummyProvenance()\r
534         {\r
535           Provenance prov = new Provenance();\r
536           Entry entry = new Entry();\r
537           entry.setAction("Jalview");\r
538           entry.setDate(new org.exolab.castor.types.Date(new java.util.Date()));\r
539           entry.setUser(System.getProperty("user.name"));\r
540           prov.addEntry(entry);\r
541           return prov;\r
542         }\r
543 \r
544 }\r