JAL-629 Change names of Opt.ALLOWALL to Opt.ALLOWMULTIID and Opt.MULTI to Opt.MULTIVA...
[jalview.git] / src / jalview / io / StockholmFile.java
index c8c9c8a..d674485 100644 (file)
@@ -23,8 +23,6 @@
  */
 package jalview.io;
 
-import java.util.Locale;
-
 import java.io.BufferedReader;
 import java.io.FileReader;
 import java.io.IOException;
@@ -33,6 +31,7 @@ import java.util.Enumeration;
 import java.util.Hashtable;
 import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 import java.util.Vector;
 
@@ -57,8 +56,6 @@ import jalview.util.DBRefUtils;
 import jalview.util.Format;
 import jalview.util.MessageManager;
 
-// import org.apache.log4j.*;
-
 /**
  * This class is supposed to parse a Stockholm format file into Jalview There
  * are TODOs in this class: we do not know what the database source and version
@@ -79,20 +76,21 @@ public class StockholmFile extends AlignFile
 {
   private static final String ANNOTATION = "annotation";
 
-//  private static final Regex OPEN_PAREN = new Regex("(<|\\[)", "(");
-//
-//  private static final Regex CLOSE_PAREN = new Regex("(>|\\])", ")");
+  // private static final Regex OPEN_PAREN = new Regex("(<|\\[)", "(");
+  //
+  // private static final Regex CLOSE_PAREN = new Regex("(>|\\])", ")");
 
   public static final Regex DETECT_BRACKETS = new Regex(
           "(<|>|\\[|\\]|\\(|\\)|\\{|\\})");
 
-  // WUSS extended symbols. Avoid ambiguity with protein SS annotations by using NOT_RNASS first.
+  // WUSS extended symbols. Avoid ambiguity with protein SS annotations by using
+  // NOT_RNASS first.
   public static final String RNASS_BRACKETS = "<>[](){}AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz";
 
   // use the following regex to decide an annotations (whole) line is NOT an RNA
   // SS (it contains only E,H,e,h and other non-brace/non-alpha chars)
   private static final Regex NOT_RNASS = new Regex(
-          "^[^<>[\\](){}A-DF-Za-df-z]*$");
+          "^[^<>[\\](){}ADFJ-RUVWYZadfj-ruvwyz]*$");
 
   StringBuffer out; // output buffer
 
@@ -149,19 +147,19 @@ public class StockholmFile extends AlignFile
               + umcp.getMessage() + ")";
       throw new IOException(umcp);
     }
-    // DEBUG System.out.println("this is the secondary scructure:"
+    // DEBUG jalview.bin.Console.outPrintln("this is the secondary scructure:"
     // +result.size());
     SequenceI[] seqs = new SequenceI[result.size()];
     String id = null;
     for (int i = 0; i < result.size(); i++)
     {
-      // DEBUG System.err.println("Processing i'th sequence in Stockholm file")
+      // DEBUG jalview.bin.Console.errPrintln("Processing i'th sequence in Stockholm file")
       RNA current = result.get(i);
 
       String seq = current.getSeq();
       String rna = current.getStructDBN(true);
-      // DEBUG System.out.println(seq);
-      // DEBUG System.err.println(rna);
+      // DEBUG jalview.bin.Console.outPrintln(seq);
+      // DEBUG jalview.bin.Console.errPrintln(rna);
       int begin = 0;
       int end = seq.length() - 1;
       id = safeName(getDataName());
@@ -220,8 +218,9 @@ public class StockholmFile extends AlignFile
     r = new Regex("# STOCKHOLM ([\\d\\.]+)");
     if (!r.search(nextLine()))
     {
-      throw new IOException(MessageManager
-              .getString("exception.stockholm_invalid_format"));
+      throw new IOException(
+              MessageManager.getString("exception.stockholm_invalid_format")
+                      + " (" + r + ")");
     }
     else
     {
@@ -242,8 +241,8 @@ public class StockholmFile extends AlignFile
     Regex openparen = new Regex("(<|\\[)", "(");
     Regex closeparen = new Regex("(>|\\])", ")");
 
-//    // Detect if file is RNA by looking for bracket types
-//    Regex detectbrackets = new Regex("(<|>|\\[|\\]|\\(|\\))");
+    // // Detect if file is RNA by looking for bracket types
+    // Regex detectbrackets = new Regex("(<|>|\\[|\\]|\\(|\\))");
 
     rend.optimize();
     p.optimize();
@@ -339,7 +338,8 @@ public class StockholmFile extends AlignFile
             if (dbr != null)
             {
               // we could get very clever here - but for now - just try to
-              // guess accession type from type of sequence, source of alignment plus
+              // guess accession type from type of sequence, source of alignment
+              // plus
               // structure
               // of accession
               guessDatabaseFor(seqO, dbr, dbsource);
@@ -441,7 +441,7 @@ public class StockholmFile extends AlignFile
       }
       else if (!r.search(line))
       {
-        // System.err.println("Found sequence line: " + line);
+        // jalview.bin.Console.errPrintln("Found sequence line: " + line);
 
         // Split sequence in sequence and accession parts
         if (!x.search(line))
@@ -465,7 +465,7 @@ public class StockholmFile extends AlignFile
         String annType = r.stringMatched(1);
         String annContent = r.stringMatched(2);
 
-        // System.err.println("type:" + annType + " content: " + annContent);
+        // jalview.bin.Console.errPrintln("type:" + annType + " content: " + annContent);
 
         if (annType.equals("GF"))
         {
@@ -527,8 +527,10 @@ public class StockholmFile extends AlignFile
               treeName = an.stringMatched(2);
               treeString = new StringBuffer();
             }
-            // TODO: JAL-3532 - this is where GF comments and database references are lost
-            // suggest overriding this method for Stockholm files to catch and properly
+            // TODO: JAL-3532 - this is where GF comments and database
+            // references are lost
+            // suggest overriding this method for Stockholm files to catch and
+            // properly
             // process CC, DR etc into multivalued properties
             setAlignmentProperty(an.stringMatched(1), an.stringMatched(2));
           }
@@ -565,7 +567,7 @@ public class StockholmFile extends AlignFile
           else
           {
             // throw new IOException("Error parsing " + line);
-            System.err.println(">> missing annotation: " + line);
+            jalview.bin.Console.errPrintln(">> missing annotation: " + line);
           }
         }
         else if (annType.equals("GC"))
@@ -683,7 +685,7 @@ public class StockholmFile extends AlignFile
           // }
           else
           {
-            System.err.println(
+            jalview.bin.Console.errPrintln(
                     "Warning - couldn't parse sequence annotation row line:\n"
                             + line);
             // throw new IOException("Error parsing " + line);
@@ -760,7 +762,8 @@ public class StockholmFile extends AlignFile
     }
     if (dbsource == null)
     {
-      // make up an origin based on whether the sequence looks like it is nucleotide
+      // make up an origin based on whether the sequence looks like it is
+      // nucleotide
       // or protein
       dbsource = (seqO.isProtein()) ? "PFAM" : "RFAM";
     }
@@ -934,7 +937,7 @@ public class StockholmFile extends AlignFile
               annot.annotations.length);
       System.arraycopy(els, 0, anns, annot.annotations.length, els.length);
       annot.annotations = anns;
-      // System.out.println("else: ");
+      // jalview.bin.Console.outPrintln("else: ");
     }
     return annot;
   }
@@ -944,6 +947,7 @@ public class StockholmFile extends AlignFile
     return ref.getSource().toString() + " ; "
             + ref.getAccessionId().toString();
   }
+
   @Override
   public String print(SequenceI[] s, boolean jvSuffix)
   {
@@ -1045,9 +1049,18 @@ public class StockholmFile extends AlignFile
       }
     }
 
-    // output annotations
+    // output description and annotations
+
     while (i < slen && (seq = s[i]) != null)
     {
+      if (seq.getDescription() != null)
+      {
+        // out.append("#=GR ");
+        out.append(new Format("%-" + maxid + "s").form("#=GS "
+                + printId(seq, jvSuffix) + " DE " + seq.getDescription()));
+        out.append(newline);
+      }
+
       AlignmentAnnotation[] alAnot = seq.getAnnotation();
       if (alAnot != null)
       {
@@ -1257,7 +1270,7 @@ public class StockholmFile extends AlignFile
     {
       return (String) typeIds.get(id);
     }
-    System.err.println(
+    jalview.bin.Console.errPrintln(
             "Warning : Unknown Stockholm annotation type code " + id);
     return id;
   }
@@ -1279,7 +1292,7 @@ public class StockholmFile extends AlignFile
     {
       return key;
     }
-    System.err.println(
+    jalview.bin.Console.errPrintln(
             "Warning : Unknown Stockholm annotation type: " + type);
     return key;
   }