- // expect "secondary structure" to be output as #=GR seqid SS
- // using the secondary structure character (CDEFG) not display char (BCDEF)
- AlignmentAnnotation aa1 = new AlignmentAnnotation("secondary structure",
- "ssdesc", anns);
- aa1.sequenceRef = seq1;
- seq1.addAlignmentAnnotation(aa1);
- al.addAnnotation(aa1);
-
- // "sec structure" should not be output as no corresponding feature id
- AlignmentAnnotation aa2 = new AlignmentAnnotation("sec structure",
- "ssdesc", anns);
- aa2.sequenceRef = seq2;
- seq2.addAlignmentAnnotation(aa2);
- al.addAnnotation(aa2);
-
- // alignment annotation for Reference Positions: output as #=GC RF
- AlignmentAnnotation aa3 = new AlignmentAnnotation("reference positions",
- "refpos", anns);
- al.addAnnotation(aa3);
-
- // 'seq' annotation: output as seq_cons
- AlignmentAnnotation aa4 = new AlignmentAnnotation("seq", "seqdesc",
- anns);
- al.addAnnotation(aa4);
-
- // 'intron' annotation: output as IN_cons
- AlignmentAnnotation aa5 = new AlignmentAnnotation("intron",
- "introndesc", anns);
- al.addAnnotation(aa5);
-
- // 'binding site' annotation: output as binding_site
- AlignmentAnnotation aa6 = new AlignmentAnnotation("binding site",
- "bindingdesc", anns);
- al.addAnnotation(aa6);
-
- // 'autocalc' annotation should not be output
- AlignmentAnnotation aa7 = new AlignmentAnnotation("Consensus",
- "consensusdesc", anns);
- aa7.autoCalculated = true;
- al.addAnnotation(aa7);
-
- // hidden annotation should not be output
- AlignmentAnnotation aa8 = new AlignmentAnnotation("domains",
- "domaindesc", anns);
- aa8.visible = false;
- al.addAnnotation(aa8);
-
- output = testee.print(seqs, true);
- //@formatter:off
- expected =
- "# STOCKHOLM 1.0\n"
- + "#=GS seq1/1-7 AC PF00111\n"
- + "#=GS seq1/1-7 DR UNIPROT ; P83527\n"
- + "#=GS seq2/10-15 AC AY119185.1\n"
- + "#=GS seq2/10-15 DR EMBL ; AF125575\n"
- + "#=GR seq1/1-7 SS CDEFG\n"
- + "seq1/1-7 LKMF-RS-Q\n"
- + "seq2/10-15 RRS-LIP-\n"
- + "#=GC RF BCDEF\n" + "#=GC seq_cons BCDEF\n"
- + "#=GC IN_cons BCDEF\n" + "#=GC binding_site BCDEF\n"
- + "//\n";
- //@formatter:on
- assertEquals(expected, output);
- }
-
- @Test(groups = "Functional")
- public void testOutputCharacter()
- {
- SequenceI seq = new Sequence("seq", "abc--def-");
-
- Annotation[] ann = new Annotation[8];
- ann[1] = new Annotation("Z", "desc", 'E', 1f);
- ann[2] = new Annotation("Q", "desc", ' ', 1f);
- ann[4] = new Annotation("", "desc", 'E', 1f);
- ann[6] = new Annotation("ZH", "desc", 'E', 1f);
-
- /*
- * null annotation in column (not Secondary Structure annotation)
- * should answer sequence character, or '-' if null sequence
- */
- assertEquals('-',
- StockholmFile.getAnnotationCharacter("RF", 0, ann[0], null));
- assertEquals('d',
- StockholmFile.getAnnotationCharacter("RF", 5, ann[5], seq));
- assertEquals('-',
- StockholmFile.getAnnotationCharacter("RF", 8, null, seq));
-
- /*
- * null annotation in column (SS annotation) should answer underscore
- */
- assertEquals('_',
- StockholmFile.getAnnotationCharacter("SS", 0, ann[0], seq));
-
- /*
- * SS secondary structure symbol
- */
- assertEquals('E',
- StockholmFile.getAnnotationCharacter("SS", 1, ann[1], seq));
-
- /*
- * no SS symbol, use label instead
- */
- assertEquals('Q',
- StockholmFile.getAnnotationCharacter("SS", 2, ann[2], seq));
-
- /*
- * SS with 2 character label - second character overrides SS symbol
- */
- assertEquals('H',
- StockholmFile.getAnnotationCharacter("SS", 6, ann[6], seq));
-
- /*
- * empty display character, not SS - answers '.'
- */
- assertEquals('.',
- StockholmFile.getAnnotationCharacter("RF", 4, ann[4], seq));
- }
-
- /**
- * Test to verify that gaps are input/output as underscore in STO annotation
- *
- * @throws IOException
- */
- @Test(groups = "Functional")
- public void testRoundtripWithGaps() throws IOException
- {
- /*
- * small extract from RF00031_folded.stk
- */
- // @formatter:off
- String stoData =
- "# STOCKHOLM 1.0\n" +
- "#=GR B.taurus.4 SS .._((.))_\n" +
- "B.taurus.4 AC.UGCGU.\n" +
- "#=GR B.taurus.5 SS ..((_._))\n" +
- "B.taurus.5 ACUU.G.CG\n" +
- "//\n";
- // @formatter:on
- StockholmFile parser = new StockholmFile(stoData, DataSourceType.PASTE);
- SequenceI[] seqs = parser.getSeqsAsArray();
- assertEquals(2, seqs.length);
-
- /*
- * B.taurus.4 has a trailing gap
- * rendered as underscore in Stockholm annotation
- */
- assertEquals("AC.UGCGU.", seqs[0].getSequenceAsString());
- AlignmentAnnotation[] anns = seqs[0].getAnnotation();
- assertEquals(1, anns.length);
- AlignmentAnnotation taurus4SS = anns[0];
- assertEquals(9, taurus4SS.annotations.length);
- assertEquals(" .", taurus4SS.annotations[0].displayCharacter);
- assertNull(taurus4SS.annotations[2]); // gapped position
- assertNull(taurus4SS.annotations[8]); // gapped position
- assertEquals('(', taurus4SS.annotations[3].secondaryStructure);
- assertEquals("(", taurus4SS.annotations[3].displayCharacter);
- assertEquals(')', taurus4SS.annotations[7].secondaryStructure);
-
- /*
- * output as Stockholm and verify it matches the original input
- * (gaps output as underscore in annotation lines)
- * note: roundtrip test works with the input lines ordered as above;
- * can also parse in other orders, but then input doesn't match output
- */
- AlignmentFileWriterI afile = FileFormat.Stockholm
- .getWriter(new Alignment(seqs));
- String output = afile.print(seqs, false);
- assertEquals(stoData, output);