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); }
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); }
public SAMFileWriterFactory getSamFileWriterFactory(boolean sorted) { return new SAMFileWriterFactory() .setTempDirectory(fsContext.getTemporaryDirectory()) .setCreateIndex(sorted); // also covered by -Dcreate_index=true }
private void createBAM(final List<GATKSAMRecord> reads) throws IOException { testBAM = createTempFile("TraverseActiveRegionsUnitTest", ".bam"); SAMFileWriter out = new SAMFileWriterFactory().setCreateIndex(true).makeBAMWriter(reads.get(0).getHeader(), true, testBAM); for (GATKSAMRecord read : reads ) { out.addAlignment(read); } out.close(); new File(testBAM.getAbsolutePath().replace(".bam", ".bai")).deleteOnExit(); new File(testBAM.getAbsolutePath() + ".bai").deleteOnExit(); }
private void createBAM(List<GATKSAMRecord> reads) throws IOException { testBAM = createTempFile("TraverseActiveRegionsUnitTest", ".bam"); SAMFileWriter out = new SAMFileWriterFactory().setCreateIndex(true).makeBAMWriter(reads.get(0).getHeader(), true, testBAM); for (GATKSAMRecord read : ReadUtils.sortReadsByCoordinate(reads)) { out.addAlignment(read); } out.close(); new File(testBAM.getAbsolutePath().replace(".bam", ".bai")).deleteOnExit(); new File(testBAM.getAbsolutePath() + ".bai").deleteOnExit(); }
/** * filters a SAM using a reads file */ @Test(dataProvider = "dataTestReadFilter") public void testReadFilters(final FilterSamReads.Filter filterType, final List<String> readList, final int expectNumber) throws Exception { final File inputSam = File.createTempFile("testSam", ".sam", new File(TEST_DIR)); inputSam.deleteOnExit(); final File sortedSamIdx = new File(TEST_DIR, inputSam.getName() + ".idx"); sortedSamIdx.deleteOnExit(); try (final SAMFileWriter writer = new SAMFileWriterFactory() .setCreateIndex(true).makeSAMWriter(builder.getHeader(), false, inputSam)) { for (final SAMRecord record : builder) { writer.addAlignment(record); } } final File reads = File.createTempFile(TEST_DIR, "reads"); reads.deleteOnExit(); try (final FileWriter writer = new FileWriter(reads)) { writer.write(String.join("\n", readList)); } catch (IOException e) { e.printStackTrace(); } FilterSamReads filterTest = setupProgram(reads, inputSam, filterType); Assert.assertEquals(filterTest.doWork(), 0); long count = getReadCount(filterTest); Assert.assertEquals(count, expectNumber); }
/** * Useful test method. Creates a (temporary) indexed BAM so that we can store a sam in the testdata set. * * @param samFile the sam file to convert to bam and index * @return File a (temporary) bam file (index file is created in same path). */ public static File createIndexedBam(final File samFile, final File tempFilePrefix) throws IOException { final File output = File.createTempFile(tempFilePrefix.getAbsolutePath(), ".bam"); output.deleteOnExit(); final File indexFile = new File(output.getAbsolutePath() + ".bai"); indexFile.deleteOnExit(); final SamReader in = SamReaderFactory.makeDefault().open(samFile); SAMFileWriter out = new SAMFileWriterFactory().setCreateIndex(true).makeBAMWriter(in.getFileHeader(), true, output); in.iterator().stream().forEach(out::addAlignment); out.close(); in.close(); return output; } }
/** * Template code for creating a custom SAM file for testing. Modify to suit your needs. */ private static void createTestSAM(String testSamName) throws IOException { final File testDir = new File("testdata/picard/analysis/directed/CollectHsMetrics/"); final File reference = new File("testdata/picard/quality/chrM.reference.fasta"); final String readGroupId = "TestReadGroup"; final String sample = "TestSample"; final String platform = "Illumina"; final String library = "TestLibrary"; final int numReads = 1; final int readLength = 10; File samFile = File.createTempFile(testSamName, ".bam", testDir); final SAMRecordSetBuilder setBuilder = createTestSAMBuilder(reference, readGroupId, sample, platform, library); setBuilder.setReadLength(readLength); // add reads to the SAMRecordSetBuilder IntStream.range(0, numReads).forEach(i -> setBuilder.addPair("MediocreBaseQ" + i, 0, 1, 200, false, false, readLength + "M", readLength + "M", false, true, 40)); final SAMFileWriter writer = new SAMFileWriterFactory().setCreateIndex(true).makeBAMWriter(setBuilder.getHeader(), false, samFile); setBuilder.forEach(writer::addAlignment); writer.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(); }
/** * 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(); }
private static CachingBAMFileIndex getIndexWith200Contigs() throws IOException { List<SAMSequenceRecord> contigs = IntStream.range(1, 200) .mapToObj(i -> new SAMSequenceRecord(String.valueOf(i), 1000)) .collect(Collectors.toList()); final SAMSequenceDictionary dict = new SAMSequenceDictionary(contigs); final SAMFileHeader header = new SAMFileHeader(dict); header.setSortOrder(SAMFileHeader.SortOrder.coordinate); final SAMFileWriterFactory writerFactory = new SAMFileWriterFactory().setCreateIndex(true); final File outBam = File.createTempFile("tmp", ".bam"); try(final SAMFileWriter writer = writerFactory.makeWriter(header, true, outBam, null)){ IntStream.range(1,200).mapToObj(i -> { final SAMRecord record = new SAMRecord(header); record.setReadName("name" + i); record.setReferenceName(String.valueOf(i)); record.setReadUnmappedFlag(false); record.setAlignmentStart(1); record.setCigarString("20M"); return record; }).forEach(writer::addAlignment); } final File indexFile = new File(outBam.getParent(), IOUtil.basename(outBam) + BAMIndex.BAMIndexSuffix); indexFile.deleteOnExit(); outBam.deleteOnExit(); return new CachingBAMFileIndex(indexFile, dict); }
/** * filters a SAM using an interval filter */ @Test(dataProvider = "dataTestPairedIntervalFilter") public void testPairedIntervalFilter(final String intervalFilename, final int expectNumber) throws Exception { // Build a sam file for testing final File inputSam = VcfTestUtils.createTemporaryIndexedFile("testSam", ".bam"); final SAMFileWriter writer = new SAMFileWriterFactory() .setCreateIndex(true).makeSAMWriter(builder.getHeader(), false, inputSam); for (final SAMRecord record : builder) { writer.addAlignment(record); } writer.close(); final File intervalFile = new File(intervalFilename); FilterSamReads filterTest = setupProgram(intervalFile, inputSam, FilterSamReads.Filter.includePairedIntervals); Assert.assertEquals(filterTest.doWork(), 0); long count = getReadCount(filterTest); Assert.assertEquals(count, expectNumber); }
@Test(description="check that factory settings are propagated to writer") public void testFactorySettings() throws Exception { final SAMFileWriterFactory factory = new SAMFileWriterFactory(); factory.setCreateIndex(false); factory.setCreateMd5File(false); final File wontBeUsed = new File("wontBeUsed.tmp"); final int maxRecsInRam = 271828; factory.setMaxRecordsInRam(maxRecsInRam); factory.setTempDirectory(wontBeUsed); final SAMFileHeader header = new SAMFileHeader(); header.setSortOrder(SAMFileHeader.SortOrder.coordinate); header.addSequence(new SAMSequenceRecord("chr1", 123)); try (final SAMFileWriter writer = factory.makeBAMWriter(header, false, new ByteArrayOutputStream())) { Assert.assertEquals(maxRecsInRam, ((SAMFileWriterImpl) writer).getMaxRecordsInRam()); Assert.assertEquals(wontBeUsed, ((SAMFileWriterImpl) writer).getTempDirectory()); } try (final SAMFileWriter writer = factory.makeSAMWriter(header, false, new ByteArrayOutputStream())) { Assert.assertEquals(maxRecsInRam, ((SAMFileWriterImpl) writer).getMaxRecordsInRam()); Assert.assertEquals(wontBeUsed, ((SAMFileWriterImpl) writer).getTempDirectory()); } }
public File build (final List<SAMRecordSetBuilder> setBuilder, final File unsortedSam, final SAMFileHeader header) throws IOException { final File sortedSam = VcfTestUtils.createTemporaryIndexedFile("CollectGcBias", ".bam"); final SAMFileWriter writer = new SAMFileWriterFactory() .setCreateIndex(true).makeBAMWriter(header, false, unsortedSam); for (final SAMRecordSetBuilder subSetBuilder : setBuilder) { for (final SAMRecord record : subSetBuilder) { writer.addAlignment(record); } } writer.close(); final SortSam sorter = new SortSam(); final String[] args = new String[] { "INPUT=" + unsortedSam.getAbsolutePath(), "OUTPUT=" + sortedSam.getAbsolutePath(), "SORT_ORDER=coordinate" }; sorter.instanceMain(args); return sortedSam; }
@Test(dataProvider = "getEmptyArraysAndExtensions") public void testWriteSamWithEmptyArray(Object emptyArray, Class<?> arrayClass, String fileExtension) throws IOException { Assert.assertEquals(emptyArray.getClass(), arrayClass); Assert.assertEquals(Array.getLength(emptyArray), 0); final SAMRecordSetBuilder samRecords = new SAMRecordSetBuilder(); samRecords.addFrag("Read", 0, 100, false); final SAMRecord record = samRecords.getRecords().iterator().next(); record.setAttribute(ARRAY_TAG, emptyArray); checkArrayIsEmpty(ARRAY_TAG, record, arrayClass); final Path tmp = Files.createTempFile("tmp", fileExtension); IOUtil.deleteOnExit(tmp); final SAMFileWriterFactory writerFactory = new SAMFileWriterFactory() .setCreateMd5File(false) .setCreateIndex(false); final Path reference = IOUtil.getPath("src/test/resources/htsjdk/samtools/one-contig.fasta"); try (final SAMFileWriter samFileWriter = writerFactory.makeWriter(samRecords.getHeader(), false, tmp, reference)) { samFileWriter.addAlignment(record); } try (final SamReader reader = SamReaderFactory.makeDefault() .referenceSequence(reference) .open(tmp)) { final SAMRecordIterator iterator = reader.iterator(); Assert.assertTrue(iterator.hasNext()); final SAMRecord recordFromDisk = iterator.next(); checkArrayIsEmpty(ARRAY_TAG, recordFromDisk, arrayClass); } }
private SAMFileWriterFactory createWriterFactoryWithOptions(SAMFileHeader header) { final SAMFileWriterFactory factory = new SAMFileWriterFactory(); factory.setCreateIndex(true); factory.setCreateMd5File(true); // index only created if coordinate sorted header.setSortOrder(SAMFileHeader.SortOrder.coordinate); header.addSequence(new SAMSequenceRecord("chr1", 123)); header.addReadGroup(new SAMReadGroupRecord("1")); return factory; }
private void createTestBAM() { header = ArtificialSAMUtils.createArtificialSamHeader(numContigs, 1, 100000); SAMReadGroupRecord readGroup = new SAMReadGroupRecord("foo"); readGroup.setSample("testSample"); header.addReadGroup(readGroup); ArtificialSingleSampleReadStream artificialReads = new ArtificialSingleSampleReadStream(header, "foo", numContigs, numStacksPerContig, stackSize, stackSize, 1, 100, 50, 150, numUnmappedReads); final File testBAMFile = createTempFile("SAMDataSourceFillShardBoundaryTest", ".bam"); SAMFileWriter bamWriter = new SAMFileWriterFactory().setCreateIndex(true).makeBAMWriter(header, true, testBAMFile); for ( SAMRecord read : artificialReads ) { bamWriter.addAlignment(read); } bamWriter.close(); testBAM = new SAMReaderID(testBAMFile, new Tags()); new File(testBAM.getSamFilePath().replace(".bam", ".bai")).deleteOnExit(); new File(testBAM.getSamFilePath() + ".bai").deleteOnExit(); } }
private void createSmallBam(final Path outputPath) { final SAMFileWriterFactory factory = new SAMFileWriterFactory(); factory.setCreateIndex(true); factory.setCreateMd5File(true); final SAMFileHeader header = new SAMFileHeader(); // index only created if coordinate sorted header.setSortOrder(SAMFileHeader.SortOrder.coordinate); header.addSequence(new SAMSequenceRecord("chr1", 123)); try (final SAMFileWriter writer = factory.makeBAMWriter(header, false, outputPath)) { fillSmallBam(writer); } }
private void createSmallBam(final File outputFile) { final SAMFileWriterFactory factory = new SAMFileWriterFactory(); factory.setCreateIndex(true); factory.setCreateMd5File(true); final SAMFileHeader header = new SAMFileHeader(); // index only created if coordinate sorted header.setSortOrder(SAMFileHeader.SortOrder.coordinate); header.addSequence(new SAMSequenceRecord("chr1", 123)); try (final SAMFileWriter writer = factory.makeBAMWriter(header, false, outputFile)) { fillSmallBam(writer); } }
private void createSmallBamToOutputStream(final OutputStream outputStream,boolean binary) { final SAMFileWriterFactory factory = new SAMFileWriterFactory(); factory.setCreateIndex(false); factory.setCreateMd5File(false); final SAMFileHeader header = new SAMFileHeader(); // index only created if coordinate sorted header.setSortOrder(SAMFileHeader.SortOrder.coordinate); header.addSequence(new SAMSequenceRecord("chr1", 123)); try (final SAMFileWriter writer = (binary? factory.makeBAMWriter(header, false, outputStream): factory.makeSAMWriter(header, false, outputStream) )) { fillSmallBam(writer); } }