warning for unresolvable database source strings (or ones which apparently have no...
[jalview.git] / src / jalview / ws / DBRefFetcher.java
index 1fd9f1c..581901a 100644 (file)
@@ -74,6 +74,8 @@ public class DBRefFetcher implements Runnable
 \r
   SequenceFetcher sfetcher;\r
 \r
+  private SequenceI[] alseqs;\r
+\r
   public DBRefFetcher()\r
   {\r
   }\r
@@ -106,9 +108,11 @@ public class DBRefFetcher implements Runnable
   public DBRefFetcher(SequenceI[] seqs, AlignFrame af, String[] sources)\r
   {\r
     this.af = af;\r
+    alseqs = new SequenceI[seqs.length];\r
     SequenceI[] ds = new SequenceI[seqs.length];\r
     for (int i = 0; i < seqs.length; i++)\r
     {\r
+      alseqs[i] = seqs[i];\r
       if (seqs[i].getDatasetSequence() != null)\r
         ds[i] = seqs[i].getDatasetSequence();\r
       else\r
@@ -496,27 +500,31 @@ public class DBRefFetcher implements Runnable
       DBRefEntry[] entryRefs = jalview.util.DBRefUtils.selectRefs(entry\r
               .getDBRef(), new String[]\r
       { dbSource });\r
+      if (entryRefs==null) {\r
+        System.err.println("Dud dbSource string ? no entryrefs selected for "+dbSource+ " on "+entry.getName());\r
+        continue;\r
+      }\r
       for (int j = 0; j < entryRefs.length; j++)\r
-      {\r
-        String accessionId = entryRefs[j].getAccessionId(); // .getAccession().elementAt(j).toString();\r
-        // match up on accessionId\r
-        if (seqRefs.containsKey(accessionId.toUpperCase()))\r
         {\r
-          Vector seqs = (Vector) seqRefs.get(accessionId);\r
-          for (int jj = 0; jj < seqs.size(); jj++)\r
+          String accessionId = entryRefs[j].getAccessionId(); // .getAccession().elementAt(j).toString();\r
+          // match up on accessionId\r
+          if (seqRefs.containsKey(accessionId.toUpperCase()))\r
           {\r
-            sequence = (SequenceI) seqs.elementAt(jj);\r
-            if (!sequenceMatches.contains(sequence))\r
+            Vector seqs = (Vector) seqRefs.get(accessionId);\r
+            for (int jj = 0; jj < seqs.size(); jj++)\r
             {\r
-              sequenceMatches.addElement(sequence);\r
+              sequence = (SequenceI) seqs.elementAt(jj);\r
+              if (!sequenceMatches.contains(sequence))\r
+              {\r
+                sequenceMatches.addElement(sequence);\r
+              }\r
             }\r
           }\r
         }\r
-      }\r
-      if (sequenceMatches.size() == 0)\r
-      {\r
-        // failed to match directly on accessionId==query so just compare all\r
-        // sequences to entry\r
+        if (sequenceMatches.size() == 0)\r
+        {\r
+          // failed to match directly on accessionId==query so just compare all\r
+          // sequences to entry\r
         Enumeration e = seqRefs.keys();\r
         while (e.hasMoreElements())\r
         {\r
@@ -608,8 +616,9 @@ public class DBRefFetcher implements Runnable
           // absStart+sequence.getStart()+entrySeq.length()-1},\r
           // new int[] { entry.getStart(), entry.getEnd() }, 1, 1);\r
           // relocate local features for updated start\r
-          if (updateRefFrame && sequence.getSequenceFeatures() != null)\r
-          {\r
+          if (updateRefFrame) {\r
+            if (sequence.getSequenceFeatures() != null)\r
+            {\r
             SequenceFeature[] sf = sequence.getSequenceFeatures();\r
             int start = sequence.getStart();\r
             int end = sequence.getEnd();\r
@@ -624,6 +633,7 @@ public class DBRefFetcher implements Runnable
                 sf[sfi].setEnd(sf[sfi].getEnd() + startShift);\r
               }\r
             }\r
+            }\r
           }\r
         }\r
 \r
@@ -638,6 +648,22 @@ public class DBRefFetcher implements Runnable
           // finally, update local sequence reference frame if we're allowed\r
           sequence.setStart(absStart);\r
           sequence.setEnd(absEnd);\r
+          // search for alignment sequences to update coordinate frame for\r
+          for (int alsq = 0; alsq<alseqs.length; alsq++)\r
+          {\r
+            if (alseqs[alsq].getDatasetSequence()==sequence)\r
+            {\r
+              String ngAlsq = AlignSeq.extractGaps("-. ",\r
+                      alseqs[alsq].getSequenceAsString()).toUpperCase();\r
+              int oldstrt = alseqs[alsq].getStart();\r
+              alseqs[alsq].setStart(sequence.getSequenceAsString().toUpperCase().indexOf(ngAlsq)+sequence.getStart());\r
+              if (oldstrt != alseqs[alsq].getStart()) {\r
+                alseqs[alsq].setEnd(ngAlsq.length()+alseqs[alsq].getStart()-1);\r
+              }\r
+            }\r
+          }\r
+          // TODO:  search for all other references to this dataset sequence, and update start/end\r
+          // TODO: update all AlCodonMappings which involve this alignment sequence (e.g. Q30167 cdna translation from exon2 product (vamsas demo)\r
         }\r
         // and remove it from the rest\r
         // TODO: decide if we should remove annotated sequence from set\r