JAL-2137 basic implementation of STRUCTMODEL annotation file statement
authorJim Procter <jprocter@issues.jalview.org>
Thu, 30 Jun 2016 14:20:35 +0000 (15:20 +0100)
committerJim Procter <jprocter@issues.jalview.org>
Thu, 30 Jun 2016 14:20:35 +0000 (15:20 +0100)
src/jalview/io/AnnotationFile.java

index 54e96f3..d8f9f15 100755 (executable)
@@ -28,6 +28,8 @@ import jalview.datamodel.Annotation;
 import jalview.datamodel.ColumnSelection;
 import jalview.datamodel.GraphLine;
 import jalview.datamodel.HiddenSequences;
+import jalview.datamodel.PDBEntry;
+import jalview.datamodel.PDBEntry.Type;
 import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
 import jalview.schemes.ColourSchemeI;
@@ -37,6 +39,7 @@ import jalview.schemes.UserColourScheme;
 
 import java.io.BufferedReader;
 import java.io.FileReader;
+import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.StringReader;
 import java.net.URL;
@@ -1001,7 +1004,8 @@ public class AnnotationFile
               String urlToModel = st.nextToken();
               String urlToPairwise = st.hasMoreTokens() ? st.nextToken()
                       : "";
-              if (add_structmodel(refSeq, tempId, urlToModel, urlToPairwise))
+              if (add_structmodel(al, refSeq, tempId, urlToModel,
+                      urlToPairwise))
               {
                 failedtoadd = false;
               }
@@ -1226,18 +1230,79 @@ public class AnnotationFile
    * @param urlToPairwise
    * @return true if model and sequence was added
    */
-  private boolean add_structmodel(SequenceI refSeq2, String tempId,
+  private boolean add_structmodel(AlignmentI al, SequenceI refSeq2, String tempId,
           String urlToModel, String urlToPairwise)
   {
-
-    return false;
-  }
-
-  private void add_structmodel(StringTokenizer st)
-  {
-
-    // TODO Auto-generated method stub
-
+    String warningMessage=null;
+    boolean added = false;
+    try {
+      // locate tempId. if it exists, will need to merge, otherwise:
+      SequenceI templateSeq = al.findName(tempId);
+      // 1. load urlToModel
+      // TODO: get base for current import operation and resolve against it
+      // transfer to local temp file ?
+      PDBEntry modelpe = new PDBEntry(tempId,null,Type.FILE,urlToModel);
+      PDBEntry templpe = new PDBEntry(tempId, null, Type.FILE, urlToModel);
+      refSeq2.addPDBId(modelpe);
+      
+      // 2. load urlToPairwise
+      AlignmentI pwa = new AppletFormatAdapter().readFile(urlToPairwise,
+              AppletFormatAdapter.checkProtocol(urlToPairwise), "FASTA");
+      SequenceI qPw = null, tPw = null;
+      if (pwa != null)
+      {
+        // resolve query/template sequences in provided alignment
+        qPw = pwa.findName(refSeqId);
+        tPw = pwa.findName(tempId);
+      }
+      if (false)
+      // (qPw != null && tPw != null)
+      {
+        // not yet complete
+        // refalQ vvva--addrvvvtttddd
+        // refalT ---aaaa---sss---ddd
+        // profalQ ---v-v-v-a.-.-a---dd--r--vvvtt--td--dd
+        // profalT ---.-.-.-aa-a-a---..--.--sss..--.d--dd
+        // Pragmatic solution here:
+        // Map templpe onto refalT only where refalT and refalQ are both
+        // non-gaps
+
+        // columns for start..end in refSeq2
+        int[] gapMap = refSeq2.gapMap();
+        // insert gaps in tPw
+        int curi = 0, width = refSeq2.getLength();
+        // TBC
+      }
+      else
+      {
+        // assume 1:1 - so synthesise sequences to use to construct mapping ?
+        refSeq2.getDatasetSequence().addPDBId(modelpe);
+        if (templateSeq == null && tPw != null)
+        {
+          tPw.createDatasetSequence();
+          tPw.getDatasetSequence().addPDBId(templpe); // needs to set mapping based on model yet...
+          al.addSequence(tPw);
+          added = true;
+        }
+      }
+    // 3. pad/insert gaps in urlToPairwise according to gaps already present in
+    // refSeq2
+    // 4. add padded tempId sequence to alignment
+    // 4. associate urlToModel with refSeq2 based on position map provided by
+    // urlToPairwise
+    // 5. associate urlToModel with tempId based on position map provided by
+    // urlToPairwise
+    // start a thread to load urlToModel and process/annotate sequences.
+    } catch (IOException x)
+    {
+      warningMessage = x.toString();
+    } finally {
+      if (warningMessage !=null)
+      {
+        System.err.println("Warnings whilst processing STRUCTMODEL: "+warningMessage);
+      }
+      return added;
+    }
   }
 
   private void parseHideCols(ColumnSelection colSel, String nextToken)