bc16a0f050cf002f19d27b07e0c3a0f1771a8ec6
[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       // uniprotxml parameter required since december 2007\r
127       File file = ebi.fetchDataAsFile("uniprot:" + queries, "uniprotxml", null);\r
128       Vector entries = getUniprotEntries(file);\r
129 \r
130       if (entries != null)\r
131       {\r
132         // First, make the new sequences\r
133         Enumeration en = entries.elements();\r
134         while (en.hasMoreElements())\r
135         {\r
136           UniprotEntry entry = (UniprotEntry) en.nextElement();\r
137 \r
138           StringBuffer name = new StringBuffer(">UniProt/Swiss-Prot");\r
139           Enumeration en2 = entry.getAccession().elements();\r
140           while (en2.hasMoreElements())\r
141           {\r
142             name.append("|");\r
143             name.append(en2.nextElement());\r
144           }\r
145           en2 = entry.getName().elements();\r
146           while (en2.hasMoreElements())\r
147           {\r
148             name.append("|");\r
149             name.append(en2.nextElement());\r
150           }\r
151 \r
152           if (entry.getProtein() != null)\r
153           {\r
154             name.append(" " + entry.getProtein().getName().elementAt(0));\r
155           }\r
156 \r
157           result.append(name + "\n"\r
158                   + entry.getUniprotSequence().getContent() + "\n");\r
159 \r
160         }\r
161 \r
162         // Then read in the features and apply them to the dataset\r
163         al = parseResult(result.toString());\r
164         if (al!=null)\r
165         {\r
166           // Decorate the alignment with database entries.\r
167           addUniprotXrefs(al, entries);\r
168         } else {\r
169           results = result;\r
170         }\r
171       }\r
172       stopQuery();\r
173       return al;\r
174     } catch (Exception e)\r
175     {\r
176       stopQuery();\r
177       throw(e);\r
178     }\r
179   }\r
180 \r
181   /**\r
182    * add an ordered set of UniprotEntry objects to an ordered set of seuqences.\r
183    * \r
184    * @param al -\r
185    *          a sequence of n sequences\r
186    * @param entries\r
187    *          a seuqence of n uniprot entries to be analysed.\r
188    */\r
189   public void addUniprotXrefs(Alignment al, Vector entries)\r
190   {\r
191     for (int i = 0; i < entries.size(); i++)\r
192     {\r
193       UniprotEntry entry = (UniprotEntry) entries.elementAt(i);\r
194       Enumeration e = entry.getDbReference().elements();\r
195       Vector onlyPdbEntries = new Vector();\r
196       while (e.hasMoreElements())\r
197       {\r
198         PDBEntry pdb = (PDBEntry) e.nextElement();\r
199         if (!pdb.getType().equals("PDB"))\r
200         {\r
201           continue;\r
202         }\r
203 \r
204         onlyPdbEntries.addElement(pdb);\r
205       }\r
206       SequenceI sq = al.getSequenceAt(i);\r
207       while (sq.getDatasetSequence()!=null)\r
208       {\r
209         sq = sq.getDatasetSequence();\r
210       }\r
211 \r
212       Enumeration en2 = entry.getAccession().elements();\r
213       while (en2.hasMoreElements())\r
214       {\r
215         // we always add as uniprot if we retrieved from uniprot or uniprot name\r
216         sq.addDBRef(\r
217                 new DBRefEntry(DBRefSource.UNIPROT, getDbVersion(), en2.nextElement()\r
218                         .toString()));\r
219       }\r
220       sq.setPDBId(onlyPdbEntries);\r
221       if (entry.getFeature() != null)\r
222       {\r
223         e = entry.getFeature().elements();\r
224         while (e.hasMoreElements())\r
225         {\r
226           SequenceFeature sf = (SequenceFeature) e.nextElement();\r
227           sf.setFeatureGroup("Uniprot");\r
228           sq.addSequenceFeature(sf);\r
229         }\r
230       }\r
231     }\r
232   }\r
233 \r
234   /*\r
235    * (non-Javadoc)\r
236    * \r
237    * @see jalview.ws.DbSourceProxy#isValidReference(java.lang.String)\r
238    */\r
239   public boolean isValidReference(String accession)\r
240   {\r
241     return true;\r
242   }\r
243   /**\r
244    * return LDHA_CHICK uniprot entry\r
245    */\r
246   public String getTestQuery()\r
247   {\r
248     return "P00340";\r
249   }\r
250   public String getDbName()\r
251   {\r
252     return getDbSource();\r
253   }\r
254 }\r