From 9bee183f6c011cef630dfe1a7c74ed0ded43ddeb Mon Sep 17 00:00:00 2001 From: Khalid Shakir Date: Sun, 2 Aug 2015 10:50:39 -0300 Subject: [PATCH] Switched to using CRAM's SamReader.Indexing implementation. CRAM now requires .bai index, just like BAM. Test updates: - Updated existing MD5s, as TLEN has changed. - Tests multiple contigs. - Tests several intervals per contig. - Tests when `.cram.bai` is missing, even when `.cram.crai` is present. Updated gatk docs for CRAM support, including: - Arguments that work for both BAM and CRAM listed as such. - Arguments that don't work for CRAM either explicitly say "BAM" or "doesn't work for CRAM". - Instructions on how to recreate a `.cram.bai` using cramtools. Cleaned up IntelliJ IDEA warnings regarding `Arrays.asList()` -> `Collections.singletonList()`. --- .../gatk/engine/GenomeAnalysisEngine.java | 2 +- .../arguments/GATKArgumentCollection.java | 46 +++++++-------- .../datasources/reads/SAMDataSource.java | 39 +++---------- .../io/storage/SAMFileWriterStorage.java | 8 +-- .../engine/arguments/CramIntegrationTest.java | 36 ++++++++---- .../arguments/IntervalIntegrationTest.java | 53 +++++++++++++----- .../readutils/PrintReadsIntegrationTest.java | 4 +- .../utils/commandline/CommandLineProgram.java | 7 ++- .../utils/sam/ArtificialSAMFileReader.java | 2 - .../resources/exampleCRAM-nobai-nocrai.cram | Bin 0 -> 5281 bytes .../resources/exampleCRAM-nobai-withcrai.cram | Bin 0 -> 5281 bytes .../exampleCRAM-nobai-withcrai.cram.crai | Bin 0 -> 44 bytes .../test/resources/exampleCRAM-noindex.cram | Bin 3677 -> 0 bytes .../src/test/resources/exampleCRAM.cram | Bin 3677 -> 5281 bytes .../src/test/resources/exampleCRAM.cram.bai | Bin 136 -> 136 bytes .../src/test/resources/exampleCRAM.cram.crai | Bin 46 -> 0 bytes 16 files changed, 107 insertions(+), 90 deletions(-) create mode 100644 public/gatk-utils/src/test/resources/exampleCRAM-nobai-nocrai.cram create mode 100644 public/gatk-utils/src/test/resources/exampleCRAM-nobai-withcrai.cram create mode 100644 public/gatk-utils/src/test/resources/exampleCRAM-nobai-withcrai.cram.crai delete mode 100644 public/gatk-utils/src/test/resources/exampleCRAM-noindex.cram delete mode 100644 public/gatk-utils/src/test/resources/exampleCRAM.cram.crai diff --git a/public/gatk-engine/src/main/java/org/broadinstitute/gatk/engine/GenomeAnalysisEngine.java b/public/gatk-engine/src/main/java/org/broadinstitute/gatk/engine/GenomeAnalysisEngine.java index c92111c7b..86f020394 100644 --- a/public/gatk-engine/src/main/java/org/broadinstitute/gatk/engine/GenomeAnalysisEngine.java +++ b/public/gatk-engine/src/main/java/org/broadinstitute/gatk/engine/GenomeAnalysisEngine.java @@ -642,7 +642,7 @@ public class GenomeAnalysisEngine { // If reads are present, assume that accessing the reads is always the dominant factor and shard based on that supposition. if(!readsDataSource.isEmpty()) { if(!readsDataSource.hasIndex() && !exclusions.contains(ValidationExclusion.TYPE.ALLOW_UNINDEXED_BAM)) - throw new UserException.CommandLineException("Cannot process the provided BAM file(s) because they were not indexed. The GATK does offer limited processing of unindexed BAMs in --unsafe mode, but this GATK feature is currently unsupported."); + throw new UserException.CommandLineException("Cannot process the provided BAM/CRAM file(s) because they were not indexed. The GATK does offer limited processing of unindexed BAM/CRAMs in --unsafe mode, but this feature is unsupported -- use it at your own risk!"); if(!readsDataSource.hasIndex() && intervals != null && !argCollection.allowIntervalsWithUnindexedBAM) throw new UserException.CommandLineException("Cannot perform interval processing when reads are present but no index is available."); diff --git a/public/gatk-engine/src/main/java/org/broadinstitute/gatk/engine/arguments/GATKArgumentCollection.java b/public/gatk-engine/src/main/java/org/broadinstitute/gatk/engine/arguments/GATKArgumentCollection.java index 42adde781..610467f70 100644 --- a/public/gatk-engine/src/main/java/org/broadinstitute/gatk/engine/arguments/GATKArgumentCollection.java +++ b/public/gatk-engine/src/main/java/org/broadinstitute/gatk/engine/arguments/GATKArgumentCollection.java @@ -56,15 +56,15 @@ public class GATKArgumentCollection { // parameters and their defaults /** - * An input file containing sequence data mapped to a reference, in SAM or BAM format, or a text file containing a - * list of input files (with extension .list). Note that the GATK requires an accompanying index for each SAM or - * BAM file. Please see our online documentation for more details on input formatting requirements. + * An input file containing sequence data mapped to a reference, in BAM or CRAM format, or a text file containing a + * list of input files (with extension .list). Note that the GATK requires an accompanying .bai index for each BAM + * or CRAM file. Please see our online documentation for more details on input formatting requirements. */ - @Input(fullName = "input_file", shortName = "I", doc = "Input file containing sequence data (SAM or BAM)", required = false) + @Input(fullName = "input_file", shortName = "I", doc = "Input file containing sequence data (BAM or CRAM)", required = false) public List samFiles = new ArrayList<>(); @Advanced - @Argument(fullName = "showFullBamList",doc="Emit a log entry (level INFO) containing the full list of sequence data files to be included in the analysis (including files inside .bam.list files).") + @Argument(fullName = "showFullBamList",doc="Emit a log entry (level INFO) containing the full list of sequence data files to be included in the analysis (including files inside .bam.list or .cram.list files).") public Boolean showFullBamList = false; @Advanced @@ -278,8 +278,8 @@ public class GATKArgumentCollection { public boolean FIX_MISENCODED_QUALS = false; /** * This flag tells GATK to ignore warnings when encountering base qualities that are too high and that seemingly - * indicate a problem with the base quality encoding of the BAM file. You should only use this if you really know - * what you are doing; otherwise you could seriously mess up your data and ruin your analysis. + * indicate a problem with the base quality encoding of the BAM or CRAM file. You should only use this if you really + * know what you are doing; otherwise you could seriously mess up your data and ruin your analysis. */ @Argument(fullName = "allow_potentially_misencoded_quality_scores", shortName="allowPotentiallyMisencodedQuals", doc="Ignore warnings about base quality score encoding", required = false) public boolean ALLOW_POTENTIALLY_MISENCODED_QUALS = false; @@ -320,7 +320,8 @@ public class GATKArgumentCollection { /** * Enables on-the-fly recalibrate of base qualities, intended primarily for use with BaseRecalibrator and PrintReads * (see Best Practices workflow documentation). The covariates tables are produced by the BaseRecalibrator tool. - * Please be aware that you should only run recalibration with the covariates file created on the same input bam(s). + * Please be aware that you should only run recalibration with the covariates file created on the same input BAM(s) + * or CRAM(s). */ @Input(fullName="BQSR", shortName="BQSR", required=false, doc="Input covariates table file for on-the-fly base quality score recalibration") public File BQSR_RECAL_FILE = null; @@ -343,14 +344,14 @@ public class GATKArgumentCollection { public boolean disableIndelQuals = false; /** - * By default, the OQ tag in not emitted when using the -BQSR argument. Use this flag to include OQ tags in the output BAM file. + * By default, the OQ tag in not emitted when using the -BQSR argument. Use this flag to include OQ tags in the output BAM or CRAM file. * Note that this may results in significant file size increase. */ @Argument(fullName="emit_original_quals", shortName = "EOQ", doc = "Emit the OQ tag with the original base qualities (with -BQSR)", required=false) public boolean emitOriginalQuals = false; /** - * This flag tells GATK not to modify quality scores less than this value. Instead they will be written out unmodified in the recalibrated BAM file. + * This flag tells GATK not to modify quality scores less than this value. Instead they will be written out unmodified in the recalibrated BAM or CRAM file. * In general it's unsafe to change qualities scores below < 6, since base callers use these values to indicate random or bad bases. * For example, Illumina writes Q2 bases when the machine has really gone wrong. This would be fine in and of itself, * but when you select a subset of these reads based on their ability to align to the reference and their dinucleotide effect, @@ -379,7 +380,7 @@ public class GATKArgumentCollection { @Argument(fullName = "validation_strictness", shortName = "S", doc = "How strict should we be with validation", required = false) public ValidationStringency strictnessLevel = ValidationStringency.SILENT; /** - * Some tools keep program records in the SAM header by default. Use this argument to override that behavior and discard program records for the SAM header. + * Some tools keep program records in the SAM header by default. Use this argument to override that behavior and discard program records for the SAM header. Does not work on CRAM files. */ @Argument(fullName = "remove_program_records", shortName = "rpr", doc = "Remove program records from the SAM header", required = false) public boolean removeProgramRecords = false; @@ -390,12 +391,12 @@ public class GATKArgumentCollection { public boolean keepProgramRecords = false; /** - * On-the-fly sample renaming works only with single-sample BAM and VCF files. Each line of the mapping file must - * contain the absolute path to a BAM or VCF file, followed by whitespace, followed by the new sample name for that - * BAM or VCF file. The sample name may contain non-tab whitespace, but leading or trailing whitespace will be - * ignored. The engine will verify at runtime that each BAM/VCF targeted for sample renaming has only a single - * sample specified in its header (though, in the case of BAM files, there may be multiple read groups for that - * sample). + * On-the-fly sample renaming works only with single-sample BAM, CRAM, and VCF files. Each line of the mapping file + * must contain the absolute path to a BAM, CRAM, or VCF file, followed by whitespace, followed by the new sample + * name for that BAM, CRAM, or VCF file. The sample name may contain non-tab whitespace, but leading or trailing + * whitespace will be ignored. The engine will verify at runtime that each BAM/CRAM/VCF targeted for sample + * renaming has only a single sample specified in its header (though, in the case of BAM/CRAM files, there may be + * multiple read groups for that sample). */ @Advanced @Argument(fullName = "sample_rename_mapping_file", shortName = "sample_rename_mapping_file", doc = "Rename sample IDs on-the-fly at runtime using the provided mapping file", required = false) @@ -453,12 +454,12 @@ public class GATKArgumentCollection { @Advanced @Argument(fullName = "simplifyBAM", shortName = "simplifyBAM", - doc = "If provided, output BAM files will be simplified to include just key reads for downstream variation discovery analyses (removing duplicates, PF-, non-primary reads), as well stripping all extended tags from the kept reads except the read group identifier", + doc = "If provided, output BAM/CRAM files will be simplified to include just key reads for downstream variation discovery analyses (removing duplicates, PF-, non-primary reads), as well stripping all extended tags from the kept reads except the read group identifier", required = false) public boolean simplifyBAM = false; @Advanced - @Argument(fullName = "disable_bam_indexing", doc = "Turn off on-the-fly creation of indices for output BAM files.", + @Argument(fullName = "disable_bam_indexing", doc = "Turn off on-the-fly creation of indices for output BAM/CRAM files.", required = false) public boolean disableBAMIndexing = false; @@ -488,7 +489,7 @@ public class GATKArgumentCollection { @Argument(fullName="num_cpu_threads_per_data_thread", shortName = "nct", doc="Number of CPU threads to allocate per data thread", required = false, minValue = 1) public int numberOfCPUThreadsPerDataThread = 1; - @Argument(fullName="num_io_threads", shortName = "nit", doc="Number of given threads to allocate to IO", required = false, minValue = 0) + @Argument(fullName="num_io_threads", shortName = "nit", doc="Number of given threads to allocate to BAM IO", required = false, minValue = 0) @Hidden public int numberOfIOThreads = 0; @@ -500,7 +501,8 @@ public class GATKArgumentCollection { @Argument(fullName = "monitorThreadEfficiency", shortName = "mte", doc = "Enable threading efficiency monitoring", required = false) public Boolean monitorThreadEfficiency = false; - @Argument(fullName = "num_bam_file_handles", shortName = "bfh", doc="Total number of BAM file handles to keep open simultaneously", required=false, minValue = 1) + @Argument(fullName = "num_bam_file_handles", shortName = "bfh", doc="When using IO threads, total number of BAM file handles to keep open simultaneously", required=false, minValue = 1) + @Hidden public Integer numberOfBAMFileHandles = null; /** * This will filter out read groups matching : (e.g. SM:sample1) or a .txt file containing the filter strings one per line. @@ -598,7 +600,7 @@ public class GATKArgumentCollection { /** * NO INTEGRATION TESTS are available. Use at your own risk. */ - @Argument(fullName="allow_intervals_with_unindexed_bam",doc="Allow interval processing with an unsupported BAM",required=false) + @Argument(fullName="allow_intervals_with_unindexed_bam",doc="Allow interval processing with an unsupported BAM/CRAM",required=false) @Hidden public boolean allowIntervalsWithUnindexedBAM = false; diff --git a/public/gatk-engine/src/main/java/org/broadinstitute/gatk/engine/datasources/reads/SAMDataSource.java b/public/gatk-engine/src/main/java/org/broadinstitute/gatk/engine/datasources/reads/SAMDataSource.java index e946f3e72..b735ff833 100644 --- a/public/gatk-engine/src/main/java/org/broadinstitute/gatk/engine/datasources/reads/SAMDataSource.java +++ b/public/gatk-engine/src/main/java/org/broadinstitute/gatk/engine/datasources/reads/SAMDataSource.java @@ -497,20 +497,13 @@ public class SAMDataSource { * @return True if all readers that require an index for SAMFileSpan creation have an index. */ public boolean hasIndex() { - for (final SAMReaderID readerID: readerIDs) - if (isSAMFileSpanSupported(readerID)) - if (!hasIndex(readerID)) - return false; + for (final SAMReaderID readerID: readerIDs) { + if (!hasIndex(readerID)) { + return false; + } + } return true; } - /** - * Returns true if the reader can use file spans. - * @return true if file spans are supported. - */ - private boolean isSAMFileSpanSupported(final SAMReaderID readerID) { - // example: https://github.com/samtools/htsjdk/blob/ee4308ede60962f3ab4275473ac384724b471149/src/java/htsjdk/samtools/BAMFileReader.java#L341 - return readerID.getSamFile().getName().toLowerCase().endsWith(SamReader.Type.BAM_TYPE.fileExtension()); - } /** * Returns true if the reader caches its SAMFileHeader for each iterator. @@ -579,16 +572,7 @@ public class SAMDataSource { SAMReaders readers = resourcePool.getAvailableReaders(); for ( SAMReaderID id: getReaderIDs() ) { - GATKBAMFileSpan span; - try { - span = new GATKBAMFileSpan(readers.getReader(id).indexing().getFilePointerSpanningReads()); - } catch (RuntimeException e) { - if ("Not implemented.".equals(e.getMessage())) { https://github.com/samtools/htsjdk/blob/035d4319643657d715e93c53c13fe4a1f64e0188/src/java/htsjdk/samtools/CRAMFileReader.java#L197 - span = new GATKBAMFileSpan(new GATKChunk(0, Long.MAX_VALUE)); - } else { - throw e; - } - } + final GATKBAMFileSpan span = new GATKBAMFileSpan(readers.getReader(id).indexing().getFilePointerSpanningReads()); initialPositions.put(id, span); } @@ -636,16 +620,7 @@ public class SAMDataSource { } else { final SamReader reader = readers.getReader(id); - try { - iterator = ((SamReader.Indexing)reader).iterator(shard.getFileSpans().get(id)); - } catch (RuntimeException re) { - if ("Not implemented.".equals(re.getMessage())) { // https://github.com/samtools/htsjdk/blob/429f2a8585d9c98a3efd4cedc5188b60b1e66ac5/src/java/htsjdk/samtools/CRAMFileReader.java#L192 - // No way to jump into the file span. Query the whole file. - iterator = readers.getReader(id).iterator(); - } else { - throw re; - } - } + iterator = ((SamReader.Indexing)reader).iterator(shard.getFileSpans().get(id)); } } catch ( RuntimeException e ) { // we need to catch RuntimeExceptions here because the Picard code is throwing them (among SAMFormatExceptions) sometimes throw new UserException.MalformedBAM(id.getSamFile(), e.getMessage()); diff --git a/public/gatk-engine/src/main/java/org/broadinstitute/gatk/engine/io/storage/SAMFileWriterStorage.java b/public/gatk-engine/src/main/java/org/broadinstitute/gatk/engine/io/storage/SAMFileWriterStorage.java index 9d5712c38..108b1f0e7 100644 --- a/public/gatk-engine/src/main/java/org/broadinstitute/gatk/engine/io/storage/SAMFileWriterStorage.java +++ b/public/gatk-engine/src/main/java/org/broadinstitute/gatk/engine/io/storage/SAMFileWriterStorage.java @@ -75,12 +75,10 @@ public class SAMFileWriterStorage implements SAMFileWriter, Storage %s: %s", walker, input, ext, args), spec); } + + @DataProvider(name = "cramNoBaiData") + public Object[][] getCRAMNoBaiData() { + return new Object[][]{ + {"exampleCRAM-nobai-nocrai.cram"}, + {"exampleCRAM-nobai-withcrai.cram"}, + }; + } + + @Test(dataProvider = "cramNoBaiData") + public void testCRAMNoBai(String input) { + WalkerTestSpec spec = new WalkerTestSpec( + " -T TestPrintReadsWalker" + + " -I " + publicTestDir + input + + " -R " + exampleFASTA, + 0, + UserException.class); + executeTest(String.format("testCRAMNoBai %s", input), spec); + } } diff --git a/public/gatk-engine/src/test/java/org/broadinstitute/gatk/engine/arguments/IntervalIntegrationTest.java b/public/gatk-engine/src/test/java/org/broadinstitute/gatk/engine/arguments/IntervalIntegrationTest.java index cb817dd1e..085473cd9 100644 --- a/public/gatk-engine/src/test/java/org/broadinstitute/gatk/engine/arguments/IntervalIntegrationTest.java +++ b/public/gatk-engine/src/test/java/org/broadinstitute/gatk/engine/arguments/IntervalIntegrationTest.java @@ -29,7 +29,6 @@ import org.broadinstitute.gatk.engine.walkers.WalkerTest; import org.testng.annotations.Test; import java.io.File; -import java.util.Arrays; import java.util.Collections; /** @@ -45,7 +44,7 @@ public class IntervalIntegrationTest extends WalkerTest { " -R " + hg18Reference + " -o %s", 1, // just one output file - Arrays.asList(md5)); + Collections.singletonList(md5)); executeTest("testAllIntervalsImplicit",spec); } @@ -84,6 +83,32 @@ public class IntervalIntegrationTest extends WalkerTest { executeTest("testUnmappedReadInclusion",spec); } + @Test + public void testMultipleIntervalInclusionOnCRAM() { + WalkerTest.WalkerTestSpec spec = new WalkerTest.WalkerTestSpec( + "-T TestPrintReadsWalker" + + " -I " + validationDataLocation + "MV1994.cram" + + " -R " + validationDataLocation + "Escherichia_coli_K12_MG1655.fasta" + + " -L Escherichia_coli_K12:11000" + + " -L Escherichia_coli_K12:12000" + + " -L Escherichia_coli_K12:13000" + + " -L Escherichia_coli_K12:14000" + + " -L Escherichia_coli_K12:15000" + + " -L Escherichia_coli_K12:16000" + + " -L Escherichia_coli_K12:17000" + + " -L unmapped", + 0, // two output files + Collections.emptyList()); + + // our base file + File baseOutputFile = createTempFile("testUnmappedReadInclusion", ".cram"); + spec.setOutputFileLocation(baseOutputFile); + spec.addAuxFile("36b3dfdcc3a5ab4e240a6e3237101489", createTempFileFromBase(baseOutputFile.getAbsolutePath())); + spec.addAuxFile("ebbe6e311b6bb240554ec96ed9809216", createTempFileFromBase(baseOutputFile.getAbsolutePath() + ".bai")); + + executeTest("testUnmappedReadInclusionCRAM", spec); + } + @Test public void testMixedMappedAndUnmapped() { WalkerTest.WalkerTestSpec spec = new WalkerTest.WalkerTestSpec( @@ -136,7 +161,7 @@ public class IntervalIntegrationTest extends WalkerTest { " -o %s" + " -L " + validationDataLocation + "intervalTest.1.vcf", 1, // just one output file - Arrays.asList(md5)); + Collections.singletonList(md5)); executeTest("testIntervalParsingFromFile", spec); } @@ -151,7 +176,7 @@ public class IntervalIntegrationTest extends WalkerTest { " -L " + validationDataLocation + "intervalTest.1.vcf" + " -L " + validationDataLocation + "intervalTest.2.vcf", 1, // just one output file - Arrays.asList(md5)); + Collections.singletonList(md5)); executeTest("testIntervalMergingFromFiles", spec); } @@ -166,7 +191,7 @@ public class IntervalIntegrationTest extends WalkerTest { " -L " + validationDataLocation + "intervalTest.1.vcf" + " -XL " + validationDataLocation + "intervalTest.2.vcf", 1, // just one output file - Arrays.asList(md5)); + Collections.singletonList(md5)); executeTest("testIntervalExclusionsFromFiles", spec); } @@ -181,7 +206,7 @@ public class IntervalIntegrationTest extends WalkerTest { " -L " + validationDataLocation + "intervalTest.1.vcf" + " -L chr1:1677524-1677528", 1, // just one output file - Arrays.asList(md5)); + Collections.singletonList(md5)); executeTest("testMixedIntervalMerging", spec); } @@ -195,7 +220,7 @@ public class IntervalIntegrationTest extends WalkerTest { " -o %s" + " -L " + validationDataLocation + "intervalTest.bed", 1, // just one output file - Arrays.asList(md5)); + Collections.singletonList(md5)); executeTest("testBed", spec); } @@ -209,7 +234,7 @@ public class IntervalIntegrationTest extends WalkerTest { " -o %s" + " -L " + validationDataLocation + "intervalTest.3.vcf", 1, // just one output file - Arrays.asList(md5)); + Collections.singletonList(md5)); executeTest("testComplexVCF", spec); } @@ -224,7 +249,7 @@ public class IntervalIntegrationTest extends WalkerTest { " -o %s" + " -L " + validationDataLocation + "intervalTest.3.vcf", 1, // just one output file - Arrays.asList(md5)); + Collections.singletonList(md5)); executeTest("testComplexVCFWithPadding", spec); } @@ -239,7 +264,7 @@ public class IntervalIntegrationTest extends WalkerTest { " -L " + validationDataLocation + "intervalTest.1.vcf" + " -XL " + validationDataLocation + "intervalTest.3.vcf", 1, // just one output file - Arrays.asList(md5)); + Collections.singletonList(md5)); executeTest("testMergingWithComplexVCF", spec); } @@ -253,7 +278,7 @@ public class IntervalIntegrationTest extends WalkerTest { " -o %s" + " -L " + validationDataLocation + "intervalTest.empty.vcf", 1, // just one output file - Arrays.asList(md5)); + Collections.singletonList(md5)); executeTest("testEmptyVCFWarning", spec); } @@ -268,7 +293,7 @@ public class IntervalIntegrationTest extends WalkerTest { " -L " + validationDataLocation + "intervalTest.1.vcf" + " -XL " + validationDataLocation + "intervalTest.1.vcf", 1, // just one output file - Arrays.asList(md5)); + Collections.singletonList(md5)); executeTest("testIncludeExcludeIsTheSame", spec); } @@ -282,7 +307,7 @@ public class IntervalIntegrationTest extends WalkerTest { " -o %s" + " -L " + privateTestDir + "symbolic_alleles_1.vcf", 1, // just one output file - Arrays.asList(md5)); + Collections.singletonList(md5)); executeTest("testSymbolicAlleles", spec); } @@ -298,7 +323,7 @@ public class IntervalIntegrationTest extends WalkerTest { " -isr INTERSECTION" + " -o %s", 1, // just one output file - Arrays.asList(md5)); + Collections.singletonList(md5)); executeTest("testIntersectionOfLexicographicallySortedIntervals", spec); } } diff --git a/public/gatk-tools-public/src/test/java/org/broadinstitute/gatk/tools/walkers/readutils/PrintReadsIntegrationTest.java b/public/gatk-tools-public/src/test/java/org/broadinstitute/gatk/tools/walkers/readutils/PrintReadsIntegrationTest.java index 2e5da9436..d7cb52ad0 100644 --- a/public/gatk-tools-public/src/test/java/org/broadinstitute/gatk/tools/walkers/readutils/PrintReadsIntegrationTest.java +++ b/public/gatk-tools-public/src/test/java/org/broadinstitute/gatk/tools/walkers/readutils/PrintReadsIntegrationTest.java @@ -32,6 +32,7 @@ import org.testng.annotations.Test; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; public class PrintReadsIntegrationTest extends WalkerTest { @@ -65,6 +66,7 @@ public class PrintReadsIntegrationTest extends WalkerTest { // See: GATKBAMIndex.getStartOfLastLinearBin(), BAMScheduler.advance(), IntervalOverlapFilteringIterator.advance() {new PRTest(b37KGReference, new String[]{"unmappedFlagReadsInLastLinearBin.bam"}, "", "d7f23fd77d7dc7cb50d3397f644c6d8a")}, {new PRTest(b37KGReference, new String[]{"unmappedFlagReadsInLastLinearBin.bam"}, " -L 1", "c601db95b20248d012b0085347fcb6d1")}, + {new PRTest(b37KGReference, new String[]{"unmappedFlagReadsInLastLinearBin.cram"}, " -L 1:10001 -L GL000192.1:500204", "b16f6ed6cc1e7640b08bf9bcc86f1596")}, {new PRTest(b37KGReference, new String[]{"unmappedFlagReadsInLastLinearBin.bam"}, " -L unmapped", "2d32440e47e8d9d329902fe573ad94ce")}, {new PRTest(b37KGReference, new String[]{"unmappedFlagReadsInLastLinearBin.bam"}, " -L 1 -L unmapped", "c601db95b20248d012b0085347fcb6d1")}, {new PRTest(b37KGReference, new String[]{"oneReadAllInsertion.bam"}, "", "349650b6aa9e574b48a2a62627f37c7d")}, @@ -98,7 +100,7 @@ public class PrintReadsIntegrationTest extends WalkerTest { params.args + " --no_pg_tag" + " -o %s", - Arrays.asList(params.md5)); + Collections.singletonList(params.md5)); executeTest("testPrintReads-"+params.args, spec).getFirst(); } diff --git a/public/gatk-utils/src/main/java/org/broadinstitute/gatk/utils/commandline/CommandLineProgram.java b/public/gatk-utils/src/main/java/org/broadinstitute/gatk/utils/commandline/CommandLineProgram.java index c2142b8eb..f29978ede 100644 --- a/public/gatk-utils/src/main/java/org/broadinstitute/gatk/utils/commandline/CommandLineProgram.java +++ b/public/gatk-utils/src/main/java/org/broadinstitute/gatk/utils/commandline/CommandLineProgram.java @@ -421,9 +421,9 @@ public abstract class CommandLineProgram { throw new ReviewedGATKException("SamException found with no message!", t); errorPrintf("------------------------------------------------------------------------------------------%n"); - errorPrintf("A BAM ERROR has occurred (version %s): %n", getVersionNumber()); + errorPrintf("A BAM/CRAM ERROR has occurred (version %s): %n", getVersionNumber()); errorPrintf("%n"); - errorPrintf("This means that there is something wrong with the BAM file(s) you provided.%n"); + errorPrintf("This means that there is something wrong with the BAM/CRAM file(s) you provided.%n"); errorPrintf("The error message below tells you what is the problem.%n"); errorPrintf("%n"); printDocumentationReference(); @@ -432,6 +432,9 @@ public abstract class CommandLineProgram { errorPrintf("- Make sure that your BAM file is well-formed by running Picard's validator on it%n"); errorPrintf("(see http://picard.sourceforge.net/command-line-overview.shtml#ValidateSamFile for details)%n"); errorPrintf("- Ensure that your BAM index is not corrupted: delete the current one and regenerate it with 'samtools index'%n"); + errorPrintf("- Ensure that your CRAM index is not corrupted: delete the current one and regenerate it with%n"); + errorPrintf("'java -jar cramtools-3.0.jar index --bam-style-index --input-file --reference-fasta-file '%n"); + errorPrintf("(see https://github.com/enasequence/cramtools/tree/v3.0 for details)%n"); errorPrintf("%n"); errorPrintf("MESSAGE: %s%n", t.getMessage().trim()); errorPrintf("------------------------------------------------------------------------------------------%n"); diff --git a/public/gatk-utils/src/main/java/org/broadinstitute/gatk/utils/sam/ArtificialSAMFileReader.java b/public/gatk-utils/src/main/java/org/broadinstitute/gatk/utils/sam/ArtificialSAMFileReader.java index 3d0a691ac..74b953188 100644 --- a/public/gatk-utils/src/main/java/org/broadinstitute/gatk/utils/sam/ArtificialSAMFileReader.java +++ b/public/gatk-utils/src/main/java/org/broadinstitute/gatk/utils/sam/ArtificialSAMFileReader.java @@ -26,14 +26,12 @@ package org.broadinstitute.gatk.utils.sam; import htsjdk.samtools.*; -import htsjdk.samtools.cram.build.CramIO; import org.broadinstitute.gatk.utils.GenomeLoc; import org.broadinstitute.gatk.utils.GenomeLocParser; import org.broadinstitute.gatk.utils.exceptions.ReviewedGATKException; import java.io.ByteArrayInputStream; import java.io.InputStream; -import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; diff --git a/public/gatk-utils/src/test/resources/exampleCRAM-nobai-nocrai.cram b/public/gatk-utils/src/test/resources/exampleCRAM-nobai-nocrai.cram new file mode 100644 index 0000000000000000000000000000000000000000..b688b9c2864d2b6905c628efbaa26e6e1825ff91 GIT binary patch literal 5281 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 literal 0 HcmV?d00001 diff --git a/public/gatk-utils/src/test/resources/exampleCRAM-noindex.cram b/public/gatk-utils/src/test/resources/exampleCRAM-noindex.cram deleted file mode 100644 index 7041737eeb916ef6df84f9f707961389c038d5ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3677 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 DR=&_3 diff --git a/public/gatk-utils/src/test/resources/exampleCRAM.cram b/public/gatk-utils/src/test/resources/exampleCRAM.cram index 7041737eeb916ef6df84f9f707961389c038d5ba..b688b9c2864d2b6905c628efbaa26e6e1825ff91 100644 GIT binary patch delta 3447 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 POyj7e%a?2k6}bKvXk?VQ delta 1847 zcmV-72gvxLDcu~f=L8u>2><{9fXKmnjUfPu%m@L2%K!lYfy9BtvITqr0s;Y(eg+_a z08m5;0RSHY;7~_e1PKEK0RjO40RaTyQ%za~2?GQH4*>uH0R#X704FB^fXKmnjUfOA z1pom80|fv7|NsBo|55yKCsCj$6dpC`eBeg_000050Dph)uj<$oND+e}0031M7?Bi< zqH3g~Q;8>*-}mgwt0TZI$7R$+ptvr7TP<1%cDLm2iVEv2e7o9@Uw+Mt5S{r=jhl77 z3X60y6))aYL?!9uj!H@7SC0H7Z0WlR68Eqo+GK zr|0Ug8khh91OOBOABzY8000000009300000000000R#bsmWj+CiwFP!0001g00321 z?b?GX4%{ED+G=Y>z99+m{x5O|e9zfud0MLy5;DmQRaL#@;@0$1EzVF?p|{2@zL!J8 z`WAC|wTU(No0 z+)0PAnv-=$At0n~=nh+? zp-Yzc@mbd@?$f>lV?EEpd7eLC`OV?tw-wZB?QmSaT>g@GIHjIacHvb8son)?9q?YX z2!O)3_weGIWKy-B({i-Jl6` z)gZ*wJc(vMC*zU?<4+g(MdZ9O(X*dUCziNvxc54<3#?#+_Ui$~`zC}jg^@;ABK@CO>yp7mohDj#~dJdimc7TQdd?1r{GpluS z^f1)(rqR-Ui2jkN^Qw;?#7z`W@**L&AY9A=he@Q6J&SxLq(=bb(XrBg6kSS%e#QR0 zb8!m4lEH@^8nFFI&4X0J&0uk1PMhA z9do%(jVYv#8iY@dM0cp`#u2QnfK>LU%{NaP`3sOvJTvE!w6mP~ohBp@1{Xc&UyiiGhTRY4+i6EQ|5e7ezCm4rO{;fEY z?JA7Il4OPj*EKL6Yt66o%rtvyMGS?2RlI|J6>`v;>Fdh_tN_~TAk0BRkI=F`FqL-` zYYPz>LjWW)tTLKI|M=4%sk04j0vE7>oW0@wmxlU8%$5%#^+TtCB-zPK^KZ7>dz+r- zy_xra@>PypYC*SDtH;(BMRZrNOYPF z(&26WI1?UuPMhC86sIYnykC2iITt9L*)}VGH543U+3}pdpI_~*qeEc+I=Ua?{pjyv zHrnpil0TWzE=^Y(>NHMi9c`zs?&wF=KNje?{!18?YP?r=gE2#;+7RqvFwUrc2J|WZ zTdIrnss7Jl98}#+g}t=lybecKyV>^-L$SYG0P#2DO6>IZeuckm23-g3+drGUS$EGF z4jN0R|8+08vkAAd%1y=p0{kriv&;zq0F!5z#{+vRe%Ru lF#-Sp3jhEB|NsC0|KLSWMgRZ+009610RRRD0RRC20RV0IQ5ygN diff --git a/public/gatk-utils/src/test/resources/exampleCRAM.cram.bai b/public/gatk-utils/src/test/resources/exampleCRAM.cram.bai index a491abb97e9a1dbc323b70b0d408ca439dc64d9c..e2ca31c5473b5f7a62ea38ce148b9ff60bf2a3f0 100644 GIT binary patch delta 19 XcmeBR>|mUr!+DXB0SqoqGz|s-E-eI< delta 19 XcmeBR>|mUr!+DyK0Sr!0Gz|s-EzJao diff --git a/public/gatk-utils/src/test/resources/exampleCRAM.cram.crai b/public/gatk-utils/src/test/resources/exampleCRAM.cram.crai deleted file mode 100644 index d10c49f455da60eae1a586e46aa7102437947288..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46 xcmb2|=3syT;|C^21`oEFn41_sH8C+VeQIL3^@+(A6O*S*46(7FUrPa%0RShO4nhC`