X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=test%2Fjalview%2Fio%2Fvcf%2FVCFLoaderTest.java;fp=test%2Fjalview%2Fio%2Fvcf%2FVCFLoaderTest.java;h=87cf727c05a7780c0b6a958a131b186d068ee948;hb=25da4ccb5679905ada8b21e4d21fd416c392ab76;hp=999fc6cd0c8418f89c97a96fa7427854fc4cbdf0;hpb=94fe1bfb6ca65c8a787a336ebffde44df6795803;p=jalview.git diff --git a/test/jalview/io/vcf/VCFLoaderTest.java b/test/jalview/io/vcf/VCFLoaderTest.java index 999fc6c..87cf727 100644 --- a/test/jalview/io/vcf/VCFLoaderTest.java +++ b/test/jalview/io/vcf/VCFLoaderTest.java @@ -1,6 +1,8 @@ package jalview.io.vcf; +import static jalview.io.gff.SequenceOntologyI.SEQUENCE_VARIANT; import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNull; import static org.testng.Assert.assertSame; import static org.testng.Assert.assertTrue; @@ -11,12 +13,12 @@ import jalview.datamodel.Mapping; import jalview.datamodel.Sequence; import jalview.datamodel.SequenceFeature; import jalview.datamodel.SequenceI; +import jalview.datamodel.features.FeatureAttributes; import jalview.datamodel.features.SequenceFeatures; import jalview.gui.AlignFrame; import jalview.io.DataSourceType; import jalview.io.FileLoader; import jalview.io.gff.Gff3Helper; -import jalview.io.gff.SequenceOntologyI; import jalview.util.MapList; import java.io.File; @@ -26,6 +28,7 @@ import java.util.List; import java.util.Map; import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; public class VCFLoaderTest @@ -58,15 +61,21 @@ public class VCFLoaderTest + ">transcript4/1-18\n-----TGG-GGACGAGAGTGTGA-A\n"; private static final String[] VCF = { "##fileformat=VCFv4.2", + // fields other than AF are ignored when parsing as they have no INFO definition "##INFO=", + "##INFO= geneFeatures = al.getSequenceAt(0) .getSequenceFeatures(); SequenceFeatures.sortFeatures(geneFeatures, true); - assertEquals(geneFeatures.size(), 4); + assertEquals(geneFeatures.size(), 5); SequenceFeature sf = geneFeatures.get(0); assertEquals(sf.getFeatureGroup(), "VCF"); assertEquals(sf.getBegin(), 2); assertEquals(sf.getEnd(), 2); assertEquals(sf.getScore(), 0f); - assertEquals(Float.parseFloat((String) sf.getValue("AF")), 4.0e-03, - DELTA); + assertEquals(sf.getValue("AF"), "4.0e-03"); + assertEquals(sf.getValue("AF_AFR"), "2.3e-4"); assertEquals(sf.getValue(Gff3Helper.ALLELES), "A,C"); - assertEquals(sf.getType(), SequenceOntologyI.SEQUENCE_VARIANT); + assertEquals(sf.getType(), SEQUENCE_VARIANT); + assertEquals(sf.getValue("POS"), "45051611"); + assertEquals(sf.getValue("ID"), "rs384765"); + assertEquals(sf.getValue("QUAL"), "1666.64"); + assertEquals(sf.getValue("FILTER"), "RF;XYZ"); + // malformed integer for AC_Female is ignored (JAL-3375) + assertNull(sf.getValue("AC_Female")); + sf = geneFeatures.get(1); assertEquals(sf.getFeatureGroup(), "VCF"); assertEquals(sf.getBegin(), 2); assertEquals(sf.getEnd(), 2); - assertEquals(sf.getType(), SequenceOntologyI.SEQUENCE_VARIANT); + assertEquals(sf.getType(), SEQUENCE_VARIANT); assertEquals(sf.getScore(), 0f); assertEquals(Float.parseFloat((String) sf.getValue("AF")), 5.0e-03, DELTA); + assertEquals(sf.getValue("AC_Female"), "12"); + // malformed float for AF_AFR is ignored (JAL-3375) + assertNull(sf.getValue("AC_AFR")); assertEquals(sf.getValue(Gff3Helper.ALLELES), "A,T"); sf = geneFeatures.get(2); assertEquals(sf.getFeatureGroup(), "VCF"); assertEquals(sf.getBegin(), 4); assertEquals(sf.getEnd(), 4); - assertEquals(sf.getType(), SequenceOntologyI.SEQUENCE_VARIANT); + assertEquals(sf.getType(), SEQUENCE_VARIANT); assertEquals(sf.getScore(), 0f); assertEquals(Float.parseFloat((String) sf.getValue("AF")), 2.0e-03, DELTA); @@ -135,23 +163,35 @@ public class VCFLoaderTest assertEquals(sf.getFeatureGroup(), "VCF"); assertEquals(sf.getBegin(), 4); assertEquals(sf.getEnd(), 4); - assertEquals(sf.getType(), SequenceOntologyI.SEQUENCE_VARIANT); + assertEquals(sf.getType(), SEQUENCE_VARIANT); assertEquals(sf.getScore(), 0f); assertEquals(Float.parseFloat((String) sf.getValue("AF")), 3.0e-03, DELTA); assertEquals(sf.getValue(Gff3Helper.ALLELES), "G,GA"); + assertNull(sf.getValue("ID")); // '.' is ignored + assertNull(sf.getValue("FILTER")); // '.' is ignored + + sf = geneFeatures.get(4); + assertEquals(sf.getFeatureGroup(), "VCF"); + assertEquals(sf.getBegin(), 6); + assertEquals(sf.getEnd(), 6); + assertEquals(sf.getType(), SEQUENCE_VARIANT); + assertEquals(sf.getScore(), 0f); + // AF=. should not have been captured + assertNull(sf.getValue("AF")); + assertEquals(sf.getValue(Gff3Helper.ALLELES), "G,C"); /* * verify variant feature(s) added to transcript */ List transcriptFeatures = al.getSequenceAt(1) .getSequenceFeatures(); - assertEquals(transcriptFeatures.size(), 2); + assertEquals(transcriptFeatures.size(), 3); sf = transcriptFeatures.get(0); assertEquals(sf.getFeatureGroup(), "VCF"); assertEquals(sf.getBegin(), 2); assertEquals(sf.getEnd(), 2); - assertEquals(sf.getType(), SequenceOntologyI.SEQUENCE_VARIANT); + assertEquals(sf.getType(), SEQUENCE_VARIANT); assertEquals(sf.getScore(), 0f); assertEquals(Float.parseFloat((String) sf.getValue("AF")), 2.0e-03, DELTA); @@ -160,7 +200,7 @@ public class VCFLoaderTest assertEquals(sf.getFeatureGroup(), "VCF"); assertEquals(sf.getBegin(), 2); assertEquals(sf.getEnd(), 2); - assertEquals(sf.getType(), SequenceOntologyI.SEQUENCE_VARIANT); + assertEquals(sf.getType(), SEQUENCE_VARIANT); assertEquals(sf.getScore(), 0f); assertEquals(Float.parseFloat((String) sf.getValue("AF")), 3.0e-03, DELTA); @@ -185,16 +225,9 @@ public class VCFLoaderTest * JAL-3187 don't precompute protein features, do dynamically instead */ assertTrue(proteinFeatures.isEmpty()); - // assertEquals(proteinFeatures.size(), 1); - // sf = proteinFeatures.get(0); - // assertEquals(sf.getFeatureGroup(), "VCF"); - // assertEquals(sf.getBegin(), 1); - // assertEquals(sf.getEnd(), 1); - // assertEquals(sf.getType(), SequenceOntologyI.NONSYNONYMOUS_VARIANT); - // assertEquals(sf.getDescription(), "p.Ser1Thr"); } - private File makeVcf() throws IOException + private File makeVcfFile() throws IOException { File f = File.createTempFile("Test", ".vcf"); f.deleteOnExit(); @@ -334,7 +367,7 @@ public class VCFLoaderTest { AlignmentI al = buildAlignment(); - File f = makeVcf(); + File f = makeVcfFile(); VCFLoader loader = new VCFLoader(f.getPath()); @@ -347,96 +380,97 @@ public class VCFLoaderTest List geneFeatures = al.getSequenceAt(2) .getSequenceFeatures(); SequenceFeatures.sortFeatures(geneFeatures, true); - assertEquals(geneFeatures.size(), 4); + assertEquals(geneFeatures.size(), 5); + SequenceFeature sf; /* - * variant A/T at 45051611 maps to T/A at gene position 24 + * insertion G/GA at 45051613 maps to an insertion at + * the preceding position (21) on reverse strand gene + * reference: CAAGC -> GCTTG/21-25 + * genomic variant: CAAGAC (G/GA) + * gene variant: GTCTTG (G/GT at 21) */ - SequenceFeature sf = geneFeatures.get(3); + sf = geneFeatures.get(1); assertEquals(sf.getFeatureGroup(), "VCF"); - assertEquals(sf.getBegin(), 24); - assertEquals(sf.getEnd(), 24); - assertEquals(sf.getType(), SequenceOntologyI.SEQUENCE_VARIANT); + assertEquals(sf.getBegin(), 21); + assertEquals(sf.getEnd(), 21); + assertEquals(sf.getType(), SEQUENCE_VARIANT); assertEquals(sf.getScore(), 0f); - assertEquals(Float.parseFloat((String) sf.getValue("AF")), 5.0e-03, + assertEquals(sf.getValue(Gff3Helper.ALLELES), "G,GT"); + assertEquals(Float.parseFloat((String) sf.getValue("AF")), 3.0e-03, DELTA); - assertEquals(sf.getValue(Gff3Helper.ALLELES), "T,A"); /* - * variant A/C at 45051611 maps to T/G at gene position 24 + * variant G/C at 45051613 maps to C/G at gene position 22 */ sf = geneFeatures.get(2); assertEquals(sf.getFeatureGroup(), "VCF"); - assertEquals(sf.getBegin(), 24); - assertEquals(sf.getEnd(), 24); - assertEquals(sf.getType(), SequenceOntologyI.SEQUENCE_VARIANT); + assertEquals(sf.getBegin(), 22); + assertEquals(sf.getEnd(), 22); + assertEquals(sf.getType(), SEQUENCE_VARIANT); assertEquals(sf.getScore(), 0f); - assertEquals(Float.parseFloat((String) sf.getValue("AF")), 4.0e-03, + assertEquals(sf.getValue(Gff3Helper.ALLELES), "C,G"); + assertEquals(Float.parseFloat((String) sf.getValue("AF")), 2.0e-03, DELTA); - assertEquals(sf.getValue(Gff3Helper.ALLELES), "T,G"); /* - * variant G/C at 45051613 maps to C/G at gene position 22 + * variant A/C at 45051611 maps to T/G at gene position 24 */ - sf = geneFeatures.get(1); + sf = geneFeatures.get(3); assertEquals(sf.getFeatureGroup(), "VCF"); - assertEquals(sf.getBegin(), 22); - assertEquals(sf.getEnd(), 22); - assertEquals(sf.getType(), SequenceOntologyI.SEQUENCE_VARIANT); + assertEquals(sf.getBegin(), 24); + assertEquals(sf.getEnd(), 24); + assertEquals(sf.getType(), SEQUENCE_VARIANT); assertEquals(sf.getScore(), 0f); - assertEquals(Float.parseFloat((String) sf.getValue("AF")), 2.0e-03, + assertEquals(sf.getValue(Gff3Helper.ALLELES), "T,G"); + assertEquals(Float.parseFloat((String) sf.getValue("AF")), 4.0e-03, DELTA); - assertEquals(sf.getValue(Gff3Helper.ALLELES), "C,G"); /* - * insertion G/GA at 45051613 maps to an insertion at - * the preceding position (21) on reverse strand gene - * reference: CAAGC -> GCTTG/21-25 - * genomic variant: CAAGAC (G/GA) - * gene variant: GTCTTG (G/GT at 21) + * variant A/T at 45051611 maps to T/A at gene position 24 */ - sf = geneFeatures.get(0); + sf = geneFeatures.get(4); assertEquals(sf.getFeatureGroup(), "VCF"); - assertEquals(sf.getBegin(), 21); - assertEquals(sf.getEnd(), 21); - assertEquals(sf.getType(), SequenceOntologyI.SEQUENCE_VARIANT); + assertEquals(sf.getBegin(), 24); + assertEquals(sf.getEnd(), 24); + assertEquals(sf.getType(), SEQUENCE_VARIANT); assertEquals(sf.getScore(), 0f); - assertEquals(Float.parseFloat((String) sf.getValue("AF")), 3.0e-03, + assertEquals(sf.getValue(Gff3Helper.ALLELES), "T,A"); + assertEquals(Float.parseFloat((String) sf.getValue("AF")), 5.0e-03, DELTA); - assertEquals(sf.getValue(Gff3Helper.ALLELES), "G,GT"); /* - * verify 2 variant features added to transcript2 + * verify 3 variant features added to transcript2 */ List transcriptFeatures = al.getSequenceAt(3) .getSequenceFeatures(); - assertEquals(transcriptFeatures.size(), 2); + assertEquals(transcriptFeatures.size(), 3); /* * insertion G/GT at position 21 of gene maps to position 16 of transcript */ - sf = transcriptFeatures.get(0); + sf = transcriptFeatures.get(1); assertEquals(sf.getFeatureGroup(), "VCF"); assertEquals(sf.getBegin(), 16); assertEquals(sf.getEnd(), 16); - assertEquals(sf.getType(), SequenceOntologyI.SEQUENCE_VARIANT); + assertEquals(sf.getType(), SEQUENCE_VARIANT); assertEquals(sf.getScore(), 0f); + assertEquals(sf.getValue(Gff3Helper.ALLELES), "G,GT"); assertEquals(Float.parseFloat((String) sf.getValue("AF")), 3.0e-03, DELTA); - assertEquals(sf.getValue(Gff3Helper.ALLELES), "G,GT"); /* * SNP C/G at position 22 of gene maps to position 17 of transcript */ - sf = transcriptFeatures.get(1); + sf = transcriptFeatures.get(2); assertEquals(sf.getFeatureGroup(), "VCF"); assertEquals(sf.getBegin(), 17); assertEquals(sf.getEnd(), 17); - assertEquals(sf.getType(), SequenceOntologyI.SEQUENCE_VARIANT); + assertEquals(sf.getType(), SEQUENCE_VARIANT); assertEquals(sf.getScore(), 0f); + assertEquals(sf.getValue(Gff3Helper.ALLELES), "C,G"); assertEquals(Float.parseFloat((String) sf.getValue("AF")), 2.0e-03, DELTA); - assertEquals(sf.getValue(Gff3Helper.ALLELES), "C,G"); /* * verify variant feature(s) computed and added to protein @@ -452,17 +486,11 @@ public class VCFLoaderTest } } List proteinFeatures = peptide.getSequenceFeatures(); + /* * JAL-3187 don't precompute protein features, do dynamically instead */ assertTrue(proteinFeatures.isEmpty()); - // assertEquals(proteinFeatures.size(), 1); - // sf = proteinFeatures.get(0); - // assertEquals(sf.getFeatureGroup(), "VCF"); - // assertEquals(sf.getBegin(), 6); - // assertEquals(sf.getEnd(), 6); - // assertEquals(sf.getType(), SequenceOntologyI.NONSYNONYMOUS_VARIANT); - // assertEquals(sf.getDescription(), "p.Ala6Gly"); } /**