sequence db fetcher and db reference validation/annotation transfer
[jalview.git] / src / jalview / ws / dbsources / Uniprot.java
1 /**\r
2  * \r
3  */\r
4 package jalview.ws.dbsources;\r
5 \r
6 import java.io.File;\r
7 import java.io.FileReader;\r
8 import java.io.IOException;\r
9 import java.util.Enumeration;\r
10 import java.util.Hashtable;\r
11 import java.util.Vector;\r
12 \r
13 import org.exolab.castor.xml.Unmarshaller;\r
14 \r
15 import com.stevesoft.pat.Regex;\r
16 \r
17 import jalview.datamodel.Alignment;\r
18 import jalview.datamodel.AlignmentI;\r
19 import jalview.datamodel.DBRefEntry;\r
20 import jalview.datamodel.DBRefSource;\r
21 import jalview.datamodel.PDBEntry;\r
22 import jalview.datamodel.SequenceFeature;\r
23 import jalview.datamodel.SequenceI;\r
24 import jalview.datamodel.UniprotEntry;\r
25 import jalview.datamodel.UniprotFile;\r
26 import jalview.io.FormatAdapter;\r
27 import jalview.io.IdentifyFile;\r
28 import jalview.ws.DBRefFetcher;\r
29 import jalview.ws.ebi.EBIFetchClient;\r
30 import jalview.ws.seqfetcher.DbSourceProxy;\r
31 import jalview.ws.seqfetcher.DbSourceProxyImpl;\r
32 \r
33 /**\r
34  * @author JimP\r
35  * \r
36  */\r
37 public class Uniprot extends DbSourceProxyImpl implements DbSourceProxy\r
38 {\r
39   public Uniprot() {\r
40     super();\r
41     addDbSourceProperty(DBRefSource.SEQDB, DBRefSource.SEQDB);\r
42     addDbSourceProperty(DBRefSource.PROTSEQDB);\r
43     addDbSourceProperty(DBRefSource.MULTIACC, new Integer(50));\r
44   }\r
45 \r
46   /*\r
47    * (non-Javadoc)\r
48    * \r
49    * @see jalview.ws.DbSourceProxy#getAccessionSeparator()\r
50    */\r
51   public String getAccessionSeparator()\r
52   {\r
53     return ";";\r
54   }\r
55 \r
56   /*\r
57    * (non-Javadoc)\r
58    * \r
59    * @see jalview.ws.DbSourceProxy#getAccessionValidator()\r
60    */\r
61   public Regex getAccessionValidator()\r
62   {\r
63     return null;\r
64   }\r
65 \r
66   /*\r
67    * (non-Javadoc)\r
68    * \r
69    * @see jalview.ws.DbSourceProxy#getDbSource()\r
70    */\r
71   public String getDbSource()\r
72   {\r
73     return DBRefSource.UNIPROT;\r
74   }\r
75 \r
76   /*\r
77    * (non-Javadoc)\r
78    * \r
79    * @see jalview.ws.DbSourceProxy#getDbVersion()\r
80    */\r
81   public String getDbVersion()\r
82   {\r
83     return "0"; // we really don't know what version we're on.\r
84   }\r
85 \r
86   private EBIFetchClient ebi = null;\r
87 \r
88   public Vector getUniprotEntries(File file)\r
89   {\r
90     UniprotFile uni = new UniprotFile();\r
91     try\r
92     {\r
93       // 1. Load the mapping information from the file\r
94       org.exolab.castor.mapping.Mapping map = new org.exolab.castor.mapping.Mapping(uni.getClass().getClassLoader());\r
95       java.net.URL url = getClass().getResource("/uniprot_mapping.xml");\r
96       map.loadMapping(url);\r
97 \r
98       // 2. Unmarshal the data\r
99       Unmarshaller unmar = new Unmarshaller(uni);\r
100       unmar.setIgnoreExtraElements(true);\r
101       unmar.setMapping(map);\r
102 \r
103       uni = (UniprotFile) unmar.unmarshal(new FileReader(file));\r
104     }\r
105     catch (Exception e)\r
106     {\r
107       System.out.println("Error getUniprotEntries() " + e);\r
108     }\r
109 \r
110     return uni.getUniprotEntries();\r
111   }\r
112 \r
113   /*\r
114    * (non-Javadoc)\r
115    * \r
116    * @see jalview.ws.DbSourceProxy#getSequenceRecords(java.lang.String[])\r
117    */\r
118   public AlignmentI getSequenceRecords(String queries) throws Exception\r
119   {\r
120     startQuery();\r
121     try\r
122     {\r
123       Alignment al=null;\r
124       ebi = new EBIFetchClient();\r
125       StringBuffer result=new StringBuffer();\r
126       File file = ebi.fetchDataAsFile("uniprot:" + queries, "uniprotxml", null);\r
127       Vector entries = getUniprotEntries(file);\r
128 \r
129       if (entries != null)\r
130       {\r
131         // First, make the new sequences\r
132         Enumeration en = entries.elements();\r
133         while (en.hasMoreElements())\r
134         {\r
135           UniprotEntry entry = (UniprotEntry) en.nextElement();\r
136 \r
137           StringBuffer name = new StringBuffer(">UniProt/Swiss-Prot");\r
138           Enumeration en2 = entry.getAccession().elements();\r
139           while (en2.hasMoreElements())\r
140           {\r
141             name.append("|");\r
142             name.append(en2.nextElement());\r
143           }\r
144           en2 = entry.getName().elements();\r
145           while (en2.hasMoreElements())\r
146           {\r
147             name.append("|");\r
148             name.append(en2.nextElement());\r
149           }\r
150 \r
151           if (entry.getProtein() != null)\r
152           {\r
153             name.append(" " + entry.getProtein().getName().elementAt(0));\r
154           }\r
155 \r
156           result.append(name + "\n"\r
157                   + entry.getUniprotSequence().getContent() + "\n");\r
158 \r
159         }\r
160 \r
161         // Then read in the features and apply them to the dataset\r
162         al = parseResult(result.toString());\r
163         if (al!=null)\r
164         {\r
165           // Decorate the alignment with database entries.\r
166           addUniprotXrefs(al, entries);\r
167         } else {\r
168           results = result;\r
169         }\r
170       }\r
171       stopQuery();\r
172       return al;\r
173     } catch (Exception e)\r
174     {\r
175       stopQuery();\r
176       throw(e);\r
177     }\r
178   }\r
179 \r
180   /**\r
181    * add an ordered set of UniprotEntry objects to an ordered set of seuqences.\r
182    * \r
183    * @param al -\r
184    *          a sequence of n sequences\r
185    * @param entries\r
186    *          a seuqence of n uniprot entries to be analysed.\r
187    */\r
188   public void addUniprotXrefs(Alignment al, Vector entries)\r
189   {\r
190     for (int i = 0; i < entries.size(); i++)\r
191     {\r
192       UniprotEntry entry = (UniprotEntry) entries.elementAt(i);\r
193       Enumeration e = entry.getDbReference().elements();\r
194       Vector onlyPdbEntries = new Vector();\r
195       while (e.hasMoreElements())\r
196       {\r
197         PDBEntry pdb = (PDBEntry) e.nextElement();\r
198         if (!pdb.getType().equals("PDB"))\r
199         {\r
200           continue;\r
201         }\r
202 \r
203         onlyPdbEntries.addElement(pdb);\r
204       }\r
205       SequenceI sq = al.getSequenceAt(i);\r
206       while (sq.getDatasetSequence()!=null)\r
207       {\r
208         sq = sq.getDatasetSequence();\r
209       }\r
210 \r
211       Enumeration en2 = entry.getAccession().elements();\r
212       while (en2.hasMoreElements())\r
213       {\r
214         // we always add as uniprot if we retrieved from uniprot or uniprot name\r
215         sq.addDBRef(\r
216                 new DBRefEntry(DBRefSource.UNIPROT, getDbVersion(), en2.nextElement()\r
217                         .toString()));\r
218       }\r
219       sq.setPDBId(onlyPdbEntries);\r
220       if (entry.getFeature() != null)\r
221       {\r
222         e = entry.getFeature().elements();\r
223         while (e.hasMoreElements())\r
224         {\r
225           SequenceFeature sf = (SequenceFeature) e.nextElement();\r
226           sf.setFeatureGroup("Uniprot");\r
227           sq.addSequenceFeature(sf);\r
228         }\r
229       }\r
230     }\r
231   }\r
232 \r
233   /*\r
234    * (non-Javadoc)\r
235    * \r
236    * @see jalview.ws.DbSourceProxy#isValidReference(java.lang.String)\r
237    */\r
238   public boolean isValidReference(String accession)\r
239   {\r
240     return true;\r
241   }\r
242   /**\r
243    * return LDHA_CHICK uniprot entry\r
244    */\r
245   public String getTestQuery()\r
246   {\r
247     return "P00340";\r
248   }\r
249   public String getDbName()\r
250   {\r
251     return getDbSource();\r
252   }\r
253 }\r