ranges = new ArrayList<>();
int[] result = MappingUtils.listToArray(ranges);
assertEquals(result.length, 0);
ranges.add(new int[] { 24, 12 });
result = MappingUtils.listToArray(ranges);
assertEquals(result.length, 2);
assertEquals(result[0], 24);
assertEquals(result[1], 12);
ranges.add(new int[] { -7, 30 });
result = MappingUtils.listToArray(ranges);
assertEquals(result.length, 4);
assertEquals(result[0], 24);
assertEquals(result[1], 12);
assertEquals(result[2], -7);
assertEquals(result[3], 30);
try
{
MappingUtils.listToArray(null);
fail("Expected exception");
} catch (NullPointerException e)
{
// expected
}
}
/**
* Test mapping a sequence group where sequences in and outside the group
* share a dataset sequence (e.g. alternative CDS for the same gene)
*
* This scenario doesn't arise after JAL-3763 changes, but test left as still
* valid
*
* @throws IOException
*/
@Test(groups = { "Functional" })
public void testMapSequenceGroup_sharedDataset() throws IOException
{
/*
* Set up dna and protein Seq1/2/3 with mappings (held on the protein
* viewport). CDS sequences share the same 'gene' dataset sequence.
*/
SequenceI dna = new Sequence("dna", "aaatttgggcccaaatttgggccc");
SequenceI cds1 = new Sequence("cds1/1-6", "aaattt");
SequenceI cds2 = new Sequence("cds1/4-9", "tttggg");
SequenceI cds3 = new Sequence("cds1/19-24", "gggccc");
cds1.setDatasetSequence(dna);
cds2.setDatasetSequence(dna);
cds3.setDatasetSequence(dna);
SequenceI pep1 = new Sequence("pep1", "KF");
SequenceI pep2 = new Sequence("pep2", "FG");
SequenceI pep3 = new Sequence("pep3", "GP");
pep1.createDatasetSequence();
pep2.createDatasetSequence();
pep3.createDatasetSequence();
/*
* add mappings from coding positions of dna to respective peptides
*/
AlignedCodonFrame acf = new AlignedCodonFrame();
acf.addMap(dna, pep1,
new MapList(new int[]
{ 1, 6 }, new int[] { 1, 2 }, 3, 1));
acf.addMap(dna, pep2,
new MapList(new int[]
{ 4, 9 }, new int[] { 1, 2 }, 3, 1));
acf.addMap(dna, pep3,
new MapList(new int[]
{ 19, 24 }, new int[] { 1, 2 }, 3, 1));
List acfList = Arrays
.asList(new AlignedCodonFrame[]
{ acf });
AlignmentI cdna = new Alignment(new SequenceI[] { cds1, cds2, cds3 });
AlignmentI protein = new Alignment(
new SequenceI[]
{ pep1, pep2, pep3 });
AlignViewportI cdnaView = new AlignViewport(cdna);
AlignViewportI peptideView = new AlignViewport(protein);
protein.setCodonFrames(acfList);
/*
* Select pep1 and pep3 in the protein alignment
*/
SequenceGroup sg = new SequenceGroup();
sg.setColourText(true);
sg.setIdColour(Color.GREEN);
sg.setOutlineColour(Color.LIGHT_GRAY);
sg.addSequence(pep1, false);
sg.addSequence(pep3, false);
sg.setEndRes(protein.getWidth() - 1);
/*
* Verify the mapped sequence group in dna is cds1 and cds3
*/
SequenceGroup mappedGroup = MappingUtils.mapSequenceGroup(sg,
peptideView, cdnaView);
assertTrue(mappedGroup.getColourText());
assertSame(sg.getIdColour(), mappedGroup.getIdColour());
assertSame(sg.getOutlineColour(), mappedGroup.getOutlineColour());
assertEquals(2, mappedGroup.getSequences().size());
assertSame(cds1, mappedGroup.getSequences().get(0));
assertSame(cds3, mappedGroup.getSequences().get(1));
// columns 1-6 selected (0-5 base zero)
assertEquals(0, mappedGroup.getStartRes());
assertEquals(5, mappedGroup.getEndRes());
/*
* Select mapping sequence group from dna to protein
*/
sg.clear();
sg.addSequence(cds2, false);
sg.addSequence(cds1, false);
sg.setStartRes(0);
sg.setEndRes(cdna.getWidth() - 1);
mappedGroup = MappingUtils.mapSequenceGroup(sg, cdnaView, peptideView);
assertTrue(mappedGroup.getColourText());
assertSame(sg.getIdColour(), mappedGroup.getIdColour());
assertSame(sg.getOutlineColour(), mappedGroup.getOutlineColour());
assertEquals(2, mappedGroup.getSequences().size());
assertSame(protein.getSequenceAt(1), mappedGroup.getSequences().get(0));
assertSame(protein.getSequenceAt(0), mappedGroup.getSequences().get(1));
assertEquals(0, mappedGroup.getStartRes());
assertEquals(1, mappedGroup.getEndRes()); // two columns
}
@Test(groups = "Functional")
public void testFindOverlap()
{
List ranges = new ArrayList<>();
ranges.add(new int[] { 4, 8 });
ranges.add(new int[] { 10, 12 });
ranges.add(new int[] { 16, 19 });
int[] overlap = MappingUtils.findOverlap(ranges, 5, 13);
assertArrayEquals(overlap, new int[] { 5, 12 });
overlap = MappingUtils.findOverlap(ranges, -100, 100);
assertArrayEquals(overlap, new int[] { 4, 19 });
overlap = MappingUtils.findOverlap(ranges, 7, 17);
assertArrayEquals(overlap, new int[] { 7, 17 });
overlap = MappingUtils.findOverlap(ranges, 13, 15);
assertNull(overlap);
}
/**
* Test mapping a sequence group including a sequence which maps to more than
* one other sequence
*
* @throws IOException
*/
@Test(groups = { "Functional" })
public void testMapSequenceGroup_oneToMany() throws IOException
{
/*
* Uniprot:FER2_ARATH has cross-refs to 10 EMBLCDS sequences;
* we'll just mimic 3 of them here (abbreviated)
* From EMBLCDS|BAE98526 [ [1, 444] ] 3:1 to [ [1, 148] ] FER2_ARATH
* From EMBLCDS|AAM91336 same
* From EMBLCDS|AAM13033 same
*/
String coding = "atggcttccactgctctctca";
AlignmentI cds = loadAlignment(">BAE98526\n" + coding + "\n>AAM91336\n"
+ coding + "\n>AAM13033\n" + coding + "\n",
FileFormat.Fasta);
cds.setDataset(null);
AlignmentI protein = loadAlignment(">FER2_ARATH\nMASTALS\n",
FileFormat.Fasta);
protein.setDataset(null);
AlignedCodonFrame acf = new AlignedCodonFrame();
MapList map = new MapList(new int[] { 1, 21 }, new int[] { 1, 7 }, 3, 1);
for (int seq = 0; seq < 3; seq++)
{
acf.addMap(cds.getSequenceAt(seq).getDatasetSequence(),
protein.getSequenceAt(0).getDatasetSequence(), map);
}
List acfList = Arrays
.asList(new AlignedCodonFrame[]
{ acf });
AlignViewportI theDnaView = new AlignViewport(cds);
AlignViewportI theProteinView = new AlignViewport(protein);
protein.setCodonFrames(acfList);
/*
* Select FER2_ARATH in the protein
*/
SequenceGroup sg = new SequenceGroup();
sg.setColourText(true);
sg.setIdColour(Color.GREEN);
sg.setOutlineColour(Color.LIGHT_GRAY);
sg.addSequence(protein.getSequenceAt(0), false);
sg.setEndRes(protein.getWidth() - 1);
/*
* Verify the mapped sequence group in dna
*/
SequenceGroup mappedGroup = MappingUtils.mapSequenceGroup(sg,
theProteinView, theDnaView);
assertTrue(mappedGroup.getColourText());
assertSame(sg.getIdColour(), mappedGroup.getIdColour());
assertSame(sg.getOutlineColour(), mappedGroup.getOutlineColour());
assertEquals(3, mappedGroup.getSequences().size());
assertSame(cds.getSequenceAt(0), mappedGroup.getSequences().get(0));
assertSame(cds.getSequenceAt(1), mappedGroup.getSequences().get(1));
assertSame(cds.getSequenceAt(2), mappedGroup.getSequences().get(2));
assertEquals(0, mappedGroup.getStartRes());
assertEquals(20, mappedGroup.getEndRes()); // 21 columns (7 codons)
/*
* Select 2 CDS, verify peptide is mapped
*/
sg.clear();
sg.addSequence(cds.getSequenceAt(1), false);
sg.addSequence(cds.getSequenceAt(0), false);
sg.setStartRes(0);
sg.setEndRes(20);
mappedGroup = MappingUtils.mapSequenceGroup(sg, theDnaView,
theProteinView);
assertTrue(mappedGroup.getColourText());
assertSame(sg.getIdColour(), mappedGroup.getIdColour());
assertSame(sg.getOutlineColour(), mappedGroup.getOutlineColour());
assertEquals(1, mappedGroup.getSequences().size());
assertSame(protein.getSequenceAt(0), mappedGroup.getSequences().get(0));
assertEquals(0, mappedGroup.getStartRes());
assertEquals(6, mappedGroup.getEndRes());
}
}