pfam seed and full alignment retrieval and nicer ordering of sequence db sources...
authorjprocter <Jim Procter>
Mon, 4 Aug 2008 14:16:18 +0000 (14:16 +0000)
committerjprocter <Jim Procter>
Mon, 4 Aug 2008 14:16:18 +0000 (14:16 +0000)
src/jalview/gui/SequenceFetcher.java
src/jalview/ws/SequenceFetcher.java
src/jalview/ws/dbsources/Pfam.java
src/jalview/ws/dbsources/PfamFull.java [new file with mode: 0644]
src/jalview/ws/dbsources/PfamSeed.java [new file with mode: 0644]
src/jalview/ws/seqfetcher/ASequenceFetcher.java

index 53f75a4..a66ec2f 100755 (executable)
@@ -50,7 +50,7 @@ extends JPanel implements Runnable
   StringBuffer result;
   final String noDbSelected = "-- Select Database --";
   Hashtable sources = new Hashtable();
-  private static ASequenceFetcher sfetch=null;
+  private static jalview.ws.SequenceFetcher sfetch=null;
   public SequenceFetcher(IProgressIndicator guiIndic)
   {
       final IProgressIndicator guiWindow = guiIndic;
@@ -69,7 +69,7 @@ extends JPanel implements Runnable
             {
               guiWindow.setProgressBar("Initialising Sequence Database Fetchers", this.hashCode());
             }
-            ASequenceFetcher sf = new jalview.ws.SequenceFetcher();
+            jalview.ws.SequenceFetcher sf = new jalview.ws.SequenceFetcher();
             if ( guiWindow!=null )
             {
               guiWindow.setProgressBar("Initialising Sequence Database Fetchers", this.hashCode());
@@ -102,7 +102,7 @@ extends JPanel implements Runnable
      * and should be collapsed. 
      */
      
-    String dbs[] = sfetch.getSupportedDb();
+    String dbs[] = sfetch.getOrderedSupportedSources();
     for (int i=0; i<dbs.length;i++)
     {
       if (!sources.containsValue(dbs[i]))
index 073d448..0d93cb8 100644 (file)
@@ -1,5 +1,6 @@
 package jalview.ws;\r
 \r
+import java.util.ArrayList;\r
 import java.util.Enumeration;\r
 import java.util.Vector;\r
 \r
@@ -36,10 +37,62 @@ public class SequenceFetcher extends ASequenceFetcher
     addDBRefSourceImpl(jalview.ws.dbsources.Uniprot.class);\r
     addDBRefSourceImpl(jalview.ws.dbsources.UnprotName.class);\r
     addDBRefSourceImpl(jalview.ws.dbsources.Pdb.class);\r
-    addDBRefSourceImpl(jalview.ws.dbsources.Pfam.class);\r
+    addDBRefSourceImpl(jalview.ws.dbsources.PfamFull.class);\r
+    addDBRefSourceImpl(jalview.ws.dbsources.PfamSeed.class); // ensures Seed alignment is 'default' for PFAM\r
     registerDasSequenceSources();\r
   }\r
   /**\r
+   * return an ordered list of database sources suitable for using in a GUI element\r
+   */\r
+  public String[] getOrderedSupportedSources() {\r
+    String[] srcs = this.getSupportedDb();\r
+    ArrayList dassrc = new ArrayList(),\r
+      nondas=new ArrayList();\r
+    for (int i=0;i<srcs.length;i++)\r
+    {\r
+      String nm = getSourceProxy(srcs[i]).getDbName();\r
+      if (getSourceProxy(srcs[i]) instanceof jalview.ws.dbsources.DasSequenceSource)\r
+      {\r
+        if (nm.startsWith("das:"))\r
+        {\r
+          nm = nm.substring(4);\r
+        }\r
+        dassrc.add(new String[] { srcs[i], nm.toUpperCase()} );\r
+      } else {\r
+        nondas.add(new String[] { srcs[i], nm.toUpperCase()} );\r
+      }\r
+    }\r
+    Object[] sorted = nondas.toArray();\r
+    String[] tosort = new String[sorted.length];\r
+    nondas.clear();\r
+    for (int j=0;j<sorted.length;j++)\r
+    {\r
+      tosort[j] = ((String[]) sorted[j])[1];\r
+    }\r
+    jalview.util.QuickSort.sort(tosort, sorted);\r
+    int i=0;\r
+    for (int j=sorted.length-1;j>=0; j--,i++)\r
+    {\r
+      srcs[i] = ((String[]) sorted[j])[0];\r
+      sorted[j] = null;\r
+    }\r
+\r
+    sorted = dassrc.toArray();\r
+    tosort = new String[sorted.length];\r
+    dassrc.clear();\r
+    for (int j=0;j<sorted.length;j++)\r
+    {\r
+      tosort[j] = ((String[]) sorted[j])[1];\r
+    }\r
+    jalview.util.QuickSort.sort(tosort, sorted);\r
+    for (int j=sorted.length-1;j>=0; j--,i++)\r
+    {\r
+      srcs[i] = ((String[]) sorted[j])[0];\r
+      sorted[j] = null;\r
+    }\r
+    return srcs;\r
+  }\r
+  /**\r
    * simple run method to test dbsources.\r
    * @param argv\r
    */\r
index db765eb..4136e62 100644 (file)
@@ -9,23 +9,25 @@ import com.stevesoft.pat.Regex;
 \r
 import jalview.datamodel.AlignmentI;\r
 import jalview.datamodel.DBRefEntry;\r
+import jalview.io.AppletFormatAdapter;\r
 import jalview.io.FastaFile;\r
+import jalview.io.StockholmFile;\r
 import jalview.ws.seqfetcher.DbSourceProxy;\r
 import jalview.ws.seqfetcher.DbSourceProxyImpl;\r
 /**\r
- * TODO: later PFAM is a complex datasource - it currently returns a seed alignment, but could optionally return a full alignment.\r
  * TODO: later PFAM is a complex datasource - it could return a tree in addition to an alignment\r
- * TODO: HP: Incorporate jalview.gui.SequenceFetcher retrieval code here.\r
+ * TODO: create interface to pass alignment properties and tree back to sequence fetcher\r
  * @author JimP\r
  *\r
  */\r
-public class Pfam extends DbSourceProxyImpl implements DbSourceProxy\r
+abstract public class Pfam extends DbSourceProxyImpl implements DbSourceProxy\r
 {\r
 \r
   public Pfam()\r
   {\r
     super();\r
-    \r
+    // all extensions of this PFAM source base class are DOMAINDB sources \r
+    addDbSourceProperty(jalview.datamodel.DBRefSource.DOMAINDB);\r
   }\r
 \r
   /* (non-Javadoc)\r
@@ -48,21 +50,24 @@ public class Pfam extends DbSourceProxyImpl implements DbSourceProxy
 \r
   /* (non-Javadoc)\r
    * @see jalview.ws.DbSourceProxy#getDbSource()\r
-   */\r
   public String getDbSource()\r
   {\r
+    ** this doesn't work - DbSource is key for the hash of DbSourceProxy instances - 1:many mapping for DbSource to proxy will be lost.\r
+    ** suggest : PFAM is an 'alignment' source - means proxy is higher level than a sequence source.\r
     return jalview.datamodel.DBRefSource.PFAM;\r
   }\r
+   */\r
 \r
+  \r
   /* (non-Javadoc)\r
    * @see jalview.ws.DbSourceProxy#getDbSourceProperties()\r
-   */\r
   public Hashtable getDbSourceProperties()\r
   {\r
-    // TODO Auto-generated method stub\r
+    \r
     return null;\r
   }\r
-\r
+ */\r
+  \r
   /* (non-Javadoc)\r
    * @see jalview.ws.DbSourceProxy#getDbVersion()\r
    */\r
@@ -71,7 +76,11 @@ public class Pfam extends DbSourceProxyImpl implements DbSourceProxy
     // TODO Auto-generated method stub\r
     return null;\r
   }\r
-  public static String PFAMURL = "http://www.sanger.ac.uk/cgi-bin/Pfam/getalignment.pl?format=fal&acc=";\r
+  /**\r
+   * \r
+   * @return PFAM URL stub for this DbSource\r
+   */\r
+  protected abstract String getPFAMURL();\r
   /* (non-Javadoc)\r
    * @see jalview.ws.DbSourceProxy#getSequenceRecords(java.lang.String[])\r
    */\r
@@ -79,16 +88,20 @@ public class Pfam extends DbSourceProxyImpl implements DbSourceProxy
   {\r
     // TODO: this is not a perfect implementation. We need to be able to add individual references to each sequence in each family alignment that's retrieved. \r
     startQuery();\r
-    results = new StringBuffer();\r
-    // split queries into many little ones.\r
-    results.append(new FastaFile(\r
-                PFAMURL+queries.trim().toUpperCase(), "URL").print());\r
-    stopQuery();\r
-    AlignmentI rcds = parseResult(results.toString());\r
+    AlignmentI rcds = new jalview.io.FormatAdapter().readFile(getPFAMURL()+queries.trim().toUpperCase(), jalview.io.FormatAdapter.URL,"STH");\r
     for (int s=0,sNum=rcds.getHeight(); s<sNum;s++)\r
     {\r
-      rcds.getSequenceAt(s).addDBRef(new DBRefEntry(getDbSource(), getDbVersion(), queries.trim().toUpperCase()));\r
+      rcds.getSequenceAt(s).addDBRef(new DBRefEntry(jalview.datamodel.DBRefSource.PFAM,\r
+              // getDbSource(), \r
+              getDbVersion(), queries.trim().toUpperCase()));\r
+      if (!getDbSource().equals(jalview.datamodel.DBRefSource.PFAM))\r
+      {         // add the specific ref too\r
+        rcds.getSequenceAt(s).addDBRef(\r
+                new DBRefEntry( getDbSource(), \r
+                        getDbVersion(), queries.trim().toUpperCase()));\r
+      }\r
     }\r
+    stopQuery();\r
     return rcds;\r
   }\r
 \r
@@ -100,13 +113,9 @@ public class Pfam extends DbSourceProxyImpl implements DbSourceProxy
     return accession.indexOf("PF")==0;\r
   }\r
 \r
-  public String getTestQuery()\r
-  {\r
-    return "PF00535";\r
-  }\r
 \r
-  public String getDbName()\r
+  /*public String getDbName()\r
   {\r
     return "PFAM"; // getDbSource();\r
-  }\r
+  } */\r
 }\r
diff --git a/src/jalview/ws/dbsources/PfamFull.java b/src/jalview/ws/dbsources/PfamFull.java
new file mode 100644 (file)
index 0000000..3d3ab53
--- /dev/null
@@ -0,0 +1,43 @@
+/**\r
+ * \r
+ */\r
+package jalview.ws.dbsources;\r
+\r
+import jalview.ws.seqfetcher.DbSourceProxy;\r
+\r
+/**\r
+ * flyweight class specifying retrieval of Full family alignments from PFAM\r
+ *\r
+ */\r
+public class PfamFull extends Pfam implements DbSourceProxy\r
+{\r
+  public PfamFull()\r
+  {\r
+    super();\r
+  }\r
+\r
+  /* (non-Javadoc)\r
+   * @see jalview.ws.dbsources.Pfam#getPFAMURL()\r
+   */\r
+  protected String getPFAMURL()\r
+  {\r
+    return "http://pfam.sanger.ac.uk/family/alignment/download/format?alnType=full&format=stockholm&order=t&case=l&gaps=default&entry=";\r
+  }\r
+\r
+  /* (non-Javadoc)\r
+   * @see jalview.ws.seqfetcher.DbSourceProxy#getDbName()\r
+   */\r
+  public String getDbName()\r
+  {\r
+    return "PFAM (Full)";\r
+  }\r
+  public String getDbSource()\r
+  {\r
+    return getDbName(); // so we have unique DbSource string.\r
+  }\r
+  public String getTestQuery()\r
+  {\r
+    return "PF00535"; // TODO: Pick a better full alignment to retrieve.\r
+  }\r
+\r
+}\r
diff --git a/src/jalview/ws/dbsources/PfamSeed.java b/src/jalview/ws/dbsources/PfamSeed.java
new file mode 100644 (file)
index 0000000..e0e2b4f
--- /dev/null
@@ -0,0 +1,44 @@
+/**\r
+ * \r
+ */\r
+package jalview.ws.dbsources;\r
+\r
+import jalview.ws.seqfetcher.DbSourceProxy;\r
+\r
+/**\r
+ * flyweight class specifying retrieval of Seed alignments from PFAM\r
+ * @author JimP\r
+ *\r
+ */\r
+public class PfamSeed extends Pfam implements DbSourceProxy\r
+{\r
+  public PfamSeed()\r
+  {\r
+    super();\r
+  }\r
+\r
+  /* (non-Javadoc)\r
+   * @see jalview.ws.dbsources.Pfam#getPFAMURL()\r
+   */\r
+  protected String getPFAMURL()\r
+  {\r
+    return "http://pfam.sanger.ac.uk/family/alignment/download/format?alnType=seed&format=stockholm&order=t&case=l&gaps=default&entry=";\r
+  }\r
+\r
+  /* (non-Javadoc)\r
+   * @see jalview.ws.seqfetcher.DbSourceProxy#getDbName()\r
+   */\r
+  public String getDbName()\r
+  {\r
+    return "PFAM (Seed)";\r
+  }\r
+  public String getDbSource()\r
+  {\r
+    return jalview.datamodel.DBRefSource.PFAM; // archetype source\r
+  }\r
+  public String getTestQuery()\r
+  {\r
+    return "PF00535";\r
+  }\r
+\r
+}\r
index c4f7e9a..0785ea2 100644 (file)
@@ -255,4 +255,24 @@ public class ASequenceFetcher
     }\r
   }\r
 \r
+  /**\r
+   * test if the database handler for dbName contains the given dbProperty\r
+   * @param dbName\r
+   * @param dbProperty\r
+   * @return true if proxy has the given property\r
+   */\r
+  public boolean hasDbSourceProperty(String dbName, String dbProperty)\r
+  {\r
+    // TODO: decide if invalidDbName exception is thrown here.\r
+    DbSourceProxy proxy = getSourceProxy(dbName);\r
+    if (proxy!=null)\r
+    {\r
+      if (proxy.getDbSourceProperties()!=null)\r
+      {\r
+        return proxy.getDbSourceProperties().containsKey(dbProperty);\r
+      }\r
+    }\r
+    return false;\r
+  }\r
+\r
 }
\ No newline at end of file