DAS features mapped to local reference frame
authorjprocter <Jim Procter>
Mon, 19 Mar 2007 15:48:12 +0000 (15:48 +0000)
committerjprocter <Jim Procter>
Mon, 19 Mar 2007 15:48:12 +0000 (15:48 +0000)
src/jalview/io/DasSequenceFeatureFetcher.java

index ca11852..a4dc777 100755 (executable)
@@ -116,14 +116,14 @@ public class DasSequenceFeatureFetcher
       else\r
       {\r
         startFetching();\r
-      }\r
+    }\r
     }\r
     else\r
     {\r
       startFetching();\r
     }\r
 \r
-  }\r
+    }\r
 \r
   class FetchDBRefs\r
       implements Runnable\r
@@ -136,183 +136,258 @@ public class DasSequenceFeatureFetcher
     }\r
   }\r
 \r
-  /**\r
-   * Spawns a number of dasobert Fetcher threads to add features to sequences in the dataset\r
-   */\r
-  void startFetching()\r
-  {\r
-    cancelled = false;\r
-    startTime = System.currentTimeMillis();\r
-    af.setProgressBar("Fetching DAS Sequence Features", startTime);\r
 \r
-    DasSource[] sources = new jalview.gui.DasSourceBrowser().getDASSource();\r
-\r
-    if (selectedSources == null || selectedSources.size() == 0)\r
-    {\r
-      String active = jalview.bin.Cache.getDefault("DAS_ACTIVE_SOURCE",\r
-          "uniprot");\r
-      StringTokenizer st = new StringTokenizer(active, "\t");\r
-      Vector selectedSources = new Vector();\r
-      String token;\r
-      while (st.hasMoreTokens())\r
+   /**\r
+    * Spawns a number of dasobert Fetcher threads to add features to sequences in the dataset\r
+    */\r
+   void startFetching()\r
+   {\r
+     cancelled = false;\r
+     startTime = System.currentTimeMillis();\r
+     af.setProgressBar("Fetching DAS Sequence Features", startTime);\r
+\r
+     DasSource[] sources = new jalview.gui.DasSourceBrowser().getDASSource();\r
+\r
+     if (selectedSources == null || selectedSources.size() == 0)\r
+     {\r
+       String active = jalview.bin.Cache.getDefault("DAS_ACTIVE_SOURCE",\r
+           "uniprot");\r
+       StringTokenizer st = new StringTokenizer(active, "\t");\r
+       Vector selectedSources = new Vector();\r
+       String token;\r
+       while (st.hasMoreTokens())\r
+       {\r
+         token = st.nextToken();\r
+         for (int i = 0; i < sources.length; i++)\r
+         {\r
+           if (sources[i].getNickname().equals(token))\r
+           {\r
+             selectedSources.addElement(sources[i]);\r
+             break;\r
+           }\r
+         }\r
+       }\r
+     }\r
+\r
+     if (selectedSources == null || selectedSources.size() == 0)\r
+     {\r
+       System.out.println("No DAS Sources active");\r
+       af.setProgressBar("No DAS Sources Active", startTime);\r
+       return;\r
+     }\r
+\r
+       sourcesRemaining = selectedSources.size();\r
+       //Now sending requests one at a time to each server\r
+       for (int sourceIndex = 0;\r
+            sourceIndex < selectedSources.size()\r
+            && !cancelled;\r
+            sourceIndex++)\r
+       {\r
+         DasSource dasSource = (DasSource) selectedSources.elementAt(\r
+             sourceIndex);\r
+\r
+         nextSequence(dasSource, sequences[0]);\r
+       }\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;\r
+            seqIndex < sequences.length-1\r
+            && !cancelled; seqIndex++)\r
+       {\r
+         if (sequences[seqIndex] == seq)\r
+         {\r
+           nextSequence(dasSource, sequences[++seqIndex]);\r
+           return;\r
+         }\r
+       }\r
+     }\r
+\r
+     sourcesRemaining --;\r
+\r
+     if(sourcesRemaining==0)\r
+     {\r
+       af.setProgressBar("DAS Feature Fetching Complete", startTime);\r
+\r
+       if(af.featureSettings!=null)\r
       {\r
-        token = st.nextToken();\r
-        for (int i = 0; i < sources.length; i++)\r
-        {\r
-          if (sources[i].getNickname().equals(token))\r
-          {\r
-            selectedSources.addElement(sources[i]);\r
-            break;\r
-          }\r
-        }\r
+         af.featureSettings.setTableData();\r
       }\r
-    }\r
 \r
-    if (selectedSources == null || selectedSources.size() == 0)\r
-    {\r
-      System.out.println("No DAS Sources active");\r
-      af.setProgressBar("No DAS Sources Active", startTime);\r
-      return;\r
-    }\r
-\r
-    sourcesRemaining = selectedSources.size();\r
-    //Now sending requests one at a time to each server\r
-    for (int sourceIndex = 0;\r
-         sourceIndex < selectedSources.size()\r
-         && !cancelled;\r
-         sourceIndex++)\r
-    {\r
-      DasSource dasSource = (DasSource) selectedSources.elementAt(\r
-          sourceIndex);\r
-\r
-      nextSequence(dasSource, sequences[0]);\r
-    }\r
-  }\r
-\r
-  public void cancel()\r
-  {\r
-    af.setProgressBar("DAS Feature Fetching Cancelled", startTime);\r
-    cancelled = true;\r
-  }\r
+       fsettings.complete();\r
+     }\r
 \r
-  int sourcesRemaining = 0;\r
-  void responseComplete(DasSource dasSource, SequenceI seq)\r
-  {\r
-    if (seq != null)\r
-    {\r
-      for (int seqIndex = 0;\r
-           seqIndex < sequences.length - 1\r
-           && !cancelled; seqIndex++)\r
-      {\r
-        if (sequences[seqIndex] == seq)\r
-        {\r
-          nextSequence(dasSource, sequences[++seqIndex]);\r
-          return;\r
-        }\r
-      }\r
-    }\r
+   }\r
 \r
-    sourcesRemaining--;\r
+   void featuresAdded(SequenceI seq)\r
+   {\r
+     af.getFeatureRenderer().featuresAdded();\r
 \r
-    if (sourcesRemaining == 0)\r
-    {\r
-      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
-\r
-  void featuresAdded(SequenceI seq)\r
-  {\r
-    af.getFeatureRenderer().featuresAdded();\r
-\r
-    int start = af.getViewport().getStartSeq();\r
-    int end = af.getViewport().getEndSeq();\r
-    int index;\r
-    for (index = start; index < end; index++)\r
-    {\r
+     int start = af.getViewport().getStartSeq();\r
+     int end = af.getViewport().getEndSeq();\r
+     int index;\r
+     for(index=start; index<end; index++)\r
+       {\r
       if (seq ==\r
           af.getViewport().getAlignment().getSequenceAt(index).getDatasetSequence())\r
       {\r
         af.alignPanel.paintAlignment(true);\r
-        break;\r
-      }\r
-    }\r
+         break;\r
+       }\r
+   }\r
   }\r
 \r
+\r
   void nextSequence(DasSource dasSource, SequenceI seq)\r
   {\r
-    DBRefEntry[] uprefs = jalview.util.DBRefUtils.selectRefs(seq.getDBRef(),\r
-        new String[]\r
-        {\r
+      DBRefEntry[] uprefs = jalview.util.DBRefUtils.selectRefs(seq.getDBRef(),\r
+          new String[]\r
+          {\r
         //  jalview.datamodel.DBRefSource.PDB,\r
-        jalview.datamodel.DBRefSource.UNIPROT\r
-    });\r
-\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
-      {\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
+          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
+        if (uprefs != null)\r
         {\r
-          // for (int l = 0; l < cs.length; l++)\r
+          // do any of these ids match the source's coordinate system ?\r
+          for (int j = 0; j < uprefs.length; j++)\r
           {\r
-            //\r
-            if (jalview.util.DBRefUtils\r
-                .isDasCoordinateSystem(cs[0].getName(), uprefs[0]))\r
+            DasCoordinateSystem cs[] = dasSource.getCoordinateSystem();\r
+            \r
+            if(cs.length>0  && jalview.util.DBRefUtils\r
+                    .isDasCoordinateSystem(cs[0].getName(), uprefs[j]))\r
             {\r
               Cache.log.debug("Launched fetcher for coordinate system " +\r
-                              cs[0].getName());\r
-\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
               createFeatureFetcher(seq,\r
-                                   dasSource,\r
-                                   uprefs[0].getAccessionId());\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
           }\r
         }\r
-      }\r
-    }\r
-    else\r
+        else\r
+        {\r
+          String id = null;\r
+          // try and use the name as the sequence id\r
+          if (seq.getName().indexOf("|") > -1)\r
+          {\r
+            id = seq.getName().substring(\r
+                seq.getName().lastIndexOf("|") + 1);\r
+          }\r
+          else\r
+          {\r
+            id = seq.getName();\r
+          }\r
+          if (id != null)\r
+          {\r
+            // Should try to call a general feature fetcher that\r
+            // queries many sources with name to discover applicable ID references\r
+            createFeatureFetcher(seq,\r
+                                 dasSource,\r
+                                 id);\r
+          }\r
+        }\r
+\r
+   }\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
-      String id = null;\r
-      // try and use the name as the sequence id\r
-      if (seq.getName().indexOf("|") > -1)\r
-      {\r
-        id = seq.getName().substring(\r
-            seq.getName().lastIndexOf("|") + 1);\r
-      }\r
-      else\r
-      {\r
-        id = seq.getName();\r
-      }\r
-      if (id != null)\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
-        // Should try to call a general feature fetcher that\r
-        // queries many sources with name to discover applicable ID references\r
-        createFeatureFetcher(seq,\r
-                             dasSource,\r
-                             id);\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
+      );\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
+      fetcher.start();\r
+    }\r
   protected void createFeatureFetcher(final SequenceI seq,\r
                                       final DasSource dasSource,\r
                                       String id)\r
@@ -366,8 +441,8 @@ public class DasSequenceFeatureFetcher
           }\r
           else\r
           {\r
-            //  System.out.println("No features found for " + seq.getName()\r
-            //                     + " from: " + e.getDasSource().getNickname());\r
+          //  System.out.println("No features found for " + seq.getName()\r
+          //                     + " from: " + e.getDasSource().getNickname());\r
           }\r
           responseComplete(dasSource, seq);\r
 \r
@@ -497,3 +572,4 @@ public class DasSequenceFeatureFetcher
   }\r
 \r
 }\r
+\r