Merge branch 'alpha/JAL-3362_Jalview_212_alpha' into alpha/merge_212_JalviewJS_2112
[jalview.git] / src / jalview / io / StockholmFile.java
index 344c4e1..cbd9a38 100644 (file)
  */
 package jalview.io;
 
-import jalview.analysis.Rna;
-import jalview.datamodel.AlignmentAnnotation;
-import jalview.datamodel.AlignmentI;
-import jalview.datamodel.Annotation;
-import jalview.datamodel.DBRefEntry;
-import jalview.datamodel.DBRefSource;
-import jalview.datamodel.Mapping;
-import jalview.datamodel.Sequence;
-import jalview.datamodel.SequenceFeature;
-import jalview.datamodel.SequenceI;
-import jalview.schemes.ResidueProperties;
-import jalview.util.Comparison;
-import jalview.util.DBRefUtils;
-import jalview.util.Format;
-import jalview.util.MessageManager;
-
 import java.io.BufferedReader;
 import java.io.FileReader;
 import java.io.IOException;
@@ -55,6 +39,21 @@ import com.stevesoft.pat.Regex;
 import fr.orsay.lri.varna.exceptions.ExceptionUnmatchedClosingParentheses;
 import fr.orsay.lri.varna.factories.RNAFactory;
 import fr.orsay.lri.varna.models.rna.RNA;
+import jalview.analysis.Rna;
+import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.Annotation;
+import jalview.datamodel.DBRefEntry;
+import jalview.datamodel.DBRefSource;
+import jalview.datamodel.Mapping;
+import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceFeature;
+import jalview.datamodel.SequenceI;
+import jalview.schemes.ResidueProperties;
+import jalview.util.Comparison;
+import jalview.util.DBRefUtils;
+import jalview.util.Format;
+import jalview.util.MessageManager;
 
 // import org.apache.log4j.*;
 
@@ -80,16 +79,6 @@ public class StockholmFile extends AlignFile
 
   private static final char UNDERSCORE = '_';
   
-  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.
   public static final String RNASS_BRACKETS = "<>[](){}AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz";
 
@@ -246,8 +235,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();
@@ -268,7 +257,7 @@ public class StockholmFile extends AlignFile
         // End of the alignment, pass stuff back
         this.noSeqs = seqs.size();
 
-        String seqdb, dbsource = null;
+        String dbsource = null;
         Regex pf = new Regex("PF[0-9]{5}(.*)"); // Finds AC for Pfam
         Regex rf = new Regex("RF[0-9]{5}(.*)"); // Finds AC for Rfam
         if (getAlignmentProperty("AC") != null)
@@ -964,34 +953,37 @@ public class StockholmFile extends AlignFile
     int max = 0;
     int maxid = 0;
     int in = 0;
-    Hashtable dataRef = null;
+    int slen = s.length;
+    SequenceI seq;
+    Hashtable<String, String> dataRef = null;
     boolean isAA = s[in].isProtein();
-    while ((in < s.length) && (s[in] != null))
+    while ((in < slen) && ((seq = s[in]) != null))
     {
-
-      String tmp = printId(s[in], jvSuffix);
-      max = Math.max(max, s[in].getLength());
+      String tmp = printId(seq, jvSuffix);
+      max = Math.max(max, seq.getLength());
 
       if (tmp.length() > maxid)
       {
         maxid = tmp.length();
       }
-      if (s[in].getDBRefs() != null)
+      List<DBRefEntry> seqrefs = seq.getDBRefs();
+      int ndb;
+      if (seqrefs != null && (ndb = seqrefs.size()) > 0)
       {
         if (dataRef == null)
         {
-          dataRef = new Hashtable();
+          dataRef = new Hashtable<>();
         }
-        List<DBRefEntry> primrefs = s[in].getPrimaryDBRefs();
+        List<DBRefEntry> primrefs = seq.getPrimaryDBRefs();
         if (primrefs.size() >= 1)
         {
           dataRef.put(tmp, dbref_to_ac_record(primrefs.get(0)));
         }
         else
         {
-          for (int idb = 0; idb < s[in].getDBRefs().length; idb++)
+          for (int idb = 0; idb < seq.getDBRefs().size(); idb++)
           {
-            DBRefEntry dbref = s[in].getDBRefs()[idb];
+            DBRefEntry dbref = seq.getDBRefs().get(idb);
             dataRef.put(tmp, dbref_to_ac_record(dbref));
             // if we put in a uniprot or EMBL record then we're done:
             if (isAA && DBRefSource.UNIPROT
@@ -1030,11 +1022,11 @@ public class StockholmFile extends AlignFile
     // output database accessions
     if (dataRef != null)
     {
-      Enumeration en = dataRef.keys();
+      Enumeration<String> en = dataRef.keys();
       while (en.hasMoreElements())
       {
         Object idd = en.nextElement();
-        String type = (String) dataRef.remove(idd);
+        String type = dataRef.remove(idd);
         out.append(new Format("%-" + (maxid - 2) + "s")
                 .form("#=GS " + idd.toString() + " "));
         if (isAA && type.contains("UNIPROT")
@@ -1052,13 +1044,12 @@ public class StockholmFile extends AlignFile
     }
 
     // output annotations
-    while (i < s.length && s[i] != null)
+    while (i < slen && (seq = s[i]) != null)
     {
-      AlignmentAnnotation[] alAnot = s[i].getAnnotation();
+      AlignmentAnnotation[] alAnot = seq.getAnnotation();
       if (alAnot != null)
       {
         Annotation[] ann;
-
         for (int j = 0; j < alAnot.length; j++)
         {
           if (alAnot[j].annotations != null)
@@ -1074,7 +1065,6 @@ public class StockholmFile extends AlignFile
             }
             if (key == null)
             {
-
               continue;
             }
 
@@ -1082,37 +1072,38 @@ public class StockholmFile extends AlignFile
             out.append(new Format("%-" + maxid + "s").form(
                     "#=GR " + printId(s[i], jvSuffix) + " " + key + " "));
             ann = alAnot[j].annotations;
-            String seq = "";
+            String sseq = "";
             for (int k = 0; k < ann.length; k++)
             {
-              seq += outputCharacter(key, k, isrna, ann, s[i]);
+              sseq += outputCharacter(key, k, isrna, ann, s[i]);
             }
-            out.append(seq);
+            out.append(sseq);
             out.append(newline);
-          }
+         }
         }
 
       }
 
       out.append(new Format("%-" + maxid + "s")
-              .form(printId(s[i], jvSuffix) + " "));
-      out.append(s[i].getSequenceAsString());
+              .form(printId(seq, jvSuffix) + " "));
+      out.append(seq.getSequenceAsString());
       out.append(newline);
       i++;
     }
 
     // alignment annotation
     AlignmentAnnotation aa;
-    if (al.getAlignmentAnnotation() != null)
+    AlignmentAnnotation[] an = al.getAlignmentAnnotation();
+    if (an != null)
     {
-      for (int ia = 0; ia < al.getAlignmentAnnotation().length; ia++)
+      for (int ia = 0, na = an.length; ia < na; ia++)
       {
-        aa = al.getAlignmentAnnotation()[ia];
+        aa = an[ia];
         if (aa.autoCalculated || !aa.visible || aa.sequenceRef != null)
         {
           continue;
         }
-        String seq = "";
+        String sseq = "";
         String label;
         String key = "";
         if (aa.label.equals("seq"))
@@ -1140,11 +1131,11 @@ public class StockholmFile extends AlignFile
         out.append(
                 new Format("%-" + maxid + "s").form("#=GC " + label + " "));
         boolean isrna = aa.isValidStruc();
-        for (int j = 0; j < aa.annotations.length; j++)
+        for (int j = 0, nj = aa.annotations.length; j < nj; j++)
         {
-          seq += outputCharacter(key, j, isrna, aa.annotations, null);
+          sseq += outputCharacter(key, j, isrna, aa.annotations, null);
         }
-        out.append(seq);
+        out.append(sseq);
         out.append(newline);
       }
     }