import jalview.io.FileFormat;
import jalview.io.FileFormatI;
import jalview.io.FormatAdapter;
+import jalview.io.gff.SequenceOntologyI;
import jalview.util.MapList;
import jalview.util.MappingUtils;
+import jalview.ws.params.InvalidArgumentException;
import java.io.IOException;
import java.util.ArrayList;
assertTrue(AlignmentUtils.haveCrossRef(seq2, seq1));
// now the other way round
- seq1.setDBRefs(null);
+ try {
+ seq1.setDBRefs(null);
+ } catch (InvalidArgumentException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
seq2.addDBRef(new DBRefEntry("EMBL", "1", "A12345"));
assertTrue(AlignmentUtils.haveCrossRef(seq1, seq2));
assertTrue(AlignmentUtils.haveCrossRef(seq2, seq1));
DBRefEntry dna1xref = new DBRefEntry("UNIPROT", "ENSEMBL", "pep1",
new Mapping(mapfordna1));
dna1.addDBRef(dna1xref);
- assertEquals(2, dna1.getDBRefs().length); // to self and to pep1
+ assertEquals(2, dna1.getDBRefs().size()); // to self and to pep1
DBRefEntry dna2xref = new DBRefEntry("UNIPROT", "ENSEMBL", "pep2",
new Mapping(mapfordna2));
dna2.addDBRef(dna2xref);
- assertEquals(2, dna2.getDBRefs().length); // to self and to pep2
+ assertEquals(2, dna2.getDBRefs().size()); // to self and to pep2
/*
* execute method under test:
* verify CDS has a dbref with mapping to peptide
*/
assertNotNull(cds1Dss.getDBRefs());
- assertEquals(2, cds1Dss.getDBRefs().length);
- dbref = cds1Dss.getDBRefs()[0];
+ assertEquals(2, cds1Dss.getDBRefs().size());
+ dbref = cds1Dss.getDBRefs().get(0);
assertEquals(dna1xref.getSource(), dbref.getSource());
// version is via ensembl's primary ref
assertEquals(dna1xref.getVersion(), dbref.getVersion());
*/
assertNotNull(pep1.getDBRefs());
// FIXME pep1.getDBRefs() is 1 - is that the correct behaviour ?
- assertEquals(2, pep1.getDBRefs().length);
- dbref = pep1.getDBRefs()[1];
+ assertEquals(2, pep1.getDBRefs().size());
+ dbref = pep1.getDBRefs().get(1);
assertEquals("ENSEMBL", dbref.getSource());
assertEquals("0", dbref.getVersion());
assertEquals("CDS|dna1", dbref.getAccessionId());
/*
* verify cDNA has added a dbref with mapping to CDS
*/
- assertEquals(3, dna1.getDBRefs().length);
- DBRefEntry dbRefEntry = dna1.getDBRefs()[2];
+ assertEquals(3, dna1.getDBRefs().size());
+ DBRefEntry dbRefEntry = dna1.getDBRefs().get(2);
assertSame(cds1Dss, dbRefEntry.getMap().getTo());
MapList dnaToCdsMapping = new MapList(new int[] { 4, 6, 10, 12 },
new int[] { 1, 6 }, 1, 1);
assertEquals(dnaToCdsMapping, dbRefEntry.getMap().getMap());
- assertEquals(3, dna2.getDBRefs().length);
- dbRefEntry = dna2.getDBRefs()[2];
+ assertEquals(3, dna2.getDBRefs().size());
+ dbRefEntry = dna2.getDBRefs().get(2);
assertSame(cds2Dss, dbRefEntry.getMap().getTo());
dnaToCdsMapping = new MapList(new int[] { 1, 3, 7, 9, 13, 15 },
new int[] { 1, 9 }, 1, 1);
/*
* verify CDS has added a dbref with mapping to cDNA
*/
- assertEquals(2, cds1Dss.getDBRefs().length);
- dbRefEntry = cds1Dss.getDBRefs()[1];
+ assertEquals(2, cds1Dss.getDBRefs().size());
+ dbRefEntry = cds1Dss.getDBRefs().get(1);
assertSame(dna1.getDatasetSequence(), dbRefEntry.getMap().getTo());
MapList cdsToDnaMapping = new MapList(new int[] { 1, 6 }, new int[] {
4, 6, 10, 12 }, 1, 1);
assertEquals(cdsToDnaMapping, dbRefEntry.getMap().getMap());
- assertEquals(2, cds2Dss.getDBRefs().length);
- dbRefEntry = cds2Dss.getDBRefs()[1];
+ assertEquals(2, cds2Dss.getDBRefs().size());
+ dbRefEntry = cds2Dss.getDBRefs().get(1);
assertSame(dna2.getDatasetSequence(), dbRefEntry.getMap().getTo());
cdsToDnaMapping = new MapList(new int[] { 1, 9 }, new int[] { 1, 3, 7,
9, 13, 15 }, 1, 1);
String dbSnp = "dbSNP";
String cosmic = "COSMIC";
+ /*
+ * NB setting "id" (as returned by Ensembl for features in JSON format);
+ * previously "ID" (as returned for GFF3 format)
+ */
SequenceFeature sf1 = new SequenceFeature("sequence_variant", "", 1, 1,
0f, ensembl);
sf1.setValue("alleles", "A,G"); // AAA -> GAA -> K/E
- sf1.setValue("ID", "var1.125A>G");
+ sf1.setValue("id", "var1.125A>G");
SequenceFeature sf2 = new SequenceFeature("sequence_variant", "", 1, 1,
0f, dbSnp);
sf2.setValue("alleles", "A,C"); // AAA -> CAA -> K/Q
- sf2.setValue("ID", "var2");
+ sf2.setValue("id", "var2");
sf2.setValue("clinical_significance", "Dodgy");
SequenceFeature sf3 = new SequenceFeature("sequence_variant", "", 1, 1,
0f, dbSnp);
sf3.setValue("alleles", "A,T"); // AAA -> TAA -> stop codon
- sf3.setValue("ID", "var3");
+ sf3.setValue("id", "var3");
sf3.setValue("clinical_significance", "Bad");
SequenceFeature sf4 = new SequenceFeature("sequence_variant", "", 3, 3,
0f, cosmic);
sf4.setValue("alleles", "A,G"); // AAA -> AAG synonymous
- sf4.setValue("ID", "var4");
+ sf4.setValue("id", "var4");
sf4.setValue("clinical_significance", "None");
SequenceFeature sf5 = new SequenceFeature("sequence_variant", "", 3, 3,
0f, ensembl);
sf5.setValue("alleles", "A,T"); // AAA -> AAT -> K/N
- sf5.setValue("ID", "sequence_variant:var5"); // prefix gets stripped off
+ sf5.setValue("id", "sequence_variant:var5"); // prefix gets stripped off
sf5.setValue("clinical_significance", "Benign");
SequenceFeature sf6 = new SequenceFeature("sequence_variant", "", 6, 6,
0f, dbSnp);
sf6.setValue("alleles", "T,C"); // TTT -> TTC synonymous
- sf6.setValue("ID", "var6");
+ sf6.setValue("id", "var6");
SequenceFeature sf7 = new SequenceFeature("sequence_variant", "", 8, 8,
0f, cosmic);
sf7.setValue("alleles", "C,A,G"); // CCC -> CAC,CGC -> P/H/R
- sf7.setValue("ID", "var7");
+ sf7.setValue("id", "var7");
sf7.setValue("clinical_significance", "Good");
List<DnaVariant> codon1Variants = new ArrayList<>();
List<DnaVariant> codon2Variants = new ArrayList<>();
List<DnaVariant> codon3Variants = new ArrayList<>();
+
List<DnaVariant> codonVariants[] = new ArrayList[3];
codonVariants[0] = codon1Variants;
codonVariants[1] = codon2Variants;
assertEquals(1, sf.getEnd());
assertEquals("nonsynonymous_variant", sf.getType());
assertEquals("p.Lys1Asn", sf.getDescription());
- assertEquals("var5", sf.getValue("ID"));
+ assertEquals("var5", sf.getValue("id"));
assertEquals("Benign", sf.getValue("clinical_significance"));
- assertEquals("ID=var5;clinical_significance=Benign",
+ assertEquals("id=var5;clinical_significance=Benign",
sf.getAttributes());
assertEquals(1, sf.links.size());
assertEquals(
assertEquals(1, sf.getEnd());
assertEquals("nonsynonymous_variant", sf.getType());
assertEquals("p.Lys1Gln", sf.getDescription());
- assertEquals("var2", sf.getValue("ID"));
+ assertEquals("var2", sf.getValue("id"));
assertEquals("Dodgy", sf.getValue("clinical_significance"));
- assertEquals("ID=var2;clinical_significance=Dodgy", sf.getAttributes());
+ assertEquals("id=var2;clinical_significance=Dodgy", sf.getAttributes());
assertEquals(1, sf.links.size());
assertEquals(
"p.Lys1Gln var2|http://www.ensembl.org/Homo_sapiens/Variation/Summary?v=var2",
assertEquals(1, sf.getEnd());
assertEquals("nonsynonymous_variant", sf.getType());
assertEquals("p.Lys1Glu", sf.getDescription());
- assertEquals("var1.125A>G", sf.getValue("ID"));
+ assertEquals("var1.125A>G", sf.getValue("id"));
assertNull(sf.getValue("clinical_significance"));
- assertEquals("ID=var1.125A>G", sf.getAttributes());
+ assertEquals("id=var1.125A>G", sf.getAttributes());
assertEquals(1, sf.links.size());
// link to variation is urlencoded
assertEquals(
assertEquals(1, sf.getBegin());
assertEquals(1, sf.getEnd());
assertEquals("stop_gained", sf.getType());
- assertEquals("TAA", sf.getDescription());
- assertEquals("var3", sf.getValue("ID"));
+ assertEquals("Aaa/Taa", sf.getDescription());
+ assertEquals("var3", sf.getValue("id"));
assertEquals("Bad", sf.getValue("clinical_significance"));
- assertEquals("ID=var3;clinical_significance=Bad", sf.getAttributes());
+ assertEquals("id=var3;clinical_significance=Bad", sf.getAttributes());
assertEquals(1, sf.links.size());
assertEquals(
- "TAA var3|http://www.ensembl.org/Homo_sapiens/Variation/Summary?v=var3",
+ "Aaa/Taa var3|http://www.ensembl.org/Homo_sapiens/Variation/Summary?v=var3",
sf.links.get(0));
assertEquals(dbSnp, sf.getFeatureGroup());
assertEquals(1, sf.getBegin());
assertEquals(1, sf.getEnd());
assertEquals("synonymous_variant", sf.getType());
- assertEquals("AAG", sf.getDescription());
- assertEquals("var4", sf.getValue("ID"));
+ assertEquals("aaA/aaG", sf.getDescription());
+ assertEquals("var4", sf.getValue("id"));
assertEquals("None", sf.getValue("clinical_significance"));
- assertEquals("ID=var4;clinical_significance=None", sf.getAttributes());
+ assertEquals("id=var4;clinical_significance=None", sf.getAttributes());
assertEquals(1, sf.links.size());
assertEquals(
- "AAG var4|http://www.ensembl.org/Homo_sapiens/Variation/Summary?v=var4",
+ "aaA/aaG var4|http://www.ensembl.org/Homo_sapiens/Variation/Summary?v=var4",
sf.links.get(0));
assertEquals(cosmic, sf.getFeatureGroup());
assertEquals(2, sf.getBegin());
assertEquals(2, sf.getEnd());
assertEquals("synonymous_variant", sf.getType());
- assertEquals("TTC", sf.getDescription());
- assertEquals("var6", sf.getValue("ID"));
+ assertEquals("ttT/ttC", sf.getDescription());
+ assertEquals("var6", sf.getValue("id"));
assertNull(sf.getValue("clinical_significance"));
- assertEquals("ID=var6", sf.getAttributes());
+ assertEquals("id=var6", sf.getAttributes());
assertEquals(1, sf.links.size());
assertEquals(
- "TTC var6|http://www.ensembl.org/Homo_sapiens/Variation/Summary?v=var6",
+ "ttT/ttC var6|http://www.ensembl.org/Homo_sapiens/Variation/Summary?v=var6",
sf.links.get(0));
assertEquals(dbSnp, sf.getFeatureGroup());
assertEquals(3, sf.getEnd());
assertEquals("nonsynonymous_variant", sf.getType());
assertEquals("p.Pro3Arg", sf.getDescription());
- assertEquals("var7", sf.getValue("ID"));
+ assertEquals("var7", sf.getValue("id"));
assertEquals("Good", sf.getValue("clinical_significance"));
- assertEquals("ID=var7;clinical_significance=Good", sf.getAttributes());
+ assertEquals("id=var7;clinical_significance=Good", sf.getAttributes());
assertEquals(1, sf.links.size());
assertEquals(
"p.Pro3Arg var7|http://www.ensembl.org/Homo_sapiens/Variation/Summary?v=var7",
assertEquals(3, sf.getEnd());
assertEquals("nonsynonymous_variant", sf.getType());
assertEquals("p.Pro3His", sf.getDescription());
- assertEquals("var7", sf.getValue("ID"));
+ assertEquals("var7", sf.getValue("id"));
assertEquals("Good", sf.getValue("clinical_significance"));
- assertEquals("ID=var7;clinical_significance=Good", sf.getAttributes());
+ assertEquals("id=var7;clinical_significance=Good", sf.getAttributes());
assertEquals(1, sf.links.size());
assertEquals(
"p.Pro3His var7|http://www.ensembl.org/Homo_sapiens/Variation/Summary?v=var7",
assertEquals(2, toMap.getFromRanges().get(0).length);
assertEquals(1, toMap.getFromRanges().get(0)[0]);
assertEquals(12, toMap.getFromRanges().get(0)[1]);
- assertEquals(1, toMap.getToRanges().size());
- assertEquals(4, toMap.getToRanges().get(0).length);
+ assertEquals(2, toMap.getToRanges().size());
+ assertEquals(2, toMap.getToRanges().get(0).length);
assertEquals(158, toMap.getToRanges().get(0)[0]);
assertEquals(164, toMap.getToRanges().get(0)[1]);
- assertEquals(210, toMap.getToRanges().get(0)[2]);
- assertEquals(214, toMap.getToRanges().get(0)[3]);
+ assertEquals(210, toMap.getToRanges().get(1)[0]);
+ assertEquals(214, toMap.getToRanges().get(1)[1]);
// or summarised as (but toString might change in future):
- assertEquals("[ [1, 12] ] 1:1 to [ [158, 164, 210, 214] ]",
+ assertEquals("[ [1, 12] ] 1:1 to [ [158, 164] [210, 214] ]",
toMap.toString());
/*
assertEquals("GRCh38", toLoci.getAssemblyId());
assertEquals("7", toLoci.getChromosomeId());
toMap = toLoci.getMap();
- assertEquals("[ [1, 12] ] 1:1 to [ [158, 164, 210, 214] ]",
+ assertEquals("[ [1, 12] ] 1:1 to [ [158, 164] [210, 214] ]",
toMap.toString());
}
* Case 2: CDS 3 times length of peptide + stop codon
* (note code does not currently check trailing codon is a stop codon)
*/
- dna = new Sequence("dna", "AACGacgtCTCCTTGA");
+ dna = new Sequence("dna", "AACGacgtCTCCTCCC");
dna.createDatasetSequence();
dna.addSequenceFeature(new SequenceFeature("CDS", "", 1, 4, null));
dna.addSequenceFeature(new SequenceFeature("CDS", "", 9, 16, null));
Arrays.deepToString(ml.getFromRanges().toArray()));
/*
- * Case 3: CDS not 3 times length of peptide - no mapping is made
+ * Case 3: CDS longer than 3 * peptide + stop codon - no mapping is made
+ */
+ dna = new Sequence("dna", "AACGacgtCTCCTTGATCA");
+ dna.createDatasetSequence();
+ dna.addSequenceFeature(new SequenceFeature("CDS", "", 1, 4, null));
+ dna.addSequenceFeature(new SequenceFeature("CDS", "", 9, 19, null));
+ ml = AlignmentUtils.mapCdsToProtein(dna, peptide);
+ assertNull(ml);
+
+ /*
+ * Case 4: CDS shorter than 3 * peptide - no mapping is made
+ */
+ dna = new Sequence("dna", "AACGacgtCTCC");
+ dna.createDatasetSequence();
+ dna.addSequenceFeature(new SequenceFeature("CDS", "", 1, 4, null));
+ dna.addSequenceFeature(new SequenceFeature("CDS", "", 9, 12, null));
+ ml = AlignmentUtils.mapCdsToProtein(dna, peptide);
+ assertNull(ml);
+
+ /*
+ * Case 5: CDS 3 times length of peptide + part codon - mapping is truncated
*/
dna = new Sequence("dna", "AACGacgtCTCCTTG");
dna.createDatasetSequence();
dna.addSequenceFeature(new SequenceFeature("CDS", "", 1, 4, null));
dna.addSequenceFeature(new SequenceFeature("CDS", "", 9, 15, null));
ml = AlignmentUtils.mapCdsToProtein(dna, peptide);
- assertNull(ml);
+ assertEquals(3, ml.getFromRatio());
+ assertEquals(1, ml.getToRatio());
+ assertEquals("[[1, 3]]",
+ Arrays.deepToString(ml.getToRanges().toArray()));
+ assertEquals("[[1, 4], [9, 13]]",
+ Arrays.deepToString(ml.getFromRanges().toArray()));
/*
- * Case 4: incomplete start codon corresponding to X in peptide
+ * Case 6: incomplete start codon corresponding to X in peptide
*/
dna = new Sequence("dna", "ACGacgtCTCCTTGG");
dna.createDatasetSequence();
assertEquals("[[3, 3], [8, 12]]",
Arrays.deepToString(ml.getFromRanges().toArray()));
}
+
+ /**
+ * Tests for the method that locates the CDS sequence that has a mapping to
+ * the given protein. That is, given a transcript-to-peptide mapping, find the
+ * cds-to-peptide mapping that relates to both, and return the CDS sequence.
+ */
+ @Test
+ public void testFindCdsForProtein()
+ {
+ List<AlignedCodonFrame> mappings = new ArrayList<>();
+ AlignedCodonFrame acf1 = new AlignedCodonFrame();
+ mappings.add(acf1);
+
+ SequenceI dna1 = new Sequence("dna1", "cgatATcgGCTATCTATGacg");
+ dna1.createDatasetSequence();
+
+ // NB we currently exclude STOP codon from CDS sequences
+ // the test would need to change if this changes in future
+ SequenceI cds1 = new Sequence("cds1", "ATGCTATCT");
+ cds1.createDatasetSequence();
+
+ SequenceI pep1 = new Sequence("pep1", "MLS");
+ pep1.createDatasetSequence();
+ List<AlignedCodonFrame> seqMappings = new ArrayList<>();
+ MapList mapList = new MapList(
+ new int[]
+ { 5, 6, 9, 15 }, new int[] { 1, 3 }, 3, 1);
+ Mapping dnaToPeptide = new Mapping(pep1.getDatasetSequence(), mapList);
+
+ // add dna to peptide mapping
+ seqMappings.add(acf1);
+ acf1.addMap(dna1.getDatasetSequence(), pep1.getDatasetSequence(),
+ mapList);
+
+ /*
+ * first case - no dna-to-CDS mapping exists - search fails
+ */
+ SequenceI seq = AlignmentUtils.findCdsForProtein(mappings, dna1,
+ seqMappings, dnaToPeptide);
+ assertNull(seq);
+
+ /*
+ * second case - CDS-to-peptide mapping exists but no dna-to-CDS
+ * - search fails
+ */
+ // todo this test fails if the mapping is added to acf1, not acf2
+ // need to tidy up use of lists of mappings in AlignedCodonFrame
+ AlignedCodonFrame acf2 = new AlignedCodonFrame();
+ mappings.add(acf2);
+ MapList cdsToPeptideMapping = new MapList(new int[]
+ { 1, 9 }, new int[] { 1, 3 }, 3, 1);
+ acf2.addMap(cds1.getDatasetSequence(), pep1.getDatasetSequence(),
+ cdsToPeptideMapping);
+ assertNull(AlignmentUtils.findCdsForProtein(mappings, dna1, seqMappings,
+ dnaToPeptide));
+
+ /*
+ * third case - add dna-to-CDS mapping - CDS is now found!
+ */
+ MapList dnaToCdsMapping = new MapList(new int[] { 5, 6, 9, 15 },
+ new int[]
+ { 1, 9 }, 1, 1);
+ acf1.addMap(dna1.getDatasetSequence(), cds1.getDatasetSequence(),
+ dnaToCdsMapping);
+ seq = AlignmentUtils.findCdsForProtein(mappings, dna1, seqMappings,
+ dnaToPeptide);
+ assertSame(seq, cds1.getDatasetSequence());
+ }
+
+ /**
+ * Tests for the method that locates the CDS sequence that has a mapping to
+ * the given protein. That is, given a transcript-to-peptide mapping, find the
+ * cds-to-peptide mapping that relates to both, and return the CDS sequence.
+ * This test is for the case where transcript and CDS are the same length.
+ */
+ @Test
+ public void testFindCdsForProtein_noUTR()
+ {
+ List<AlignedCodonFrame> mappings = new ArrayList<>();
+ AlignedCodonFrame acf1 = new AlignedCodonFrame();
+ mappings.add(acf1);
+
+ SequenceI dna1 = new Sequence("dna1", "ATGCTATCTTAA");
+ dna1.createDatasetSequence();
+
+ // NB we currently exclude STOP codon from CDS sequences
+ // the test would need to change if this changes in future
+ SequenceI cds1 = new Sequence("cds1", "ATGCTATCT");
+ cds1.createDatasetSequence();
+
+ SequenceI pep1 = new Sequence("pep1", "MLS");
+ pep1.createDatasetSequence();
+ List<AlignedCodonFrame> seqMappings = new ArrayList<>();
+ MapList mapList = new MapList(
+ new int[]
+ { 1, 9 }, new int[] { 1, 3 }, 3, 1);
+ Mapping dnaToPeptide = new Mapping(pep1.getDatasetSequence(), mapList);
+
+ // add dna to peptide mapping
+ seqMappings.add(acf1);
+ acf1.addMap(dna1.getDatasetSequence(), pep1.getDatasetSequence(),
+ mapList);
+
+ /*
+ * first case - transcript lacks CDS features - it appears to be
+ * the CDS sequence and is returned
+ */
+ SequenceI seq = AlignmentUtils.findCdsForProtein(mappings, dna1,
+ seqMappings, dnaToPeptide);
+ assertSame(seq, dna1.getDatasetSequence());
+
+ /*
+ * second case - transcript has CDS feature - this means it is
+ * not returned as a match for CDS (CDS sequences don't have CDS features)
+ */
+ dna1.addSequenceFeature(
+ new SequenceFeature(SequenceOntologyI.CDS, "cds", 1, 12, null));
+ seq = AlignmentUtils.findCdsForProtein(mappings, dna1, seqMappings,
+ dnaToPeptide);
+ assertNull(seq);
+
+ /*
+ * third case - CDS-to-peptide mapping exists but no dna-to-CDS
+ * - search fails
+ */
+ // todo this test fails if the mapping is added to acf1, not acf2
+ // need to tidy up use of lists of mappings in AlignedCodonFrame
+ AlignedCodonFrame acf2 = new AlignedCodonFrame();
+ mappings.add(acf2);
+ MapList cdsToPeptideMapping = new MapList(new int[]
+ { 1, 9 }, new int[] { 1, 3 }, 3, 1);
+ acf2.addMap(cds1.getDatasetSequence(), pep1.getDatasetSequence(),
+ cdsToPeptideMapping);
+ assertNull(AlignmentUtils.findCdsForProtein(mappings, dna1, seqMappings,
+ dnaToPeptide));
+
+ /*
+ * fourth case - add dna-to-CDS mapping - CDS is now found!
+ */
+ MapList dnaToCdsMapping = new MapList(new int[] { 1, 9 },
+ new int[]
+ { 1, 9 }, 1, 1);
+ acf1.addMap(dna1.getDatasetSequence(), cds1.getDatasetSequence(),
+ dnaToCdsMapping);
+ seq = AlignmentUtils.findCdsForProtein(mappings, dna1, seqMappings,
+ dnaToPeptide);
+ assertSame(seq, cds1.getDatasetSequence());
+ }
}