flag for dasCoordSysFound added
[jalview.git] / src / jalview / io / DasSequenceFeatureFetcher.java
index 305160e..33791ad 100755 (executable)
@@ -1,6 +1,6 @@
 /*\r
  * Jalview - A Sequence Alignment Editor and Viewer\r
- * Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
+ * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
  *\r
  * This program is free software; you can redistribute it and/or\r
  * modify it under the terms of the GNU General Public License\r
  */\r
 package jalview.io;\r
 \r
-import jalview.datamodel.*;\r
-\r
-import jalview.gui.*;\r
-\r
+import java.net.*;\r
 import java.util.*;\r
 \r
-import java.net.URL;\r
-\r
-import org.biojava.dasobert.das.FeatureThread;\r
-import org.biojava.dasobert.eventmodel.FeatureEvent;\r
-import org.biojava.dasobert.eventmodel.FeatureListener;\r
-import org.biojava.dasobert.dasregistry.DasSource;\r
-\r
-import org.biojava.dasobert.das2.io.DasSourceReaderImpl;\r
-import org.biojava.dasobert.dasregistry.Das1Source;\r
-import org.biojava.dasobert.dasregistry.DasSource;\r
-import org.biojava.dasobert.das2.Das2Source;\r
-import org.biojava.dasobert.das2.DasSourceConverter;\r
+import javax.swing.*;\r
 \r
+import org.biojava.dasobert.das.*;\r
+import org.biojava.dasobert.das2.*;\r
+import org.biojava.dasobert.das2.io.*;\r
+import org.biojava.dasobert.dasregistry.*;\r
+import org.biojava.dasobert.eventmodel.*;\r
 import jalview.bin.Cache;\r
-import org.biojava.dasobert.dasregistry.DasCoordinateSystem;\r
-\r
-import javax.swing.*;\r
+import jalview.datamodel.*;\r
+import jalview.gui.*;\r
 \r
 /**\r
  * DOCUMENT ME!\r
@@ -52,8 +42,10 @@ public class DasSequenceFeatureFetcher
 {\r
   SequenceI[] sequences;\r
   AlignFrame af;\r
+  FeatureSettings fsettings;\r
   StringBuffer sbuffer = new StringBuffer();\r
   Vector selectedSources;\r
+  boolean cancelled = false;\r
 \r
   long startTime;\r
 \r
@@ -65,12 +57,13 @@ public class DasSequenceFeatureFetcher
    * @param ap DOCUMENT ME!\r
    */\r
   public DasSequenceFeatureFetcher(SequenceI[] sequences,\r
-                                   final AlignFrame af,\r
+                                   FeatureSettings fsettings,\r
                                    Vector selectedSources)\r
   {\r
     this.selectedSources = selectedSources;\r
     this.sequences = sequences;\r
-    this.af = af;\r
+    this.af = fsettings.af;\r
+    this.fsettings = fsettings;\r
 \r
     int uniprotCount = 0;\r
     for (int i = 0; i < selectedSources.size(); i++)\r
@@ -121,10 +114,14 @@ public class DasSequenceFeatureFetcher
         thread.start();\r
       }\r
       else\r
+      {\r
         startFetching();\r
     }\r
+    }\r
     else\r
+    {\r
       startFetching();\r
+    }\r
 \r
     }\r
 \r
@@ -145,6 +142,7 @@ public class DasSequenceFeatureFetcher
     */\r
    void startFetching()\r
    {\r
+     cancelled = false;\r
      startTime = System.currentTimeMillis();\r
      af.setProgressBar("Fetching DAS Sequence Features", startTime);\r
 \r
@@ -180,7 +178,9 @@ public class DasSequenceFeatureFetcher
 \r
        sourcesRemaining = selectedSources.size();\r
        //Now sending requests one at a time to each server\r
-       for (int sourceIndex = 0; sourceIndex < selectedSources.size();\r
+       for (int sourceIndex = 0;\r
+            sourceIndex < selectedSources.size()\r
+            && !cancelled;\r
             sourceIndex++)\r
        {\r
          DasSource dasSource = (DasSource) selectedSources.elementAt(\r
@@ -190,12 +190,20 @@ public class DasSequenceFeatureFetcher
        }\r
    }\r
 \r
+   public void cancel()\r
+   {\r
+     af.setProgressBar("DAS Feature Fetching Cancelled", startTime);\r
+     cancelled = true;\r
+   }\r
+\r
    int sourcesRemaining=0;\r
    void responseComplete(DasSource dasSource, SequenceI seq)\r
    {\r
      if (seq != null)\r
      {\r
-       for (int seqIndex = 0; seqIndex < sequences.length-1; seqIndex++)\r
+       for (int seqIndex = 0;\r
+            seqIndex < sequences.length-1\r
+            && !cancelled; seqIndex++)\r
        {\r
          if (sequences[seqIndex] == seq)\r
          {\r
@@ -212,7 +220,11 @@ public class DasSequenceFeatureFetcher
        af.setProgressBar("DAS Feature Fetching Complete", startTime);\r
 \r
        if(af.featureSettings!=null)\r
+      {\r
          af.featureSettings.setTableData();\r
+      }\r
+\r
+       fsettings.complete();\r
      }\r
 \r
    }\r
@@ -225,12 +237,15 @@ public class DasSequenceFeatureFetcher
      int end = af.getViewport().getEndSeq();\r
      int index;\r
      for(index=start; index<end; index++)\r
-      if(seq == af.getViewport().getAlignment().getSequenceAt(index).getDatasetSequence())\r
        {\r
-         af.alignPanel.repaint();\r
+      if (seq ==\r
+          af.getViewport().getAlignment().getSequenceAt(index).getDatasetSequence())\r
+      {\r
+        af.alignPanel.paintAlignment(true);\r
          break;\r
        }\r
    }\r
+  }\r
 \r
 \r
   void nextSequence(DasSource dasSource, SequenceI seq)\r
@@ -239,36 +254,46 @@ public class DasSequenceFeatureFetcher
           new String[]\r
           {\r
         //  jalview.datamodel.DBRefSource.PDB,\r
-          jalview.datamodel.DBRefSource.UNIPROT\r
+          jalview.datamodel.DBRefSource.UNIPROT,\r
+        //  jalview.datamodel.DBRefSource.EMBL - not tested on any EMBL coord sys sources\r
       });\r
+// TODO: minimal list of DAS queries to make by querying with untyped ID if distinct from any typed IDs\r
+\r
+      boolean dasCoordSysFound = false;\r
 \r
-        if (uprefs != null)\r
+      if (uprefs != null)\r
         {\r
-          // we know the id for this entry, so don't note its ID in the unknownSequences list\r
-         // for (int j = 0; j < uprefs.length; j++)\r
+          // do any of these ids match the source's coordinate system ?\r
+          for (int j = 0; j < uprefs.length; j++)\r
           {\r
-\r
-            // Will have to pass any mapping information to the fetcher - the start/end for the DBRefEntry may not be the same as the sequence's start/end\r
             DasCoordinateSystem cs[] = dasSource.getCoordinateSystem();\r
-           // if(cs.length>0)\r
-             // System.out.println("err "+\r
-            for (int l = 0; l < cs.length; l++)\r
+\r
+            for(int csIndex=0; csIndex<cs.length; csIndex++)\r
             {\r
-              if (jalview.util.DBRefUtils.isDasCoordinateSystem(cs[l].\r
-                  getName(), uprefs[0]))\r
+              if (cs.length > 0 && jalview.util.DBRefUtils\r
+                  .isDasCoordinateSystem(cs[csIndex].getName(), uprefs[j]))\r
               {\r
-\r
                 Cache.log.debug("Launched fetcher for coordinate system " +\r
-                                   cs[l].getName());\r
+                                cs[0].getName());\r
+                //  Will have to pass any mapping information to the fetcher\r
+                //- the start/end for the DBRefEntry may not be the same as the sequence's start/end\r
 \r
+                System.out.println(seq.getName() + " " + (seq.getDatasetSequence() == null)\r
+                                   + " " + dasSource.getUrl());\r
+\r
+                dasCoordSysFound = false;\r
                 createFeatureFetcher(seq,\r
                                      dasSource,\r
-                                     uprefs[0].getAccessionId());\r
+                                     uprefs[j]);\r
+                break; // only do this for one reference - assume same source will send same features for all IDs\r
               }\r
+              else\r
+                System.out.println("IGNORE " + cs[csIndex].getName());\r
             }\r
           }\r
         }\r
-        else\r
+\r
+        if(!dasCoordSysFound)\r
         {\r
           String id = null;\r
           // try and use the name as the sequence id\r
@@ -293,12 +318,89 @@ public class DasSequenceFeatureFetcher
 \r
    }\r
 \r
-  /**\r
-   * fetch and add das features to a sequence using the given source URL and Id to create a feature request\r
-   * @param seq\r
-   * @param SourceUrl\r
-   * @param id\r
-   */\r
+\r
+/**\r
+ * fetch and add das features to a sequence using the given source URL and compatible DbRef id.\r
+ * new features are mapped using the DbRef mapping to the local coordinate system.\r
+ * @param seq\r
+ * @param SourceUrl\r
+ * @param dbref\r
+ */\r
+  protected void createFeatureFetcher(final SequenceI seq, final DasSource dasSource,\r
+        final DBRefEntry dbref) {\r
+\r
+    //////////////\r
+    /// fetch DAS features\r
+    final Das1Source source = new Das1Source();\r
+    source.setUrl(dasSource.getUrl());\r
+    source.setNickname(dasSource.getNickname());\r
+    if (dbref==null || dbref.getAccessionId()==null || dbref.getAccessionId().length()<1)\r
+    {\r
+      return;\r
+    }\r
+    Cache.log.debug("new Das Feature Fetcher for " + dbref.getSource()+":"+dbref.getAccessionId() + " querying " +\r
+                    dasSource.getUrl());\r
+    FeatureThread fetcher = new FeatureThread(dbref.getAccessionId()\r
+                                                //  +  ":" + start + "," + end,\r
+                                                , source);\r
+\r
+      fetcher.addFeatureListener(new FeatureListener()\r
+      {\r
+        public void comeBackLater(FeatureEvent e)\r
+        {\r
+          responseComplete(dasSource, seq);\r
+          Cache.log.debug("das source " + e.getDasSource().getNickname() +\r
+                          " asked us to come back in " + e.getComeBackLater() +\r
+                          " secs.");\r
+        }\r
+\r
+        public void newFeatures(FeatureEvent e)\r
+        {\r
+\r
+          Das1Source ds = e.getDasSource();\r
+\r
+          Map[] features = e.getFeatures();\r
+          // add features to sequence\r
+          Cache.log.debug("das source " + ds.getUrl() + " returned " +\r
+                          features.length + " features");\r
+\r
+          if (features.length > 0)\r
+          {\r
+            for (int i = 0; i < features.length; i++)\r
+            {\r
+              SequenceFeature f = newSequenceFeature(features[i],\r
+                  source.getNickname());\r
+              if (dbref.getMap()!=null && f.getBegin()>0 && f.getEnd()>0) {\r
+                Cache.log.debug("mapping from "+f.getBegin()+" - "+f.getEnd());\r
+                SequenceFeature vf[] = dbref.getMap().locateFeature(f);\r
+                if (vf!=null) {\r
+                  for (int v=0;v<vf.length;v++)\r
+                  {\r
+                    Cache.log.debug("mapping to "+v+": "+vf[v].getBegin()+" - "+vf[v].getEnd());\r
+                    seq.addSequenceFeature(vf[v]);\r
+                  }\r
+                }\r
+              } else {\r
+                seq.addSequenceFeature(f);\r
+              }\r
+            }\r
+\r
+            featuresAdded(seq);\r
+          }\r
+          else\r
+          {\r
+          //  System.out.println("No features found for " + seq.getName()\r
+          //                     + " from: " + e.getDasSource().getNickname());\r
+          }\r
+          responseComplete(dasSource, seq);\r
+\r
+        }\r
+      }\r
+\r
+      );\r
+\r
+      fetcher.start();\r
+    }\r
   protected void createFeatureFetcher(final SequenceI seq,\r
                                       final DasSource dasSource,\r
                                       String id)\r
@@ -387,7 +489,9 @@ public class DasSequenceFeatureFetcher
        */\r
       String desc = new String();\r
       if (dasfeature.containsKey("NOTE"))\r
+      {\r
         desc += (String) dasfeature.get("NOTE");\r
+      }\r
 \r
       int start = 0, end = 0;\r
       float score = 0f;\r
@@ -442,7 +546,7 @@ public class DasSequenceFeatureFetcher
     DasSourceReaderImpl reader = new DasSourceReaderImpl();\r
 \r
     String registryURL = jalview.bin.Cache.getDefault("DAS_REGISTRY_URL",\r
-        "http://das.sanger.ac.uk/registry/das1/sources/"\r
+        DasSourceBrowser.DEFAULT_REGISTRY\r
         );\r
 \r
     try\r