Merge branch 'Jalview-JS/develop' into merge_js_develop
[jalview.git] / src / jalview / io / StockholmFile.java
index 3d07e5a..50112c8 100644 (file)
@@ -79,8 +79,9 @@ public class StockholmFile extends AlignFile
 {
   private static final String ANNOTATION = "annotation";
 
-  // WUSS extended symbols. Avoid ambiguity with protein SS annotations by using
-  // NOT_RNASS first.
+  private static final char UNDERSCORE = '_';
+  
+  // WUSS extended symbols. Avoid ambiguity with protein SS annotations by using NOT_RNASS first.
 
   public static final String RNASS_BRACKETS = "<>[](){}AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz";
 
@@ -118,7 +119,7 @@ public class StockholmFile extends AlignFile
 
   /**
    * Centralize all actual Regex instantialization in Platform.
-   * 
+   * // JBPNote: Why is this 'centralisation' better ?
    * @param id
    * @return
    */
@@ -181,14 +182,14 @@ public class StockholmFile extends AlignFile
 
   StringBuffer out; // output buffer
 
-  AlignmentI al;
+  private AlignmentI al;
 
   public StockholmFile()
   {
   }
 
   /**
-   * Creates a new StockholmFile object for output.
+   * Creates a new StockholmFile object for output
    */
   public StockholmFile(AlignmentI al)
   {
@@ -726,14 +727,15 @@ public class StockholmFile extends AlignFile
             if (features.containsKey(this.id2type(type)))
             {
               // logger.debug("Found content for " + this.id2type(type));
-              content = (Hashtable) features.get(this.id2type(type));
+              content = (Hashtable) features
+                      .get(this.id2type(type));
             }
             else
             {
               // logger.debug("Creating new content holder for " +
               // this.id2type(type));
               content = new Hashtable();
-              features.put(this.id2type(type), content);
+              features.put(id2type(type), content);
             }
             String ns = (String) content.get(ANNOTATION);
 
@@ -914,10 +916,9 @@ public class StockholmFile extends AlignFile
           Vector<AlignmentAnnotation> annotation, String label,
           String annots)
   {
-    String convert1, convert2 = null;
-
-    // convert1 = OPEN_PAREN.replaceAll(annots);
-    // convert2 = CLOSE_PAREN.replaceAll(convert1);
+         String convert1, convert2 = null;
+    // String convert1 = OPEN_PAREN.replaceAll(annots);
+    // String convert2 = CLOSE_PAREN.replaceAll(convert1);
     // annots = convert2;
 
     String type = label;
@@ -931,6 +932,7 @@ public class StockholmFile extends AlignFile
     type = id2type(type);
 
     boolean isrnass = false;
+
     if (type.equalsIgnoreCase("secondary structure"))
     {
       ss = true;
@@ -948,6 +950,10 @@ public class StockholmFile extends AlignFile
     for (int i = 0; i < annots.length(); i++)
     {
       String pos = annots.substring(i, i + 1);
+      if (UNDERSCORE == pos.charAt(0))
+      {
+        pos = " ";
+      }
       Annotation ann;
       ann = new Annotation(pos, "", ' ', 0f); // 0f is 'valid' null - will not
       // be written out
@@ -1137,36 +1143,38 @@ public class StockholmFile extends AlignFile
       if (alAnot != null)
       {
         Annotation[] ann;
-        for (int j = 0, nj = alAnot.length; j < nj; j++)
+        for (int j = 0; j < alAnot.length; j++)
         {
-
-          String key = type2id(alAnot[j].label);
-          boolean isrna = alAnot[j].isValidStruc();
-
-          if (isrna)
-          {
-            // hardwire to secondary structure if there is RNA secondary
-            // structure on the annotation
-            key = "SS";
-          }
-          if (key == null)
+          if (alAnot[j].annotations != null)
           {
+            String key = type2id(alAnot[j].label);
+            boolean isrna = alAnot[j].isValidStruc();
 
-            continue;
-          }
+            if (isrna)
+            {
+              // hardwire to secondary structure if there is RNA secondary
+              // structure on the annotation
+              key = "SS";
+            }
+            if (key == null)
+            {
+              continue;
+            }
 
-          // out.append("#=GR ");
-          out.append(new Format("%-" + maxid + "s").form(
-                  "#=GR " + printId(seq, jvSuffix) + " " + key + " "));
-          ann = alAnot[j].annotations;
-          String sseq = "";
-          for (int k = 0, nk = ann.length; k < nk; k++)
-          {
-            sseq += outputCharacter(key, k, isrna, ann, seq);
-          }
-          out.append(sseq);
-          out.append(newline);
+            // out.append("#=GR ");
+            out.append(new Format("%-" + maxid + "s").form(
+                    "#=GR " + printId(s[i], jvSuffix) + " " + key + " "));
+            ann = alAnot[j].annotations;
+            String sseq = "";
+            for (int k = 0; k < ann.length; k++)
+            {
+              sseq += outputCharacter(key, k, isrna, ann, s[i]);
+            }
+            out.append(sseq);
+            out.append(newline);
+         }
         }
+
       }
 
       out.append(new Format("%-" + maxid + "s")
@@ -1231,6 +1239,7 @@ public class StockholmFile extends AlignFile
     return out.toString();
   }
 
+
   /**
    * add an annotation character to the output row
    * 
@@ -1298,6 +1307,26 @@ public class StockholmFile extends AlignFile
             : seq;
   }
 
+  /**
+   * make a friendly ID string.
+   * 
+   * @param dataName
+   * @return truncated dataName to after last '/'
+   */
+  private String safeName(String dataName)
+  {
+    int b = 0;
+    while ((b = dataName.indexOf("/")) > -1 && b < dataName.length())
+    {
+      dataName = dataName.substring(b + 1).trim();
+
+    }
+    int e = (dataName.length() - dataName.indexOf(".")) + 1;
+    dataName = dataName.substring(1, e).trim();
+    return dataName;
+  }
+  
+  
   public String print()
   {
     out = new StringBuffer();
@@ -1335,7 +1364,7 @@ public class StockholmFile extends AlignFile
 
     }
   }
-
+  
   protected static String id2type(String id)
   {
     if (typeIds.containsKey(id))
@@ -1368,23 +1397,4 @@ public class StockholmFile extends AlignFile
             "Warning : Unknown Stockholm annotation type: " + type);
     return key;
   }
-
-  /**
-   * make a friendly ID string.
-   * 
-   * @param dataName
-   * @return truncated dataName to after last '/'
-   */
-  private String safeName(String dataName)
-  {
-    int b = 0;
-    while ((b = dataName.indexOf("/")) > -1 && b < dataName.length())
-    {
-      dataName = dataName.substring(b + 1).trim();
-
-    }
-    int e = (dataName.length() - dataName.indexOf(".")) + 1;
-    dataName = dataName.substring(1, e).trim();
-    return dataName;
-  }
 }