updated jalview version of dasobert 1.53e client and added Das Sequence Source discov...
[jalview.git] / src / jalview / ws / SequenceFetcher.java
1 package jalview.ws;\r
2 \r
3 import java.util.Enumeration;\r
4 import java.util.Vector;\r
5 \r
6 import org.biojava.dasobert.das2.Das2Source;\r
7 import org.biojava.dasobert.dasregistry.Das1Source;\r
8 import org.biojava.dasobert.dasregistry.DasCoordinateSystem;\r
9 import org.biojava.dasobert.dasregistry.DasSource;\r
10 \r
11 import jalview.datamodel.Alignment;\r
12 import jalview.datamodel.AlignmentI;\r
13 import jalview.datamodel.DBRefSource;\r
14 import jalview.datamodel.SequenceI;\r
15 import jalview.ws.seqfetcher.ASequenceFetcher;\r
16 import jalview.ws.seqfetcher.DbSourceProxy;\r
17 \r
18 /**\r
19  * This is the the concrete implementation of the sequence retrieval interface\r
20  * and abstract class in jalview.ws.seqfetcher. This implements the run-time\r
21  * discovery of sequence database clients, and provides a hardwired main for testing all registered handlers. \r
22  * \r
23  */\r
24 public class SequenceFetcher extends ASequenceFetcher\r
25 {\r
26   /**\r
27    * Thread safe construction of database proxies TODO: extend to a configurable\r
28    * database plugin mechanism where classes are instantiated by reflection and\r
29    * queried for their DbRefSource and version association.\r
30    * \r
31    */\r
32   public SequenceFetcher()\r
33   {\r
34     addDBRefSourceImpl(jalview.ws.dbsources.EmblSource.class);\r
35     addDBRefSourceImpl(jalview.ws.dbsources.EmblCdsSouce.class);\r
36     addDBRefSourceImpl(jalview.ws.dbsources.Uniprot.class);\r
37     addDBRefSourceImpl(jalview.ws.dbsources.UnprotName.class);\r
38     addDBRefSourceImpl(jalview.ws.dbsources.Pdb.class);\r
39     addDBRefSourceImpl(jalview.ws.dbsources.Pfam.class);\r
40     registerDasSequenceSources();\r
41   }\r
42   /**\r
43    * simple run method to test dbsources.\r
44    * @param argv\r
45    */\r
46   public static void main(String[] argv)\r
47   {\r
48     AlignmentI ds = null;\r
49     Vector noProds = new Vector();\r
50     String usage = "SequenceFetcher.main [<DBNAME> <ACCNO>]\n"\r
51       +"With no arguments, all DbSources will be queried with their test Accession number.\n"\r
52       +"If given two arguments, SequenceFetcher will try to find the DbFetcher corresponding to <DBNAME> and retrieve <ACCNO> from it.";\r
53     if (argv != null && argv.length > 0)\r
54     {\r
55       DbSourceProxy sp = new SequenceFetcher().getSourceProxy(argv[0]);\r
56       if (sp!=null)\r
57       {\r
58         AlignmentI al = null;\r
59         try\r
60         {\r
61           al = sp.getSequenceRecords(argv[1]);\r
62         } catch (Exception e)\r
63         {\r
64           e.printStackTrace();\r
65           System.err.println("Error when retrieving "+argv[1]+" from "+argv[0]+"\nUsage: "+usage);\r
66         }\r
67         SequenceI[] prod = al.getSequencesArray();\r
68         if (al!=null)\r
69         {\r
70           for (int p = 0; p < prod.length; p++)\r
71           {\r
72             System.out.println("Prod " + p + ": "\r
73                     + prod[p].getDisplayId(true) + " : "+prod[p].getDescription());\r
74           }\r
75         }\r
76         return;\r
77       } else {\r
78         System.err.println("Can't resolve "+argv[0]+" as a database name. Allowed values are :\n"+new SequenceFetcher().getSupportedDb());\r
79       }\r
80       System.out\r
81               .println(usage);\r
82     }\r
83     ASequenceFetcher sfetcher = new SequenceFetcher();\r
84     String[] dbSources = sfetcher.getSupportedDb();\r
85     for (int dbsource=0; dbsource<dbSources.length;dbsource++)\r
86     {\r
87       String db = dbSources[dbsource];\r
88       // skip me\r
89       if (db.equals(DBRefSource.PDB))\r
90         continue;\r
91       DbSourceProxy sp = sfetcher.getSourceProxy(db);\r
92       System.out\r
93               .println("Source: "+sp.getDbName()+" (" + db + "): retrieving test:" + sp.getTestQuery());\r
94       AlignmentI al = null;\r
95       try\r
96       {\r
97         al = sp.getSequenceRecords(sp.getTestQuery());\r
98         if (al != null && al.getHeight() > 0 && sp.getDbSourceProperties()!=null)\r
99         {\r
100           boolean dna = sp.getDbSourceProperties().containsKey(\r
101                   DBRefSource.DNACODINGSEQDB)\r
102                   || sp.getDbSourceProperties().containsKey(\r
103                           DBRefSource.DNASEQDB)\r
104                   || sp.getDbSourceProperties().containsKey(\r
105                           DBRefSource.CODINGSEQDB);\r
106           // try and find products\r
107           String types[] = jalview.analysis.CrossRef.findSequenceXrefTypes(\r
108                   dna, al.getSequencesArray());\r
109           if (types != null)\r
110           {\r
111             System.out.println("Xref Types for: " + (dna ? "dna" : "prot"));\r
112             for (int t = 0; t < types.length; t++)\r
113             {\r
114               System.out.println("Type: " + types[t]);\r
115               SequenceI[] prod = jalview.analysis.CrossRef\r
116                       .findXrefSequences(al.getSequencesArray(), dna,\r
117                               types[t]).getSequencesArray();\r
118               System.out.println("Found "\r
119                       + ((prod == null) ? "no" : "" + prod.length)\r
120                       + " products");\r
121               if (prod != null)\r
122               {\r
123                 for (int p = 0; p < prod.length; p++)\r
124                 {\r
125                   System.out.println("Prod " + p + ": "\r
126                           + prod[p].getDisplayId(true));\r
127                 }\r
128               }\r
129             }\r
130           }\r
131           else\r
132           {\r
133             noProds.addElement((dna ? new Object[]\r
134             { al, al } : new Object[]\r
135             { al }));\r
136           }\r
137 \r
138         }\r
139       } catch (Exception ex)\r
140       {\r
141         System.out.println("ERROR:Failed to retrieve test query.");\r
142         ex.printStackTrace(System.out);\r
143       }\r
144       if (al == null)\r
145       {\r
146         System.out.println("ERROR:No alignment retrieved.");\r
147         StringBuffer raw = sp.getRawRecords();\r
148         if (raw != null)\r
149           System.out.println(raw.toString());\r
150         else\r
151           System.out.println("ERROR:No Raw results.");\r
152       }\r
153       else\r
154       {\r
155         System.out.println("Retrieved " + al.getHeight() + " sequences.");\r
156         for (int s = 0; s < al.getHeight(); s++)\r
157         {\r
158           SequenceI sq = al.getSequenceAt(s);\r
159           while (sq.getDatasetSequence() != null)\r
160           {\r
161             sq = sq.getDatasetSequence();\r
162 \r
163           }\r
164           if (ds == null)\r
165           {\r
166             ds = new Alignment(new SequenceI[]\r
167             { sq });\r
168 \r
169           }\r
170           else\r
171           {\r
172             ds.addSequence(sq);\r
173           }\r
174         }\r
175       }\r
176       System.out.flush();\r
177       System.err.flush();\r
178 \r
179     }\r
180     if (noProds.size() > 0)\r
181     {\r
182       Enumeration ts = noProds.elements();\r
183       while (ts.hasMoreElements())\r
184 \r
185       {\r
186         Object[] typeSq = (Object[]) ts.nextElement();\r
187         boolean dna = (typeSq.length > 1);\r
188         AlignmentI al = (AlignmentI) typeSq[0];\r
189         System.out.println("Trying getProducts for "\r
190                 + al.getSequenceAt(0).getDisplayId(true));\r
191         System.out.println("Search DS Xref for: " + (dna ? "dna" : "prot"));\r
192         // have a bash at finding the products amongst all the retrieved\r
193         // sequences.\r
194         SequenceI[] seqs = al.getSequencesArray();\r
195         Alignment prodal = jalview.analysis.CrossRef.findXrefSequences(\r
196                 seqs, dna, null, ds);\r
197         System.out.println("Found "\r
198                 + ((prodal == null) ? "no" : "" + prodal.getHeight()) + " products");\r
199         if (prodal != null)\r
200         {\r
201           SequenceI[] prod = prodal.getSequencesArray(); // note\r
202           // should\r
203           // test\r
204           // rather\r
205           // than\r
206           // throw\r
207           // away\r
208           // codon\r
209           // mapping\r
210           // (if\r
211           // present)\r
212             for (int p = 0; p < prod.length; p++)\r
213           {\r
214             System.out.println("Prod " + p + ": "\r
215                     + prod[p].getDisplayId(true));\r
216           }\r
217         }\r
218       }\r
219 \r
220     }\r
221   }\r
222   /**\r
223    * query the currently defined DAS source registry for sequence sources and add a DasSequenceSource instance for each source to the SequenceFetcher source list.\r
224    */\r
225   public void registerDasSequenceSources() {\r
226     DasSource[] sources = jalview.ws.DasSequenceFeatureFetcher.getDASSources();\r
227     for (int s=0;s<sources.length; s++)\r
228     {\r
229       Das1Source d1s=null;\r
230       if (sources[s].hasCapability("sequence"))\r
231       {\r
232         if (sources[s] instanceof Das2Source)\r
233         {\r
234           if (((Das2Source)sources[s]).hasDas1Capabilities()) {\r
235             try {\r
236               d1s = org.biojava.dasobert.das2.DasSourceConverter.toDas1Source((Das2Source) sources[s]);\r
237             } catch (Exception e)\r
238             {\r
239               System.err.println("Ignoring DAS2 sequence source "+sources[s].getNickname()+" - couldn't map to Das1Source.\n");\r
240               e.printStackTrace();\r
241             }\r
242           }\r
243         } else {\r
244           if (sources[s] instanceof Das1Source)\r
245           { \r
246             d1s = (Das1Source) sources[s];\r
247           }\r
248         }\r
249       }\r
250       if (d1s!=null)\r
251       {\r
252         DasCoordinateSystem[] css = d1s.getCoordinateSystem();\r
253         for (int c=0;c<css.length;c++)\r
254         {\r
255           try {\r
256             addDbRefSourceImpl(\r
257                     new jalview.ws.dbsources.DasSequenceSource("das:"+d1s.getNickname()+" ("+css[c].getName()+")",\r
258                             css[c].getName(),d1s, css[c]));\r
259           } catch (Exception e)\r
260           {\r
261             System.err.println("Ignoring sequence coord system "+c+" ("+\r
262                     css[c].getName()+") for source "+d1s.getNickname()\r
263                     + "- threw exception when constructing fetcher.\n");\r
264             e.printStackTrace();\r
265           }\r
266         }\r
267       }\r
268           \r
269     }\r
270   }\r
271 \r
272 }\r