JAL-1569 consistent handling of sequence and alignment associated annotation export...
authorJim Procter <jprocter@dundee.ac.uk>
Sun, 23 Nov 2014 16:33:59 +0000 (16:33 +0000)
committerJim Procter <jprocter@dundee.ac.uk>
Sun, 23 Nov 2014 16:33:59 +0000 (16:33 +0000)
src/jalview/io/StockholmFile.java

index 85f9455..96c462c 100644 (file)
@@ -826,25 +826,29 @@ public class StockholmFile extends AlignFile
       // be written out
       if (ss)
       {
-        if (detectbrackets.search(pos))
+        //if (" .-_".indexOf(pos) == -1)
         {
-          ann.secondaryStructure = jalview.schemes.ResidueProperties
-                  .getRNASecStrucState(pos).charAt(0);
-        }
-        else
-        {
-          ann.secondaryStructure = jalview.schemes.ResidueProperties
-                  .getDssp3state(pos).charAt(0);
-        }
+          if (detectbrackets.search(pos))
+          {
+            ann.secondaryStructure = jalview.schemes.ResidueProperties
+                    .getRNASecStrucState(pos).charAt(0);
+          }
+          else
+          {
+            ann.secondaryStructure = jalview.schemes.ResidueProperties
+                    .getDssp3state(pos).charAt(0);
+          }
 
-        if (ann.secondaryStructure == pos.charAt(0) || pos.charAt(0) == 'C')
-        {
-          ann.displayCharacter = ""; // null; // " ";
-        }
-        else
-        {
-          ann.displayCharacter = " " + ann.displayCharacter;
+          if (ann.secondaryStructure == pos.charAt(0))
+          {
+            ann.displayCharacter = ""; // null; // " ";
+          }
+          else
+          {
+            ann.displayCharacter = " " + ann.displayCharacter;
+          }
         }
+        
       }
 
       els[i] = ann;
@@ -985,33 +989,11 @@ public class StockholmFile extends AlignFile
             out.append(new Format("%-" + maxid + "s").form("#=GR "
                     + printId(s[i]) + " " + key + " "));
             ann = alAnot[j].annotations;
+            boolean isrna = alAnot[j].isValidStruc();
             String seq = "";
             for (int k = 0; k < ann.length; k++)
             {
-              annot = ann[k];
-              String ch = (annot == null) ? Character.toString(s[i]
-                      .getCharAt(k)) : annot.displayCharacter;
-              if (ch.length() == 0)
-              {
-                if (key.equals("SS"))
-                {
-                  char ll = annot.secondaryStructure;
-                  seq = (Character.toString(ll).equals(" ")) ? seq + "C"
-                          : seq + ll;
-                }
-                else
-                {
-                  seq += ".";
-                }
-              }
-              else if (ch.length() == 1)
-              {
-                seq += ch;
-              }
-              else if (ch.length() > 1)
-              {
-                seq += ch.charAt(1);
-              }
+              seq += outputCharacter(key, k, isrna, ann, s[i]);
             }
             out.append(seq);
             out.append(newline);
@@ -1032,20 +1014,20 @@ public class StockholmFile extends AlignFile
       for (int ia = 0; ia < al.getAlignmentAnnotation().length; ia++)
       {
         aa = al.getAlignmentAnnotation()[ia];
-        if (aa.autoCalculated || !aa.visible)
+        if (aa.autoCalculated || !aa.visible || aa.sequenceRef != null)
         {
           continue;
         }
         String seq = "";
         String label;
-
+        String key = "";
         if (aa.label.equals("seq"))
         {
           label = "seq_cons";
         }
         else
         {
-          label = type2id(aa.label.toLowerCase()) + "_cons";
+          label = (key = type2id(aa.label.toLowerCase())) + "_cons";
         }
 
         if (label == null)
@@ -1058,28 +1040,7 @@ public class StockholmFile extends AlignFile
         boolean isrna = aa.isValidStruc();
         for (int j = 0; j < aa.annotations.length; j++)
         {
-          String ch = (aa.annotations[j] == null) ? "-"
-                  : aa.annotations[j].displayCharacter;
-          if (ch.length() == 0 || isrna)
-          {
-            char ll = aa.annotations[j].secondaryStructure;
-            if (Character.toString(ll).equals(" "))
-            {
-              seq += "C";
-            }
-            else
-            {
-              seq += ll;
-            }
-          }
-          else if (ch.length() == 1)
-          {
-            seq += ch;
-          }
-          else if (ch.length() > 1)
-          {
-            seq += ch.charAt(1);
-          }
+          seq += outputCharacter(key, j, isrna, aa.annotations, null);
         }
         out.append(seq);
         out.append(newline);
@@ -1088,6 +1049,57 @@ public class StockholmFile extends AlignFile
     return out.toString();
   }
 
+  /**
+   * add an annotation character to the output row
+   * 
+   * @param seq
+   * @param key
+   * @param k
+   * @param isrna
+   * @param ann
+   * @param sequenceI
+   */
+  private char outputCharacter(String key, int k,
+          boolean isrna, Annotation[] ann, SequenceI sequenceI)
+  {
+    char seq = ' ';
+    Annotation annot = ann[k];
+    String ch = (annot == null) ? ((sequenceI == null) ? "-" : Character
+            .toString(sequenceI.getCharAt(k)))
+            : annot.displayCharacter;
+    if (key.equals("SS"))
+    {
+      if (annot == null)
+      {
+        // sensible gap character if one is available or make one up
+        return sequenceI == null ? '-' : sequenceI
+                .getCharAt(k);
+      }
+      else
+      {
+        // valid secondary structure AND no alternative label (e.g. ' B')
+        if (annot.secondaryStructure > ' ' && ch.length() < 2)
+        {
+          return annot.secondaryStructure;
+        }
+      }
+    }
+
+    if (ch.length() == 0)
+    {
+      seq = '.';
+    }
+    else if (ch.length() == 1)
+    {
+      seq = ch.charAt(0);
+    }
+    else if (ch.length() > 1)
+    {
+      seq = ch.charAt(1);
+    }
+    return seq;
+  }
+
   public String print()
   {
     out = new StringBuffer();