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