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