diff --git a/src/main/java/picard/analysis/MergeableMetricBase.java b/src/main/java/picard/analysis/MergeableMetricBase.java index c4ebb2954..abe420b51 100644 --- a/src/main/java/picard/analysis/MergeableMetricBase.java +++ b/src/main/java/picard/analysis/MergeableMetricBase.java @@ -32,7 +32,10 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; +import java.util.List; /** * An extension of MetricBase that knows how to merge-by-adding fields that are appropriately annotated. It also provides an interface @@ -44,7 +47,7 @@ * * @author Yossi Farjoun */ -public class MergeableMetricBase extends MetricBase { +abstract public class MergeableMetricBase extends MetricBase { /** Metrics whose values can be merged by adding. */ @Retention(RetentionPolicy.RUNTIME) @@ -137,7 +140,7 @@ public MergeableMetricBase merge(final Collection */ public MergeableMetricBase merge(final MergeableMetricBase other) { - for (final Field field : this.getClass().getDeclaredFields()) { + for (final Field field : getAllFields(this.getClass())) { if (field.isSynthetic()) continue; if (field.getAnnotationsByType(MergeByAdding.class).length + @@ -150,6 +153,8 @@ public MergeableMetricBase merge(final MergeableMetricBase other) { } final Annotation[] summableAnnotations = field.getAnnotationsByType(MergeByAdding.class); + field.setAccessible(true); + if (summableAnnotations.length != 0) { try { if (field.getType() == Integer.class) { @@ -213,6 +218,16 @@ public MergeableMetricBase merge(final MergeableMetricBase other) { return this; } + private static List getAllFields(Class clazz){ + final List fields = new ArrayList<>(); + fields.addAll(Arrays.asList(clazz.getDeclaredFields())); + final Class superClass = clazz.getSuperclass(); + + if (superClass != null) fields.addAll(getAllFields(superClass)); + + return fields; + } + /** * placeholder method that will calculate the derived fields from the other ones. classes that are derived from non-trivial base classes * should consider calling super.calculateDerivedFields() as well. diff --git a/src/main/java/picard/sam/MergeBamAlignment.java b/src/main/java/picard/sam/MergeBamAlignment.java index 45edbe82b..9353ba245 100644 --- a/src/main/java/picard/sam/MergeBamAlignment.java +++ b/src/main/java/picard/sam/MergeBamAlignment.java @@ -134,7 +134,7 @@ @Option(doc = "Whether to clip adapters where identified.") public boolean CLIP_ADAPTERS = true; - @Option(doc = "Whether the lane is bisulfite sequence (used when caculating the NM tag).") + @Option(doc = "Whether the lane is bisulfite sequence (used when calculating the NM tag).") public boolean IS_BISULFITE_SEQUENCE = false; @Option(doc = "Whether to output only aligned reads. ") @@ -148,11 +148,11 @@ @Option(doc = "Reserved alignment attributes (tags starting with X, Y, or Z) that should be " + "brought over from the alignment data when merging.") - public List ATTRIBUTES_TO_RETAIN = new ArrayList(); + public List ATTRIBUTES_TO_RETAIN = new ArrayList<>(); @Option(doc = "Attributes from the alignment record that should be removed when merging." + " This overrides ATTRIBUTES_TO_RETAIN if they share common tags.") - public List ATTRIBUTES_TO_REMOVE = new ArrayList(); + public List ATTRIBUTES_TO_REMOVE = new ArrayList<>(); @Option(shortName="RV", doc="Attributes on negative strand reads that need to be reversed.") public Set ATTRIBUTES_TO_REVERSE = new TreeSet<>(SAMRecord.TAGS_TO_REVERSE); diff --git a/src/main/java/picard/vcf/CallingMetricAccumulator.java b/src/main/java/picard/vcf/CallingMetricAccumulator.java index 275e233b6..fdbad91aa 100644 --- a/src/main/java/picard/vcf/CallingMetricAccumulator.java +++ b/src/main/java/picard/vcf/CallingMetricAccumulator.java @@ -76,10 +76,12 @@ public static Result merge(final Collection results) { final VariantCallingDetailMetrics collapsed = new VariantCallingDetailMetrics(); VariantCallingDetailMetrics.foldInto(collapsed, sampleDetails); collapsedDetails.add(collapsed); + collapsed.calculateDerivedFields(); }); final VariantCallingSummaryMetrics collapsedSummary = new VariantCallingSummaryMetrics(); VariantCallingSummaryMetrics.foldInto(collapsedSummary, summaries); + collapsedSummary.calculateDerivedFields(); return new Result(collapsedSummary, collapsedDetails); } @@ -157,9 +159,9 @@ protected static String getSingletonSample(final VariantContext vc) { public Result result() { final Collection values = sampleMetricsMap.values(); - values.forEach(CollectVariantCallingMetrics.VariantCallingDetailMetrics::updateDerivedValuesInPlace); + values.forEach(CollectVariantCallingMetrics.VariantCallingDetailMetrics::calculateDerivedFields); - summaryMetric.updateDerivedValuesInPlace(); + summaryMetric.calculateDerivedFields(); return new Result(summaryMetric, values); } diff --git a/src/main/java/picard/vcf/CollectVariantCallingMetrics.java b/src/main/java/picard/vcf/CollectVariantCallingMetrics.java index 49bc848cf..936f71def 100644 --- a/src/main/java/picard/vcf/CollectVariantCallingMetrics.java +++ b/src/main/java/picard/vcf/CollectVariantCallingMetrics.java @@ -24,7 +24,6 @@ package picard.vcf; import htsjdk.samtools.SAMSequenceDictionary; -import htsjdk.samtools.metrics.MetricBase; import htsjdk.samtools.metrics.MetricsFile; import htsjdk.samtools.util.CloserUtil; import htsjdk.samtools.util.IOUtil; @@ -33,6 +32,7 @@ import htsjdk.variant.utils.SAMSequenceDictionaryExtractor; import htsjdk.variant.vcf.VCFFileReader; import htsjdk.variant.vcf.VCFHeader; +import picard.analysis.MergeableMetricBase; import picard.cmdline.CommandLineProgram; import picard.cmdline.CommandLineProgramProperties; import picard.cmdline.Option; @@ -43,9 +43,7 @@ import java.io.File; import java.util.Collection; -import java.util.HashSet; import java.util.Optional; -import java.util.Set; /** Collects summary and per-sample metrics about variant calls in a VCF file. */ @CommandLineProgramProperties( @@ -137,71 +135,92 @@ protected int doWork() { } /** A collection of metrics relating to snps and indels within a variant-calling file (VCF). */ - public static class VariantCallingSummaryMetrics extends MetricBase { + public static class VariantCallingSummaryMetrics extends MergeableMetricBase { /** The number of high confidence SNPs calls (i.e. non-reference genotypes) that were examined */ + @MergeByAdding public long TOTAL_SNPS; /** The number of high confidence SNPs found in dbSNP */ + @MergeByAdding public long NUM_IN_DB_SNP; /** The number of high confidence SNPS called that were not found in dbSNP */ + @MergeByAdding public long NOVEL_SNPS; /** The number of SNPs that are also filtered */ + @MergeByAdding public long FILTERED_SNPS; /** The fraction of high confidence SNPs in dbSNP */ + @NoMergingIsDerived public float PCT_DBSNP; /** The Transition/Transversion ratio of the SNP calls made at dbSNP sites */ + @NoMergingIsDerived public double DBSNP_TITV; /** The Transition/Transversion ratio of the SNP calls made at non-dbSNP sites */ + @NoMergingIsDerived public double NOVEL_TITV; /** The number of high confidence Indel calls that were examined */ + @MergeByAdding public long TOTAL_INDELS; /** The number of high confidence Indels called that were not found in dbSNP */ + @MergeByAdding public long NOVEL_INDELS; /** The number of indels that are also filtered */ + @MergeByAdding public long FILTERED_INDELS; /** The fraction of high confidence Indels in dbSNP */ + @NoMergingIsDerived public float PCT_DBSNP_INDELS; /** The number of high confidence Indels found in dbSNP */ + @MergeByAdding public long NUM_IN_DB_SNP_INDELS; /** The Insertion/Deletion ratio of the Indel calls made at dbSNP sites */ + @NoMergingIsDerived public double DBSNP_INS_DEL_RATIO; /** The Insertion/Deletion ratio of the Indel calls made at non-dbSNP sites */ + @NoMergingIsDerived public double NOVEL_INS_DEL_RATIO; /** The number of high confidence multiallelic SNP calls that were examined */ + @MergeByAdding public double TOTAL_MULTIALLELIC_SNPS; /** The number of high confidence multiallelic SNPs found in dbSNP */ + @MergeByAdding public double NUM_IN_DB_SNP_MULTIALLELIC; /** The number of high confidence complex Indel calls that were examined */ + @MergeByAdding public double TOTAL_COMPLEX_INDELS; /** The number of high confidence complex Indels found in dbSNP */ + @MergeByAdding public double NUM_IN_DB_SNP_COMPLEX_INDELS; /** The rate at which reference bases are observed at ref/alt heterozygous SNP sites. */ + @NoMergingIsDerived public double SNP_REFERENCE_BIAS; /** * For summary metrics, the number of variants that appear in only one sample. * For detail metrics, the number of variants that appear only in the current sample. */ + @MergeByAdding public long NUM_SINGLETONS; /** Hidden fields that are not propagated to the metrics file, but are used to house temporary values. */ + @MergeByAdding long refAlleleObs, altAlleleObs, novelDeletions, novelInsertions, novelTransitions, novelTransversions, dbSnpDeletions, dbSnpInsertions, dbSnpTransitions, dbSnpTransversions; @@ -209,7 +228,7 @@ public static String getFileExtension() { return "variant_calling_summary_metrics"; } - public void updateDerivedValuesInPlace() { + public void calculateDerivedFields() { this.PCT_DBSNP = this.NUM_IN_DB_SNP / (float) this.TOTAL_SNPS; this.NOVEL_SNPS = this.TOTAL_SNPS - this.NUM_IN_DB_SNP; this.SNP_REFERENCE_BIAS = (this.refAlleleObs) / (double) (this.refAlleleObs + this.altAlleleObs); @@ -231,72 +250,36 @@ public void updateDerivedValuesInPlace() { } public static void foldInto(final T target, final Collection metrics) { - for (final T metric : metrics) { - target.TOTAL_SNPS += metric.TOTAL_SNPS; - target.NUM_IN_DB_SNP += metric.NUM_IN_DB_SNP; - target.FILTERED_SNPS += metric.FILTERED_SNPS; - target.TOTAL_INDELS += metric.TOTAL_INDELS; - target.FILTERED_INDELS += metric.FILTERED_INDELS; - target.NUM_IN_DB_SNP_INDELS += metric.NUM_IN_DB_SNP_INDELS; - target.TOTAL_MULTIALLELIC_SNPS += metric.TOTAL_MULTIALLELIC_SNPS; - target.NUM_IN_DB_SNP_MULTIALLELIC += metric.NUM_IN_DB_SNP_MULTIALLELIC; - target.TOTAL_COMPLEX_INDELS += metric.TOTAL_COMPLEX_INDELS; - target.NUM_IN_DB_SNP_COMPLEX_INDELS += metric.NUM_IN_DB_SNP_COMPLEX_INDELS; - target.NUM_SINGLETONS += metric.NUM_SINGLETONS; - target.refAlleleObs += metric.refAlleleObs; - target.altAlleleObs += metric.altAlleleObs; - target.novelDeletions += metric.novelDeletions; - target.novelInsertions += metric.novelInsertions; - target.novelTransitions += metric.novelTransitions; - target.novelTransversions += metric.novelTransversions; - target.dbSnpDeletions += metric.dbSnpDeletions; - target.dbSnpInsertions += metric.dbSnpInsertions; - target.dbSnpTransitions += metric.dbSnpTransitions; - target.dbSnpTransversions += metric.dbSnpTransversions; - } - target.updateDerivedValuesInPlace(); + metrics.forEach(target::merge); } } /** A collection of metrics relating to snps and indels within a variant-calling file (VCF) for a given sample. */ public static class VariantCallingDetailMetrics extends CollectVariantCallingMetrics.VariantCallingSummaryMetrics { /** The name of the sample being assayed */ + @MergeByAssertEquals public String SAMPLE_ALIAS; /** * (count of hets)/(count of homozygous non-ref) for this sample */ + @NoMergingIsDerived public double HET_HOMVAR_RATIO; /** * Hidden fields not propagated to the metrics file. */ + @MergeByAdding long numHets, numHomVar; public static String getFileExtension() { return "variant_calling_detail_metrics"; } - public static void foldInto(final VariantCallingDetailMetrics target, - final Collection metrics) { - VariantCallingSummaryMetrics.foldInto(target, metrics); - final Set sampleAliases = new HashSet<>(); - for (final VariantCallingDetailMetrics metric : metrics) { - target.numHets += metric.numHets; - target.numHomVar += metric.numHomVar; - sampleAliases.add(metric.SAMPLE_ALIAS); - } - target.updateDerivedValuesInPlace(); - if (sampleAliases.size() != 1) { - throw new IllegalArgumentException("Provided metrics do not have the same sample name."); - } - target.SAMPLE_ALIAS = sampleAliases.iterator().next(); - } - @Override - public void updateDerivedValuesInPlace() { - super.updateDerivedValuesInPlace(); - // Divide by zero should be OK -- NaN should get propagated to metrics file and to DB. + public void calculateDerivedFields() { + super.calculateDerivedFields(); + // Divide by zero should be OK -- NaN should get propagated to metrics file. HET_HOMVAR_RATIO = numHets / (double) numHomVar; } } diff --git a/src/main/java/picard/vcf/filter/FilterVcf.java b/src/main/java/picard/vcf/filter/FilterVcf.java index b94096a88..cc3e627bd 100644 --- a/src/main/java/picard/vcf/filter/FilterVcf.java +++ b/src/main/java/picard/vcf/filter/FilterVcf.java @@ -110,51 +110,49 @@ protected int doWork() { VCFFileReader in = null; VariantContextWriter out = null; try {// try/finally used to close 'in' and 'out' - in = new VCFFileReader(INPUT, false); - final List variantFilters = new ArrayList(4); - variantFilters.add(new AlleleBalanceFilter(MIN_AB)); - variantFilters.add(new FisherStrandFilter(MAX_FS)); - variantFilters.add(new QdFilter(MIN_QD)); - if( JAVASCRIPT_FILE != null) { - try { - variantFilters.add(new VariantContextJavascriptFilter(JAVASCRIPT_FILE, in.getFileHeader())); - } catch(final IOException error) { - throw new PicardException("javascript-related error", error); - } - } - final List genotypeFilters = CollectionUtil.makeList(new GenotypeQualityFilter(MIN_GQ), new DepthFilter(MIN_DP)); - @SuppressWarnings("resource") - final FilterApplyingVariantIterator iterator = new FilterApplyingVariantIterator(in.iterator(), variantFilters, genotypeFilters); - - final VCFHeader header = in.getFileHeader(); - // If the user is writing to a .bcf or .vcf, VariantContextBuilderWriter requires a Sequence Dictionary. Make sure that the - // Input VCF has one. - final VariantContextWriterBuilder variantContextWriterBuilder = new VariantContextWriterBuilder(); - if (isVcfOrBcf(OUTPUT)) { - final SAMSequenceDictionary sequenceDictionary = header.getSequenceDictionary(); - if (sequenceDictionary == null) { - throw new PicardException("The input vcf must have a sequence dictionary in order to create indexed vcf or bcfs."); - } - variantContextWriterBuilder.setReferenceDictionary(sequenceDictionary); - } - out = variantContextWriterBuilder.setOutputFile(OUTPUT).build(); - header.addMetaDataLine(new VCFFilterHeaderLine("AllGtsFiltered", "Site filtered out because all genotypes are filtered out.")); - header.addMetaDataLine(new VCFFormatHeaderLine("FT", VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.String, "Genotype filters.")); - for (final VariantFilter filter : variantFilters) { - for (final VCFFilterHeaderLine line : filter.headerLines()) { - header.addMetaDataLine(line); - } - } - - out.writeHeader(in.getFileHeader()); - - while (iterator.hasNext()) { - out.add(iterator.next()); - } - return 0; + in = new VCFFileReader(INPUT, false); + final List variantFilters = new ArrayList<>(4); + variantFilters.add(new AlleleBalanceFilter(MIN_AB)); + variantFilters.add(new FisherStrandFilter(MAX_FS)); + variantFilters.add(new QdFilter(MIN_QD)); + if (JAVASCRIPT_FILE != null) { + try { + variantFilters.add(new VariantContextJavascriptFilter(JAVASCRIPT_FILE, in.getFileHeader())); + } catch (final IOException error) { + throw new PicardException("javascript-related error", error); + } + } + final List genotypeFilters = CollectionUtil.makeList(new GenotypeQualityFilter(MIN_GQ), new DepthFilter(MIN_DP)); + @SuppressWarnings("resource") + final FilterApplyingVariantIterator iterator = new FilterApplyingVariantIterator(in.iterator(), variantFilters, genotypeFilters); + + final VCFHeader header = in.getFileHeader(); + // If the user is writing to a .bcf or .vcf, VariantContextBuilderWriter requires a Sequence Dictionary. Make sure that the + // Input VCF has one. + final VariantContextWriterBuilder variantContextWriterBuilder = new VariantContextWriterBuilder(); + if (isVcfOrBcf(OUTPUT)) { + final SAMSequenceDictionary sequenceDictionary = header.getSequenceDictionary(); + if (sequenceDictionary == null) { + throw new PicardException("The input vcf must have a sequence dictionary in order to create indexed vcf or bcfs."); + } + variantContextWriterBuilder.setReferenceDictionary(sequenceDictionary); + } + out = variantContextWriterBuilder.setOutputFile(OUTPUT).build(); + header.addMetaDataLine(new VCFFilterHeaderLine("AllGtsFiltered", "Site filtered out because all genotypes are filtered out.")); + header.addMetaDataLine(new VCFFormatHeaderLine("FT", VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.String, "Genotype filters.")); + for (final VariantFilter filter : variantFilters) { + filter.headerLines().forEach(header::addMetaDataLine); + } + + out.writeHeader(in.getFileHeader()); + + while (iterator.hasNext()) { + out.add(iterator.next()); + } + return 0; } finally { - CloserUtil.close(out); - CloserUtil.close(in); + CloserUtil.close(out); + CloserUtil.close(in); } } @@ -171,18 +169,18 @@ private boolean isVcfOrBcf(final File file) { private final String filterName; /** script file */ private final File scriptFile; - + private VariantContextJavascriptFilter(final File scriptFile, final VCFHeader header) throws IOException { - super(scriptFile, header); - this.scriptFile = scriptFile; + super(scriptFile, header); + this.scriptFile = scriptFile; /* create filter name using file basename */ - String fname = IOUtil.basename(scriptFile); - if(fname.isEmpty()) fname="JSFILTER"; - this.filterName = fname; + String fname = IOUtil.basename(scriptFile); + if (fname.isEmpty()) fname = "JSFILTER"; + this.filterName = fname; } /** - * returns the filterName if the javascript doesn't accept the variant , + * returns the filterName if the javascript doesn't accept the variant, * null otherwise */ @Override diff --git a/src/test/java/picard/analysis/MergeableMetricBaseTest.java b/src/test/java/picard/analysis/MergeableMetricBaseTest.java index 6f0fea5ba..e9089d2ab 100644 --- a/src/test/java/picard/analysis/MergeableMetricBaseTest.java +++ b/src/test/java/picard/analysis/MergeableMetricBaseTest.java @@ -32,46 +32,52 @@ class TestMergeableMetric extends MergeableMetricBase { @MergeByAdding - Integer boxedInt = 1; + public Integer boxedInt = 1; @MergeByAdding - int unboxedInt = 2; + public int unboxedInt = 2; @MergeByAdding - Double boxedDouble = 3D; + public Double boxedDouble = 3D; @MergeByAdding - double unboxedDouble = 4D; + public double unboxedDouble = 4D; @MergeByAdding - Long boxedLong = 5L; + public Long boxedLong = 5L; @MergeByAdding - long unboxedLong = 6L; + public long unboxedLong = 6L; @MergeByAdding - Float boxedFloat = 7F; + public Float boxedFloat = 7F; @MergeByAdding - float unboxedFloat = 8F; + public float unboxedFloat = 8F; @MergeByAdding - Short boxedShort = 9; + public Short boxedShort = 9; @MergeByAdding - short unboxedShort = 10; + public short unboxedShort = 10; @MergeByAdding - Byte boxedByte = 11; + public Byte boxedByte = 11; @MergeByAdding - byte unboxedByte = 12; + public byte unboxedByte = 12; @MergeByAssertEquals - String mustBeEqualString = "hello"; + public String mustBeEqualString = "hello"; @MergeByAssertEquals - Double mustBeEqualDouble = 0.5; + public Double mustBeEqualDouble = 0.5; @MergeByAssertEquals - boolean mustBeEqualUnboxedBoolean = false; + public boolean mustBeEqualUnboxedBoolean = false; + + @MergeByAdding + protected Integer protectedIntBase = 1; + + @MergeByAdding + private Integer privateIntBase = 1; @NoMergingIsDerived - double ratioIntValues; + protected double ratioIntValues; @Override public void calculateDerivedFields() { @@ -79,6 +85,47 @@ public void calculateDerivedFields() { } } + class TestMergeableMetricWithRestrictedMembers extends TestMergeableMetric { + + @MergeByAdding + private Integer privateIntDerived = 1; + + @MergeByAdding + protected Integer protectedIntDerived = 1; + + @MergeByAssertEquals + private String privateString = "hi!"; + + @Override + public void calculateDerivedFields() {} + } + + @Test + public void testMergingWithRestrictedMembers() { + final TestMergeableMetricWithRestrictedMembers metric1 = new TestMergeableMetricWithRestrictedMembers(), metric2 = new TestMergeableMetricWithRestrictedMembers(); + metric1.merge(metric2); + + Assert.assertEquals(metric1.boxedInt, (Integer) 2); + Assert.assertEquals(metric1.unboxedInt, 4); + Assert.assertEquals(metric1.privateIntDerived, (Integer) 2); + Assert.assertEquals(metric1.protectedIntDerived, (Integer) 2); + Assert.assertEquals(metric1.protectedIntBase, (Integer) 2); + Assert.assertEquals(((TestMergeableMetric)metric1).privateIntBase, (Integer) 2); + Assert.assertEquals(metric1.privateString, "hi!"); + } + + @Test + public void testMergingWithRestrictedMembersUsingBaseClass() { + final MergeableMetricBase metric1 = new TestMergeableMetricWithRestrictedMembers(), metric2 = new TestMergeableMetricWithRestrictedMembers(); + metric1.merge(metric2); + + Assert.assertEquals(((TestMergeableMetricWithRestrictedMembers)metric1).boxedInt, (Integer) 2); + Assert.assertEquals(((TestMergeableMetricWithRestrictedMembers)metric1).unboxedInt, 4); + Assert.assertEquals(((TestMergeableMetricWithRestrictedMembers)metric1).privateIntDerived, (Integer) 2); + Assert.assertEquals(((TestMergeableMetricWithRestrictedMembers)metric1).privateString, "hi!"); + } + + @Test public void testMerging() { final TestMergeableMetric metric1 = new TestMergeableMetric(), metric2 = new TestMergeableMetric(); @@ -158,13 +205,16 @@ public void testMergingUnequalBoolean() { metric1.merge(metric2); } - private class TestMergeableMericIllegal extends MergeableMetricBase { + private class TestMergeableMetricIllegal extends MergeableMetricBase { Integer undecorated = 0; + + @Override + public void calculateDerivedFields() {} } @Test(expectedExceptions = IllegalStateException.class) public void testIllegalClass() { - final TestMergeableMericIllegal illegal1 = new TestMergeableMericIllegal(), illegal2 = new TestMergeableMericIllegal(); + final TestMergeableMetricIllegal illegal1 = new TestMergeableMetricIllegal(), illegal2 = new TestMergeableMetricIllegal(); illegal1.merge(illegal2); } @@ -193,9 +243,9 @@ public void TestMergingSuperClass() { @Test public void TestCanMerge() { final TestMergeableMetric instance1 = new TestMergeableMetric(); - instance1.unboxedInt=1; + instance1.unboxedInt = 1; final TestDerivedMergableMetric instance2 = new TestDerivedMergableMetric(); - instance2.unboxedInt=2; + instance2.unboxedInt = 2; instance1.merge(instance2); Assert.assertEquals(instance1.unboxedInt, 3); diff --git a/src/test/java/picard/vcf/CollectVariantCallingMetricsTest.java b/src/test/java/picard/vcf/CollectVariantCallingMetricsTest.java index afad347fd..fc89b81ec 100644 --- a/src/test/java/picard/vcf/CollectVariantCallingMetricsTest.java +++ b/src/test/java/picard/vcf/CollectVariantCallingMetricsTest.java @@ -115,7 +115,6 @@ public void testMetricsTiny() throws IOException { Assert.assertEquals(detailMetrics.size(), 50, "Did not parse the desired number of detail metrics."); } - @Test public void testMetricsTinyGVCF() throws IOException { final File dbSnpFile = new File(TEST_DATA_DIR, "mini.dbsnp.vcf");