generalised feature attribute parsing slightly (no embl specs to work from yet)
[jalview.git] / src / jalview / datamodel / xdb / embl / EmblEntry.java
1 package jalview.datamodel.xdb.embl;\r
2 \r
3 import jalview.datamodel.DBRefEntry;\r
4 import jalview.datamodel.Sequence;\r
5 import jalview.datamodel.SequenceFeature;\r
6 import jalview.datamodel.SequenceI;\r
7 \r
8 import java.util.Iterator;\r
9 import java.util.Vector;\r
10 \r
11 public class EmblEntry {\r
12   String accession;\r
13   String version;\r
14   String taxDivision;\r
15   String desc;\r
16   String rCreated;\r
17   String rLastUpdated;\r
18   String lastUpdated;\r
19   Vector keywords;\r
20   Vector refs;\r
21   Vector dbRefs;\r
22   Vector features;\r
23   EmblSequence sequence;\r
24   /**\r
25    * @return the accession\r
26    */\r
27   public String getAccession() {\r
28     return accession;\r
29   }\r
30   /**\r
31    * @param accession the accession to set\r
32    */\r
33   public void setAccession(String accession) {\r
34     this.accession = accession;\r
35   }\r
36   /**\r
37    * @return the dbRefs\r
38    */\r
39   public Vector getDbRefs() {\r
40     return dbRefs;\r
41   }\r
42   /**\r
43    * @param dbRefs the dbRefs to set\r
44    */\r
45   public void setDbRefs(Vector dbRefs) {\r
46     this.dbRefs = dbRefs;\r
47   }\r
48   /**\r
49    * @return the desc\r
50    */\r
51   public String getDesc() {\r
52     return desc;\r
53   }\r
54   /**\r
55    * @param desc the desc to set\r
56    */\r
57   public void setDesc(String desc) {\r
58     this.desc = desc;\r
59   }\r
60   /**\r
61    * @return the features\r
62    */\r
63   public Vector getFeatures() {\r
64     return features;\r
65   }\r
66   /**\r
67    * @param features the features to set\r
68    */\r
69   public void setFeatures(Vector features) {\r
70     this.features = features;\r
71   }\r
72   /**\r
73    * @return the keywords\r
74    */\r
75   public Vector getKeywords() {\r
76     return keywords;\r
77   }\r
78   /**\r
79    * @param keywords the keywords to set\r
80    */\r
81   public void setKeywords(Vector keywords) {\r
82     this.keywords = keywords;\r
83   }\r
84   /**\r
85    * @return the lastUpdated\r
86    */\r
87   public String getLastUpdated() {\r
88     return lastUpdated;\r
89   }\r
90   /**\r
91    * @param lastUpdated the lastUpdated to set\r
92    */\r
93   public void setLastUpdated(String lastUpdated) {\r
94     this.lastUpdated = lastUpdated;\r
95   }\r
96   /**\r
97    * @return the refs\r
98    */\r
99   public Vector getRefs() {\r
100     return refs;\r
101   }\r
102   /**\r
103    * @param refs the refs to set\r
104    */\r
105   public void setRefs(Vector refs) {\r
106     this.refs = refs;\r
107   }\r
108   /**\r
109    * @return the releaseCreated\r
110    */\r
111   public String getRCreated() {\r
112     return rCreated;\r
113   }\r
114   /**\r
115    * @param releaseCreated the releaseCreated to set\r
116    */\r
117   public void setRcreated(String releaseCreated) {\r
118     this.rCreated = releaseCreated;\r
119   }\r
120   /**\r
121    * @return the releaseLastUpdated\r
122    */\r
123   public String getRLastUpdated() {\r
124     return rLastUpdated;\r
125   }\r
126   /**\r
127    * @param releaseLastUpdated the releaseLastUpdated to set\r
128    */\r
129   public void setRLastUpdated(String releaseLastUpdated) {\r
130     this.rLastUpdated = releaseLastUpdated;\r
131   }\r
132   /**\r
133    * @return the sequence\r
134    */\r
135   public EmblSequence getSequence() {\r
136     return sequence;\r
137   }\r
138   /**\r
139    * @param sequence the sequence to set\r
140    */\r
141   public void setSequence(EmblSequence sequence) {\r
142     this.sequence = sequence;\r
143   }\r
144   /**\r
145    * @return the taxDivision\r
146    */\r
147   public String getTaxDivision() {\r
148     return taxDivision;\r
149   }\r
150   /**\r
151    * @param taxDivision the taxDivision to set\r
152    */\r
153   public void setTaxDivision(String taxDivision) {\r
154     this.taxDivision = taxDivision;\r
155   }\r
156   /**\r
157    * @return the version\r
158    */\r
159   public String getVersion() {\r
160     return version;\r
161   }\r
162   /**\r
163    * @param version the version to set\r
164    */\r
165   public void setVersion(String version) {\r
166     this.version = version;\r
167   }\r
168 \r
169   /**\r
170    * Recover annotated sequences from EMBL file\r
171    * @param noNa don't return nucleic acid sequences \r
172    * @param sourceDb TODO\r
173    * @param noProtein don't return any translated protein sequences marked in features\r
174    * @return dataset sequences with DBRefs and features - DNA always comes first\r
175    */\r
176   public jalview.datamodel.SequenceI[] getSequences(boolean noNa, boolean noPeptide, String sourceDb) {\r
177     Vector seqs=new Vector();\r
178     Sequence dna=null;\r
179     if (!noNa) {\r
180       dna = new Sequence(sourceDb+"|"+accession, sequence.getSequence());\r
181       dna.setDescription(desc);\r
182       dna.addDBRef(new DBRefEntry(sourceDb, version, accession));\r
183       // TODO: add mapping for parentAccession attribute\r
184       // TODO: transform EMBL Database refs to canonical form\r
185       if (dbRefs!=null)\r
186         for (Iterator i=dbRefs.iterator(); i.hasNext(); dna.addDBRef((DBRefEntry)i.next()));\r
187     }\r
188     for (Iterator i=features.iterator(); i.hasNext(); ) {\r
189       EmblFeature feature = (EmblFeature) i.next();\r
190       if (!noNa) {\r
191         if (feature.dbRefs!=null && feature.dbRefs.size()>0) {\r
192           for (Iterator dbr=feature.dbRefs.iterator(); dbr.hasNext(); dna.addDBRef((DBRefEntry)dbr.next()) )\r
193             ;\r
194         }\r
195       }\r
196       if (feature.getName().equalsIgnoreCase("CDS")) {\r
197         // extract coding region(s)\r
198         jalview.datamodel.Mapping map = null;\r
199         int[] exon=null;\r
200         if (feature.locations!=null && feature.locations.size()>0) {\r
201           for (Iterator locs=feature.locations.iterator();\r
202           locs.hasNext(); ) {\r
203             EmblFeatureLocations loc = (EmblFeatureLocations) locs.next();\r
204             int[] se = loc.getElementRanges();\r
205             if (exon==null) {\r
206               exon=se;\r
207             } else {\r
208               int[] t=new int[exon.length+se.length];\r
209               System.arraycopy(exon, 0, t, 0, exon.length);\r
210               System.arraycopy(se, 0, t, exon.length,se.length);\r
211               exon=t;\r
212             }\r
213           }\r
214         }\r
215         String prseq=null;\r
216         String prname=new String();\r
217         String prid=null;\r
218         int prstart=1;\r
219         // get qualifiers\r
220         if (feature.getQualifiers()!=null && feature.getQualifiers().size()>0) {\r
221           for (Iterator quals=feature.getQualifiers().iterator(); quals.hasNext(); ) {\r
222             Qualifier q = (Qualifier) quals.next();\r
223             if (q.getName().equals("translation")) \r
224             {\r
225               prseq=q.getValue();\r
226             } \r
227             else\r
228               if (q.getName().equals("protein_id")) \r
229               {\r
230                 prid=q.getValue();\r
231               }\r
232               else\r
233                 if (q.getName().equals("codon_start"))\r
234                 {\r
235                   prstart = Integer.parseInt(q.getValue());\r
236                 }\r
237                 else {\r
238                   // throw anything else into the title\r
239                   if (prname.length()==0) {\r
240                     prname = q.getValue();\r
241                   } else {\r
242                     prname = prname + q.getName()+":"+q.getValue();\r
243                   }\r
244                 }\r
245           }\r
246         }\r
247         Sequence product=null;\r
248         if (prseq!=null && prname!=null && prid!=null) {\r
249           // extract proteins.\r
250           if (!noPeptide) {\r
251             product = new Sequence(sourceDb+"|"+"EMBLCDS|"+prid+"|"+prname, prseq, prstart, prstart+prseq.length()-1);\r
252             product.setDescription("Protein Product from "+sourceDb);\r
253             seqs.add(product);\r
254           }\r
255           // we have everything - create the mapping and perhaps the protein sequence\r
256           map = new jalview.datamodel.Mapping(product, exon, new int[] { prstart, prstart+prseq.length()-1}, 3, 1);\r
257           // add cds feature to dna seq - this may include the stop codon\r
258           for (int xint=0;xint<exon.length; xint+=2) {\r
259             SequenceFeature sf = new SequenceFeature();\r
260             sf.setBegin(exon[xint]);\r
261             sf.setEnd(exon[xint+1]);\r
262             sf.setType(feature.getName());\r
263             sf.setFeatureGroup(jalview.datamodel.DBRefSource.EMBL);\r
264             sf.setDescription("Exon "+(1+xint)+" for protein '"+prname+"' EMBLCDS:"+prid);\r
265             dna.addSequenceFeature(sf);\r
266           }\r
267         }\r
268         // add dbRefs to sequence\r
269         if (feature.dbRefs!=null && feature.dbRefs.size()>0) \r
270         {\r
271           for (Iterator dbr=feature.dbRefs.iterator(); dbr.hasNext();  ) \r
272           {\r
273             DBRefEntry ref = (DBRefEntry)dbr.next();\r
274             ref.setSource(jalview.util.DBRefUtils.getCanonicalName(ref.getSource()));\r
275             if (ref.getSource().equals(jalview.datamodel.DBRefSource.UNIPROT)) \r
276             {\r
277               ref.setMap(map);\r
278             }\r
279             if (product!=null) {\r
280               DBRefEntry pref = new DBRefEntry(ref.getSource(), ref.getVersion(), ref.getAccessionId());\r
281               pref.setMap(null); // reference is direct\r
282             }\r
283             dna.addDBRef(ref);\r
284           }\r
285         }\r
286         \r
287       } else {\r
288         // General feature type.\r
289         if (!noNa) {\r
290           if (feature.dbRefs!=null && feature.dbRefs.size()>0) {\r
291             for (Iterator dbr=feature.dbRefs.iterator(); dbr.hasNext(); dna.addDBRef((DBRefEntry)dbr.next()) )\r
292               ;\r
293           }\r
294         }\r
295       }\r
296 \r
297     }\r
298     if (!noNa) {\r
299       seqs.add(dna);\r
300     }\r
301     SequenceI[] sqs = new SequenceI[seqs.size()];\r
302     for (int i=0,j=seqs.size();i<j; i++) {\r
303       sqs[i] = (SequenceI) seqs.elementAt(i);\r
304       seqs.set(i, null);\r
305     }\r
306     return sqs;\r
307   }\r
308 }\r