Don't parse input id, leave it as it is
[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().size();\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().elementAt(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                     an.setGraph(aa[i].isGraph);\r
214                     an.setLabel(aa[i].label);\r
215                     an.setProvenance(dummyProvenance());\r
216 \r
217                     AnnotationElement ae;\r
218 \r
219                     for (int a = 0; a < aa[i].annotations.length; a++)\r
220                     {\r
221                         if ((aa[i] == null) || (aa[i].annotations[a] == null))\r
222                         {\r
223                             continue;\r
224                         }\r
225 \r
226                         ae = new AnnotationElement();\r
227                         ae.setDescription(aa[i].annotations[a].description);\r
228                         ae.setDisplayCharacter(aa[i].annotations[a].displayCharacter);\r
229                         ae.setValue(aa[i].annotations[a].value);\r
230                         ae.setPosition(a);\r
231                         ae.setSecondaryStructure(aa[i].annotations[a].secondaryStructure +\r
232                             "");\r
233                         an.addAnnotationElement(ae);\r
234                     }\r
235 \r
236                     alignment.addAlignmentAnnotations(an);\r
237                 }\r
238             }\r
239             ///////////////////////////////////////////////////////\r
240 \r
241 \r
242           ////////////////////////////////////////////////\r
243           ///SAVE THE TREES\r
244           ///////////////////////////////////\r
245           // FIND ANY ASSOCIATED TREES\r
246           if (Desktop.desktop != null)\r
247           {\r
248             javax.swing.JInternalFrame[] frames = Desktop.desktop.getAllFrames();\r
249 \r
250             for (int t = 0; t < frames.length; t++)\r
251             {\r
252               if (frames[t] instanceof TreePanel)\r
253               {\r
254                 TreePanel tp = (TreePanel) frames[t];\r
255 \r
256                 if (tp.getAlignment() == jal)\r
257                 {\r
258                   Tree tree = new Tree();\r
259                   tree.setTitle(tp.getTitle());\r
260                   Newick newick = new Newick();\r
261                   newick.setContent( tp.getTree().toString() );\r
262                   newick.setTitle( tp.getTitle() );\r
263                   newick.setId("t"+(time++));\r
264                   tree.addNewick( newick );\r
265                   tree.setProvenance(dummyProvenance());\r
266                   alignment.addTree(tree);\r
267                 }\r
268               }\r
269             }\r
270           }\r
271 \r
272 \r
273             JarEntry entry = new JarEntry("vamsas.xml");\r
274             jout.putNextEntry(entry);\r
275 \r
276             vamsas.marshal(out);\r
277 \r
278             out.close();\r
279             jout.close();\r
280 \r
281 \r
282           }\r
283           catch (Exception ex)\r
284           {\r
285             ex.printStackTrace();\r
286           }\r
287 \r
288           return vamsas;\r
289         }\r
290 \r
291         Tree jalview2VamsasTree()\r
292         {\r
293           Tree tree = new Tree();\r
294 \r
295           return tree;\r
296         }\r
297 \r
298 \r
299         public void load(String file)\r
300         {\r
301           VAMSAS vamsas = new VAMSAS() ;\r
302 \r
303           try\r
304           {\r
305             FileInputStream fis = new FileInputStream(file);\r
306             JarInputStream jin = new JarInputStream(fis);\r
307 \r
308 \r
309             ////////////////////////////////////////////////////\r
310             //NOTE UTF-8 MUST BE USED FOR WRITING UNICODE CHARS\r
311             InputStreamReader in = new InputStreamReader(jin, "UTF-8");\r
312             JarEntry jarentry = jin.getNextJarEntry();\r
313             System.out.println("reading: "+jarentry.getName());\r
314             vamsas = (VAMSAS) vamsas.unmarshal(in);\r
315 \r
316 \r
317             /////////////////////////////////////\r
318             /////LOAD DATASET\r
319             DataSet dataset = vamsas.getDataSet(0);\r
320 \r
321             int i, iSize = dataset.getSequenceCount();\r
322             jalview.datamodel.Sequence [] seqs = new jalview.datamodel.Sequence[iSize];\r
323             DbRef [] dbref;\r
324 \r
325             for (i = 0; i < iSize ; i++)\r
326             {\r
327               seqs[i] = new jalview.datamodel.Sequence(\r
328                   dataset.getSequence(i).getName(),\r
329                   dataset.getSequence(i).getSequence(),\r
330                    dataset.getSequence(i).getStart(),\r
331                      dataset.getSequence(i).getEnd()  );\r
332               seqs[i].setVamsasId(dataset.getSequence(i).getId());\r
333 \r
334               if (dataset.getDataSetAnnotations() != null)\r
335               {\r
336                 for (int dsa = 0; dsa < dataset.getDataSetAnnotationsCount(); dsa++)\r
337                 {\r
338                   if (dataset.getDataSetAnnotations(dsa).getSeqRef() ==\r
339                       dataset.getSequence(i))\r
340                   {\r
341                     seqs[i].addSequenceFeature(new jalview.datamodel.\r
342                                                SequenceFeature(\r
343                         dataset.getDataSetAnnotations(dsa).getType(),\r
344                         dataset.getDataSetAnnotations(dsa).getDescription(),\r
345                         dataset.getDataSetAnnotations(dsa).getStatus(),\r
346                         dataset.getDataSetAnnotations(dsa).getBegin(),\r
347                         dataset.getDataSetAnnotations(dsa).getEnd()));\r
348                   }\r
349                 }\r
350               }\r
351               dbref = dataset.getSequence(i).getDbRef();\r
352 \r
353               if(dbref.length>0)\r
354               {\r
355                 for(int db=0; db<dbref.length; db++)\r
356                 {\r
357                   seqs[i].addDBRef( new jalview.datamodel.DBRefEntry\r
358                       (\r
359                            dbref[db].getSource().toString(),\r
360                            dbref[db].getVersion().toString(),\r
361                            dbref[db].getAccessionId().toString()));\r
362                 }\r
363               }\r
364             }\r
365             jalview.datamodel.Alignment jdataset = new jalview.datamodel.Alignment(seqs);\r
366             ////////////////////////////////////////////////\r
367 \r
368 \r
369             //////////////////////////////////////\r
370             ////LOAD ALIGNMENT\r
371             Alignment alignment = dataset.getAlignment(0);\r
372             iSize = alignment.getAlignmentSequenceCount();\r
373             seqs = new jalview.datamodel.Sequence[iSize];\r
374             String id;\r
375             int j, jSize = jdataset.getHeight();\r
376             for (i = 0; i < iSize; i++)\r
377             {\r
378               seqs[i] = new jalview.datamodel.Sequence(\r
379                   alignment.getAlignmentSequence(i).getName(),\r
380                   alignment.getAlignmentSequence(i).getSequence(),\r
381                   alignment.getAlignmentSequence(i).getStart(),\r
382                   alignment.getAlignmentSequence(i).getEnd());\r
383 \r
384               id = ( (Sequence) alignment.getAlignmentSequence(i).getRefid()).getId();\r
385 \r
386              for(j=0; j<jSize; j++)\r
387              {\r
388                if(jdataset.getSequenceAt(j).getVamsasId().equals(id))\r
389                {\r
390                  seqs[i].setDatasetSequence( jdataset.getSequenceAt(j) );\r
391                  break;\r
392                }\r
393              }\r
394             }\r
395             jalview.datamodel.Alignment jal = new jalview.datamodel.Alignment(seqs);\r
396             jal.setDataset(jdataset);\r
397             jal.getDataset().setProvenance(\r
398                 getJalviewProvenance(dataset.getProvenance()));\r
399             jal.setProvenance(\r
400                 getJalviewProvenance(alignment.getProvenance()));\r
401             //////////////////////////////////////////////\r
402 \r
403 \r
404             ////////////////////////////////////////////\r
405             ////LOAD ANNOTATIONS\r
406             ////////////////////\r
407             if (alignment.getAlignmentAnnotationsCount()>0)\r
408             {\r
409               AlignmentAnnotations[] an = alignment.getAlignmentAnnotations();\r
410 \r
411               for (j = 0; j < an.length; j++)\r
412               {\r
413                 boolean topaliBreakpoint = false;\r
414 \r
415                 AnnotationElement[] ae = an[j].getAnnotationElement();\r
416                 jalview.datamodel.Annotation[] anot = new jalview.datamodel.Annotation[jal.\r
417                     getWidth()];\r
418 \r
419                 try{\r
420 \r
421                   for (int aa = 0; aa < ae.length; aa++)\r
422                   {\r
423                     String dc = ae[aa].getDisplayCharacter()==null ? "dc" : ae[aa].getDisplayCharacter();\r
424                     String desc = ae[aa].getDescription()==null ? "desc" : ae[aa].getDescription();\r
425                     String ss = ae[aa].getSecondaryStructure()==null ? "ss" : ae[aa].getSecondaryStructure();\r
426                     float value = ae[aa].getValue();\r
427 \r
428                     if(an[j].getGraph())\r
429                     {\r
430                       dc = value+"";\r
431                       desc = value + "";\r
432                     }\r
433                     anot[ae[aa].getPosition()-1] = new jalview.datamodel.\r
434                         Annotation(dc,desc,ss.charAt(0),value);\r
435 \r
436                     if(desc.equals("TOPALi Partition Breakpoint"))\r
437                       topaliBreakpoint = true;\r
438 \r
439                   }\r
440                 }catch(Exception ex)\r
441                 {\r
442                   ex.printStackTrace();\r
443                   System.out.println("problem parsing annotations\n"+ex);}\r
444 \r
445                 jalview.datamodel.AlignmentAnnotation jaa = null;\r
446 \r
447                 if (an[j].getGraph())\r
448                 {\r
449                   jaa = new jalview.datamodel.AlignmentAnnotation(an[j].getLabel(),\r
450                       an[j].getDescription(), anot, 0, 0, 1);\r
451                 }\r
452                 else\r
453                 {\r
454                   String label = an[j].getLabel();\r
455                   if(topaliBreakpoint)\r
456                     label = "TOPALi Partition Breakpoint";\r
457                   jaa = new jalview.datamodel.AlignmentAnnotation(label,\r
458                       an[j].getDescription(), anot);\r
459                 }\r
460 \r
461                 jal.addAnnotation(jaa);\r
462               }\r
463             }\r
464             /////////////////////////////////\r
465 \r
466             AlignFrame alignFrame = new AlignFrame(jal);\r
467             jalview.gui.Desktop.addInternalFrame(alignFrame, "VAMSAS LOAD",\r
468                                                  AlignFrame.NEW_WINDOW_WIDTH,\r
469                                                  AlignFrame.NEW_WINDOW_HEIGHT);\r
470 \r
471             //LOAD TREES\r
472             ///////////////////////////////////////\r
473             if (alignment.getTreeCount() > 0)\r
474             {\r
475                 for (int t = 0; t < alignment.getTreeCount(); t++)\r
476                 {\r
477                   Tree tree = alignment.getTree(t);\r
478 \r
479                   alignFrame.ShowNewickTree(\r
480                       new jalview.io.NewickFile(tree.getNewick(0).getContent()),\r
481                       tree.getNewick(0).getTitle(),\r
482                       600, 500,\r
483                       t * 20 + 50, t * 20 + 50);\r
484                 }\r
485             }\r
486 \r
487 \r
488             in.close();\r
489             jin.close();\r
490           }\r
491           catch (Exception ex)\r
492           {\r
493             ex.printStackTrace();\r
494           }\r
495 \r
496 \r
497         }\r
498 \r
499 \r
500 \r
501         Provenance getVamsasProvenance(jalview.datamodel.Provenance jprov)\r
502         {\r
503           jalview.datamodel.ProvenanceEntry [] entries = null;\r
504 \r
505 \r
506           Provenance prov = new Provenance();\r
507           org.exolab.castor.types.Date date = new org.exolab.castor.types.Date(\r
508       new java.util.Date());\r
509           Entry provEntry;\r
510 \r
511           if(jprov!=null)\r
512           {\r
513             entries = jprov.getEntries();\r
514             for (int i = 0; i < entries.length; i++)\r
515             {\r
516               provEntry = new Entry();\r
517               try\r
518               {\r
519                 date = new org.exolab.castor.types.Date(entries[i].getDate());\r
520               }\r
521               catch (Exception ex)\r
522               {\r
523                 ex.printStackTrace();\r
524 \r
525                 date = new org.exolab.castor.types.Date(entries[i].getDate());\r
526               }\r
527               provEntry.setDate(date);\r
528               provEntry.setUser(entries[i].getUser());\r
529               provEntry.setAction(entries[i].getAction());\r
530               prov.addEntry(provEntry);\r
531             }\r
532           }\r
533           else\r
534           {\r
535             provEntry = new Entry();\r
536             provEntry.setDate(date);\r
537             provEntry.setUser(System.getProperty("user.name"));\r
538             provEntry.setAction("Jalview");\r
539             prov.addEntry(provEntry);\r
540           }\r
541 \r
542           return prov;\r
543         }\r
544 \r
545         jalview.datamodel.Provenance getJalviewProvenance(Provenance prov)\r
546         {\r
547 \r
548           jalview.datamodel.Provenance jprov = new jalview.datamodel.Provenance();\r
549           for (int i = 0; i < prov.getEntryCount(); i++)\r
550           {\r
551             jprov.addEntry(\r
552                 prov.getEntry(i).getUser(),\r
553                 prov.getEntry(i).getAction(),\r
554                 prov.getEntry(i).getDate().toDate(),\r
555                 prov.getEntry(i).getId()\r
556                 );\r
557           }\r
558 \r
559           return jprov;\r
560         }\r
561 \r
562         Provenance dummyProvenance()\r
563         {\r
564           Provenance prov = new Provenance();\r
565           Entry entry = new Entry();\r
566           entry.setAction("Jalview");\r
567           entry.setDate(new org.exolab.castor.types.Date(new java.util.Date()));\r
568           entry.setUser(System.getProperty("user.name"));\r
569           prov.addEntry(entry);\r
570           return prov;\r
571         }\r
572 \r
573 }\r