Sequence checks for duplicate features
[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 + ":" + seq.getStart() + "," +seq.getEnd()\r
152                 , source);\r
153 \r
154             fetcher.addFeatureListener(new FeatureListener()\r
155             {\r
156               public void comeBackLater(FeatureEvent e)\r
157               {\r
158                 Cache.log.debug("das source " + e.getDasSource().getNickname() +\r
159                                 " asked us to come back in " + e.getComeBackLater() +\r
160                                 " secs.");\r
161               }\r
162 \r
163               public void newFeatures(FeatureEvent e)\r
164               {\r
165                 Das1Source ds = e.getDasSource();\r
166 \r
167                 Map[] features = e.getFeatures();\r
168                 // add features to sequence\r
169                 Cache.log.debug("das source " + ds.getUrl() + " returned " +\r
170                                 features.length + " features");\r
171 \r
172                 if (features.length > 0)\r
173                 {\r
174                   for (int i = 0; i < features.length; i++)\r
175                   {\r
176                     SequenceFeature f = newSequenceFeature(features[i],\r
177                         source.getNickname());\r
178 \r
179                       System.out.println(source.getNickname()+" "+f.getType()+" "+\r
180                                          f.begin+" "+f.end);\r
181 \r
182                       seq.addSequenceFeature(f);\r
183                   }\r
184                 }\r
185               }\r
186 \r
187             }\r
188 \r
189             );\r
190 \r
191             //NOTE alignPanel listener will be called after the previous\r
192             //anonymous listener!!!\r
193             fetcher.addFeatureListener(ap);\r
194 \r
195             fetcher.start();\r
196           }\r
197   }\r
198   /**\r
199    * Spawns a number of dasobert Fetcher threads to add features to sequences in the dataset\r
200    */\r
201   public void run()\r
202   {\r
203     DasSource [] sources = new jalview.gui.DasSourceBrowser().getDASSource();\r
204 \r
205     String active = jalview.bin.Cache.getDefault("DAS_ACTIVE_SOURCE", "uniprot");\r
206     StringTokenizer st = new StringTokenizer(active, "\t");\r
207     Vector selectedSources = new Vector();\r
208     String token;\r
209     while (st.hasMoreTokens())\r
210     {\r
211       token = st.nextToken();\r
212       for(int i=0; i<sources.length; i++)\r
213       {\r
214         if(sources[i].getNickname().equals(token))\r
215         {\r
216           selectedSources.addElement(sources[i]);\r
217           break;\r
218         }\r
219       }\r
220     }\r
221  // DasSource test = new DasSource();\r
222  // test.setUrl("http://localhost:8080/das/gffdb/");\r
223   //test.setNickname("Trixkid");\r
224  // selectedSources.addElement(test);\r
225 \r
226 \r
227     if(selectedSources == null || selectedSources.size()==0)\r
228     {\r
229       System.out.println("No DAS Sources active");\r
230       return;\r
231     }\r
232 \r
233     try\r
234     {\r
235       int seqIndex = 0;\r
236       Vector sequences = dataset.getSequences();\r
237       while (seqIndex < sequences.size())\r
238       {\r
239           Sequence sequence = (Sequence) sequences.get(seqIndex);\r
240           Vector uprefs = jalview.util.DBRefUtils.selectRefs(sequence.getDBRef(),\r
241               new String[]  {\r
242               jalview.datamodel.DBRefSource.PDB,\r
243               jalview.datamodel.DBRefSource.UNIPROT});\r
244 \r
245           for(int sourceIndex=0; sourceIndex<selectedSources.size(); sourceIndex++)\r
246           {\r
247             DasSource dasSource = (DasSource)selectedSources.elementAt(sourceIndex);\r
248 \r
249             if (uprefs != null)\r
250             {\r
251               // we know the id for this entry, so don't note its ID in the unknownSequences list\r
252               for (int j = 0, k = uprefs.size(); j < k; j++)\r
253               {\r
254                 // 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
255                 org.biojava.services.das.registry.DasCoordinateSystem cs[] = dasSource.getCoordinateSystem();\r
256                 for (int l=0; l<cs.length; l++) {\r
257                   if (jalview.util.DBRefUtils.isDasCoordinateSystem(cs[l].getName(), (DBRefEntry)\r
258                       uprefs.get(j)))\r
259                   {\r
260                     Cache.log.debug("Launched fetcher for coordinate system " +\r
261                                     cs[l].getName());\r
262                     createFeatureFetcher(sequence,\r
263                                          dasSource.getUrl(),\r
264                                          ( (DBRefEntry) uprefs.get(j)).\r
265                                          getAccessionId(),\r
266                                          dasSource.getNickname());\r
267                   }\r
268                 }\r
269               }\r
270             }\r
271             else\r
272             {\r
273               String id = null;\r
274               // try and use the name as the sequence id\r
275               if (sequence.getName().indexOf("|") > -1)\r
276               {\r
277                 id = sequence.getName().substring(\r
278                     sequence.getName().lastIndexOf("|") + 1);\r
279               }\r
280               else\r
281               {\r
282                 id = sequence.getName();\r
283               }\r
284               if (id != null)\r
285               {\r
286                 // Should try to call a general feature fetcher that queries many sources with name to discover applicable ID references\r
287                 createFeatureFetcher(sequence,\r
288                                      dasSource.getUrl(),\r
289                                      id,\r
290                                      dasSource.getNickname());\r
291               }\r
292             }\r
293           }\r
294 \r
295           seqIndex++;\r
296     }\r
297     }\r
298     catch (Exception ex)\r
299     {\r
300       ex.printStackTrace();\r
301     }\r
302   }\r
303 \r
304 \r
305  public static DasSource[] getDASSources()\r
306   {\r
307     try\r
308     {\r
309       String registryURL = jalview.bin.Cache.getDefault("DAS_REGISTRY_URL",\r
310           "http://servlet.sanger.ac.uk/dasregistry/services/das_registry");\r
311 \r
312 \r
313       URL url = new URL(registryURL);\r
314 \r
315       DasRegistryAxisClient client = new DasRegistryAxisClient(url);\r
316 \r
317       DasSource[] services = client.listServices();\r
318 \r
319       return services;\r
320     }\r
321     catch (Exception ex)\r
322     {\r
323       ex.printStackTrace();\r
324     }\r
325     return null;\r
326 \r
327   }\r
328 }\r
329 \r
330 \r