Dont add start and end for the moment
[jalview.git] / src / jalview / io / DasSequenceFeatureFetcher.java
1 /*\r
2 * Jalview - A Sequence Alignment Editor and Viewer\r
3 * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4 *\r
5 * This program is free software; you can redistribute it and/or\r
6 * modify it under the terms of the GNU General Public License\r
7 * as published by the Free Software Foundation; either version 2\r
8 * of the License, or (at your option) any later version.\r
9 *\r
10 * This program is distributed in the hope that it will be useful,\r
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13 * GNU General Public License for more details.\r
14 *\r
15 * You should have received a copy of the GNU General Public License\r
16 * along with this program; if not, write to the Free Software\r
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18 */\r
19 package jalview.io;\r
20 \r
21 import jalview.datamodel.*;\r
22 \r
23 import jalview.gui.*;\r
24 \r
25 import java.util.*;\r
26 \r
27 import java.net.URL;\r
28 \r
29 import org.biojava.dasobert.das.FeatureThread;\r
30 import org.biojava.dasobert.dasregistry.Das1Source;\r
31 import org.biojava.dasobert.eventmodel.FeatureEvent;\r
32 import org.biojava.dasobert.eventmodel.FeatureListener;\r
33 import org.biojava.services.das.registry.DasRegistryAxisClient;\r
34 import org.biojava.services.das.registry.DasSource;\r
35 \r
36 \r
37 import jalview.bin.Cache;\r
38 \r
39 \r
40 /**\r
41  * DOCUMENT ME!\r
42  *\r
43  * @author $author$\r
44  * @version $Revision$\r
45  */\r
46 public class DasSequenceFeatureFetcher implements Runnable\r
47 {\r
48   final AlignmentI dataset;\r
49   final AlignmentPanel ap;\r
50   StringBuffer sbuffer = new StringBuffer();\r
51 \r
52 \r
53 \r
54   /**\r
55    * Creates a new SequenceFeatureFetcher object.\r
56    *\r
57    * @param align DOCUMENT ME!\r
58    * @param ap DOCUMENT ME!\r
59    */\r
60   public DasSequenceFeatureFetcher(AlignmentI align, AlignmentPanel ap)\r
61   {\r
62     this.dataset = align.getDataset();\r
63     this.ap = ap;\r
64 \r
65     Thread thread = new Thread(this);\r
66     thread.start();\r
67   }\r
68   /**\r
69    * creates a jalview sequence feature from a das feature document\r
70    * @param dasfeature\r
71    * @return sequence feature object created using dasfeature information\r
72    */\r
73   SequenceFeature newSequenceFeature(Map dasfeature, String nickname)\r
74   {\r
75           try {\r
76                 /**\r
77            * Different qNames for a DAS Feature - are string keys to the HashMaps in features\r
78            * "METHOD") ||\r
79            qName.equals("TYPE") ||\r
80            qName.equals("START") ||\r
81            qName.equals("END") ||\r
82            qName.equals("NOTE") ||\r
83            qName.equals("LINK") ||\r
84            qName.equals("SCORE")\r
85            */\r
86                   String desc = new String();\r
87                   if (dasfeature.containsKey("NOTE"))\r
88                                 desc+=(String) dasfeature.get("NOTE");\r
89 \r
90 \r
91                   int start = 0, end = 0;\r
92                   float score = 0f;\r
93 \r
94                   try{ start = Integer.parseInt( dasfeature.get("START").toString()); }\r
95                   catch( Exception ex){}\r
96                   try{ end = Integer.parseInt( dasfeature.get("END").toString()); }\r
97                   catch (Exception ex){}\r
98                   try{ score = Integer.parseInt( dasfeature.get("SCORE").toString()); }\r
99                   catch (Exception ex){}\r
100 \r
101 \r
102                   SequenceFeature f = new SequenceFeature(\r
103                                   (String) dasfeature.get("TYPE"),\r
104                                   desc,\r
105                                   start,\r
106                                   end,\r
107                                   score,\r
108                                   nickname);\r
109 \r
110                   if (dasfeature.containsKey("LINK"))\r
111                  {\r
112                       f.addLink(f.getType()+" "+f.begin+"_"+f.end\r
113                                 +"|"+ dasfeature.get("LINK"));\r
114                   }\r
115                   // (String) dasfeature.get("ID"),\r
116                   ////  (String) dasfeature.get("METHOD"),\r
117                                 //  (String) dasfeature.get("SCORE"),\r
118                                 //  null\r
119                         // );\r
120 \r
121                      // System.out.println(nickname+" "+f.getType()+" "+f.begin+" "+f.end);\r
122           return f;\r
123           }\r
124           catch (Exception e) {\r
125             e.printStackTrace();\r
126                   Cache.log.debug("Failed to parse "+dasfeature.toString(), e);\r
127                   return null;\r
128           }\r
129   }\r
130   /**\r
131    * fetch and add das features to a sequence using the given source URL and Id to create a feature request\r
132    * @param seq\r
133    * @param SourceUrl\r
134    * @param id\r
135    */\r
136   protected void createFeatureFetcher(final Sequence seq,\r
137                                       final String sourceUrl,\r
138                                       String id,\r
139                                       String nickname)  {\r
140           //////////////\r
141           /// fetch DAS features\r
142           final Das1Source source = new Das1Source();\r
143           source.setUrl(sourceUrl);\r
144           source.setNickname(nickname);\r
145 \r
146 \r
147           Cache.log.debug("new Das Feature Fetcher for " + id + " querying " +\r
148                           sourceUrl);\r
149           if (id != null && id.length() > 0)\r
150           {\r
151             FeatureThread fetcher = new FeatureThread(id\r
152              //  +  ":" + seq.getStart() + "," +seq.getEnd()\r
153                  , source);\r
154 \r
155             fetcher.addFeatureListener(new FeatureListener()\r
156             {\r
157               public void comeBackLater(FeatureEvent e)\r
158               {\r
159                 Cache.log.debug("das source " + e.getDasSource().getNickname() +\r
160                                 " asked us to come back in " + e.getComeBackLater() +\r
161                                 " secs.");\r
162               }\r
163 \r
164               public void newFeatures(FeatureEvent e)\r
165               {\r
166                 Das1Source ds = e.getDasSource();\r
167 \r
168                 Map[] features = e.getFeatures();\r
169                 // add features to sequence\r
170                 Cache.log.debug("das source " + ds.getUrl() + " returned " +\r
171                                 features.length + " features");\r
172 \r
173                 if (features.length > 0)\r
174                 {\r
175                   for (int i = 0; i < features.length; i++)\r
176                   {\r
177                       SequenceFeature f = newSequenceFeature(features[i],\r
178                         source.getNickname());\r
179 \r
180                       seq.addSequenceFeature(f);\r
181                   }\r
182                 }\r
183               }\r
184 \r
185             }\r
186 \r
187             );\r
188 \r
189             //NOTE alignPanel listener will be called after the previous\r
190             //anonymous listener!!!\r
191             fetcher.addFeatureListener(ap);\r
192 \r
193             fetcher.start();\r
194           }\r
195   }\r
196   /**\r
197    * Spawns a number of dasobert Fetcher threads to add features to sequences in the dataset\r
198    */\r
199   public void run()\r
200   {\r
201     DasSource [] sources = new jalview.gui.DasSourceBrowser().getDASSource();\r
202 \r
203     String active = jalview.bin.Cache.getDefault("DAS_ACTIVE_SOURCE", "uniprot");\r
204     StringTokenizer st = new StringTokenizer(active, "\t");\r
205     Vector selectedSources = new Vector();\r
206     String token;\r
207     while (st.hasMoreTokens())\r
208     {\r
209       token = st.nextToken();\r
210       for(int i=0; i<sources.length; i++)\r
211       {\r
212         if(sources[i].getNickname().equals(token))\r
213         {\r
214           selectedSources.addElement(sources[i]);\r
215           break;\r
216         }\r
217       }\r
218     }\r
219 \r
220 \r
221     if(selectedSources == null || selectedSources.size()==0)\r
222     {\r
223       System.out.println("No DAS Sources active");\r
224       return;\r
225     }\r
226 \r
227     try\r
228     {\r
229       int seqIndex = 0;\r
230       Vector sequences = dataset.getSequences();\r
231       while (seqIndex < sequences.size())\r
232       {\r
233           Sequence sequence = (Sequence) sequences.get(seqIndex);\r
234           Vector uprefs = jalview.util.DBRefUtils.selectRefs(sequence.getDBRef(),\r
235               new String[]  {\r
236               jalview.datamodel.DBRefSource.PDB,\r
237               jalview.datamodel.DBRefSource.UNIPROT});\r
238 \r
239           for(int sourceIndex=0; sourceIndex<selectedSources.size(); sourceIndex++)\r
240           {\r
241             DasSource dasSource = (DasSource)selectedSources.elementAt(sourceIndex);\r
242 \r
243             if (uprefs != null)\r
244             {\r
245               // we know the id for this entry, so don't note its ID in the unknownSequences list\r
246               for (int j = 0, k = uprefs.size(); j < k; j++)\r
247               {\r
248                 // Will have to pass any mapping information to the fetcher - the start/end for the DBRefEntry may not be the same as the sequence's start/end\r
249                 org.biojava.services.das.registry.DasCoordinateSystem cs[] = dasSource.getCoordinateSystem();\r
250                 for (int l=0; l<cs.length; l++) {\r
251                   if (jalview.util.DBRefUtils.isDasCoordinateSystem(cs[l].getName(), (DBRefEntry)\r
252                       uprefs.get(j)))\r
253                   {\r
254                     Cache.log.debug("Launched fetcher for coordinate system " +\r
255                                     cs[l].getName());\r
256                     createFeatureFetcher(sequence,\r
257                                          dasSource.getUrl(),\r
258                                          ( (DBRefEntry) uprefs.get(j)).\r
259                                          getAccessionId(),\r
260                                          dasSource.getNickname());\r
261                   }\r
262                 }\r
263               }\r
264             }\r
265             else\r
266             {\r
267               String id = null;\r
268               // try and use the name as the sequence id\r
269               if (sequence.getName().indexOf("|") > -1)\r
270               {\r
271                 id = sequence.getName().substring(\r
272                     sequence.getName().lastIndexOf("|") + 1);\r
273               }\r
274               else\r
275               {\r
276                 id = sequence.getName();\r
277               }\r
278               if (id != null)\r
279               {\r
280                 // Should try to call a general feature fetcher that queries many sources with name to discover applicable ID references\r
281                 createFeatureFetcher(sequence,\r
282                                      dasSource.getUrl(),\r
283                                      id,\r
284                                      dasSource.getNickname());\r
285               }\r
286             }\r
287           }\r
288 \r
289           seqIndex++;\r
290     }\r
291     }\r
292     catch (Exception ex)\r
293     {\r
294       ex.printStackTrace();\r
295     }\r
296   }\r
297 \r
298 \r
299  public static DasSource[] getDASSources()\r
300   {\r
301     try\r
302     {\r
303       String registryURL = jalview.bin.Cache.getDefault("DAS_REGISTRY_URL",\r
304           "http://servlet.sanger.ac.uk/dasregistry/services/das_registry");\r
305 \r
306 \r
307       URL url = new URL(registryURL);\r
308 \r
309       DasRegistryAxisClient client = new DasRegistryAxisClient(url);\r
310 \r
311       DasSource[] services = client.listServices();\r
312 \r
313       return services;\r
314     }\r
315     catch (Exception ex)\r
316     {\r
317       ex.printStackTrace();\r
318     }\r
319     return null;\r
320 \r
321   }\r
322 }\r
323 \r
324 \r