@Override public boolean hasNext() { if (container != null && container.isEOF()) return false; if (!iterator.hasNext()) { nextContainer(); } return !records.isEmpty(); }
@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); }
private boolean nextContainer() throws IOException { long offset = is.getCount(); Container c = ContainerIO.readContainer(cramHeader.getVersion(), is); if (c.isEOF()) return false; c.offset = offset; indexer.processContainer(c, ValidationStringency.DEFAULT_STRINGENCY); log.info("INDEXED: " + c.toString()); return true; }
/** * 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; }
@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); }
log.debug("CONTAINER WRITTEN: " + container.toString());
/** * 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; }
length += byteArrayOutputStream.size(); log.debug("CONTAINER WRITTEN: " + container.toString());
public List<CramCompressionRecord> getRecords(final Container container, ArrayList<CramCompressionRecord> records, final ValidationStringency validationStringency) throws IllegalArgumentException, IllegalAccessException { if (container.isEOF()) { return Collections.emptyList(); } if (records == null) { records = new ArrayList<>(container.nofRecords); } for (final Slice slice : container.slices) { records.addAll(getRecords(slice, container.header, validationStringency)); } return records; }
private boolean nextContainer() throws IOException, IllegalArgumentException, IllegalAccessException { long offset = is.getCount(); Container c = ContainerIO.readContainer(cramHeader.getVersion(), is); if (c.isEOF()) return false; c.offset = offset; index.addContainer(c); log.info("INDEXED: " + c.toString()); return true; }
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; }
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(); }
public List<CramCompressionRecord> getRecords(final Container container, ArrayList<CramCompressionRecord> records, final ValidationStringency validationStringency) { if (container.isEOF()) { return Collections.emptyList(); } if (records == null) { records = new ArrayList<>(container.nofRecords); } for (final Slice slice : container.slices) { records.addAll(getRecords(slice, container.header, validationStringency)); } return records; }
@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(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); }
final Container container = new Container(); container.header = header; container.nofRecords = records.size();
@Override public boolean hasNext() { if (container != null && container.isEOF()) return false; if (!iterator.hasNext()) { try { nextContainer(); } catch (IOException | IllegalAccessException e) { throw new SAMException(e); } } return !records.isEmpty(); }
@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(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); }
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(); }