From 483abbfd34bb2e47698f4cb04e21531c2b11924a Mon Sep 17 00:00:00 2001 From: Ben Soares Date: Fri, 3 Aug 2018 17:00:50 +0100 Subject: [PATCH] JAL-3061 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 | 20 +++--- test/jalview/io/StockholmFileTest.java | 124 ++++++++++++++++++++++++++++++-- 2 files changed, 130 insertions(+), 14 deletions(-) diff --git a/src/jalview/io/StockholmFile.java b/src/jalview/io/StockholmFile.java index 606540f..0e73af1 100644 --- a/src/jalview/io/StockholmFile.java +++ b/src/jalview/io/StockholmFile.java @@ -205,7 +205,7 @@ public class StockholmFile extends AlignFile String version; // String id; Hashtable seqAnn = new Hashtable(); // Sequence related annotations - LinkedHashMap seqs = new LinkedHashMap(); + LinkedHashMap seqs = new LinkedHashMap<>(); 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(); } - Vector newStruc = new Vector(); + Vector newStruc = new Vector<>(); 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; - List dbrs = new ArrayList(); + List dbrs = new ArrayList<>(); 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))) - : annot.displayCharacter; + : (annot.displayCharacter == null + ? String.valueOf(annot.secondaryStructure) + : annot.displayCharacter); + if (ch == null) + { + ch = " "; + } if (key != null && key.equals("SS")) { char ssannotchar = ' '; @@ -1149,11 +1155,7 @@ public class StockholmFile extends AlignFile } if (charset) { - if (ssannotchar == ' ' && isrna) - { - ssannotchar = '.'; - } - return ssannotchar; + return (ssannotchar == ' ' && isrna) ? '.' : ssannotchar; } } diff --git a/test/jalview/io/StockholmFileTest.java b/test/jalview/io/StockholmFileTest.java index a6ae630..e86c8ad 100644 --- a/test/jalview/io/StockholmFileTest.java +++ b/test/jalview/io/StockholmFileTest.java @@ -38,6 +38,8 @@ import java.util.BitSet; 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; @@ -658,7 +660,7 @@ public class StockholmFileTest // 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" @@ -700,7 +702,7 @@ public class StockholmFileTest // 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, @@ -708,11 +710,14 @@ public class StockholmFileTest 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( - aliFileRnaSSAlphaChars, DataSourceType.PASTE, + aliFileRnaSS, DataSourceType.PASTE, 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]); - 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( @@ -730,4 +738,110 @@ public class StockholmFileTest 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 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 ' 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); + + } } -- 1.7.10.2