equalsIgnoreCase CLUSTAL
[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               if(jal.getDataset().getSequenceAt(i).getDBRef()!=null)\r
90               {\r
91                 java.util.Vector entries = jal.getDataset().getSequenceAt(i).getDBRef();\r
92                 jalview.datamodel.DBRefEntry dbentry;\r
93                 for(int db=0; db<entries.size(); db++)\r
94                 {\r
95                   dbentry = (jalview.datamodel.DBRefEntry)entries.elementAt(db);\r
96                   dbref = new DbRef();\r
97                   dbref.setAccessionId( dbentry.getAccessionId() );\r
98                   dbref.setSource( dbentry.getSource() );\r
99                   dbref.setVersion( dbentry.getVersion() );\r
100                   dbref.setId("db"+(time++));\r
101                   sequence.addDbRef(dbref);\r
102                 }\r
103 \r
104               }\r
105 \r
106 \r
107               if(jal.getDataset().getSequenceAt(i).getVamsasId()==null)\r
108                 sequence.setId("ds" + (time++));\r
109               else\r
110                 sequence.setId(jal.getDataset().getSequenceAt(i).getVamsasId());\r
111 \r
112               dataset.addSequence(sequence);\r
113             }\r
114             dataset.setProvenance(getVamsasProvenance(jal.getDataset().getProvenance()));\r
115             //////////////////////////////////////////////\r
116 \r
117 \r
118             //////////////////////////////////////////////\r
119             //Save the Alignments\r
120             Alignment alignment = new Alignment();\r
121             alignment.setGapChar(av.getGapCharacter() + "");\r
122             AlignmentSequence alseq = null;\r
123             for (int i = 0; i < jal.getHeight(); i++)\r
124             {\r
125               alseq = new AlignmentSequence();\r
126               alseq.setSequence(\r
127                   jal.getSequenceAt(i).getSequence()\r
128                   );\r
129               alseq.setName(jal.getSequenceAt(i).getName());\r
130               alseq.setStart(jal.getSequenceAt(i).getStart());\r
131               alseq.setEnd(jal.getSequenceAt(i).getEnd());\r
132               alseq.setRefid(dataset.getSequence(i));\r
133               alseq.setId("as" + (time++));\r
134               alignment.addAlignmentSequence(alseq);\r
135             }\r
136             alignment.setProvenance(getVamsasProvenance(jal.getProvenance()));\r
137             dataset.addAlignment(alignment);\r
138             //////////////////////////////////////////////\r
139 \r
140 \r
141 \r
142             //////////////////////////////////////////////\r
143             //SAVE ANNOTATIONS\r
144             if (jal.getAlignmentAnnotation() != null)\r
145             {\r
146                 jalview.datamodel.AlignmentAnnotation[] aa = jal.getAlignmentAnnotation();\r
147 \r
148                 for (int i = 0; i < aa.length; i++)\r
149                 {\r
150                     if (aa[i].label.equals("Quality") ||\r
151                             aa[i].label.equals("Conservation") ||\r
152                             aa[i].label.equals("Consensus"))\r
153                     {\r
154                         continue;\r
155                     }\r
156 \r
157                     AlignmentAnnotations an = new AlignmentAnnotations();\r
158 \r
159                     an.setDescription(aa[i].description);\r
160                     an.setGraph(aa[i].isGraph);\r
161                     an.setLabel(aa[i].label);\r
162                     an.setProvenance(dummyProvenance());\r
163 \r
164                     AnnotationElement ae;\r
165 \r
166                     for (int a = 0; a < aa[i].annotations.length; a++)\r
167                     {\r
168                         if ((aa[i] == null) || (aa[i].annotations[a] == null))\r
169                         {\r
170                             continue;\r
171                         }\r
172 \r
173                         ae = new AnnotationElement();\r
174                         ae.setDescription(aa[i].annotations[a].description);\r
175                         ae.setDisplayCharacter(aa[i].annotations[a].displayCharacter);\r
176                         ae.setValue(aa[i].annotations[a].value);\r
177                         ae.setPosition(a);\r
178                         ae.setSecondaryStructure(aa[i].annotations[a].secondaryStructure +\r
179                             "");\r
180                         an.addAnnotationElement(ae);\r
181                     }\r
182 \r
183                     alignment.addAlignmentAnnotations(an);\r
184                 }\r
185             }\r
186             ///////////////////////////////////////////////////////\r
187 \r
188 \r
189           ////////////////////////////////////////////////\r
190           ///SAVE THE TREES\r
191           ///////////////////////////////////\r
192           // FIND ANY ASSOCIATED TREES\r
193           if (Desktop.desktop != null)\r
194           {\r
195             javax.swing.JInternalFrame[] frames = Desktop.desktop.getAllFrames();\r
196 \r
197             for (int t = 0; t < frames.length; t++)\r
198             {\r
199               if (frames[t] instanceof TreePanel)\r
200               {\r
201                 TreePanel tp = (TreePanel) frames[t];\r
202 \r
203                 if (tp.getAlignment() == jal)\r
204                 {\r
205                   Tree tree = new Tree();\r
206                   tree.setTitle(tp.getTitle());\r
207                   Newick newick = new Newick();\r
208                   newick.setContent( tp.getTree().toString() );\r
209                   newick.setTitle( tp.getTitle() );\r
210                   newick.setId("t"+(time++));\r
211                   tree.addNewick( newick );\r
212                   tree.setProvenance(dummyProvenance());\r
213                   alignment.addTree(tree);\r
214                 }\r
215               }\r
216             }\r
217           }\r
218 \r
219 \r
220             JarEntry entry = new JarEntry("vamsas.xml");\r
221             jout.putNextEntry(entry);\r
222 \r
223             vamsas.marshal(out);\r
224 \r
225             out.close();\r
226             jout.close();\r
227 \r
228 \r
229           }\r
230           catch (Exception ex)\r
231           {\r
232             ex.printStackTrace();\r
233           }\r
234 \r
235           return vamsas;\r
236         }\r
237 \r
238         Tree jalview2VamsasTree()\r
239         {\r
240           Tree tree = new Tree();\r
241 \r
242           return tree;\r
243         }\r
244 \r
245 \r
246         public void load(String file)\r
247         {\r
248           VAMSAS vamsas = new VAMSAS() ;\r
249 \r
250           try\r
251           {\r
252             FileInputStream fis = new FileInputStream(file);\r
253             JarInputStream jin = new JarInputStream(fis);\r
254 \r
255 \r
256             ////////////////////////////////////////////////////\r
257             //NOTE UTF-8 MUST BE USED FOR WRITING UNICODE CHARS\r
258             InputStreamReader in = new InputStreamReader(jin, "UTF-8");\r
259             JarEntry jarentry = jin.getNextJarEntry();\r
260             System.out.println("reading: "+jarentry.getName());\r
261             vamsas = (VAMSAS) vamsas.unmarshal(in);\r
262 \r
263 \r
264             /////////////////////////////////////\r
265             /////LOAD DATASET\r
266             DataSet dataset = vamsas.getDataSet(0);\r
267 \r
268             int i, iSize = dataset.getSequenceCount();\r
269             jalview.datamodel.Sequence [] seqs = new jalview.datamodel.Sequence[iSize];\r
270             DbRef [] dbref;\r
271 \r
272             for (i = 0; i < iSize ; i++)\r
273             {\r
274               seqs[i] = new jalview.datamodel.Sequence(\r
275                   dataset.getSequence(i).getName(),\r
276                   dataset.getSequence(i).getSequence(),\r
277                    dataset.getSequence(i).getStart(),\r
278                      dataset.getSequence(i).getEnd()  );\r
279               seqs[i].setVamsasId(dataset.getSequence(i).getId());\r
280 \r
281               dbref = dataset.getSequence(i).getDbRef();\r
282 \r
283               if(dbref.length>0)\r
284               {\r
285                 for(int db=0; db<dbref.length; db++)\r
286                 {\r
287                   seqs[i].addDBRef( new jalview.datamodel.DBRefEntry\r
288                       (\r
289                            dbref[db].getSource().toString(),\r
290                            dbref[db].getVersion().toString(),\r
291                            dbref[db].getAccessionId().toString()));\r
292                 }\r
293               }\r
294 \r
295             }\r
296             jalview.datamodel.Alignment jdataset = new jalview.datamodel.Alignment(seqs);\r
297             ////////////////////////////////////////////////\r
298 \r
299 \r
300             //////////////////////////////////////\r
301             ////LOAD ALIGNMENT\r
302             Alignment alignment = dataset.getAlignment(0);\r
303             iSize = alignment.getAlignmentSequenceCount();\r
304             seqs = new jalview.datamodel.Sequence[iSize];\r
305             for (i = 0; i < iSize; i++)\r
306             {\r
307               seqs[i] = new jalview.datamodel.Sequence(\r
308                   alignment.getAlignmentSequence(i).getName(),\r
309                   alignment.getAlignmentSequence(i).getSequence(),\r
310                   alignment.getAlignmentSequence(i).getStart(),\r
311                   alignment.getAlignmentSequence(i).getEnd());\r
312             }\r
313             jalview.datamodel.Alignment jal = new jalview.datamodel.Alignment(seqs);\r
314             jal.setDataset(jdataset);\r
315             jal.getDataset().setProvenance(\r
316                 getJalviewProvenance(dataset.getProvenance()));\r
317             jal.setProvenance(\r
318                 getJalviewProvenance(alignment.getProvenance()));\r
319             //////////////////////////////////////////////\r
320 \r
321 \r
322             ////////////////////////////////////////////\r
323             ////LOAD ANNOTATIONS\r
324             ////////////////////\r
325             if (alignment.getAlignmentAnnotationsCount()>0)\r
326             {\r
327               AlignmentAnnotations[] an = alignment.getAlignmentAnnotations();\r
328 \r
329               for (int j = 0; j < an.length; j++)\r
330               {\r
331                 boolean topaliBreakpoint = false;\r
332 \r
333                 AnnotationElement[] ae = an[j].getAnnotationElement();\r
334                 jalview.datamodel.Annotation[] anot = new jalview.datamodel.Annotation[jal.\r
335                     getWidth()];\r
336 \r
337                 try{\r
338 \r
339                   for (int aa = 0; aa < ae.length; aa++)\r
340                   {\r
341                     String dc = ae[aa].getDisplayCharacter()==null ? "dc" : ae[aa].getDisplayCharacter();\r
342                     String desc = ae[aa].getDescription()==null ? "desc" : ae[aa].getDescription();\r
343                     String ss = ae[aa].getSecondaryStructure()==null ? "ss" : ae[aa].getSecondaryStructure();\r
344                     float value = ae[aa].getValue();\r
345 \r
346                     if(an[j].getGraph())\r
347                     {\r
348                       dc = value+"";\r
349                       desc = value + "";\r
350                     }\r
351                     anot[ae[aa].getPosition()-1] = new jalview.datamodel.\r
352                         Annotation(dc,desc,ss.charAt(0),value);\r
353 \r
354                     if(desc.equals("TOPALi Partition Breakpoint"))\r
355                       topaliBreakpoint = true;\r
356 \r
357                   }\r
358                 }catch(Exception ex)\r
359                 {\r
360                   ex.printStackTrace();\r
361                   System.out.println("problem parsing annotations\n"+ex);}\r
362 \r
363                 jalview.datamodel.AlignmentAnnotation jaa = null;\r
364 \r
365                 if (an[j].getGraph())\r
366                 {\r
367                   jaa = new jalview.datamodel.AlignmentAnnotation(an[j].getLabel(),\r
368                       an[j].getDescription(), anot, 0, 0, 1);\r
369                 }\r
370                 else\r
371                 {\r
372                   String label = an[j].getLabel();\r
373                   if(topaliBreakpoint)\r
374                     label = "TOPALi Partition Breakpoint";\r
375                   jaa = new jalview.datamodel.AlignmentAnnotation(label,\r
376                       an[j].getDescription(), anot);\r
377                 }\r
378 \r
379                 jal.addAnnotation(jaa);\r
380               }\r
381             }\r
382             /////////////////////////////////\r
383 \r
384             AlignFrame alignFrame = new AlignFrame(jal);\r
385             jalview.gui.Desktop.addInternalFrame(alignFrame, "VAMSAS LOAD",\r
386                                                  AlignFrame.NEW_WINDOW_WIDTH,\r
387                                                  AlignFrame.NEW_WINDOW_HEIGHT);\r
388 \r
389             //LOAD TREES\r
390             ///////////////////////////////////////\r
391             if (alignment.getTreeCount() > 0)\r
392             {\r
393                 for (int t = 0; t < alignment.getTreeCount(); t++)\r
394                 {\r
395                   Tree tree = alignment.getTree(t);\r
396 \r
397                   alignFrame.ShowNewickTree(\r
398                       new jalview.io.NewickFile(tree.getNewick(0).getContent()),\r
399                       tree.getNewick(0).getTitle(),\r
400                       600, 500,\r
401                       t * 20 + 50, t * 20 + 50);\r
402                 }\r
403             }\r
404 \r
405 \r
406             in.close();\r
407             jin.close();\r
408           }\r
409           catch (Exception ex)\r
410           {\r
411             ex.printStackTrace();\r
412           }\r
413 \r
414 \r
415         }\r
416 \r
417 \r
418 \r
419         Provenance getVamsasProvenance(jalview.datamodel.Provenance jprov)\r
420         {\r
421           jalview.datamodel.ProvenanceEntry [] entries = null;\r
422 \r
423 \r
424           Provenance prov = new Provenance();\r
425           org.exolab.castor.types.Date date = new org.exolab.castor.types.Date(\r
426       new java.util.Date());\r
427           Entry provEntry;\r
428 \r
429           if(jprov!=null)\r
430           {\r
431             entries = jprov.getEntries();\r
432             for (int i = 0; i < entries.length; i++)\r
433             {\r
434               provEntry = new Entry();\r
435               try\r
436               {\r
437                 date = new org.exolab.castor.types.Date(entries[i].getDate());\r
438               }\r
439               catch (Exception ex)\r
440               {\r
441                 ex.printStackTrace();\r
442 \r
443                 date = new org.exolab.castor.types.Date(entries[i].getDate());\r
444               }\r
445               provEntry.setDate(date);\r
446               provEntry.setUser(entries[i].getUser());\r
447               provEntry.setAction(entries[i].getAction());\r
448               prov.addEntry(provEntry);\r
449             }\r
450           }\r
451           else\r
452           {\r
453             provEntry = new Entry();\r
454             provEntry.setDate(date);\r
455             provEntry.setUser(System.getProperty("user.name"));\r
456             provEntry.setAction("Jalview");\r
457             prov.addEntry(provEntry);\r
458           }\r
459 \r
460           return prov;\r
461         }\r
462 \r
463         jalview.datamodel.Provenance getJalviewProvenance(Provenance prov)\r
464         {\r
465 \r
466           jalview.datamodel.Provenance jprov = new jalview.datamodel.Provenance();\r
467           for (int i = 0; i < prov.getEntryCount(); i++)\r
468           {\r
469             jprov.addEntry(\r
470                 prov.getEntry(i).getUser(),\r
471                 prov.getEntry(i).getAction(),\r
472                 prov.getEntry(i).getDate().toDate(),\r
473                 prov.getEntry(i).getId()\r
474                 );\r
475           }\r
476 \r
477           return jprov;\r
478         }\r
479 \r
480         Provenance dummyProvenance()\r
481         {\r
482           Provenance prov = new Provenance();\r
483           Entry entry = new Entry();\r
484           entry.setAction("Jalview");\r
485           entry.setDate(new org.exolab.castor.types.Date(new java.util.Date()));\r
486           entry.setUser(System.getProperty("user.name"));\r
487           prov.addEntry(entry);\r
488           return prov;\r
489         }\r
490 \r
491 }\r