JAL-3061
authorBen Soares <b.soares@dundee.ac.uk>
Fri, 3 Aug 2018 16:00:50 +0000 (17:00 +0100)
committerBen Soares <b.soares@dundee.ac.uk>
Fri, 3 Aug 2018 16:00:50 +0000 (17:00 +0100)
Added test StockholmFileTest.stockholmFileRnaSSSpaceChars() to read in
RNA SS annotation with spaces, and check that StockholmFile print output
converts these to '.'s.
Also slight adjustment to StockholmFile.outputCharacter to avoid a
nullPointer exception.

src/jalview/io/StockholmFile.java
test/jalview/io/StockholmFileTest.java

index 606540f..0e73af1 100644 (file)
@@ -205,7 +205,7 @@ public class StockholmFile extends AlignFile
     String version;
     // String id;
     Hashtable seqAnn = new Hashtable(); // Sequence related annotations
     String version;
     // String id;
     Hashtable seqAnn = new Hashtable(); // Sequence related annotations
-    LinkedHashMap<String, String> seqs = new LinkedHashMap<String, String>();
+    LinkedHashMap<String, String> seqs = new LinkedHashMap<>();
     Regex p, r, rend, s, x;
     // Temporary line for processing RNA annotation
     // String RNAannot = "";
     Regex p, r, rend, s, x;
     // Temporary line for processing RNA annotation
     // String RNAannot = "";
@@ -666,7 +666,7 @@ public class StockholmFile extends AlignFile
               strucAnn = new Hashtable();
             }
 
               strucAnn = new Hashtable();
             }
 
-            Vector<AlignmentAnnotation> newStruc = new Vector<AlignmentAnnotation>();
+            Vector<AlignmentAnnotation> newStruc = new Vector<>();
             parseAnnotationRow(newStruc, type, ns);
             for (AlignmentAnnotation alan : newStruc)
             {
             parseAnnotationRow(newStruc, type, ns);
             for (AlignmentAnnotation alan : newStruc)
             {
@@ -718,7 +718,7 @@ public class StockholmFile extends AlignFile
   private void guessDatabaseFor(Sequence seqO, String dbr, String dbsource)
   {
     DBRefEntry dbrf = null;
   private void guessDatabaseFor(Sequence seqO, String dbr, String dbsource)
   {
     DBRefEntry dbrf = null;
-    List<DBRefEntry> dbrs = new ArrayList<DBRefEntry>();
+    List<DBRefEntry> dbrs = new ArrayList<>();
     String seqdb = "Unknown", sdbac = "" + dbr;
     int st = -1, en = -1, p;
     if ((st = sdbac.indexOf("/")) > -1)
     String seqdb = "Unknown", sdbac = "" + dbr;
     int st = -1, en = -1, p;
     if ((st = sdbac.indexOf("/")) > -1)
@@ -1127,7 +1127,13 @@ public class StockholmFile extends AlignFile
     String ch = (annot == null)
             ? ((sequenceI == null) ? "-"
                     : Character.toString(sequenceI.getCharAt(k)))
     String ch = (annot == null)
             ? ((sequenceI == null) ? "-"
                     : Character.toString(sequenceI.getCharAt(k)))
-            : annot.displayCharacter;
+            : (annot.displayCharacter == null
+                    ? String.valueOf(annot.secondaryStructure)
+                    : annot.displayCharacter);
+    if (ch == null)
+    {
+      ch = " ";
+    }
     if (key != null && key.equals("SS"))
     {
       char ssannotchar = ' ';
     if (key != null && key.equals("SS"))
     {
       char ssannotchar = ' ';
@@ -1149,11 +1155,7 @@ public class StockholmFile extends AlignFile
       }
       if (charset)
       {
       }
       if (charset)
       {
-        if (ssannotchar == ' ' && isrna)
-        {
-          ssannotchar = '.';
-        }
-        return ssannotchar;
+        return (ssannotchar == ' ' && isrna) ? '.' : ssannotchar;
       }
     }
 
       }
     }
 
index a6ae630..e86c8ad 100644 (file)
@@ -38,6 +38,8 @@ import java.util.BitSet;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import org.testng.Assert;
 import org.testng.annotations.BeforeClass;
 
 import org.testng.Assert;
 import org.testng.annotations.BeforeClass;
@@ -658,7 +660,7 @@ public class StockholmFileTest
 
   // this is the single sequence alignment and the SS annotations equivalent to
   // the ones in file RnaSSTestFile
 
   // this is the single sequence alignment and the SS annotations equivalent to
   // the ones in file RnaSSTestFile
-  String aliFileRnaSSAlphaChars = ">Test.sequence/1-14\n"
+  String aliFileRnaSS = ">Test.sequence/1-14\n"
           + "GUACAAAAAAAAAA";
   String annFileRnaSSAlphaChars = "JALVIEW_ANNOTATION\n"
           + "# Created: Thu Aug 02 14:54:57 BST 2018\n" + "\n"
           + "GUACAAAAAAAAAA";
   String annFileRnaSSAlphaChars = "JALVIEW_ANNOTATION\n"
           + "# Created: Thu Aug 02 14:54:57 BST 2018\n" + "\n"
@@ -700,7 +702,7 @@ public class StockholmFileTest
 
     // this should result in the same RNA SS Annotations
     AlignmentI newAl = new AppletFormatAdapter().readFile(
 
     // this should result in the same RNA SS Annotations
     AlignmentI newAl = new AppletFormatAdapter().readFile(
-            aliFileRnaSSAlphaChars,
+            aliFileRnaSS,
             DataSourceType.PASTE, jalview.io.FileFormat.Fasta);
     AnnotationFile aaf = new AnnotationFile();
     aaf.readAnnotationFile(newAl, annFileRnaSSAlphaChars,
             DataSourceType.PASTE, jalview.io.FileFormat.Fasta);
     AnnotationFile aaf = new AnnotationFile();
     aaf.readAnnotationFile(newAl, annFileRnaSSAlphaChars,
@@ -708,11 +710,14 @@ public class StockholmFileTest
 
     Assert.assertTrue(
             testRnaSSAnnotationsEquivalent(al.getAlignmentAnnotation()[0],
 
     Assert.assertTrue(
             testRnaSSAnnotationsEquivalent(al.getAlignmentAnnotation()[0],
-                    newAl.getAlignmentAnnotation()[0]));
+                    newAl.getAlignmentAnnotation()[0]),
+            "RNA SS Annotations SHOULD be pair-wise equivalent (but apparently aren't): \n"
+                    + "RNA SS A 1:" + al.getAlignmentAnnotation()[0] + "\n"
+                    + "RNA SS A 2:" + newAl.getAlignmentAnnotation()[0]);
 
     // this should NOT result in the same RNA SS Annotations
     newAl = new AppletFormatAdapter().readFile(
 
     // this should NOT result in the same RNA SS Annotations
     newAl = new AppletFormatAdapter().readFile(
-            aliFileRnaSSAlphaChars, DataSourceType.PASTE,
+            aliFileRnaSS, DataSourceType.PASTE,
             jalview.io.FileFormat.Fasta);
     aaf = new AnnotationFile();
     aaf.readAnnotationFile(newAl, wrongAnnFileRnaSSAlphaChars,
             jalview.io.FileFormat.Fasta);
     aaf = new AnnotationFile();
     aaf.readAnnotationFile(newAl, wrongAnnFileRnaSSAlphaChars,
@@ -720,7 +725,10 @@ public class StockholmFileTest
 
     boolean mismatch = testRnaSSAnnotationsEquivalent(al.getAlignmentAnnotation()[0],
             newAl.getAlignmentAnnotation()[0]);
 
     boolean mismatch = testRnaSSAnnotationsEquivalent(al.getAlignmentAnnotation()[0],
             newAl.getAlignmentAnnotation()[0]);
-    Assert.assertFalse( mismatch );
+    Assert.assertFalse(mismatch,
+            "RNA SS Annotations SHOULD NOT be pair-wise equivalent (but apparently are): \n"
+                    + "RNA SS A 1:" + al.getAlignmentAnnotation()[0] + "\n"
+                    + "RNA SS A 2:" + newAl.getAlignmentAnnotation()[0]);
   }
 
   private static boolean testRnaSSAnnotationsEquivalent(
   }
 
   private static boolean testRnaSSAnnotationsEquivalent(
@@ -730,4 +738,110 @@ public class StockholmFileTest
     return a1.rnaSecondaryStructureEquivalent(a2);
   }
 
     return a1.rnaSecondaryStructureEquivalent(a2);
   }
 
+  String annFileRnaSSWithSpaceChars = "JALVIEW_ANNOTATION\n"
+          + "# Created: Thu Aug 02 14:54:57 BST 2018\n" + "\n"
+          + "NO_GRAPH\tSecondary Structure\tSecondary Structure\t<,<|.,.|H,H| , |B,B|h,h| , |b,b|(,(|E,E|.,.|e,e|),)|>,>|\t2.0\n"
+          + "\n"
+          + "ROWPROPERTIES\tSecondary Structure\tscaletofit=true\tshowalllabs=true\tcentrelabs=false\n"
+          + "\n" + "\n" + "ALIGNMENT\tID=RNA.SS.TEST\tTP=RNA;";
+  String annFileRnaSSWithoutSpaceChars = "JALVIEW_ANNOTATION\n"
+          + "# Created: Thu Aug 02 14:54:57 BST 2018\n" + "\n"
+          + "NO_GRAPH\tSecondary Structure\tSecondary Structure\t<,<|.,.|H,H|.,.|B,B|h,h|.,.|b,b|(,(|E,E|.,.|e,e|),)|>,>|\t2.0\n"
+          + "\n"
+          + "ROWPROPERTIES\tSecondary Structure\tscaletofit=true\tshowalllabs=true\tcentrelabs=false\n"
+          + "\n" + "\n" + "ALIGNMENT\tID=RNA.SS.TEST\tTP=RNA;";
+
+  String wrongAnnFileRnaSSWithoutSpaceChars = "JALVIEW_ANNOTATION\n"
+          + "# Created: Thu Aug 02 14:54:57 BST 2018\n" + "\n"
+          + "NO_GRAPH\tSecondary Structure\tSecondary Structure\t<,<|.,.|H,H|Z,Z|B,B|h,h|z,z|b,b|(,(|E,E|.,.|e,e|),)|>,>|\t2.0\n"
+          + "\n"
+          + "ROWPROPERTIES\tSecondary Structure\tscaletofit=true\tshowalllabs=true\tcentrelabs=false\n"
+          + "\n" + "\n" + "ALIGNMENT\tID=RNA.SS.TEST\tTP=RNA;";
+
+  @Test(groups = { "Functional" })
+  public void stockholmFileRnaSSSpaceChars() throws Exception
+  {
+    AlignmentI alWithSpaces = new AppletFormatAdapter().readFile(
+            aliFileRnaSS, DataSourceType.PASTE,
+            jalview.io.FileFormat.Fasta);
+    AnnotationFile afWithSpaces = new AnnotationFile();
+    afWithSpaces.readAnnotationFile(alWithSpaces,
+            annFileRnaSSWithSpaceChars, DataSourceType.PASTE);
+
+    Iterable<AlignmentAnnotation> aaiWithSpaces = alWithSpaces
+            .findAnnotations(null, null, "Secondary Structure");
+    AlignmentAnnotation aaWithSpaces = aaiWithSpaces.iterator().next();
+    Assert.assertTrue(aaWithSpaces.isRNA(),
+            "'" + aaWithSpaces + "' not recognised as RNA SS");
+    Assert.assertTrue(aaWithSpaces.isValidStruc(),
+            "'" + aaWithSpaces + "' not recognised as valid structure");
+    Annotation[] annWithSpaces = aaWithSpaces.annotations;
+    char[] As = new char[annWithSpaces.length];
+    for (int i = 0; i < annWithSpaces.length; i++)
+    {
+      As[i] = annWithSpaces[i].secondaryStructure;
+    }
+    // check all spaces and dots are spaces in the internal representation
+    char[] shouldBe = { '<', ' ', 'H', ' ', 'B', 'h', ' ', 'b', '(', 'E',
+        ' ', 'e', ')', '>' };
+    Assert.assertTrue(Arrays.equals(As, shouldBe), "Annotation is "
+            + new String(As) + " but should be " + new String(shouldBe));
+
+    // this should result in the same RNA SS Annotations
+    AlignmentI alWithoutSpaces = new AppletFormatAdapter().readFile(
+            aliFileRnaSS, DataSourceType.PASTE,
+            jalview.io.FileFormat.Fasta);
+    AnnotationFile afWithoutSpaces = new AnnotationFile();
+    afWithoutSpaces.readAnnotationFile(alWithoutSpaces,
+            annFileRnaSSWithoutSpaceChars,
+            DataSourceType.PASTE);
+
+    Assert.assertTrue(
+            testRnaSSAnnotationsEquivalent(
+                    alWithSpaces.getAlignmentAnnotation()[0],
+                    alWithoutSpaces.getAlignmentAnnotation()[0]),
+            "RNA SS Annotations SHOULD be pair-wise equivalent (but apparently aren't): \n"
+                    + "RNA SS A 1:"
+                    + alWithSpaces.getAlignmentAnnotation()[0]
+                            .getRnaSecondaryStructure()
+                    + "\n" + "RNA SS A 2:"
+                    + alWithoutSpaces.getAlignmentAnnotation()[0]
+                            .getRnaSecondaryStructure());
+
+    // this should NOT result in the same RNA SS Annotations
+    AlignmentI wrongAlWithoutSpaces = new AppletFormatAdapter().readFile(
+            aliFileRnaSS, DataSourceType.PASTE,
+            jalview.io.FileFormat.Fasta);
+    AnnotationFile wrongAfWithoutSpaces = new AnnotationFile();
+    wrongAfWithoutSpaces.readAnnotationFile(wrongAlWithoutSpaces,
+            wrongAnnFileRnaSSWithoutSpaceChars,
+            DataSourceType.PASTE);
+
+    Assert.assertFalse(
+            testRnaSSAnnotationsEquivalent(
+                    alWithSpaces.getAlignmentAnnotation()[0],
+                    wrongAlWithoutSpaces.getAlignmentAnnotation()[0]),
+            "RNA SS Annotations SHOULD NOT be pair-wise equivalent (but apparently are): \n"
+                    + "RNA SS A 1:"
+                    + alWithSpaces.getAlignmentAnnotation()[0]
+                            .getRnaSecondaryStructure()
+                    + "\n" + "RNA SS A 2:"
+                    + wrongAlWithoutSpaces.getAlignmentAnnotation()[0]
+                            .getRnaSecondaryStructure());
+
+    // check no spaces in the output
+    // TODO: create a better 'save as <format>' pattern
+    alWithSpaces.getAlignmentAnnotation()[0].visible = true;
+    StockholmFile sf = new StockholmFile(alWithSpaces);
+
+    String stockholmFile = sf.print(alWithSpaces.getSequencesArray(), true);
+    Pattern noSpacesInRnaSSAnnotation = Pattern
+            .compile("\\n#=GC SS_cons\\s+\\S{14}\\n");
+    Matcher m = noSpacesInRnaSSAnnotation.matcher(stockholmFile);
+    boolean matches = m.find();
+    Assert.assertTrue(matches,
+            "StockholmFile output does not contain expected output (may contain spaces):\n"
+                    + stockholmFile);
+
+  }
 }
 }