diff --git a/public/java/src/org/broadinstitute/sting/gatk/arguments/GATKArgumentCollection.java b/public/java/src/org/broadinstitute/sting/gatk/arguments/GATKArgumentCollection.java index 5b9ca8470..716bff0aa 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/arguments/GATKArgumentCollection.java +++ b/public/java/src/org/broadinstitute/sting/gatk/arguments/GATKArgumentCollection.java @@ -324,5 +324,16 @@ public class GATKArgumentCollection { @Argument(fullName="allow_intervals_with_unindexed_bam",doc="Allow interval processing with an unsupported BAM. NO INTEGRATION TESTS are available. Use at your own risk.",required=false) @Hidden public boolean allowIntervalsWithUnindexedBAM = false; + + // -------------------------------------------------------------------------------------------------------------- + // + // testing BCF2 + // + // -------------------------------------------------------------------------------------------------------------- + + @Argument(fullName="also_generate_bcf",doc="If provided, whenever we create a VCFWriter we will also write out a BCF file alongside it, for testing purposes",required=false) + @Hidden + public boolean alsoGenerateBCF = false; + // TODO -- remove all code tagged with TODO -- remove me when argument alsoGenerateBCF is removed } diff --git a/public/java/src/org/broadinstitute/sting/gatk/io/storage/VariantContextWriterStorage.java b/public/java/src/org/broadinstitute/sting/gatk/io/storage/VariantContextWriterStorage.java index 3dd7c533e..b04608a62 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/io/storage/VariantContextWriterStorage.java +++ b/public/java/src/org/broadinstitute/sting/gatk/io/storage/VariantContextWriterStorage.java @@ -33,6 +33,7 @@ import org.broadinstitute.sting.utils.codecs.vcf.VCFHeader; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.UserException; import org.broadinstitute.sting.utils.variantcontext.VariantContext; +import org.broadinstitute.sting.utils.variantcontext.writer.Options; import org.broadinstitute.sting.utils.variantcontext.writer.VariantContextWriter; import org.broadinstitute.sting.utils.variantcontext.writer.VariantContextWriterFactory; @@ -40,6 +41,9 @@ import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.io.PrintStream; +import java.util.Arrays; +import java.util.EnumSet; +import java.util.List; /** * Provides temporary and permanent storage for genotypes in VCF format. @@ -95,7 +99,41 @@ public class VariantContextWriterStorage implements Storage options = stub.getWriterOptions(indexOnTheFly); + VariantContextWriter writer = VariantContextWriterFactory.create(file, this.stream, stub.getMasterSequenceDictionary(), options); + + // if the stub says to test BCF, create a secondary writer to BCF and an 2 way out writer to send to both + // TODO -- remove me when argument alsoGenerateBCF is removed + if ( stub.alsoWriteBCFForTest() && ! VariantContextWriterFactory.isBCFOutput(file, options)) { + final File bcfFile = new File(file.getAbsolutePath() + ".bcf"); + VariantContextWriter bcfWriter = VariantContextWriterFactory.create(bcfFile, stub.getMasterSequenceDictionary(), options); + writer = new TestWriter(writer, bcfWriter); + } + + return writer; + } + + private final static class TestWriter implements VariantContextWriter { + final List writers; + + private TestWriter(final VariantContextWriter ... writers) { + this.writers = Arrays.asList(writers); + } + + @Override + public void writeHeader(final VCFHeader header) { + for ( final VariantContextWriter writer : writers ) writer.writeHeader(header); + } + + @Override + public void close() { + for ( final VariantContextWriter writer : writers ) writer.close(); + } + + @Override + public void add(final VariantContext vc) { + for ( final VariantContextWriter writer : writers ) writer.add(vc); + } } diff --git a/public/java/src/org/broadinstitute/sting/gatk/io/stubs/VariantContextWriterStub.java b/public/java/src/org/broadinstitute/sting/gatk/io/stubs/VariantContextWriterStub.java index 087e21a0b..e649397cf 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/io/stubs/VariantContextWriterStub.java +++ b/public/java/src/org/broadinstitute/sting/gatk/io/stubs/VariantContextWriterStub.java @@ -248,6 +248,17 @@ public class VariantContextWriterStub implements Stub, Var return getClass().getName(); } + /** + * Should we also write a BCF file alongside our VCF file for testing + * + * TODO -- remove me when argument alsoGenerateBCF is removed + * + * @return + */ + public boolean alsoWriteBCFForTest() { + return ! isCompressed() && getFile() != null && engine.getArguments().alsoGenerateBCF; + } + /** * Gets the appropriately formatted header for a VCF file * @return VCF file header. diff --git a/public/java/src/org/broadinstitute/sting/utils/variantcontext/writer/VariantContextWriterFactory.java b/public/java/src/org/broadinstitute/sting/utils/variantcontext/writer/VariantContextWriterFactory.java index 7a4ca3be1..db3d4f343 100644 --- a/public/java/src/org/broadinstitute/sting/utils/variantcontext/writer/VariantContextWriterFactory.java +++ b/public/java/src/org/broadinstitute/sting/utils/variantcontext/writer/VariantContextWriterFactory.java @@ -70,7 +70,7 @@ public class VariantContextWriterFactory { final OutputStream output, final SAMSequenceDictionary refDict, final EnumSet options) { - final boolean enableBCF = options.contains(Options.FORCE_BCF) || (location != null && location.getName().contains(".bcf")); + final boolean enableBCF = isBCFOutput(location, options); if ( enableBCF ) return new BCF2Writer(location, output, refDict, @@ -83,6 +83,10 @@ public class VariantContextWriterFactory { } } + public static boolean isBCFOutput(final File location, final EnumSet options) { + return options.contains(Options.FORCE_BCF) || (location != null && location.getName().contains(".bcf")); + } + public static VariantContextWriter sortOnTheFly(final VariantContextWriter innerWriter, int maxCachingStartDistance) { return sortOnTheFly(innerWriter, maxCachingStartDistance, false); }