JAL-2136 JAL-2137 Added improvement to enable explicit and dynamic definition of...
[jalview.git] / src / jalview / io / AnnotationFile.java
index b72184b..8e1730a 100755 (executable)
@@ -56,6 +56,28 @@ import java.util.Vector;
 
 public class AnnotationFile
 {
+  StringBuffer text;
+
+  SequenceI refSeq = null;
+
+  String refSeqId = null;
+
+  String[] StructModelHeader = null;
+
+  long nlinesread = 0;
+
+  String lastread = "";
+
+  /**
+   * used for resolving absolute references to resources relative to
+   * annotationFile location
+   */
+  String baseUri = "";
+
+  private static String GRAPHLINE = "GRAPHLINE", COMBINE = "COMBINE",
+          STRUCTMODEL = "STRUCTMODEL",
+          HEADER_STRUCT_MODEL = "HEADER_STRUCT_MODEL";
+
   public AnnotationFile()
   {
     init();
@@ -82,7 +104,6 @@ public class AnnotationFile
     return newline;
   }
 
-  StringBuffer text;
 
   private void init()
   {
@@ -661,9 +682,6 @@ public class AnnotationFile
     }
   }
 
-  SequenceI refSeq = null;
-
-  String refSeqId = null;
 
   public boolean annotateAlignmentView(AlignViewportI viewport,
           String file, DataSourceType protocol)
@@ -757,18 +775,6 @@ public class AnnotationFile
     return false;
   }
 
-  long nlinesread = 0;
-
-  String lastread = "";
-
-  /**
-   * used for resolving absolute references to resources relative to
-   * annotationFile location
-   */
-  String baseUri = "";
-
-  private static String GRAPHLINE = "GRAPHLINE", COMBINE = "COMBINE",
-          STRUCTMODEL = "STRUCTMODEL";
 
   public boolean parseAnnotationFrom(AlignmentI al, ColumnSelection colSel,
           BufferedReader in) throws Exception
@@ -962,12 +968,6 @@ public class AnnotationFile
           modified = true;
           continue;
         }
-        // else if (token.equalsIgnoreCase("VIEW_DEF"))
-        // {
-        // addOrSetView(al,st);
-        // modified = true;
-        // continue;
-        // }
         else if (token.equalsIgnoreCase("VIEW_SETREF"))
         {
           if (refSeq != null)
@@ -1014,13 +1014,21 @@ public class AnnotationFile
           modified = true;
           continue;
         }
+        else if (token.equalsIgnoreCase(HEADER_STRUCT_MODEL))
+        {
+          int hSize = st.countTokens();
+          StructModelHeader = new String[hSize];
+          for (int x = 0; x < hSize; x++)
+          {
+            StructModelHeader[x] = st.nextToken();
+          }
+          continue;
+        }
         else if (token.equalsIgnoreCase(STRUCTMODEL))
         {
           boolean failedtoadd = true;
-          // expect
-          // STRUCTMODEL <Query> <TemplateSeqId> <ModelFile> <FastaMappingFile>
-          // <Confidence> <%.I.D>
-          // <MatchStart> <MatchEnd> <Coverage> [<Other Information>]
+          // expects STRUCTMODEL <Query> <TemplateSeqId> <ModelFile>
+          // <FastaMappingFile>
           String querySeqId = !st.hasMoreTokens() ? "" : st.nextToken();
           SequenceI querySeq = al.findName(querySeqId);
           if (st.hasMoreTokens()) {
@@ -1033,19 +1041,16 @@ public class AnnotationFile
             }
             else
             {
-              String tempId = st.nextToken();
-              String fastaMapping = st.nextToken();
-              String confidence = !st.hasMoreTokens() ? "" : 100
-                      * Double.valueOf(st.nextToken()) + "";
-              String pid = !st.hasMoreTokens() ? "" : st.nextToken();
-              String alignRange = !st.hasMoreTokens() ? "" : st.nextToken()
-                      + "-" + st.nextToken();
-              String otherInfo = !st.hasMoreTokens() ? "" : st.nextToken();
-              String coverage = "";
-              if (add_structmodel(al, querySeq, refSeq, tempId,
-                      fastaMapping,
-                      alignRange, coverage,
-                      confidence, pid, otherInfo))
+              int tSize = st.countTokens() + 2;
+              String[] rowData = new String[tSize];
+              rowData[0] = querySeqId;
+              rowData[1] = refSeqId;
+              for (int x = 2; x < tSize; x++)
+              {
+                rowData[x] = st.nextToken();
+              }
+              if (processStructModel(al, querySeq, refSeq,
+                      StructModelHeader, rowData, baseUri))
               {
                 failedtoadd = false;
               }
@@ -1054,9 +1059,8 @@ public class AnnotationFile
           if (failedtoadd)
           {
             System.err
-                    .println("Need <Query> <TemplateSeqId> <ModelFile> <FastaMappingFile> <Confidence> <%.I.D> <MatchStart> <MatchEnd> <Coverage> [<Other Information>] as tab separated fields after"
-                            + STRUCTMODEL
-                            + ".\nNote: other information could be provided in html format ");
+                    .println("Need minimum of <Query> <TemplateSeqId> <ModelFile> <FastaMappingFile> as tab separated fields after"
+                            + STRUCTMODEL);
           } else {
             modified = true;
           }
@@ -1262,33 +1266,36 @@ public class AnnotationFile
   }
 
   /**
-   * resolve a structural model and generate and add an alignment sequence for
-   * it
+   * Resolve structural model to a reference sequence and register it to
+   * StructureSelectionManager
    * 
-   * @param refSeq2
-   * @param tempId
-   * @param urlToModel
-   * @param urlToPairwise
+   * @param al
+   * @param querySequence
+   * @param templateSeq
+   * @param structModelHeader
+   * @param structModelData
    * @return true if model and sequence was added
    */
-  private boolean add_structmodel(AlignmentI al, SequenceI querySequence,
+  static boolean processStructModel(AlignmentI al, SequenceI querySequence,
           SequenceI templateSeq,
-          String modelFile, String fastaFile, String aRange,
-          String coverage, String confidence,
-          String pid, String otherInfo)
+ String[] structModelHeader,
+          String[] structModelData, String baseUri)
   {
     String warningMessage = null;
     boolean added = false;
     try {
-      String structureModelFile = resolveAbsolute(modelFile);
-      String fastaMappingFile = resolveAbsolute(fastaFile.replaceAll(
-              ".fasta.jal", ".fasta"));
+      String structureModelFile = resolveAbsolutePath(structModelData[2],
+              baseUri);
+      String fastaMappingFile = resolveAbsolutePath(structModelData[3],
+              baseUri);
       // System.out.println("Model File >> " + structureModelFile);
       // System.out.println("Fasta File >> " + fastaMappingFile);
-      PDBEntry phyre2PDBEntry = new PDBEntry(modelFile, null, Type.FILE,
+      String modelName = StructureFile.safeName(structureModelFile);
+      PDBEntry phyre2PDBEntry = new PDBEntry(modelName, " ",
+              Type.PDB,
               structureModelFile);
-      String phyre2ModelDesc = generatePhyre2InfoHTMLTable(aRange,
-              coverage, confidence, pid, otherInfo);
+      String phyre2ModelDesc = generatePhyre2InfoHTMLTable(
+              structModelHeader, structModelData);
       phyre2PDBEntry.setProperty("PHYRE2_MODEL_INFO", phyre2ModelDesc);
       templateSeq.getDatasetSequence().addPDBId(phyre2PDBEntry);
       if (querySequence != null)
@@ -1312,50 +1319,47 @@ public class AnnotationFile
     return added;
   }
 
-  private String generatePhyre2InfoHTMLTable(String aRange,
-          String coverage, String confidence, String pid, String otherInfo)
+  static String generatePhyre2InfoHTMLTable(String[] structModelHeader,
+          String[] structModelData)
   {
     StringBuilder phyre2InfoBuilder = new StringBuilder();
-    phyre2InfoBuilder.append("<html><table border=\"1\" width=100%>");
-    phyre2InfoBuilder
-            .append("<tr><td colspan=\"2\"><strong>Phyre2 Template Info</strong></td></tr>");
-    if (aRange != null && !aRange.isEmpty())
-    {
-      phyre2InfoBuilder.append("<tr><td>").append("Aligned range")
-              .append("</td><td>").append(aRange).append("</td></tr>");
-    }
-    if (coverage != null && !coverage.isEmpty())
+    if (isGenerateStructInfoHtml(structModelHeader, structModelData))
     {
-      phyre2InfoBuilder.append("<tr><td>").append("Coverage")
-              .append("</td><td>").append(coverage).append("</td></tr>");
-    }
-    if (confidence != null && !confidence.isEmpty())
-    {
-      phyre2InfoBuilder.append("<tr><td>").append("Confidence")
-              .append("</td><td>").append(confidence).append("</td></tr>");
+      phyre2InfoBuilder.append("<html><table border=\"1\" width=100%>")
+              .append("<tr><td colspan=\"2\"><strong>Phyre2 Template Info</strong></td></tr>");
+      for (int x = 4; x < structModelData.length; x++)
+      {
+        phyre2InfoBuilder.append("<tr><td>").append(structModelHeader[x])
+                .append("</td><td>").append(structModelData[x])
+                .append("</td></tr>");
+      }
+      phyre2InfoBuilder.append("</table></html>");
     }
-    if (pid != null && !pid.isEmpty())
+    return phyre2InfoBuilder.toString();
+  }
+
+  static boolean isGenerateStructInfoHtml(String[] header, String[] data)
+  {
+    boolean generate = true;
+    if (header == null || data == null)
     {
-      phyre2InfoBuilder.append("<tr><td>").append("%.i.d")
-              .append("</td><td>").append(pid).append("</td></tr>");
+      return false;
     }
-    if (otherInfo != null && !otherInfo.isEmpty())
+    if (header.length < 3 || data.length < 3)
     {
-      phyre2InfoBuilder.append("<tr><td>").append("Other information")
-              .append("</td><td>").append(otherInfo).append("</td></tr>");
+      generate = false;
     }
-    phyre2InfoBuilder.append("</table></html>");
-    return phyre2InfoBuilder.toString();
+    return generate;
   }
 
-  private String resolveAbsolute(String relURI)
+  static String resolveAbsolutePath(String relURI, String _baseUri)
   {
     if (relURI.indexOf(":/") > -1 || relURI.startsWith("/")
-            || "".equals(baseUri) || relURI.startsWith(baseUri))
+            || "".equals(_baseUri) || relURI.startsWith(_baseUri))
     {
       return relURI;
     }
-    return baseUri + relURI;
+    return _baseUri + relURI;
   }
 
   private void parseHideCols(ColumnSelection colSel, String nextToken)