da2dab6c00682d60dcf0f23cb3d2fad443733392
[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 jalview.datamodel.Alignment;\r
7 import jalview.datamodel.AlignmentI;\r
8 import jalview.datamodel.DBRefSource;\r
9 import jalview.datamodel.SequenceI;\r
10 import jalview.ws.seqfetcher.ASequenceFetcher;\r
11 import jalview.ws.seqfetcher.DbSourceProxy;\r
12 \r
13 /**\r
14  * This is the the concrete implementation of the sequence retrieval interface\r
15  * and abstract class in jalview.ws.seqfetcher. This implements the run-time\r
16  * discovery of sequence database clients, and provides a hardwired main for testing all registered handlers. \r
17  * \r
18  */\r
19 public class SequenceFetcher extends ASequenceFetcher\r
20 {\r
21   /**\r
22    * Thread safe construction of database proxies TODO: extend to a configurable\r
23    * database plugin mechanism where classes are instantiated by reflection and\r
24    * queried for their DbRefSource and version association.\r
25    * \r
26    */\r
27   public SequenceFetcher()\r
28   {\r
29     addDBRefSourceImpl(jalview.ws.dbsources.EmblSource.class);\r
30     addDBRefSourceImpl(jalview.ws.dbsources.EmblCdsSouce.class);\r
31     addDBRefSourceImpl(jalview.ws.dbsources.Uniprot.class);\r
32     addDBRefSourceImpl(jalview.ws.dbsources.UnprotName.class);\r
33     addDBRefSourceImpl(jalview.ws.dbsources.Pdb.class);\r
34     addDBRefSourceImpl(jalview.ws.dbsources.Pfam.class);\r
35   };\r
36   /**\r
37    * simple run method to test dbsources.\r
38    * @param argv\r
39    */\r
40   public static void main(String[] argv)\r
41   {\r
42     AlignmentI ds = null;\r
43     Vector noProds = new Vector();\r
44     String usage = "SequenceFetcher.main [<DBNAME> <ACCNO>]\n"\r
45       +"With no arguments, all DbSources will be queried with their test Accession number.\n"\r
46       +"If given two arguments, SequenceFetcher will try to find the DbFetcher corresponding to <DBNAME> and retrieve <ACCNO> from it.";\r
47     if (argv != null && argv.length > 0)\r
48     {\r
49       DbSourceProxy sp = new SequenceFetcher().getSourceProxy(argv[0]);\r
50       if (sp!=null)\r
51       {\r
52         AlignmentI al = null;\r
53         try\r
54         {\r
55           al = sp.getSequenceRecords(argv[1]);\r
56         } catch (Exception e)\r
57         {\r
58           e.printStackTrace();\r
59           System.err.println("Error when retrieving "+argv[1]+" from "+argv[0]+"\nUsage: "+usage);\r
60         }\r
61         SequenceI[] prod = al.getSequencesArray();\r
62         if (al!=null)\r
63         {\r
64           for (int p = 0; p < prod.length; p++)\r
65           {\r
66             System.out.println("Prod " + p + ": "\r
67                     + prod[p].getDisplayId(true) + " : "+prod[p].getDescription());\r
68           }\r
69         }\r
70         return;\r
71       } else {\r
72         System.err.println("Can't resolve "+argv[0]+" as a database name. Allowed values are :\n"+new SequenceFetcher().getSupportedDb());\r
73       }\r
74       System.out\r
75               .println(usage);\r
76     }\r
77     ASequenceFetcher sfetcher = new SequenceFetcher();\r
78     String[] dbSources = sfetcher.getSupportedDb();\r
79     for (int dbsource=0; dbsource<dbSources.length;dbsource++)\r
80     {\r
81       String db = dbSources[dbsource];\r
82       // skip me\r
83       if (db.equals(DBRefSource.PDB))\r
84         continue;\r
85       DbSourceProxy sp = sfetcher.getSourceProxy(db);\r
86       System.out\r
87               .println("" + db + ": retrieving test:" + sp.getTestQuery());\r
88       AlignmentI al = null;\r
89       try\r
90       {\r
91         al = sp.getSequenceRecords(sp.getTestQuery());\r
92         if (al != null && al.getHeight() > 0)\r
93         {\r
94           boolean dna = sp.getDbSourceProperties().containsKey(\r
95                   DBRefSource.DNACODINGSEQDB)\r
96                   || sp.getDbSourceProperties().containsKey(\r
97                           DBRefSource.DNASEQDB)\r
98                   || sp.getDbSourceProperties().containsKey(\r
99                           DBRefSource.CODINGSEQDB);\r
100           // try and find products\r
101           String types[] = jalview.analysis.CrossRef.findSequenceXrefTypes(\r
102                   dna, al.getSequencesArray());\r
103           if (types != null)\r
104           {\r
105             System.out.println("Xref Types for: " + (dna ? "dna" : "prot"));\r
106             for (int t = 0; t < types.length; t++)\r
107             {\r
108               System.out.println("Type: " + types[t]);\r
109               SequenceI[] prod = jalview.analysis.CrossRef\r
110                       .findXrefSequences(al.getSequencesArray(), dna,\r
111                               types[t]).getSequencesArray();\r
112               System.out.println("Found "\r
113                       + ((prod == null) ? "no" : "" + prod.length)\r
114                       + " products");\r
115               if (prod != null)\r
116               {\r
117                 for (int p = 0; p < prod.length; p++)\r
118                 {\r
119                   System.out.println("Prod " + p + ": "\r
120                           + prod[p].getDisplayId(true));\r
121                 }\r
122               }\r
123             }\r
124           }\r
125           else\r
126           {\r
127             noProds.addElement((dna ? new Object[]\r
128             { al, al } : new Object[]\r
129             { al }));\r
130           }\r
131 \r
132         }\r
133       } catch (Exception ex)\r
134       {\r
135         System.out.println("ERROR:Failed to retrieve test query.");\r
136         ex.printStackTrace(System.out);\r
137       }\r
138       if (al == null)\r
139       {\r
140         System.out.println("ERROR:No alignment retrieved.");\r
141         StringBuffer raw = sp.getRawRecords();\r
142         if (raw != null)\r
143           System.out.println(raw.toString());\r
144         else\r
145           System.out.println("ERROR:No Raw results.");\r
146       }\r
147       else\r
148       {\r
149         System.out.println("Retrieved " + al.getHeight() + " sequences.");\r
150         for (int s = 0; s < al.getHeight(); s++)\r
151         {\r
152           SequenceI sq = al.getSequenceAt(s);\r
153           while (sq.getDatasetSequence() != null)\r
154           {\r
155             sq = sq.getDatasetSequence();\r
156 \r
157           }\r
158           if (ds == null)\r
159           {\r
160             ds = new Alignment(new SequenceI[]\r
161             { sq });\r
162 \r
163           }\r
164           else\r
165           {\r
166             ds.addSequence(sq);\r
167           }\r
168         }\r
169       }\r
170       System.out.flush();\r
171       System.err.flush();\r
172 \r
173     }\r
174     if (noProds.size() > 0)\r
175     {\r
176       Enumeration ts = noProds.elements();\r
177       while (ts.hasMoreElements())\r
178 \r
179       {\r
180         Object[] typeSq = (Object[]) ts.nextElement();\r
181         boolean dna = (typeSq.length > 1);\r
182         AlignmentI al = (AlignmentI) typeSq[0];\r
183         System.out.println("Trying getProducts for "\r
184                 + al.getSequenceAt(0).getDisplayId(true));\r
185         System.out.println("Search DS Xref for: " + (dna ? "dna" : "prot"));\r
186         // have a bash at finding the products amongst all the retrieved\r
187         // sequences.\r
188         SequenceI[] seqs = al.getSequencesArray();\r
189         Alignment prodal = jalview.analysis.CrossRef.findXrefSequences(\r
190                 seqs, dna, null, ds);\r
191         System.out.println("Found "\r
192                 + ((prodal == null) ? "no" : "" + prodal.getHeight()) + " products");\r
193         if (prodal != null)\r
194         {\r
195           SequenceI[] prod = prodal.getSequencesArray(); // note\r
196           // should\r
197           // test\r
198           // rather\r
199           // than\r
200           // throw\r
201           // away\r
202           // codon\r
203           // mapping\r
204           // (if\r
205           // present)\r
206             for (int p = 0; p < prod.length; p++)\r
207           {\r
208             System.out.println("Prod " + p + ": "\r
209                     + prod[p].getDisplayId(true));\r
210           }\r
211         }\r
212       }\r
213 \r
214     }\r
215   }\r
216 }\r