X-Git-Url: http://source.jalview.org/gitweb/?p=jalview.git;a=blobdiff_plain;f=test%2Fjalview%2Fio%2FStockholmFileTest.java;h=b1995ab5945b4d1d99ff1df0b135d5aacd9483b1;hp=74825cf8fb575ae26b7f2b95f77059151dbe0d60;hb=0ae965fc73680bdc69b06986c060ff17342c4787;hpb=6a33e605b75ae727af5420d9b90d86768ca3dc63 diff --git a/test/jalview/io/StockholmFileTest.java b/test/jalview/io/StockholmFileTest.java index 74825cf..b1995ab 100644 --- a/test/jalview/io/StockholmFileTest.java +++ b/test/jalview/io/StockholmFileTest.java @@ -26,17 +26,6 @@ import static org.testng.AssertJUnit.assertNotNull; import static org.testng.AssertJUnit.assertTrue; import static org.testng.AssertJUnit.fail; -import jalview.datamodel.Alignment; -import jalview.datamodel.AlignmentAnnotation; -import jalview.datamodel.AlignmentI; -import jalview.datamodel.Annotation; -import jalview.datamodel.DBRefEntry; -import jalview.datamodel.Sequence; -import jalview.datamodel.SequenceFeature; -import jalview.datamodel.SequenceI; -import jalview.gui.JvOptionPane; -import jalview.util.DBRefUtils; - import java.io.File; import java.util.Arrays; import java.util.BitSet; @@ -50,6 +39,17 @@ import org.testng.Assert; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; +import jalview.datamodel.Alignment; +import jalview.datamodel.AlignmentAnnotation; +import jalview.datamodel.AlignmentI; +import jalview.datamodel.Annotation; +import jalview.datamodel.DBRefEntry; +import jalview.datamodel.Sequence; +import jalview.datamodel.SequenceFeature; +import jalview.datamodel.SequenceI; +import jalview.gui.JvOptionPane; +import jalview.util.DBRefUtils; + public class StockholmFileTest { @@ -107,9 +107,9 @@ public class StockholmFileTest // sequences retrieved in a Pfam domain alignment also have a PFAM database // reference SequenceI sq = new Sequence("FER2_SPIOL", "AASSDDDFFF"); - sq.addDBRef(new DBRefEntry("PFAM", "1", "PF00111")); sq.addDBRef(new DBRefEntry("UNIPROT", "1", "P00224")); sq.addDBRef(new DBRefEntry("PFAM", "1", "P00224.1")); + sq.addDBRef(new DBRefEntry("PFAM", "1", "PF00111")); AppletFormatAdapter af = new AppletFormatAdapter(); String toStockholm = af.formatSequences(FileFormat.Stockholm, new Alignment(new SequenceI[] @@ -119,16 +119,16 @@ public class StockholmFileTest assertTrue( Pattern.compile( "^#=GS\\s+FER2_SPIOL(/\\d+-\\d+)?\\s+AC\\s+P00224$", - Pattern.MULTILINE).matcher(toStockholm) - .find(), + Pattern.MULTILINE).matcher(toStockholm).find(), "Couldn't locate UNIPROT Accession in generated Stockholm file."); AlignmentI fromStockholm = af.readFile(toStockholm, DataSourceType.PASTE, FileFormat.Stockholm); SequenceI importedSeq = fromStockholm.getSequenceAt(0); - assertTrue(importedSeq.getDBRefs().length == 1, + assertTrue(importedSeq.getDBRefs().size() == 1, "Expected just one database reference to be added to sequence."); assertTrue( - importedSeq.getDBRefs()[0].getAccessionId().indexOf(" ") == -1, + importedSeq.getDBRefs().get(0).getAccessionId() + .indexOf(" ") == -1, "Spaces were found in accession ID."); List dbrefs = DBRefUtils.searchRefs(importedSeq.getDBRefs(), "P00224"); @@ -142,11 +142,10 @@ public class StockholmFileTest * with no dataloss * * @param f - * - source datafile (IdentifyFile.identify() - * should work with it) + * - source datafile (IdentifyFile.identify() should work with it) * @param ioformat - * - label for IO class used to write and read - * back in the data from f + * - label for IO class used to write and read back in the data from + * f * @param ignoreFeatures * @param ignoreRowVisibility * @param allowNullAnnotations @@ -173,8 +172,8 @@ public class StockholmFileTest al.getSequenceAt(i).createDatasetSequence(); } String outputfile = rf.formatSequences(ioformat, al, true); - System.out.println("Output file in '" + ioformat + "':\n" - + outputfile + "\n<= nminseqann); + + nminseqann, + numsqswithali >= nminseqann); } catch (Exception e) { @@ -264,15 +264,21 @@ public class StockholmFileTest assertNotNull("Original alignment was null", al); assertNotNull("Generated alignment was null", al_input); - assertTrue("Alignment dimension mismatch: original: " + al.getHeight() - + "x" + al.getWidth() + ", generated: " + al_input.getHeight() - + "x" + al_input.getWidth(), + assertTrue( + "Alignment dimension mismatch: original: " + al.getHeight() + + "x" + al.getWidth() + ", generated: " + + al_input.getHeight() + "x" + al_input.getWidth(), al.getHeight() == al_input.getHeight() && al.getWidth() == al_input.getWidth()); // check Alignment annotation AlignmentAnnotation[] aa_new = al_input.getAlignmentAnnotation(); AlignmentAnnotation[] aa_original = al.getAlignmentAnnotation(); + boolean expectProteinSS = !al.isNucleotide(); + assertTrue( + "Alignments not both " + + (al.isNucleotide() ? "nucleotide" : "protein"), + al_input.isNucleotide() == al.isNucleotide()); // note - at moment we do not distinguish between alignment without any // annotation rows and alignment with no annotation row vector @@ -291,14 +297,20 @@ public class StockholmFileTest assertEqualSecondaryStructure( "Different alignment annotation at position " + i, aa_original[i], aa_new[i], allowNullAnnotation); + if (aa_original[i].hasIcons) + { + assertTrue( + "Secondary structure expected to be " + + (expectProteinSS ? "protein" : "nucleotide"), + expectProteinSS == !aa_original[i].isRNA()); + } // compare graphGroup or graph properties - needed to verify JAL-1299 assertEquals("Graph type not identical.", aa_original[i].graph, aa_new[i].graph); if (!ignoreRowVisibility) { assertEquals("Visibility not identical.", - aa_original[i].visible, - aa_new[i].visible); + aa_original[i].visible, aa_new[i].visible); } assertEquals("Threshold line not identical.", aa_original[i].threshold, aa_new[i].threshold); @@ -334,7 +346,8 @@ public class StockholmFileTest // check sequences, annotation and features SequenceI[] seq_original = new SequenceI[al.getSequencesArray().length]; seq_original = al.getSequencesArray(); - SequenceI[] seq_new = new SequenceI[al_input.getSequencesArray().length]; + SequenceI[] seq_new = new SequenceI[al_input + .getSequencesArray().length]; seq_new = al_input.getSequencesArray(); List sequenceFeatures_original; List sequenceFeatures_new; @@ -345,8 +358,8 @@ public class StockholmFileTest String name = seq_original[i].getName(); int start = seq_original[i].getStart(); int end = seq_original[i].getEnd(); - System.out.println("Check sequence: " + name + "/" + start + "-" - + end); + System.out + .println("Check sequence: " + name + "/" + start + "-" + end); // search equal sequence for (int in = 0; in < al_input.getSequencesArray().length; in++) @@ -364,10 +377,12 @@ public class StockholmFileTest "Sequence Features were not equivalent" + (ignoreFeatures ? " ignoring." : ""), ignoreFeatures - || (seq_original[i].getSequenceFeatures() == null && seq_new[in] - .getSequenceFeatures() == null) - || (seq_original[i].getSequenceFeatures() != null && seq_new[in] - .getSequenceFeatures() != null)); + || (seq_original[i].getSequenceFeatures() == null + && seq_new[in] + .getSequenceFeatures() == null) + || (seq_original[i].getSequenceFeatures() != null + && seq_new[in] + .getSequenceFeatures() != null)); // compare sequence features if (seq_original[i].getSequenceFeatures() != null && seq_new[in].getSequenceFeatures() != null) @@ -377,9 +392,9 @@ public class StockholmFileTest .getSequenceFeatures(); sequenceFeatures_new = seq_new[in].getSequenceFeatures(); - assertEquals("different number of features", seq_original[i] - .getSequenceFeatures().size(), seq_new[in] - .getSequenceFeatures().size()); + assertEquals("different number of features", + seq_original[i].getSequenceFeatures().size(), + seq_new[in].getSequenceFeatures().size()); for (int feat = 0; feat < seq_original[i].getSequenceFeatures() .size(); feat++) @@ -393,10 +408,11 @@ public class StockholmFileTest if (al.getSequenceAt(i).getAnnotation() != null && al_input.getSequenceAt(in).getAnnotation() != null) { - for (int j = 0; j < al.getSequenceAt(i).getAnnotation().length; j++) + for (int j = 0; j < al.getSequenceAt(i) + .getAnnotation().length; j++) { - if (al.getSequenceAt(i).getAnnotation()[j] != null - && al_input.getSequenceAt(in).getAnnotation()[j] != null) + if (al.getSequenceAt(i).getAnnotation()[j] != null && al_input + .getSequenceAt(in).getAnnotation()[j] != null) { annot_original = al.getSequenceAt(i).getAnnotation()[j]; annot_new = al_input.getSequenceAt(in).getAnnotation()[j]; @@ -454,12 +470,14 @@ public class StockholmFileTest + annot_new.annotations.length); } boolean isRna = annot_or.isRNA(); - assertTrue("Expected " + (isRna ? " valid RNA " : " no RNA ") - + " secondary structure in the row.", + assertTrue( + "Expected " + (isRna ? " valid RNA " : " no RNA ") + + " secondary structure in the row.", isRna == annot_new.isRNA()); for (int i = 0; i < annot_or.annotations.length; i++) { - Annotation an_or = annot_or.annotations[i], an_new = annot_new.annotations[i]; + Annotation an_or = annot_or.annotations[i], + an_new = annot_new.annotations[i]; if (an_or != null && an_new != null) { @@ -467,7 +485,8 @@ public class StockholmFileTest { if (an_or.secondaryStructure != an_new.secondaryStructure || ((Float.isNaN(an_or.value) != Float - .isNaN(an_new.value)) || an_or.value != an_new.value)) + .isNaN(an_new.value)) + || an_or.value != an_new.value)) { fail("Different RNA secondary structure at column " + i + " expected: [" + annot_or.annotations[i].toString() @@ -479,17 +498,22 @@ public class StockholmFileTest { // not RNA secondary structure, so expect all elements to match... if ((an_or.isWhitespace() != an_new.isWhitespace()) - || !an_or.displayCharacter.trim().equals( - an_new.displayCharacter.trim()) - || !("" + an_or.secondaryStructure).trim().equals( - ("" + an_new.secondaryStructure).trim()) - || (an_or.description != an_new.description && !((an_or.description == null && an_new.description - .trim().length() == 0) - || (an_new.description == null && an_or.description - .trim().length() == 0) || an_or.description - .trim().equals(an_new.description.trim()))) - || !((Float.isNaN(an_or.value) && Float - .isNaN(an_new.value)) || an_or.value == an_new.value)) + || !an_or.displayCharacter.trim() + .equals(an_new.displayCharacter.trim()) + || !("" + an_or.secondaryStructure).trim() + .equals(("" + an_new.secondaryStructure).trim()) + || (an_or.description != an_new.description + && !((an_or.description == null + && an_new.description.trim() + .length() == 0) + || (an_new.description == null + && an_or.description.trim() + .length() == 0) + || an_or.description.trim().equals( + an_new.description.trim()))) + || !((Float.isNaN(an_or.value) + && Float.isNaN(an_new.value)) + || an_or.value == an_new.value)) { fail("Annotation Element Mismatch\nElement " + i + " in original: " + annot_or.annotations[i].toString() @@ -549,34 +573,40 @@ public class StockholmFileTest } if (!thrown) { - fail("Expected difference for [" + an_orig + "] and [" + an_new + "]"); + fail("Expected difference for [" + an_orig + "] and [" + an_new + + "]"); } } + private AlignmentAnnotation makeAnnot(Annotation ae) { - return new AlignmentAnnotation("label", "description", new Annotation[] - { ae }); + return new AlignmentAnnotation("label", "description", + new Annotation[] + { ae }); } - @Test(groups={"Functional"}) + @Test(groups = { "Functional" }) public void testAnnotationEquivalence() { AlignmentAnnotation one = makeAnnot(new Annotation("", "", ' ', 1)); - AlignmentAnnotation anotherOne = makeAnnot(new Annotation("", "", ' ', - 1)); - AlignmentAnnotation sheet = makeAnnot(new Annotation("","",'E',0f)); - AlignmentAnnotation anotherSheet = makeAnnot(new Annotation("","",'E',0f)); - AlignmentAnnotation sheetWithLabel = makeAnnot(new Annotation("1", "", - 'E', 0f)); - AlignmentAnnotation anotherSheetWithLabel = makeAnnot(new Annotation( - "1", "", 'E', 0f)); - AlignmentAnnotation rnaNoDC = makeAnnot(new Annotation("","",'<',0f)); - AlignmentAnnotation anotherRnaNoDC = makeAnnot(new Annotation("","",'<',0f)); - AlignmentAnnotation rnaWithDC = makeAnnot(new Annotation("B", "", '<', - 0f)); - AlignmentAnnotation anotherRnaWithDC = makeAnnot(new Annotation("B", - "", '<', 0f)); - + AlignmentAnnotation anotherOne = makeAnnot( + new Annotation("", "", ' ', 1)); + AlignmentAnnotation sheet = makeAnnot(new Annotation("", "", 'E', 0f)); + AlignmentAnnotation anotherSheet = makeAnnot( + new Annotation("", "", 'E', 0f)); + AlignmentAnnotation sheetWithLabel = makeAnnot( + new Annotation("1", "", 'E', 0f)); + AlignmentAnnotation anotherSheetWithLabel = makeAnnot( + new Annotation("1", "", 'E', 0f)); + AlignmentAnnotation rnaNoDC = makeAnnot( + new Annotation("", "", '<', 0f)); + AlignmentAnnotation anotherRnaNoDC = makeAnnot( + new Annotation("", "", '<', 0f)); + AlignmentAnnotation rnaWithDC = makeAnnot( + new Annotation("B", "", '<', 0f)); + AlignmentAnnotation anotherRnaWithDC = makeAnnot( + new Annotation("B", "", '<', 0f)); + // check self equivalence for (boolean allowNull : new boolean[] { true, false }) { @@ -607,7 +637,7 @@ public class StockholmFileTest if (p != q) { assertNotEqualSecondaryStructure("Should be different", - aaSet.get(p), aaSet.get(q), false); + aaSet.get(p), aaSet.get(q), false); } else { @@ -635,6 +665,7 @@ public class StockholmFileTest } String aliFile = ">Dm\nAAACCCUUUUACACACGGGAAAGGG"; + String annFile = "JALVIEW_ANNOTATION\n# Created: Thu May 04 11:16:52 BST 2017\n\n" + "SEQUENCE_REF\tDm\nNO_GRAPH\tsecondary structure\tsecondary structure\t" + "(|(|(|(|, .|, .|, .|, .|)|)|)|)|\t0.0\nROWPROPERTIES\t" @@ -644,6 +675,7 @@ public class StockholmFileTest + "SEQUENCE_REF\tDm\nNO_GRAPH\tsecondary structure\tsecondary structure\t" + "(|(|(|(||{|{||{|{||)|)|)|)||}|}|}|}|\t0.0\nROWPROPERTIES\t" + "secondary structure\tscaletofit=true\tshowalllabs=true\tcentrelabs=false"; + String annFileFullWuss = "JALVIEW_ANNOTATION\n# Created: Thu May 04 11:16:52 BST 2017\n\n" + "SEQUENCE_REF\tDm\nNO_GRAPH\tsecondary structure\tsecondary structure\t" + "(|(|(|(||{|{||[|[||)|)|)|)||}|}|]|]|\t0.0\nROWPROPERTIES\t" @@ -681,6 +713,7 @@ public class StockholmFileTest "Shouldn't recognise '" + ch + "' as a WUSS bracket"); } } + private static void roundTripSSForRNA(String aliFile, String annFile) throws Exception { @@ -706,20 +739,22 @@ public class StockholmFileTest // this is the single sequence alignment and the SS annotations equivalent to // the ones in file RnaSSTestFile - String aliFileRnaSS = ">Test.sequence/1-14\n" - + "GUACAAAAAAAAAA"; + String aliFileRnaSS = ">Test.sequence/1-14\n" + "GUACAAAAAAAAAA"; + String annFileRnaSSAlphaChars = "JALVIEW_ANNOTATION\n" + "# Created: Thu Aug 02 14:54:57 BST 2018\n" + "\n" + "NO_GRAPH\tSecondary Structure\tSecondary Structure\t<,<|(,(|E,E|H,H|B,B|h,h|e,e|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 wrongAnnFileRnaSSAlphaChars = "JALVIEW_ANNOTATION\n" + "# Created: Thu Aug 02 14:54:57 BST 2018\n" + "\n" + "NO_GRAPH\tSecondary Structure\tSecondary Structure\t<,<|(,(|H,H|E,E|B,B|h,h|e,e|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 stockholmFileRnaSSAlphaChars() throws Exception { @@ -741,14 +776,11 @@ public class StockholmFileTest } char[] shouldBe = { '<', '(', 'E', 'H', 'B', 'h', 'e', 'b', '(', 'E', ')', 'e', ')', '>' }; - Assert.assertTrue( - Arrays.equals(As, shouldBe), - "Annotation is " + new String(As) + " but should be " - + new String(shouldBe)); + 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 newAl = new AppletFormatAdapter().readFile( - aliFileRnaSS, + AlignmentI newAl = new AppletFormatAdapter().readFile(aliFileRnaSS, DataSourceType.PASTE, jalview.io.FileFormat.Fasta); AnnotationFile aaf = new AnnotationFile(); aaf.readAnnotationFile(newAl, annFileRnaSSAlphaChars, @@ -762,14 +794,14 @@ public class StockholmFileTest + "RNA SS A 2:" + newAl.getAlignmentAnnotation()[0]); // this should NOT result in the same RNA SS Annotations - newAl = new AppletFormatAdapter().readFile( - aliFileRnaSS, DataSourceType.PASTE, - jalview.io.FileFormat.Fasta); + newAl = new AppletFormatAdapter().readFile(aliFileRnaSS, + DataSourceType.PASTE, jalview.io.FileFormat.Fasta); aaf = new AnnotationFile(); aaf.readAnnotationFile(newAl, wrongAnnFileRnaSSAlphaChars, DataSourceType.PASTE); - boolean mismatch = testRnaSSAnnotationsEquivalent(al.getAlignmentAnnotation()[0], + boolean mismatch = testRnaSSAnnotationsEquivalent( + al.getAlignmentAnnotation()[0], newAl.getAlignmentAnnotation()[0]); Assert.assertFalse(mismatch, "RNA SS Annotations SHOULD NOT be pair-wise equivalent (but apparently are): \n" @@ -778,8 +810,7 @@ public class StockholmFileTest } private static boolean testRnaSSAnnotationsEquivalent( - AlignmentAnnotation a1, - AlignmentAnnotation a2) + AlignmentAnnotation a1, AlignmentAnnotation a2) { return a1.rnaSecondaryStructureEquivalent(a2); } @@ -790,6 +821,7 @@ public class StockholmFileTest + "\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" @@ -839,8 +871,7 @@ public class StockholmFileTest jalview.io.FileFormat.Fasta); AnnotationFile afWithoutSpaces = new AnnotationFile(); afWithoutSpaces.readAnnotationFile(alWithoutSpaces, - annFileRnaSSWithoutSpaceChars, - DataSourceType.PASTE); + annFileRnaSSWithoutSpaceChars, DataSourceType.PASTE); Assert.assertTrue( testRnaSSAnnotationsEquivalent( @@ -860,8 +891,7 @@ public class StockholmFileTest jalview.io.FileFormat.Fasta); AnnotationFile wrongAfWithoutSpaces = new AnnotationFile(); wrongAfWithoutSpaces.readAnnotationFile(wrongAlWithoutSpaces, - wrongAnnFileRnaSSWithoutSpaceChars, - DataSourceType.PASTE); + wrongAnnFileRnaSSWithoutSpaceChars, DataSourceType.PASTE); Assert.assertFalse( testRnaSSAnnotationsEquivalent(