new DBRef management and generalised source and entry retrieval mechanism for referen...
[jalview.git] / src / jalview / io / DasSequenceFeatureFetcher.java
diff --git a/src/jalview/io/DasSequenceFeatureFetcher.java b/src/jalview/io/DasSequenceFeatureFetcher.java
deleted file mode 100755 (executable)
index 2f94d64..0000000
+++ /dev/null
@@ -1,606 +0,0 @@
-/*\r
- * Jalview - A Sequence Alignment Editor and Viewer\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
- * as published by the Free Software Foundation; either version 2\r
- * of the License, or (at your option) any later version.\r
- *\r
- * This program is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
- * GNU General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU General Public License\r
- * along with this program; if not, write to the Free Software\r
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
- */\r
-package jalview.io;\r
-\r
-import java.net.*;\r
-import java.util.*;\r
-\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 jalview.datamodel.*;\r
-import jalview.gui.*;\r
-\r
-/**\r
- * DOCUMENT ME!\r
- *\r
- * @author $author$\r
- * @version $Revision$\r
- */\r
-public class DasSequenceFeatureFetcher\r
-{\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
-  /**\r
-   * Creates a new SequenceFeatureFetcher object.\r
-   * Uses default\r
-   *\r
-   * @param align DOCUMENT ME!\r
-   * @param ap DOCUMENT ME!\r
-   */\r
-  public DasSequenceFeatureFetcher(SequenceI[] sequences,\r
-                                   FeatureSettings fsettings,\r
-                                   Vector selectedSources)\r
-  {\r
-    this.selectedSources = selectedSources;\r
-    this.sequences = sequences;\r
-    this.af = fsettings.af;\r
-    this.fsettings = fsettings;\r
-\r
-    int uniprotCount = 0;\r
-    for (int i = 0; i < selectedSources.size(); i++)\r
-    {\r
-      DasSource source = (DasSource) selectedSources.elementAt(i);\r
-      DasCoordinateSystem[] coords = source.getCoordinateSystem();\r
-      for (int c = 0; c < coords.length; c++)\r
-      {\r
-        if (coords[c].getName().indexOf("UniProt") > -1)\r
-        {\r
-          uniprotCount++;\r
-          break;\r
-        }\r
-      }\r
-    }\r
-\r
-    int refCount = 0;\r
-    for (int i = 0; i < sequences.length; i++)\r
-    {\r
-      DBRefEntry[] dbref = sequences[i].getDBRef();\r
-      if (dbref != null)\r
-      {\r
-        for (int j = 0; j < dbref.length; j++)\r
-        {\r
-          if (dbref[j].getSource()\r
-              .equals(jalview.datamodel.DBRefSource.UNIPROT))\r
-          {\r
-            refCount++;\r
-            break;\r
-          }\r
-        }\r
-      }\r
-    }\r
-\r
-    if (refCount < sequences.length && uniprotCount > 0)\r
-    {\r
-\r
-      int reply = JOptionPane.showInternalConfirmDialog(Desktop.desktop,\r
-          "Do you want Jalview to find\n"\r
-          + "Uniprot Accession ids for given sequence names?",\r
-          "Find Uniprot Accession Ids",\r
-          JOptionPane.YES_NO_OPTION,\r
-          JOptionPane.QUESTION_MESSAGE);\r
-\r
-      if (reply == JOptionPane.YES_OPTION)\r
-      {\r
-        Thread thread = new Thread(new FetchDBRefs());\r
-        thread.start();\r
-      }\r
-      else\r
-      {\r
-        startFetching();\r
-    }\r
-    }\r
-    else\r
-    {\r
-      startFetching();\r
-    }\r
-\r
-    }\r
-\r
-  class FetchDBRefs\r
-      implements Runnable\r
-  {\r
-    public void run()\r
-    {\r
-      new DBRefFetcher(sequences, af).fetchDBRefs(true);\r
-      startFetching();\r
-    }\r
-  }\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
-         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
-       cancelled = true;\r
-       fsettings.noDasSourceActive();\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
-         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
-      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
-  {\r
-    if (cancelled)\r
-      return;\r
-    DBRefEntry[] uprefs = jalview.util.DBRefUtils.selectRefs(seq.getDBRef(),\r
-          new String[]\r
-          {\r
-        //  jalview.datamodel.DBRefSource.PDB,\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
-        {\r
-          // do any of these ids match the source's coordinate system ?\r
-          for (int j = 0; !dasCoordSysFound && j < uprefs.length; j++)\r
-          {\r
-            DasCoordinateSystem cs[] = dasSource.getCoordinateSystem();\r
-\r
-            for(int csIndex=0; csIndex<cs.length && !dasCoordSysFound; csIndex++)\r
-            {\r
-              if (cs.length > 0 && jalview.util.DBRefUtils\r
-                  .isDasCoordinateSystem(cs[csIndex].getName(), uprefs[j]))\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 = true; // break's out of the loop\r
-                createFeatureFetcher(seq,\r
-                                     dasSource,\r
-                                     uprefs[j]);\r
-              }\r
-              else\r
-                System.out.println("IGNORE " + cs[csIndex].getName());\r
-            }\r
-          }\r
-        }\r
-\r
-        if(!dasCoordSysFound)\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
-      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[]=null;\r
-                \r
-                try {\r
-                  vf = dbref.getMap().locateFeature(f);\r
-                }\r
-                catch (Exception ex)\r
-                {\r
-                  Cache.log.info("Error in 'experimental' mapping of features. Please try to reproduce and then report info to help@jalview.org.");\r
-                  Cache.log.info("Mapping feature from "+f.getBegin()+" to "+f.getEnd()+" in dbref "+dbref.getAccessionId()+" in "+dbref.getSource());\r
-                  Cache.log.info("using das Source "+ds.getUrl());\r
-                  Cache.log.info(ex);\r
-                }\r
-                \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
-  {\r
-    //////////////\r
-    /// fetch DAS features\r
-    final Das1Source source = new Das1Source();\r
-    source.setUrl(dasSource.getUrl());\r
-    source.setNickname(dasSource.getNickname());\r
-\r
-    Cache.log.debug("new Das Feature Fetcher for " + id + " querying " +\r
-                    dasSource.getUrl());\r
-\r
-    if (id != null && id.length() > 0)\r
-    {\r
-      FeatureThread fetcher = new FeatureThread(id\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
-\r
-              seq.addSequenceFeature(f);\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
-  }\r
-\r
-  /**\r
-   * creates a jalview sequence feature from a das feature document\r
-   * @param dasfeature\r
-   * @return sequence feature object created using dasfeature information\r
-   */\r
-  SequenceFeature newSequenceFeature(Map dasfeature, String nickname)\r
-  {\r
-    if (dasfeature==null)\r
-    {\r
-      return null;\r
-    }\r
-    try\r
-    {\r
-      /**\r
-       * Different qNames for a DAS Feature - are string keys to the HashMaps in features\r
-       * "METHOD") ||\r
-                  qName.equals("TYPE") ||\r
-                  qName.equals("START") ||\r
-                  qName.equals("END") ||\r
-                  qName.equals("NOTE") ||\r
-                  qName.equals("LINK") ||\r
-                  qName.equals("SCORE")\r
-       */\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
-\r
-      try\r
-      {\r
-        start = Integer.parseInt(dasfeature.get("START").toString());\r
-      }\r
-      catch (Exception ex)\r
-      {}\r
-      try\r
-      {\r
-        end = Integer.parseInt(dasfeature.get("END").toString());\r
-      }\r
-      catch (Exception ex)\r
-      {}\r
-      try\r
-      {\r
-        score = Integer.parseInt(dasfeature.get("SCORE").toString());\r
-      }\r
-      catch (Exception ex)\r
-      {}\r
-\r
-      SequenceFeature f = new SequenceFeature(\r
-          (String) dasfeature.get("TYPE"),\r
-          desc,\r
-          start,\r
-          end,\r
-          score,\r
-          nickname);\r
-\r
-      if (dasfeature.containsKey("LINK"))\r
-      {\r
-        f.addLink(f.getType() + " " + f.begin + "_" + f.end\r
-                  + "|" + dasfeature.get("LINK"));\r
-      }\r
-\r
-      return f;\r
-    }\r
-    catch (Exception e)\r
-    {\r
-      System.out.println("ERRR " + e);\r
-      e.printStackTrace();\r
-      System.out.println("############");\r
-      Cache.log.debug("Failed to parse " + dasfeature.toString(), e);\r
-      return null;\r
-    }\r
-  }\r
-\r
-  public static DasSource[] getDASSources()\r
-  {\r
-    DasSourceReaderImpl reader = new DasSourceReaderImpl();\r
-\r
-    String registryURL = jalview.bin.Cache.getDefault("DAS_REGISTRY_URL",\r
-        DasSourceBrowser.DEFAULT_REGISTRY\r
-        );\r
-\r
-    try\r
-    {\r
-      URL url = new URL(registryURL);\r
-\r
-      DasSource[] sources = reader.readDasSource(url);\r
-\r
-      List das1sources = new ArrayList();\r
-      for (int i = 0; i < sources.length; i++)\r
-      {\r
-        DasSource ds = sources[i];\r
-        if (ds instanceof Das2Source)\r
-        {\r
-          Das2Source d2s = (Das2Source) ds;\r
-          if (d2s.hasDas1Capabilities())\r
-          {\r
-            Das1Source d1s = DasSourceConverter.toDas1Source(d2s);\r
-            das1sources.add(d1s);\r
-          }\r
-\r
-        }\r
-        else if (ds instanceof Das1Source)\r
-        {\r
-          das1sources.add( (Das1Source) ds);\r
-        }\r
-      }\r
-\r
-      return (Das1Source[]) das1sources.toArray(new Das1Source[das1sources.size()]);\r
-    }\r
-    catch (Exception ex)\r
-    {\r
-      ex.printStackTrace();\r
-      return null;\r
-    }\r
-  }\r
-\r
-}\r
-\r