From: Jim Procter Date: Thu, 4 May 2017 13:10:44 +0000 (+0100) Subject: Merge branch 'bug/JAL-2507_rnasecstrstockholmoutput' into develop X-Git-Tag: Release_2_10_2~3^2~105^2 X-Git-Url: http://source.jalview.org/gitweb/?a=commitdiff_plain;h=6c31e8ed324bd6d62441119e6548952880f68a08;hp=92b9b524e36f710844eafea4d5f9af53bc08043a;p=jalview.git Merge branch 'bug/JAL-2507_rnasecstrstockholmoutput' into develop --- diff --git a/src/jalview/io/StockholmFile.java b/src/jalview/io/StockholmFile.java index 2061f29..a47e1ea 100644 --- a/src/jalview/io/StockholmFile.java +++ b/src/jalview/io/StockholmFile.java @@ -800,9 +800,9 @@ public class StockholmFile extends AlignFile { String convert1, convert2 = null; - convert1 = OPEN_PAREN.replaceAll(annots); - convert2 = CLOSE_PAREN.replaceAll(convert1); - annots = convert2; + // convert1 = OPEN_PAREN.replaceAll(annots); + // convert2 = CLOSE_PAREN.replaceAll(convert1); + // annots = convert2; String type = label; if (label.contains("_cons")) @@ -978,15 +978,19 @@ public class StockholmFile extends AlignFile { for (int j = 0; j < alAnot.length; j++) { - if (ds.getSequenceFeatures() != null) + + String key = type2id(alAnot[j].label); + boolean isrna = alAnot[j].isValidStruc(); + + if (isrna) { - feature = ds.getSequenceFeatures()[0].type; + // hardwire to secondary structure if there is RNA secondary + // structure on the annotation + key = "SS"; } - // ?bug - feature may still have previous loop value - String key = type2id(feature); - if (key == null) { + continue; } @@ -994,7 +998,6 @@ public class StockholmFile extends AlignFile out.append(new Format("%-" + maxid + "s").form("#=GR " + printId(s[i], jvSuffix) + " " + key + " ")); ann = alAnot[j].annotations; - boolean isrna = alAnot[j].isValidStruc(); String seq = ""; for (int k = 0; k < ann.length; k++) { diff --git a/test/jalview/io/RNAMLfileTest.java b/test/jalview/io/RNAMLfileTest.java index d16fb5f..1c54980 100644 --- a/test/jalview/io/RNAMLfileTest.java +++ b/test/jalview/io/RNAMLfileTest.java @@ -53,7 +53,7 @@ public class RNAMLfileTest { StockholmFileTest.testFileIOwithFormat(new File( "examples/testdata/rna-alignment.xml"), FileFormat.Stockholm, - -1, -1); + -1, -1, true); } diff --git a/test/jalview/io/StockholmFileTest.java b/test/jalview/io/StockholmFileTest.java index 4028913..e7f1435 100644 --- a/test/jalview/io/StockholmFileTest.java +++ b/test/jalview/io/StockholmFileTest.java @@ -56,7 +56,8 @@ public class StockholmFileTest @Test(groups = { "Functional" }) public void pfamFileIO() throws Exception { - testFileIOwithFormat(new File(PfamFile), FileFormat.Stockholm, -1, 0); + testFileIOwithFormat(new File(PfamFile), FileFormat.Stockholm, -1, 0, + false); } @Test(groups = { "Functional" }) @@ -81,7 +82,8 @@ public class StockholmFileTest @Test(groups = { "Functional" }) public void rfamFileIO() throws Exception { - testFileIOwithFormat(new File(RfamFile), FileFormat.Stockholm, 2, 1); + testFileIOwithFormat(new File(RfamFile), FileFormat.Stockholm, 2, 1, + false); } /** @@ -93,10 +95,11 @@ public class StockholmFileTest * @param ioformat * - label for IO class used to write and read back in the data from * f + * @param ignoreRowVisibility */ public static void testFileIOwithFormat(File f, FileFormatI ioformat, - int naliannot, int nminseqann) + int naliannot, int nminseqann, boolean ignoreRowVisibility) { System.out.println("Reading file: " + f); String ff = f.getPath(); @@ -174,6 +177,27 @@ public class StockholmFileTest public static void testAlignmentEquivalence(AlignmentI al, AlignmentI al_input, boolean ignoreFeatures) { + } + + /** + * assert alignment equivalence + * + * @param al + * 'original' + * @param al_input + * 'secondary' or generated alignment from some datapreserving + * transformation + * @param ignoreFeatures + * when true, differences in sequence feature annotation are ignored + * + * @param ignoreRowVisibility + * when true, do not fail if there are differences in the visibility + * of annotation rows + */ + public static void testAlignmentEquivalence(AlignmentI al, + AlignmentI al_input, boolean ignoreFeatures, + boolean ignoreRowVisibility) + { assertNotNull("Original alignment was null", al); assertNotNull("Generated alignment was null", al_input); @@ -201,13 +225,18 @@ public class StockholmFileTest { if (aa_new.length > i) { - assertTrue("Different alignment annotation at position " + i, - equalss(aa_original[i], aa_new[i])); + assertEqualSecondaryStructure( + "Different alignment annotation at position " + i, + aa_original[i], aa_new[i]); // compare graphGroup or graph properties - needed to verify JAL-1299 assertEquals("Graph type not identical.", aa_original[i].graph, aa_new[i].graph); - assertEquals("Visibility not identical.", aa_original[i].visible, + if (!ignoreRowVisibility) + { + assertEquals("Visibility not identical.", + aa_original[i].visible, aa_new[i].visible); + } assertEquals("Threshold line not identical.", aa_original[i].threshold, aa_new[i].threshold); // graphGroup may differ, but pattern should be the same @@ -310,8 +339,9 @@ public class StockholmFileTest { annot_original = al.getSequenceAt(i).getAnnotation()[j]; annot_new = al_input.getSequenceAt(in).getAnnotation()[j]; - assertTrue("Different annotation elements", - equalss(annot_original, annot_new)); + assertEqualSecondaryStructure( + "Different annotation elements", annot_original, + annot_new); } } } @@ -333,39 +363,57 @@ public class StockholmFileTest } } - /* - * compare annotations - */ - private static boolean equalss(AlignmentAnnotation annot_or, + private static void assertEqualSecondaryStructure(String message, + AlignmentAnnotation annot_or, AlignmentAnnotation annot_new) { + // TODO: test to cover this assert behaves correctly for all allowed + // variations of secondary structure annotation row equivalence if (annot_or.annotations.length != annot_new.annotations.length) { - System.err.println("Different lengths for annotation row elements: " + fail("Different lengths for annotation row elements: " + annot_or.annotations.length + "!=" + annot_new.annotations.length); - return false; } + boolean isRna = annot_or.isRNA(); + 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]; if (an_or != null && an_new != null) { - if (!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())))) + + if (isRna) { - System.err.println("Annotation Element Mismatch\nElement " + i - + " in original: " + annot_or.annotations[i].toString() - + "\nElement " + i + " in new: " - + annot_new.annotations[i].toString()); - return false; + if (an_or.secondaryStructure != an_new.secondaryStructure + || an_or.value != an_new.value) + { + fail("Different RNA secondary structure at column " + i + + " expected: [" + annot_or.annotations[i].toString() + + "] but got: [" + annot_new.annotations[i].toString() + + "]"); + } + } + else + { + // not RNA secondary structure, so expect all elements to match... + if (!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())))) + { + fail("Annotation Element Mismatch\nElement " + i + + " in original: " + annot_or.annotations[i].toString() + + "\nElement " + i + " in new: " + + annot_new.annotations[i].toString()); + } } } else if (annot_or.annotations[i] == null @@ -375,7 +423,7 @@ public class StockholmFileTest } else { - System.err.println("Annotation Element Mismatch\nElement " + fail("Annotation Element Mismatch\nElement " + i + " in original: " + (annot_or.annotations[i] == null ? "is null" @@ -385,9 +433,7 @@ public class StockholmFileTest + " in new: " + (annot_new.annotations[i] == null ? "is null" : annot_new.annotations[i].toString())); - return false; } } - return true; } }