From ecda7b4817534109fe1702ae2c6e5a12bee2b0f0 Mon Sep 17 00:00:00 2001 From: Takuto Sato Date: Fri, 25 Feb 2022 16:48:01 -0500 Subject: [PATCH 1/8] truncate histograms --- .../analysis/CollectInsertSizeMetrics.java | 5 ++++- .../directed/InsertSizeMetricsCollector.java | 20 ++++++++++++------- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/main/java/picard/analysis/CollectInsertSizeMetrics.java b/src/main/java/picard/analysis/CollectInsertSizeMetrics.java index d6d7916a8a..b7b3773fcb 100644 --- a/src/main/java/picard/analysis/CollectInsertSizeMetrics.java +++ b/src/main/java/picard/analysis/CollectInsertSizeMetrics.java @@ -105,6 +105,9 @@ public class CollectInsertSizeMetrics extends SinglePassSamProgram { "truncated to a shorter range of sizes, the MIN_HISTOGRAM_WIDTH will enforce a minimum range.", optional=true) public Integer MIN_HISTOGRAM_WIDTH = null; + @Argument(shortName = "TR", doc="Truncate the insert size histogram to throw out outliers", optional = true) + public boolean TRUNCATE_HISTOGRAMS = true; + @Argument(shortName="M", doc="When generating the Histogram, discard any data categories (out of FR, TANDEM, RF) that have fewer than this " + "percentage of overall reads. (Range: 0 to 1).") public float MINIMUM_PCT = 0.05f; @@ -148,7 +151,7 @@ protected String[] customCommandLineValidation() { //Delegate actual collection to InsertSizeMetricCollector multiCollector = new InsertSizeMetricsCollector(METRIC_ACCUMULATION_LEVEL, header.getReadGroups(), MINIMUM_PCT, - HISTOGRAM_WIDTH, MIN_HISTOGRAM_WIDTH, DEVIATIONS, INCLUDE_DUPLICATES); + HISTOGRAM_WIDTH, MIN_HISTOGRAM_WIDTH, DEVIATIONS, INCLUDE_DUPLICATES, TRUNCATE_HISTOGRAMS); } @Override protected void acceptRead(final SAMRecord record, final ReferenceSequence ref) { diff --git a/src/main/java/picard/analysis/directed/InsertSizeMetricsCollector.java b/src/main/java/picard/analysis/directed/InsertSizeMetricsCollector.java index 481a11038e..7e3e1a297e 100644 --- a/src/main/java/picard/analysis/directed/InsertSizeMetricsCollector.java +++ b/src/main/java/picard/analysis/directed/InsertSizeMetricsCollector.java @@ -37,18 +37,22 @@ public class InsertSizeMetricsCollector extends MultiLevelCollector accumulationLevels, final List samRgRecords, final double minimumPct, final Integer histogramWidth, final Integer minHistogramWidth, - final double deviations, final boolean includeDuplicates) { + final double deviations, final boolean includeDuplicates, final boolean truncateHistogram) { this.minimumPct = minimumPct; this.histogramWidth = histogramWidth; this.minHistogramWidth = minHistogramWidth; this.deviations = deviations; this.includeDuplicates = includeDuplicates; setup(accumulationLevels, samRgRecords); + this.truncateHistogram = truncateHistogram; } // We will pass insertSize and PairOrientation with the DefaultPerRecordCollectorArgs passed to the record collectors @@ -183,15 +187,17 @@ public void addMetricsToFile(final MetricsFile file) } // Trim the Histogram down to get rid of outliers that would make the chart useless. - final Histogram trimmedHistogram = histogram; // alias it - trimmedHistogram.trimByWidth(getWidthToTrimTo(metrics)); + if (truncateHistogram){ + histogram.trimByWidth(getWidthToTrimTo(metrics)); - if (!trimmedHistogram.isEmpty()) { - metrics.MEAN_INSERT_SIZE = trimmedHistogram.getMean(); - metrics.STANDARD_DEVIATION = trimmedHistogram.getStandardDeviation(); + // Recompute metrics that are sensitive to outliers after trimming. + if (!histogram.isEmpty()) { + metrics.MEAN_INSERT_SIZE = histogram.getMean(); + metrics.STANDARD_DEVIATION = histogram.getStandardDeviation(); + } } - file.addHistogram(trimmedHistogram); + file.addHistogram(histogram); file.addMetric(metrics); } } From f89558dd42e0438ca53cf8b87e67e3e916c510a5 Mon Sep 17 00:00:00 2001 From: Takuto Sato Date: Fri, 25 Feb 2022 17:46:16 -0500 Subject: [PATCH 2/8] add test --- .../CollectInsertSizeMetricsTest.java | 55 +++++++++++++++++-- 1 file changed, 49 insertions(+), 6 deletions(-) diff --git a/src/test/java/picard/analysis/CollectInsertSizeMetricsTest.java b/src/test/java/picard/analysis/CollectInsertSizeMetricsTest.java index 8563813d7a..87f560ffa4 100755 --- a/src/test/java/picard/analysis/CollectInsertSizeMetricsTest.java +++ b/src/test/java/picard/analysis/CollectInsertSizeMetricsTest.java @@ -23,10 +23,7 @@ */ package picard.analysis; -import htsjdk.samtools.SAMFileHeader; -import htsjdk.samtools.SAMFileWriter; -import htsjdk.samtools.SAMFileWriterFactory; -import htsjdk.samtools.SAMRecordSetBuilder; +import htsjdk.samtools.*; import htsjdk.samtools.metrics.MetricsFile; import org.testng.Assert; import org.testng.annotations.Test; @@ -248,6 +245,54 @@ public void testHistogramWidthIsSetProperly() throws IOException { Assert.assertEquals(output.getAllHistograms().size(), 5); } + @Test + public void testNotTruncatingHistogram() throws IOException { + // Make a test file + final File testSamFile = File.createTempFile("CollectInsertSizeMetrics", ".bam"); + testSamFile.deleteOnExit(); + final File testSamFileIndex = new File(testSamFile.getParentFile(),testSamFile.getName().replaceAll("bam$","bai")); + testSamFileIndex.deleteOnExit(); + + final SAMRecordSetBuilder setBuilder = new SAMRecordSetBuilder(true, SAMFileHeader.SortOrder.coordinate, true); + final int readLength = 10; + setBuilder.setReadLength(readLength); + final int minInsertSize = 100; + final int maxInsertSize = 400; + int i = 0; + int start = 1000; + String cigar = readLength + "M"; + for (int j = minInsertSize; j < maxInsertSize; j++) { + setBuilder.addPair("read:" + i++, 0, start, start + j - readLength, false, false, + cigar, cigar, false, true, 60); + } + + // Add an outlier + int outlierInsertSize = 2000; + setBuilder.addPair("outlierRead", 0, start, start + outlierInsertSize - readLength, + false, false, cigar, cigar, false, true, 60); + + final SAMFileWriter writer = new SAMFileWriterFactory().setCreateIndex(true).makeBAMWriter(setBuilder.getHeader(), false, testSamFile); + setBuilder.forEach(writer::addAlignment); + writer.close(); + + final File outfile = File.createTempFile("test", ".insert_size_metrics"); + final File pdf = File.createTempFile("test", ".pdf"); + outfile.deleteOnExit(); + pdf.deleteOnExit(); + final String[] args = new String[]{ + "INPUT=" + testSamFile.getAbsolutePath(), + "OUTPUT=" + outfile.getAbsolutePath(), + "Histogram_FILE=" + pdf.getAbsolutePath(), + "TR=false" + }; + + Assert.assertEquals(runPicardCommandLine(args), 0); + final MetricsFile> output = new MetricsFile<>(); + output.read(new FileReader(outfile)); + + Assert.assertEquals(output.getAllHistograms().get(0).get(outlierInsertSize).getValue(), 1.0); + } + @Test public void testMultipleOrientationsForHistogram() throws IOException { final File output = new File("testdata/picard/analysis/directed/CollectInsertSizeMetrics", "multiple_orientation.sam.insert_size_metrics"); @@ -291,8 +336,6 @@ public void testWidthOfMetrics() throws IOException { testSamFileIndex.deleteOnExit(); - new File(testSamFile.getAbsolutePath().replace(".bam$",".bai")).deleteOnExit(); - final SAMRecordSetBuilder setBuilder = new SAMRecordSetBuilder(true, SAMFileHeader.SortOrder.coordinate, true); setBuilder.setReadLength(10); From 1c078bbab2c21e15fa4386a6e9ce7b2e4ea9b5c1 Mon Sep 17 00:00:00 2001 From: Takuto Sato Date: Fri, 25 Feb 2022 17:47:47 -0500 Subject: [PATCH 3/8] skip --- src/test/java/picard/analysis/CollectInsertSizeMetricsTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/picard/analysis/CollectInsertSizeMetricsTest.java b/src/test/java/picard/analysis/CollectInsertSizeMetricsTest.java index 87f560ffa4..119cb6f11c 100755 --- a/src/test/java/picard/analysis/CollectInsertSizeMetricsTest.java +++ b/src/test/java/picard/analysis/CollectInsertSizeMetricsTest.java @@ -246,7 +246,7 @@ public void testHistogramWidthIsSetProperly() throws IOException { } @Test - public void testNotTruncatingHistogram() throws IOException { + public void testSkipTruncatingHistogram() throws IOException { // Make a test file final File testSamFile = File.createTempFile("CollectInsertSizeMetrics", ".bam"); testSamFile.deleteOnExit(); From a0e151b9611ca45f047fdcbbb83a0cec8748f9f0 Mon Sep 17 00:00:00 2001 From: Takuto Sato Date: Sun, 27 Feb 2022 19:52:50 -0500 Subject: [PATCH 4/8] Update src/main/java/picard/analysis/CollectInsertSizeMetrics.java Co-authored-by: Yossi Farjoun --- src/main/java/picard/analysis/CollectInsertSizeMetrics.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/picard/analysis/CollectInsertSizeMetrics.java b/src/main/java/picard/analysis/CollectInsertSizeMetrics.java index b7b3773fcb..336b7078c8 100644 --- a/src/main/java/picard/analysis/CollectInsertSizeMetrics.java +++ b/src/main/java/picard/analysis/CollectInsertSizeMetrics.java @@ -105,7 +105,7 @@ public class CollectInsertSizeMetrics extends SinglePassSamProgram { "truncated to a shorter range of sizes, the MIN_HISTOGRAM_WIDTH will enforce a minimum range.", optional=true) public Integer MIN_HISTOGRAM_WIDTH = null; - @Argument(shortName = "TR", doc="Truncate the insert size histogram to throw out outliers", optional = true) + @Argument(shortName = "TR", doc="Truncate the insert size histogram to throw out outliers.", optional = true) public boolean TRUNCATE_HISTOGRAMS = true; @Argument(shortName="M", doc="When generating the Histogram, discard any data categories (out of FR, TANDEM, RF) that have fewer than this " + From d6820b470064373acb3efbd486bc82f3fcee203b Mon Sep 17 00:00:00 2001 From: Takuto Sato Date: Sun, 27 Feb 2022 19:53:03 -0500 Subject: [PATCH 5/8] Update src/test/java/picard/analysis/CollectInsertSizeMetricsTest.java Co-authored-by: Yossi Farjoun --- src/test/java/picard/analysis/CollectInsertSizeMetricsTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/picard/analysis/CollectInsertSizeMetricsTest.java b/src/test/java/picard/analysis/CollectInsertSizeMetricsTest.java index 119cb6f11c..55069d86eb 100755 --- a/src/test/java/picard/analysis/CollectInsertSizeMetricsTest.java +++ b/src/test/java/picard/analysis/CollectInsertSizeMetricsTest.java @@ -250,7 +250,7 @@ public void testSkipTruncatingHistogram() throws IOException { // Make a test file final File testSamFile = File.createTempFile("CollectInsertSizeMetrics", ".bam"); testSamFile.deleteOnExit(); - final File testSamFileIndex = new File(testSamFile.getParentFile(),testSamFile.getName().replaceAll("bam$","bai")); + final File testSamFileIndex = new File(testSamFile.getParentFile(),testSamFile.getName().replace("bam$","bai")); testSamFileIndex.deleteOnExit(); final SAMRecordSetBuilder setBuilder = new SAMRecordSetBuilder(true, SAMFileHeader.SortOrder.coordinate, true); From 90576cdb6baebd5c4646c8390793eb075f6a0ede Mon Sep 17 00:00:00 2001 From: Takuto Sato Date: Sun, 27 Feb 2022 20:06:15 -0500 Subject: [PATCH 6/8] commit --- .../analysis/CollectInsertSizeMetrics.java | 10 +++++++--- .../directed/InsertSizeMetricsCollector.java | 18 ++++++------------ .../analysis/CollectInsertSizeMetricsTest.java | 5 ++++- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/main/java/picard/analysis/CollectInsertSizeMetrics.java b/src/main/java/picard/analysis/CollectInsertSizeMetrics.java index 336b7078c8..55d125c20e 100644 --- a/src/main/java/picard/analysis/CollectInsertSizeMetrics.java +++ b/src/main/java/picard/analysis/CollectInsertSizeMetrics.java @@ -105,8 +105,8 @@ public class CollectInsertSizeMetrics extends SinglePassSamProgram { "truncated to a shorter range of sizes, the MIN_HISTOGRAM_WIDTH will enforce a minimum range.", optional=true) public Integer MIN_HISTOGRAM_WIDTH = null; - @Argument(shortName = "TR", doc="Truncate the insert size histogram to throw out outliers.", optional = true) - public boolean TRUNCATE_HISTOGRAMS = true; + @Argument(shortName = "TR", doc="Do not truncate the insert size histogram.", optional = true) + public boolean DO_NOT_TRUNCATE_HISTOGRAMS = false; @Argument(shortName="M", doc="When generating the Histogram, discard any data categories (out of FR, TANDEM, RF) that have fewer than this " + "percentage of overall reads. (Range: 0 to 1).") @@ -149,9 +149,13 @@ protected String[] customCommandLineValidation() { IOUtil.assertFileIsWritable(OUTPUT); IOUtil.assertFileIsWritable(Histogram_FILE); + if (DO_NOT_TRUNCATE_HISTOGRAMS){ + HISTOGRAM_WIDTH = Integer.MAX_VALUE; + } + //Delegate actual collection to InsertSizeMetricCollector multiCollector = new InsertSizeMetricsCollector(METRIC_ACCUMULATION_LEVEL, header.getReadGroups(), MINIMUM_PCT, - HISTOGRAM_WIDTH, MIN_HISTOGRAM_WIDTH, DEVIATIONS, INCLUDE_DUPLICATES, TRUNCATE_HISTOGRAMS); + HISTOGRAM_WIDTH, MIN_HISTOGRAM_WIDTH, DEVIATIONS, INCLUDE_DUPLICATES); } @Override protected void acceptRead(final SAMRecord record, final ReferenceSequence ref) { diff --git a/src/main/java/picard/analysis/directed/InsertSizeMetricsCollector.java b/src/main/java/picard/analysis/directed/InsertSizeMetricsCollector.java index 7e3e1a297e..4c73f87074 100644 --- a/src/main/java/picard/analysis/directed/InsertSizeMetricsCollector.java +++ b/src/main/java/picard/analysis/directed/InsertSizeMetricsCollector.java @@ -37,22 +37,18 @@ public class InsertSizeMetricsCollector extends MultiLevelCollector accumulationLevels, final List samRgRecords, final double minimumPct, final Integer histogramWidth, final Integer minHistogramWidth, - final double deviations, final boolean includeDuplicates, final boolean truncateHistogram) { + final double deviations, final boolean includeDuplicates) { this.minimumPct = minimumPct; this.histogramWidth = histogramWidth; this.minHistogramWidth = minHistogramWidth; this.deviations = deviations; this.includeDuplicates = includeDuplicates; setup(accumulationLevels, samRgRecords); - this.truncateHistogram = truncateHistogram; } // We will pass insertSize and PairOrientation with the DefaultPerRecordCollectorArgs passed to the record collectors @@ -187,14 +183,12 @@ public void addMetricsToFile(final MetricsFile file) } // Trim the Histogram down to get rid of outliers that would make the chart useless. - if (truncateHistogram){ - histogram.trimByWidth(getWidthToTrimTo(metrics)); + histogram.trimByWidth(getWidthToTrimTo(metrics)); - // Recompute metrics that are sensitive to outliers after trimming. - if (!histogram.isEmpty()) { - metrics.MEAN_INSERT_SIZE = histogram.getMean(); - metrics.STANDARD_DEVIATION = histogram.getStandardDeviation(); - } + // Compute metrics that are sensitive to outliers after trimming. + if (!histogram.isEmpty()) { + metrics.MEAN_INSERT_SIZE = histogram.getMean(); + metrics.STANDARD_DEVIATION = histogram.getStandardDeviation(); } file.addHistogram(histogram); diff --git a/src/test/java/picard/analysis/CollectInsertSizeMetricsTest.java b/src/test/java/picard/analysis/CollectInsertSizeMetricsTest.java index 55069d86eb..df864fe762 100755 --- a/src/test/java/picard/analysis/CollectInsertSizeMetricsTest.java +++ b/src/test/java/picard/analysis/CollectInsertSizeMetricsTest.java @@ -23,7 +23,10 @@ */ package picard.analysis; -import htsjdk.samtools.*; +import htsjdk.samtools.SAMFileHeader; +import htsjdk.samtools.SAMFileWriter; +import htsjdk.samtools.SAMFileWriterFactory; +import htsjdk.samtools.SAMRecordSetBuilder; import htsjdk.samtools.metrics.MetricsFile; import org.testng.Assert; import org.testng.annotations.Test; From 7f9ca9f3c5a4f573364222638d1e3f8d59314f4e Mon Sep 17 00:00:00 2001 From: Takuto Sato Date: Sun, 27 Feb 2022 20:29:53 -0500 Subject: [PATCH 7/8] yossi --- .../CollectInsertSizeMetricsTest.java | 55 +++++++++++++------ 1 file changed, 37 insertions(+), 18 deletions(-) diff --git a/src/test/java/picard/analysis/CollectInsertSizeMetricsTest.java b/src/test/java/picard/analysis/CollectInsertSizeMetricsTest.java index df864fe762..83d67cc354 100755 --- a/src/test/java/picard/analysis/CollectInsertSizeMetricsTest.java +++ b/src/test/java/picard/analysis/CollectInsertSizeMetricsTest.java @@ -30,6 +30,7 @@ import htsjdk.samtools.metrics.MetricsFile; import org.testng.Assert; import org.testng.annotations.Test; +import picard.PicardException; import picard.cmdline.CommandLineProgramTest; import picard.util.RExecutor; @@ -250,22 +251,16 @@ public void testHistogramWidthIsSetProperly() throws IOException { @Test public void testSkipTruncatingHistogram() throws IOException { - // Make a test file - final File testSamFile = File.createTempFile("CollectInsertSizeMetrics", ".bam"); - testSamFile.deleteOnExit(); - final File testSamFileIndex = new File(testSamFile.getParentFile(),testSamFile.getName().replace("bam$","bai")); - testSamFileIndex.deleteOnExit(); - final SAMRecordSetBuilder setBuilder = new SAMRecordSetBuilder(true, SAMFileHeader.SortOrder.coordinate, true); final int readLength = 10; setBuilder.setReadLength(readLength); final int minInsertSize = 100; final int maxInsertSize = 400; - int i = 0; - int start = 1000; - String cigar = readLength + "M"; + int readCount = 0; + final int start = 1000; + final String cigar = readLength + "M"; for (int j = minInsertSize; j < maxInsertSize; j++) { - setBuilder.addPair("read:" + i++, 0, start, start + j - readLength, false, false, + setBuilder.addPair("read:" + readCount++, 0, start, start + j - readLength, false, false, cigar, cigar, false, true, 60); } @@ -274,9 +269,16 @@ public void testSkipTruncatingHistogram() throws IOException { setBuilder.addPair("outlierRead", 0, start, start + outlierInsertSize - readLength, false, false, cigar, cigar, false, true, 60); - final SAMFileWriter writer = new SAMFileWriterFactory().setCreateIndex(true).makeBAMWriter(setBuilder.getHeader(), false, testSamFile); - setBuilder.forEach(writer::addAlignment); - writer.close(); + final File testSamFile = File.createTempFile("CollectInsertSizeMetrics", ".bam"); + testSamFile.deleteOnExit(); + final File testSamFileIndex = new File(testSamFile.getParentFile(),testSamFile.getName().replace("bam$","bai")); + testSamFileIndex.deleteOnExit(); + try ( final SAMFileWriter writer = new SAMFileWriterFactory().setCreateIndex(true) + .makeBAMWriter(setBuilder.getHeader(), false, testSamFile)) { + setBuilder.forEach(writer::addAlignment); + } catch (Exception e){ + throw new PicardException(""); + } final File outfile = File.createTempFile("test", ".insert_size_metrics"); final File pdf = File.createTempFile("test", ".pdf"); @@ -286,7 +288,7 @@ public void testSkipTruncatingHistogram() throws IOException { "INPUT=" + testSamFile.getAbsolutePath(), "OUTPUT=" + outfile.getAbsolutePath(), "Histogram_FILE=" + pdf.getAbsolutePath(), - "TR=false" + "TR=" + true }; Assert.assertEquals(runPicardCommandLine(args), 0); @@ -294,6 +296,23 @@ public void testSkipTruncatingHistogram() throws IOException { output.read(new FileReader(outfile)); Assert.assertEquals(output.getAllHistograms().get(0).get(outlierInsertSize).getValue(), 1.0); + + // Run again with truncation enabled + final File outfileWithTruncation = File.createTempFile("test", ".insert_size_metrics"); + outfileWithTruncation.deleteOnExit(); + final String[] argsWithTruncation = new String[]{ + "INPUT=" + testSamFile.getAbsolutePath(), + "OUTPUT=" + outfileWithTruncation.getAbsolutePath(), + "Histogram_FILE=" + pdf.getAbsolutePath() + }; + + Assert.assertEquals(runPicardCommandLine(argsWithTruncation), 0); + final MetricsFile> outputWithTruncation = new MetricsFile<>(); + outputWithTruncation.read(new FileReader(outfileWithTruncation)); + + // Check that the outlier has been removed when truncation is enabled + Assert.assertFalse(outputWithTruncation.getAllHistograms().get(0).containsKey(outlierInsertSize)); + } @Test @@ -368,10 +387,10 @@ public void testWidthOfMetrics() throws IOException { // Add one to make the an odd # of pairs for the median setBuilder.addPair("query:" + queryIndex, 0, 1, 50, false, false, "10M", "10M", false, true, 60); - final SAMFileWriter writer = new SAMFileWriterFactory().setCreateIndex(true).makeBAMWriter(setBuilder.getHeader(), false, testSamFile); - setBuilder.forEach(writer::addAlignment); - writer.close(); - + try(final SAMFileWriter writer = new SAMFileWriterFactory().setCreateIndex(true) + .makeBAMWriter(setBuilder.getHeader(), false, testSamFile)){ + setBuilder.forEach(writer::addAlignment); + } final File outfile = File.createTempFile("test", ".insert_size_metrics"); final File pdf = File.createTempFile("test", ".pdf"); From f0252f352a0b8723199926323a17b6bd4b88d5d9 Mon Sep 17 00:00:00 2001 From: Takuto Sato Date: Sun, 27 Feb 2022 20:35:06 -0500 Subject: [PATCH 8/8] wrong test --- .../picard/analysis/CollectInsertSizeMetricsTest.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/test/java/picard/analysis/CollectInsertSizeMetricsTest.java b/src/test/java/picard/analysis/CollectInsertSizeMetricsTest.java index 83d67cc354..e8756304ea 100755 --- a/src/test/java/picard/analysis/CollectInsertSizeMetricsTest.java +++ b/src/test/java/picard/analysis/CollectInsertSizeMetricsTest.java @@ -276,8 +276,6 @@ public void testSkipTruncatingHistogram() throws IOException { try ( final SAMFileWriter writer = new SAMFileWriterFactory().setCreateIndex(true) .makeBAMWriter(setBuilder.getHeader(), false, testSamFile)) { setBuilder.forEach(writer::addAlignment); - } catch (Exception e){ - throw new PicardException(""); } final File outfile = File.createTempFile("test", ".insert_size_metrics"); @@ -387,10 +385,9 @@ public void testWidthOfMetrics() throws IOException { // Add one to make the an odd # of pairs for the median setBuilder.addPair("query:" + queryIndex, 0, 1, 50, false, false, "10M", "10M", false, true, 60); - try(final SAMFileWriter writer = new SAMFileWriterFactory().setCreateIndex(true) - .makeBAMWriter(setBuilder.getHeader(), false, testSamFile)){ - setBuilder.forEach(writer::addAlignment); - } + final SAMFileWriter writer = new SAMFileWriterFactory().setCreateIndex(true).makeBAMWriter(setBuilder.getHeader(), false, testSamFile); + setBuilder.forEach(writer::addAlignment); + writer.close(); final File outfile = File.createTempFile("test", ".insert_size_metrics"); final File pdf = File.createTempFile("test", ".pdf");