private int getCRAMRecordCount(final File cramFile) { final CRAMFileReader cramReader = new CRAMFileReader(cramFile, (File)null, testReferenceSource); final Iterator<SAMRecord> it = cramReader.getIterator(); int recCount = 0; while (it.hasNext()) { it.next(); recCount++; } cramReader.close(); return recCount; }
@Test(expectedExceptions = CRAMException.class) public void testFailsMD5Check() throws IOException { // auxf.alteredForMD5test.fa has been altered slightly from the original reference // to cause the CRAM md5 check to fail final File CRAMFile = new File("src/test/resources/htsjdk/samtools/cram/auxf#values.3.0.cram"); final File refFile = new File("src/test/resources/htsjdk/samtools/cram/auxf.alteredForMD5test.fa"); ReferenceSource refSource = new ReferenceSource(refFile); CRAMFileReader reader = null; try { reader = new CRAMFileReader( CRAMFile, null, refSource, ValidationStringency.STRICT); Iterator<SAMRecord> it = reader.getIterator(); while (it.hasNext()) { it.next(); } } finally { if (reader != null) { reader.close(); } } }
@Test public void testFileFileConstructor () throws IOException { CRAMFileReader reader = new CRAMFileReader( tmpCramFile, tmpCraiFile, source, ValidationStringency.STRICT); CloseableIterator<SAMRecord> iterator = reader.queryAlignmentStart("chrM", 1500); Assert.assertTrue(iterator.hasNext()); SAMRecord record = iterator.next(); Assert.assertEquals(record.getReferenceName(), "chrM"); Assert.assertTrue(record.getAlignmentStart() >= 1500); reader.close(); }
@Test public void testCRAIIndexerFromStream() throws IOException { final File CRAMFile = new File("src/test/resources/htsjdk/samtools/cram/test2.cram"); final File refFile = new File("src/test/resources/htsjdk/samtools/cram/auxf.fa"); ReferenceSource refSource = new ReferenceSource(refFile); // get the header to use CRAMFileReader reader = new CRAMFileReader( CRAMFile, null, refSource, ValidationStringency.STRICT); SAMFileHeader samHeader = reader.getFileHeader(); reader.close(); ByteArrayOutputStream bos = new ByteArrayOutputStream(); CRAMCRAIIndexer craiIndexer = new CRAMCRAIIndexer(bos, samHeader); craiIndexer.writeIndex(new SeekableFileStream(CRAMFile), bos); List<CRAIEntry> craiEntries = CRAMCRAIIndexer.readIndex(new ByteArrayInputStream(bos.toByteArray())).getCRAIEntries(); Assert.assertEquals(craiEntries.size(), 1); }
@Test(expectedExceptions = SAMException.class) public void testFileFileConstructorNoIndex () throws IOException { CRAMFileReader reader = new CRAMFileReader( new SeekableFileStream(tmpCramFile), (File) null, source, ValidationStringency.STRICT); try { reader.queryAlignmentStart("chrM", 1500); } finally { reader.close(); } }
@Test(expectedExceptions = SAMException.class) public void testStreamStreamConstructorNoIndex () throws IOException { CRAMFileReader reader = new CRAMFileReader( new SeekableFileStream(tmpCramFile), (SeekableFileStream) null, source, ValidationStringency.STRICT); try { reader.queryAlignmentStart("chrM", 1500); } finally { reader.close(); } }
@Test public void testStreamFileConstructor () throws IOException { CRAMFileReader reader = new CRAMFileReader( new SeekableFileStream(tmpCramFile), tmpCraiFile, source, ValidationStringency.STRICT); CloseableIterator<SAMRecord> iterator = reader.queryAlignmentStart("chrM", 1500); Assert.assertTrue(iterator.hasNext()); SAMRecord record = iterator.next(); Assert.assertEquals(record.getReferenceName(), "chrM"); Assert.assertTrue(record.getAlignmentStart() >= 1500); reader.close(); }
@Test public void testCRAIIndexerFromContainer() throws IOException { final File CRAMFile = new File("src/test/resources/htsjdk/samtools/cram/test2.cram"); final File refFile = new File("src/test/resources/htsjdk/samtools/cram/auxf.fa"); ReferenceSource refSource = new ReferenceSource(refFile); CRAMFileReader reader = new CRAMFileReader( CRAMFile, null, refSource, ValidationStringency.STRICT); SAMFileHeader samHeader = reader.getFileHeader(); Iterator<SAMRecord> it = reader.getIterator(); while(it.hasNext()) { SAMRecord samRec = it.next(); } reader.close(); FileInputStream fis = new FileInputStream(CRAMFile); CramContainerIterator cit = new CramContainerIterator(fis); ByteArrayOutputStream bos = new ByteArrayOutputStream(); CRAMCRAIIndexer craiIndexer = new CRAMCRAIIndexer(bos, samHeader); while (cit.hasNext()) { craiIndexer.processContainer(cit.next()); } craiIndexer.finish(); bos.close(); List<CRAIEntry> craiEntries = CRAMCRAIIndexer.readIndex(new ByteArrayInputStream(bos.toByteArray())).getCRAIEntries(); Assert.assertEquals(craiEntries.size(), 1); }
@Test public void testStreamStreamConstructor() throws IOException { CRAMFileReader reader = new CRAMFileReader( new SeekableFileStream(tmpCramFile), new SeekableFileStream(tmpCraiFile), source, ValidationStringency.STRICT); CloseableIterator<SAMRecord> iterator = reader.queryAlignmentStart("chrM", 1500); Assert.assertTrue(iterator.hasNext()); SAMRecord record = iterator.next(); Assert.assertEquals(record.getReferenceName(), "chrM"); Assert.assertTrue(record.getAlignmentStart() >= 1500); reader.close(); }
@Test public void testQueryInterval() throws IOException { CRAMFileReader reader = new CRAMFileReader(new ByteArraySeekableStream(cramBytes), new ByteArraySeekableStream(baiBytes), source, ValidationStringency.SILENT); QueryInterval[] query = new QueryInterval[]{new QueryInterval(0, 1519, 1520), new QueryInterval(1, 470535, 470536)}; final CloseableIterator<SAMRecord> iterator = reader.query(query, false); Assert.assertTrue(iterator.hasNext()); SAMRecord r1 = iterator.next(); Assert.assertEquals(r1.getReadName(), "3968040"); Assert.assertTrue(iterator.hasNext()); SAMRecord r2 = iterator.next(); Assert.assertEquals(r2.getReadName(), "140419"); Assert.assertFalse(iterator.hasNext()); iterator.close(); reader.close(); }
private void validateRecords(final List<SAMRecord> expectedRecords, ByteArrayInputStream is, ReferenceSource referenceSource) { CRAMFileReader cReader = new CRAMFileReader(null, is, referenceSource); SAMRecordIterator iterator2 = cReader.getIterator(); int index = 0; while (iterator2.hasNext()) { SAMRecord actualRecord = iterator2.next(); SAMRecord expectedRecord = expectedRecords.get(index++); Assert.assertEquals(actualRecord.getReadName(), expectedRecord.getReadName()); Assert.assertEquals(actualRecord.getFlags(), expectedRecord.getFlags()); Assert.assertEquals(actualRecord.getAlignmentStart(), expectedRecord.getAlignmentStart()); Assert.assertEquals(actualRecord.getAlignmentEnd(), expectedRecord.getAlignmentEnd()); Assert.assertEquals(actualRecord.getReferenceName(), expectedRecord.getReferenceName()); Assert.assertEquals(actualRecord.getMateAlignmentStart(), expectedRecord.getMateAlignmentStart()); Assert.assertEquals(actualRecord.getMateReferenceName(), expectedRecord.getMateReferenceName()); Assert.assertEquals(actualRecord.getReadBases(), expectedRecord.getReadBases()); Assert.assertEquals(actualRecord.getBaseQualities(), expectedRecord.getBaseQualities()); } cReader.close(); }
@Test public void testQueryInterval() throws IOException { CRAMFileReader reader = new CRAMFileReader( new ByteArraySeekableStream(cramBytes), new ByteArraySeekableStream(craiBytes), source, ValidationStringency.STRICT); QueryInterval[] query = new QueryInterval[]{new QueryInterval(0, 1519, 1520), new QueryInterval(1, 470535, 470536)}; final CloseableIterator<SAMRecord> iterator = reader.query(query, false); Assert.assertTrue(iterator.hasNext()); SAMRecord r1 = iterator.next(); Assert.assertEquals(r1.getReadName(), "3968040"); Assert.assertTrue(iterator.hasNext()); SAMRecord r2 = iterator.next(); Assert.assertEquals(r2.getReadName(), "140419"); Assert.assertFalse(iterator.hasNext()); iterator.close(); reader.close(); }
@Test public void testQueryIntervalWithFilePointers() throws IOException { CRAMFileReader reader = new CRAMFileReader( new ByteArraySeekableStream(cramBytes), new ByteArraySeekableStream(craiBytes), source, ValidationStringency.STRICT); QueryInterval[] query = new QueryInterval[]{new QueryInterval(0, 1519, 1520), new QueryInterval(1, 470535, 470536)}; BAMFileSpan fileSpan = BAMFileReader.getFileSpan(query, reader.getIndex()); final CloseableIterator<SAMRecord> iterator = reader.createIndexIterator(query, false, fileSpan.toCoordinateArray()); Assert.assertTrue(iterator.hasNext()); SAMRecord r1 = iterator.next(); Assert.assertEquals(r1.getReadName(), "3968040"); Assert.assertTrue(iterator.hasNext()); SAMRecord r2 = iterator.next(); Assert.assertEquals(r2.getReadName(), "140419"); Assert.assertFalse(iterator.hasNext()); iterator.close(); reader.close(); }
@Test public void scanAllUnmappedReads() throws IOException { SamReader samReader = SamReaderFactory.makeDefault().open(BAM_FILE); CRAMFileReader reader = new CRAMFileReader(new ByteArraySeekableStream(cramBytes), new ByteArraySeekableStream(baiBytes), source, ValidationStringency.SILENT); reader.setValidationStringency(ValidationStringency.SILENT); int counter = 0; SAMRecordIterator unmappedSamIterator = samReader.queryUnmapped(); CloseableIterator<SAMRecord> unmappedCramIterator = reader.queryUnmapped(); while (unmappedSamIterator.hasNext()) { Assert.assertTrue(unmappedCramIterator.hasNext()); SAMRecord r1 = unmappedSamIterator.next(); SAMRecord r2 = unmappedCramIterator.next(); Assert.assertEquals(r1.getReadName(), r2.getReadName()); Assert.assertEquals(r1.getBaseQualityString(), r2.getBaseQualityString()); counter++; } Assert.assertFalse(unmappedCramIterator.hasNext()); Assert.assertEquals(counter, nofUnmappedReads); reader.close(); }
reader.close();
cramReader.close();
@Test public void scanMappedReads() throws IOException { SamReader samReader = SamReaderFactory.makeDefault().open(BAM_FILE); SAMRecordIterator samRecordIterator = samReader.iterator(); CRAMFileReader reader = new CRAMFileReader(new ByteArraySeekableStream(cramBytes), new ByteArraySeekableStream(baiBytes), source, ValidationStringency.SILENT); reader.setValidationStringency(ValidationStringency.SILENT); int counter = 0; while (samRecordIterator.hasNext()) { SAMRecord samRecord = samRecordIterator.next(); if (samRecord.getReferenceIndex() == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) break; // test only 1st and 2nd in every 100 to speed the test up: if (counter++ %100 > 1) continue; String s1 = samRecord.getSAMString(); CloseableIterator<SAMRecord> iterator = reader.queryAlignmentStart(samRecord.getReferenceName(), samRecord.getAlignmentStart()); Assert.assertTrue(iterator.hasNext(), counter + ": " + s1); SAMRecord cramRecord = iterator.next(); String s2 = cramRecord.getSAMString(); Assert.assertEquals(samRecord.getReferenceName(), cramRecord.getReferenceName(), s1 + s2); // default 'overlap' is true, so test records intersect the query: Assert.assertTrue(CoordMath.overlaps(cramRecord.getAlignmentStart(), cramRecord.getAlignmentEnd(), samRecord.getAlignmentStart(), samRecord.getAlignmentEnd()), s1 + s2); } samRecordIterator.close(); reader.close(); Assert.assertEquals(counter, nofMappedReads); }