@Test(expectedExceptions = CRAMException.class) public static void singleAndUnmappedStateTest() { final Slice single = new Slice(); single.sequenceId = 5; single.alignmentStart = 10; single.alignmentSpan = 15; final Slice unmapped = new Slice(); unmapped.sequenceId = SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX; unmapped.alignmentStart = Slice.NO_ALIGNMENT_START; unmapped.alignmentSpan = Slice.NO_ALIGNMENT_SPAN; final Container container = new Container(); container.finalizeContainerState(single, unmapped); }
@Test(expectedExceptions = CRAMException.class) public static void differentReferencesStateTest() { final Slice one = new Slice(); one.sequenceId = 5; one.alignmentStart = 10; one.alignmentSpan = 15; final Slice another = new Slice(); another.sequenceId = 2; another.alignmentStart = 1; another.alignmentSpan = 10; final Container container = new Container(); container.finalizeContainerState(one, another); }
@Test(expectedExceptions = CRAMException.class) public static void multiAndSingleStateTest() { final Slice multi = new Slice(); multi.sequenceId = Slice.MULTI_REFERENCE; multi.alignmentStart = Slice.NO_ALIGNMENT_START; multi.alignmentSpan = Slice.NO_ALIGNMENT_SPAN; final Slice single = new Slice(); single.sequenceId = 5; single.alignmentStart = 10; single.alignmentSpan = 15; final Container container = new Container(); container.finalizeContainerState(multi, single); }
@Test(expectedExceptions = CRAMException.class) public static void multiAndUnmappedStateTest() { final Slice multi = new Slice(); multi.sequenceId = Slice.MULTI_REFERENCE; multi.alignmentStart = Slice.NO_ALIGNMENT_START; multi.alignmentSpan = Slice.NO_ALIGNMENT_SPAN; final Slice unmapped = new Slice(); unmapped.sequenceId = SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX; unmapped.alignmentStart = Slice.NO_ALIGNMENT_START; unmapped.alignmentSpan = Slice.NO_ALIGNMENT_SPAN; final Container container = new Container(); container.finalizeContainerState(multi, unmapped); } }
@SuppressWarnings("SameParameterValue") private static Container readContainer(final int major, final InputStream inputStream, final int fromSlice, int howManySlices) throws IOException { final Container container = readContainerHeader(major, inputStream); if (container.isEOF()) { return container; } container.header = CompressionHeader.read(major, inputStream); howManySlices = Math.min(container.landmarks.length, howManySlices); if (fromSlice > 0) //noinspection ResultOfMethodCallIgnored inputStream.skip(container.landmarks[fromSlice]); final List<Slice> slices = new ArrayList<Slice>(); for (int sliceCount = fromSlice; sliceCount < howManySlices - fromSlice; sliceCount++) { final Slice slice = new Slice(); SliceIO.read(major, slice, inputStream); slice.index = sliceCount; slices.add(slice); } container.slices = slices.toArray(new Slice[slices.size()]); calculateSliceOffsetsAndSizes(container); log.debug("READ CONTAINER: " + container.toString()); return container; }
@Test public static void singleRefSliceMultipleStateTest() { final Slice slice1 = new Slice(); slice1.sequenceId = 5; slice1.alignmentStart = 10; slice1.alignmentSpan = 15; final Slice slice2 = new Slice(); slice2.sequenceId = slice1.sequenceId; slice2.alignmentStart = 20; slice2.alignmentSpan = 20; final Container container = new Container(); container.finalizeContainerState(slice1, slice2); Assert.assertEquals(container.sequenceId, slice1.sequenceId); Assert.assertEquals(container.alignmentStart, 10); Assert.assertEquals(container.alignmentSpan, 30); // 20 + 20 - 10 }
@Test public static void unmappedSliceStateTest() { final Slice slice1 = new Slice(); slice1.sequenceId = SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX; slice1.alignmentStart = Slice.NO_ALIGNMENT_START; slice1.alignmentSpan = Slice.NO_ALIGNMENT_SPAN; final Slice slice2 = new Slice(); slice2.sequenceId = SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX; slice2.alignmentStart = Slice.NO_ALIGNMENT_START; slice2.alignmentSpan = Slice.NO_ALIGNMENT_SPAN; final Container container = new Container(); container.finalizeContainerState(slice1, slice2); Assert.assertEquals(container.sequenceId, slice1.sequenceId); Assert.assertEquals(container.alignmentStart, slice1.alignmentStart); Assert.assertEquals(container.alignmentSpan, slice1.alignmentSpan); }
@Test public static void multiRefSliceStateTest() { final Slice slice1 = new Slice(); slice1.sequenceId = Slice.MULTI_REFERENCE; slice1.alignmentStart = Slice.NO_ALIGNMENT_START; slice1.alignmentSpan = Slice.NO_ALIGNMENT_SPAN; final Slice slice2 = new Slice(); slice2.sequenceId = Slice.MULTI_REFERENCE; slice2.alignmentStart = Slice.NO_ALIGNMENT_START; slice2.alignmentSpan = Slice.NO_ALIGNMENT_SPAN; final Container container = new Container(); container.finalizeContainerState(slice1, slice2); Assert.assertEquals(container.sequenceId, slice1.sequenceId); Assert.assertEquals(container.alignmentStart, slice1.alignmentStart); Assert.assertEquals(container.alignmentSpan, slice1.alignmentSpan); }
@Test public static void singleRefSliceStateTest() { final Slice slice = new Slice(); slice.sequenceId = 5; slice.alignmentStart = 10; slice.alignmentSpan = 15; final Container container = new Container(); container.finalizeContainerState(slice); Assert.assertEquals(container.sequenceId, slice.sequenceId); Assert.assertEquals(container.alignmentStart, slice.alignmentStart); Assert.assertEquals(container.alignmentSpan, slice.alignmentSpan); }
@Test public void test_validateRef() { byte[] ref = "AAAAA".getBytes(); final byte[] md5 = SequenceUtil.calculateMD5(ref, 0, Math.min(5, ref.length)); Slice slice = new Slice(); slice.sequenceId = 0; slice.alignmentSpan = 5; slice.alignmentStart = 1; slice.setRefMD5(ref); Assert.assertEquals(slice.refMD5, md5); Assert.assertTrue(slice.validateRefMD5(ref)); }
@SuppressWarnings("SameParameterValue") private static Container readContainer(final int major, final InputStream inputStream, final int fromSlice, int howManySlices) { final Container container = readContainerHeader(major, inputStream); if (container.isEOF()) { return container; } container.header = CompressionHeader.read(major, inputStream); howManySlices = Math.min(container.landmarks.length, howManySlices); try { if (fromSlice > 0) //noinspection ResultOfMethodCallIgnored inputStream.skip(container.landmarks[fromSlice]); } catch (final IOException e) { throw new RuntimeIOException(e); } final List<Slice> slices = new ArrayList<Slice>(); for (int sliceCount = fromSlice; sliceCount < howManySlices - fromSlice; sliceCount++) { final Slice slice = new Slice(); SliceIO.read(major, slice, inputStream); slice.index = sliceCount; slices.add(slice); } container.slices = slices.toArray(new Slice[slices.size()]); calculateSliceOffsetsAndSizes(container); log.debug("READ CONTAINER: " + container.toString()); return container; }
@Test public void testUnmappedValidateRef() { Slice slice = new Slice(); slice.alignmentStart = SAMRecord.NO_ALIGNMENT_START; slice.sequenceId = SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX; Assert.assertTrue(slice.validateRefMD5(null)); Assert.assertTrue(slice.validateRefMD5(new byte[0])); Assert.assertTrue(slice.validateRefMD5(new byte[1024])); }
final Slice slice = new Slice(); slice.nofRecords = records.size();
public static SeekableStream openCraiFileAsBaiStream(final InputStream indexStream, final SAMSequenceDictionary dictionary) throws IOException, CRAIIndexException { final List<CRAIEntry> full = CRAMCRAIIndexer.readIndex(indexStream).getCRAIEntries(); Collections.sort(full); final SAMFileHeader header = new SAMFileHeader(); header.setSequenceDictionary(dictionary); final ByteArrayOutputStream baos = new ByteArrayOutputStream(); final CRAMBAIIndexer indexer = new CRAMBAIIndexer(baos, header); for (final CRAIEntry entry : full) { final Slice slice = new Slice(); slice.containerOffset = entry.containerStartOffset; slice.alignmentStart = entry.alignmentStart; slice.alignmentSpan = entry.alignmentSpan; slice.sequenceId = entry.sequenceId; // https://github.com/samtools/htsjdk/issues/531 // entry.sliceSize is the slice size in bytes, not the number of // records; this results in the BAMIndex metadata being wrong slice.nofRecords = entry.sliceSize; slice.index = entry.sliceIndex; slice.offset = entry.sliceOffset; indexer.processSingleReferenceSlice(slice); } indexer.finish(); return new SeekableMemoryStream(baos.toByteArray(), "CRAI to BAI converter"); }
@Test public void testFromContainer() { final Container container = new Container(); final Slice slice = new Slice(); slice.sequenceId = 1; slice.alignmentStart = 2; slice.alignmentSpan = 3; slice.containerOffset = 4; slice.offset = 5; slice.size = 6; container.landmarks = new int[]{7}; container.slices = new Slice[]{slice}; final List<CRAIEntry> entries = container.getCRAIEntries(); Assert.assertNotNull(entries); Assert.assertEquals(entries.size(), 1); final CRAIEntry entry = entries.get(0); Assert.assertEquals(entry.getSequenceId(), slice.sequenceId); Assert.assertEquals(entry.getAlignmentStart(), slice.alignmentStart); Assert.assertEquals(entry.getAlignmentSpan(), slice.alignmentSpan); Assert.assertEquals(entry.getContainerStartByteOffset(), slice.containerOffset); Assert.assertEquals(entry.getSliceByteOffset(), slice.offset); Assert.assertEquals(entry.getSliceByteSize(), slice.size); }
final Slice slice = new Slice(); slice.nofRecords = records.size();
final ContainerParser parser = new ContainerParser(indexBuilder.bamHeader); final Map<Integer, AlignmentSpan> refSet = parser.getReferences(container, validationStringency); final Slice fakeSlice = new Slice(); slice.containerOffset = container.offset; slice.index = sliceIndex++;
public static SeekableStream openCraiFileAsBaiStream(final InputStream indexStream, final SAMSequenceDictionary dictionary) { final List<CRAIEntry> full = CRAMCRAIIndexer.readIndex(indexStream).getCRAIEntries(); Collections.sort(full); final SAMFileHeader header = new SAMFileHeader(); header.setSequenceDictionary(dictionary); final ByteArrayOutputStream baos = new ByteArrayOutputStream(); final CRAMBAIIndexer indexer = new CRAMBAIIndexer(baos, header); for (final CRAIEntry entry : full) { final Slice slice = new Slice(); slice.containerOffset = entry.getContainerStartByteOffset(); slice.alignmentStart = entry.getAlignmentStart(); slice.alignmentSpan = entry.getAlignmentSpan(); slice.sequenceId = entry.getSequenceId(); // NOTE: the recordCount and sliceIndex fields can't be derived from the CRAM index // so we can only set them to zero // see https://github.com/samtools/htsjdk/issues/531 slice.nofRecords = 0; slice.index = 0; slice.offset = entry.getSliceByteOffset(); indexer.processSingleReferenceSlice(slice); } indexer.finish(); return new SeekableMemoryStream(baos.toByteArray(), "CRAI to BAI converter"); }
final ContainerParser parser = new ContainerParser(indexBuilder.bamHeader); final Map<Integer, AlignmentSpan> refSet = parser.getReferences(container, validationStringency); final Slice fakeSlice = new Slice(); slice.containerOffset = container.offset; slice.index = sliceIndex++;