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