From 4bec0dd6e243f40d431180b7f24b003dfea3835c Mon Sep 17 00:00:00 2001 From: Yossi Farjoun Date: Thu, 9 Mar 2017 12:02:45 -0500 Subject: [PATCH 1/2] Fixes #769 - added a test. - verified that test fails without changes --- .../directed/CollectTargetedMetricsTest.java | 48 ++++++++++++++++++++-- testdata/picard/quality/chrMReadsWithClips.sam | 5 +++ 2 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 testdata/picard/quality/chrMReadsWithClips.sam diff --git a/src/test/java/picard/analysis/directed/CollectTargetedMetricsTest.java b/src/test/java/picard/analysis/directed/CollectTargetedMetricsTest.java index b66b95ae5..a1d94216c 100644 --- a/src/test/java/picard/analysis/directed/CollectTargetedMetricsTest.java +++ b/src/test/java/picard/analysis/directed/CollectTargetedMetricsTest.java @@ -8,6 +8,7 @@ import htsjdk.samtools.SAMRecord; import htsjdk.samtools.SAMRecordSetBuilder; import htsjdk.samtools.metrics.MetricsFile; +import htsjdk.samtools.util.Histogram; import htsjdk.variant.utils.SAMSequenceDictionaryExtractor; import org.testng.Assert; import org.testng.annotations.BeforeTest; @@ -15,6 +16,7 @@ import org.testng.annotations.Test; import picard.cmdline.CommandLineProgramTest; import picard.sam.SortSam; +import picard.util.TestNGUtil; import java.io.File; import java.io.FileReader; @@ -31,6 +33,11 @@ private File perTargetOutfile; private final static int LENGTH = 99; + final String referenceFile = "testdata/picard/quality/chrM.reference.fasta"; + final String emptyIntervals = "testdata/picard/quality/chrM.empty.interval_list"; + final String singleIntervals = "testdata/picard/quality/chrM.single.interval_list"; + + private final static String sample = "TestSample1"; private final static String readGroupId = "TestReadGroup1"; private final static String platform = "ILLUMINA"; @@ -119,9 +126,6 @@ void setupBuilder() throws IOException { @DataProvider(name = "targetedIntervalDataProvider") public Object[][] targetedIntervalDataProvider() { - final String referenceFile = "testdata/picard/quality/chrM.reference.fasta"; - final String emptyIntervals = "testdata/picard/quality/chrM.empty.interval_list"; - final String singleIntervals = "testdata/picard/quality/chrM.single.interval_list"; return new Object[][] { {tempSamFile, outfile, perTargetOutfile, referenceFile, singleIntervals, 1000}, @@ -146,7 +150,7 @@ public void runCollectTargetedMetricsTest(final File input, final File outfile, Assert.assertEquals(runPicardCommandLine(args), 0); - final MetricsFile> output = new MetricsFile>(); + final MetricsFile> output = new MetricsFile<>(); output.read(new FileReader(outfile)); for (final TargetedPcrMetrics metrics : output.getMetrics()) { @@ -154,4 +158,40 @@ public void runCollectTargetedMetricsTest(final File input, final File outfile, Assert.assertEquals(metrics.HET_SNP_SENSITIVITY, .997972, .02); } } + + + @Test() + public void testRawBqDistributionWithSoftClips() throws IOException { + final String input="testdata/picard/quality/chrMReadsWithClips.sam"; + + final File outFile = File.createTempFile("test", ".TargetedMetrics_Coverage"); + outFile.deleteOnExit(); + + final String[] args = new String[] { + "TARGET_INTERVALS=" + singleIntervals, + "INPUT=" + input, + "OUTPUT=" + outFile.getAbsolutePath(), + "REFERENCE_SEQUENCE=" + referenceFile, + "LEVEL=ALL_READS", + "AMPLICON_INTERVALS=" + singleIntervals, + "SAMPLE_SIZE=" + 0 + }; + + Assert.assertEquals(runPicardCommandLine(args), 0); + + final MetricsFile> output = new MetricsFile<>(); + output.read(new FileReader(outFile)); + + Assert.assertEquals(output.getMetrics().size(), 1); + + for (final TargetedPcrMetrics metrics : output.getMetrics()) { + Assert.assertEquals(metrics.TOTAL_READS, 2); + } + Assert.assertEquals(output.getNumHistograms(), 2); + final Histogram> histogram = output.getAllHistograms().get(1); + Assert.assertTrue(TestNGUtil.compareDoubleWithAccuracy(histogram.getSumOfValues(), 62,0.01)); + Assert.assertTrue(TestNGUtil.compareDoubleWithAccuracy(histogram.get(32).getValue(), 52D, 0.01)); + Assert.assertTrue(TestNGUtil.compareDoubleWithAccuracy(histogram.get(33).getValue(), 10D, 0.01)); + } + } \ No newline at end of file diff --git a/testdata/picard/quality/chrMReadsWithClips.sam b/testdata/picard/quality/chrMReadsWithClips.sam new file mode 100644 index 000000000..d95674bad --- /dev/null +++ b/testdata/picard/quality/chrMReadsWithClips.sam @@ -0,0 +1,5 @@ +@HD VN:1.0 SO:coordinate +@SQ SN:chrM LN:16571 AS:mm9 UR:ftp://hgdownload.cse.ucsc.edu/goldenPath/Mus_musculus_assembly9/bigZips/chromFa.tar.gz M5:11c8af2a2528b25f2c080ab7da42edda SP:Mus musculus +@RG ID:62A40.2 PL:illumina PU:62A40AAXX101028.2 LB:Solexa-45345 DT:2010-10-28T00:00:00-0400 SM:RRBS885 CN:BI +62A40AAXX101028:2:93:3981:7576 99 chrM 110 60 10S26M chrM 130 66 TAGGTTGAATAGTTTATTTTTTTTTAGCAGGGAACT ##########AAAAAAAAAAAAAAAABBBBBBBBBB RG:Z:62A40.2 +62A40AAXX101028:2:93:3981:7576 147 chrM 130 60 36M chrM 110 -66 CGGCGTTAAAGTATTTAGTTGATTCGTTATATTTTA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA RG:Z:62A40.2 \ No newline at end of file From 1fb88b47d0dd10290b7f3b0742324dbf14e0f4a8 Mon Sep 17 00:00:00 2001 From: Yossi Farjoun Date: Thu, 9 Mar 2017 16:27:16 -0500 Subject: [PATCH 2/2] Fixes #769 - verified that fix makes test pass --- src/main/java/picard/analysis/directed/TargetMetricsCollector.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/picard/analysis/directed/TargetMetricsCollector.java b/src/main/java/picard/analysis/directed/TargetMetricsCollector.java index c5a1fee4e..fc91fda92 100644 --- a/src/main/java/picard/analysis/directed/TargetMetricsCollector.java +++ b/src/main/java/picard/analysis/directed/TargetMetricsCollector.java @@ -585,7 +585,7 @@ public void acceptRecord(final SAMRecord record) { // we do not want to increment the base quality histogram for bases that will eventually get thrown out by the coverage cap if (unfilteredCoverageByTarget.get(target).getDepths()[targetOffset] <= coverageCap){ - baseQHistogramArray[baseQualities[offset]]++; + baseQHistogramArray[qual]++; } } }