X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=test%2Fjalview%2Fanalysis%2FAlignmentUtilsTests.java;h=71b1bcb9ed8c0665ced512fc11e4b9d0deae4dce;hb=007dbbfcbbceb839a7928cd962b5a0837339c0d5;hp=f602f6e25297742158c2e9fafd989ceb81e38b9e;hpb=e309b8d9bd62fb304fdd612c7385e76027d2f2d7;p=jalview.git diff --git a/test/jalview/analysis/AlignmentUtilsTests.java b/test/jalview/analysis/AlignmentUtilsTests.java index f602f6e..71b1bcb 100644 --- a/test/jalview/analysis/AlignmentUtilsTests.java +++ b/test/jalview/analysis/AlignmentUtilsTests.java @@ -21,12 +21,25 @@ package jalview.analysis; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; -import jalview.analysis.AlignmentUtils.MappingResult; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import org.junit.Test; + import jalview.datamodel.AlignedCodonFrame; import jalview.datamodel.Alignment; +import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.AlignmentI; +import jalview.datamodel.Annotation; +import jalview.datamodel.DBRefEntry; import jalview.datamodel.Mapping; import jalview.datamodel.Sequence; import jalview.datamodel.SequenceI; @@ -34,14 +47,6 @@ import jalview.io.AppletFormatAdapter; import jalview.io.FormatAdapter; import jalview.util.MapList; -import java.io.IOException; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import org.junit.Test; - public class AlignmentUtilsTests { // @formatter:off @@ -139,132 +144,48 @@ public class AlignmentUtilsTests a.setDataset(null); return a; } + /** - * Test mapping of protein to cDNA. + * Test mapping of protein to cDNA, for the case where we have no sequence + * cross-references, so mappings are made first-served 1-1 where sequences + * translate. * * @throws IOException */ @Test - public void testMapProteinToCdna() throws IOException + public void testMapProteinToCdna_noXrefs() throws IOException { - // protein: Human + Mouse, 3 residues - AlignmentI protein = loadAlignment( - ">Human\nKQY\n>Mouse\nAFP\n>Worm\nRST\n", - "FASTA"); - // cDNA: Mouse, Human, Mouse, 9 bases - // @formatter:off - String dnaData = - ">Mouse\nGAAATCCAG\n" + - ">Human\nTTCGATTAC\n" + - ">Mouse\nGTCGTTTGC\n" + - ">Mouse\nGTCGTTTGCgac\n" + // not mapped - wrong length - ">Fly\nGTCGTTTGC\n"; // not mapped - no name match - // @formatter:on - AlignmentI cdna1 = loadAlignment( - dnaData, - "FASTA"); - MappingResult mapped = AlignmentUtils.mapProteinToCdna(protein, cdna1); - assertEquals(mapped, MappingResult.Mapped); - - /* - * Check two mappings (one for Mouse, one for Human) - */ - assertEquals(2, protein.getCodonFrames().size()); - assertEquals(1, protein.getCodonFrame(protein.getSequenceAt(0)).size()); - assertEquals(1, protein.getCodonFrame(protein.getSequenceAt(1)).size()); - - /* - * Inspect mapping for Human protein - */ - AlignedCodonFrame humanMapping = protein.getCodonFrame( - protein.getSequenceAt(0)).get(0); - assertEquals(1, humanMapping.getdnaSeqs().length); - assertEquals(cdna1.getSequenceAt(1).getDatasetSequence(), - humanMapping.getdnaSeqs()[0]); - Mapping[] protMappings = humanMapping.getProtMappings(); - assertEquals(1, protMappings.length); - MapList mapList = protMappings[0].getMap(); - assertEquals(3, mapList.getFromRatio()); - assertEquals(1, mapList.getToRatio()); - assertTrue(Arrays.equals(new int[] - { 1, 9 }, mapList.getFromRanges().get(0))); - assertEquals(1, mapList.getFromRanges().size()); - assertTrue(Arrays.equals(new int[] - { 1, 3 }, mapList.getToRanges().get(0))); - assertEquals(1, mapList.getToRanges().size()); + List protseqs = new ArrayList(); + protseqs.add(new Sequence("UNIPROT|V12345", "EIQ")); + protseqs.add(new Sequence("UNIPROT|V12346", "EIQ")); + protseqs.add(new Sequence("UNIPROT|V12347", "SAR")); + AlignmentI protein = new Alignment(protseqs.toArray(new SequenceI[3])); + protein.setDataset(null); - /* - * Inspect mappings for Mouse protein - */ - AlignedCodonFrame mouseMapping1 = protein.getCodonFrame( - protein.getSequenceAt(1)).get(0); - assertEquals(2, mouseMapping1.getdnaSeqs().length); - assertEquals(cdna1.getSequenceAt(0).getDatasetSequence(), - mouseMapping1.getdnaSeqs()[0]); - assertEquals(cdna1.getSequenceAt(2).getDatasetSequence(), - mouseMapping1.getdnaSeqs()[1]); - protMappings = mouseMapping1.getProtMappings(); - assertEquals(2, protMappings.length); - for (int i = 0; i < 2; i++) - { - mapList = protMappings[i].getMap(); - assertEquals(3, mapList.getFromRatio()); - assertEquals(1, mapList.getToRatio()); - assertTrue(Arrays.equals(new int[] - { 1, 9 }, mapList.getFromRanges().get(0))); - assertEquals(1, mapList.getFromRanges().size()); - assertTrue(Arrays.equals(new int[] - { 1, 3 }, mapList.getToRanges().get(0))); - assertEquals(1, mapList.getToRanges().size()); - } - } + List dnaseqs = new ArrayList(); + dnaseqs.add(new Sequence("EMBL|A11111", "TCAGCACGC")); // = SAR + dnaseqs.add(new Sequence("EMBL|A22222", "GAGATACAA")); // = EIQ + dnaseqs.add(new Sequence("EMBL|A33333", "GAAATCCAG")); // = EIQ + dnaseqs.add(new Sequence("EMBL|A44444", "GAAATTCAG")); // = EIQ + AlignmentI cdna = new Alignment(dnaseqs.toArray(new SequenceI[4])); + cdna.setDataset(null); - /** - * Test mapping of protein to cDNA which may include start and/or stop codons. - * - * @throws IOException - */ - @Test - public void testMapProteinToCdna_stopStartCodons() throws IOException - { - // protein: Human + Mouse, 3 residues - AlignmentI protein = loadAlignment( - ">Human\nKQY\n>Mouse\nAFP\n>Worm\nRST\n", "FASTA"); - // @formatter:off - String dnaData = - ">Mouse\natgGAAATCCAG\n" + // Mouse with start codon - ">Human\nTTCGATtactaa\n" + // Human with stop codon TAA - ">Mouse\nGTCGTTTGctaG\n" + // Mouse with stop codon TAG - ">Human\nGTCGTTTgctGa\n" + // Human with stop codon TGA - ">Mouse\nATGGTCGTTTGCtag\n"; // Mouse with start and stop codons - // @formatter:on - AlignmentI cdna1 = loadAlignment( - dnaData, - "FASTA"); - MappingResult mapped = AlignmentUtils.mapProteinToCdna(protein, cdna1); - assertEquals(mapped, MappingResult.Mapped); + assertTrue(AlignmentUtils.mapProteinToCdna(protein, cdna)); - /* - * Check two mappings (one for Mouse, one for Human) - */ - assertEquals(2, protein.getCodonFrames().size()); + // 3 mappings made, each from 1 to 1 sequence + assertEquals(3, protein.getCodonFrames().size()); assertEquals(1, protein.getCodonFrame(protein.getSequenceAt(0)).size()); assertEquals(1, protein.getCodonFrame(protein.getSequenceAt(1)).size()); + assertEquals(1, protein.getCodonFrame(protein.getSequenceAt(2)).size()); - /* - * Inspect mapping for Human protein - should map to 2nd and 4th cDNA seqs - */ - AlignedCodonFrame humanMapping = protein.getCodonFrame( + // V12345 mapped to A22222 + AlignedCodonFrame acf = protein.getCodonFrame( protein.getSequenceAt(0)).get(0); - assertEquals(2, humanMapping.getdnaSeqs().length); - assertEquals(cdna1.getSequenceAt(1).getDatasetSequence(), - humanMapping.getdnaSeqs()[0]); - assertEquals(cdna1.getSequenceAt(3).getDatasetSequence(), - humanMapping.getdnaSeqs()[1]); - Mapping[] protMappings = humanMapping.getProtMappings(); - // two mappings, both to cDNA with stop codon - assertEquals(2, protMappings.length); - + assertEquals(1, acf.getdnaSeqs().length); + assertEquals(cdna.getSequenceAt(1).getDatasetSequence(), + acf.getdnaSeqs()[0]); + Mapping[] protMappings = acf.getProtMappings(); + assertEquals(1, protMappings.length); MapList mapList = protMappings[0].getMap(); assertEquals(3, mapList.getFromRatio()); assertEquals(1, mapList.getToRatio()); @@ -275,65 +196,20 @@ public class AlignmentUtilsTests { 1, 3 }, mapList.getToRanges().get(0))); assertEquals(1, mapList.getToRanges().size()); - mapList = protMappings[1].getMap(); - assertEquals(3, mapList.getFromRatio()); - assertEquals(1, mapList.getToRatio()); - assertTrue(Arrays.equals(new int[] - { 1, 9 }, mapList.getFromRanges().get(0))); - assertEquals(1, mapList.getFromRanges().size()); - assertTrue(Arrays.equals(new int[] - { 1, 3 }, mapList.getToRanges().get(0))); - assertEquals(1, mapList.getToRanges().size()); + // V12346 mapped to A33333 + acf = protein.getCodonFrame(protein.getSequenceAt(1)).get(0); + assertEquals(1, acf.getdnaSeqs().length); + assertEquals(cdna.getSequenceAt(2).getDatasetSequence(), + acf.getdnaSeqs()[0]); - /* - * Inspect mapping for Mouse protein - should map to 1st/3rd/5th cDNA seqs - */ - AlignedCodonFrame mouseMapping = protein.getCodonFrame( - protein.getSequenceAt(1)).get(0); - assertEquals(3, mouseMapping.getdnaSeqs().length); - assertEquals(cdna1.getSequenceAt(0).getDatasetSequence(), - mouseMapping.getdnaSeqs()[0]); - assertEquals(cdna1.getSequenceAt(2).getDatasetSequence(), - mouseMapping.getdnaSeqs()[1]); - assertEquals(cdna1.getSequenceAt(4).getDatasetSequence(), - mouseMapping.getdnaSeqs()[2]); - - // three mappings - protMappings = mouseMapping.getProtMappings(); - assertEquals(3, protMappings.length); - - // first mapping to cDNA with start codon - mapList = protMappings[0].getMap(); - assertEquals(3, mapList.getFromRatio()); - assertEquals(1, mapList.getToRatio()); - assertTrue(Arrays.equals(new int[] - { 4, 12 }, mapList.getFromRanges().get(0))); - assertEquals(1, mapList.getFromRanges().size()); - assertTrue(Arrays.equals(new int[] - { 1, 3 }, mapList.getToRanges().get(0))); - assertEquals(1, mapList.getToRanges().size()); + // V12347 mapped to A11111 + acf = protein.getCodonFrame(protein.getSequenceAt(2)).get(0); + assertEquals(1, acf.getdnaSeqs().length); + assertEquals(cdna.getSequenceAt(0).getDatasetSequence(), + acf.getdnaSeqs()[0]); - // second mapping to cDNA with stop codon - mapList = protMappings[1].getMap(); - assertEquals(3, mapList.getFromRatio()); - assertEquals(1, mapList.getToRatio()); - assertTrue(Arrays.equals(new int[] - { 1, 9 }, mapList.getFromRanges().get(0))); - assertEquals(1, mapList.getFromRanges().size()); - assertTrue(Arrays.equals(new int[] - { 1, 3 }, mapList.getToRanges().get(0))); - assertEquals(1, mapList.getToRanges().size()); - - // third mapping to cDNA with start and stop codon - mapList = protMappings[2].getMap(); - assertEquals(3, mapList.getFromRatio()); - assertEquals(1, mapList.getToRatio()); - assertTrue(Arrays.equals(new int[] - { 4, 12 }, mapList.getFromRanges().get(0))); - assertEquals(1, mapList.getFromRanges().size()); - assertTrue(Arrays.equals(new int[] - { 1, 3 }, mapList.getToRanges().get(0))); - assertEquals(1, mapList.getToRanges().size()); + // no mapping involving the 'extra' A44444 + assertTrue(protein.getCodonFrame(cdna.getSequenceAt(3)).isEmpty()); } /** @@ -568,4 +444,429 @@ public class AlignmentUtilsTests assertEquals("C--H--Y-Q", prot3.getSequenceAsString()); } + /** + * Test the method that tests whether a CDNA sequence translates to a protein + * sequence + */ + @Test + public void testTranslatesAs() + { + assertTrue(AlignmentUtils.translatesAs("tttcccaaaggg".toCharArray(), 0, + "FPKG".toCharArray())); + // with start codon + assertTrue(AlignmentUtils.translatesAs("atgtttcccaaaggg".toCharArray(), + 3, "FPKG".toCharArray())); + // with stop codon1 + assertTrue(AlignmentUtils.translatesAs("tttcccaaagggtaa".toCharArray(), + 0, "FPKG".toCharArray())); + // with stop codon2 + assertTrue(AlignmentUtils.translatesAs("tttcccaaagggtag".toCharArray(), + 0, "FPKG".toCharArray())); + // with stop codon3 + assertTrue(AlignmentUtils.translatesAs("tttcccaaagggtga".toCharArray(), + 0, "FPKG".toCharArray())); + // with start and stop codon1 + assertTrue(AlignmentUtils.translatesAs( + "atgtttcccaaaggtaa".toCharArray(), 3, "FPKG".toCharArray())); + // with start and stop codon2 + assertTrue(AlignmentUtils.translatesAs( + "atgtttcccaaaggtag".toCharArray(), 3, "FPKG".toCharArray())); + // with start and stop codon3 + assertTrue(AlignmentUtils.translatesAs( + "atgtttcccaaaggtga".toCharArray(), 3, "FPKG".toCharArray())); + + // wrong protein + assertFalse(AlignmentUtils.translatesAs("tttcccaaaggg".toCharArray(), + 0, + "FPMG".toCharArray())); + } + + /** + * Test mapping of protein to cDNA, for cases where the cDNA has start and/or + * stop codons in addition to the protein coding sequence. + * + * @throws IOException + */ + @Test + public void testMapProteinToCdna_withStartAndStopCodons() + throws IOException + { + List protseqs = new ArrayList(); + protseqs.add(new Sequence("UNIPROT|V12345", "EIQ")); + protseqs.add(new Sequence("UNIPROT|V12346", "EIQ")); + protseqs.add(new Sequence("UNIPROT|V12347", "SAR")); + AlignmentI protein = new Alignment(protseqs.toArray(new SequenceI[3])); + protein.setDataset(null); + + List dnaseqs = new ArrayList(); + // start + SAR: + dnaseqs.add(new Sequence("EMBL|A11111", "ATGTCAGCACGC")); + // = EIQ + stop + dnaseqs.add(new Sequence("EMBL|A22222", "GAGATACAATAA")); + // = start +EIQ + stop + dnaseqs.add(new Sequence("EMBL|A33333", "ATGGAAATCCAGTAG")); + dnaseqs.add(new Sequence("EMBL|A44444", "GAAATTCAG")); + AlignmentI cdna = new Alignment(dnaseqs.toArray(new SequenceI[4])); + cdna.setDataset(null); + + assertTrue(AlignmentUtils.mapProteinToCdna(protein, cdna)); + + // 3 mappings made, each from 1 to 1 sequence + assertEquals(3, protein.getCodonFrames().size()); + assertEquals(1, protein.getCodonFrame(protein.getSequenceAt(0)).size()); + assertEquals(1, protein.getCodonFrame(protein.getSequenceAt(1)).size()); + assertEquals(1, protein.getCodonFrame(protein.getSequenceAt(2)).size()); + + // V12345 mapped from A22222 + AlignedCodonFrame acf = protein.getCodonFrame( + protein.getSequenceAt(0)).get(0); + assertEquals(1, acf.getdnaSeqs().length); + assertEquals(cdna.getSequenceAt(1).getDatasetSequence(), + acf.getdnaSeqs()[0]); + Mapping[] protMappings = acf.getProtMappings(); + assertEquals(1, protMappings.length); + MapList mapList = protMappings[0].getMap(); + assertEquals(3, mapList.getFromRatio()); + assertEquals(1, mapList.getToRatio()); + assertTrue(Arrays.equals(new int[] + { 1, 9 }, mapList.getFromRanges().get(0))); + assertEquals(1, mapList.getFromRanges().size()); + assertTrue(Arrays.equals(new int[] + { 1, 3 }, mapList.getToRanges().get(0))); + assertEquals(1, mapList.getToRanges().size()); + + // V12346 mapped from A33333 starting position 4 + acf = protein.getCodonFrame(protein.getSequenceAt(1)).get(0); + assertEquals(1, acf.getdnaSeqs().length); + assertEquals(cdna.getSequenceAt(2).getDatasetSequence(), + acf.getdnaSeqs()[0]); + protMappings = acf.getProtMappings(); + assertEquals(1, protMappings.length); + mapList = protMappings[0].getMap(); + assertEquals(3, mapList.getFromRatio()); + assertEquals(1, mapList.getToRatio()); + assertTrue(Arrays.equals(new int[] + { 4, 12 }, mapList.getFromRanges().get(0))); + assertEquals(1, mapList.getFromRanges().size()); + assertTrue(Arrays.equals(new int[] + { 1, 3 }, mapList.getToRanges().get(0))); + assertEquals(1, mapList.getToRanges().size()); + + // V12347 mapped to A11111 starting position 4 + acf = protein.getCodonFrame(protein.getSequenceAt(2)).get(0); + assertEquals(1, acf.getdnaSeqs().length); + assertEquals(cdna.getSequenceAt(0).getDatasetSequence(), + acf.getdnaSeqs()[0]); + protMappings = acf.getProtMappings(); + assertEquals(1, protMappings.length); + mapList = protMappings[0].getMap(); + assertEquals(3, mapList.getFromRatio()); + assertEquals(1, mapList.getToRatio()); + assertTrue(Arrays.equals(new int[] + { 4, 12 }, mapList.getFromRanges().get(0))); + assertEquals(1, mapList.getFromRanges().size()); + assertTrue(Arrays.equals(new int[] + { 1, 3 }, mapList.getToRanges().get(0))); + assertEquals(1, mapList.getToRanges().size()); + + // no mapping involving the 'extra' A44444 + assertTrue(protein.getCodonFrame(cdna.getSequenceAt(3)).isEmpty()); + } + + /** + * Test mapping of protein to cDNA, for the case where we have some sequence + * cross-references. Verify that 1-to-many mappings are made where + * cross-references exist and sequences are mappable. + * + * @throws IOException + */ + @Test + public void testMapProteinToCdna_withXrefs() throws IOException + { + List protseqs = new ArrayList(); + protseqs.add(new Sequence("UNIPROT|V12345", "EIQ")); + protseqs.add(new Sequence("UNIPROT|V12346", "EIQ")); + protseqs.add(new Sequence("UNIPROT|V12347", "SAR")); + AlignmentI protein = new Alignment(protseqs.toArray(new SequenceI[3])); + protein.setDataset(null); + + List dnaseqs = new ArrayList(); + dnaseqs.add(new Sequence("EMBL|A11111", "TCAGCACGC")); // = SAR + dnaseqs.add(new Sequence("EMBL|A22222", "ATGGAGATACAA")); // = start + EIQ + dnaseqs.add(new Sequence("EMBL|A33333", "GAAATCCAG")); // = EIQ + dnaseqs.add(new Sequence("EMBL|A44444", "GAAATTCAG")); // = EIQ + dnaseqs.add(new Sequence("EMBL|A55555", "GAGATTCAG")); // = EIQ + AlignmentI cdna = new Alignment(dnaseqs.toArray(new SequenceI[5])); + cdna.setDataset(null); + + // Xref A22222 to V12345 (should get mapped) + dnaseqs.get(1).addDBRef(new DBRefEntry("UNIPROT", "1", "V12345")); + // Xref V12345 to A44444 (should get mapped) + protseqs.get(0).addDBRef(new DBRefEntry("EMBL", "1", "A44444")); + // Xref A33333 to V12347 (sequence mismatch - should not get mapped) + dnaseqs.get(2).addDBRef(new DBRefEntry("UNIPROT", "1", "V12347")); + // as V12345 is mapped to A22222 and A44444, this leaves V12346 unmapped. + // it should get paired up with the unmapped A33333 + // A11111 should be mapped to V12347 + // A55555 is spare and has no xref so is not mapped + + assertTrue(AlignmentUtils.mapProteinToCdna(protein, cdna)); + + // 4 protein mappings made for 3 proteins, 2 to V12345, 1 each to V12346/7 + assertEquals(3, protein.getCodonFrames().size()); + assertEquals(1, protein.getCodonFrame(protein.getSequenceAt(0)).size()); + assertEquals(1, protein.getCodonFrame(protein.getSequenceAt(1)).size()); + assertEquals(1, protein.getCodonFrame(protein.getSequenceAt(2)).size()); + + // one mapping for each of the first 4 cDNA sequences + assertEquals(1, protein.getCodonFrame(cdna.getSequenceAt(0)).size()); + assertEquals(1, protein.getCodonFrame(cdna.getSequenceAt(1)).size()); + assertEquals(1, protein.getCodonFrame(cdna.getSequenceAt(2)).size()); + assertEquals(1, protein.getCodonFrame(cdna.getSequenceAt(3)).size()); + + // V12345 mapped to A22222 and A44444 + AlignedCodonFrame acf = protein.getCodonFrame( + protein.getSequenceAt(0)).get(0); + assertEquals(2, acf.getdnaSeqs().length); + assertEquals(cdna.getSequenceAt(1).getDatasetSequence(), + acf.getdnaSeqs()[0]); + assertEquals(cdna.getSequenceAt(3).getDatasetSequence(), + acf.getdnaSeqs()[1]); + + // V12346 mapped to A33333 + acf = protein.getCodonFrame(protein.getSequenceAt(1)).get(0); + assertEquals(1, acf.getdnaSeqs().length); + assertEquals(cdna.getSequenceAt(2).getDatasetSequence(), + acf.getdnaSeqs()[0]); + + // V12347 mapped to A11111 + acf = protein.getCodonFrame(protein.getSequenceAt(2)).get(0); + assertEquals(1, acf.getdnaSeqs().length); + assertEquals(cdna.getSequenceAt(0).getDatasetSequence(), + acf.getdnaSeqs()[0]); + + // no mapping involving the 'extra' A55555 + assertTrue(protein.getCodonFrame(cdna.getSequenceAt(4)).isEmpty()); + } + + /** + * Test mapping of protein to cDNA, for the case where we have some sequence + * cross-references. Verify that once we have made an xref mapping we don't + * also map un-xrefd sequeces. + * + * @throws IOException + */ + @Test + public void testMapProteinToCdna_prioritiseXrefs() throws IOException + { + List protseqs = new ArrayList(); + protseqs.add(new Sequence("UNIPROT|V12345", "EIQ")); + protseqs.add(new Sequence("UNIPROT|V12346", "EIQ")); + AlignmentI protein = new Alignment( + protseqs.toArray(new SequenceI[protseqs.size()])); + protein.setDataset(null); + + List dnaseqs = new ArrayList(); + dnaseqs.add(new Sequence("EMBL|A11111", "GAAATCCAG")); // = EIQ + dnaseqs.add(new Sequence("EMBL|A22222", "GAAATTCAG")); // = EIQ + AlignmentI cdna = new Alignment(dnaseqs.toArray(new SequenceI[dnaseqs + .size()])); + cdna.setDataset(null); + + // Xref A22222 to V12345 (should get mapped) + // A11111 should then be mapped to the unmapped V12346 + dnaseqs.get(1).addDBRef(new DBRefEntry("UNIPROT", "1", "V12345")); + + assertTrue(AlignmentUtils.mapProteinToCdna(protein, cdna)); + + // 2 protein mappings made + assertEquals(2, protein.getCodonFrames().size()); + assertEquals(1, protein.getCodonFrame(protein.getSequenceAt(0)).size()); + assertEquals(1, protein.getCodonFrame(protein.getSequenceAt(1)).size()); + + // one mapping for each of the cDNA sequences + assertEquals(1, protein.getCodonFrame(cdna.getSequenceAt(0)).size()); + assertEquals(1, protein.getCodonFrame(cdna.getSequenceAt(1)).size()); + + // V12345 mapped to A22222 + AlignedCodonFrame acf = protein.getCodonFrame(protein.getSequenceAt(0)) + .get(0); + assertEquals(1, acf.getdnaSeqs().length); + assertEquals(cdna.getSequenceAt(1).getDatasetSequence(), + acf.getdnaSeqs()[0]); + + // V12346 mapped to A11111 + acf = protein.getCodonFrame(protein.getSequenceAt(1)).get(0); + assertEquals(1, acf.getdnaSeqs().length); + assertEquals(cdna.getSequenceAt(0).getDatasetSequence(), + acf.getdnaSeqs()[0]); + } + + /** + * Test the method that shows or hides sequence annotations by type(s) and + * selection group. + */ + @Test + public void testShowOrHideSequenceAnnotations() + { + SequenceI seq1 = new Sequence("Seq1", "AAA"); + SequenceI seq2 = new Sequence("Seq2", "BBB"); + SequenceI seq3 = new Sequence("Seq3", "CCC"); + Annotation[] anns = new Annotation[] + { new Annotation(2f) }; + AlignmentAnnotation ann1 = new AlignmentAnnotation("Structure", "ann1", + anns); + ann1.setSequenceRef(seq1); + AlignmentAnnotation ann2 = new AlignmentAnnotation("Structure", "ann2", + anns); + ann2.setSequenceRef(seq2); + AlignmentAnnotation ann3 = new AlignmentAnnotation("Structure", "ann3", + anns); + AlignmentAnnotation ann4 = new AlignmentAnnotation("Temp", "ann4", anns); + ann4.setSequenceRef(seq1); + AlignmentAnnotation ann5 = new AlignmentAnnotation("Temp", "ann5", anns); + ann5.setSequenceRef(seq2); + AlignmentAnnotation ann6 = new AlignmentAnnotation("Temp", "ann6", anns); + AlignmentI al = new Alignment(new SequenceI[] {seq1, seq2, seq3}); + al.addAnnotation(ann1); // Structure for Seq1 + al.addAnnotation(ann2); // Structure for Seq2 + al.addAnnotation(ann3); // Structure for no sequence + al.addAnnotation(ann4); // Temp for seq1 + al.addAnnotation(ann5); // Temp for seq2 + al.addAnnotation(ann6); // Temp for no sequence + List types = new ArrayList(); + List scope = new ArrayList(); + + /* + * Set all sequence related Structure to hidden (ann1, ann2) + */ + types.add("Structure"); + AlignmentUtils.showOrHideSequenceAnnotations(al, types, null, false, + false); + assertFalse(ann1.visible); + assertFalse(ann2.visible); + assertTrue(ann3.visible); // not sequence-related, not affected + assertTrue(ann4.visible); // not Structure, not affected + assertTrue(ann5.visible); // " + assertTrue(ann6.visible); // not sequence-related, not affected + + /* + * Set Temp in {seq1, seq3} to hidden + */ + types.clear(); + types.add("Temp"); + scope.add(seq1); + scope.add(seq3); + AlignmentUtils.showOrHideSequenceAnnotations(al, types, scope, false, + false); + assertFalse(ann1.visible); // unchanged + assertFalse(ann2.visible); // unchanged + assertTrue(ann3.visible); // not sequence-related, not affected + assertFalse(ann4.visible); // Temp for seq1 hidden + assertTrue(ann5.visible); // not in scope, not affected + assertTrue(ann6.visible); // not sequence-related, not affected + + /* + * Set Temp in all sequences to hidden + */ + types.clear(); + types.add("Temp"); + scope.add(seq1); + scope.add(seq3); + AlignmentUtils.showOrHideSequenceAnnotations(al, types, null, false, + false); + assertFalse(ann1.visible); // unchanged + assertFalse(ann2.visible); // unchanged + assertTrue(ann3.visible); // not sequence-related, not affected + assertFalse(ann4.visible); // Temp for seq1 hidden + assertFalse(ann5.visible); // Temp for seq2 hidden + assertTrue(ann6.visible); // not sequence-related, not affected + + /* + * Set all types in {seq1, seq3} to visible + */ + types.clear(); + scope.clear(); + scope.add(seq1); + scope.add(seq3); + AlignmentUtils.showOrHideSequenceAnnotations(al, types, scope, true, + true); + assertTrue(ann1.visible); // Structure for seq1 set visible + assertFalse(ann2.visible); // not in scope, unchanged + assertTrue(ann3.visible); // not sequence-related, not affected + assertTrue(ann4.visible); // Temp for seq1 set visible + assertFalse(ann5.visible); // not in scope, unchanged + assertTrue(ann6.visible); // not sequence-related, not affected + + /* + * Set all types in all scope to hidden + */ + AlignmentUtils.showOrHideSequenceAnnotations(al, types, null, true, + false); + assertFalse(ann1.visible); + assertFalse(ann2.visible); + assertTrue(ann3.visible); // not sequence-related, not affected + assertFalse(ann4.visible); + assertFalse(ann5.visible); + assertTrue(ann6.visible); // not sequence-related, not affected + } + + /** + * Tests for the method that checks if one sequence cross-references another + */ + @Test + public void testHasCrossRef() + { + assertFalse(AlignmentUtils.hasCrossRef(null, null)); + SequenceI seq1 = new Sequence("EMBL|A12345", "ABCDEF"); + assertFalse(AlignmentUtils.hasCrossRef(seq1, null)); + assertFalse(AlignmentUtils.hasCrossRef(null, seq1)); + SequenceI seq2 = new Sequence("UNIPROT|V20192", "ABCDEF"); + assertFalse(AlignmentUtils.hasCrossRef(seq1, seq2)); + + // different ref + seq1.addDBRef(new DBRefEntry("UNIPROT", "1", "v20193")); + assertFalse(AlignmentUtils.hasCrossRef(seq1, seq2)); + + // case-insensitive; version number is ignored + seq1.addDBRef(new DBRefEntry("UNIPROT", "1", "v20192")); + assertTrue(AlignmentUtils.hasCrossRef(seq1, seq2)); + + // right case! + seq1.addDBRef(new DBRefEntry("UNIPROT", "1", "V20192")); + assertTrue(AlignmentUtils.hasCrossRef(seq1, seq2)); + // test is one-way only + assertFalse(AlignmentUtils.hasCrossRef(seq2, seq1)); + } + + /** + * Tests for the method that checks if either sequence cross-references the + * other + */ + @Test + public void testHaveCrossRef() + { + assertFalse(AlignmentUtils.hasCrossRef(null, null)); + SequenceI seq1 = new Sequence("EMBL|A12345", "ABCDEF"); + assertFalse(AlignmentUtils.haveCrossRef(seq1, null)); + assertFalse(AlignmentUtils.haveCrossRef(null, seq1)); + SequenceI seq2 = new Sequence("UNIPROT|V20192", "ABCDEF"); + assertFalse(AlignmentUtils.haveCrossRef(seq1, seq2)); + + seq1.addDBRef(new DBRefEntry("UNIPROT", "1", "V20192")); + assertTrue(AlignmentUtils.haveCrossRef(seq1, seq2)); + // next is true for haveCrossRef, false for hasCrossRef + assertTrue(AlignmentUtils.haveCrossRef(seq2, seq1)); + + // now the other way round + seq1.setDBRef(null); + seq2.addDBRef(new DBRefEntry("EMBL", "1", "A12345")); + assertTrue(AlignmentUtils.haveCrossRef(seq1, seq2)); + assertTrue(AlignmentUtils.haveCrossRef(seq2, seq1)); + + // now both ways + seq1.addDBRef(new DBRefEntry("UNIPROT", "1", "V20192")); + assertTrue(AlignmentUtils.haveCrossRef(seq1, seq2)); + assertTrue(AlignmentUtils.haveCrossRef(seq2, seq1)); + } }