flag for dasCoordSysFound added
[jalview.git] / src / jalview / io / DasSequenceFeatureFetcher.java
index f6e6f9b..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
@@ -124,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
@@ -226,7 +220,9 @@ 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
@@ -241,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
@@ -255,37 +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
-            // 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
             DasCoordinateSystem cs[] = dasSource.getCoordinateSystem();\r
-            if(cs.length>0)\r
+\r
+            for(int csIndex=0; csIndex<cs.length; csIndex++)\r
             {\r
-             // for (int l = 0; l < cs.length; l++)\r
+              if (cs.length > 0 && jalview.util.DBRefUtils\r
+                  .isDasCoordinateSystem(cs[csIndex].getName(), uprefs[j]))\r
               {\r
-               //\r
-               if (jalview.util.DBRefUtils\r
-                    .isDasCoordinateSystem(cs[0].getName(), uprefs[0]))\r
-                {\r
-                  Cache.log.debug("Launched fetcher for coordinate system " +\r
-                                  cs[0].getName());\r
-\r
-                  createFeatureFetcher(seq,\r
-                                       dasSource,\r
-                                       uprefs[0].getAccessionId());\r
-                }\r
+                Cache.log.debug("Launched fetcher for coordinate system " +\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[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
@@ -310,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
@@ -404,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