3 import java.util.Enumeration;
\r
4 import java.util.Vector;
\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
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
19 public class SequenceFetcher extends ASequenceFetcher
\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
27 public SequenceFetcher()
\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
37 * simple run method to test dbsources.
\r
40 public static void main(String[] argv)
\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
49 DbSourceProxy sp = new SequenceFetcher().getSourceProxy(argv[0]);
\r
52 AlignmentI al = null;
\r
55 al = sp.getSequenceRecords(argv[1]);
\r
56 } catch (Exception e)
\r
58 e.printStackTrace();
\r
59 System.err.println("Error when retrieving "+argv[1]+" from "+argv[0]+"\nUsage: "+usage);
\r
61 SequenceI[] prod = al.getSequencesArray();
\r
64 for (int p = 0; p < prod.length; p++)
\r
66 System.out.println("Prod " + p + ": "
\r
67 + prod[p].getDisplayId(true) + " : "+prod[p].getDescription());
\r
72 System.err.println("Can't resolve "+argv[0]+" as a database name. Allowed values are :\n"+new SequenceFetcher().getSupportedDb());
\r
77 ASequenceFetcher sfetcher = new SequenceFetcher();
\r
78 String[] dbSources = sfetcher.getSupportedDb();
\r
79 for (int dbsource=0; dbsource<dbSources.length;dbsource++)
\r
81 String db = dbSources[dbsource];
\r
83 if (db.equals(DBRefSource.PDB))
\r
85 DbSourceProxy sp = sfetcher.getSourceProxy(db);
\r
87 .println("" + db + ": retrieving test:" + sp.getTestQuery());
\r
88 AlignmentI al = null;
\r
91 al = sp.getSequenceRecords(sp.getTestQuery());
\r
92 if (al != null && al.getHeight() > 0)
\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
105 System.out.println("Xref Types for: " + (dna ? "dna" : "prot"));
\r
106 for (int t = 0; t < types.length; t++)
\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
117 for (int p = 0; p < prod.length; p++)
\r
119 System.out.println("Prod " + p + ": "
\r
120 + prod[p].getDisplayId(true));
\r
127 noProds.addElement((dna ? new Object[]
\r
128 { al, al } : new Object[]
\r
133 } catch (Exception ex)
\r
135 System.out.println("ERROR:Failed to retrieve test query.");
\r
136 ex.printStackTrace(System.out);
\r
140 System.out.println("ERROR:No alignment retrieved.");
\r
141 StringBuffer raw = sp.getRawRecords();
\r
143 System.out.println(raw.toString());
\r
145 System.out.println("ERROR:No Raw results.");
\r
149 System.out.println("Retrieved " + al.getHeight() + " sequences.");
\r
150 for (int s = 0; s < al.getHeight(); s++)
\r
152 SequenceI sq = al.getSequenceAt(s);
\r
153 while (sq.getDatasetSequence() != null)
\r
155 sq = sq.getDatasetSequence();
\r
160 ds = new Alignment(new SequenceI[]
\r
166 ds.addSequence(sq);
\r
170 System.out.flush();
\r
171 System.err.flush();
\r
174 if (noProds.size() > 0)
\r
176 Enumeration ts = noProds.elements();
\r
177 while (ts.hasMoreElements())
\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
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
195 SequenceI[] prod = prodal.getSequencesArray(); // note
\r
206 for (int p = 0; p < prod.length; p++)
\r
208 System.out.println("Prod " + p + ": "
\r
209 + prod[p].getDisplayId(true));
\r