/** * Reads container header only from a {@link InputStream}. * * @param major the CRAM version to assume * @param inputStream the input stream to read from * @return a new {@link Container} object with container header values filled out but empty body (no slices and blocks). */ public static Container readContainerHeader(final int major, final InputStream inputStream) { final Container container = new Container(); final ContainerHeaderIO containerHeaderIO = new ContainerHeaderIO(); if (!containerHeaderIO.readContainerHeader(major, container, inputStream)) { containerHeaderIO.readContainerHeader(container, new ByteArrayInputStream((major >= 3 ? CramIO.ZERO_F_EOF_MARKER : CramIO.ZERO_B_EOF_MARKER))); return container; } return container; }
private static long writeContainerForSamFileHeader(final int major, final SAMFileHeader samFileHeader, final OutputStream os) { final byte[] data = toByteArray(samFileHeader); final int length = Math.max(1024, data.length + data.length / 2); final byte[] blockContent = new byte[length]; System.arraycopy(data, 0, blockContent, 0, Math.min(data.length, length)); final Block block = Block.createRawFileHeaderBlock(blockContent); final Container container = new Container(); container.blockCount = 1; container.blocks = new Block[]{block}; container.landmarks = new int[0]; container.slices = new Slice[0]; container.alignmentSpan = Slice.NO_ALIGNMENT_SPAN; container.alignmentStart = Slice.NO_ALIGNMENT_START; container.bases = 0; container.globalRecordCounter = 0; container.nofRecords = 0; container.sequenceId = 0; final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); block.write(major, byteArrayOutputStream); container.containerByteSize = byteArrayOutputStream.size(); final int containerHeaderByteSize = ContainerIO.writeContainerHeader(major, container, os); try { os.write(byteArrayOutputStream.toByteArray(), 0, byteArrayOutputStream.size()); } catch (final IOException e) { throw new RuntimeIOException(e); } return containerHeaderByteSize + byteArrayOutputStream.size(); }
/** * Reads container header only from a {@link InputStream}. * * @param major the CRAM version to assume * @param inputStream the input stream to read from * @return a new {@link Container} object with container header values filled out but empty body (no slices and blocks). * @throws IOException as per java IO contract */ public static Container readContainerHeader(final int major, final InputStream inputStream) throws IOException { final Container container = new Container(); final ContainerHeaderIO containerHeaderIO = new ContainerHeaderIO(); if (!containerHeaderIO.readContainerHeader(major, container, inputStream)) { containerHeaderIO.readContainerHeader(container, new ByteArrayInputStream((major >= 3 ? CramIO.ZERO_F_EOF_MARKER : CramIO.ZERO_B_EOF_MARKER))); return container; } return container; }
final Container container = new Container(); container.header = header; container.nofRecords = records.size();
Container buildContainer(final List<CramCompressionRecord> records, final SubstitutionMatrix substitutionMatrix) { // sets header APDelta final boolean coordinateSorted = samFileHeader.getSortOrder() == SAMFileHeader.SortOrder.coordinate; final CompressionHeader header = new CompressionHeaderFactory().build(records, substitutionMatrix, coordinateSorted); header.readNamesIncluded = preserveReadNames; final List<Slice> slices = new ArrayList<>(); final Container container = new Container(); container.header = header; container.nofRecords = records.size(); container.globalRecordCounter = globalRecordCounter; container.bases = 0; container.blockCount = 0; long lastGlobalRecordCounter = container.globalRecordCounter; for (int i = 0; i < records.size(); i += recordsPerSlice) { final List<CramCompressionRecord> sliceRecords = records.subList(i, Math.min(records.size(), i + recordsPerSlice)); final Slice slice = Slice.buildSlice(sliceRecords, header); slice.globalRecordCounter = lastGlobalRecordCounter; lastGlobalRecordCounter += slice.nofRecords; container.bases += slice.bases; slices.add(slice); } container.finalizeContainerState(slices.toArray(new Slice[0])); globalRecordCounter += records.size(); return container; }
@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 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); }
private static long writeContainerForSamFileHeader(final int major, final SAMFileHeader samFileHeader, final OutputStream os) throws IOException { final byte[] data = toByteArray(samFileHeader); final int length = Math.max(1024, data.length + data.length / 2); final byte[] blockContent = new byte[length]; System.arraycopy(data, 0, blockContent, 0, Math.min(data.length, length)); final Block block = Block.createRawFileHeaderBlock(blockContent); final Container container = new Container(); container.blockCount = 1; container.blocks = new Block[]{block}; container.landmarks = new int[0]; container.slices = new Slice[0]; container.alignmentSpan = Slice.NO_ALIGNMENT_SPAN; container.alignmentStart = Slice.NO_ALIGNMENT_START; container.bases = 0; container.globalRecordCounter = 0; container.nofRecords = 0; container.sequenceId = 0; final ExposedByteArrayOutputStream byteArrayOutputStream = new ExposedByteArrayOutputStream(); block.write(major, byteArrayOutputStream); container.containerByteSize = byteArrayOutputStream.size(); final int containerHeaderByteSize = ContainerIO.writeContainerHeader(major, container, os); os.write(byteArrayOutputStream.getBuffer(), 0, byteArrayOutputStream.size()); return containerHeaderByteSize + byteArrayOutputStream.size(); }
@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 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 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); } }
@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); }