From 373ae39e8610b0768aa85e72188291a47006a6d9 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Tue, 15 May 2012 14:39:12 -0400 Subject: [PATCH] Testing of BCF codec -- Rev.d tribble -- Minor code cleanup -- BCF2 encoder / decoder use Double not Float internally everywhere -- Generalized VC testing framework --- .../sting/utils/codecs/bcf2/BCF2Codec.java | 9 +- .../sting/utils/codecs/bcf2/BCF2Decoder.java | 4 +- .../sting/utils/codecs/bcf2/BCF2Encoder.java | 8 +- .../utils/codecs/beagle/BeagleCodec.java | 3 - .../variantcontext/writer/BCF2Writer.java | 10 +- .../org/broadinstitute/sting/BaseTest.java | 8 +- .../codecs/bcf2/EncoderDecoderUnitTest.java | 24 +-- .../VariantContextTestProvider.java | 143 ++++++++++++++++-- .../writer/BCF2WriterCodecUnitTest.java | 130 ---------------- .../writer/VariantContextWritersUnitTest.java | 135 +++++++++++++++++ .../{tribble-101.jar => tribble-107.jar} | Bin 310936 -> 315157 bytes .../{tribble-101.xml => tribble-107.xml} | 2 +- 12 files changed, 306 insertions(+), 170 deletions(-) delete mode 100644 public/java/test/org/broadinstitute/sting/utils/variantcontext/writer/BCF2WriterCodecUnitTest.java create mode 100644 public/java/test/org/broadinstitute/sting/utils/variantcontext/writer/VariantContextWritersUnitTest.java rename settings/repository/org.broad/{tribble-101.jar => tribble-107.jar} (89%) rename settings/repository/org.broad/{tribble-101.xml => tribble-107.xml} (79%) diff --git a/public/java/src/org/broadinstitute/sting/utils/codecs/bcf2/BCF2Codec.java b/public/java/src/org/broadinstitute/sting/utils/codecs/bcf2/BCF2Codec.java index 72fb45322..c4826a833 100644 --- a/public/java/src/org/broadinstitute/sting/utils/codecs/bcf2/BCF2Codec.java +++ b/public/java/src/org/broadinstitute/sting/utils/codecs/bcf2/BCF2Codec.java @@ -129,13 +129,20 @@ public class BCF2Codec implements FeatureCodec { @Override public boolean canDecode( final String path ) { + FileInputStream fis = null; try { - FileInputStream fis = new FileInputStream(path); + fis = new FileInputStream(path); return BCF2Utils.startsWithBCF2Magic(fis); } catch ( FileNotFoundException e ) { return false; } catch ( IOException e ) { return false; + } finally { + try { + if ( fis != null ) fis.close(); + } catch ( IOException e ) { + ; // do nothing + } } } diff --git a/public/java/src/org/broadinstitute/sting/utils/codecs/bcf2/BCF2Decoder.java b/public/java/src/org/broadinstitute/sting/utils/codecs/bcf2/BCF2Decoder.java index d7eebdc17..1d5f8b885 100644 --- a/public/java/src/org/broadinstitute/sting/utils/codecs/bcf2/BCF2Decoder.java +++ b/public/java/src/org/broadinstitute/sting/utils/codecs/bcf2/BCF2Decoder.java @@ -199,8 +199,8 @@ public class BCF2Decoder { return BCF2Utils.readInt(bytesForEachInt, recordStream); } - public final float rawFloatToFloat(final int rawFloat) { - return Float.intBitsToFloat(rawFloat); + public final double rawFloatToFloat(final int rawFloat) { + return (double)Float.intBitsToFloat(rawFloat); } // ---------------------------------------------------------------------- diff --git a/public/java/src/org/broadinstitute/sting/utils/codecs/bcf2/BCF2Encoder.java b/public/java/src/org/broadinstitute/sting/utils/codecs/bcf2/BCF2Encoder.java index dc3e17444..ec76f858c 100644 --- a/public/java/src/org/broadinstitute/sting/utils/codecs/bcf2/BCF2Encoder.java +++ b/public/java/src/org/broadinstitute/sting/utils/codecs/bcf2/BCF2Encoder.java @@ -140,7 +140,7 @@ public class BCF2Encoder { case INT8: case INT16: case INT32: encodePrimitive((Integer)value, type); break; - case FLOAT: encodeRawFloat((Float) value, type); break; + case FLOAT: encodeRawFloat((Double) value, type); break; case CHAR: encodeRawChar((Byte) value); break; default: throw new ReviewedStingException("Illegal type encountered " + type); } @@ -166,8 +166,8 @@ public class BCF2Encoder { encodeStream.write(c); } - public final void encodeRawFloat(final float value, final BCF2Type type) throws IOException { - encodePrimitive(Float.floatToIntBits(value), type); + public final void encodeRawFloat(final double value, final BCF2Type type) throws IOException { + encodePrimitive(Float.floatToIntBits((float)value), type); } public final void encodeType(final int size, final BCF2Type type) throws IOException { @@ -217,7 +217,7 @@ public class BCF2Encoder { private final BCF2Type determinePrimitiveType(final Object v) { if ( v instanceof Integer ) return determineIntegerType((Integer)v); - else if ( v instanceof Float ) + else if ( v instanceof Double ) return BCF2Type.FLOAT; else throw new ReviewedStingException("No native encoding for Object of type " + v.getClass().getSimpleName()); diff --git a/public/java/src/org/broadinstitute/sting/utils/codecs/beagle/BeagleCodec.java b/public/java/src/org/broadinstitute/sting/utils/codecs/beagle/BeagleCodec.java index ecd396bf2..d558a646d 100755 --- a/public/java/src/org/broadinstitute/sting/utils/codecs/beagle/BeagleCodec.java +++ b/public/java/src/org/broadinstitute/sting/utils/codecs/beagle/BeagleCodec.java @@ -232,7 +232,4 @@ public class BeagleCodec extends AsciiFeatureCodec implements Ref return bglFeature; } - - public boolean canDecode(final String potentialInput) { return false; } - } diff --git a/public/java/src/org/broadinstitute/sting/utils/variantcontext/writer/BCF2Writer.java b/public/java/src/org/broadinstitute/sting/utils/variantcontext/writer/BCF2Writer.java index 6eb1df237..b599773b3 100644 --- a/public/java/src/org/broadinstitute/sting/utils/variantcontext/writer/BCF2Writer.java +++ b/public/java/src/org/broadinstitute/sting/utils/variantcontext/writer/BCF2Writer.java @@ -299,7 +299,15 @@ class BCF2Writer extends IndexingVariantContextWriter { case Character: return new VCFToBCFType(metaData.getType(), BCF2Type.CHAR); case Flag: return new VCFToBCFType(metaData.getType(), BCF2Type.INT8); case String: return new VCFToBCFType(metaData.getType(), BCF2Type.CHAR); - case Integer: return new VCFToBCFType(metaData.getType(), maybeIntValue != null ? encoder.determineIntegerType((Integer)maybeIntValue) : BCF2Type.INT32); + case Integer: // note integer calculation is a bit complex because of the need to determine sizes + BCF2Type type; + if ( maybeIntValue == null ) + type = BCF2Type.INT8; + else if ( maybeIntValue instanceof List ) + type = encoder.determineIntegerType(((List)maybeIntValue)); + else + type = encoder.determineIntegerType((Integer)maybeIntValue); + return new VCFToBCFType(metaData.getType(), type); case Float: return new VCFToBCFType(metaData.getType(), BCF2Type.FLOAT); default: throw new ReviewedStingException("Unexpected type for field " + field); } diff --git a/public/java/test/org/broadinstitute/sting/BaseTest.java b/public/java/test/org/broadinstitute/sting/BaseTest.java index c49adf805..fbcac5342 100755 --- a/public/java/test/org/broadinstitute/sting/BaseTest.java +++ b/public/java/test/org/broadinstitute/sting/BaseTest.java @@ -64,12 +64,6 @@ public abstract class BaseTest { public static final String b37GoodNA12878BAM = validationDataLocation + "/NA12878.HiSeq.WGS.bwa.cleaned.recal.hg19.20.bam"; public static final String b37_NA12878_OMNI = validationDataLocation + "/NA12878.omni.vcf"; - public static final String refseqAnnotationLocation = annotationDataLocation + "refseq/"; - public static final String hg18Refseq = refseqAnnotationLocation + "refGene-big-table-hg18.txt"; - public static final String hg19Refseq = refseqAnnotationLocation + "refGene-big-table-hg19.txt"; - public static final String b36Refseq = refseqAnnotationLocation + "refGene-big-table-b36.txt"; - public static final String b37Refseq = refseqAnnotationLocation + "refGene-big-table-b37.txt"; - public static final String dbsnpDataLocation = GATKDataLocation; public static final String b36dbSNP129 = dbsnpDataLocation + "dbsnp_129_b36.vcf"; public static final String b37dbSNP129 = dbsnpDataLocation + "dbsnp_129_b37.vcf"; @@ -84,7 +78,7 @@ public abstract class BaseTest { public static final String hg19Intervals = intervalsLocation + "whole_exome_agilent_1.1_refseq_plus_3_boosters.Homo_sapiens_assembly19.targets.interval_list"; public static final String hg19Chr20Intervals = intervalsLocation + "whole_exome_agilent_1.1_refseq_plus_3_boosters.Homo_sapiens_assembly19.targets.chr20.interval_list"; - public static final boolean REQUIRE_NETWORK_CONNECTION = true; + public static final boolean REQUIRE_NETWORK_CONNECTION = false; public static final String networkTempDir; public static final File networkTempDirFile; diff --git a/public/java/test/org/broadinstitute/sting/utils/codecs/bcf2/EncoderDecoderUnitTest.java b/public/java/test/org/broadinstitute/sting/utils/codecs/bcf2/EncoderDecoderUnitTest.java index b9540da32..ac28ba6ee 100644 --- a/public/java/test/org/broadinstitute/sting/utils/codecs/bcf2/EncoderDecoderUnitTest.java +++ b/public/java/test/org/broadinstitute/sting/utils/codecs/bcf2/EncoderDecoderUnitTest.java @@ -43,7 +43,7 @@ import java.util.*; public class EncoderDecoderUnitTest extends BaseTest { - private final float FLOAT_TOLERANCE = (float)1e-8; + private final double FLOAT_TOLERANCE = 1e-6; final List primitives = new ArrayList(); final List basicTypes = new ArrayList(); final List forCombinations = new ArrayList(); @@ -102,9 +102,9 @@ public class EncoderDecoderUnitTest extends BaseTest { primitives.add(new BCF2TypedValue(-1.23e15, BCF2Type.FLOAT)); primitives.add(new BCF2TypedValue(Float.MIN_VALUE, BCF2Type.FLOAT)); primitives.add(new BCF2TypedValue(Float.MAX_VALUE, BCF2Type.FLOAT)); - primitives.add(new BCF2TypedValue(Float.NEGATIVE_INFINITY, BCF2Type.FLOAT)); - primitives.add(new BCF2TypedValue(Float.POSITIVE_INFINITY, BCF2Type.FLOAT)); - primitives.add(new BCF2TypedValue(Float.NaN, BCF2Type.FLOAT)); + primitives.add(new BCF2TypedValue(Double.NEGATIVE_INFINITY, BCF2Type.FLOAT)); + primitives.add(new BCF2TypedValue(Double.POSITIVE_INFINITY, BCF2Type.FLOAT)); + primitives.add(new BCF2TypedValue(Double.NaN, BCF2Type.FLOAT)); // strings //primitives.add(new BCF2TypedValue("", BCFType.CHAR)); <- will be null (which is right) @@ -155,7 +155,7 @@ public class EncoderDecoderUnitTest extends BaseTest { } private BCF2TypedValue(final double value, final BCF2Type type) { - this(new Float(value), type); + this(new Double(value), type); } private BCF2TypedValue(final Object value, final BCF2Type type) { @@ -348,13 +348,17 @@ public class EncoderDecoderUnitTest extends BaseTest { } else if ( tv.type == BCF2Type.FLOAT ) { // need tolerance for floats, and they aren't null Assert.assertTrue(decoded instanceof Double); - final float valueFloat = (float)(Float)tv.value; - final float decodedFloat = (float)(double)(Double)decoded; + final double valueFloat = (Double)tv.value; + final double decodedFloat = (Double)decoded; - if ( Float.isNaN(valueFloat) ) // NaN == NaN => false unfortunately - Assert.assertTrue(Float.isNaN(decodedFloat)); + if ( Double.isNaN(valueFloat) ) // NaN == NaN => false unfortunately + Assert.assertTrue(Double.isNaN(decodedFloat)); + else if ( Double.isInfinite(valueFloat) ) // NaN == NaN => false unfortunately + Assert.assertTrue(Double.isInfinite(decodedFloat)); else { - Assert.assertEquals(decodedFloat, valueFloat, FLOAT_TOLERANCE); + final double delta = Math.abs(decodedFloat - valueFloat); + final double ratio = Math.abs(decodedFloat / valueFloat - 1.0); + Assert.assertTrue(delta < FLOAT_TOLERANCE || ratio < FLOAT_TOLERANCE); } } else Assert.assertEquals(decoded, tv.value); diff --git a/public/java/test/org/broadinstitute/sting/utils/variantcontext/VariantContextTestProvider.java b/public/java/test/org/broadinstitute/sting/utils/variantcontext/VariantContextTestProvider.java index bb55a0515..0ca465e5d 100644 --- a/public/java/test/org/broadinstitute/sting/utils/variantcontext/VariantContextTestProvider.java +++ b/public/java/test/org/broadinstitute/sting/utils/variantcontext/VariantContextTestProvider.java @@ -24,9 +24,20 @@ package org.broadinstitute.sting.utils.variantcontext; +import org.broad.tribble.FeatureCodec; +import org.broad.tribble.FeatureCodecHeader; +import org.broad.tribble.readers.PositionalBufferedStream; import org.broadinstitute.sting.utils.codecs.vcf.*; +import org.broadinstitute.sting.utils.variantcontext.writer.Options; +import org.broadinstitute.sting.utils.variantcontext.writer.VariantContextWriter; import org.testng.Assert; +import org.testng.annotations.DataProvider; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; import java.util.*; /** @@ -37,21 +48,38 @@ import java.util.*; */ public class VariantContextTestProvider { final static VCFHeader header; - final static List tests = new ArrayList(); + final static List TEST_DATAs = new ArrayList(); final static VariantContext ROOT; - public static class VariantContextsTest { + public abstract static class VariantContextIOTest { + public String toString() { + return "VariantContextIOTest:" + getExtension(); + } + public abstract String getExtension(); + public abstract FeatureCodec makeCodec(); + public abstract VariantContextWriter makeWriter(final File outputFile, final EnumSet baseOptions); + + public List preprocess(final VCFHeader header, List vcsBeforeIO) { + return vcsBeforeIO; + } + + public List postprocess(final VCFHeader header, List vcsAfterIO) { + return vcsAfterIO; + } + } + + public static class VariantContextTestData { public List vcs; - public VariantContextsTest(final VariantContextBuilder builder) { + public VariantContextTestData(final VariantContextBuilder builder) { this(Collections.singletonList(builder.make())); } - public VariantContextsTest(final VariantContext vc) { + public VariantContextTestData(final VariantContext vc) { this(Collections.singletonList(vc)); } - public VariantContextsTest(final List vcs) { + public VariantContextTestData(final List vcs) { this.vcs = vcs; } @@ -65,10 +93,11 @@ public class VariantContextTestProvider { } private final static void add(VariantContextBuilder builder) { - tests.add(new VariantContextsTest(builder)); + TEST_DATAs.add(new VariantContextTestData(builder)); } static { + Set metaData = new TreeSet(); VariantContextBuilder rootBuilder = new VariantContextBuilder(); rootBuilder.source("test"); rootBuilder.loc("1", 10, 10); @@ -89,6 +118,8 @@ public class VariantContextTestProvider { add(builder().passFilters()); add(builder().filters("FILTER1")); add(builder().filters("FILTER1", "FILTER2")); + metaData.add(new VCFFilterHeaderLine("FILTER1")); + metaData.add(new VCFFilterHeaderLine("FILTER2")); add(builder().log10PError(VariantContext.NO_LOG10_PERROR)); add(builder().log10PError(-1)); @@ -97,21 +128,111 @@ public class VariantContextTestProvider { add(builder().noID()); add(builder().id("rsID12345")); + + add(builder().attribute("INT1", 1)); + add(builder().attribute("INT1", 100)); + add(builder().attribute("INT1", 1000)); + add(builder().attribute("INT1", 100000)); + add(builder().attribute("INT1", null)); + add(builder().attribute("INT3", Arrays.asList(1, 2, 3))); + add(builder().attribute("INT3", Arrays.asList(1000, 2000, 3000))); + add(builder().attribute("INT3", Arrays.asList(100000, 200000, 300000))); + add(builder().attribute("INT3", null)); + add(builder().attribute("INT20", Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20))); + metaData.add(new VCFInfoHeaderLine("INT1", 1, VCFHeaderLineType.Integer, "x")); + metaData.add(new VCFInfoHeaderLine("INT3", 3, VCFHeaderLineType.Integer, "x")); + metaData.add(new VCFInfoHeaderLine("INT20", 20, VCFHeaderLineType.Integer, "x")); + + add(builder().attribute("FLOAT1", 1.0)); + add(builder().attribute("FLOAT1", 100.0)); + add(builder().attribute("FLOAT1", 1000.0)); + add(builder().attribute("FLOAT1", 100000.0)); + add(builder().attribute("FLOAT1", null)); + add(builder().attribute("FLOAT3", Arrays.asList(1.0, 2.0, 3.0))); + add(builder().attribute("FLOAT3", Arrays.asList(1000.0, 2000.0, 3000.0))); + add(builder().attribute("FLOAT3", Arrays.asList(100000.0, 200000.0, 300000.0))); + add(builder().attribute("FLOAT3", null)); + metaData.add(new VCFInfoHeaderLine("FLOAT1", 1, VCFHeaderLineType.Float, "x")); + metaData.add(new VCFInfoHeaderLine("FLOAT3", 3, VCFHeaderLineType.Float, "x")); + + add(builder().attribute("FLAG", true)); + add(builder().attribute("FLAG", false)); + metaData.add(new VCFInfoHeaderLine("FLAG", 1, VCFHeaderLineType.Flag, "x")); + + add(builder().attribute("STRING1", "s1")); + add(builder().attribute("STRING1", null)); + // TODO - renable when BCF2 spec is fixed +// add(builder().attribute("STRING3", Arrays.asList("s1", "s2", "s3"))); +// add(builder().attribute("STRING3", null)); +// add(builder().attribute("STRING20", Arrays.asList("s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20"))); + metaData.add(new VCFInfoHeaderLine("STRING1", 1, VCFHeaderLineType.String, "x")); + metaData.add(new VCFInfoHeaderLine("STRING3", 3, VCFHeaderLineType.String, "x")); + metaData.add(new VCFInfoHeaderLine("STRING20", 20, VCFHeaderLineType.String, "x")); + + addGenotypesData(new ArrayList(TEST_DATAs), metaData); + // prep the header - Set metaData = new TreeSet(); - metaData.add(new VCFFilterHeaderLine("FILTER1")); - metaData.add(new VCFFilterHeaderLine("FILTER2")); metaData.add(new VCFContigHeaderLine(VCFHeader.CONTIG_KEY, Collections.singletonMap("ID", "1"), 0)); header = new VCFHeader(metaData); } + private static void addGenotypesData(final ArrayList sites, Set metaData) { + // TODO + // for each sites VC, we are going to add create two root genotypes. + // The first is the primary, and will be added to each new test + // The second is variable. In some tests it's absent (testing 1 genotype), in others it is duplicated + // 1 once, 10, 100, or 1000 times to test scaling + // Also, create a "missing" genotype (corresponding to a . sample) in the VCF for inclusion as well. + + // test GT + + // test GQ + + // test test Integer, Float, Flag, String atomic, vector, and missing types of different lengths per sample + } + + public static VCFHeader getHeader() { return header; } - public static List generateSiteTests() { - return tests; + public static List generateSiteTests() { + return TEST_DATAs; + } + + public static void testReaderWriter(final VariantContextIOTest tester, final VariantContextTestData data) throws IOException { + final File tmpFile = File.createTempFile("testReaderWriter", tester.getExtension()); + tmpFile.deleteOnExit(); + + // todo -- test all options + + // write + final EnumSet options = EnumSet.of(Options.INDEX_ON_THE_FLY); + final VariantContextWriter writer = tester.makeWriter(tmpFile, options); + writer.writeHeader(VariantContextTestProvider.getHeader()); + final List expected = data.vcs; + for ( VariantContext vc : expected ) + writer.add(vc); + writer.close(); + + // read in the features + FeatureCodec codec = tester.makeCodec(); + PositionalBufferedStream pbs = new PositionalBufferedStream(new FileInputStream(tmpFile)); + FeatureCodecHeader header = codec.readHeader(pbs); + pbs.close(); + // TODO -- test header quality + + pbs = new PositionalBufferedStream(new FileInputStream(tmpFile)); + pbs.skip(header.getHeaderEnd()); + + final List actual = new ArrayList(expected.size()); + while ( ! pbs.isDone() ) { actual.add(codec.decode(pbs)); }; + + Assert.assertEquals(actual.size(), expected.size()); + + for ( int i = 0; i < expected.size(); i++ ) + VariantContextTestProvider.assertEquals(actual.get(i), expected.get(i)); } public static void assertEquals( final VariantContext actual, final VariantContext expected ) { diff --git a/public/java/test/org/broadinstitute/sting/utils/variantcontext/writer/BCF2WriterCodecUnitTest.java b/public/java/test/org/broadinstitute/sting/utils/variantcontext/writer/BCF2WriterCodecUnitTest.java deleted file mode 100644 index d8b152a16..000000000 --- a/public/java/test/org/broadinstitute/sting/utils/variantcontext/writer/BCF2WriterCodecUnitTest.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright (c) 2012, The Broad Institute - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -// our package -package org.broadinstitute.sting.utils.variantcontext.writer; - - -// the imports for unit testing. - - -import net.sf.picard.reference.IndexedFastaSequenceFile; -import net.sf.samtools.SAMSequenceDictionary; -import org.broad.tribble.FeatureCodecHeader; -import org.broad.tribble.readers.PositionalBufferedStream; -import org.broadinstitute.sting.BaseTest; -import org.broadinstitute.sting.utils.codecs.bcf2.*; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeader; -import org.broadinstitute.sting.utils.fasta.CachingIndexedFastaSequenceFile; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.variantcontext.VariantContextBuilder; -import org.broadinstitute.sting.utils.variantcontext.VariantContextTestProvider; -import org.testng.Assert; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.BeforeSuite; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; - -import java.io.*; -import java.util.*; - - -public class BCF2WriterCodecUnitTest extends BaseTest { - private static File tmpFile; - private SAMSequenceDictionary dictionary; - -// private final static String START_VCF41_LINES = "##fileformat=VCFv4.1\n" + -// "##reference=file://" + BaseTest.b37KGReference + "\n" + -// "##contig=\n" + -// "##contig=\n"; -// -//// ##INFO= -//// ##INFO= -//// ##INFO= -//// ##INFO= -//// ##INFO= -//// ##INFO= -//// ##FILTER= -//// ##FILTER= -//// ##FORMAT= -//// ##FORMAT= -//// ##FORMAT= -//// ##FORMAT= -// -// private final static String SITES_HEADER_LINE = "#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\tFORMAT"; - - @BeforeSuite - public void before() throws IOException { - tmpFile = File.createTempFile("BCF2WriterCodecUnitTest", ".bcf"); - tmpFile.delete(); - IndexedFastaSequenceFile seq = new CachingIndexedFastaSequenceFile(new File(b37KGReference)); - dictionary = seq.getSequenceDictionary(); - } - - @BeforeMethod - public void beforeMethod() throws IOException { - tmpFile.delete(); // cleanup the test file - } - - // -------------------------------------------------------------------------------- - // - // Provider of VariantContexts for testing - // - // -------------------------------------------------------------------------------- - - @DataProvider(name = "SiteVCs") - public Object[][] SiteVCsTest() { - List tests = new ArrayList(); - for ( VariantContextTestProvider.VariantContextsTest test : VariantContextTestProvider.generateSiteTests() ) - tests.add(new Object[]{test.vcs}); - return tests.toArray(new Object[][]{}); - } - - @Test(dataProvider = "SiteVCs") - public void testBCF2WriterReader(final List contexts) throws IOException { - // todo -- test all options - - // write - final VariantContextWriter writer = VariantContextWriterFactory.create(tmpFile, dictionary); - writer.writeHeader(VariantContextTestProvider.getHeader()); - for ( VariantContext vc : contexts ) - writer.add(vc); - writer.close(); - - // read in the features - BCF2Codec codec = new BCF2Codec(); - PositionalBufferedStream pbs = new PositionalBufferedStream(new FileInputStream(tmpFile)); - FeatureCodecHeader header = codec.readHeader(pbs); - pbs.close(); - pbs = new PositionalBufferedStream(new FileInputStream(tmpFile)); - pbs.skip(header.getHeaderEnd()); - - Iterator it = contexts.iterator(); - while ( ! pbs.isDone() ) { - VariantContext vc = it.next(); - VariantContext bcf = codec.decode(pbs); - VariantContextTestProvider.assertEquals(vc, bcf); - } - } -} \ No newline at end of file diff --git a/public/java/test/org/broadinstitute/sting/utils/variantcontext/writer/VariantContextWritersUnitTest.java b/public/java/test/org/broadinstitute/sting/utils/variantcontext/writer/VariantContextWritersUnitTest.java new file mode 100644 index 000000000..13ec9aee2 --- /dev/null +++ b/public/java/test/org/broadinstitute/sting/utils/variantcontext/writer/VariantContextWritersUnitTest.java @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2012, The Broad Institute + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +// our package +package org.broadinstitute.sting.utils.variantcontext.writer; + + +// the imports for unit testing. + + +import net.sf.picard.reference.IndexedFastaSequenceFile; +import net.sf.samtools.SAMSequenceDictionary; +import org.broad.tribble.FeatureCodec; +import org.broad.tribble.FeatureCodecHeader; +import org.broad.tribble.readers.PositionalBufferedStream; +import org.broadinstitute.sting.BaseTest; +import org.broadinstitute.sting.utils.codecs.bcf2.*; +import org.broadinstitute.sting.utils.codecs.vcf.VCFCodec; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeader; +import org.broadinstitute.sting.utils.fasta.CachingIndexedFastaSequenceFile; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; +import org.broadinstitute.sting.utils.variantcontext.VariantContextTestProvider; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeSuite; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import java.io.*; +import java.util.*; + + +public class VariantContextWritersUnitTest extends BaseTest { + private SAMSequenceDictionary dictionary; + + @BeforeSuite + public void before() throws IOException { + IndexedFastaSequenceFile seq = new CachingIndexedFastaSequenceFile(new File(b37KGReference)); + dictionary = seq.getSequenceDictionary(); + } + + @DataProvider(name = "VariantContextTest_SingleContexts") + public Object[][] SiteVCsTest() { + List tests = new ArrayList(); + for ( VariantContextTestProvider.VariantContextTestData testData : VariantContextTestProvider.generateSiteTests() ) + tests.add(new Object[]{testData}); + return tests.toArray(new Object[][]{}); + } + + // -------------------------------------------------------------------------------- + // + // Test BCF2 reader / writer + // + // -------------------------------------------------------------------------------- + + @Test(dataProvider = "VariantContextTest_SingleContexts") + public void testBCF2WriterReader(final VariantContextTestProvider.VariantContextTestData testData) throws IOException { + VariantContextTestProvider.testReaderWriter(new BCFIOTester(), testData); + } + + private class BCFIOTester extends VariantContextTestProvider.VariantContextIOTest { + @Override + public String getExtension() { + return ".bcf"; + } + + @Override + public FeatureCodec makeCodec() { + return new BCF2Codec(); + } + + @Override + public VariantContextWriter makeWriter(final File file, final EnumSet baseOptions) { + return VariantContextWriterFactory.create(file, dictionary, baseOptions); + } + } + + // -------------------------------------------------------------------------------- + // + // Test VCF reader / writer + // + // -------------------------------------------------------------------------------- + + @Test(enabled = false, dataProvider = "VariantContextTest_SingleContexts") + public void testVCF4WriterReader(final VariantContextTestProvider.VariantContextTestData testData) throws IOException { + VariantContextTestProvider.testReaderWriter(new VCFIOTester(), testData); + } + + private class VCFIOTester extends VariantContextTestProvider.VariantContextIOTest { + @Override + public String getExtension() { + return ".vcf"; + } + + @Override + public List postprocess(final VCFHeader header, final List vcsAfterIO) { + final List fullyDecoded = new ArrayList(vcsAfterIO.size()); + + for ( final VariantContext withStrings : vcsAfterIO ) + fullyDecoded.add(withStrings.fullyDecode(header)); + + return fullyDecoded; + } + + @Override + public FeatureCodec makeCodec() { + return new VCFCodec(); + } + + @Override + public VariantContextWriter makeWriter(final File file, final EnumSet baseOptions) { + return VariantContextWriterFactory.create(file, dictionary, baseOptions); + } + } +} \ No newline at end of file diff --git a/settings/repository/org.broad/tribble-101.jar b/settings/repository/org.broad/tribble-107.jar similarity index 89% rename from settings/repository/org.broad/tribble-101.jar rename to settings/repository/org.broad/tribble-107.jar index 9e81f9eb2939745afb4c2de3f2c8bc2d933c5ba6..7157387eee4239b0958245b9d39eb6d0138aa13d 100644 GIT binary patch delta 15119 zcmb_@d3+W{(tq{LJkLDOlgWLMgOG$I5RyQ+3E>P76GE52U4ukO0yqO0q=y1U{k9w_GhR?m}*_5FR`KYkC)Oix#L zb#+yBRdw~`flCqFc1H%6OxFz$k&7s9>eE|-GxS(Ia(Al7J4x#CT{=H}NuobLj}(i$ z99-D{fm1z?d>Hh{U}~o>=#_{ecktx>NUu}|5ZPF`R!gMhUL3mgdQ2x@0i`;A6d5+W@slEa(+k6VclHTA^6k){LsaYUCiaU^h15CU+5Hpe?X^*# zoqaHw? zO!tFG9}S?blt{*wLCiyF@i5-@&|ca{O@JMuM~~#ZZwPV7H}vde z@sw}<*)hTb3wrwAIh&f)L?Rz!f2)*e)H96~7Nv&0aaLrOFSd2$wvO5omTML(Gd&qWZG-^=tjv zLGHD=X z(MTF7@17w}h~aWtvB(#B^6p|WKX?knI~6#l0mpQCp;&y{e>QN;fhx?U7)UOO%7I}X zBz_g7Js&b&Kr>PxB6;va?Up*#48qgFt-*r zCi%Qc$33LmFDJO>B;Q`(+bO=C=G%)N+vBzP%iTRq{#@{gz&J(HX|^nuq?2 zUgw%OT=XW_yyc>|`T08+{hopUZPGg)@+Rw{@{VgTKM)yzP;zBO8Qd}y-#ON z`oKeJ3`=8JnhpCi_dDmI59y;I`U`!`w@-M4zjCKfgXnMcSrGl5KIhvPCjEnn{3o~i z7mxp?Nne@d{n~>?-QuEe_<6xa-}3W27k$sqA3SuCe)M4J|HL>ine?-Z+B`HtkST23`^3p<+f6>dA!Rz`V*t z7~jJA7QwejQ$(2}T9977q{0+E1VzcyZ;B|n+0=^VAKw)HM66$XOKdP4ae|)BkjVui zMGpLnh?S@QTl~?3&iEg1iUj|@cf@Jo79da14;hnW_*-JR|M!0ojlvZQt_XS}LpEM- z#LMg66F#5I9W49)NhAc-i=GxOr>jkoC_nm1kC%z9dh~LOs_7aF_G*mt$@H9Ar^#X@=boH%Ug8U5z?^52f$eq0an4QlS~pZk#* zsQKQ%J66X0tS8HZAB%L~qT-RhqQ7R!A2PI1xq6BgA%i~=N!ycnwL?Az|atlBM1CK1m&yl$*L~0qkAN;33MZhq#H2{4P~eyBSKv^o($8p zC-@ErO$cDPW}?Do+0Xzs!GcB&dQSR(be;5zU9ke~uEGStP7HC2{OWHa&Ko=S(5jV-(p!Q94&e+f^}Ls(RQ}v0bX-P~|*E z@qu24F{ZAj*as3I1W5^Sq~1O>6aIM?Ozmtq;W;qqb0N)nFd6gJM23P~5Zl4gTj*v; zU7+*Ts9ge-ebDDt1U3fnl+x{V2YTFzKFmG4)kd_^*f8M^?uoSl794Da_bK;N&l%az zQsSdDv6Xt^HHjIK6=yV4axQAn!#S z=|HC|XtS!j1HsQ0RYwR^+gHTF4wXKr)`kW|d(@KEJJ@d5ECbu`$526}{Y1qk`F;dd z_Nv|r*}zm1;@UOxuFplfH%riM6$fZkRtupB)p4mpB*-UxpreJvyqwF`#ubDkVt3!E3yL99GpDh|k{H`+e{$&(ld*?N_^LvaW62NnpWomgj@ z5?}^7D@@vT4X!pwQ#a{BlO8fiLxu4Z<(jnnBBlHY)XM1xRv9FsNIaX}LivJ>eH7eE z6Urkd`f1V&tyBO8P0n)wcm-tPr6~}GGtSAv01*edq+~HQ&x|u$XquqY)N2O~3%o!` zEi_%w9V1b=4fB!fTFEQJ_sT&6s1+W7w8F53g_>M(zX_)Jd$r7qHMy zAsTv--lN}itiVNRc_TJrE-#vISNky&+l{A{Y}iVlh4l8~$)!hO?$|q>r2{a2?0n9u z6=(p-3y|$&kSiNLc0x9`LlA-8a~XQttsYm>M+SqOQI{y%q$eQ0pS)CN(vvwCsn12U zv=`}9C?R~qot@Q5JlPZvZlyAaZuX4+S>Ei*!qbpBUE zezPu!h_75l()k;;WPkKF?am<8Y0n<*J%<|a#z(b0g|X#PZC|n~Eqp~=n4n58{6%ww zsAky14^!0t{q^Vd#!#ZhP&qTki1jUw?;%HirGrL7rKZ?cWpD zk=T0V(rz}t51G8}LT*RCbwRt%RX~$1B%?;k(r>lOp1HK28#Y-mE9hLnn^0}SEZ)3Ax6idZJADL2LD!l$^?Qe#uP9#!2v|*1{%f#6{E}#pezMKMj4suCxiX9*O3|C zH|)6MC^>+$JhVBv$t zCTe@AN6+09-bz+EMseyr{S+*}yQrmlL&7|J$i>YN8+U;o=Ag}a(plL=X&iYuPhNf8 zk*7*}oI_VN#}L59F=zO#=dGHEHfA4a;~kt$|71`_pi84En8GxWUWnMY2wS#dxVTbm z*~+|_*=!I#2Wh!-{9A~G(IN!Fiy`<5xQI$bvdh%G$6`t~kl_{3B?r)L1k!8_lmSmV z70B5y`8qi71HNJ4vxeBJ5bZSVxCnAGeq3fnG0-Xn1{tS4?&bI zrg+S)Lrh^xOkC4U;p`MUQc8K8g%z0>+>SH2g?bC>g7v)jKhUOjqP4JT zz11TQv|VWj&1@bP!buQpz6ZOYNQBF2*h6L@Zq0(S3_(;e8UfTqC`Tc7i*vDGoR5vr zDg@cN22DL#I+?_JYv80O~Ld z>bnlYngg`K7;-a`$K~K~76zDyl7V5@AQe&$JuO6XZ9X=&F0_0cBxeI3_z%rqjHd@N znVle+1ai1T8`=e#wA6&Y2Y%3oHpF`#yVhXsCShXRNMUWTCLQ&L&b1~jGif;#yp7U1 zs1IOj*S4!+o8cdzVr+REpbs2XW;{!2-iUPb1obJ`GfT^jq+`^#wA|6}7-f`}J7XOD z+D!fCb{an0I6nx}{E%W)rdoCx*uAb~0>Kt$1#5DKVt}qn%oGP|SK&>g)t$jt+*Ir7 z@zb;uze|U?N_YCU98v+t)UvAjh5<`gR@B#@`T6;i=rx!MJ>XG}iw2rBh!ezvO&a0> z)}byM#?RrL>&^9GN#*fvlu4sa8sp11C(EfzL=<~OFQXkL$WdR_FuPVzH*Y@{sghZ1 zRyS0ys+v<>UyZ0BfA#8`h6)u72ud%ksau}Y00gU-=Tvk;awb$QtEsChs%p5prV_Ya z4OJC&lWNwk7L;~*m+Szxocv`CRdpR*f*I?qs*1|O>eW^CK(VZPWmSpqJkqrvyNpCR zdV&~{5>&CYVNJ!#Koc=lP)OCf+Nz}uRh2W=tXfi4=Np)t=*5)BnKT}(5tMlO@a>}q zxZo+RSyQ*PYBB~B6q{eaw7QzHGa*%V+-3kL8ZB6kP(krbV@_p7Lq*Q=wH5U_^{Wud z)DGaXpdKnCSzVJO=fxZ0dI+MTKn&8GyCcz#r8AKxfjACWCYyAH1>-%{g4Lcby_G`6 zD+Z4#^CxT3zApzm;)eF<{KG!Y~}Z_|4C7XRKI zj)W%I5#A{u`KMqbG0TGXRMj;UTnn~=NJqxhsr}|4l(e8n{9}`kx#1q>8&n?SWmjdV z?!w_G+Wo8pMkWex$YGK%3Vy6Ef}-K8T^ysBdi8uL&+kgKr=h*RC;FGB}I z@E`c%|4;Z56uzGA_;8G&tK~g2LMv<~oei>4)Jl%>Y(F_?=);Y$sNs$XGtY@Vo~u01 z`7-s6Hln=_*W!H?cdH@doXzCkO{Q^x4E-2+4z&F#+7WFWqadEIu6+6cm_9y(|}7h8XH$VZw11=9*x^RO1HLSm0fj#g5&=#8JwmxfTM>9JSMsALZbjXh(#W z?#K5Dxx$eK_NL1>|E2ek=bU;$cwg`?193n<=xipCX31fuULpsb*Q4YPQ@6a!luah; zi=?LeL2_tMWR@cv=0PIP#qkHfne&Xr$N~+48gPPJhio{CVsA7A;|&G=;SlHu$f|wC z^o6X_@y6Un2<2AW1zrK6&>TnE2cypIGFn_~HFLN$*TZp{N%K4y^D4g0_aG8m$R!+;FQCO-s^Hraeq9P<`4*;^ z%yC&IRe6A8Szj(L=i=3TtLD}#7;%M3$f2$jZv2_VMv}M(D(Ay$X9$uga%`|D%|KG?%h7UI)3;rYcX!rizV-JKY^$jIe zRo6h$)zzRKp48b;SFK#8CdGCwmgkVN1n?zG)a2*=A3_VpI<xM9G1(b9gTdg9BhnX%}r>;;A$Cdtw2xezSyNvn8)q4b%Z*wkZ#!&?=?t54@>RezZT9Nw1~B25!Y4sNT{2o6 zR85=4%r@#EUuaHsK<23+^QwPOd+AH2^HnL8(6+8mGU8AT`6^*x3hF zJyhT}97M5GwnfEGWCYv^#{wgf&Ke0;@iBfL>ae3j%NWwz5Gp%N8YQrU6JX>;FD3la z{KufVKuWNE{(OAQvLDc8@`Vt1#7+vrBYf_Gwr}_q=i6Y78%3Uf$1D*car`h6ZY&Sd z7zMvL2HH55`g@UYFei2=fr)KnjLKnI7Tr@*fmoRB3f6zH^{%(># zS13e=Y$*h^9ND;9h_V6iHz0uT3;hQhoB)O+fXIiE&43PYLX(4oerU$hD}w?Tpv3ZC zAK+0T^kXvG@z)^)v1)B-#1Qww*K%Q$ zH1x{tfm|Z*Nq7>7GcFN6xhgb*yU;CE5>cZWox2J?#2FQ&C#z3*{R>0&q4v4bwlICC zN1e3f^?fzy0yOr5CckXaaZr?|NBdVK=pOqhYHct55xbPsTR-ejTaN8fUmSc5+fTl- zI9l=@o*C(PW$5o`sZ*R!OZCC({3oGI|HSU{kNv-1I64Kv6|NC-?|QwT47*wnlAAW^ zA^utO^sy-+9EaU@;*VSJ0*CK%`1V$VmP+grP8~6#{pZ%}+w9|~wT=2~u3&C_;iF0K zod&T#rSZ_;1W?IWgp^&8c}lK+DT^?CNElzC11R{PV)x1Z9( z>~pG5TJ)th_GvHZZwS>l;k14(LzOQ5UB5|vrRu-wg8p@=BJ{5dd|4a9h&F`DJz;w6 z_8_CD|A@ob9Hx3qjxoaQam&+;4S+)mXNMYKB+KL0T%#Vl4U{g9H=b1=!up?{Xk4<# zeY(K7U?}K;X-1n3eXPiMT|xN^&(!VT>+XbZA|9VUZPdMcq4Ru=X7``!U1}!rn_iK3f{SYVVcGQ*PY6Ncr#ufe!qS4~C@9y#z0 z9LBv7DhIAK()^|CjF0W}!I5_wi)_MnZ8SzI%zxNu6gjyh`))SWH`j8>W@8-lKsIeQ za#Z2n&BicQ2-#wcQH2>>jJc|CaEq}_6~gZ~u2hAU_ZwxZ@ay}HVpWLt8CR)7z0a7Y z3a5MlP{dYawyIgN)hJPg6I+d$st~@-s8WUNw*}g~y)Dqa*LGut0^QYK_}Eg%<1^fT>kdK0IksvVLsft`XOVUD!lv<*ugbvy8{!u zad&{5XPS%z`PFVCLk-mPVPlReta&)V+qWJz3RF$(9%F9Dm(p_Wo&fxJs8;aoy%>yT zxN&cQ{Ll9qSE!ny`vUxUXrHk})vRd6sEPZHEcG^he?VG~?Kdh_O<0prt_mxg0+fT! zi8knw0J|F=3DElbBgPB`>h-8GQ<<#JkC5fBP^W-zKWZds)<5NzM{xF7d(8 zjJlfb<%|kW@MKF~hRwl=sGO4kO{i7e|2Yzoy0os%e(o^H^Z|vV3o^Yl4aR z;**Q^UsK~eSc*eNmRudBS@QU!fdP9R;sK{IC`aB`p*dvDA)o>+Eo?Yn6Wg2M+0?k}dK+tPz7`_KJ#Iv)_QOsOTJlCXtP8IE zZtd&6UD_XhJTRedUmbL7zh{fxK5Uy7Bzry)kY&~rn9%Bn7?diLCPIuiJQ0}deGHnm zpF#2R@N1eWU*}%T_p=PTqZ5=M2Rs>I!=mw9@*>EX)QH#i<4=K-a6^jc3_hyhb9t3~v=>tKD?3Y4u!#8T zzL2IkR2SY9Mr`|8cgn)21B%)$JK4@CJewMyadz}cmQOq#m_fHhOt<#Up`GpjmnpE^ zPCtz)d>C&}Vc?V`n>lO;?)z?4=|6yyFOK!ve@%^gl8rh!58rsNJPffhGa3&AQ(m%- z>F~^+@(nltd6^tD)+&>)qbpmc!5THK?->IMH)Jmrfg^ zbwl3sOkkwf9iKkG1nY>e?kn!4K^>hElV><8|pxHmrf5H4UDz^2=L|JWrI$w z*ORg@)4uVgnGXlu22JFP4>#I>;LsNCrs4}Z<~iW`dol#T7vfOikQ zmWLx|zIdzD{)2>fceMA&&G$k>zj!XN&@VE+o1d`Z1CJW9O8C={qW0VoyY|$>qK8xy zVZC^gLD!wMLAAL^fB(pHWKdW$KpS7RLHtJ!@~Y+lsFp!rzR>}4%clWSWWTbe^zL05 zM0{~7q5ap?ch68u20?+1mz_u+b%?Eg7}<5m8^G;U;YszZji7%4LJqVAT< z{Q>-)u`2J0JAX}$anT*^L*-we3rH&O7*KtYZiBLy;Mi+J49*|MwglLG*6uU!PK=c~J18}TP3EdjX}wP4hKQ@En9JU7xXJAL4j z40^akHa>5pW0PX25LUXMM{QZDT|51GBStZE;l(8RIHF*_x)WD6o12bN%skC~3+Hh~ zs&uw9s&`x3sJmg@_~PtH`>&~S#sa1*PX2j@;qGJYe5_(hX8?aWmRIlKrnZKyKY_k~mRyl2OTO2`<;y1mXy0eh_#HMA+BQNs wu_puC@WAaKeew;=6JPwrN&By<@y5>f=`khK9h_`HKJiu>2Em+p7y_dI0Uu;MbN~PV delta 11931 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 diff --git a/settings/repository/org.broad/tribble-101.xml b/settings/repository/org.broad/tribble-107.xml similarity index 79% rename from settings/repository/org.broad/tribble-101.xml rename to settings/repository/org.broad/tribble-107.xml index 09d13e43a..0d3a50baa 100644 --- a/settings/repository/org.broad/tribble-101.xml +++ b/settings/repository/org.broad/tribble-107.xml @@ -1,3 +1,3 @@ - +