/** * Create either a SAM or a BAM writer based on examination of the outputFile extension. * * @param header entire header. Sort order is determined by the sortOrder property of this arg. * @param presorted presorted if true, SAMRecords must be added to the SAMFileWriter in order that agrees with header.sortOrder. * @param outputFile where to write the output. Must end with .sam or .bam. * @return SAM or BAM writer based on file extension of outputFile. */ public SAMFileWriter makeSAMOrBAMWriter(final SAMFileHeader header, final boolean presorted, final File outputFile) { return makeSAMOrBAMWriter(header, presorted, outputFile.toPath()); }
/** * Create either a SAM or a BAM writer based on examination of the outputFile extension. * * @param header entire header. Sort order is determined by the sortOrder property of this arg. * @param presorted presorted if true, SAMRecords must be added to the SAMFileWriter in order that agrees with header.sortOrder. * @param outputFile where to write the output. Must end with .sam or .bam. * @return SAM or BAM writer based on file extension of outputFile. */ public SAMFileWriter makeSAMOrBAMWriter(final SAMFileHeader header, final boolean presorted, final File outputFile) { return makeSAMOrBAMWriter(header, presorted, outputFile.toPath()); }
protected void createSamFileWriter(final SAMFileHeader header) { out = new SAMFileWriterFactory().makeSAMOrBAMWriter(header, header.getSortOrder() == SortOrder.queryname, OUTPUT); }
/** * * Create a SAM, BAM or CRAM writer based on examination of the outputPath extension. * * @param header header. Sort order is determined by the sortOrder property of this arg. * @param presorted if true, SAMRecords must be added to the SAMFileWriter in order that agrees with header.sortOrder. * @param outputPath where to write the output. Must end with .sam, .bam or .cram. * @param referenceFasta reference sequence file * @return SAMFileWriter appropriate for the file type specified in outputPath * */ public SAMFileWriter makeWriter(final SAMFileHeader header, final boolean presorted, final Path outputPath, final Path referenceFasta) { if (null != outputPath && outputPath.toString().endsWith(SamReader.Type.CRAM_TYPE.fileExtension())) { return makeCRAMWriter(header, presorted, outputPath, referenceFasta); } else { return makeSAMOrBAMWriter(header, presorted, outputPath); } }
protected void createSamFileWriter(final SAMFileHeader header) { out = new SAMFileWriterFactory().makeSAMOrBAMWriter(header, header.getSortOrder() == SortOrder.queryname, OUTPUT); }
public int writeToFile(File outFile, Iterator<PicardAlignment> alignments, boolean createIndex) { SAMFileWriterFactory factory = new SAMFileWriterFactory(); factory.setCreateIndex(createIndex); SAMFileWriter writer = factory.makeSAMOrBAMWriter(header, true, outFile); return writeAlignments(writer, alignments); }
private void addWriter(SAMReaderID id , String outName, SAMFileHeader.SortOrder order, boolean presorted, boolean indexOnTheFly, boolean generateMD5, SAMProgramRecord programRecord) { File f = new File(outName); SAMFileHeader header = setupWriter(toolkit.getSAMFileHeader(id), programRecord); SAMFileWriterFactory factory = new SAMFileWriterFactory(); factory.setCreateIndex(indexOnTheFly); factory.setCreateMd5File(generateMD5); SAMFileWriter sw = factory.makeSAMOrBAMWriter(header, presorted, f); writerMap.put(id,sw); }
private File createInputFile() { // Create the input file final File input = new File(outputDir, "input.sam"); final SAMFileWriter writer = new SAMFileWriterFactory().makeSAMOrBAMWriter(samRecordSetBuilder.getHeader(), true, input); samRecordSetBuilder.getRecords().forEach(writer::addAlignment); writer.close(); return input; }
@Test(expectedExceptions = IllegalArgumentException.class) public void testRecordsMismatchedHeader() throws Exception { final SAMRecordSetBuilder samRecordSetBuilder = getRecordSetBuilder(true, SAMFileHeader.SortOrder.queryname); // create a fake header to make sure the records cannot be written using an invalid // sequence dictionary and unresolvable references final SAMFileHeader fakeHeader = new SAMFileHeader(); fakeHeader.setSortOrder(SAMFileHeader.SortOrder.queryname); final File bamFile = File.createTempFile("test.", BamFileIoUtils.BAM_FILE_EXTENSION); bamFile.deleteOnExit(); try (final SAMFileWriter bamWriter = new SAMFileWriterFactory().makeSAMOrBAMWriter(fakeHeader, false, bamFile);) { for (SAMRecord rec : samRecordSetBuilder.getRecords()) { bamWriter.addAlignment(rec); } } }
@Override protected void setup(SAMFileHeader header, File samFile) { IOUtil.assertFileIsWritable(OUTPUT); IOUtil.assertFileIsReadable(REGION_BED); SAMSequenceDictionary dict = header.getSequenceDictionary(); if (dict == null) { throw new IllegalArgumentException("Missing input file sequence dictionary. Ensure the correct @SQ headers exist."); } LinearGenomicCoordinate lgc = new PaddedLinearGenomicCoordinate(dict, GenomicProcessingContext.LINEAR_COORDINATE_CHROMOSOME_BUFFER, true); tmpOut = gridss.Defaults.OUTPUT_TO_TEMP_FILE ? FileSystemContext.getWorkingFileFor(OUTPUT) : OUTPUT; IntervalBed bed; try { bed = new IntervalBed(dict, lgc, REGION_BED); } catch (IOException e) { throw new RuntimeIOException(e); } extractor = new FullReadExtractor(lgc, bed, EXTRACT_MATES, EXTRACT_SPLITS); writer = new SAMFileWriterFactory().makeSAMOrBAMWriter(header, true, tmpOut); }
/** * Simple implementation of a gather operations that uses SAMFileReaders and Writers in order to concatenate * multiple BAM files. */ private static void gatherNormally(final List<File> inputs, final File output, final boolean createIndex, final boolean createMd5, final File referenceFasta) { final SAMFileHeader header; { header = SamReaderFactory.makeDefault().referenceSequence(referenceFasta).getFileHeader(inputs.get(0)); } final SAMFileWriter out = new SAMFileWriterFactory().setCreateIndex(createIndex).setCreateMd5File(createMd5).makeSAMOrBAMWriter(header, true, output); for (final File f : inputs) { log.info("Gathering " + f.getAbsolutePath()); final SamReader in = SamReaderFactory.makeDefault().referenceSequence(referenceFasta).open(f); for (final SAMRecord rec : in) out.addAlignment(rec); CloserUtil.close(in); } out.close(); }
/** * Simple implementation of a gather operations that uses SAMFileReaders and Writers in order to concatenate * multiple BAM files. */ private static void gatherNormally(final List<File> inputs, final File output, final boolean createIndex, final boolean createMd5, final File referenceFasta) { final SAMFileHeader header; { header = SamReaderFactory.makeDefault().referenceSequence(referenceFasta).getFileHeader(inputs.get(0)); } final SAMFileWriter out = new SAMFileWriterFactory().setCreateIndex(createIndex).setCreateMd5File(createMd5).makeSAMOrBAMWriter(header, true, output); for (final File f : inputs) { log.info("Gathering " + f.getAbsolutePath()); final SamReader in = SamReaderFactory.makeDefault().referenceSequence(referenceFasta).open(f); for (final SAMRecord rec : in) out.addAlignment(rec); CloserUtil.close(in); } out.close(); }
protected int doWork() { IOUtil.assertFileIsReadable(INPUT); IOUtil.assertFileIsWritable(OUTPUT); final SamReader reader = SamReaderFactory.makeDefault().referenceSequence(REFERENCE_SEQUENCE).open(INPUT); if (reader.getFileHeader().getSortOrder() != SAMFileHeader.SortOrder.coordinate) { 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); writer.setProgressLogger( new ProgressLogger(log, (int) 1e7, "Wrote", "records")); final ReferenceSequenceFileWalker refSeqWalker = new ReferenceSequenceFileWalker(REFERENCE_SEQUENCE); StreamSupport.stream(reader.spliterator(), false) .peek(rec -> fixRecord(rec, refSeqWalker)) .forEach(writer::addAlignment); CloserUtil.close(reader); writer.close(); return 0; }
protected int doWork() { IOUtil.assertFileIsReadable(INPUT); IOUtil.assertFileIsWritable(OUTPUT); final SamReader reader = SamReaderFactory.makeDefault().referenceSequence(REFERENCE_SEQUENCE).open(INPUT); if (reader.getFileHeader().getSortOrder() != SAMFileHeader.SortOrder.coordinate) { 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); writer.setProgressLogger( new ProgressLogger(log, (int) 1e7, "Wrote", "records")); final ReferenceSequenceFileWalker refSeqWalker = new ReferenceSequenceFileWalker(REFERENCE_SEQUENCE); StreamSupport.stream(reader.spliterator(), false) .peek(rec -> fixRecord(rec, refSeqWalker)) .forEach(writer::addAlignment); CloserUtil.close(reader); writer.close(); return 0; }
@Test(expectedExceptions = IllegalArgumentException.class) public void testNullRecordsMismatchedHeader() throws Exception { final SAMRecordSetBuilder samRecordSetBuilder = getRecordSetBuilder(true, SAMFileHeader.SortOrder.queryname); for (final SAMRecord rec : samRecordSetBuilder.getRecords()) { rec.setHeader(null); } // create a fake header to make sure the records cannot be written using an invalid // sequence dictionary and unresolvable references final SAMFileHeader fakeHeader = new SAMFileHeader(); fakeHeader.setSortOrder(SAMFileHeader.SortOrder.queryname); final File bamFile = File.createTempFile("test.", BamFileIoUtils.BAM_FILE_EXTENSION); bamFile.deleteOnExit(); try (final SAMFileWriter bamWriter = new SAMFileWriterFactory().makeSAMOrBAMWriter(fakeHeader, false, bamFile);) { for (SAMRecord rec : samRecordSetBuilder.getRecords()) { bamWriter.addAlignment(rec); } } }
@Test public void testRealDataLongCigar() throws Exception { final File samFile = new File("src/test/resources/htsjdk/samtools/BAMCigarOverflowTest/cigar-64k.sam.gz"); final File bamFile = File.createTempFile("test.", BamFileIoUtils.BAM_FILE_EXTENSION); bamFile.deleteOnExit(); try (final SamReader samReader = SamReaderFactory.make().open(samFile); final SAMFileWriter bamWriter = new SAMFileWriterFactory().makeSAMOrBAMWriter(samReader.getFileHeader(), true, bamFile); final CloseableIterator<SAMRecord> it = samReader.iterator()) { while (it.hasNext()) { bamWriter.addAlignment(it.next()); } } try (final SamReader samReader = SamReaderFactory.make().open(samFile); final SamReader bamReader = SamReaderFactory.make().open(bamFile)) { verifySamReadersEqual(samReader, bamReader); } }
/** * Write a SAMRecord to a SAM file in the given format, and read it back. * * @param format "sam" or "bam". * @param rec The record to write. * @return The same record, after having being written and read back. */ private SAMRecord writeAndReadSamRecord(final String format, SAMRecord rec) throws IOException { final File bamFile = File.createTempFile("htsjdk-writeAndReadSamRecord.", "." + format); final SAMFileWriter bamWriter = new SAMFileWriterFactory().makeSAMOrBAMWriter(rec.getHeader(), false, bamFile); bamWriter.addAlignment(rec); bamWriter.close(); final SamReader reader = SamReaderFactory.makeDefault().open(bamFile); rec = reader.iterator().next(); reader.close(); bamFile.delete(); return rec; }
@Test(dataProvider = "longCigarsData") public void testBinNotNullWhenLargeCigarIsLoaded(final int numOps) throws Exception { final SAMRecordSetBuilder builder = new SAMRecordSetBuilder(true, SAMFileHeader.SortOrder.coordinate); final Cigar cigar = Cigar.fromCigarOperators(getCigarOperatorsForTest(numOps)); builder.addFrag("frag1", 0, 1, false, false, cigar.toString(), null, 30); final File bamFile = File.createTempFile("test.", BamFileIoUtils.BAM_FILE_EXTENSION); bamFile.deleteOnExit(); try (final SAMFileWriter bamWriter = new SAMFileWriterFactory().makeSAMOrBAMWriter(builder.getHeader(), false, bamFile)) { for (final SAMRecord record : builder.getRecords()) bamWriter.addAlignment(record); } try (final SamReader reader = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT).open(bamFile)) { reader.iterator().forEachRemaining(samRecord -> { samRecord.getCigar(); samRecord.computeIndexingBin(); }); } }
private void standardReheader(final SAMFileHeader replacementHeader) { final SamReader recordReader = SamReaderFactory.makeDefault().referenceSequence(REFERENCE_SEQUENCE).validationStringency(ValidationStringency.SILENT).open(INPUT); if (replacementHeader.getSortOrder() != recordReader.getFileHeader().getSortOrder()) { 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 ProgressLogger progress = new ProgressLogger(Log.getInstance(ReplaceSamHeader.class)); for (final SAMRecord rec : recordReader) { rec.setHeader(replacementHeader); writer.addAlignment(rec); progress.record(rec); } writer.close(); CloserUtil.close(recordReader); }
private void standardReheader(final SAMFileHeader replacementHeader) { final SamReader recordReader = SamReaderFactory.makeDefault().referenceSequence(REFERENCE_SEQUENCE).validationStringency(ValidationStringency.SILENT).open(INPUT); if (replacementHeader.getSortOrder() != recordReader.getFileHeader().getSortOrder()) { 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 ProgressLogger progress = new ProgressLogger(Log.getInstance(ReplaceSamHeader.class)); for (final SAMRecord rec : recordReader) { rec.setHeader(replacementHeader); writer.addAlignment(rec); progress.record(rec); } writer.close(); CloserUtil.close(recordReader); }