From c3f62862c32ff864ee5d905d605a167e5a4d1bb5 Mon Sep 17 00:00:00 2001 From: Nils Homer Date: Thu, 18 May 2017 14:27:05 -0700 Subject: [PATCH 1/2] A test to prove that overflow occurs. --- .../java/picard/analysis/directed/TargetMetricsCollector.java | 9 +++++++-- .../picard/analysis/directed/CollectTargetedMetricsTest.java | 10 ++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/main/java/picard/analysis/directed/TargetMetricsCollector.java b/src/main/java/picard/analysis/directed/TargetMetricsCollector.java index 650f4b287..a79a7b8c4 100644 --- a/src/main/java/picard/analysis/directed/TargetMetricsCollector.java +++ b/src/main/java/picard/analysis/directed/TargetMetricsCollector.java @@ -880,8 +880,13 @@ public Coverage(final Interval i, final int padding) { /** Adds a single point of depth at the desired offset into the coverage array. */ public void addBase(final int offset) { - if (offset >= 0 && offset < this.depths.length && this.depths[offset] < Integer.MAX_VALUE) { - this.depths[offset] += 1; + addBase(offset, 1); + } + + /** Adds some depth at the desired offset into the coverage array. */ + public void addBase(final int offset, final int depth) { + if (offset >= 0 && offset < this.depths.length && this.depths[offset] < Integer.MAX_VALUE - depth) { + this.depths[offset] += depth; } } diff --git a/src/test/java/picard/analysis/directed/CollectTargetedMetricsTest.java b/src/test/java/picard/analysis/directed/CollectTargetedMetricsTest.java index a1d94216c..7cd9b99e0 100644 --- a/src/test/java/picard/analysis/directed/CollectTargetedMetricsTest.java +++ b/src/test/java/picard/analysis/directed/CollectTargetedMetricsTest.java @@ -9,6 +9,7 @@ import htsjdk.samtools.SAMRecordSetBuilder; import htsjdk.samtools.metrics.MetricsFile; import htsjdk.samtools.util.Histogram; +import htsjdk.samtools.util.Interval; import htsjdk.variant.utils.SAMSequenceDictionaryExtractor; import org.testng.Assert; import org.testng.annotations.BeforeTest; @@ -194,4 +195,13 @@ public void testRawBqDistributionWithSoftClips() throws IOException { Assert.assertTrue(TestNGUtil.compareDoubleWithAccuracy(histogram.get(33).getValue(), 10D, 0.01)); } + @Test + public void testCoverageGetTotalOverflow() { + final Interval interval = new Interval("chr1", 1, 2); + final TargetMetricsCollector.Coverage coverage = new TargetMetricsCollector.Coverage(interval, 0); + for (int offset = 0; offset <= interval.length(); offset++) { + coverage.addBase(offset, Integer.MAX_VALUE - 1); + } + Assert.assertEquals((long)coverage.getTotal(), 2 * (long)(Integer.MAX_VALUE - 1)); + } } \ No newline at end of file From 954ace670fa4a6f824ac959085990c4ce943d374 Mon Sep 17 00:00:00 2001 From: Nils Homer Date: Thu, 18 May 2017 14:29:27 -0700 Subject: [PATCH 2/2] Fixing an overflow bug with high coverage. --- .../java/picard/analysis/directed/TargetMetricsCollector.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/picard/analysis/directed/TargetMetricsCollector.java b/src/main/java/picard/analysis/directed/TargetMetricsCollector.java index a79a7b8c4..1094cefdb 100644 --- a/src/main/java/picard/analysis/directed/TargetMetricsCollector.java +++ b/src/main/java/picard/analysis/directed/TargetMetricsCollector.java @@ -908,9 +908,11 @@ public boolean hasCoverage() { /** Gets the coverage depths as an array of ints. */ public int[] getDepths() { return this.depths; } - public int getTotal() { - int total = 0; - for (int i=0; i