From 67d1b1777d84242dcbea29f4886dc28a27d1accb Mon Sep 17 00:00:00 2001 From: Ekaterina Kazachkova Date: Thu, 3 Nov 2016 19:13:40 +0300 Subject: [PATCH 1/4] fix for issues 433, 431, 361 --- .../picard/illumina/IlluminaBasecallsToSam.java | 14 +- .../java/picard/illumina/MarkIlluminaAdapters.java | 10 +- .../java/picard/sam/AbstractAlignmentMerger.java | 6 +- .../java/picard/sam/AddOrReplaceReadGroups.java | 17 +- src/main/java/picard/sam/CleanSam.java | 6 +- src/main/java/picard/sam/FastqToSam.java | 13 +- src/main/java/picard/sam/FilterSamReads.java | 24 +- src/main/java/picard/sam/FixMateInformation.java | 15 +- src/main/java/picard/sam/GatherBamFiles.java | 12 +- src/main/java/picard/sam/MergeSamFiles.java | 20 +- .../picard/sam/PositionBasedDownsampleSam.java | 20 +- src/main/java/picard/sam/ReorderSam.java | 20 +- src/main/java/picard/sam/ReplaceSamHeader.java | 8 +- ...RevertOriginalBaseQualitiesAndAddMateCigar.java | 10 +- src/main/java/picard/sam/SetNmMdAndUqTags.java | 8 +- src/main/java/picard/sam/SortSam.java | 14 +- src/main/java/picard/sam/SplitSamByLibrary.java | 28 +- .../picard/sam/markduplicates/MarkDuplicates.java | 19 +- .../MarkDuplicatesWithMateCigar.java | 9 +- .../SimpleMarkDuplicatesWithMateCigar.java | 11 +- .../AbstractMarkDuplicatesCommandLineProgram.java | 2 +- .../java/picard/sam/CramCompatibilityTest.java | 318 +++++++++++++++++++++ src/test/java/picard/sam/FilterSamReadsTest.java | 46 ++- .../picard/sam/MarkDuplicates/one_pair_mc.cram | Bin 0 -> 12495 bytes .../sam/MergeBamAlignment/cliptest.aligned.cram | Bin 0 -> 3139 bytes .../sam/MergeBamAlignment/cliptest.fasta.fai | 1 + .../sam/MergeBamAlignment/cliptest.unmapped.cram | Bin 0 -> 3231 bytes testdata/picard/sam/one_pair.cram | Bin 0 -> 12434 bytes testdata/picard/sam/split_test_unmapped.cram | Bin 0 -> 2696 bytes testdata/picard/sam/test_cram_file.cram | Bin 0 -> 53606 bytes testdata/picard/sam/test_cram_file.ref.dict | 2 + testdata/picard/sam/test_cram_file.ref.fa | 71 +++++ testdata/picard/sam/test_cram_file.ref.fa.fai | 1 + testdata/picard/sam/test_cram_file_with_crai.crai | Bin 0 -> 43 bytes testdata/picard/sam/test_cram_file_with_crai.cram | Bin 0 -> 24562 bytes testdata/picard/sam/unmapped_part_1.cram | Bin 0 -> 3354 bytes testdata/picard/sam/unmapped_part_2.cram | Bin 0 -> 3443 bytes testdata/picard/sam/unmapped_queryname_sorted.cram | Bin 0 -> 841 bytes 38 files changed, 579 insertions(+), 146 deletions(-) create mode 100644 src/test/java/picard/sam/CramCompatibilityTest.java create mode 100644 testdata/picard/sam/MarkDuplicates/one_pair_mc.cram create mode 100644 testdata/picard/sam/MergeBamAlignment/cliptest.aligned.cram create mode 100644 testdata/picard/sam/MergeBamAlignment/cliptest.fasta.fai create mode 100644 testdata/picard/sam/MergeBamAlignment/cliptest.unmapped.cram create mode 100644 testdata/picard/sam/one_pair.cram create mode 100644 testdata/picard/sam/split_test_unmapped.cram create mode 100644 testdata/picard/sam/test_cram_file.cram create mode 100644 testdata/picard/sam/test_cram_file.ref.dict create mode 100644 testdata/picard/sam/test_cram_file.ref.fa create mode 100644 testdata/picard/sam/test_cram_file.ref.fa.fai create mode 100644 testdata/picard/sam/test_cram_file_with_crai.crai create mode 100644 testdata/picard/sam/test_cram_file_with_crai.cram create mode 100644 testdata/picard/sam/unmapped_part_1.cram create mode 100644 testdata/picard/sam/unmapped_part_2.cram create mode 100644 testdata/picard/sam/unmapped_queryname_sorted.cram diff --git a/src/main/java/picard/illumina/IlluminaBasecallsToSam.java b/src/main/java/picard/illumina/IlluminaBasecallsToSam.java index 2d2dcf16c..fb1b27cf3 100644 --- a/src/main/java/picard/illumina/IlluminaBasecallsToSam.java +++ b/src/main/java/picard/illumina/IlluminaBasecallsToSam.java @@ -1,7 +1,7 @@ /* * The MIT License * - * Copyright (c) 2011 The Broad Institute + * Copyright (c) 2011-2016 The Broad Institute * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -44,7 +44,6 @@ import picard.cmdline.programgroups.Illumina; import picard.cmdline.StandardOptionDefinitions; import picard.illumina.parser.ReadStructure; -import picard.illumina.parser.ReadType; import picard.illumina.parser.readers.BclQualityEvaluationStrategy; import picard.util.IlluminaUtil; import picard.util.IlluminaUtil.IlluminaAdapterPair; @@ -55,7 +54,6 @@ import java.io.OutputStream; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashMap; @@ -100,9 +98,9 @@ programGroup = Illumina.class ) public class IlluminaBasecallsToSam extends CommandLineProgram { - static final String USAGE_SUMMARY = "Transforms raw Illumina sequencing data into an unmapped SAM or BAM file." ; + static final String USAGE_SUMMARY = "Transforms raw Illumina sequencing data into an unmapped SAM, BAM or CRAM file." ; static final String USAGE_DETAILS = "

The IlluminaBaseCallsToSam program collects, demultiplexes, and sorts reads across all " + - "of the tiles of a lane via barcode to produce an unmapped SAM/BAM file. An unmapped BAM file is often referred to as a uBAM. " + + "of the tiles of a lane via barcode to produce an unmapped SAM, BAM or CRAM file. An unmapped BAM file is often referred to as a uBAM. " + "All barcode, sample, and library data is provided in the LIBRARY_PARAMS file. Note, this LIBRARY_PARAMS file " + "should be formatted according to the specifications indicated below. The following is an example of a properly" + " formmated LIBRARY_PARAMS file:

" + @@ -133,7 +131,7 @@ // The following attributes define the command-line arguments - public static final String USAGE = "Generate a SAM or BAM file from data in an Illumina basecalls output directory"; + public static final String USAGE = "Generate a SAM, BAM or CRAM file from data in an Illumina basecalls output directory"; @Option(doc = "The basecalls directory. ", shortName = "B") public File BASECALLS_DIR; @@ -144,7 +142,7 @@ @Option(doc = "Lane number. ", shortName = StandardOptionDefinitions.LANE_SHORT_NAME) public Integer LANE; - @Option(doc = "Deprecated (use LIBRARY_PARAMS). The output SAM or BAM file. Format is determined by extension.", + @Option(doc = "Deprecated (use LIBRARY_PARAMS). The output SAM, BAM or CRAM file. Format is determined by extension.", shortName = StandardOptionDefinitions.OUTPUT_SHORT_NAME, mutex = {"BARCODE_PARAMS", "LIBRARY_PARAMS"}) public File OUTPUT; @@ -457,7 +455,7 @@ private SAMFileWriterWrapper buildSamFileWriter(final File output, final String header.setSortOrder(SAMFileHeader.SortOrder.queryname); header.addReadGroup(rg); - return new SAMFileWriterWrapper(new SAMFileWriterFactory().makeSAMOrBAMWriter(header, true, output)); + return new SAMFileWriterWrapper(new SAMFileWriterFactory().makeWriter(header, true, output, REFERENCE_SEQUENCE)); } public static void main(final String[] args) { diff --git a/src/main/java/picard/illumina/MarkIlluminaAdapters.java b/src/main/java/picard/illumina/MarkIlluminaAdapters.java index 993c5feb8..08eb94ac1 100644 --- a/src/main/java/picard/illumina/MarkIlluminaAdapters.java +++ b/src/main/java/picard/illumina/MarkIlluminaAdapters.java @@ -1,7 +1,7 @@ /* * The MIT License * - * Copyright (c) 2009 The Broad Institute + * Copyright (c) 2009-2016 The Broad Institute * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -71,9 +71,9 @@ ) public class MarkIlluminaAdapters extends CommandLineProgram { - static final String USAGE_SUMMARY = "Reads a SAM or BAM file and rewrites it with new adapter-trimming tags. "; + static final String USAGE_SUMMARY = "Reads a SAM, BAM or CRAM file and rewrites it with new adapter-trimming tags. "; static final String USAGE_DETAILS = "

This tool clears any existing adapter-trimming tags (XT:i:) in the optional tag region of " + - "a SAM file. The SAM/BAM file must be sorted by query name.

"+ + "a SAM file. The SAM/BAM/CRAM file must be sorted by query name.

"+ "

Outputs a metrics file histogram showing counts of bases_clipped per read." + "" + "

Usage example:

" + @@ -162,7 +162,7 @@ protected int doWork() { SAMFileWriter out = null; if (OUTPUT != null) { IOUtil.assertFileIsWritable(OUTPUT); - out = new SAMFileWriterFactory().makeSAMOrBAMWriter(in.getFileHeader(), true, OUTPUT); + out = new SAMFileWriterFactory().makeWriter(in.getFileHeader(), true, OUTPUT, REFERENCE_SEQUENCE); } final Histogram histo = new Histogram("clipped_bases", "read_count"); @@ -199,7 +199,7 @@ protected int doWork() { if (rec.getReadPairedFlag()) { // Assert that the input file is in query name order only if we see some PE reads if (order != SAMFileHeader.SortOrder.queryname) { - throw new PicardException("Input BAM file must be sorted by queryname"); + throw new PicardException("Input file must be sorted by queryname"); } if (rec2 == null) throw new PicardException("Missing mate pair for paired read: " + rec.getReadName()); diff --git a/src/main/java/picard/sam/AbstractAlignmentMerger.java b/src/main/java/picard/sam/AbstractAlignmentMerger.java index ba690b74c..6ee5266c6 100644 --- a/src/main/java/picard/sam/AbstractAlignmentMerger.java +++ b/src/main/java/picard/sam/AbstractAlignmentMerger.java @@ -1,7 +1,7 @@ /* * The MIT License * - * Copyright (c) 2009 The Broad Institute + * Copyright (c) 2009-2016 The Broad Institute * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -316,7 +316,7 @@ public void mergeAlignment(final File referenceFasta) { else { // catches queryname and unsorted final SAMFileHeader header = this.header.clone(); header.setSortOrder(this.sortOrder); - final SAMFileWriter writer = new SAMFileWriterFactory().makeSAMOrBAMWriter(header, true, this.targetBamFile); + final SAMFileWriter writer = new SAMFileWriterFactory().makeWriter(header, true, this.targetBamFile, referenceFasta); writer.setProgressLogger(new ProgressLogger(log, (int) 1e7, "Wrote", "records to output in queryname order")); sink = new Sink(writer); } @@ -469,7 +469,7 @@ public void mergeAlignment(final File referenceFasta) { // Write the records to the output file in specified sorted order, if (this.sortOrder == SortOrder.coordinate) { header.setSortOrder(this.sortOrder); - final SAMFileWriter writer = new SAMFileWriterFactory().makeSAMOrBAMWriter(header, true, this.targetBamFile); + final SAMFileWriter writer = new SAMFileWriterFactory().makeWriter(header, true, this.targetBamFile, referenceFasta); writer.setProgressLogger(new ProgressLogger(log, (int) 1e7, "Wrote", "records from a sorting collection")); final ProgressLogger finalProgress = new ProgressLogger(log, 10000000, "Written in coordinate order to output", "records"); diff --git a/src/main/java/picard/sam/AddOrReplaceReadGroups.java b/src/main/java/picard/sam/AddOrReplaceReadGroups.java index 539e89ea5..ad8c4215a 100644 --- a/src/main/java/picard/sam/AddOrReplaceReadGroups.java +++ b/src/main/java/picard/sam/AddOrReplaceReadGroups.java @@ -25,7 +25,7 @@ import java.util.Arrays; /** - * Replaces read groups in a BAM file + * Replaces read groups in a SAM, BAM or CRAM file * * @author mdepristo */ @@ -35,12 +35,12 @@ programGroup = SamOrBam.class ) public class AddOrReplaceReadGroups extends CommandLineProgram { - static final String USAGE_SUMMARY = "Replace read groups in a BAM file."; + static final String USAGE_SUMMARY = "Replace read groups in a SAM, BAM or CRAM file."; static final String USAGE_DETAILS = "This tool enables the user to replace all read groups in the INPUT file with a single new read " + - "group and assign all reads to this read group in the OUTPUT BAM file.

" + + "group and assign all reads to this read group in the OUTPUT SAM, BAM or CRAM file.

" + "For more information about read groups, see the " + "GATK Dictionary entry.

" + - "This tool accepts INPUT BAM and SAM files or URLs from the Global Alliance for Genomics and Health (GA4GH) (see http://ga4gh.org/#/documentation)." + + "This tool accepts INPUT SAM, BAM or CRAM files or URLs from the Global Alliance for Genomics and Health (GA4GH) (see http://ga4gh.org/#/documentation)." + "

Usage example:

" + "
" +
             "java -jar picard.jar AddOrReplaceReadGroups \\
" + @@ -53,10 +53,10 @@ " RGSM=20" + "
" + "
" ; - @Option(shortName= StandardOptionDefinitions.INPUT_SHORT_NAME, doc="Input file (BAM or SAM or a GA4GH url).") + @Option(shortName= StandardOptionDefinitions.INPUT_SHORT_NAME, doc="Input file (SAM, BAM or CRAM or a GA4GH url).") public String INPUT = null; - @Option(shortName = StandardOptionDefinitions.OUTPUT_SHORT_NAME, doc = "Output file (BAM or SAM).") + @Option(shortName = StandardOptionDefinitions.OUTPUT_SHORT_NAME, doc = "Output file (SAM, BAM or CRAM).") public File OUTPUT = null; @Option(shortName = StandardOptionDefinitions.SORT_ORDER_SHORT_NAME, optional = true, @@ -132,9 +132,10 @@ protected int doWork() { outHeader.setReadGroups(Arrays.asList(rg)); if (SORT_ORDER != null) outHeader.setSortOrder(SORT_ORDER); - final SAMFileWriter outWriter = new SAMFileWriterFactory().makeSAMOrBAMWriter(outHeader, + final SAMFileWriter outWriter = new SAMFileWriterFactory().makeWriter(outHeader, outHeader.getSortOrder() == inHeader.getSortOrder(), - OUTPUT); + OUTPUT, + REFERENCE_SEQUENCE); final ProgressLogger progress = new ProgressLogger(log); for (final SAMRecord read : in) { diff --git a/src/main/java/picard/sam/CleanSam.java b/src/main/java/picard/sam/CleanSam.java index 9cd845119..fcd736d2f 100644 --- a/src/main/java/picard/sam/CleanSam.java +++ b/src/main/java/picard/sam/CleanSam.java @@ -1,7 +1,7 @@ /* * The MIT License * - * Copyright (c) 2010 The Broad Institute + * Copyright (c) 2010 - 2016 The Broad Institute * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -52,7 +52,7 @@ ) public class CleanSam extends CommandLineProgram { - static final String USAGE = "Cleans the provided SAM/BAM, soft-clipping beyond-end-of-reference alignments and setting MAPQ to 0 for unmapped reads"; + static final String USAGE = "Cleans the provided SAM/BAM/CRAM, soft-clipping beyond-end-of-reference alignments and setting MAPQ to 0 for unmapped reads"; @Option(shortName = StandardOptionDefinitions.INPUT_SHORT_NAME, doc = "Input SAM to be cleaned.") public File INPUT; @@ -79,7 +79,7 @@ protected int doWork() { factory.validationStringency(ValidationStringency.LENIENT); } final SamReader reader = factory.open(INPUT); - final SAMFileWriter writer = new SAMFileWriterFactory().makeSAMOrBAMWriter(reader.getFileHeader(), true, OUTPUT); + final SAMFileWriter writer = new SAMFileWriterFactory().makeWriter(reader.getFileHeader(), true, OUTPUT, REFERENCE_SEQUENCE); final CloseableIterator it = reader.iterator(); final ProgressLogger progress = new ProgressLogger(Log.getInstance(CleanSam.class)); diff --git a/src/main/java/picard/sam/FastqToSam.java b/src/main/java/picard/sam/FastqToSam.java index 4d89d8527..85eb30e96 100644 --- a/src/main/java/picard/sam/FastqToSam.java +++ b/src/main/java/picard/sam/FastqToSam.java @@ -1,7 +1,7 @@ /* * The MIT License * - * Copyright (c) 2009 The Broad Institute + * Copyright (c) 2009-2016 The Broad Institute * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -32,7 +32,6 @@ import htsjdk.samtools.SAMReadGroupRecord; import htsjdk.samtools.SAMRecord; import htsjdk.samtools.SAMUtils; -import htsjdk.samtools.fastq.FastqConstants; import htsjdk.samtools.fastq.FastqConstants.FastqExtensions; import htsjdk.samtools.fastq.FastqReader; import htsjdk.samtools.fastq.FastqRecord; @@ -57,7 +56,7 @@ import java.util.List; /** - * Converts a fastq file to an unaligned BAM/SAM format. + * Converts a fastq file to an unaligned BAM/SAM/CRAM format. * See MAQ FastQ specification for details. * Three fastq versions are supported: FastqSanger, FastqSolexa and FastqIllumina. * Input files can be in GZip format (end in .gz). @@ -68,7 +67,7 @@ programGroup = SamOrBam.class ) public class FastqToSam extends CommandLineProgram { - static final String USAGE_SUMMARY = "Converts a FASTQ file to an unaligned BAM or SAM file. "; + static final String USAGE_SUMMARY = "Converts a FASTQ file to an unaligned BAM/SAM/CRAM file. "; static final String USAGE_DETAILS = "This tool extracts read sequences and base qualities from the input FASTQ file and writes them" + " out to a new file in unaligned BAM (uBAM) format. Read group information can be provided on the command line.

" + "Three versions of FASTQ quality scales are supported: FastqSanger, FastqSolexa and FastqIllumina " + @@ -98,7 +97,7 @@ "If this value is not specified, the quality format will be detected automatically.", optional = true) public FastqQualityFormat QUALITY_FORMAT; - @Option(doc="Output SAM/BAM file. ", shortName=StandardOptionDefinitions.OUTPUT_SHORT_NAME) + @Option(doc="Output BAM/SAM/CRAM file. ", shortName=StandardOptionDefinitions.OUTPUT_SHORT_NAME) public File OUTPUT ; @Option(shortName="RG", doc="Read group name") @@ -137,7 +136,7 @@ @Option(shortName = "DT", doc = "Date the run was produced, to insert into the read group header", optional = true) public Iso8601Date RUN_DATE; - @Option(shortName="SO", doc="The sort order for the output sam/bam file.") + @Option(shortName="SO", doc="The sort order for the output BAM/SAM/CRAM file.") public SortOrder SORT_ORDER = SortOrder.queryname; @Option(doc="Minimum quality allowed in the input fastq. An exception will be thrown if a quality is less than this value.") @@ -245,7 +244,7 @@ protected int doWork() { IOUtil.assertFileIsWritable(OUTPUT); final SAMFileHeader header = createSamFileHeader(); - final SAMFileWriter writer = new SAMFileWriterFactory().makeSAMOrBAMWriter(header, false, OUTPUT); + final SAMFileWriter writer = new SAMFileWriterFactory().makeWriter(header, false, OUTPUT, REFERENCE_SEQUENCE); // Set the quality format QUALITY_FORMAT = FastqToSam.determineQualityFormat(fileToFastqReader(FASTQ), diff --git a/src/main/java/picard/sam/FilterSamReads.java b/src/main/java/picard/sam/FilterSamReads.java index ecfe31b62..ea97e961c 100644 --- a/src/main/java/picard/sam/FilterSamReads.java +++ b/src/main/java/picard/sam/FilterSamReads.java @@ -1,7 +1,7 @@ /* * The MIT License * - * Copyright (c) 2011 The Broad Institute + * Copyright (c) 2011-2016 The Broad Institute * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -54,7 +54,7 @@ import java.util.List; /** - * From a SAM or BAM file, produce a new SAM or BAM by filtering aligned reads or a list of read + * From a SAM/BAM/CRAM file, produce a new SAM/BAM/CRAM by filtering aligned reads or a list of read * names provided in a file (one readname per line) *

* $Id$ @@ -65,8 +65,8 @@ programGroup = SamOrBam.class ) public class FilterSamReads extends CommandLineProgram { - static final String USAGE_SUMMARY = "Subset read data from a SAM or BAM file"; - static final String USAGE_DETAILS = "This tool takes a SAM or BAM file and subsets it to a new file that either excludes or " + + static final String USAGE_SUMMARY = "Subset read data from a SAM/BAM/CRAM file"; + static final String USAGE_DETAILS = "This tool takes a SAM/BAM/CRAM file and subsets it to a new file that either excludes or " + "only includes either aligned or unaligned reads (set using FILTER), or specific reads based on a list of reads names " + "supplied in the READ_LIST_FILE. " + "" + @@ -101,7 +101,7 @@ public String toString() { } } - @Option(doc = "The SAM or BAM file that will be filtered.", + @Option(doc = "The SAM/BAM/CRAM file that will be filtered.", optional = false, shortName = StandardOptionDefinitions.INPUT_SHORT_NAME) public File INPUT; @@ -109,18 +109,18 @@ public String toString() { @Option(doc = "Filter.", optional = false) public Filter FILTER = null; - @Option(doc = "Read List File containing reads that will be included or excluded from the OUTPUT SAM or BAM file.", + @Option(doc = "Read List File containing reads that will be included or excluded from the OUTPUT SAM/BAM/CRAM file.", optional = true, shortName = "RLF") public File READ_LIST_FILE; - @Option(doc = "Interval List File containing intervals that will be included or excluded from the OUTPUT SAM or BAM file.", + @Option(doc = "Interval List File containing intervals that will be included or excluded from the OUTPUT SAM/BAM/CRAM file.", optional = true, shortName = "IL") public File INTERVAL_LIST; @Option( - doc = "SortOrder of the OUTPUT SAM or BAM file, otherwise use the SortOrder of the INPUT file.", + doc = "SortOrder of the OUTPUT SAM/BAM/CRAM file, otherwise use the SortOrder of the INPUT file.", optional = true, shortName = "SO") public SAMFileHeader.SortOrder SORT_ORDER; @@ -129,12 +129,12 @@ public String toString() { optional = true) public boolean WRITE_READS_FILES = true; - @Option(doc = "SAM or BAM file to write read excluded results to", + @Option(doc = "SAM/BAM/CRAM file to write read excluded results to", optional = false, shortName = "O") public File OUTPUT; @Option(shortName = "JS", - doc = "Filters a SAM or BAM file with a javascript expression using the java javascript-engine. " + doc = "Filters a SAM/BAM/CRAM file with a javascript expression using the java javascript-engine. " + " The script puts the following variables in the script context: " + " 'record' a SamRecord ( https://samtools.github.io/htsjdk/javadoc/htsjdk/htsjdk/samtools/SAMRecord.html ) and " + " 'header' a SAMFileHeader ( https://samtools.github.io/htsjdk/javadoc/htsjdk/htsjdk/samtools/SAMFileHeader.html )." @@ -161,7 +161,7 @@ private void filterReads(final FilteringSamIterator filteringIterator) { OUTPUT.getName() + " [sortorder=" + fileHeader.getSortOrder().name() + "]"); // create OUTPUT file - final SAMFileWriter outputWriter = new SAMFileWriterFactory().makeSAMOrBAMWriter(fileHeader, presorted, OUTPUT); + final SAMFileWriter outputWriter = new SAMFileWriterFactory().makeWriter(fileHeader, presorted, OUTPUT, REFERENCE_SEQUENCE); final ProgressLogger progress = new ProgressLogger(log, (int) 1e6, "Written"); @@ -179,7 +179,7 @@ private void filterReads(final FilteringSamIterator filteringIterator) { /** * Write out a file of read names for debugging purposes. * - * @param samOrBamFile The SAM or BAM file for which we are going to write out a file of its + * @param samOrBamFile The SAM/BAM/CRAM file for which we are going to write out a file of its * containing read names */ private void writeReadsFile(final File samOrBamFile) throws IOException { diff --git a/src/main/java/picard/sam/FixMateInformation.java b/src/main/java/picard/sam/FixMateInformation.java index 058150f8a..4fadeba6c 100644 --- a/src/main/java/picard/sam/FixMateInformation.java +++ b/src/main/java/picard/sam/FixMateInformation.java @@ -1,7 +1,7 @@ /* * The MIT License * - * Copyright (c) 2009 The Broad Institute + * Copyright (c) 2009 - 2016 The Broad Institute * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -25,7 +25,6 @@ package picard.sam; import htsjdk.samtools.BAMRecordCodec; -import htsjdk.samtools.BamFileIoUtils; import htsjdk.samtools.MergingSamRecordIterator; import htsjdk.samtools.SAMFileHeader; import htsjdk.samtools.SAMFileHeader.SortOrder; @@ -134,10 +133,11 @@ protected int doWork() { } else { final File soleInput = INPUT.get(0).getAbsoluteFile(); final File dir = soleInput.getParentFile().getAbsoluteFile(); + final String extension = parseExtension(soleInput); try { IOUtil.assertFileIsWritable(soleInput); IOUtil.assertDirectoryIsWritable(dir); - OUTPUT = File.createTempFile(soleInput.getName() + ".being_fixed.", BamFileIoUtils.BAM_FILE_EXTENSION, dir); + OUTPUT = File.createTempFile(soleInput.getName() + ".being_fixed.", extension, dir); } catch (final IOException ioe) { throw new RuntimeIOException("Could not create tmp file in " + dir.getAbsolutePath()); } @@ -263,9 +263,14 @@ public void close() { return 0; } + private String parseExtension(final File input) { + String[] splitted = input.getName().split("\\."); + return splitted[splitted.length - 1]; + } + protected void createSamFileWriter(final SAMFileHeader header) { - out = new SAMFileWriterFactory().makeSAMOrBAMWriter(header, - header.getSortOrder() == SortOrder.queryname, OUTPUT); + out = new SAMFileWriterFactory().makeWriter(header, + header.getSortOrder() == SortOrder.queryname, OUTPUT, REFERENCE_SEQUENCE); } diff --git a/src/main/java/picard/sam/GatherBamFiles.java b/src/main/java/picard/sam/GatherBamFiles.java index b2efb4670..2d6307e1c 100644 --- a/src/main/java/picard/sam/GatherBamFiles.java +++ b/src/main/java/picard/sam/GatherBamFiles.java @@ -7,6 +7,7 @@ import htsjdk.samtools.SAMRecord; import htsjdk.samtools.SamReader; import htsjdk.samtools.SamReaderFactory; +import htsjdk.samtools.cram.build.CramIO; import htsjdk.samtools.util.CloserUtil; import htsjdk.samtools.util.IOUtil; import htsjdk.samtools.util.Log; @@ -67,7 +68,11 @@ public static void main(final String[] args) { @Override protected int doWork() { - final List inputs = IOUtil.unrollFiles(INPUT, BamFileIoUtils.BAM_FILE_EXTENSION, ".sam"); + final List inputs = IOUtil.unrollFiles( + INPUT, + BamFileIoUtils.BAM_FILE_EXTENSION, + IOUtil.SAM_FILE_EXTENSION, + CramIO.CRAM_FILE_EXTENSION); for (final File f : inputs) IOUtil.assertFileIsReadable(f); IOUtil.assertFileIsWritable(OUTPUT); @@ -101,7 +106,10 @@ private static void gatherNormally(final List inputs, final File output, f header = SamReaderFactory.makeDefault().referenceSequence(referenceFasta).getFileHeader(inputs.get(0)); } - final SAMFileWriter out = new SAMFileWriterFactory().setCreateIndex(createIndex).setCreateMd5File(createMd5).makeSAMOrBAMWriter(header, true, output); + final SAMFileWriter out = new SAMFileWriterFactory() + .setCreateIndex(createIndex) + .setCreateMd5File(createMd5) + .makeWriter(header, true, output, referenceFasta); for (final File f : inputs) { log.info("Gathering " + f.getAbsolutePath()); diff --git a/src/main/java/picard/sam/MergeSamFiles.java b/src/main/java/picard/sam/MergeSamFiles.java index 54db0ab47..b8a2ccf3f 100644 --- a/src/main/java/picard/sam/MergeSamFiles.java +++ b/src/main/java/picard/sam/MergeSamFiles.java @@ -1,7 +1,7 @@ /* * The MIT License * - * Copyright (c) 2009 The Broad Institute + * Copyright (c) 2009-2016 The Broad Institute * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -54,7 +54,7 @@ import java.util.Map; /** - * Reads a SAM or BAM file and combines the output to one file + * Reads a SAM, BAM or CRAM file and combines the output to one file * * @author Tim Fennell */ @@ -66,8 +66,8 @@ public class MergeSamFiles extends CommandLineProgram { private static final Log log = Log.getInstance(MergeSamFiles.class); - static final String USAGE_SUMMARY = "Merges multiple SAM and/or BAM files into a single file. "; - static final String USAGE_DETAILS = "This tool is used for combining SAM and/or BAM files from different runs or read groups, similarly " + + static final String USAGE_SUMMARY = "Merges multiple SAM/BAM/CRAM (and/or) files into a single file. "; + static final String USAGE_DETAILS = "This tool is used for combining SAM/BAM/CRAM (and/or) files from different runs or read groups, similarly " + "to the \"merge\" function of Samtools (http://www.htslib.org/doc/samtools.html). " + "

Note that to prevent errors in downstream processing, it is critical to identify/label read groups appropriately. " + "If different samples contain identical read group IDs, this tool will avoid collisions by modifying the read group IDs to be " + @@ -83,10 +83,10 @@ "" + "


" ; - @Option(shortName = "I", doc = "SAM or BAM input file", minElements = 1) + @Option(shortName = "I", doc = "SAM/BAM/CRAM input file", minElements = 1) public List INPUT = new ArrayList(); - @Option(shortName = "O", doc = "SAM or BAM file to write merged result to") + @Option(shortName = "O", doc = "SAM/BAM/CRAM file to write merged result to") public File OUTPUT; @Option(shortName = StandardOptionDefinitions.SORT_ORDER_SHORT_NAME, doc = "Sort order of output file", optional = true) @@ -108,7 +108,7 @@ public List COMMENT = new ArrayList(); @Option(shortName = "RGN", doc = "An interval list file that contains the locations of the positions to merge. "+ - "Assume bam are sorted and indexed. "+ + "Assume sam are sorted and indexed. "+ "The resulting file will contain alignments that may overlap with genomic regions outside the requested region. "+ "Unmapped reads are discarded.", optional = true) @@ -121,7 +121,7 @@ public static void main(final String[] argv) { System.exit(new MergeSamFiles().instanceMain(argv)); } - /** Combines multiple SAM/BAM files into one. */ + /** Combines multiple SAM/BAM/CRAM files into one. */ @Override protected int doWork() { boolean matchedSortOrders = true; @@ -141,7 +141,7 @@ protected int doWork() { IOUtil.assertFileIsReadable(inFile); final SamReader in = SamReaderFactory.makeDefault().referenceSequence(REFERENCE_SEQUENCE).open(inFile); if ( INTERVALS != null ) { - if( ! in.hasIndex() ) throw new PicardException("Merging with interval but Bam file is not indexed "+ inFile); + if( ! in.hasIndex() ) throw new PicardException("Merging with interval but file is not indexed "+ inFile); final CloseableIterator samIterator = new SamRecordIntervalIteratorFactory().makeSamRecordIntervalIterator(in, intervalList, true); samReaderToIterator.put(in, samIterator); } @@ -200,7 +200,7 @@ protected int doWork() { if (USE_THREADING) { samFileWriterFactory.setUseAsyncIo(true); } - final SAMFileWriter out = samFileWriterFactory.makeSAMOrBAMWriter(header, presorted, OUTPUT); + final SAMFileWriter out = samFileWriterFactory.makeWriter(header, presorted, OUTPUT, REFERENCE_SEQUENCE); // Lastly loop through and write out the records final ProgressLogger progress = new ProgressLogger(log, PROGRESS_INTERVAL); diff --git a/src/main/java/picard/sam/PositionBasedDownsampleSam.java b/src/main/java/picard/sam/PositionBasedDownsampleSam.java index b95dd6cd4..4ed0f70e4 100644 --- a/src/main/java/picard/sam/PositionBasedDownsampleSam.java +++ b/src/main/java/picard/sam/PositionBasedDownsampleSam.java @@ -1,7 +1,7 @@ /* * The MIT License * - * Copyright (c) 2015 The Broad Institute + * Copyright (c) 2015-2016 The Broad Institute * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -54,12 +54,12 @@ /** - * Class to downsample a BAM file while respecting that we should either get rid + * Class to downsample a SAM/BAM/CRAM file while respecting that we should either get rid * of both ends of a pair or neither end of the pair. In addition, this program uses the read-name * and extracts the position within the tile whence the read came from. The downsampling is based on this position. *

* Note 1: This is technology and read-name dependent. If your read-names do not have coordinate information, or if your - * BAM contains reads from multiple technologies (flowcell versions, sequencing machines) this will not work properly. + * SAM/BAM/CRAM contains reads from multiple technologies (flowcell versions, sequencing machines) this will not work properly. * This has been designed with Illumina MiSeq/HiSeq in mind. *

* Note 2: The downsampling is _not_ random. It is deterministically dependent on the position of the read within its tile. Specifically, @@ -74,13 +74,13 @@ * @author Yossi Farjoun */ @CommandLineProgramProperties( - usage = "Class to downsample a BAM file while respecting that we should either get rid of both ends of a pair or neither \n" + + usage = "Class to downsample a SAM/BAM/CRAM file while respecting that we should either get rid of both ends of a pair or neither \n" + "end of the pair. In addition, this program uses the read-name and extracts the position within the tile whence \n" + "the read came from. The downsampling is based on this position. Results with the exact same input will produce the \n" + "same results.\n" + "\n" + "Note 1: This is technology and read-name dependent. If your read-names do not have coordinate information, or if your\n" + - "BAM contains reads from multiple technologies (flowcell versions, sequencing machines) this will not work properly. \n" + + "SAM/BAM/CRAM contains reads from multiple technologies (flowcell versions, sequencing machines) this will not work properly. \n" + "This has been designed with Illumina MiSeq/HiSeq in mind.\n" + "Note 2: The downsampling is not random. It is deterministically dependent on the position of the read within its tile.\n" + "Note 3: Downsampling twice with this program is not supported.\n" + @@ -89,15 +89,15 @@ "Finally, the code has been designed to simulate sequencing less as accurately as possible, not for getting an exact downsample \n" + "fraction. In particular, since the reads may be distributed non-evenly within the lanes/tiles, the resulting downsampling \n" + "percentage will not be accurately determined by the input argument FRACTION.", - usageShort = "Downsample a SAM or BAM file to retain a subset of the reads based on the reads location in each tile in the flowcell.", + usageShort = "Downsample a SAM/BAM/CRAM file to retain a subset of the reads based on the reads location in each tile in the flowcell.", programGroup = SamOrBam.class ) public class PositionBasedDownsampleSam extends CommandLineProgram { - @Option(shortName = StandardOptionDefinitions.INPUT_SHORT_NAME, doc = "The input SAM or BAM file to downsample.") + @Option(shortName = StandardOptionDefinitions.INPUT_SHORT_NAME, doc = "The input SAM/BAM/CRAM file to downsample.") public File INPUT; - @Option(shortName = StandardOptionDefinitions.OUTPUT_SHORT_NAME, doc = "The output, downsampled, SAM or BAM file to write.") + @Option(shortName = StandardOptionDefinitions.OUTPUT_SHORT_NAME, doc = "The output, downsampled, SAM/BAM/CRAM file to write.") public File OUTPUT; @Option(shortName = "F", doc = "The (approximate) fraction of reads to be kept, between 0 and 1.", optional = false) @@ -198,7 +198,7 @@ private void outputSamRecords() { programRecord.setProgramVersion(getVersion()); header.addProgramRecord(programRecord); - final SAMFileWriter out = new SAMFileWriterFactory().makeSAMOrBAMWriter(header, true, OUTPUT); + final SAMFileWriter out = new SAMFileWriterFactory().makeWriter(header, true, OUTPUT, REFERENCE_SEQUENCE); final CircleSelector selector = new CircleSelector(FRACTION); @@ -240,7 +240,7 @@ private void checkProgramRecords() { for (final SAMProgramRecord pg : in.getFileHeader().getProgramRecords()) { if (pg.getProgramName() != null && pg.getProgramName().equals(PG_PROGRAM_NAME)) { - final String outText = "Found previous Program Record that indicates that this BAM has been downsampled already with this program. Operation not supported! Previous PG: " + pg.toString(); + final String outText = "Found previous Program Record that indicates that this file has been downsampled already with this program. Operation not supported! Previous PG: " + pg.toString(); if (ALLOW_MULTIPLE_DOWNSAMPLING_DESPITE_WARNINGS) { log.warn(outText); diff --git a/src/main/java/picard/sam/ReorderSam.java b/src/main/java/picard/sam/ReorderSam.java index a0714e01f..9f3839a8e 100644 --- a/src/main/java/picard/sam/ReorderSam.java +++ b/src/main/java/picard/sam/ReorderSam.java @@ -1,7 +1,7 @@ /* * The MIT License * - * Copyright (c) 2011 The Broad Institute + * Copyright (c) 2011-2016 The Broad Institute * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -50,24 +50,24 @@ import java.util.Map; /** - * Reorders a SAM/BAM input file according to the order of contigs in a second reference sequence + * Reorders a SAM/BAM/CRAM input file according to the order of contigs in a second reference sequence * * @author mdepristo */ @CommandLineProgramProperties( - usage = "Not to be confused with SortSam which sorts a SAM or BAM file with a valid sequence dictionary, " + - "ReorderSam reorders reads in a SAM/BAM file to match the contig ordering in a provided reference file, " + + usage = "Not to be confused with SortSam which sorts a SAM/BAM/CRAM file with a valid sequence dictionary, " + + "ReorderSam reorders reads in a SAM/BAM/CRAM file to match the contig ordering in a provided reference file, " + "as determined by exact name matching of contigs. Reads mapped to contigs absent in the new " + - "reference are dropped. Runs substantially faster if the input is an indexed BAM file.", - usageShort = "Reorders reads in a SAM or BAM file to match ordering in reference", + "reference are dropped. Runs substantially faster if the input is an indexed BAM/CRAM file.", + usageShort = "Reorders reads in a SAM/BAM/CRAM file to match ordering in reference", programGroup = SamOrBam.class ) public class ReorderSam extends CommandLineProgram { - @Option(shortName = StandardOptionDefinitions.INPUT_SHORT_NAME, doc = "Input file (bam or sam) to extract reads from.") + @Option(shortName = StandardOptionDefinitions.INPUT_SHORT_NAME, doc = "Input file (SAM/BAM/CRAM) to extract reads from.") public File INPUT; - @Option(shortName = StandardOptionDefinitions.OUTPUT_SHORT_NAME, doc = "Output file (bam or sam) to write extracted reads to.") + @Option(shortName = StandardOptionDefinitions.OUTPUT_SHORT_NAME, doc = "Output file (SAM/BAM/CRAM) to write extracted reads to.") public File OUTPUT; @Option(shortName = StandardOptionDefinitions.REFERENCE_SHORT_NAME, doc = "Reference sequence to reorder reads to match. " + @@ -117,7 +117,7 @@ protected int doWork() { log.info("Writing reads..."); if (in.hasIndex()) { - final SAMFileWriter out = new SAMFileWriterFactory().makeSAMOrBAMWriter(outHeader, true, OUTPUT); + final SAMFileWriter out = new SAMFileWriterFactory().makeWriter(outHeader, true, OUTPUT, REFERENCE_SEQUENCE); // write the reads in contig order for (final SAMSequenceRecord contig : refDict.getSequences()) { @@ -128,7 +128,7 @@ protected int doWork() { writeReads(out, in.queryUnmapped(), newOrder, "unmapped"); out.close(); } else { - SAMFileWriter out = new SAMFileWriterFactory().makeSAMOrBAMWriter(outHeader, false, OUTPUT); + SAMFileWriter out = new SAMFileWriterFactory().makeWriter(outHeader, false, OUTPUT, REFERENCE_SEQUENCE); writeReads(out, in.iterator(), newOrder, "All reads"); out.close(); } diff --git a/src/main/java/picard/sam/ReplaceSamHeader.java b/src/main/java/picard/sam/ReplaceSamHeader.java index 3f76d4c5a..4cb74fd13 100644 --- a/src/main/java/picard/sam/ReplaceSamHeader.java +++ b/src/main/java/picard/sam/ReplaceSamHeader.java @@ -1,7 +1,7 @@ /* * The MIT License * - * Copyright (c) 2009 The Broad Institute + * Copyright (c) 2009-2016 The Broad Institute * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -53,8 +53,8 @@ programGroup = SamOrBam.class ) public class ReplaceSamHeader extends CommandLineProgram { - static final String USAGE_SUMMARY = "Replaces the SAMFileHeader in a SAM or BAM file. "; - static final String USAGE_DETAILS = "This tool makes it possible to replace the header of a SAM or BAM file with the header of another" + + static final String USAGE_SUMMARY = "Replaces the SAMFileHeader in a SAM, BAM or CRAM file. "; + static final String USAGE_DETAILS = "This tool makes it possible to replace the header of a SAM, BAM or CRAM file with the header of another" + "file, or a header block that has been edited manually (in a stub SAM file). The sort order (@SO) of the two input files must " + "be the same.

" + "Note that validation is minimal, so it is up to the user to ensure that all the elements referred to in the SAMRecords " + @@ -111,7 +111,7 @@ private void standardReheader(final SAMFileHeader replacementHeader) { throw new PicardException("Sort orders of INPUT (" + recordReader.getFileHeader().getSortOrder().name() + ") and HEADER (" + replacementHeader.getSortOrder().name() + ") do not agree."); } - final SAMFileWriter writer = new SAMFileWriterFactory().makeSAMOrBAMWriter(replacementHeader, true, OUTPUT); + final SAMFileWriter writer = new SAMFileWriterFactory().makeWriter(replacementHeader, true, OUTPUT, REFERENCE_SEQUENCE); final ProgressLogger progress = new ProgressLogger(Log.getInstance(ReplaceSamHeader.class)); for (final SAMRecord rec : recordReader) { diff --git a/src/main/java/picard/sam/RevertOriginalBaseQualitiesAndAddMateCigar.java b/src/main/java/picard/sam/RevertOriginalBaseQualitiesAndAddMateCigar.java index 3d52c2245..8537b90bc 100644 --- a/src/main/java/picard/sam/RevertOriginalBaseQualitiesAndAddMateCigar.java +++ b/src/main/java/picard/sam/RevertOriginalBaseQualitiesAndAddMateCigar.java @@ -38,10 +38,10 @@ ) public class RevertOriginalBaseQualitiesAndAddMateCigar extends CommandLineProgram { - @Option(shortName = StandardOptionDefinitions.INPUT_SHORT_NAME, doc = "The input SAM/BAM file to revert the state of.") + @Option(shortName = StandardOptionDefinitions.INPUT_SHORT_NAME, doc = "The input SAM/BAM/CRAM file to revert the state of.") public File INPUT; - @Option(shortName = StandardOptionDefinitions.OUTPUT_SHORT_NAME, doc = "The output SAM/BAM file to create.") + @Option(shortName = StandardOptionDefinitions.OUTPUT_SHORT_NAME, doc = "The output SAM/BAM/CRAM file to create.") public File OUTPUT; @Option(shortName = "SO", doc = "The sort order to create the reverted output file with." @@ -90,7 +90,7 @@ public int doWork() { outHeader.setSortOrder(SORT_ORDER); SAMFileWriterFactory.setDefaultCreateIndexWhileWriting(CREATE_INDEX); SAMFileWriterFactory.setDefaultCreateMd5File(CREATE_MD5_FILE); - final SAMFileWriter out = new SAMFileWriterFactory().makeSAMOrBAMWriter(outHeader, false, OUTPUT); + final SAMFileWriter out = new SAMFileWriterFactory().makeWriter(outHeader, false, OUTPUT, REFERENCE_SEQUENCE); // Iterate over the records, revert original base qualities, and push them into a SortingCollection by queryname final SortingCollection sorter = SortingCollection.newInstance(SAMRecord.class, new BAMRecordCodec(outHeader), @@ -156,9 +156,9 @@ private CanSkipSamFile(final String format, final boolean skip) { } /** - * Checks if we can skip the SAM/BAM file when reverting origin base qualities and adding mate cigars. + * Checks if we can skip the SAM/BAM/CRAM file when reverting origin base qualities and adding mate cigars. * - * @param inputFile the SAM/BAM input file + * @param inputFile the SAM/BAM/CRAM input file * @param maxRecordsToExamine the maximum number of records to examine before quitting * @param revertOriginalBaseQualities true if we are to revert original base qualities, false otherwise * @return whether we can skip or not, and the explanation why. diff --git a/src/main/java/picard/sam/SetNmMdAndUqTags.java b/src/main/java/picard/sam/SetNmMdAndUqTags.java index fa52e14cd..120b6a292 100644 --- a/src/main/java/picard/sam/SetNmMdAndUqTags.java +++ b/src/main/java/picard/sam/SetNmMdAndUqTags.java @@ -53,7 +53,7 @@ ) public class SetNmMdAndUqTags extends CommandLineProgram { static final String USAGE_SUMMARY = "Fixes the NM, MD, and UQ tags in a SAM file. "; - static final String USAGE_DETAILS = "This tool takes in a SAM or BAM file (sorted by coordinate) and calculates the NM, MD, and UQ tags by comparing with the reference."+ + static final String USAGE_DETAILS = "This tool takes in a SAM, BAM or CRAM file (sorted by coordinate) and calculates the NM, MD, and UQ tags by comparing with the reference."+ "
" + "This may be needed when MergeBamAlignment was run with SORT_ORDER different from 'coordinate' and thus could not fix\n"+ "these tags then.
"+ @@ -64,10 +64,10 @@ " O=fixed.bam \\
"+ "" + "


"; - @Option(doc = "The BAM or SAM file to fix.", shortName = StandardOptionDefinitions.INPUT_SHORT_NAME) + @Option(doc = "The SAM, BAM or CRAM file to fix.", shortName = StandardOptionDefinitions.INPUT_SHORT_NAME) public File INPUT; - @Option(doc = "The fixed BAM or SAM output file. ", shortName = StandardOptionDefinitions.OUTPUT_SHORT_NAME) + @Option(doc = "The fixed SAM, BAM or CRAM output file. ", shortName = StandardOptionDefinitions.OUTPUT_SHORT_NAME) public File OUTPUT; @Option(doc = "Whether the file contains bisulfite sequence (used when calculating the NM tag).") @@ -96,7 +96,7 @@ protected int doWork() { throw new SAMException("Input must be coordinate-sorted for this program to run. Found: " + reader.getFileHeader().getSortOrder()); } - final SAMFileWriter writer = new SAMFileWriterFactory().makeSAMOrBAMWriter(reader.getFileHeader(), true, OUTPUT); + final SAMFileWriter writer = new SAMFileWriterFactory().makeWriter(reader.getFileHeader(), true, OUTPUT, REFERENCE_SEQUENCE); writer.setProgressLogger( new ProgressLogger(log, (int) 1e7, "Wrote", "records")); diff --git a/src/main/java/picard/sam/SortSam.java b/src/main/java/picard/sam/SortSam.java index 28058aa23..63ed3af7b 100644 --- a/src/main/java/picard/sam/SortSam.java +++ b/src/main/java/picard/sam/SortSam.java @@ -1,7 +1,7 @@ /* * The MIT License * - * Copyright (c) 2009 The Broad Institute + * Copyright (c) 2009-2016 The Broad Institute * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -50,11 +50,11 @@ programGroup = SamOrBam.class ) public class SortSam extends CommandLineProgram { - static final String USAGE_SUMMARY = "Sorts a SAM or BAM file. "; + static final String USAGE_SUMMARY = "Sorts a SAM, BAM or CRAM file. "; static final String USAGE_DETAILS = "This tool sorts the input SAM or BAM file by coordinate, queryname (QNAME), or some other property " + - "of the SAM record. The SortOrder of a SAM/BAM file is found in the SAM file header tag @HD in the field labeled SO. " + + "of the SAM record. The SortOrder of a SAM/BAM/CRAM file is found in the SAM file header tag @HD in the field labeled SO. " + "" + - "

For a coordinate sorted SAM/BAM file, read alignments are sorted first by the reference sequence name (RNAME) field using the " + + "

For a coordinate sorted SAM/BAM/CRAM file, read alignments are sorted first by the reference sequence name (RNAME) field using the " + "reference sequence dictionary (@SQ tag). Alignments within these subgroups are secondarily sorted using the left-most mapping " + "position of the read (POS). Subsequent to this sorting scheme, alignments are listed arbitrarily.

" + "" + @@ -70,10 +70,10 @@ "" + "
"; - @Option(doc = "The BAM or SAM file to sort.", shortName = StandardOptionDefinitions.INPUT_SHORT_NAME) + @Option(doc = "The SAM, BAM or CRAM file to sort.", shortName = StandardOptionDefinitions.INPUT_SHORT_NAME) public File INPUT; - @Option(doc = "The sorted BAM or SAM output file. ", shortName = StandardOptionDefinitions.OUTPUT_SHORT_NAME) + @Option(doc = "The sorted SAM, BAM or CRAM output file. ", shortName = StandardOptionDefinitions.OUTPUT_SHORT_NAME) public File OUTPUT; @Option(shortName = StandardOptionDefinitions.SORT_ORDER_SHORT_NAME, doc = "Sort order of output file") @@ -91,7 +91,7 @@ protected int doWork() { final SamReader reader = SamReaderFactory.makeDefault().referenceSequence(REFERENCE_SEQUENCE).open(INPUT); ; reader.getFileHeader().setSortOrder(SORT_ORDER); - final SAMFileWriter writer = new SAMFileWriterFactory().makeSAMOrBAMWriter(reader.getFileHeader(), false, OUTPUT); + final SAMFileWriter writer = new SAMFileWriterFactory().makeWriter(reader.getFileHeader(), false, OUTPUT, REFERENCE_SEQUENCE); writer.setProgressLogger( new ProgressLogger(log, (int) 1e7, "Wrote", "records from a sorting collection")); diff --git a/src/main/java/picard/sam/SplitSamByLibrary.java b/src/main/java/picard/sam/SplitSamByLibrary.java index 75282165e..694813422 100755 --- a/src/main/java/picard/sam/SplitSamByLibrary.java +++ b/src/main/java/picard/sam/SplitSamByLibrary.java @@ -1,7 +1,7 @@ /* * The MIT License * - * Copyright (c) 2009 The Broad Institute + * Copyright (c) 2009-2016 The Broad Institute * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -47,18 +47,18 @@ import java.util.Map; /** - * Command-line program to split a SAM or BAM file into separate files based on + * Command-line program to split a SAM/BAM/CRAM file into separate files based on * library name. * * @author ktibbett@broadinstitute.org */ @CommandLineProgramProperties( - usage = "Takes a SAM or BAM file and separates all the reads " + - "into one SAM or BAM file per library name. Reads that do not have " + + usage = "Takes a SAM/BAM/CRAM file and separates all the reads " + + "into one SAM/BAM/CRAM file per library name. Reads that do not have " + "a read group specified or whose read group does not have a library name " + - "are written to a file called 'unknown.' The format (SAM or BAM) of the " + + "are written to a file called 'unknown.' The format (SAM/BAM/CRAM) of the " + "output files matches that of the input file. ", - usageShort = "Splits a SAM or BAM file into individual files by library", + usageShort = "Splits a SAM/BAM/CRAM file into individual files by library", programGroup = SamOrBam.class ) public class SplitSamByLibrary extends CommandLineProgram { @@ -67,7 +67,7 @@ doc = "The SAM or BAM file to be split. ") public File INPUT; @Option(shortName = StandardOptionDefinitions.OUTPUT_SHORT_NAME, - doc = "The directory where the library SAM or BAM files should be written " + + doc = "The directory where the library SAM/BAM/CRAM files should be written " + "(defaults to the current directory). ", optional = true) public File OUTPUT = new File(".").getAbsoluteFile(); @@ -84,11 +84,11 @@ protected int doWork() { IOUtil.assertFileIsReadable(INPUT); IOUtil.assertDirectoryIsWritable(OUTPUT); - SamReader reader = SamReaderFactory.makeDefault().open(INPUT); + SamReader reader = SamReaderFactory.makeDefault().referenceSequence(REFERENCE_SEQUENCE).open(INPUT); Map libraryToWriter = new HashMap(); Map> libraryToRg = new HashMap>(); SAMFileWriterFactory factory = new SAMFileWriterFactory(); - String extension = reader.type().equals(SamReader.Type.BAM_TYPE) ? ".bam" : ".sam"; + String extension = "." + reader.type().fileExtension(); SAMFileHeader unknownHeader = reader.getFileHeader().clone(); unknownHeader.setReadGroups(new ArrayList()); @@ -116,8 +116,9 @@ protected int doWork() { String lib = entry.getKey(); SAMFileHeader header = reader.getFileHeader().clone(); header.setReadGroups(entry.getValue()); - libraryToWriter.put(lib, factory.makeSAMOrBAMWriter(header, true, - new File(OUTPUT, IOUtil.makeFileNameSafe(lib) + extension))); + libraryToWriter.put(lib, factory.makeWriter(header, true, + new File(OUTPUT, IOUtil.makeFileNameSafe(lib) + extension), + REFERENCE_SEQUENCE)); } for (Iterator it = reader.iterator(); it.hasNext(); ) { @@ -127,8 +128,9 @@ protected int doWork() { libraryToWriter.get(rg.getLibrary()).addAlignment(sam); } else { if (unknown == null) { - unknown = factory.makeSAMOrBAMWriter(unknownHeader, true, - new File(OUTPUT, "unknown" + extension)); + unknown = factory.makeWriter(unknownHeader, true, + new File(OUTPUT, "unknown" + extension), + REFERENCE_SEQUENCE); } unknown.addAlignment(sam); } diff --git a/src/main/java/picard/sam/markduplicates/MarkDuplicates.java b/src/main/java/picard/sam/markduplicates/MarkDuplicates.java index 0141c4bdc..cf267c2e8 100644 --- a/src/main/java/picard/sam/markduplicates/MarkDuplicates.java +++ b/src/main/java/picard/sam/markduplicates/MarkDuplicates.java @@ -1,7 +1,7 @@ /* * The MIT License * - * Copyright (c) 2009 The Broad Institute + * Copyright (c) 2009-2016 The Broad Institute * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -64,7 +64,7 @@ ) public class MarkDuplicates extends AbstractMarkDuplicatesCommandLineProgram { static final String USAGE_SUMMARY = "Identifies duplicate reads. "; - static final String USAGE_DETAILS = "

This tool locates and tags duplicate reads in a BAM or SAM file, where duplicate reads are " + + static final String USAGE_DETAILS = "

This tool locates and tags duplicate reads in a SAM, BAM or CRAM file, where duplicate reads are " + "defined as originating from a single fragment of DNA. Duplicates can arise during sample preparation e.g. library " + "construction using PCR. See also " + "EstimateLibraryComplexity" + @@ -77,16 +77,16 @@ " collected, the tool differentiates the primary and duplicate reads using an algorithm that ranks reads by the sums " + "of their base-quality scores (default method).

" + - "

The tool's main output is a new SAM or BAM file, in which duplicates have been identified in the SAM flags field for each" + + "

The tool's main output is a new SAM, BAM or CRAM file, in which duplicates have been identified in the SAM flags field for each" + " read. Duplicates are marked with the hexadecimal value of 0x0400, which corresponds to a decimal value of 1024. " + "If you are not familiar with this type of annotation, please see the following " + "blog post for additional information.

" + "" + "

Although the bitwise flag annotation indicates whether a read was marked as a duplicate, it does not identify the type of " + "duplicate. To do this, a new tag called the duplicate type (DT) tag was recently added as an optional output in " + - "the 'optional field' section of a SAM/BAM file. Invoking the TAGGING_POLICY option," + + "the 'optional field' section of a SAM/BAM/CRAM file. Invoking the TAGGING_POLICY option," + " you can instruct the program to mark all the duplicates (All), only the optical duplicates (OpticalOnly), or no " + - "duplicates (DontTag). The records within the output of a SAM/BAM file will have values for the 'DT' tag (depending on the invoked " + + "duplicates (DontTag). The records within the output of a SAM/BAM/CRAM file will have values for the 'DT' tag (depending on the invoked " + "TAGGING_POLICY), as either library/PCR-generated duplicates (LB), or sequencing-platform artifact duplicates (SQ). " + "This tool uses the READ_NAME_REGEX and the OPTICAL_DUPLICATE_PIXEL_DISTANCE options as the primary methods to identify " + "and differentiate duplicate types. Set READ_NAME_REGEX to null to skip optical duplicate detection, e.g. for RNA-seq " + @@ -119,7 +119,7 @@ /** Enum used to control how duplicates are flagged in the DT optional tag on each read. */ public enum DuplicateTaggingPolicy { DontTag, OpticalOnly, All } - /** The optional attribute in SAM/BAM files used to store the duplicate type. */ + /** The optional attribute in SAM/BAM/CRAM files used to store the duplicate type. */ public static final String DUPLICATE_TYPE_TAG = "DT"; /** The duplicate type tag value for duplicate type: library. */ public static final String DUPLICATE_TYPE_LIBRARY = "LB"; @@ -205,7 +205,7 @@ public static void main(final String[] args) { } /** - * Main work method. Reads the BAM file once and collects sorted information about + * Main work method. Reads the SAM file once and collects sorted information about * the 5' ends of both ends of each read (or just one end in the case of pairs). * Then makes a pass through those determining duplicates before re-reading the * input file and writing it out with duplication flags set correctly. @@ -250,9 +250,10 @@ protected int doWork() { // Key: previous PG ID on a SAM Record (or null). Value: New PG ID to replace it. final Map chainedPgIds = getChainedPgIds(outputHeader); - final SAMFileWriter out = new SAMFileWriterFactory().makeSAMOrBAMWriter(outputHeader, + final SAMFileWriter out = new SAMFileWriterFactory().makeWriter(outputHeader, true, - OUTPUT); + OUTPUT, + REFERENCE_SEQUENCE); // Now copy over the file while marking all the necessary indexes as duplicates long recordInFileIndex = 0; diff --git a/src/main/java/picard/sam/markduplicates/MarkDuplicatesWithMateCigar.java b/src/main/java/picard/sam/markduplicates/MarkDuplicatesWithMateCigar.java index fb9aff26a..564cb18a3 100644 --- a/src/main/java/picard/sam/markduplicates/MarkDuplicatesWithMateCigar.java +++ b/src/main/java/picard/sam/markduplicates/MarkDuplicatesWithMateCigar.java @@ -1,7 +1,7 @@ /* * The MIT License * - * Copyright (c) 2014 The Broad Institute + * Copyright (c) 2014-2016 The Broad Institute * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -64,7 +64,7 @@ ) public class MarkDuplicatesWithMateCigar extends AbstractMarkDuplicatesCommandLineProgram { static final String USAGE_SUMMARY = "Identifies duplicate reads, accounting for mate CIGAR. "; - static final String USAGE_DETAILS = "This tool locates and tags duplicate reads (both PCR and optical) in a BAM or SAM file, where " + + static final String USAGE_DETAILS = "This tool locates and tags duplicate reads (both PCR and optical) in a BAM, SAM or CRAM file, where " + "duplicate reads are defined as originating from the same original fragment of DNA, taking into account the CIGAR string of " + "read mates.

" + "" + @@ -136,9 +136,10 @@ protected int doWork() { final Map chainedPgIds = getChainedPgIds(outputHeader); // Open the output - final SAMFileWriter out = new SAMFileWriterFactory().makeSAMOrBAMWriter(outputHeader, + final SAMFileWriter out = new SAMFileWriterFactory().makeWriter(outputHeader, true, - OUTPUT); + OUTPUT, + REFERENCE_SEQUENCE); // Create the mark duplicate iterator. The duplicate marking is handled by the iterator, conveniently. final MarkDuplicatesWithMateCigarIterator iterator = new MarkDuplicatesWithMateCigarIterator(headerAndIterator.header, diff --git a/src/main/java/picard/sam/markduplicates/SimpleMarkDuplicatesWithMateCigar.java b/src/main/java/picard/sam/markduplicates/SimpleMarkDuplicatesWithMateCigar.java index e8fe4d064..baac38a30 100644 --- a/src/main/java/picard/sam/markduplicates/SimpleMarkDuplicatesWithMateCigar.java +++ b/src/main/java/picard/sam/markduplicates/SimpleMarkDuplicatesWithMateCigar.java @@ -1,7 +1,7 @@ /* * The MIT License * - * Copyright (c) 2015 The Broad Institute + * Copyright (c) 2015-2016 The Broad Institute * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -62,9 +62,9 @@ * @author nhomer */ @CommandLineProgramProperties( - usage = "Examines aligned records in the supplied SAM or BAM file to locate duplicate molecules. " + + usage = "Examines aligned records in the supplied SAM/BAM/CRAM file to locate duplicate molecules. " + "All records are then written to the output file with the duplicate records flagged.", - usageShort = "Examines aligned records in the supplied SAM or BAM file to locate duplicate molecules.", + usageShort = "Examines aligned records in the supplied SAM/BAM/CRAM file to locate duplicate molecules.", programGroup = Testing.class ) public class SimpleMarkDuplicatesWithMateCigar extends MarkDuplicates { @@ -110,9 +110,10 @@ protected int doWork() { final Map chainedPgIds = getChainedPgIds(outputHeader); // Open the output - final SAMFileWriter out = new SAMFileWriterFactory().makeSAMOrBAMWriter(outputHeader, + final SAMFileWriter out = new SAMFileWriterFactory().makeWriter(outputHeader, false, - OUTPUT); + OUTPUT, + REFERENCE_SEQUENCE); final SAMRecordDuplicateComparator comparator = new SAMRecordDuplicateComparator(Collections.singletonList(headerAndIterator.header)); comparator.setScoringStrategy(this.DUPLICATE_SCORING_STRATEGY); diff --git a/src/main/java/picard/sam/markduplicates/util/AbstractMarkDuplicatesCommandLineProgram.java b/src/main/java/picard/sam/markduplicates/util/AbstractMarkDuplicatesCommandLineProgram.java index 5bf6972f4..d0bbd6caa 100644 --- a/src/main/java/picard/sam/markduplicates/util/AbstractMarkDuplicatesCommandLineProgram.java +++ b/src/main/java/picard/sam/markduplicates/util/AbstractMarkDuplicatesCommandLineProgram.java @@ -36,7 +36,6 @@ import htsjdk.samtools.metrics.MetricsFile; import htsjdk.samtools.util.CloseableIterator; import htsjdk.samtools.util.Histogram; -import htsjdk.samtools.util.Log; import picard.PicardException; import picard.cmdline.Option; import picard.cmdline.StandardOptionDefinitions; @@ -209,6 +208,7 @@ protected SamHeaderAndIterator openInputs() { for (final String input : INPUT) { SamReader reader = SamReaderFactory.makeDefault() .enable(SamReaderFactory.Option.EAGERLY_DECODE) + .referenceSequence(REFERENCE_SEQUENCE) .open(SamInputResource.of(input)); final SAMFileHeader header = reader.getFileHeader(); diff --git a/src/test/java/picard/sam/CramCompatibilityTest.java b/src/test/java/picard/sam/CramCompatibilityTest.java new file mode 100644 index 000000000..0454b8b2c --- /dev/null +++ b/src/test/java/picard/sam/CramCompatibilityTest.java @@ -0,0 +1,318 @@ +package picard.sam; + +import htsjdk.samtools.cram.CRAMException; +import htsjdk.samtools.util.IOUtil; +import htsjdk.samtools.util.TestUtil; +import org.testng.Assert; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import picard.cmdline.CommandLineProgram; + +import java.io.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; + +public class CramCompatibilityTest { + + public static final String CRAM_FILE = "testdata/picard/sam/test_cram_file.cram"; + public static final String CRAM_FILE_2 = "testdata/picard/sam/test_cram_file_with_crai.cram"; + public static final String CRAM_FILE_ONE_PAIR = "testdata/picard/sam/one_pair.cram"; + public static final String CRAM_FILE_ONE_PAIR_MC = "testdata/picard/sam/MarkDuplicates/one_pair_mc.cram"; + + public static final String CRAM_FILE_QUERRY_SORTED_UNMAPPED = "testdata/picard/sam/unmapped_queryname_sorted.cram"; + + public static final String REFERENCE_FILE = "testdata/picard/sam/test_cram_file.ref.fa"; + public static final String FASTQ_FILE = "testdata/picard/sam/fastq2bam/fastq-sanger/5k-v1-Rhodobacter_LW1.sam.fastq"; + + public static final String CRAM_UNMAPPED = "testdata/picard/sam/SamFileConverterTest/unmapped.cram"; + + public static final String CRAM_UNMAPPED_PART_1 = "testdata/picard/sam/unmapped_part_1.cram"; + public static final String CRAM_UNMAPPED_PART_2 = "testdata/picard/sam/unmapped_part_2.cram"; + + public static final String CRAM_SPLIT_UNMAPPED = "testdata/picard/sam/split_test_unmapped.cram"; + + public static final String MBA_ALIGNED_CRAM = "testdata/picard/sam/MergeBamAlignment/cliptest.aligned.cram"; + public static final String MBA_UNMAPPED_CRAM = "testdata/picard/sam/MergeBamAlignment/cliptest.unmapped.cram"; + public static final String MBA_REFERENCE = "testdata/picard/sam/MergeBamAlignment/cliptest.fasta"; + + @DataProvider(name = "programms") + public Object[][] getProgramWithParams() { + return new Object[][] { + { "picard.sam.AddOrReplaceReadGroups", + "RGID=4 " + + "RGLB=lib1 " + + "RGPL=illumina " + + "RGPU=unit1 " + + "RGSM=20" + }, + {"picard.sam.CleanSam", null}, + {"picard.sam.FixMateInformation", null}, + {"picard.sam.markduplicates.MarkDuplicates", "M=m"}, + {"picard.sam.MergeSamFiles", null}, + {"picard.sam.PositionBasedDownsampleSam", "FRACTION=0.5"}, + {"picard.sam.ReorderSam", + "REFERENCE=" + REFERENCE_FILE + " " + + "ALLOW_CONTIG_LENGTH_DISCORDANCE=true " + + "ALLOW_INCOMPLETE_DICT_CONCORDANCE=true " + }, + {"picard.sam.SortSam", "SORT_ORDER=coordinate"}, + }; + } + + @Test(dataProvider = "programms") + public void writingMetricsShouldWriteCRAMWhenCRAMWithReferenceIsInput(String program, String exParameters) + throws ClassNotFoundException, IllegalAccessException, InstantiationException, IOException { + final File outputFile = createTempCram(program); + + assertSuccessLaunchProgram(program, CRAM_FILE, outputFile.getAbsolutePath(), exParameters, REFERENCE_FILE); + assertCRAM(outputFile); + } + + @Test(dataProvider = "programms", expectedExceptions = CRAMException.class) + public void metricsShouldFailWithCRAMWithoutReference(String program, String exParameters) + throws IllegalAccessException, InstantiationException, ClassNotFoundException, IOException { + final File outputFile = createTempCram(program); + + assertSuccessLaunchProgramWithNoReference(program, CRAM_FILE, outputFile.getAbsolutePath(), exParameters); + } + + @Test(dataProvider = "programms") + public void writingMetricsShouldWriteCRAMWhenUnmappedCRAMWithoutReferenceIsInput(String program, String exParameters) + throws IOException, IllegalAccessException, InstantiationException, ClassNotFoundException { + final File outputFile = createTempCram(program); + + assertSuccessLaunchProgramWithNoReference(program, CRAM_UNMAPPED, outputFile.getAbsolutePath(), exParameters); + assertCRAM(outputFile); + } + + + // Header should be specify personally for each input + @Test + public void testReplaceSamHeader() throws IOException, IllegalAccessException, InstantiationException, ClassNotFoundException { + String program = "picard.sam.ReplaceSamHeader"; + final File outputFile = createTempCram(program); + + assertSuccessLaunchProgram(program, CRAM_FILE, outputFile.getAbsolutePath(), "HEADER=" + CRAM_FILE_2, REFERENCE_FILE); + assertCRAM(outputFile); + + assertFailingLaunch(program, CRAM_FILE, outputFile.getAbsolutePath(), "HEADER=" + CRAM_FILE_2, null); + + assertSuccessLaunchProgramWithNoReference(program, CRAM_UNMAPPED, outputFile.getAbsolutePath(), "HEADER=" + CRAM_UNMAPPED); + assertCRAM(outputFile); + } + + // Only works with paired reads + @Test + public void testRevertOriginalBaseQualitiesAndAddMateCigar() throws IOException, IllegalAccessException, InstantiationException, ClassNotFoundException { + String program = "picard.sam.RevertOriginalBaseQualitiesAndAddMateCigar"; + final File outputFile = createTempCram(program); + + assertSuccessLaunchProgram(program, CRAM_FILE_ONE_PAIR, outputFile.getAbsolutePath(), null, REFERENCE_FILE); + assertCRAM(outputFile); + + assertFailingLaunch(program, CRAM_FILE_ONE_PAIR, outputFile.getAbsolutePath(), null, null); + + assertSuccessLaunchProgramWithNoReference(program, CRAM_UNMAPPED, outputFile.getAbsolutePath(), null); + assertCRAM(outputFile); + } + + // Several special inputs + @Test + public void testGatherBamFiles() throws IOException, IllegalAccessException, InstantiationException, ClassNotFoundException { + String program = "picard.sam.GatherBamFiles"; + final File outputFile = createTempFile(program, ".cram"); + final String input2 = new File(CRAM_UNMAPPED).getAbsolutePath(); + + assertSuccessLaunchProgram(program, CRAM_FILE_ONE_PAIR, outputFile.getAbsolutePath(), "I=" + input2, REFERENCE_FILE); + assertCRAM(outputFile); + + assertFailingLaunch(program, CRAM_FILE_ONE_PAIR, outputFile.getAbsolutePath(), "I=" + input2, null); + + assertSuccessLaunchProgramWithNoReference(program, CRAM_UNMAPPED_PART_1, outputFile.getAbsolutePath(), "I=" + new File(CRAM_UNMAPPED_PART_2).getAbsolutePath()); + assertCRAM(outputFile); + } + + // Needs directory as OUTPUT + @Test + public void testSplitSamByLibrary() throws IOException, IllegalAccessException, InstantiationException, ClassNotFoundException { + String program = "picard.sam.SplitSamByLibrary"; + final File outputDir = IOUtil.createTempDir("SplitSamByLibrary", ""); + + try { + assertSuccessLaunchProgram(program, CRAM_FILE, outputDir.getPath(), null, REFERENCE_FILE); + assertCRAMs(outputDir); + + assertFailingLaunch(program, CRAM_FILE, outputDir.getPath(), null, null); + + assertSuccessLaunchProgramWithNoReference(program, CRAM_SPLIT_UNMAPPED, outputDir.getPath(), null); + assertCRAMs(outputDir); + + } finally { + TestUtil.recursiveDelete(outputDir); + } + } + + // Only Coordinate sorted - unmapped is not in use + @Test + public void testMarkDuplicatesWithMateCigar() throws IOException, IllegalAccessException, InstantiationException, ClassNotFoundException { + String program = "picard.sam.markduplicates.MarkDuplicatesWithMateCigar"; + final File outputFile = createTempCram(program); + final File metricsFile = createTempFile(program, ".txt"); + + assertSuccessLaunchProgram( + program, + CRAM_FILE, + outputFile.getAbsolutePath(), + "M=" + metricsFile.getAbsolutePath(), + REFERENCE_FILE); + assertCRAM(outputFile); + + assertFailingLaunch(program, CRAM_FILE, outputFile.getAbsolutePath(), "M=" + metricsFile.getAbsolutePath(), null); + } + + + @Test + public void testSimpleMarkDuplicatesWithMateCigar() throws IOException, IllegalAccessException, InstantiationException, ClassNotFoundException { + String program = "picard.sam.markduplicates.SimpleMarkDuplicatesWithMateCigar"; + final File outputFile = createTempCram(program); + final File metricsFile = createTempFile(program, ".txt"); + + assertSuccessLaunchProgram( + program, + CRAM_FILE_ONE_PAIR_MC, + outputFile.getAbsolutePath(), + "M=" + metricsFile.getAbsolutePath(), + REFERENCE_FILE); + assertCRAM(outputFile); + + assertFailingLaunch(program, CRAM_FILE_ONE_PAIR_MC, outputFile.getAbsolutePath(), "M=" + metricsFile.getAbsolutePath(), null); + } + + @DataProvider(name = "programsWithArgs") + public static Object[][] programs() { + return new Object[][] { + { + "picard.sam.SetNmMdAndUqTags", + new String[] { + "I=" + CRAM_FILE, + "R=" + REFERENCE_FILE + }, + }, + { + "picard.illumina.MarkIlluminaAdapters", + new String[] { + "I=" + CRAM_FILE_QUERRY_SORTED_UNMAPPED, + "METRICS=" + createTempFile("picard.illumina.MarkIlluminaAdapters", ".txt").getAbsolutePath() + } + }, + { + "picard.sam.FastqToSam", + new String[] { + "F1=" + FASTQ_FILE, + "SAMPLE_NAME=s1" + } + }, + { + "picard.illumina.IlluminaBasecallsToSam", + new String[] { + "BASECALLS_DIR=" + new File("testdata/picard/illumina/25T8B25T/Data/Intensities/BaseCalls"), + "LANE=1", + "READ_STRUCTURE=25S8S25T", + "RUN_BARCODE=HiMom", + "SAMPLE_ALIAS=HiDad", + "LIBRARY_NAME=Hello, World" + } + }, + { + "picard.sam.MergeBamAlignment", + new String[] { + "UNMAPPED=" + new File(MBA_UNMAPPED_CRAM).getAbsolutePath(), + "ALIGNED=" + new File(MBA_ALIGNED_CRAM).getAbsolutePath(), + "R=" + new File(MBA_REFERENCE).getAbsolutePath(), + } + } + }; + } + + @Test(dataProvider = "programsWithArgs") + public void programsShouldPassReferenceToReadCramFilesAndProduceCramFiles(String program, String[] args) + throws IOException, IllegalAccessException, InstantiationException, ClassNotFoundException { + final File outputCram = createTempCram(program); + + final String[] argsWithOutput = Arrays.copyOf(args, args.length + 1); + argsWithOutput[argsWithOutput.length - 1] = "O=" + outputCram.getAbsolutePath(); + assertSuccessLaunchCMDProgram(program, argsWithOutput); + assertCRAM(outputCram); + } + + private File createTempCram(String name) throws IOException { + return createTempFile(name, ".cram"); + } + + private static File createTempFile(String name, String extension) { + File file = null; + try { + file = File.createTempFile(name, extension); + file.deleteOnExit(); + } catch (IOException e) { + e.printStackTrace(); + } + + return file; + } + + private void assertFailingLaunch(String program, String input, String outputFile, String exParameters, String reference) throws ClassNotFoundException, IllegalAccessException, InstantiationException { + boolean exceptionCaught = false; + try { + assertSuccessLaunchProgram(program, input, outputFile, exParameters, reference); + } catch (CRAMException e) { + exceptionCaught = true; + } + Assert.assertTrue(exceptionCaught, "Metrics should fail with CRAM without reference"); + } + + private void assertSuccessLaunchProgramWithNoReference(String programClassname, String input, String output, String exParams) throws IllegalAccessException, InstantiationException, ClassNotFoundException { + assertSuccessLaunchProgram(programClassname, input, output, exParams, null); + } + + private void assertSuccessLaunchProgram(String programClassname, String input, String output, String exParams, String reference) throws ClassNotFoundException, IllegalAccessException, InstantiationException { + final Collection args = new ArrayList<>(); + + if (input != null) { + args.add("INPUT=" + new File(input).getAbsolutePath()); + } + args.add("OUTPUT=" + output); + + if (exParams != null) { + args.addAll(Arrays.asList(exParams.split(" "))); + } + + if (reference != null) { + args.add("REFERENCE_SEQUENCE=" + new File(reference).getAbsolutePath()); + } + + assertSuccessLaunchCMDProgram(programClassname, args.toArray(new String[args.size()])); + } + + private void assertSuccessLaunchCMDProgram(String programClassname, String... params) throws ClassNotFoundException, IllegalAccessException, InstantiationException { + CommandLineProgram prog = (CommandLineProgram) Class.forName(programClassname).newInstance(); + + Assert.assertEquals(prog.instanceMain(params), 0); + } + + static void assertCRAM(File outputFile) { + try (InputStream in = new FileInputStream(outputFile)) { + Assert.assertEquals(0x43, in.read(), "File is not CRAM"); + Assert.assertEquals(0x52, in.read(), "File is not CRAM"); + Assert.assertEquals(0x41, in.read(), "File is not CRAM"); + Assert.assertEquals(0x4d, in.read(), "File is not CRAM"); + } catch (IOException e) { + e.printStackTrace(); + } + } + + static private void assertCRAMs(File dir) { + Arrays.stream(dir.listFiles()).filter(file -> file.getName().endsWith("cram")).forEach(CramCompatibilityTest::assertCRAM); + } +} diff --git a/src/test/java/picard/sam/FilterSamReadsTest.java b/src/test/java/picard/sam/FilterSamReadsTest.java index 71469c5ad..aa99dc029 100644 --- a/src/test/java/picard/sam/FilterSamReadsTest.java +++ b/src/test/java/picard/sam/FilterSamReadsTest.java @@ -69,22 +69,38 @@ public void setUp() { {"testdata/picard/sam/FilterSamReads/filter2.interval_list", 0} }; } - + /** * filters a SAM using a javascript filter */ @Test(dataProvider = "dataTestJsFilter") public void testJavaScriptFilters(final String samFilename, final String javascriptFilename,final int expectNumber) throws Exception { - // input as SAM file + launchJavaScriptFilter(samFilename, javascriptFilename, expectNumber); + } + + @Test + public void testJavaScriptFiltersWithCRAM() throws Exception { + final FilterSamReads program = setupProgram( + new File("testdata/picard/sam/FilterSamReads/filterOddStarts.js"), + new File(CramCompatibilityTest.CRAM_FILE), + FilterSamReads.Filter.includeJavascript, + CramCompatibilityTest.REFERENCE_FILE); + Assert.assertEquals(program.doWork(), 0); + CramCompatibilityTest.assertCRAM(program.OUTPUT); + } + + private FilterSamReads launchJavaScriptFilter(String samFilename, String javascriptFilename, int expectNumber) throws Exception { + // input as SAM file final File inputSam = new File(samFilename); final File javascriptFile = new File(javascriptFilename); - FilterSamReads filterTest = setupProgram(javascriptFile, inputSam, FilterSamReads.Filter.includeJavascript); - Assert.assertEquals(filterTest.doWork(),0); - + FilterSamReads filterTest = setupProgram(javascriptFile, inputSam, FilterSamReads.Filter.includeJavascript, null); + Assert.assertEquals(filterTest.doWork(), 0); long count = getReadCount(filterTest); Assert.assertEquals(count, expectNumber); + + return filterTest; } /** @@ -106,7 +122,7 @@ public void testPairedIntervalFilter(final String intervalFilename, final int ex final File intervalFile = new File(intervalFilename); - FilterSamReads filterTest = setupProgram(intervalFile, inputSam, FilterSamReads.Filter.includePairedIntervals); + FilterSamReads filterTest = setupProgram(intervalFile, inputSam, FilterSamReads.Filter.includePairedIntervals, null); Assert.assertEquals(filterTest.doWork(),0); long count = getReadCount(filterTest); @@ -114,20 +130,23 @@ public void testPairedIntervalFilter(final String intervalFilename, final int ex Assert.assertEquals(count, expectNumber); } - private FilterSamReads setupProgram(final File inputFile, final File inputSam, final FilterSamReads.Filter filter) throws Exception { + private FilterSamReads setupProgram(final File inputFile, final File inputSam, final FilterSamReads.Filter filter, final String reference) throws Exception { final FilterSamReads program = new FilterSamReads(); program.INPUT = inputSam; - program.OUTPUT = File.createTempFile("FilterSamReads.output.", ".sam"); + program.OUTPUT = File.createTempFile("FilterSamReads.output.", getFilenameExtension(inputSam.getAbsolutePath())); program.OUTPUT.deleteOnExit(); program.FILTER = filter; - if(filter == FilterSamReads.Filter.includePairedIntervals) { + if (filter == FilterSamReads.Filter.includePairedIntervals) { program.INTERVAL_LIST = inputFile; - } - else { + } else { program.JAVASCRIPT_FILE = inputFile; } + if (reference != null) { + program.REFERENCE_SEQUENCE = new File(reference); + } + return program; } @@ -140,4 +159,9 @@ private long getReadCount(FilterSamReads filterTest) throws Exception { samReader.close(); return count; } + + private static String getFilenameExtension(String samFilename) { + final String[] split = samFilename.split("\\."); + return "." + split[split.length - 1]; + } } diff --git a/testdata/picard/sam/MarkDuplicates/one_pair_mc.cram b/testdata/picard/sam/MarkDuplicates/one_pair_mc.cram new file mode 100644 index 0000000000000000000000000000000000000000..b4772a40aaee96171efe7431f1ce7bfff7e8cef8 GIT binary patch literal 12495 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 M5JV(`eizFA4S|Y*=>Px# literal 0 HcmV?d00001 diff --git a/testdata/picard/sam/one_pair.cram b/testdata/picard/sam/one_pair.cram new file mode 100644 index 0000000000000000000000000000000000000000..1264ad2067a76f56b3ce9cadec9bd3aa6d54794c GIT binary patch literal 12434 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 literal 0 HcmV?d00001 diff --git a/testdata/picard/sam/split_test_unmapped.cram b/testdata/picard/sam/split_test_unmapped.cram new file mode 100644 index 0000000000000000000000000000000000000000..58b8079670586ccaf0602afac05093a540402454 GIT binary patch literal 2696 zcmeHI?N6Ik6u;-`?aT9&(iYmSP#UVDf^m$Np<5${J}oWHXkl&LA|g@>OavTbWoDQx z53e=bvf+~b1@i^@f?qV_1L2DrV&d+s^ysW0jctBBvz?C&_*+|iflJ=m3M?(0e>`t_6$l3@ci0kTpNdJGq%_!&T5 zQ|IURM?9|bDn8cWIXuwOf9&-{Z--D54e}ws$Hm9Op3Xyu_$U7o5v#{Q>I_BY%AG$k#n9mx5n@_1w#2zkQe)v0X_Y|8-|_#x)!C4i3G$+dcT# zlZ(&C{-bk5znEnG|EcE0&#{elU6+4w z4heeG86QIA#qrXouYP{FOxE3l-GlR|=1-ZLOilIHNi9&V@^yiWsoOwx%HXB#DTz|P zL;yS9kxj6Gj}n;3=2p%zbxLIH&)jiJg=ztI$z+nw05^>P@xw^xn8gwU=?urTik%{0 zN!J{NuI(YZ*Pc+Dp1HOZ2dY<&=lAlrG1#0(E%!=!WI45*;>3f_6o?0$l+4#Ow6JeO zPIPr1sA0QskD6?ifE<1G#1ebR8`YP$QJPyUz_!h3m0nd|eB>-pqjEg0XTHFAOv>Op zSLTL*nw7!6-4_di<|%_=DC+^5|3K_*!$4-bPq(nxSNhJ4P--c0XUpP756NKc874?c ztF$>?eG+-)=6Q}%>-{xkiC1N_FV~N0R>QSU?=L`Y58Qlz)&l!2hbb)}WT55QX`qG5 z@pp?87{6T^oSR&_1GGpPG*>iX&K%0%r;BBUtT(V;Y5cLaf&D1)??FBLeFG|u22cW7 IO~T%P08jX!od5s; literal 0 HcmV?d00001 diff --git a/testdata/picard/sam/test_cram_file.cram b/testdata/picard/sam/test_cram_file.cram new file mode 100644 index 0000000000000000000000000000000000000000..fcdd9f9da3528487bf6038a514478afb8d34e3f2 GIT binary patch literal 53606 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

x=$d+3 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 17:1-4200 +AAGCTTCTCACCCTGTTCCTGCATAGATAATTGCATGACAATTGCCTTGTCCCTGCTGAA +TGTGCTCTGGGGTCTCTGGGGTCTCACCCACGACCAACTCCCTGGGCCTGGCACCAGGGA +GCTTAACAAACATCTGTCCAGCGAATACCTGCATCCCTAGAAGTGAAGCCACCGCCCAAA +GACACGCCCATGTCCAGCTTAACCTGCATCCCTAGAAGTGAAGGCACCGCCCAAAGACAC +GCCCATGTCCAGCTTATTCTGCCCAGTTCCTCTCCAGAAAGGCTGCATGGTTGACACACA +GTGCCTGCGACAAAGCTGAATGCTATCATTTAAAAACTCCTTGCTGGTTTGAGAGGCAGA +AAATGATATCTCATAGTTGCTTTACTTTGCATATTTTAAAATTGTGACTTTCATGGCATA +AATAATACTGGTTTATTACAGAAGCACTAGAAAATGCATGTGGACAAAAGTTGGGATTAG +GAGAGAGAAATGAAGACATATGTCCACACAAAAACCTGTTCATTGCAGCTTTCTACCATC +ACCAAAAATTGCAAACAACCACACGCCCTTCAACTGGGGAACTCATCAACAACAAACTTG +TGGTTTACCCACACAATGGAAGACCACTTAGCAACAAAAAGGACCAAACTCCTGGTACAT +GCAACTGACAGATGAATCTCAAACGCATTCCTCCGTGTGAAAGAAGCCGGACTCACAGGG +CAACACACTATCTGACTGTTTCATGGGAAAGTCTGGAAACGGCAACACCATTGAGACAGA +AAACAGGTGAGTGGTTGCCTGGGGCCAGGGAACTTTCTGGGGTCATATTCTCTGTGTTGA +TTCTGGTGGTGGAAACAAGACTGTCCCAGCCTGGGTGATACAGCGAGACCCCATCTCTAC +CAAAAAATTAAAAATTAGCTGGGCATGGTGGTGCATGCCTGTAGTCCCAGCTATTCACAG +TGCTGAGGTGGGAAGATGCTTGAGCCCAGGAGTTCAAGGCTGCAATGAGCTATGATTGCG +CCACTGCACTTTGGCCTGGACAACAGAGCAAAACCCTGTCTCTAAAAAAAGAAAAGAAAA +GAAAAACTCACTGGATATGAATGATACAGGTTGAGGATCCATTATCTGAAATGCTTGGAC +CAGATGTTTTGAATTTTGGATTTTTTCATATTTTGTAATCTTTGCAGTATATTTACCAGT +TCAGCATCCCTAACTCAAAAATTCAAAAATCTGAAATCCCAAACGCGCCAATAAGCATTC +CCTTTGAGCGTCATGTCGGTGCTTGGAATGTTTGGGGTTTTGGATTTACAGCTTTGGGAC +GCTCAACCTGTACCTCAATAAACCTGATTTTAAAAAAGTTTGGGGGGATTCCCCTAAGCC +CGCCACCCGGAGACAGCGGATTTCCTTAGTTACTTACTATGCTCCTTGGCCATTTCTCTA +GGTATTGGTATATTGTGTCTGCTGTGAACTGTCCTTGGCCTGTTTGGTGACGGGTGAGGA +GCAGGGACAGAAGGGTCCTGCGTGCCCTGCCTTCACAAGCCCCTGGAAGGAAAGTTGTTT +TGGGATCTCTGCACCCTCAGCCTGGACAACTTGTGCCCATCTGGTGACCCCTCACTCAGC +CACCAGACTTCCACGACAGGCTCCAGCCTCGGCACCTTCAGCCATGGACAGTTCCGCCAG +CGTTGCCCTCTGTTCTGCTGTTTTCTCTACCAGAAGTGCCCTTCCCTCCTCACCTGACCA +CTCTGGGGAAATCCCTCAGCACCCTCCCTGAGCATACCCTACTCTGGCACAAGCCCACCC +TGCAAAGCCCCTGAGGCCCGCCCTGTGGCGTCTCTCCCTCCCTTGCTGTCAGGACAGTGG +TCCTGGCCACCGGGGCTCACGGAGCCGCCCTGTGCCGTGTACCTCTGAGCCCTCTGCACA +GTGCCTTCTGCTTGCCTGTGGCTTTGAGAAGAAACCCCTTCTGGTTATACATAAGACAGC +CAGAGAAGGGAGTTGCCCAGGGTGGCACAGCACGTTGCTGCCAGTTACTGCCATTTTCAC +GGGCATGAAATGGAGATAACAACAGGAGCGACCGCACAGGCTGCTGAGCGCGTCACACGC +AGCCATCGCGCAGCTCAGGGATATTACGTGTAACTCGACATGTCAGCGATTGTCACAGGC +ACTGCTACTCCTGGGGTTTTCCATCAAACCCTCAAGAGCTGGGCCTGGGGTCAACTTCCG +GCCTGGGGAAACTGGGGCAAGTATCACCAGAGATGAGCTTTATAAAAATAATGGTGCTAG +CTGGGCATGGTGGCTTGCACCTGTAATCCCAGCACTTTGGGAGGCCGAGCTAGGAGGATC +GTTTGAGTCCAGCAGTTTGAGACCAGCCTGGCCAATACGGCAAAACCCAGTCTCTACAAA +AAATACAAAAAACAACTAGCCAGGCGTGGTGGTGCACACCTGTAGTCCCAGCTACTCAGG +AGGCTGAGGGGGAAGGACTGCTTGAGCCCAGGAGTTTGAGGCTGCTGTGAGCTGTGATCG +CATCACTGCATTCCAGCCCGGTGACAGAGTGAGTCACTGTCTCAAAAAAGAAAGGAAGAA +ATAAAGAAAACAAATAAAAATAATAGTGCAGACAAAAGGCCTTGACCCATCTAGCTTTGG +CCCTCAGCATCAACCGCTAGATACGTCCCTCCCTTTCTTCTGGGGCACAGGTCACACTCT +CTTCCAGGTCTAGGATGCAGCTGAGGGGTGCCCCTCTTACCATCTAATCTGTGCCCTTAT +TTCCTCTGCTTTAGTGAGGAAGAGGCCCCTGGTCCATGAAGGGGCCTTTCAGAGACGGGG +ACCCCTGAGGAGCCCCGAGCAGCAGCCGTCGTGTCTCACCCAGGGTGTCTGAAACAGATG +TGGAGGTCTCGGGTGAGGCGTGGCTCAGATACAGGGAGTGGCCCACAGCTCGGCCTGTCT +TTGAAAGGCCACGTGACCTGGCCCACGGCTGGCAGGTGGGACCCAGCTGCAGGGGTCCAG +CAGCACCCACAGCAGCCACCTGTGGCAGGGAGGAGCTTGTGGTACAGTGGACAGGCCCTG +CCCAGATGGCCCCCCGCCTGCCTGTGGAAGTTGACCAGACCATCTGTCACAGCAGGTAAG +ACTCTGCTTTCTGGGCAACCCAGCAGGTGACCCTGGAATTCCTGTCCATCTGGCAGGTGG +GCATTGAAACTGGTTTAAAAATGTCACACCATAGGCCGGGCACAGTGGCTCACGCCTGTA +ATCCCAGCCCTTTGGGAGGCCAGGGTGGGTGGATCACTTGAGGTCAGGAGTTCAAGACCA +GCCTGGCCAACATGGTGAAACCCCGTCTACTAAAAATACAAAAATTAGCCTGGCGTGGTG +GCGCATGCCTGTAATCCCAGCTACTTGGGAAGCTGAGGGATGAGAACTGCTTGAACCTGG +GAGGCAGACGTTGCAGTGAGCTGAGATCACGCCACTGCACTCCAGCCTGGGCAACAGAGT +AAGACTCTGTCTCAAAAAAAAAAAAATCACACCATTTTGGCTTCAGATTGCATATCCTCC +TGCAAGGATATATACGCGTGAAATTCAAGTCAATGACAAATCAGAAGAAAAAACATATAT +ATACGCAAACCAGTATCCTACTGTGTGTGTCGTTTGTTGTGTTTTCGACAGCTGTCCGTG +TTATAATAATTCCTCTAGTTCAAATTTATTCATTTTTAACTTCATAGTACCACATTCTAC +ACACTGCCCATGTCCCCTCAAGCTTCCCCTGGCTCCTGCAACCACAAATCTACTCTCTGC +CTCTGTGGGTTGACCTATTCTGGACACGTCATAGAAATAGAGTCCTGCAACACGTGGCCG +TCTGTGTCTGGCTTCTCTCGCTTAGCATCTTGTTTCCAAGGTCCTCCCACAGTGTAGCAT +GCACCTGCTACACTCCTTCTTAGGGCTGATATTCCACGCACCTGCTACACTCCTTCTTAT +GGCTGATATTCCACGCACCTGCTACACTCCTTCTTAGGGCTGATATTCCACACACCCGCT +ACACTCCTTCTTAGGGCTGATATTCCACGCACCCGCTACACTCCTTCTTAGGGCTGATAT +TCCACGCACCTGCTACACTCCTTCTTAGGGCTGATATTCCACGCACCTGCTACACTCCTT +CTTAGGGCTGATATTCCACGCACCTGCTACACTCCTTCTTAGGGCTGATATTCCACGCAC diff --git a/testdata/picard/sam/test_cram_file.ref.fa.fai b/testdata/picard/sam/test_cram_file.ref.fa.fai new file mode 100644 index 000000000..c2112667e --- /dev/null +++ b/testdata/picard/sam/test_cram_file.ref.fa.fai @@ -0,0 +1 @@ +17 4200 14 60 61 diff --git a/testdata/picard/sam/test_cram_file_with_crai.crai b/testdata/picard/sam/test_cram_file_with_crai.crai new file mode 100644 index 0000000000000000000000000000000000000000..0822a2622283889dc7d0175ba355f3ab128dc14c GIT binary patch literal 43 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 aWTVf4H2$yf10VYk$z=HWW4{w3mHz}uXN_P0 literal 0 HcmV?d00001 diff --git a/testdata/picard/sam/unmapped_part_2.cram b/testdata/picard/sam/unmapped_part_2.cram new file mode 100644 index 0000000000000000000000000000000000000000..ff842a4f62acf96853319bf6bdc7d3a5f5890bee GIT binary patch literal 3443 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 TLPG)o8vp|U0000000000bWV#= literal 0 HcmV?d00001 From efa04c0311de7c84fa525dd27929d543e2b50c4d Mon Sep 17 00:00:00 2001 From: Ekaterina Kazachkova Date: Mon, 21 Nov 2016 20:11:31 +0300 Subject: [PATCH 2/4] CRAM format support for DownsampleSam --- src/main/java/picard/sam/DownsampleSam.java | 18 ++++++++---------- src/test/java/picard/sam/CramCompatibilityTest.java | 5 +++-- testdata/picard/sam/test_cram_file.ref.dict | 2 +- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/main/java/picard/sam/DownsampleSam.java b/src/main/java/picard/sam/DownsampleSam.java index 7fcda82e7..6b5f14508 100644 --- a/src/main/java/picard/sam/DownsampleSam.java +++ b/src/main/java/picard/sam/DownsampleSam.java @@ -1,7 +1,7 @@ /* * The MIT License * - * Copyright (c) 2015 The Broad Institute + * Copyright (c) 2015-2016 The Broad Institute * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -44,10 +44,9 @@ import java.io.File; import java.text.DecimalFormat; import java.text.NumberFormat; -import java.util.Random; /** - * Class to randomly downsample a BAM file while respecting that we should either retain or discard + * Class to randomly downsample a SAM, BAM or CRAM file while respecting that we should either retain or discard * all of the reads for a template - i.e. all reads with the same name, whether first or second of * pair, secondary or supplementary, all travel together. * @@ -59,8 +58,8 @@ programGroup = SamOrBam.class ) public class DownsampleSam extends CommandLineProgram { - static final String USAGE_SUMMARY = "Downsample a SAM or BAM file. "; - static final String USAGE_DETAILS = "This tool applies a random downsampling algorithm to a SAM or BAM file to retain " + + static final String USAGE_SUMMARY = "Downsample a SAM, BAM or CRAM file. "; + static final String USAGE_DETAILS = "This tool applies a random downsampling algorithm to a SAM, BAM or CRAM file to retain " + "only a random subset of the reads. Reads in a mate-pair are either both kept or both discarded. Reads marked as not primary " + "alignments are all discarded. Each read is given a probability P of being retained so that runs performed with the exact " + "same input in the same order and with the same value for RANDOM_SEED will produce the same results." + @@ -79,10 +78,10 @@ " O=downsampled.bam" + "" + "


"; - @Option(shortName = StandardOptionDefinitions.INPUT_SHORT_NAME, doc = "The input SAM or BAM file to downsample.") + @Option(shortName = StandardOptionDefinitions.INPUT_SHORT_NAME, doc = "The input SAM, BAM or CRAM file to downsample.") public File INPUT; - @Option(shortName = StandardOptionDefinitions.OUTPUT_SHORT_NAME, doc = "The output, downsampled, SAM or BAM file to write.") + @Option(shortName = StandardOptionDefinitions.OUTPUT_SHORT_NAME, doc = "The output, downsampled, SAM, BAM or CRAM file to write.") public File OUTPUT; @Option(shortName="S", doc="The downsampling strategy to use. See usage for discussion.") @@ -116,11 +115,10 @@ protected int doWork() { log.warn("Running DownsampleSam with PROBABILITY=1! This will likely just recreate the input file."); } - final Random r = RANDOM_SEED == null ? new Random() : new Random(RANDOM_SEED); final SamReader in = SamReaderFactory.makeDefault().referenceSequence(REFERENCE_SEQUENCE).open(INPUT); - final SAMFileWriter out = new SAMFileWriterFactory().makeSAMOrBAMWriter(in.getFileHeader(), true, OUTPUT); + final SAMFileWriter out = new SAMFileWriterFactory().makeWriter(in.getFileHeader(), true, OUTPUT, REFERENCE_SEQUENCE); final ProgressLogger progress = new ProgressLogger(log, (int) 1e7, "Wrote"); - final DownsamplingIterator iterator = DownsamplingIteratorFactory.make(INPUT, STRATEGY, PROBABILITY, ACCURACY, RANDOM_SEED); + final DownsamplingIterator iterator = DownsamplingIteratorFactory.make(in, STRATEGY, PROBABILITY, ACCURACY, RANDOM_SEED); while (iterator.hasNext()) { final SAMRecord rec = iterator.next(); diff --git a/src/test/java/picard/sam/CramCompatibilityTest.java b/src/test/java/picard/sam/CramCompatibilityTest.java index 0454b8b2c..c3b85f45e 100644 --- a/src/test/java/picard/sam/CramCompatibilityTest.java +++ b/src/test/java/picard/sam/CramCompatibilityTest.java @@ -20,7 +20,7 @@ public static final String CRAM_FILE_ONE_PAIR = "testdata/picard/sam/one_pair.cram"; public static final String CRAM_FILE_ONE_PAIR_MC = "testdata/picard/sam/MarkDuplicates/one_pair_mc.cram"; - public static final String CRAM_FILE_QUERRY_SORTED_UNMAPPED = "testdata/picard/sam/unmapped_queryname_sorted.cram"; + public static final String CRAM_FILE_QUERY_SORTED_UNMAPPED = "testdata/picard/sam/unmapped_queryname_sorted.cram"; public static final String REFERENCE_FILE = "testdata/picard/sam/test_cram_file.ref.fa"; public static final String FASTQ_FILE = "testdata/picard/sam/fastq2bam/fastq-sanger/5k-v1-Rhodobacter_LW1.sam.fastq"; @@ -47,6 +47,7 @@ "RGSM=20" }, {"picard.sam.CleanSam", null}, + {"picard.sam.DownsampleSam", null}, {"picard.sam.FixMateInformation", null}, {"picard.sam.markduplicates.MarkDuplicates", "M=m"}, {"picard.sam.MergeSamFiles", null}, @@ -202,7 +203,7 @@ public void testSimpleMarkDuplicatesWithMateCigar() throws IOException, IllegalA { "picard.illumina.MarkIlluminaAdapters", new String[] { - "I=" + CRAM_FILE_QUERRY_SORTED_UNMAPPED, + "I=" + CRAM_FILE_QUERY_SORTED_UNMAPPED, "METRICS=" + createTempFile("picard.illumina.MarkIlluminaAdapters", ".txt").getAbsolutePath() } }, diff --git a/testdata/picard/sam/test_cram_file.ref.dict b/testdata/picard/sam/test_cram_file.ref.dict index 38976b814..433246b66 100644 --- a/testdata/picard/sam/test_cram_file.ref.dict +++ b/testdata/picard/sam/test_cram_file.ref.dict @@ -1,2 +1,2 @@ @HD VN:1.5 SO:unsorted -@SQ SN:17 LN:4200 M5:f8c08a4411f07717451464d546b3706d UR:file:D:\Dev\epamgit\picard-pho\testdata\picard\sam\mpileup.ref.fa +@SQ SN:17 LN:4200 M5:f8c08a4411f07717451464d546b3706d UR:file:\testdata\picard\sam\test_cram_file.fa From 765b98355cdfba368df7f34eef5c7dde1f898718 Mon Sep 17 00:00:00 2001 From: Ekaterina Kazachkova Date: Fri, 30 Dec 2016 14:32:12 +0300 Subject: [PATCH 3/4] fixes for javadoc according comment https://github.com/broadinstitute/picard/pull/683#discussion_r92953364 --- .../picard/illumina/IlluminaBasecallsToSam.java | 12 +++++----- .../java/picard/sam/AbstractAlignmentMerger.java | 2 +- src/main/java/picard/sam/FilterSamReads.java | 12 +++++----- src/main/java/picard/sam/GatherBamFiles.java | 26 +++++++++++----------- src/main/java/picard/sam/MergeSamFiles.java | 4 ++-- src/main/java/picard/sam/ReorderSam.java | 6 ++--- src/main/java/picard/sam/ReplaceSamHeader.java | 4 ++-- ...RevertOriginalBaseQualitiesAndAddMateCigar.java | 12 +++++----- src/main/java/picard/sam/SetNmMdAndUqTags.java | 2 +- src/main/java/picard/sam/SplitSamByLibrary.java | 2 +- .../AbstractMarkDuplicatesCommandLineProgram.java | 4 ++-- 11 files changed, 43 insertions(+), 43 deletions(-) diff --git a/src/main/java/picard/illumina/IlluminaBasecallsToSam.java b/src/main/java/picard/illumina/IlluminaBasecallsToSam.java index fb1b27cf3..5ad0d5a89 100644 --- a/src/main/java/picard/illumina/IlluminaBasecallsToSam.java +++ b/src/main/java/picard/illumina/IlluminaBasecallsToSam.java @@ -65,11 +65,11 @@ /** * IlluminaBasecallsToSam transforms a lane of Illumina data file formats (bcl, locs, clocs, qseqs, etc.) into - * SAM or BAM file format. + * SAM, BAM or CRAM file format. *

* In this application, barcode data is read from Illumina data file groups, each of which is associated with a tile. * Each tile may contain data for any number of barcodes, and a single barcode's data may span multiple tiles. Once the - * barcode data is collected from files, each barcode's data is written to its own SAM/BAM. The barcode data must be + * barcode data is collected from files, each barcode's data is written to its own SAM/BAM/CRAM. The barcode data must be * written in order; this means that barcode data from each tile is sorted before it is written to file, and that if a * barcode's data does span multiple tiles, data collected from each tile must be written in the order of the tiles * themselves. @@ -179,18 +179,18 @@ @Option(doc = ReadStructure.PARAMETER_DOC, shortName = "RS") public String READ_STRUCTURE; - @Option(doc = "Deprecated (use LIBRARY_PARAMS). Tab-separated file for creating all output BAMs for barcoded run " + + @Option(doc = "Deprecated (use LIBRARY_PARAMS). Tab-separated file for creating all output SAM, BAM or CRAM files for barcoded run " + "with single IlluminaBasecallsToSam invocation. Columns are BARCODE, OUTPUT, SAMPLE_ALIAS, and " + "LIBRARY_NAME. Row with BARCODE=N is used to specify a file for no barcode match", mutex = {"OUTPUT", "SAMPLE_ALIAS", "LIBRARY_NAME", "LIBRARY_PARAMS"}) public File BARCODE_PARAMS; - @Option(doc = "Tab-separated file for creating all output BAMs for a lane with single IlluminaBasecallsToSam " + + @Option(doc = "Tab-separated file for creating all output SAM, BAM or CRAM files for a lane with single IlluminaBasecallsToSam " + "invocation. The columns are OUTPUT, SAMPLE_ALIAS, and LIBRARY_NAME, BARCODE_1, BARCODE_2 ... BARCODE_X " + "where X = number of barcodes per cluster (optional). Row with BARCODE_1 set to 'N' is used to specify a file " + "for no barcode match. You may also provide any 2 letter RG header attributes (excluding PU, CN, PL, and" + " DT) as columns in this file and the values for those columns will be inserted into the RG tag for the" + - " BAM file created for a given row.", + " SAM, BAM or CRAM file created for a given row.", mutex = {"OUTPUT", "SAMPLE_ALIAS", "LIBRARY_NAME", "BARCODE_PARAMS"}) public File LIBRARY_PARAMS; @@ -234,7 +234,7 @@ public boolean INCLUDE_NON_PF_READS = true; @Option(doc="Whether to ignore reads whose barcodes are not found in LIBRARY_PARAMS. Useful when outputting " + - "BAMs for only a subset of the barcodes in a lane.", shortName="INGORE_UNEXPECTED") + "SAM, BAM or CRAM files for only a subset of the barcodes in a lane.", shortName="INGORE_UNEXPECTED") public boolean IGNORE_UNEXPECTED_BARCODES = false; @Option(doc="The tag to use to store any molecular indexes. If more than one molecular index is found, they will be concatenated and stored here.", optional=true) diff --git a/src/main/java/picard/sam/AbstractAlignmentMerger.java b/src/main/java/picard/sam/AbstractAlignmentMerger.java index 6ee5266c6..a4a0cd50d 100644 --- a/src/main/java/picard/sam/AbstractAlignmentMerger.java +++ b/src/main/java/picard/sam/AbstractAlignmentMerger.java @@ -67,7 +67,7 @@ *

* The order of processing is as follows: *

- * 1. Get records from the unmapped bam and the alignment data + * 1. Get records from the unmapped SAM/BAM/CRAM and the alignment data * 2. Merge the alignment information and public tags ONLY from the aligned SAMRecords * 3. Do additional modifications -- handle clipping, trimming, etc. * 4. Fix up mate information on paired reads diff --git a/src/main/java/picard/sam/FilterSamReads.java b/src/main/java/picard/sam/FilterSamReads.java index ea97e961c..7b7f9778a 100644 --- a/src/main/java/picard/sam/FilterSamReads.java +++ b/src/main/java/picard/sam/FilterSamReads.java @@ -83,12 +83,12 @@ private static final Log log = Log.getInstance(FilterSamReads.class); protected /* <- used in test */ enum Filter { - includeAligned("OUTPUT SAM/BAM will contain aligned reads only. INPUT SAM/BAM must be in queryname SortOrder. (Note that *both* first and second of paired reads must be aligned to be included in the OUTPUT SAM or BAM)"), - excludeAligned("OUTPUT SAM/BAM will contain un-mapped reads only. INPUT SAM/BAM must be in queryname SortOrder. (Note that *both* first and second of pair must be aligned to be excluded from the OUTPUT SAM or BAM)"), - includeReadList("OUTPUT SAM/BAM will contain reads that are supplied in the READ_LIST_FILE file"), - excludeReadList("OUTPUT bam will contain reads that are *not* supplied in the READ_LIST_FILE file"), - includeJavascript("OUTPUT bam will contain reads that hava been accepted by the JAVASCRIPT_FILE script."), - includePairedIntervals("OUTPUT SAM/BAM will contain any reads (and their mate) that overlap with an interval. INPUT SAM/BAM and INTERVAL_LIST must be in coordinate SortOrder. Only aligned reads will be output."); + includeAligned("OUTPUT SAM/BAM/CRAM will contain aligned reads only. INPUT SAM/BAM/CRAM must be in queryname SortOrder. (Note that *both* first and second of paired reads must be aligned to be included in the OUTPUT SAM/BAM/CRAM)"), + excludeAligned("OUTPUT SAM/BAM/CRAM will contain un-mapped reads only. INPUT SAM/BAM/CRAM must be in queryname SortOrder. (Note that *both* first and second of pair must be aligned to be excluded from the OUTPUT SAM/BAM/CRAM)"), + includeReadList("OUTPUT SAM/BAM/CRAM will contain reads that are supplied in the READ_LIST_FILE file"), + excludeReadList("OUTPUT SAM/BAM/CRAM will contain reads that are *not* supplied in the READ_LIST_FILE file"), + includeJavascript("OUTPUT SAM/BAM/CRAM will contain reads that have been accepted by the JAVASCRIPT_FILE script."), + includePairedIntervals("OUTPUT SAM/BAM/CRAM will contain any reads (and their mate) that overlap with an interval. INPUT SAM/BAM/CRAM and INTERVAL_LIST must be in coordinate SortOrder. Only aligned reads will be output."); private final String description; Filter(final String description) { diff --git a/src/main/java/picard/sam/GatherBamFiles.java b/src/main/java/picard/sam/GatherBamFiles.java index 2d6307e1c..e62024256 100644 --- a/src/main/java/picard/sam/GatherBamFiles.java +++ b/src/main/java/picard/sam/GatherBamFiles.java @@ -21,9 +21,9 @@ import java.util.List; /** - * Program to perform a rapid "gather" operation on BAM files after a scatter operations where - * the same process has been performed on different regions of a BAM file creating many smaller - * BAM files that now need to be concatenated back together. + * Program to perform a rapid "gather" operation on BAM/CRAM files after a scatter operations where + * the same process has been performed on different regions of a BAM/CRAM file creating many smaller + * BAM/CRAM files that now need to be concatenated back together. * * @author Tim Fennell */ @@ -33,15 +33,15 @@ programGroup = SamOrBam.class ) public class GatherBamFiles extends CommandLineProgram { - static final String USAGE_SUMMARY = "Concatenate one or more BAM files as efficiently as possible"; - static final String USAGE_DETAILS = "This tool performs a rapid \"gather\" operation on BAM files after scatter" + - " operations where the same process has been performed on different regions of a BAM file creating many " + - "smaller BAM files that now need to be concatenated (reassembled) back together." + + static final String USAGE_SUMMARY = "Concatenate one or more BAM/CRAM files as efficiently as possible"; + static final String USAGE_DETAILS = "This tool performs a rapid \"gather\" operation on BAM/CRAM files after scatter" + + " operations where the same process has been performed on different regions of a BAM/CRAM file creating many " + + "smaller BAM/CRAM files that now need to be concatenated (reassembled) back together." + "

" + - "Assumes that the list of BAM files provided as INPUT are in the order that they should be concatenated and" + - " simply concatenates the bodies of the BAM files while retaining the header from the first file. " + + "Assumes that the list of BAM/CRAM files provided as INPUT are in the order that they should be concatenated and" + + " simply concatenates the bodies of the BAM/CRAM files while retaining the header from the first file. " + "Operates via copying of the gzip blocks directly for speed but also supports generation of an MD5 on the" + - " output and indexing of the output BAM file. Only supports BAM files, does not support SAM files." + + " output and indexing of the output BAM/CRAM file. Only supports BAM/CRAM files, does not support SAM files." + "

Usage example:

" + "
" +
             "java -jar picard.jar GatherBamFiles \\
" + @@ -51,10 +51,10 @@ "
" + "
"; @Option(shortName = StandardOptionDefinitions.INPUT_SHORT_NAME, - doc = "Two or more BAM files or text files containing lists of BAM files (one per line).") + doc = "Two or more BAM/CRAM files or text files containing lists of BAM/CRAM files (one per line).") public List INPUT; - @Option(shortName = StandardOptionDefinitions.OUTPUT_SHORT_NAME, doc = "The output BAM file to write.") + @Option(shortName = StandardOptionDefinitions.OUTPUT_SHORT_NAME, doc = "The output BAM/CRAM file to write.") public File OUTPUT; private static final Log log = Log.getInstance(GatherBamFiles.class); @@ -97,7 +97,7 @@ private boolean determineBlockCopyingStatus(final List inputs) { /** * Simple implementation of a gather operations that uses SAMFileReaders and Writers in order to concatenate - * multiple BAM files. + * multiple BAM/CRAM files. */ private static void gatherNormally(final List inputs, final File output, final boolean createIndex, final boolean createMd5, final File referenceFasta) { diff --git a/src/main/java/picard/sam/MergeSamFiles.java b/src/main/java/picard/sam/MergeSamFiles.java index b8a2ccf3f..c0a3fd2c6 100644 --- a/src/main/java/picard/sam/MergeSamFiles.java +++ b/src/main/java/picard/sam/MergeSamFiles.java @@ -101,7 +101,7 @@ @Option(doc = "Option to create a background thread to encode, " + "compress and write to disk the output file. The threaded version uses about 20% more CPU and decreases " + - "runtime by ~20% when writing out a compressed BAM file.") + "runtime by ~20% when writing out a compressed BAM/CRAM file.") public boolean USE_THREADING = false; @Option(doc = "Comment(s) to include in the merged output file's header.", optional = true, shortName = "CO") @@ -188,7 +188,7 @@ protected int doWork() { } else { // show warning related to https://github.com/broadinstitute/picard/pull/314/files - log.info("Warning: merged bams from different interval lists may contain the same read in both files"); + log.info("Warning: merged files from different interval lists may contain the same read in both files"); iterator = new MergingSamRecordIterator(headerMerger, samReaderToIterator, true); } final SAMFileHeader header = headerMerger.getMergedHeader(); diff --git a/src/main/java/picard/sam/ReorderSam.java b/src/main/java/picard/sam/ReorderSam.java index 9f3839a8e..eebe3fc77 100644 --- a/src/main/java/picard/sam/ReorderSam.java +++ b/src/main/java/picard/sam/ReorderSam.java @@ -74,7 +74,7 @@ "A sequence dictionary corresponding to the reference fasta is required. Create one with CreateSequenceDictionary.jar.") public File REFERENCE; - @Option(shortName = "S", doc = "If true, then allows only a partial overlap of the BAM contigs with the new reference " + + @Option(shortName = "S", doc = "If true, then allows only a partial overlap of the SAM/BAM/CRAM contigs with the new reference " + "sequence contigs. By default, this tool requires a corresponding contig in the new " + "reference for each read contig") public boolean ALLOW_INCOMPLETE_DICT_CONCORDANCE = false; @@ -107,7 +107,7 @@ protected int doWork() { return 1; } - printDictionary("SAM/BAM file", in.getFileHeader().getSequenceDictionary()); + printDictionary("SAM/BAM/CRAM file", in.getFileHeader().getSequenceDictionary()); printDictionary("Reference", refDict); Map newOrder = buildSequenceDictionaryMap(refDict, in.getFileHeader().getSequenceDictionary()); @@ -198,7 +198,7 @@ private void writeReads(final SAMFileWriter out, final SAMSequenceDictionary readsDict) { Map newOrder = new HashMap(); - log.info("Reordering SAM/BAM file:"); + log.info("Reordering SAM/BAM/CRAM file:"); for (final SAMSequenceRecord refRec : refDict.getSequences()) { final SAMSequenceRecord readsRec = readsDict.getSequence(refRec.getSequenceName()); diff --git a/src/main/java/picard/sam/ReplaceSamHeader.java b/src/main/java/picard/sam/ReplaceSamHeader.java index 4cb74fd13..e33309edf 100644 --- a/src/main/java/picard/sam/ReplaceSamHeader.java +++ b/src/main/java/picard/sam/ReplaceSamHeader.java @@ -68,10 +68,10 @@ " O=bam_with_new_head.bam" + "" + "
"; - @Option(doc = "SAM file from which SAMRecords will be read.", shortName = StandardOptionDefinitions.INPUT_SHORT_NAME) + @Option(doc = "SAM, BAM or CRAM file from which SAMRecords will be read.", shortName = StandardOptionDefinitions.INPUT_SHORT_NAME) public File INPUT; - @Option(doc = "SAM file from which SAMFileHeader will be read.") + @Option(doc = "SAM, BAM or CRAM file from which SAMFileHeader will be read.") public File HEADER; @Option(doc = "SAMFileHeader from HEADER file will be written to this file, followed by SAMRecords from INPUT file", diff --git a/src/main/java/picard/sam/RevertOriginalBaseQualitiesAndAddMateCigar.java b/src/main/java/picard/sam/RevertOriginalBaseQualitiesAndAddMateCigar.java index 8537b90bc..a78cf1e1b 100644 --- a/src/main/java/picard/sam/RevertOriginalBaseQualitiesAndAddMateCigar.java +++ b/src/main/java/picard/sam/RevertOriginalBaseQualitiesAndAddMateCigar.java @@ -25,15 +25,15 @@ import java.util.Iterator; /** - * This tool reverts the original base qualities (if specified) and adds the mate cigar tag to mapped BAMs. + * This tool reverts the original base qualities (if specified) and adds the mate cigar tag to mapped SAM, BAM or CRAM files. * If the file does not have OQs and already has mate cigar tags, nothing is done. * New BAM/BAI/MD5 files are created. * * @author Nils Homer */ @CommandLineProgramProperties( - usage = "Reverts the original base qualities and adds the mate cigar tag to read-group BAMs.", - usageShort = "Reverts the original base qualities and adds the mate cigar tag to read-group BAMs", + usage = "Reverts the original base qualities and adds the mate cigar tag to read-group SAM, BAM or CRAM files.", + usageShort = "Reverts the original base qualities and adds the mate cigar tag to read-group SAM, BAM or CRAM files", programGroup = SamOrBam.class ) public class RevertOriginalBaseQualitiesAndAddMateCigar extends CommandLineProgram { @@ -138,9 +138,9 @@ public int doWork() { * Used as a return for the canSkipSAMFile function. */ public enum CanSkipSamFile { - CAN_SKIP("Can skip the BAM file", true), - CANNOT_SKIP_FOUND_OQ("Cannot skip the BAM as we found a record with an OQ", false), - CANNOT_SKIP_FOUND_NO_MC("Cannot skip the BAM as we found a mate with no mate cigar tag", false), + CAN_SKIP("Can skip the SAM/BAM/CRAM file", true), + CANNOT_SKIP_FOUND_OQ("Cannot skip the SAM/BAM/CRAM as we found a record with an OQ", false), + CANNOT_SKIP_FOUND_NO_MC("Cannot skip the SAM/BAM/CRAM as we found a mate with no mate cigar tag", false), FOUND_NO_EVIDENCE("Found no evidence of OQ or mate with no mate cigar in the first %d records. Will continue...", false); final private String format; final private boolean skip; diff --git a/src/main/java/picard/sam/SetNmMdAndUqTags.java b/src/main/java/picard/sam/SetNmMdAndUqTags.java index 120b6a292..1cdd7929e 100644 --- a/src/main/java/picard/sam/SetNmMdAndUqTags.java +++ b/src/main/java/picard/sam/SetNmMdAndUqTags.java @@ -52,7 +52,7 @@ programGroup = SamOrBam.class ) public class SetNmMdAndUqTags extends CommandLineProgram { - static final String USAGE_SUMMARY = "Fixes the NM, MD, and UQ tags in a SAM file. "; + static final String USAGE_SUMMARY = "Fixes the NM, MD, and UQ tags in a SAM, BAM or CRAM file. "; static final String USAGE_DETAILS = "This tool takes in a SAM, BAM or CRAM file (sorted by coordinate) and calculates the NM, MD, and UQ tags by comparing with the reference."+ "
" + "This may be needed when MergeBamAlignment was run with SORT_ORDER different from 'coordinate' and thus could not fix\n"+ diff --git a/src/main/java/picard/sam/SplitSamByLibrary.java b/src/main/java/picard/sam/SplitSamByLibrary.java index 694813422..a3b266d6f 100755 --- a/src/main/java/picard/sam/SplitSamByLibrary.java +++ b/src/main/java/picard/sam/SplitSamByLibrary.java @@ -64,7 +64,7 @@ public class SplitSamByLibrary extends CommandLineProgram { @Option(shortName = StandardOptionDefinitions.INPUT_SHORT_NAME, - doc = "The SAM or BAM file to be split. ") + doc = "The SAM, BAM of CRAM file to be split. ") public File INPUT; @Option(shortName = StandardOptionDefinitions.OUTPUT_SHORT_NAME, doc = "The directory where the library SAM/BAM/CRAM files should be written " + diff --git a/src/main/java/picard/sam/markduplicates/util/AbstractMarkDuplicatesCommandLineProgram.java b/src/main/java/picard/sam/markduplicates/util/AbstractMarkDuplicatesCommandLineProgram.java index d0bbd6caa..3af3267dd 100644 --- a/src/main/java/picard/sam/markduplicates/util/AbstractMarkDuplicatesCommandLineProgram.java +++ b/src/main/java/picard/sam/markduplicates/util/AbstractMarkDuplicatesCommandLineProgram.java @@ -51,14 +51,14 @@ /** * Abstract class that holds parameters and methods common to classes that perform duplicate - * detection and/or marking within SAM/BAM files. + * detection and/or marking within SAM/BAM/CRAM files. * * @author Nils Homer */ public abstract class AbstractMarkDuplicatesCommandLineProgram extends AbstractOpticalDuplicateFinderCommandLineProgram { @Option(shortName = StandardOptionDefinitions.INPUT_SHORT_NAME, - doc = "One or more input SAM or BAM files to analyze. Must be coordinate sorted.") + doc = "One or more input SAM, BAM or CRAM files to analyze. Must be coordinate sorted.") public List INPUT; @Option(shortName = StandardOptionDefinitions.OUTPUT_SHORT_NAME, From edc5eb26bd91cf3a427bb5bc36f54b1747b05e68 Mon Sep 17 00:00:00 2001 From: Ekaterina Kazachkova Date: Tue, 31 Jan 2017 11:38:03 +0300 Subject: [PATCH 4/4] fixes after code review --- src/main/java/picard/sam/ReorderSam.java | 18 +- .../java/picard/sam/CramCompatibilityTest.java | 388 +++++++++------------ src/test/java/picard/sam/FilterSamReadsTest.java | 22 +- .../picard/sam/MarkDuplicates/one_pair_mc.cram | Bin 12495 -> 1749 bytes testdata/picard/sam/one_pair.cram | Bin 12434 -> 0 bytes testdata/picard/sam/test_cram_file.cram | Bin 53606 -> 0 bytes .../sam/test_cram_file_coordinate_sorted.cram | Bin 0 -> 39358 bytes .../sam/test_cram_file_coordinate_sorted.cram.bai | Bin 0 -> 96 bytes .../picard/sam/test_cram_file_header_only.cram | Bin 0 -> 778 bytes .../picard/sam/test_cram_file_query_sorted.cram | Bin 0 -> 38479 bytes .../sam/test_cram_file_query_sorted.cram.crai | Bin 0 -> 44 bytes testdata/picard/sam/test_cram_file_with_crai.crai | Bin 43 -> 0 bytes testdata/picard/sam/test_cram_file_with_crai.cram | Bin 24562 -> 0 bytes testdata/picard/sam/unmapped_with_oq_tag.cram | Bin 0 -> 3544 bytes 14 files changed, 198 insertions(+), 230 deletions(-) delete mode 100644 testdata/picard/sam/one_pair.cram delete mode 100644 testdata/picard/sam/test_cram_file.cram create mode 100644 testdata/picard/sam/test_cram_file_coordinate_sorted.cram create mode 100644 testdata/picard/sam/test_cram_file_coordinate_sorted.cram.bai create mode 100644 testdata/picard/sam/test_cram_file_header_only.cram create mode 100644 testdata/picard/sam/test_cram_file_query_sorted.cram create mode 100644 testdata/picard/sam/test_cram_file_query_sorted.cram.crai delete mode 100644 testdata/picard/sam/test_cram_file_with_crai.crai delete mode 100644 testdata/picard/sam/test_cram_file_with_crai.cram create mode 100644 testdata/picard/sam/unmapped_with_oq_tag.cram diff --git a/src/main/java/picard/sam/ReorderSam.java b/src/main/java/picard/sam/ReorderSam.java index eebe3fc77..aadbc40bc 100644 --- a/src/main/java/picard/sam/ReorderSam.java +++ b/src/main/java/picard/sam/ReorderSam.java @@ -70,10 +70,6 @@ @Option(shortName = StandardOptionDefinitions.OUTPUT_SHORT_NAME, doc = "Output file (SAM/BAM/CRAM) to write extracted reads to.") public File OUTPUT; - @Option(shortName = StandardOptionDefinitions.REFERENCE_SHORT_NAME, doc = "Reference sequence to reorder reads to match. " + - "A sequence dictionary corresponding to the reference fasta is required. Create one with CreateSequenceDictionary.jar.") - public File REFERENCE; - @Option(shortName = "S", doc = "If true, then allows only a partial overlap of the SAM/BAM/CRAM contigs with the new reference " + "sequence contigs. By default, this tool requires a corresponding contig in the new " + "reference for each read contig") @@ -91,14 +87,22 @@ public static void main(final String[] argv) { new ReorderSam().instanceMainWithExit(argv); } + @Override + protected String[] customCommandLineValidation() { + if (REFERENCE_SEQUENCE == null) { + return new String[]{"Must have a non-null REFERENCE_SEQUENCE"}; + } + return super.customCommandLineValidation(); + } + protected int doWork() { IOUtil.assertFileIsReadable(INPUT); - IOUtil.assertFileIsReadable(REFERENCE); + IOUtil.assertFileIsReadable(REFERENCE_SEQUENCE); IOUtil.assertFileIsWritable(OUTPUT); final SamReader in = SamReaderFactory.makeDefault().referenceSequence(REFERENCE_SEQUENCE).open(INPUT); - ReferenceSequenceFile reference = ReferenceSequenceFileFactory.getReferenceSequenceFile(REFERENCE); + ReferenceSequenceFile reference = ReferenceSequenceFileFactory.getReferenceSequenceFile(REFERENCE_SEQUENCE); SAMSequenceDictionary refDict = reference.getSequenceDictionary(); if (refDict == null) { @@ -239,7 +243,7 @@ private void writeReads(final SAMFileWriter out, private void printDictionary(String name, SAMSequenceDictionary dict) { log.info(name); for (final SAMSequenceRecord contig : dict.getSequences()) { - log.info(" SN=%s LN=%d%n", contig.getSequenceName(), contig.getSequenceLength()); + log.info(String.format(" SN=%s LN=%d%n", contig.getSequenceName(), contig.getSequenceLength())); } } } diff --git a/src/test/java/picard/sam/CramCompatibilityTest.java b/src/test/java/picard/sam/CramCompatibilityTest.java index c3b85f45e..930b84a12 100644 --- a/src/test/java/picard/sam/CramCompatibilityTest.java +++ b/src/test/java/picard/sam/CramCompatibilityTest.java @@ -1,9 +1,11 @@ package picard.sam; +import htsjdk.samtools.SamStreams; import htsjdk.samtools.cram.CRAMException; import htsjdk.samtools.util.IOUtil; import htsjdk.samtools.util.TestUtil; import org.testng.Assert; +import org.testng.annotations.AfterTest; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import picard.cmdline.CommandLineProgram; @@ -15,17 +17,18 @@ public class CramCompatibilityTest { - public static final String CRAM_FILE = "testdata/picard/sam/test_cram_file.cram"; - public static final String CRAM_FILE_2 = "testdata/picard/sam/test_cram_file_with_crai.cram"; - public static final String CRAM_FILE_ONE_PAIR = "testdata/picard/sam/one_pair.cram"; + public static final String CRAM_FILE = "testdata/picard/sam/test_cram_file_coordinate_sorted.cram"; + public static final String CRAM_FILE_2 = "testdata/picard/sam/test_cram_file_header_only.cram"; public static final String CRAM_FILE_ONE_PAIR_MC = "testdata/picard/sam/MarkDuplicates/one_pair_mc.cram"; public static final String CRAM_FILE_QUERY_SORTED_UNMAPPED = "testdata/picard/sam/unmapped_queryname_sorted.cram"; + public static final String CRAM_FILE_QUERY_SORTED = "testdata/picard/sam/test_cram_file_query_sorted.cram"; public static final String REFERENCE_FILE = "testdata/picard/sam/test_cram_file.ref.fa"; public static final String FASTQ_FILE = "testdata/picard/sam/fastq2bam/fastq-sanger/5k-v1-Rhodobacter_LW1.sam.fastq"; public static final String CRAM_UNMAPPED = "testdata/picard/sam/SamFileConverterTest/unmapped.cram"; + public static final String CRAM_UNMAPPED_WITH_OQ_TAG = "testdata/picard/sam/unmapped_with_oq_tag.cram"; public static final String CRAM_UNMAPPED_PART_1 = "testdata/picard/sam/unmapped_part_1.cram"; public static final String CRAM_UNMAPPED_PART_2 = "testdata/picard/sam/unmapped_part_2.cram"; @@ -36,215 +39,186 @@ public static final String MBA_UNMAPPED_CRAM = "testdata/picard/sam/MergeBamAlignment/cliptest.unmapped.cram"; public static final String MBA_REFERENCE = "testdata/picard/sam/MergeBamAlignment/cliptest.fasta"; - @DataProvider(name = "programms") - public Object[][] getProgramWithParams() { + private static final File outputDir = IOUtil.createTempDir("testdata/picard/sam/CramCompatibilityTest", ".tmp"); + + @AfterTest + public void tearDown() { + TestUtil.recursiveDelete(outputDir); + } + + @DataProvider(name = "programArgsForCRAMWithReference") + public Object[][] getArgsForCRAMWithReference() { return new Object[][] { - { "picard.sam.AddOrReplaceReadGroups", - "RGID=4 " + - "RGLB=lib1 " + - "RGPL=illumina " + - "RGPU=unit1 " + - "RGSM=20" + {"picard.sam.AddOrReplaceReadGroups", + "RGID=4 RGLB=lib1 RGPL=illumina RGPU=unit1 RGSM=20", + CRAM_FILE, + REFERENCE_FILE + }, + {"picard.sam.CleanSam", null, CRAM_FILE, REFERENCE_FILE}, + {"picard.sam.DownsampleSam", null, CRAM_FILE, REFERENCE_FILE}, + {"picard.sam.FixMateInformation", null, CRAM_FILE, REFERENCE_FILE}, + {"picard.sam.markduplicates.MarkDuplicates", + "M=" + createTempFile("MarkDuplicates", ".dir").getAbsolutePath(), + CRAM_FILE, + REFERENCE_FILE + }, + {"picard.sam.MergeSamFiles", null, CRAM_FILE, REFERENCE_FILE}, + {"picard.sam.PositionBasedDownsampleSam", "FRACTION=0.5", CRAM_FILE, REFERENCE_FILE}, + {"picard.sam.SortSam", "SORT_ORDER=queryname", CRAM_FILE, REFERENCE_FILE}, + {"picard.sam.ReplaceSamHeader", "HEADER=" + CRAM_FILE_2, CRAM_FILE, REFERENCE_FILE}, + {"picard.sam.RevertOriginalBaseQualitiesAndAddMateCigar", null, CRAM_FILE_QUERY_SORTED, REFERENCE_FILE}, + {"picard.sam.GatherBamFiles", + "I=" + new File(CRAM_UNMAPPED).getAbsolutePath(), + CRAM_FILE_QUERY_SORTED, + REFERENCE_FILE + }, + {"picard.sam.markduplicates.MarkDuplicatesWithMateCigar", + "M=" + createTempFile("MarkDuplicatesWithMateCigar", ".txt").getAbsolutePath(), + CRAM_FILE, + REFERENCE_FILE + }, + {"picard.sam.markduplicates.SimpleMarkDuplicatesWithMateCigar", + "M=" + createTempFile("SimpleMarkDuplicatesWithMateCigar", ".txt").getAbsolutePath(), + CRAM_FILE_ONE_PAIR_MC, + REFERENCE_FILE }, - {"picard.sam.CleanSam", null}, - {"picard.sam.DownsampleSam", null}, - {"picard.sam.FixMateInformation", null}, - {"picard.sam.markduplicates.MarkDuplicates", "M=m"}, - {"picard.sam.MergeSamFiles", null}, - {"picard.sam.PositionBasedDownsampleSam", "FRACTION=0.5"}, {"picard.sam.ReorderSam", - "REFERENCE=" + REFERENCE_FILE + " " + - "ALLOW_CONTIG_LENGTH_DISCORDANCE=true " + - "ALLOW_INCOMPLETE_DICT_CONCORDANCE=true " + null, + CRAM_FILE, + REFERENCE_FILE + }, + {"picard.sam.SetNmMdAndUqTags", null, CRAM_FILE, REFERENCE_FILE}, + {"picard.sam.MergeBamAlignment", + "UNMAPPED=" + new File(MBA_UNMAPPED_CRAM).getAbsolutePath() + + " ALIGNED=" + new File(MBA_ALIGNED_CRAM).getAbsolutePath(), + null, + MBA_REFERENCE + }, + {"picard.illumina.MarkIlluminaAdapters", + "METRICS=" + createTempFile("picard.illumina.MarkIlluminaAdapters", ".txt").getAbsolutePath(), + CRAM_FILE_QUERY_SORTED, + REFERENCE_FILE }, - {"picard.sam.SortSam", "SORT_ORDER=coordinate"}, + {"picard.sam.SplitSamByLibrary", null, CRAM_FILE, REFERENCE_FILE} }; } - @Test(dataProvider = "programms") - public void writingMetricsShouldWriteCRAMWhenCRAMWithReferenceIsInput(String program, String exParameters) - throws ClassNotFoundException, IllegalAccessException, InstantiationException, IOException { + @Test(dataProvider = "programArgsForCRAMWithReference") + public void testShouldWriteCRAMWhenCRAMWithReference(String program, + String parameters, + String cramFile, + String reference) throws IOException, IllegalAccessException, InstantiationException, ClassNotFoundException { + if (!program.equals("picard.sam.SplitSamByLibrary")) { final File outputFile = createTempCram(program); - - assertSuccessLaunchProgram(program, CRAM_FILE, outputFile.getAbsolutePath(), exParameters, REFERENCE_FILE); + launchProgram(program, cramFile, outputFile.getAbsolutePath(), parameters, reference); assertCRAM(outputFile); - } - - @Test(dataProvider = "programms", expectedExceptions = CRAMException.class) - public void metricsShouldFailWithCRAMWithoutReference(String program, String exParameters) - throws IllegalAccessException, InstantiationException, ClassNotFoundException, IOException { - final File outputFile = createTempCram(program); - - assertSuccessLaunchProgramWithNoReference(program, CRAM_FILE, outputFile.getAbsolutePath(), exParameters); - } - - @Test(dataProvider = "programms") - public void writingMetricsShouldWriteCRAMWhenUnmappedCRAMWithoutReferenceIsInput(String program, String exParameters) - throws IOException, IllegalAccessException, InstantiationException, ClassNotFoundException { - final File outputFile = createTempCram(program); - - assertSuccessLaunchProgramWithNoReference(program, CRAM_UNMAPPED, outputFile.getAbsolutePath(), exParameters); - assertCRAM(outputFile); - } - - - // Header should be specify personally for each input - @Test - public void testReplaceSamHeader() throws IOException, IllegalAccessException, InstantiationException, ClassNotFoundException { - String program = "picard.sam.ReplaceSamHeader"; - final File outputFile = createTempCram(program); - - assertSuccessLaunchProgram(program, CRAM_FILE, outputFile.getAbsolutePath(), "HEADER=" + CRAM_FILE_2, REFERENCE_FILE); - assertCRAM(outputFile); - - assertFailingLaunch(program, CRAM_FILE, outputFile.getAbsolutePath(), "HEADER=" + CRAM_FILE_2, null); - - assertSuccessLaunchProgramWithNoReference(program, CRAM_UNMAPPED, outputFile.getAbsolutePath(), "HEADER=" + CRAM_UNMAPPED); - assertCRAM(outputFile); - } - - // Only works with paired reads - @Test - public void testRevertOriginalBaseQualitiesAndAddMateCigar() throws IOException, IllegalAccessException, InstantiationException, ClassNotFoundException { - String program = "picard.sam.RevertOriginalBaseQualitiesAndAddMateCigar"; - final File outputFile = createTempCram(program); - - assertSuccessLaunchProgram(program, CRAM_FILE_ONE_PAIR, outputFile.getAbsolutePath(), null, REFERENCE_FILE); - assertCRAM(outputFile); - - assertFailingLaunch(program, CRAM_FILE_ONE_PAIR, outputFile.getAbsolutePath(), null, null); - - assertSuccessLaunchProgramWithNoReference(program, CRAM_UNMAPPED, outputFile.getAbsolutePath(), null); - assertCRAM(outputFile); - } - - // Several special inputs - @Test - public void testGatherBamFiles() throws IOException, IllegalAccessException, InstantiationException, ClassNotFoundException { - String program = "picard.sam.GatherBamFiles"; - final File outputFile = createTempFile(program, ".cram"); - final String input2 = new File(CRAM_UNMAPPED).getAbsolutePath(); - - assertSuccessLaunchProgram(program, CRAM_FILE_ONE_PAIR, outputFile.getAbsolutePath(), "I=" + input2, REFERENCE_FILE); - assertCRAM(outputFile); - - assertFailingLaunch(program, CRAM_FILE_ONE_PAIR, outputFile.getAbsolutePath(), "I=" + input2, null); - - assertSuccessLaunchProgramWithNoReference(program, CRAM_UNMAPPED_PART_1, outputFile.getAbsolutePath(), "I=" + new File(CRAM_UNMAPPED_PART_2).getAbsolutePath()); - assertCRAM(outputFile); - } - - // Needs directory as OUTPUT - @Test - public void testSplitSamByLibrary() throws IOException, IllegalAccessException, InstantiationException, ClassNotFoundException { - String program = "picard.sam.SplitSamByLibrary"; - final File outputDir = IOUtil.createTempDir("SplitSamByLibrary", ""); - - try { - assertSuccessLaunchProgram(program, CRAM_FILE, outputDir.getPath(), null, REFERENCE_FILE); - assertCRAMs(outputDir); - - assertFailingLaunch(program, CRAM_FILE, outputDir.getPath(), null, null); - - assertSuccessLaunchProgramWithNoReference(program, CRAM_SPLIT_UNMAPPED, outputDir.getPath(), null); - assertCRAMs(outputDir); - - } finally { - TestUtil.recursiveDelete(outputDir); + } else { + final File tmpDir = IOUtil.createTempDir(outputDir.getAbsolutePath(), program); + launchProgram(program, cramFile, tmpDir.getAbsolutePath(), parameters, reference); + assertCRAMs(tmpDir); } } - // Only Coordinate sorted - unmapped is not in use - @Test - public void testMarkDuplicatesWithMateCigar() throws IOException, IllegalAccessException, InstantiationException, ClassNotFoundException { - String program = "picard.sam.markduplicates.MarkDuplicatesWithMateCigar"; - final File outputFile = createTempCram(program); - final File metricsFile = createTempFile(program, ".txt"); - - assertSuccessLaunchProgram( - program, - CRAM_FILE, - outputFile.getAbsolutePath(), - "M=" + metricsFile.getAbsolutePath(), - REFERENCE_FILE); - assertCRAM(outputFile); - - assertFailingLaunch(program, CRAM_FILE, outputFile.getAbsolutePath(), "M=" + metricsFile.getAbsolutePath(), null); + @DataProvider(name = "programArgsForCRAMWithoutReferenceToFail") + public Object[][] getArgsForCRAMWithoutReferenceToFail() { + return new Object[][] { + {"picard.sam.AddOrReplaceReadGroups", + "RGID=4 RGLB=lib1 RGPL=illumina RGPU=unit1 RGSM=20", + CRAM_FILE + }, + {"picard.sam.CleanSam", null, CRAM_FILE}, + {"picard.sam.DownsampleSam", null, CRAM_FILE}, + {"picard.sam.FixMateInformation", null, CRAM_FILE}, + {"picard.sam.markduplicates.MarkDuplicates", + "M=" + createTempFile("MarkDuplicates", ".dir").getAbsolutePath(), + CRAM_FILE + }, + {"picard.sam.MergeSamFiles", null, CRAM_FILE}, + {"picard.sam.PositionBasedDownsampleSam", "FRACTION=0.5", CRAM_FILE}, + {"picard.sam.SortSam", "SORT_ORDER=queryname", CRAM_FILE}, + {"picard.sam.ReplaceSamHeader", "HEADER=" + CRAM_FILE_2, CRAM_FILE}, + {"picard.sam.RevertOriginalBaseQualitiesAndAddMateCigar", null, CRAM_FILE_QUERY_SORTED}, + {"picard.sam.GatherBamFiles", + "I=" + new File(CRAM_UNMAPPED).getAbsolutePath(), + CRAM_FILE_QUERY_SORTED + }, + {"picard.sam.markduplicates.MarkDuplicatesWithMateCigar", + "M=" + createTempFile("MarkDuplicatesWithMateCigar", ".txt").getAbsolutePath(), + CRAM_FILE}, + {"picard.sam.markduplicates.SimpleMarkDuplicatesWithMateCigar", + "M=" + createTempFile("SimpleMarkDuplicatesWithMateCigar", ".txt").getAbsolutePath(), + CRAM_FILE_ONE_PAIR_MC}, + {"picard.illumina.MarkIlluminaAdapters", + "METRICS=" + createTempFile("picard.illumina.MarkIlluminaAdapters", ".txt").getAbsolutePath(), + CRAM_FILE_QUERY_SORTED, + }, + {"picard.sam.SplitSamByLibrary", null, CRAM_FILE} + }; } - - @Test - public void testSimpleMarkDuplicatesWithMateCigar() throws IOException, IllegalAccessException, InstantiationException, ClassNotFoundException { - String program = "picard.sam.markduplicates.SimpleMarkDuplicatesWithMateCigar"; - final File outputFile = createTempCram(program); - final File metricsFile = createTempFile(program, ".txt"); - - assertSuccessLaunchProgram( - program, - CRAM_FILE_ONE_PAIR_MC, - outputFile.getAbsolutePath(), - "M=" + metricsFile.getAbsolutePath(), - REFERENCE_FILE); - assertCRAM(outputFile); - - assertFailingLaunch(program, CRAM_FILE_ONE_PAIR_MC, outputFile.getAbsolutePath(), "M=" + metricsFile.getAbsolutePath(), null); + @Test(dataProvider = "programArgsForCRAMWithoutReferenceToFail", expectedExceptions = CRAMException.class) + public void testShouldFailWhenCRAMWithoutReference(String program, + String parameters, + String cramFile) throws IOException, IllegalAccessException, InstantiationException, ClassNotFoundException { + if (!program.equals("picard.sam.SplitSamByLibrary")) { + final File outputFile = createTempCram(program); + launchProgram(program, cramFile, outputFile.getAbsolutePath(), parameters, null); + assertCRAM(outputFile); + } else { + final File tmpDir = IOUtil.createTempDir(outputDir.getAbsolutePath(), program); + launchProgram(program, cramFile, tmpDir.getAbsolutePath(), parameters, null); + assertCRAMs(tmpDir); + } } - @DataProvider(name = "programsWithArgs") - public static Object[][] programs() { + // test with CRAMs that don't need reference (unmapped CRAMs for input or output) + @DataProvider(name = "programArgsWithUnmappedCRAM") + public Object[][] getArgsWithUnmappedCRAM() { return new Object[][] { - { - "picard.sam.SetNmMdAndUqTags", - new String[] { - "I=" + CRAM_FILE, - "R=" + REFERENCE_FILE - }, + {"picard.sam.AddOrReplaceReadGroups", "RGID=4 RGLB=lib1 RGPL=illumina RGPU=unit1 RGSM=20", CRAM_UNMAPPED}, + {"picard.sam.CleanSam", null, CRAM_UNMAPPED}, + {"picard.sam.DownsampleSam", null, CRAM_UNMAPPED}, + {"picard.sam.FixMateInformation", null, CRAM_UNMAPPED}, + {"picard.sam.markduplicates.MarkDuplicates", + "M=" + createTempFile("MarkDuplicates", ".dir").getAbsolutePath(), + CRAM_UNMAPPED }, - { - "picard.illumina.MarkIlluminaAdapters", - new String[] { - "I=" + CRAM_FILE_QUERY_SORTED_UNMAPPED, - "METRICS=" + createTempFile("picard.illumina.MarkIlluminaAdapters", ".txt").getAbsolutePath() - } + {"picard.sam.MergeSamFiles", null, CRAM_UNMAPPED}, + {"picard.sam.PositionBasedDownsampleSam", "FRACTION=0.5", CRAM_UNMAPPED}, + {"picard.sam.SortSam", "SORT_ORDER=unsorted", CRAM_UNMAPPED}, + {"picard.sam.ReplaceSamHeader", "HEADER=" + MBA_UNMAPPED_CRAM, CRAM_UNMAPPED}, + {"picard.sam.RevertOriginalBaseQualitiesAndAddMateCigar", null, CRAM_UNMAPPED_WITH_OQ_TAG}, + {"picard.sam.GatherBamFiles", + "I=" + new File(CRAM_UNMAPPED_PART_2).getAbsolutePath(), + CRAM_UNMAPPED_PART_1 }, - { - "picard.sam.FastqToSam", - new String[] { - "F1=" + FASTQ_FILE, - "SAMPLE_NAME=s1" - } + {"picard.sam.FastqToSam", "F1=" + FASTQ_FILE + " SAMPLE_NAME=s1", null}, + {"picard.illumina.IlluminaBasecallsToSam", + "BASECALLS_DIR=" + new File("testdata/picard/illumina/25T8B25T/Data/Intensities/BaseCalls") + + " LANE=1 READ_STRUCTURE=25S8S25T RUN_BARCODE=HiMom SAMPLE_ALIAS=HiDad LIBRARY_NAME=HelloWorld", + null }, - { - "picard.illumina.IlluminaBasecallsToSam", - new String[] { - "BASECALLS_DIR=" + new File("testdata/picard/illumina/25T8B25T/Data/Intensities/BaseCalls"), - "LANE=1", - "READ_STRUCTURE=25S8S25T", - "RUN_BARCODE=HiMom", - "SAMPLE_ALIAS=HiDad", - "LIBRARY_NAME=Hello, World" - } + {"picard.illumina.MarkIlluminaAdapters", + "METRICS=" + createTempFile("picard.illumina.MarkIlluminaAdapters", ".txt").getAbsolutePath(), + CRAM_FILE_QUERY_SORTED_UNMAPPED }, - { - "picard.sam.MergeBamAlignment", - new String[] { - "UNMAPPED=" + new File(MBA_UNMAPPED_CRAM).getAbsolutePath(), - "ALIGNED=" + new File(MBA_ALIGNED_CRAM).getAbsolutePath(), - "R=" + new File(MBA_REFERENCE).getAbsolutePath(), - } - } + {"picard.sam.SplitSamByLibrary", null, CRAM_SPLIT_UNMAPPED} }; } - @Test(dataProvider = "programsWithArgs") - public void programsShouldPassReferenceToReadCramFilesAndProduceCramFiles(String program, String[] args) - throws IOException, IllegalAccessException, InstantiationException, ClassNotFoundException { - final File outputCram = createTempCram(program); - - final String[] argsWithOutput = Arrays.copyOf(args, args.length + 1); - argsWithOutput[argsWithOutput.length - 1] = "O=" + outputCram.getAbsolutePath(); - assertSuccessLaunchCMDProgram(program, argsWithOutput); - assertCRAM(outputCram); + @Test(dataProvider = "programArgsWithUnmappedCRAM") + public void testShouldWriteCRAMWhenUnmappedCRAMWithoutReference(String program, + String parameters, + String cramFile) throws IOException, IllegalAccessException, InstantiationException, ClassNotFoundException { + if (!program.equals("picard.sam.SplitSamByLibrary")) { + final File outputFile = createTempCram(program); + launchProgram(program, cramFile, outputFile.getAbsolutePath(), parameters, null); + assertCRAM(outputFile); + } else { + final File tmpDir = IOUtil.createTempDir(outputDir.getAbsolutePath(), program); + launchProgram(program, cramFile, tmpDir.getAbsolutePath(), parameters, null); + assertCRAMs(tmpDir); + } } private File createTempCram(String name) throws IOException { @@ -254,7 +228,7 @@ private File createTempCram(String name) throws IOException { private static File createTempFile(String name, String extension) { File file = null; try { - file = File.createTempFile(name, extension); + file = File.createTempFile(name, extension, outputDir); file.deleteOnExit(); } catch (IOException e) { e.printStackTrace(); @@ -263,21 +237,11 @@ private static File createTempFile(String name, String extension) { return file; } - private void assertFailingLaunch(String program, String input, String outputFile, String exParameters, String reference) throws ClassNotFoundException, IllegalAccessException, InstantiationException { - boolean exceptionCaught = false; - try { - assertSuccessLaunchProgram(program, input, outputFile, exParameters, reference); - } catch (CRAMException e) { - exceptionCaught = true; - } - Assert.assertTrue(exceptionCaught, "Metrics should fail with CRAM without reference"); - } - - private void assertSuccessLaunchProgramWithNoReference(String programClassname, String input, String output, String exParams) throws IllegalAccessException, InstantiationException, ClassNotFoundException { - assertSuccessLaunchProgram(programClassname, input, output, exParams, null); - } - - private void assertSuccessLaunchProgram(String programClassname, String input, String output, String exParams, String reference) throws ClassNotFoundException, IllegalAccessException, InstantiationException { + private void launchProgram(String programClassname, + String input, + String output, + String exParams, + String reference) throws ClassNotFoundException, IllegalAccessException, InstantiationException { final Collection args = new ArrayList<>(); if (input != null) { @@ -293,27 +257,19 @@ private void assertSuccessLaunchProgram(String programClassname, String input, S args.add("REFERENCE_SEQUENCE=" + new File(reference).getAbsolutePath()); } - assertSuccessLaunchCMDProgram(programClassname, args.toArray(new String[args.size()])); - } - - private void assertSuccessLaunchCMDProgram(String programClassname, String... params) throws ClassNotFoundException, IllegalAccessException, InstantiationException { - CommandLineProgram prog = (CommandLineProgram) Class.forName(programClassname).newInstance(); - - Assert.assertEquals(prog.instanceMain(params), 0); + CommandLineProgram program = (CommandLineProgram) Class.forName(programClassname).newInstance(); + program.instanceMain(args.toArray(new String[args.size()])); } static void assertCRAM(File outputFile) { try (InputStream in = new FileInputStream(outputFile)) { - Assert.assertEquals(0x43, in.read(), "File is not CRAM"); - Assert.assertEquals(0x52, in.read(), "File is not CRAM"); - Assert.assertEquals(0x41, in.read(), "File is not CRAM"); - Assert.assertEquals(0x4d, in.read(), "File is not CRAM"); + Assert.assertTrue(SamStreams.isCRAMFile(new BufferedInputStream(in)), "File is not a CRAM."); } catch (IOException e) { e.printStackTrace(); } } - static private void assertCRAMs(File dir) { + private static void assertCRAMs(File dir) { Arrays.stream(dir.listFiles()).filter(file -> file.getName().endsWith("cram")).forEach(CramCompatibilityTest::assertCRAM); } } diff --git a/src/test/java/picard/sam/FilterSamReadsTest.java b/src/test/java/picard/sam/FilterSamReadsTest.java index aa99dc029..54dc3b53f 100644 --- a/src/test/java/picard/sam/FilterSamReadsTest.java +++ b/src/test/java/picard/sam/FilterSamReadsTest.java @@ -24,7 +24,10 @@ package picard.sam; import htsjdk.samtools.*; +import htsjdk.samtools.util.IOUtil; +import htsjdk.samtools.util.TestUtil; import org.testng.Assert; +import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeTest; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; @@ -35,15 +38,10 @@ import java.util.stream.StreamSupport; public class FilterSamReadsTest extends CommandLineProgramTest { - @Override - public String getCommandLineProgramName() { - return FilterSamReads.class.getSimpleName(); - } - private static final int READ_LENGTH = 151; - private final SAMRecordSetBuilder builder = new SAMRecordSetBuilder(); - private final static File TEST_DIR = new File("testdata/picard/sam/FilterSamReads/"); + private final SAMRecordSetBuilder builder = new SAMRecordSetBuilder(); + private final static File TEST_DIR = IOUtil.createTempDir("testdata/picard/sam/FilterSamReads/output", ".tmp"); @BeforeTest public void setUp() { @@ -54,6 +52,16 @@ public void setUp() { builder.addPair("one_of_pair", 0, 1, 1000); //first read should pass, second should not, but both will be kept in first test } + @AfterTest + public void tearDown() { + TestUtil.recursiveDelete(TEST_DIR); + } + + @Override + public String getCommandLineProgramName() { + return FilterSamReads.class.getSimpleName(); + } + @DataProvider(name = "dataTestJsFilter") public Object[][] dataTestJsFilter() { return new Object[][]{ diff --git a/testdata/picard/sam/MarkDuplicates/one_pair_mc.cram b/testdata/picard/sam/MarkDuplicates/one_pair_mc.cram index b4772a40aaee96171efe7431f1ce7bfff7e8cef8..ea35315b1606685a8712adf7d456da45e038a2ea 100644 GIT binary patch delta 589 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 NC&BC`c~B1Q{{XlLN_hYP diff --git a/testdata/picard/sam/one_pair.cram b/testdata/picard/sam/one_pair.cram deleted file mode 100644 index 1264ad2067a76f56b3ce9cadec9bd3aa6d54794c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12434 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 diff --git a/testdata/picard/sam/test_cram_file.cram b/testdata/picard/sam/test_cram_file.cram deleted file mode 100644 index fcdd9f9da3528487bf6038a514478afb8d34e3f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53606 zcmeFYb!=Qq^DSy-W@culm?>svW@ct)J7$L1am>ujj+vP$W@bC)J2@xk`+d4k?@9Om z_oOo#sjI42t?FLgJ$q}S?=f-oBD z?>^9TUtMS1&xz+7LtWh!8|EL9_2-?7zRK znM}K&c-!*#zt_FK$(r?dsefWA+KN)gEc`f%B4m_u94&q@0Wb4#)O(JzW6>YHTig2~ z`#O|$KQvOWI%=7cN<2}gz11S0yN@xZ>2{i>-#q1gf08s+;@zT6M@iW&7eGnrd1G^a zP|vGhFvV|jL)U&kQ4MfjfnQg3-;Tfgg)2NdTD#vf$jYsQMGWkjuzNPOWz!#wH9Y+) zZ|C=mK8wCj%Qbp3dfU(4&KCYG7_`t2)K?Wy;D;qRj~(xWC0IvFG>iBH$sGa=5mdqz zykNW^XjT`P4^5BrqAc7bv2bm8^Y}&Qjk1Mv#ZV_=vacSduhwG$ER{-sE z&f{tLD#5qgur~udc)OvnN$rPV)5@2xZ-Scr7v2w`rts~TD~JP%k9;rRxK29E1?D+% z|BB3PKiHggng2y$Gk_RUa{CoP;ksE*7)6S+{#7=3t=`hXn*-i%s;KvTW!`hjujcYM zOJHp5f1oe#X4M-DX9r%Xhuwu-w+l1ZtGXLH`izU(4%Y6fy+O*;NsMZ0%8^?BnjKu- zZ|zBlw|9U1^Tj0;wl<5)rZh+^XdK@L_qBF707P!J z{d^&cC&@Y6#$iz9_+j=O98}^ z-p!pNs(`^1bgtKF%G;+WcewS*``cq1E z_D?CZ-;?@XYNjbQkMg*Habtq99=EwohO_?ZhN6Bhholrp6IzEpTbM zg3X)^&YX}&EV9Ke;t4f0IW{~%Ki)yhYoF5*R*!` z8DFU{uj}tH|Dv_IsJ_B_Mdx@__keqc$$FvXh42rZcta-$?(REyhl%^&)8^OpX8>td z7u83AH1&H{;9dcUkUf!T5|6^~DY;tLmady1D ze8mTQ&i;1a6gKg)>#5--#F4Cxe#YIaVxw?S!bLm(lFhySaXI0rNp$O&#vNrNyw}G_ zbj#BGw^{ECFpt0gHVgfJN4I~QY5o9HllzRUEso@8B(m>e!j)Y93m5)xgl~qE`@rl_ z@164ZHe*LFwea)O3pIiVr<}V|#f?hAvwezFK#z9h@)-GQvAAn9Np0FoyZo0EJ5wV@ z_3&Jrg$j^0yx)T`yL@E}F(P=$ne$v>TVl;O~Dk zSk3pH`HulX{Kqh3`eO_V{4prxzhW)8BetD&ed17y z{ykv&2NwI=`I5hklYb1;yFZcbe+=#WKas_M48?~(k#RQ@mGINYu`JD&_iZ(2_oR#L zMCtn{zLax%#518lSWkT}<9oNS-`X%?{4H%5LQB>m|+K zE8cx6JyryQ`>cYhI1+am-KF^rO$JU$ zT|%+j^tP(f_Ik}V0C$7U&~Lhpq(WJzrLlnH^p44q_N~BCkNg{X+0D*a6))@{{G=sr z&qp4WW77&Z8NI{3jZ=-nG@%V<&zvOp>fjVTasQz`S2+M!%?q1?;BT?T-(Ziz zw7|o^!Jw&n;w1pE?B>SYvTWkgn8L$f1(%?u8I3oMZ+Iv#^(g5&;bP-PPP03_b87Bb zqWCGQoo_B&`)0=+Uj75#z4;&T_Wyuq1^xq;1{wToP;wexp65O39aSUkFYpk*YevKU zPY-+Fe<&HXvHl*q;qm@G{D0^>kc|GGMo3|rx=hSJOAH%|5ut zF0)Ak-kkoD(k@xAUmiZWxZ~CMvXAdC=ZT2zefmn$*(Ju>t+z;7Df#t1ei`ujA|Ld6 zS4q8Q)95ucvJrCbXFF(KUJw`c3rb>5GsDmCoinjX%3BZp`pJ*?FKhM++tOD>@3Y|Q zB+L=(>~o1nY(PU!%8+@%y`m)^u;nNG4}iII6$gmQy#N3Xi@&i1KLODhR$h=6F}mAaABV_?V3(~DISN2YGKP!?-^qEAnb7aHU$4UOd}UK#4V z03ucBP8k>i08v?pp4nY2fJjxCanA8K5zV)>)`s6iDbr)3%fE@Fj!ZF5u>j*CzheP+ z1&rr6jQ|hGsv9DRub;nR1q#hyjN|Kge=`>8{$X^c_`?Vt_lMDD;16Tj&L2j3hrbzH zM?N$xVC|4M8P{bqpY)^EG57zu{c^h~YW#Jbk5=pe<8?DIYDJ@X$_Th3H^-%eHMc}1 zCE2ULCjs$)-`=8_daZ6YTo0{mE8N7>b(Mb$_*FyB&&$Mb6&Z&RBj5Cc5-}!D`{yp` zt}^{~Dd_GT{q-^EE-U?Y2Iy`*{q+jyZaITi6Oe{(BQIIsB8rm*d|(p^NVpoZ1udzA z1%6~})Y4QLO>cIW4jH?jp3lcF8O`iB zyZk(_H<~dS-`^Lq(hj%uI^N)n7E)Sp_a1DyKWx%lASn<)Db52W`va&Sdy@MDM!XGf zm<-DJm=>4}PWYJanG7=dm?oGER{5CDnGDoqzv#ZSV?j-K3bP@R2l*<2fzFUDQ;IVo zu?P7&0UXk0N(m+;u^`_>fJ3%SDaC}O8su9CaLAV_Wtfmm`+P@3Kou$0i)Fa}@0@(! zQBeTFYOxF(lIj0}^WkIaRIYD!{nkFf+mdzS-+A@9L*3Ff<00RrT)(T;R|0>0i@9xq z5dc^@XYBI3JqSN;uIJq9_Io+!)bI3t>u*jvZnoF&_PI8DSOQ4tch6gdIF)vZ8C}J^ z;ObHKdWIP;G^F~S8u$Bk%Whdh-h`Ley5js;Ns~I z!+93y5U?RA5Y|29eaE`p zteHJAtaelhXO_+5Xt{Sls#%6Q^JC_N(y#(^>*gl_tFQsId-z~D!jXBmdnm`A`?L_;{)2+|#1zHGF znx&_2%3|@zl)NsN@5k6J;u5UKSNl!AZpoeEecqOV+qJX~e*ecLZOZJo_eJ$)y<*z# zUqd!Ie!jV>#C#u?vOG7IZpCRIx;}439Uj+dX$8@o)uY{=-A-fl9u+;P8q%3j)M;{} z)>!$d!Z66nK!#uHhtGl_WI#dW0V9Q8gc6m^Pj|{Nj)mxvzy&eGOhUw{e8gCRk>Mq} zsslmnL20BZ(jgf@B7rikFpFfs!B?b>wZPMW1O=J;oiDCopaRIJZa~YU_R4Y=CI2p- z1l^b*?iArAxUK5wrx*kQgdv5g%s`x2zo(FCF=N?4ZAlKF2)hZn4+*A+d5B3~1I{9) z$h@xAp4s_rJz8Nu1H5K1-qag!#0s9NC|G#ics0) zR0#{oLpu->ED>xVSz4+DTF`u(EE|mk7HNFOtgc`o{=pOJ_aJ}BC`s$ev^ETau}MND z#K4u1u%c+E5p&BRg@+Ju9EB>tl?f9r!&u@E#)Ji{aeG72cqM&lwvsri6_yX{)nF*n zVZnmH6a|6o5x2sWl(g(b>Jc9y{#LDmftAd@il)pkqrjnv8@GA)*0%yx4@30t6&Y4*D>dNi9Hn4N13EDf4(Z5N|j| zYs?N)%DcP=Jk@OdWHltf=9Fn2@AYz6mA+H^^xed4UlNBgxh5N;(ZUrV3=Ys36hM4Q zIL#5N`f-jysufgJYRpPExd9-0inKx860rURTvBn!wlO2(QY_k0NMeKA!T5=j zLG+W1QcVGaIDiEXawfJKCd=oHM8`tHpn|SeOu$K0`bGr+h=F9(vJ5hVmnTaAE4eYC zehVZbp$xAOB|!1`-E9eUE?zusb(+j{<}92vES8eNoD_uCh=+Eo0hj?C85ymrOsfk{ z4D2K|(IhjMNCoLjc7te zViEjxJia77J8W8L%HWWVs|lr&kqmEvu-kJJS2vYVZQVffSe}fTiWWo`UxIW7bC}Gc zl^Mh*qP?vgSYm~vIjfocKBG}n3eZ`JVS^EI7=(&xEL#>1Wdap!J@9}s7$6NOWtr9x zAOevPydcCr&C`@5CG&6=kZ5AfU0EAcKidgF(MMiD}hBT2RFHEUVyJh*{szX)Ojwk!?=(x_#mNl0=443x02 zISOuR_?|ll_p(oP1l*|6Xkp{36T~7&u(XgFq!7in4c;nISaV_|C$dDTDf2!`57*u{ zlISr1k2BStJwByNu)niy=c5Mm z5WimNKmogDfx>4-Q>W25k1{7JC1&4Kq$BC5V6zrr-NnaBbDRb=Axl`7DQg*_LUB_j zG+a?zCKe=K6PVnIuzb(5pBYq*2TlcuMy899&;!zD^BsOzsWqP1gDlO_1KH-jr>4hf zlw8y{TRzYQXcD?oWMTvsb;Y!RI48$uvDX%XZWyp$4H3d(S9%aPN&)bRK}?y!3e0fw zhy^R62CnDLq6JBcg>nXLors!|9TtAoC0DY`jM6$(IH7S%%SKFsh;nz}P1_=%88h!ECMxJz zLJJ2*r)C>|&j<*?sMw823W+MvRLBB#|xX7`q)sds=7Dl!4(36tnE?qTBf{*pBTHLc+4bW$MA zKw?Uo&O&oQmU2y8f@UPqf4gMSM66M=x*3RnWZ>EdBa1zu?f0kv?()*vZ5hXN@wG7HM#&Ho<0wB*5N> z;g4b{Yi2mwC0ccwFijNSjEi~8ObSRVxg(*VgR#F>^}5kh0kyX3RfJyCr6dEZPD={* z9Fa(?B#Z;OlR4rBmC6x16UC0uz*P7yO5sFuP>-;P)Hr(RljYe$p_B)c;*yWziPQ{I z6>4~JXhKoPI4tJl>OrmTSIi$6g~m>Dj|fr64Pupc-iK_`WS}YGWp@L$>rRelO08;W zrj1w|{W$BmQ_>h?kfb%8HS-uiuvyR~mC%-HRY4{vXJY2ANvvPO#%=(4pt#Lrh_@3~ zXeQ1}0c;5J8Dhf*qyj|-Buy0)g_dMjxqe#r0DBPwP2F#DUpv4^zc@%*npZYe1f!?2 zed23r4EV_bHd188NGb(wBHO^xQo%-kTGxzF!9)#L%?%3}FTF}muT7&IGl(Z9+1fU< z*s(@k>}DXL9)`kZSe}h4W6cm=$oQ!A71R-##%{=DqFCQfCHT5j7II=M;EK06cn0<) zLxq%M?jl}R5ls5P)`HYyw-h8~T)wE)Kn?Zn3rm6!r7YbDZ11LIKU+^@z#3Arp|T_{ zb0FXXaHptA6ojX0Alrw{${QDw81gT}a87*Uqj_HA5Up-?;3M+)LY4%4T_hoqnt1ci^7 zc#C1&+Do?foBeL+Jf%9-e)J(`BrABGSEu3PN zG~pL5OOuLvRc#G8$1)027mB2YH&;wTMx<8Km8GCahDti;`{1cVqA^*C8&DR0BtaRK{!p@}ElqbC(c?ZI!FIr+29m5MmB>wr zHi4Wi^1b%GK1(9WdgHKJNF)FcZ)X%Ar^4dh%lK)+yqGU5XC%ZkBVzsNQ-J%Y0+&UU?mx13Y=G zlotr`@p{_&^pnf?NDyO*(0u1vM5}d-?d9s!%QXrF3}}|W;PgqB2XAMlI_*;K?d6FC z0)YF&tJXcwdnQX-WnK83GL9InsFyB$(8GA&0RPEiBccazG(jdaiBb{&_uDL zg=(vVN-rmkacasxy{qF_+ph!Jr-OT1VxY>`er0s#hc^|2La6B5?qrhy#WDfD7%XjG znQt@g1QfPo;n!8+83%|Wk*PM0?`cZ4MCHF&C$)$~BGqQA!jDrC=h_L1R{3JSeKr|y zCsfPu#VG&Zu)KzJG#uR z?bNU`3I?Nrb-Zc#8BY1Zyi{ZOoemv#B{#o*J7>)DGVQ@1_~WF-)?yYI2z!n}4)C>Y z>`v^?Ki};B+y1M-zY6@Tz`qLotH8es{Hwsf3jC|UzY6@Tz`qLotHA%S703lgVU#Zb z0zv|g2M^)~>e=4I1P<(jmA*{{0tO0f4r~r615*(VNEebdR+crERW#O65fWC^0@7eI z)?haN|BC(t6#0KaY5ddi5AZL>|3v?*l!)=4avDNf|9eGcS=`?*B{^Ur1>k^KOkr_g zU_=pdP%vOnU?3$KU|?)O92i;YGcYiUET9ivP8k>&O%4#lQ~_8RDgX$PxEwGrj<^Ug zFs?YD15X&xK`1E)4gv%(Dg$5w1_lxq0)+t+Q4#tK1`GlUDl7~J0Srt73`{Po2n>v> z^cxDR2*`p{k_6z9fPs`n03ie~=xxB{z@Y!;0Pt)BruW}2K+^wq0h9Z07ohQfy8uQ0 z+XbuwI0!W8Hb4|W3#i2W-`&Qqpld)NKrAeO78V^17!(>74gnDv1r-e)0}~qu7mtwW z1MosL5+@qcHoejaoR%P22s0t(WnQ)d1_xp#_~+N_V4&?e?Gq}tP0B@X4f8i~y@YdL zE%kNl-_Q9+zH)Pty5az-1|01X01m>`F&h{#7;vD`7xsU$fj|dRx~=+|kOob83Otga z*>Tu1aG$}*4S14;!E9pvq@218Gu|90-EBPCXj^aDT$Q5< zUP9mq93(8=LA!a3vnHIie0g?QZkN)u4jy)cGF6{t7g$2!dN1ng$AEh)tiQH5p%3g|KNfvzDht@c*JSnFwL|fj{$I>oNb)H2?V?3~Qf zRfxZ>S*BT0o~!vYQA9jDJP?o%9%Usk7-;x>&)(7hsC}L@;p&s zQiHB}ux;i2Wb0tF?Ws1V*X3C)ViTv<~+wJXgtlO$SjgOLhEQO0)5w{F# zF1hS1du-iT+Mmxnb7+|RZnZaEdT+HZp4+auZoJ>pjkW3!V-V9(8yPx%qa%&6tsgg) zO+_9I(?I!=NTVAeS=7fMX32_P2P6?~8nKT*pGreNGt>uZVHZ;=N_QMZC)3T8Dtat4 zTUsJrnxG@zq{xIj$P%=SQV8zB2GnZugO7(6riUb`A^p{#zHq#n_E3AWhst-*-K z%Jj_?V-d5KKi)mR3#;`dHWzE-c*7L9Z~$f{8ZCrj_O3kGIoFXugpM}PI6g_9BwZNM z7zZ*EYFTUBZNL$;59aL3lA7D3Lw`QD_3?n>r^_(2J$V2;r$d8DgkDtS8D2|_an#D% zw+tj5rokWZ99bI!#F2#R3^sU!FLijYGQJx^c#+*8dQdKT` z;^U&CWZ%?O)Qp*R(7DiS@jOG<`NWRf%1%m4V3~*8CO(M@C~gg73E8aE5C9n&Zh9Nj z3F7Bqk}G>x6%8<~7(U(YKemSp5ES*vWm{)}yM$v4+5DiA$kSOg5qfaU)7d1pkt}1Y zu@u$eBq;@a>F7;(+$MhKMMteE40Mjsx=!#D-D$1E zW$nk4Db0b?@2#9_z*jDmweJI^Jy@|+Ff1ii7QmPnMWw3(*!017V`do>W*MJ7D+A_K zM>5rNdEy_1l|8PQ{~WeHqjCnG<^c@wEa)mI*akYP#DW45t;d(XeNU$0pP^sP#8 zSugS)8Qq*fz6%VQ$UX~tEm(}H341wGX|EcIbke@&o|%Y~;f3`$U#2CqVq5$#R6G-K z6zkgIw5W)R^9*iuM{f1$4JWW#!}|5o2y#I>>YEq*Wy!A6i2V|*HIDqlz6LCg{9XNQ zndrh{9vrqoQDn-ebV|0_7ad;=-&SOs+P|{KCCtp~WugsJ>E2B+#!P99pw&zayIOko z`ZQu@XZ$5j&*8g{5|`=C$liP&&kwXLsc(25CMjka6SQqi>c>NC(%Cz^BRfg){L!Tn5Mpl*$+pn)%4u3U$5cO%kP{`9sSFPz_2t zh*uxZ$WRN;tINi^mbEnD_F#GqLdLaMWnbcw)gITUXBi2$Y4;PlBZa3XW&4I*bNLC5 z*JKP6$B({^C7_?$QESfhx?A_UTX+wQ^76{HB!^mNi8QwFySGJ?aV%;#kt$103%T#} zi$$#%BbR=3cdVo&$DCAY6D(*51b6 z_cbl4%b&|=3MP$wZb(LCQU#|b(KVF{3uFE0C>438b{TV!=m*a%3#?aXyuxd3Q=JWM zq(BK(cbp;-Ra|XSorP>Sx`EnAJ!p)aXWS=zWFHjV zM?HNsvNk)wYUcNqqAB%L)`Sy7gsm*)NS==PqJ=RXWlcturferu&~n~8wxNx6T?|pv z{emC`vD!FX;uy^q|2Lb6eM}X~YfR~g?D%q(bRB+$XT~|EZyrZ`KtSw#5kbIU&}=OK zb8%;7Tbf~KW@2ArW@EZqU~b^}%dcS*+QH4#?D++k4aB({iNylA6FXNnY6S*^jf^Pa z{GarcOzo!K4ww*cQ7trgh-uX2Tf%YA2u1_ix69kIeJ&Iq)quoq0RgbUSrp@vt6YG| zWP&fuXP<6Squya#Sz4!1@9Q_vyDpjyRhvau2AJTRtx#p_QLCPpk^Le&s; zLhH@+7|XyJQq0ObmXYB)ExfcD8OeZk-YhK9hJPitIzykh0C(3TO%{&grGd<=Wl)H7 zff3KzLSn?8bqExGsLfstHe>R+c0o^NFg40V?|6+DRlPaOvR8;#&=x=~HEYthV4WHC z4tNOVB>hT+vLVj)V!{z*)Y?q8zpIFfsy%v&h1i_A2H+Na-6Gx>M41b4d>et!F7@i)}Xl&KaJ@s2ktvm{rT}6 zaj9HKM!vAqW}k~OnG3Oajp)fGla@lU_dAh9A^6tohw>3_Xorhm2oDK$mMACmiiy*~ z3w0$txqW0E4t1(oKsh8K`p=`E;igFL@6yr<>bM1Ud18C&8wolLoeIt?8+RTPCZqkrJmx@AddF!0YSVWszUx7SggtAG zNkURr=qK#ua+gYgV^=z`3$-7sQ{T$Rv1W&UUBe~Nx0EQA zFLVH1<8kpDPejwlR5P5RO2iJ^2lBpxw?|y^OtB|AGvOcof0OlKt3(wbVWlJp*-_a@23Xr%`XbG*IJZA&P*CWUyIri&| zEXeMmK)t)$FD`lLGuCvVn4IzBDB^^xh0&x}NcLn@`7+fX%6`9d30iNC=dRL?)*w5h z*B2a1IcMKk=Y)1WBvYUCCL%3U5)O^owRIjvS1F!jWq|Djo^z@WA zoq3$m^v^L`h&fzCJB3fiQ^*6~TVb6>%eNKi)bJ|T6@Aft^wFR&LfAih9y{2nP=#oj z9m-B>>ICGMTlyG%D9xLWm`Od-U11Y8N~6OHrLJ(BC>mvbJu>-<*%^qQ=%YQ7%t)KI zqNF^(pe)ax6Sg;gJ{X88OoyNr+Y1jYn)PTy-g;P|Ba#rjQjo`v=b=?0W24P5k>h3k&0?T9^qKsm(e;lun8&bw`<_DG)RS;L( z_IoL#8gZ=YPLy@h2X*r91Ws9{Zf@PLP?;?tTMOT@pW91iR5wz?+E^V(4wiwwL6j;Q zmg86=ZS`R@cdnx)XNU=Df^DRxTrZ78jd{q#aTy{Z?MjqAx!-Y!7A6QQB&wNR_!YB4 z@Q(VWLsnBkIK*En1n=?dYRXLFK7aNXIScF9-3KW;6Jk}h{QjzDA;KhFQYcCNy^QT* zN^@4_rYk-R#!KjZauE4>cwR^WT&W?g9M?;YI1W6~+|^<^r)M8X1fGVyaP}~+ z)WVd~aitBW6X=y$1KE0PuueozBu`wL-D37xoDnp`nf(0zz{bH)4?6d?m@(U^RdJqE zMXnVY9c63kE)*2Xe0|90Jl@#yhwLrVnj>ZZ35S0<4Z`(Hm|P86=NZjLXbN;!eJ7?Q z&y45Po7u|^n{@F^hdfxT4u+uNpskpaP0Snt@B{1zapl%_cX$s*omA+B5;-grnm932 z@2;_I>>*0{CqBEUjhsRIaG;cFE?O?^oIG8N1(F5tH!$pdq3N*tFEq^wcN#HKj{b<^ zL4y;VGE`D_j=Vqb49@dV&!kv(&rvQ&8zsNT?Sm_qwS3AxC%_#vU+bkK;juoM*or>S z8EqL)Eu^fn--_fFNz_~=RTfc$b-=9*@_Js#@z;U->Dr8^J9#KiLbTNW_>!acj@mB& zQjRQXoNpoOOB#r&94W5z46p4Ff2%sOcoGm|h&>(pv$!T!aZ&*RJ*hr} zf`P&H_|O9$vjUO%00Hf71Mbv-ff<0opcC60^0&T0$u}hcmNL}f%f}?fUs|$klq$bf%roQK%mANsO>NI z>tE0KkKcd3l_S`d9ilV*WFhfO%$!aBTK4^pEYP?XRTnngATisWwQe0^>3{W0P9KI5S6maBT3D#OIKEHlk`k34j(!Dlm!U-&38 zBkp0UFVS2)PoAgk)=gXC&`cs~6+C`4x-vt(5-&$)+np)r5)g9fF)~!u);{U?*t~tzL66HV8 zTDRzwrvQhT_gqANe5o48+1?J;FLeA;+-{Ccs;JL7JYnm$gYD~~ddTQ?qkLB-VS?>c;x@m87y9N0UcnO!X5 zu}o|zvd&?#g&!-0#$M&pOYFX~<+G*Ach#V(a%2IoiZTNDzZaI)&E+OjMlsQ*2w0j& zqzh@~ypXw>@Cj;)eN|mBLUX7XD{N zU3pIy&~e!`Y=M@K3Mz?T+x?qnwqjdp=8`@OzEM~u`*3Jo6hNSzon=HoW2#8g2MC0{z`bQ~EZ9Vkf2SWh0^uzHW$b5Wu zO{=Z?!rZcf(IP2j0*!%`egE)e2FGD*GbX7sV_#up=I(8yWa!S_i=aNPCL6af4g{3C zHfJYjk!a#3Fp{4a1Y==_mPZ6%c_HC7sT|w^Q78=z4S{tp^(CKWSnBHTH4ERa|W%aGf4)46%lT#AHi8uJk;Hvem8LOx1 zX%M#|`^SC>ax7Vgv(>y6gbGfUK!0lROrZBsiJ?2vW1+v`0*gK@kTA8gwfX znkRxO8bVAAr3#X)dJzS`DH0wH8UZve2q_dC6C4B<1QHk>qO<{;^fntX5;PqG{x-Cr z6bKfE0a!LUJQP-wHfb2asHi7&FpNIINa(AEHR4MdMpNGOotxruZvz?I{-&`m!Q9LHJD6qRxbJ29wB`;bT0>1& z#fhZqw4OqG7~_bk&jc?XmuM>$t~;z+Rr7FJ!GVtpJK7U-e4~jBD!K6mdRI5x7diH( zAUi)g8P68G(Jr21bQ-!EiNgnTz9x6T_vy*L$+h;gtuAj^%5rzuMaq{S)L59cx=D~s zw9k-`nO|66*A90rpS@jFB5IcECzYno*HmCmRnXLw%;K_INBzpe%ItI6j&z4>K}WKj z_MZ#Dr!jOF@e!R73}}Oqn%ROalBUZwH;BaKaJc%s8sdxrYI+*@I3V?{#q}d2818d~ zN5GC8oT_I}bGfod(JLn~ZhB7_2FUS*$X>;IQu%#5S`;$gez1)%q18$Crw#c)UH)=; z16<#s?TF*Ol&BxYlj&SZzQmt^{A%?Tv%fCTi3G-tNxyE0iB}l+wDgf8oO&5V$_#q- zl=6v9zYa^~IUXM)M}5IR&9vk-Krj0#E4X65|DY*`Kr*D%6jFNJ1h~02!>vIs5!~$_ z{~T7xz>W&)GXIQ;c=ezesyRkdHK=X8_MLAMyrjugh&RwO^!CP(vZMWd(it~p*~EXO z3{9G4%xnyX&qUE;RkcB#MnN^g@w~bId^Q+Sn`0270;BFb#Wwz{^YKsuc+Q9AaEX`b z+7f>eF6R$)#gTP=gCQp;C#j??CxhhebK@ozXjQL)pRp;Z)Tuuwi)uEkaTJyjy%@C1 zphHVrrHYL`_o&Sts|z$>T)KfEY>3Spsb063LCZE#8pbyPf1a{rX(EtD4{7@8!_=h~ zdCGpIMz24m5$W{B&Gc(!=0t97b~R2vdvQk_{+3jJ1`;33S1*hSrOS)DnOqb?I3e&$ z>YF^TN4OPCy;`}k6wKp~Lb?|&{mB(q>!e4QzGeS@g(rz&M)em|(Cn@T(0zg!4JQQ<`mA6?@$V$7fYS^MyXnZa>ko!<4Y4sU#cyk@dS!Xb6L0!(C;(WEMuB zW7vRV#C4QzD0489n!OB>-o_F9?ldcb8fhW zWkr`=Q!gAnZ?40b|bv z8|w*EFP2GkODi~1rBzyr@@cZ%fl7ECbnQl0bl;LCa(J)hjVQ*$wIP#a7cq0C0OV@g z-hty@oT?crG}0$vA5~PmAjtZh@yk;$4E^hyhU>sr=^2UDh#6+ReDD=c$B;!6OLoO< z*t_%$hvth+by$}DzMQV5Km@bO2XUZu#c4B)W|1qoaOY0$66v&ymCyiH^^x-Z^vOZn zfS|OCijRN+sKa{A8`YNT$pgv$imI>P=k z&x`ve%);}&g#1Cq2)Sb^!g={6N`RD zxs-Zs4TsTuMr;SE`0dty+x0&La0@SP1w>rH4=ene^+~lGQtOW`*JbL!s^a&MTS0n} zy9R8CkcjRaL2vP06C{j+^+ca`rrzqvV;MyGoGYY7Kaqz(Ufo{G}O)Tv0)v| z+H94=#Q?wX@pm$>*i-_Hjuf8>bu`{3^t#)HI2;y_jFYA z3b1i7mT?lOlB(Ms{=dxH10$}+8F!}9d;KGH3po4maBw1U;suJsHEkZ>bG1p?QMIn?qou(kMZ-jEg^f~;9p^1#D zm2Tblw3e%J-tgC(nUSG}sVevDByq!o)L0jBglXcwzL`$QH-w{1ZazTYmepa3x$@c2 zM-7;|{6QZ}-1^C?=O(J2hf0%fLyL}@mZUFgfWKprMo%UedIO)sG_pBD`ZtlQGLwM$2K}?gupA0+to$8MQ)QE`JRfA^l zW;fhQ?t|%j(GWzO4)hN7XglV7jDg$tl{n z_Xy2BJYV_J1%bsH8;Ta`xm&rlfvqNz&J8{CF6r_&C%MUiW{fyXdQo$17orI*ss$ zYbh_p?rEWbV$ zZzx33&)F;_Z*!@ynkt{*d7 zS1Zz^GUDw0^vZ+>Gix}9zC*D$_j*en3!yOZz%kTsjxZL&7@ieE*>3LTsZ?94G`b(5 zK)$`A@I^IMLe6a}m5o^;W4!5(Ue9ERu2HyKO14f2n64UJy{<%F-TB8zb`zFD@+C*& zrf$hG|Dts`l6|5_ePB^7sZb^Sw*uiFkQexJsKU6QG?aj*#GHCxB)G3#m57!tw=;H% z>dWw{A{_OkY=^KPx#Q)G934e$N#Q<2A6m4o5~LlrHz%d$5M#r5n;{}DAu6aQ1Af{% zCE0JO8w?XA_~ro@cVmjvsiX_pLAlX(osaPfSxb7j$_*!qF_uvL)@>$lT4aV8KT<0D zjjh!-9C7)q%@)OiD*?Gy{Zl-QYD9E`1(k4N(lX}*8?6F+l<5osrX8jyxNsLXv9VkF z4>@^F&H*u}W~19<8BBD2BjV=rf}x9u(x+(2H%?&EaIIv^6{uuQ^AQakFiX(gn-n}3 zUynvG#M6YYtll&4910e6K>F&w8lfk}5nozWA!&*Q6qTMTlcZR?p(pDF-Bfpmj^*6O z3^Pq3U8v#*igHW(&%B1a+?Ire)=45k!e{&lD_kd~lVsRiMOfUuWD;qqO+1mQ``dg{ zCvS|+5$hj>zhLpDxKdzvSKn@PDm`PKg1lIa-9QX*zMo7pVd&8sEb zNjkbt1{*qAG-Wv4OwS&BY-lNLC%jI>zQv4B$)vau?Y$Pymh8{BkJ*ejjz4J_^^< zIHki?Q*+M+LKJX|ufJzL!h%n5(_{iYbTK+4izQd<6kS*d?GKeN+Mn)iwGOx%ab~Tg zx*sNuL3^kBeTyGcgkrQl!?uCfjZogy|Lytb7Ep_`L%AeutQLrMP^uG<>3Tv=$U2ej z>ifzAbB_JdY7^>cSt1}%Tcot8f%*WPku0FpA4yJ~@P9+5y{XNnegDN;fPD&l7nuMI zKF3l72A>*NVXd=wN{$D<&c#@r08m~qla$?~aUR|dPH3LJ>-fk=h;_H#=8fWGbw5${0V zQhX>CIfk89#wl_Zc|dtqt-ClwVzYAHR`Umo)xnZB*w%wri`63~q{X>KVobxgw@fWM z*;nlr8`+4vcL}kBSBi4KfkJHcRX76N8UeWQk>O|nJQwa*9?d7(-HxIsHtn5(Pb(J} zE)V{#UG}0KJ)^gUX3V55o0@;?Xy}jl)K1?puM3eV%O$9Rrq>MCU?(6Cli0}_1q+-Z zq_ezt?rfR=d+`z`|JmpNx)9tx4ex zfkYy;ORY$me@Utu(cND3M!tz9x;S19+1r$A+oqdf42$M7`G)3v3k@XC;ivmocSwT{;)|xao2oBX`hG2`lGvBgE7An8|tKjPIqk@9u-r*hb)3B^B z;CavRwLiSGIEQUe_0>XsF$@<=fwh9ezbQ{gQWphJ*;Ow_DlTq)Md#1BgKz%8~9n8M!u^XRI7#SZ#;3+RJU{6Tu6NCC# z(itxxCM+9+&B|V-+{tAl^qA{JcyE5Yy;>)Ew=+42E|c>^sWd}geL#w-`@NIsjErS= zZQr@c?eO_!iB@0t#JciP0}rl!mN= zVJ(^n27H~iggfkad%6g*%IH$SPnUKb*Xd-2l5Vu(ZB0!gBwMIqW=LxI+)^GxU6tsr zKxYw&(7~JRWx`#LpzF`=16v|9<`ZLvsxN0%_*N=QzFLT}WK>B?!N^aoPDFXpsW)*T zFi9@QWngABEz`VDUgJsva$T zdfc}hMxf2ZZv{2AVzRRUI0xL|=q`i}+O{0fWXBM(CAq$nt=e4wf8Uk@W^;2BXA5x0 zRR3f1Qvq=OW}C)UM=@&im~oesbzYqsu{=ssuMfU4O~a>WXZ=x5;%x-#aq#ziSNdy& zq4}W!^Mx(BH*rBMKKp{rEEFtC9p5R(ySZAW{2zP7@J8Y_Xv= zSQ}yD9wz!1SUR+N1M#az@0Zhw=tNv7rD?$2B=9ZXx4Et3$p>U?GIz);Ha4hX%lg8* zJSeP)>hf}dUz*RTrV}@!!5{s=cEUC#c+#pBoThfYK=+CmcJ_RAYfP+vD$=a=J69IV zoKGkL&@o0N{_vJKG_)#(26hHx)cq!<`--I({Owe7COWY4%`G&?sEcmR6VZg=xr3zp zZw|z#v3=M$s@%OruTxV-bQN=r0NfiZ8$#J@2wpqf;MX6v=%|kq8ue#2cnOd`u)IvB z5)_!0o#bRdPm|)^-J?TgSmhm$bs`L?-q*F5RQppxC318sQWCZCArM3X3klBJx?upV zQaV$i0ruS#`6@w}pgQVvMLS!()!zn)eE9`K9;Z8vtu8da9QGH#KWEftTa%CMgZnPO zC*dc!`VL#$k3Edc(Pln!S{F@fG9Y^E=Qw(1zWRn+>?r9p;_smBeH^(PKP^84&|`%G zWoE5{%vT9OsLA%OsJd~tgz+yR^nghh#En8#<0S`gUnB_Ahq#TLbug$zqGPj!`+@^% z0!G`W@G$j3v;$z`OEtI=SVrGz{7yk}XG@?@NKp8E*=E%m!M4eB893IrPAdgAS?~x0 zA(#IOXDZ?5Uh1JHXb&Y=DqPR7^j1}Lkn*Wk=5`>K#50n|^^MQXmGHxT-l&P@WsIwH zG|hST0zcMy)OF0Z8W0bTfh$T|#ui#byk;aQ?p`wJf}6~^@Seehihe5LsKWMQBztT0+!vC6%Q6AOIL>RFbR8FKKNK1PcGB{8Z*BTzvq4lIY;aBZHey8$z;qiO@$ZFy;6A(Gd2rbWzzL zV&aGyqb@X?X>aa-yAHIQ^Ep_{(g^Aubz5?1pqyf9K^c$k>^`31Eq@&?TmQ~U_U-Uq z;Rp0Fl*e~T+V>1Qlz8Nje?#WZ*V}e(zFc& z#%_SgW)ai-hinqqO5_*jq66{$0v=bjob?}vS*KuFec4FxSdWF*WZ-a(T5pD(@!J&6 zspJxY?r^fUAirQb#Rn}tg&_o4pLNceY;~=QU+Z?b2Ky*6$9DaA<(G%X_85HX?@-Mf zy@uDl*UG2Mt^$yc1+ORO?uiL>P-SKwXkj)qtO5I9xmjTn-IFsLA#50eWaZ{xlRCh_ zMd{w-%B$p3TAlo+WKMvPot*CpM>4>EbtPwxYAmE8|3v>w{j*BQ@1cliGt~zze8>f% zr<2@q%Z>fS*c94QMmR}a5)$Vk1O~dZ3)PK8XMlhJkN=6OO`IeWJe6UKSF}1de~z+P zgn54)VH{+Kn9c-5NMNGT+w`nZ7S=)jSJq;}sP3g$Ebf#_cxksm#J>Mp3l!shH8(=e z%qZ;jID8fGrU&wAvh{xOMcFvIM?R79GxQo?Ot5f8TUqI+QuVT*2P2Y`Q$vMxDKyxR zs8L~A{l;>5kB2v^WiZV>E9*TP@;1LI>rYrv6CwdYc3!EC6{s5tM?0)Wn zOwB^JyY@Xyw89xvV5vJ0QAm=Iie>j384;E|>ZL)z049cq6lp>)wzI%{+G-}6SqwsO z42FkXO;hF=CuRp)k_0LMC;=0v-{gyJxROWrvv&em7%_Sdrw{TW9iGq9uLYVS;#t0(0F-JyW{P)pLsu94=aDVhgsdfM@|zx zJ7xQ2{ZF>_u{|?6?J!BrGM$k)KJo!;0Ve~1XSloXM{PJC()qvt(F^=vT(Ey7Emuz= z;hO3^{E5+118~3Ge|d3r=FMZ^XsTO-6zRp7dCAJEkRsZ@V?sM-!)B5`{_CO5?16k? zZasvM{ENx`sx*riI6BHqT0IJf<0*o>|L*C zWQ9&vKU|Y4NG%a!N^6R9ID0`;tj$NN(%)zF50Bv-Qe0aua1K#~B*DAUXS_1Z_{+Lx zW3VqRskUYn<)(Es{ke^WTPP}_+X^KaG{5zXh8d9h;4e;D#tU;1Sw7X!(gKK9Hl56v~`ObrLl zll@H>ose;L6U#@WK8gjstyS-8DQOjZ^U}7hMYnkj<_e8p{bDgn`L37xCl}P~E1rGi zlz<&0F@GMPNKR23yaac#Ag$rw4~FRp-L9vn0=RBNWDW&0v5pJ zeH4piVI`eWk2-aXbruv32?xe3M(3>TdUkV^m%3jq)bcu*q)0tN&H1_lHJ0#FJK2Mi7j4+sPW z;0Z7T3s4Im4)+Wc6buIr0}BNS1_}=PJbi7Fpv7W7Qyuj-x|pZm#2ez#JMMpB{ku4w zu)XXHE6QGhEpxtpNU#fj@7w+XXq@AdR%t{MMKT>fUTR`Y+Wzh|C5*G2=q0WmdjYk&Qes$DKKp&Qvfg#z(da>y zYRj6RC{+*_;RTdaac0!Oo!ykj+#Q1msjgu&eo5cWut^6 z6s#G~QccNiSkQX5ENWF19@N-aN{^;9v&adr`bztme$#V{7+MZc;{evZ?C;8f0P4vC z3Ar=ITbqF)jw&m$QBkmRiP;$rzQ+*`~wbMyi3f*3PT;6U-YylE%QCy{Myh(!$~(AqDZKDTOdmtFze*KVK;y5%j^lCd zYZNGEKA3*ueppfyc3hPW7npDH#)wUifU3juOy|X!DfEjLQ(iSQ(I(;q39s#>hUeiJ zq^SLw3bsXwRdphqhrlEmFWLm8KZ^5lm5Tyg)Dv7;orQvsQ84z$;dJNhp%v%yfD9C% zLF>!jA>p^Kl)|%5$i;msdzpF$#jobIb`-#TwW1*OJ^MM~p5#(V|so3)jqmUc1u#m5;2*Gy|2%KOsQri&CV73qT4na2gw{r4CFmn|^O0gTmO**$)KD2Oq%qa0U zcKFojUID`{5?O+{k?YXS1$ycrDQa-e$M&stD?|)V!Q24c(vlVkJRl#a=yNm94mBYL zF8!imgNdf*>3Gljj~p5?__(uK;p?Oiidxj_`?bjL6CtbXC%$WS1Ac#gUjjS4sX*oX z@4tnh?DA`VS458`_k6TT+S(f%+Xy}+Gh^RZRQ!mvTHtfKlFz`hti3Ak5#kq@#0(+4 zUluH+UuU_e+1|K(j&OIlF%3(~{mr$FIDThz-f{jzLld#R{=hf!u52|Z~kgGcABtx(f zXSbOlquWtNo!)xqd>uEV8=~nM{{t7_k>RyNhR$tpDZ@#C`RnoAgb^*c=uf~PoNj;!=f!-opLYhN3Mcmr)+VjU@`q;!0jqX~ z^j#9$4ohr=@JB$j@z$8lRwQ40xe9?;|M5)X$9+|FXP4_Y;h9xw2vdrPxIc1*HGxqO z1Ie4$pX7>PIa*+dYi zwz3a*f4U4)LQ(PkoUqQ@^$O04<^ARqSVb|K*!SsKs@~MFUpVg;?CQO?4@iQBwslcY0Xri#yA^Fw=QFN-l)}ONlt-HWrvwUX0#Dx*v?sM5MM1fJ!$CJ21UDS{F zP%cCW`>qHtgK=+DKdw~)O-%lW=Mwv7c<}fsEov3tbaRflwx;8Zciug88Bbf%#UH}C z|E^S&^5aWs{w}r4r7mA{s(R5dIMZI7R=n&$}h#e$P#un;5oC-=+^uKa&9$)8(vZ+E^c~8`6J2oWYn)t^*yvOt;W%YG;wr50v-YciN zzJ)<4+!Xu;cK#V8;x5;B2QA&agdK=R2Iq2g)VU3_5ElW_l)Ec!slPI0S2U;ocf4SG z=%+c%2ETC)>I>h?-TavKvzd?VD245QRH&KfG&rW=1M4>W6t7$_yz_8Ll_) zNTmWiVEh$+IyuhLYb7pq@^Ltn#jCk4^|Sh?!et&XPvc- z%t9Wfxq|XMvpsX*!YCZ)B6bV@A2@Su5chFH6B}%s(*J|Wq|gNE_=vzLWqJQlKYA1A zdQFeO2Mjbm9E5&GFxhYWr7H)PoSLx+*@yW zT$I&f6NE9oUQr;$S0(pThcFc1k6l;(P{jN8b z2(hu^y)ZG$T+D|5TTYoNptXL?cX+eW7lg>N;}fhXk`LrWjcAM^T9F5Kb`UEK8pc&ArEt}VOqvyI5Rv)_ZM9@h5Numqye@K7|+)FNd|*#8LeeibIb>ezTQ^JHNM~mAcxHmqgA#ziHK`#qwqIx>mnptve?Tk}|d*bowkOsfkcc zS3+|;1V|D3k$2LbyC+#(!j~?)1 zc(^B~^O|c!(#5*O2p1~mt?tO&=Vz0ioobf>e-J6Ev?Rsb$UeC5ed6uQP^=_aWj!Hc zcWv%3&5E+-NQo?%oO42AXXitoN4qrK1#u&_k`!m57Hfz~EJ-00m;@rd5Me<3+TpFd zu$2WE@2Mz;uzX7AXn1w9D5{rLrrCsx3`)$da_$~%Fz7Jd;W>88MOg*9ZDk_H{dVl^ znr==nWF&e@t7Nly(7(sZs6yN6gDholt&O4?nCk{A%z`(3lWN1L3Pv%KqlaZJqbh8O zHn$PZ|0BFw8vdko9>23hQpzKf=UUWUy0ovWu(j&%P4Au`ee{+~lTgeZ(O2LR)7%`) zAs!c9+F~&(SF!836?}gz07rKHRNYQ=GhU<6ywNs#15>QyXo2FstG6nACo|oa(`&Ue z(y2x)YO>=?I zYKHi1=8c32b!}sn7lUwJA21d}2n`Jq1&{?011|ys2MGfZFbqBgV-gIPsA1tYO~YCO zr<}kG4ZH&bFbn}4nLVK}`ykUP;M&(*oV2a%*_1AmLfl&1EUwhfSy85ra@lLHq<9Pn z=|B8ULwHqKJ`qz4)D4#~c95R4mqvBc2363gtG`Ci)Gm<;YO*$=gyUXyGi>12$g|6t z<5wa9Y{f6$O!K8(wf|Xy07xpU1<&4J>9aK0%^%h#AtTIX#(>Dvlf# zAe39r3M#RgF?omgfxWz_PX{3(WmmRl!S>3cmFL3*?Sn^yoY~!(KeHNSBMK7n@wnI<09g5Z%6=@* zzJ|y#>^eG)3RP&b7npXA#fI7ZmTuAD!(`t%ZKcoO$Bps_n!bA{-7@y?4KT9bVT&3> z08=^bHX_Xgg)DB;ONN7kid7?uhn4rYqAE$$C2gT6zmaOVjtn$-Zk(a291ZT;5e%c_ zHxUp}cM>nR)iL16naNqi;MWLjecAVIZFqLEasAE``tK2!O=;e-ToSj-{F-vQmb%FS zC2{aYdj|UC7^21{XsI)yd}E58=kVQpX&Bb;7ZRdnL@^VpIFN(GIs_%d@_!8wStRdX z;r+osT

BJm;~{gqdSAJ!v})ElnAZTNq}LoEzds1UgaW6fl0SI4#AGR_j$)_ zh}(CLVn}yjbt#lnRvnM@Un_L_Xk1;0%gh()8Cx6E9ht`TM07);ljG)I39JLZ8lEDC z=nW9w(t!cQ`EKh`m9{p#$dYEwns|F?qt5N2r-G{qgx98=6fjM2+F&Lz1Sg#bpOUq zhlwwP4bs?&xLT1BM0OU7{5lo>d<)+{vWU?Mb~&D39)i@~h?fG|YAR-Gsco69Ap~Fn zT`;GY(S~S`@fngN#0Vz6JJkj~Ce zH5GZr^-OwtEfq_a4H)*Ia9X?kq>}S3?1L;Kl`}nG^3^=AQ|N{1H)hrPy`3@({eUYr zJXk(`$Em6?@H!%9!bj;jWs)cOzD>z!5pP;G?XN}QW%!i|X>sxCzhJp6euCr}bjRB* zXqD2#QB~Kw&cMBfUh!KX=E9?)ps-xTcZwPrPChaO%~VcjG|Z)~1^wbe55jMaIhX@+ zoTFzJx3Gh~j2U-x;LGTgg9#-$)&!-)@Mpbe=fRcL@EZTV;^Jg+aY*UkI7snDrHJk~wzLQ0S$rAz=%3VlezPFAdj1 zx>EW+fK=N%^ftdGXXug(Lg1-->J$wkYgsXEfkqvQT<4k@@amjEAxWH>=8&s#o73jc z7ZvOEL#ngO+rd6=w2$O>dluNRql;#=wzx!ka&mm6UYz6+?7>dNLB+OC#K!;~ecGZM zTl@wFWX}^y8brdE9HE@_KN#s~x4+F3l%6ijCV5j3Sg)Ka?yTdcMVfxN>Cx ze)sAx#2BT<7}%QCuP8vviZ_Q7gQH#_2M69fgGTIySKo;00=7?mKFJA8H?*n~AfCVC zm2CWoLvmh6nm zb__hM%y?Urhcgq+u7CC`vDmlb?=qOiNw+v@a2)*N(rD1jxR{2I9E~KamXlqxJL#rr z!`GJ6E~;g)T3lo_F}MHfW8sYJjn;+DV;<2iC44&9l3<6quSzp~6w(u-U?5(7F!GtF3AzTqyPa|>#C^y&c zX2VKA2BKis^F(_i7BZk^7y)Hb0x+!34;DI0hyWo60uTWZ1~w2$QwxM;NiG8)G6ho* z9~Q6@AqP=1PzvDa4=e~JfDjN@8h8+87JKbB5-8*kCgqB!O}nXlbtsm~!BwF$ZnPZ} zSdw}c-FUOrV6?hAk|r!1M5qiGRi-;e8E6}7Wfb)W(73&P`xB#6b1t1V7r!TE&|`Wq zVa;V9BfQik?ZSmqYslO>b0xMi_`B`lkQV+PBOkhPBD!6&xHrgWKg66hEJ z7q!TJz9OQ!CrN(@Q1yQbNBjTW1k>U-fy_f0$vL5Rb$CEmoozho+@e@o;DpPPIvt3> z^Pn34K7Zz#J3k{86S>n$$i12ZjCGUkES&86DiH-H8aeo=^NkPZ8+Am;z*C|TGZvpyz|4retmjN2!EPUWCdbo zq)-buuZo(1rlr{dIzVqHk*V-Lu(|nEzM7)8?KqXs_%DWGWy}9TYj*URE^(1*AN05q(gHp*73>D`Jf_ROuvT2>PGR({dqO_yli`1lk!VI-D;oG$DOQ}!> zni`bq8GKS`lyc3(bER;~+;9d{uKRjA0(Zu;?VZQ!C z8}hi?H?l|>(D!DKdCHfVFfDCXS9b1j_N2GbUF`P@zshci=jHFOv zWB2RV2(aXieH@Jz476nIzfC^b)NlsZ>G3ts0|hZMSu@7En0~Me8YUepu8xMKX$xZt zf3G4zlHrNeR=>Tt1;D4*t(TR-U)JaPWnga5q7xHqQO30^4r`;jzKSo>Pm@(v=J#O6 zFE?&rBB##KaT7kznzCbOa#p?wKp2DfV1WuN^i}$ z+ak|lHZ5K}VErqEFyGL?ZA`C;(EKkg1w(S>3`-Pdg^LeWA9)*er_Vc) zQ1Cggk=2S+$nz7v$#xo#`B{a;T=@nO62fvfu)$PJz=Rll9nML_r3Wj{LQrWGpej

x=$d+3 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 literal 0 HcmV?d00001 diff --git a/testdata/picard/sam/test_cram_file_header_only.cram b/testdata/picard/sam/test_cram_file_header_only.cram new file mode 100644 index 0000000000000000000000000000000000000000..606986d5f02a20fdd410d4223b384b2855de20c8 GIT binary patch literal 778 zcmZ<`a`a_p&}F~`+nHcuOiT=oCn6sfc`!0CH12IymG9<&NHOo7V4Hv2K%#}YWKq2< zS4oC=*Om5IVU2|2dNPcg9z}VCHwnd`YSEmenkju^{rd?eFE9ALttsD8{qFDX-MgA4EU z>^#t}ptde%hRdUmkM?rEy!ufqgW00tkk^9JC-hJEym2$@bBo=awYwwN ztz{A3d5O*LnE&_qccGtjPKSJ&A>`z?A+M=p;q?ffA4TWZox9+pI$u@7FO2_C3Zn?i z2IiE1DoRgkgzjZqe`2^8dx*g>+MIV^ui*ZxzPDzaP>tEjS|{~#l5{|3?w1V5PX{HH zYgkS$-Tj5_hv)L`Dt%UtN3J_Q{P>h#=0|+9MET?9-A)3^A71xM6!>W@G|~UJ&Eyr! z|Mvwq-Cq~hUv#^)=+MPq_ow}3(N_K8sLIU1(5Yw31&qChCk;afZo@HcU-Fwp?NU^ao0!c=Ocgc+20QAxCZU6uP literal 0 HcmV?d00001 diff --git a/testdata/picard/sam/test_cram_file_query_sorted.cram b/testdata/picard/sam/test_cram_file_query_sorted.cram new file mode 100644 index 0000000000000000000000000000000000000000..1f7655a4c5a0b12eea6c73149b01e9126e5190d8 GIT binary patch literal 38479 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%0D`YEId+e_3P*z}JGw83ydlUK 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 literal 0 HcmV?d00001 diff --git a/testdata/picard/sam/test_cram_file_with_crai.crai b/testdata/picard/sam/test_cram_file_with_crai.crai deleted file mode 100644 index 0822a2622283889dc7d0175ba355f3ab128dc14c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43 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 tnF$(=+#5tec*mnF`hxj