Jalview features format adds links as hrefs
[jalview.git] / src / jalview / io / DBRefFetcher.java
index c11910b..23e5bf6 100644 (file)
@@ -48,6 +48,7 @@ public class DBRefFetcher implements Runnable
   CutAndPasteTransfer output = new CutAndPasteTransfer();\r
   StringBuffer sbuffer = new StringBuffer();\r
   boolean uniprotFlag = false;\r
+  boolean running = false;\r
 \r
   public DBRefFetcher()\r
   {}\r
@@ -91,9 +92,25 @@ public class DBRefFetcher implements Runnable
     unknownSequences = new ArrayList();\r
     this.align = align;\r
     this.dataset = align.getDataset();\r
+  }\r
 \r
+  public boolean fetchDBRefs(boolean waitTillFinished)\r
+  {\r
     Thread thread = new Thread(this);\r
     thread.start();\r
+    running = true;\r
+\r
+    if(waitTillFinished)\r
+    {\r
+      while(running)\r
+      {\r
+        try{\r
+          Thread.sleep(500);\r
+        }catch(Exception ex){}\r
+      }\r
+    }\r
+\r
+    return true;\r
   }\r
 \r
   /**\r
@@ -103,6 +120,7 @@ public class DBRefFetcher implements Runnable
   {\r
     long startTime = System.currentTimeMillis();\r
     af.setProgressBar("Fetching db refs", startTime);\r
+    running = true;\r
 \r
     try\r
     {\r
@@ -117,13 +135,13 @@ public class DBRefFetcher implements Runnable
              seqIndex++, i++)\r
         {\r
           Sequence sequence = (Sequence) sequences.get(seqIndex);\r
-          Vector uprefs = jalview.util.DBRefUtils.selectRefs(sequence.getDBRef(), new String[] {\r
+          DBRefEntry [] uprefs = jalview.util.DBRefUtils.selectRefs(sequence.getDBRef(), new String[] {\r
               jalview.datamodel.DBRefSource.UNIPROT});\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,k=uprefs.size(); j<k; j++)\r
-              ids.add(((DBRefEntry) uprefs.get(j)).getAccessionId());\r
+            for (int j=0,k=uprefs.length; j<k; j++)\r
+              ids.add(uprefs[j].getAccessionId());\r
             unknownSequences.add(sequence);\r
           } else {\r
             if (!ids.contains(sequence.getName()))\r
@@ -187,6 +205,8 @@ public class DBRefFetcher implements Runnable
     af.setProgressBar("DBRef search completed", startTime);\r
    // promptBeforeBlast();\r
 \r
+   running = false;\r
+\r
   }\r
 \r
 \r
@@ -224,7 +244,7 @@ public class DBRefFetcher implements Runnable
     if(!file.exists())\r
       return;\r
 \r
-    SequenceI sequence = null;\r
+    SequenceI [] sequence = null;\r
 \r
     Vector entries = getUniprotEntries(file);\r
 \r
@@ -234,43 +254,45 @@ public class DBRefFetcher implements Runnable
     {\r
       entry = (UniprotEntry) entries.elementAt(i);\r
       String idmatch = entry.getAccession().elementAt(0).toString();\r
-      sequence = dataset.findName(idmatch);\r
+      sequence = dataset.findSequenceMatch(idmatch);\r
 \r
-      if (sequence == null)\r
+      if (sequence.length==0)\r
       {\r
         //Sequence maybe Name, not Accession\r
         idmatch = entry.getName().elementAt(0).toString();\r
-        sequence = dataset.findName(idmatch);\r
+        sequence = dataset.findSequenceMatch(idmatch);\r
       }\r
 \r
-      if(sequence!=null)\r
-        ids.remove(sequence.getName());\r
+      if(sequence.length>0)\r
+        ids.remove(sequence[0].getName());\r
 \r
-      else  if (sequence == null && uniprotFlag)\r
+      else  if (sequence.length==0 && uniprotFlag)\r
       {\r
           StringBuffer upid = new StringBuffer("UniProt/Swiss-Prot|");\r
           for(int u=0; u<entry.getAccession().size(); u++)\r
             upid.append(entry.getAccession().elementAt(u)+"|");\r
 \r
-          sequence = dataset.findName(upid+idmatch);\r
+          sequence = dataset.findSequenceMatch(upid+idmatch);\r
           ids.remove(idmatch);\r
       }\r
 \r
-      if(sequence ==null)\r
+      if(sequence.length==0)\r
       {\r
         System.out.println(idmatch+" not found");\r
         continue;\r
       }\r
 \r
+      for(int m=0; m<sequence.length; m++)\r
+      {\r
 \r
-      sequence.addDBRef(new DBRefEntry(DBRefSource.UNIPROT,\r
-                                       "1.0",\r
+      sequence[m].addDBRef(new DBRefEntry(DBRefSource.UNIPROT,\r
+                                       "0",\r
                                        entry.getAccession().elementAt(0).toString()));\r
 \r
-      System.out.println("Adding dbref to "+sequence.getName()+" : "+\r
+      System.out.println("Adding dbref to "+sequence[m].getName()+" : "+\r
                          entry.getAccession().elementAt(0).toString());\r
 \r
-      String nonGapped = AlignSeq.extractGaps("-. ", sequence.getSequence());\r
+      String nonGapped = AlignSeq.extractGaps("-. ", sequence[m].getSequence());\r
 \r
       int absStart = entry.getUniprotSequence().getContent().indexOf(\r
           nonGapped.toString());\r
@@ -281,28 +303,26 @@ public class DBRefFetcher implements Runnable
         absStart = nonGapped.toString().indexOf(entry.getUniprotSequence().getContent());\r
         if(absStart == -1)\r
         {\r
-          sbuffer.append(sequence.getName() +\r
+          sbuffer.append(sequence[m].getName() +\r
                          " SEQUENCE NOT %100 MATCH \n");\r
 \r
           continue;\r
         }\r
-        else\r
-        {\r
 \r
-          if(entry.getFeature()!=null)\r
+        if (entry.getFeature() != null)\r
+        {\r
+          Enumeration e = entry.getFeature().elements();\r
+          while (e.hasMoreElements())\r
           {\r
-            Enumeration e = entry.getFeature().elements();\r
-            while (e.hasMoreElements())\r
-            {\r
-              SequenceFeature sf = (SequenceFeature) e.nextElement();\r
-              sf.setBegin(sf.getBegin() + absStart + 1);\r
-              sf.setEnd(sf.getEnd() + absStart + 1);\r
-            }\r
+            SequenceFeature sf = (SequenceFeature) e.nextElement();\r
+            sf.setBegin(sf.getBegin() + absStart + 1);\r
+            sf.setEnd(sf.getEnd() + absStart + 1);\r
           }\r
 \r
-          sbuffer.append(sequence.getName() +\r
-                         " HAS "+absStart+" PREFIXED RESIDUES COMPARED TO UNIPROT - ANY SEQUENCE FEATURES"\r
-                        +" HAVE BEEN ADJUSTED ACCORDINGLY \n");\r
+          sbuffer.append(sequence[m].getName() +\r
+                         " HAS " + absStart +\r
+              " PREFIXED RESIDUES COMPARED TO UNIPROT - ANY SEQUENCE FEATURES"\r
+                         + " HAVE BEEN ADJUSTED ACCORDINGLY \n");\r
           absStart = 0;\r
         }\r
 \r
@@ -318,57 +338,22 @@ public class DBRefFetcher implements Runnable
       while(e.hasMoreElements())\r
       {\r
         PDBEntry pdb = (PDBEntry)e.nextElement();\r
-        if(!pdb.getType().equals("PDB"))\r
+        if(!pdb.getType().equals(DBRefSource.PDB))\r
           continue;\r
 \r
+        sequence[m].addDBRef(new DBRefEntry(DBRefSource.PDB,\r
+                                       "0",\r
+                                       pdb.getId()));\r
+\r
         onlyPdbEntries.addElement(pdb);\r
       }\r
 \r
-      sequence.setPDBId(onlyPdbEntries);\r
+      sequence[m].setPDBId(onlyPdbEntries);\r
 \r
-      if (entry.getFeature()!=null) {\r
-        //e = entry.getFeature().elements();\r
-      //  while (e.hasMoreElements())\r
-        {\r
-        //  SequenceFeature sf = (SequenceFeature) e.nextElement();\r
-         // sf.setFeatureGroup("Uniprot");\r
-        //  sequence.addSequenceFeature( sf );\r
-        }\r
-      }\r
-      sequence.setStart(absStart);\r
-      sequence.setEnd(absEnd);\r
+      sequence[m].setStart(absStart);\r
+      sequence[m].setEnd(absEnd);\r
 \r
 \r
-      int n = 0;\r
-      SequenceI seq2;\r
-      while (n < align.getHeight())\r
-      {\r
-        //This loop enables multiple sequences with the same\r
-        //id to have features added and seq limits updated\r
-        seq2 = align.getSequenceAt(n);\r
-        if (seq2.getName().equals(idmatch))\r
-        {\r
-          nonGapped = AlignSeq.extractGaps("-. ", seq2.getSequence());\r
-\r
-          absStart = sequence.getSequence().indexOf(nonGapped);\r
-          absEnd = absStart + nonGapped.toString().length() - 1;\r
-\r
-          // This is the Viewd alignment sequences\r
-          // No need to tell the user of the dataset updates\r
-          if ( (seq2.getStart() != absStart+sequence.getStart())\r
-             || (seq2.getEnd() != absEnd+sequence.getStart()))\r
-          {\r
-            sbuffer.append("Updated: " + seq2.getName() + " " +\r
-                           seq2.getStart() + "/" + seq2.getEnd() +\r
-                           "  to  " + (absStart + sequence.getStart()) + "/" +\r
-                           (absEnd + sequence.getStart()) + "\n");\r
-\r
-            seq2.setStart(absStart + sequence.getStart());\r
-            seq2.setEnd(absEnd + sequence.getStart());\r
-          }\r
-        }\r
-\r
-        n++;\r
       }\r
     }\r
   }\r