new DBRef management and generalised source and entry retrieval mechanism for referen...
[jalview.git] / src / jalview / ws / SequenceFetcher.java
1 package jalview.ws;\r
2 \r
3 import java.util.Enumeration;\r
4 import java.util.Hashtable;\r
5 import java.util.Vector;\r
6 \r
7 import jalview.datamodel.Alignment;\r
8 import jalview.datamodel.AlignmentI;\r
9 import jalview.datamodel.DBRefSource;\r
10 import jalview.datamodel.SequenceI;\r
11 \r
12 /**\r
13  * prototype of abstract sequence retrieval interface\r
14  * \r
15  */\r
16 public class SequenceFetcher extends ASequenceFetcher\r
17 {\r
18   /**\r
19    * Thread safe construction of database proxies TODO: extend to a configurable\r
20    * database plugin mechanism where classes are instantiated by reflection and\r
21    * queried for their DbRefSource and version association.\r
22    * \r
23    */\r
24   public SequenceFetcher()\r
25   {\r
26     FETCHABLEDBS = new Hashtable();\r
27     FETCHABLEDBS.put(DBRefSource.EMBL,\r
28             new jalview.ws.dbsources.EmblSource());\r
29     FETCHABLEDBS.put(DBRefSource.EMBLCDS,\r
30             new jalview.ws.dbsources.EmblCdsSouce());\r
31     FETCHABLEDBS.put(DBRefSource.UNIPROT,\r
32             new jalview.ws.dbsources.Uniprot());\r
33     FETCHABLEDBS.put(DBRefSource.UP_NAME,\r
34             new jalview.ws.dbsources.Uniprot());\r
35     FETCHABLEDBS.put(DBRefSource.PDB, new jalview.ws.dbsources.Pdb());\r
36     FETCHABLEDBS.put(DBRefSource.PFAM, new jalview.ws.dbsources.Pfam());\r
37   };\r
38 \r
39   public static void main(String[] argv)\r
40   {\r
41     AlignmentI ds = null;\r
42     Vector noProds = new Vector();\r
43     if (argv != null && argv.length > 0)\r
44     {\r
45       System.out\r
46               .println("Ignoring arguments. Future Usage = dbname:query1;query2;...");\r
47     }\r
48     SequenceFetcher sfetcher = new SequenceFetcher();\r
49     Enumeration e = sfetcher.FETCHABLEDBS.keys();\r
50     while (e.hasMoreElements())\r
51     {\r
52       String db = (String) e.nextElement();\r
53       // skip me\r
54       if (db.equals(DBRefSource.PDB))\r
55         continue;\r
56       DbSourceProxy sp = sfetcher.getSourceProxy(db);\r
57       System.out\r
58               .println("" + db + ": retrieving test:" + sp.getTestQuery());\r
59       AlignmentI al = null;\r
60       try\r
61       {\r
62         al = sp.getSequenceRecords(sp.getTestQuery());\r
63         if (al != null && al.getHeight() > 0)\r
64         {\r
65           boolean dna = sp.getDbSourceProperties().containsKey(\r
66                   DBRefSource.DNACODINGSEQDB)\r
67                   || sp.getDbSourceProperties().containsKey(\r
68                           DBRefSource.DNASEQDB)\r
69                   || sp.getDbSourceProperties().containsKey(\r
70                           DBRefSource.CODINGSEQDB);\r
71           // try and find products\r
72           String types[] = jalview.analysis.CrossRef.findSequenceXrefTypes(\r
73                   dna, al.getSequencesArray());\r
74           if (types != null)\r
75           {\r
76             System.out.println("Xref Types for: "+(dna ? "dna" : "prot"));\r
77             for (int t = 0; t < types.length; t++)\r
78             {\r
79               System.out.println("Type: " + types[t]);\r
80               SequenceI[] prod = jalview.analysis.CrossRef.findXrefSequences(al\r
81                       .getSequencesArray(), dna, types[t]).getSequencesArray();\r
82               System.out.println("Found "\r
83                       + ((prod == null) ? "no" : "" + prod.length)\r
84                       + " products");\r
85               if (prod!=null)\r
86               {\r
87                 for (int p=0; p<prod.length; p++)\r
88                 {\r
89                   System.out.println("Prod "+p+": "+prod[p].getDisplayId(true));\r
90                 }\r
91               }\r
92             }\r
93           } else {\r
94             noProds.addElement((dna ? new Object[] { al, al } : new Object[] { al }) ); \r
95           }\r
96 \r
97         }\r
98       } catch (Exception ex)\r
99       {\r
100         System.out.println("ERROR:Failed to retrieve test query.");\r
101         ex.printStackTrace(System.out);\r
102       }\r
103       if (al == null)\r
104       {\r
105         System.out.println("ERROR:No alignment retrieved.");\r
106         StringBuffer raw = sp.getRawRecords();\r
107         if (raw != null)\r
108           System.out.println(raw.toString());\r
109         else\r
110           System.out.println("ERROR:No Raw results.");\r
111       }\r
112       else\r
113       {\r
114         System.out.println("Retrieved " + al.getHeight() + " sequences.");\r
115         for (int s = 0; s < al.getHeight(); s++)\r
116         {\r
117           SequenceI sq = al.getSequenceAt(s);\r
118           while (sq.getDatasetSequence() != null)\r
119           {\r
120             sq = sq.getDatasetSequence();\r
121 \r
122           }\r
123           if (ds == null)\r
124           {\r
125             ds = new Alignment(new SequenceI[]\r
126             { sq });\r
127 \r
128           }\r
129           else\r
130           {\r
131             ds.addSequence(sq);\r
132           }\r
133         }\r
134       }\r
135       System.out.flush();\r
136       System.err.flush();\r
137 \r
138     }\r
139     if (noProds.size()>0)\r
140     {\r
141       Enumeration ts = noProds.elements();\r
142       while (ts.hasMoreElements())\r
143         \r
144       {\r
145         Object[] typeSq = (Object[]) ts.nextElement();\r
146         boolean dna = (typeSq.length>1);\r
147         AlignmentI al = (AlignmentI) typeSq[0];\r
148         System.out.println("Trying getProducts for "+al.getSequenceAt(0).getDisplayId(true));\r
149         System.out.println("Search DS Xref for: "+(dna ? "dna" : "prot"));\r
150         // have a bash at finding the products amongst all the retrieved sequences.\r
151         SequenceI[] prod = jalview.analysis.CrossRef.findXrefSequences(al\r
152               .getSequencesArray(), dna, null, ds).getSequencesArray(); // note should test rather than throw away codon mapping (if present)\r
153         System.out.println("Found "\r
154                 + ((prod == null) ? "no" : "" + prod.length)\r
155                 + " products");\r
156         if (prod!=null)\r
157         {\r
158           for (int p=0; p<prod.length; p++)\r
159           {\r
160             System.out.println("Prod "+p+": "+prod[p].getDisplayId(true));\r
161           }\r
162         }\r
163       }\r
164 \r
165     }\r
166   }\r
167 }\r