@Override public long getStartOfLastLinearBin() { if (metaDataPos > 0 && position() != metaDataPos) { seek(metaDataPos); } final int sequenceIndex = getNumberOfReferences(); long loffset = -1L; for (int i = 0; i < sequenceIndex; i++) { final int nBins = readInteger(); // n_bin for (int j = 0; j < nBins; j++) { readInteger(); // bin loffset = readLong(); // loffset final int nChunks = readInteger(); // n_chunk skipBytes(BAMFileConstants.CSI_CHUNK_SIZE * nChunks); } } return loffset; }
private void readMinShiftAndBinDepth() { if (BAMFileConstants.CSI_MINSHIFT_OFFSET != position()) { seek(BAMFileConstants.CSI_MINSHIFT_OFFSET); } setMinShift(readInteger()); // min_shift setBinDepth(readInteger() + 1); // depth - HTSlib doesn't count the first level (bin 0) setMaxBins(binDepth); setMaxSpan(binDepth, minShift); }
private void readAuxDataAndNRef() { if (BAMFileConstants.CSI_AUXDATA_OFFSET != position()) { seek(BAMFileConstants.CSI_AUXDATA_OFFSET); } //set the aux data length first byte[] auxData = new byte[readInteger()]; // l_aux readBytes(auxData); // aux setAuxData(auxData); setNumberOfReferences(readInteger()); // n_ref metaDataPos = position(); // save the metadata position for delayed reading }
/** * Return meta data for the given reference including information about number of aligned, unaligned, and noCoordinate records * * @param reference the reference of interest * @return meta data for the reference */ @Override public BAMIndexMetaData getMetaData(final int reference) { if (metaDataPos > 0 && position() != metaDataPos) { seek(metaDataPos); } final List<Chunk> metaDataChunks = new ArrayList<Chunk>(); final int sequenceCount = getNumberOfReferences(); if (reference >= sequenceCount) { return null; } skipToSequence(reference); final int binCount = readInteger(); // n_bin for (int binNumber = 0; binNumber < binCount; binNumber++) { final int indexBin = readInteger(); // bin final long lOffset = readLong(); // loffset final int nChunks = readInteger(); // n_chunk if (indexBin == getMaxBins() + 1) { readChunks(nChunks, metaDataChunks); } else { skipBytes(BAMFileConstants.CSI_CHUNK_SIZE * nChunks); } } return new BAMIndexMetaData(metaDataChunks); }
private void skipToSequence(final int sequenceIndex) { if(sequenceIndex > getNumberOfReferences()) { throw new SAMException("Sequence index (" + sequenceIndex + ") is greater than maximum (" + getNumberOfReferences() + ")."); } //Use sequence position cache if available if(sequenceIndexes[sequenceIndex] != -1){ seek(sequenceIndexes[sequenceIndex]); return; } if (metaDataPos > 0 && position() != metaDataPos) { seek(metaDataPos); } for (int i = 0; i < sequenceIndex; i++) { final int nBins = readInteger(); // n_bin for (int j = 0; j < nBins; j++) { readInteger(); // bin readLong(); // loffset final int nChunks = readInteger(); // n_chunk skipBytes(BAMFileConstants.CSI_CHUNK_SIZE * nChunks); } } //Update sequence position cache sequenceIndexes[sequenceIndex] = position(); } }
final int binCount = readInteger(); // n_bin boolean metaDataSeen = false; final Bin[] bins = new BinWithOffset[getMaxBinNumberForReference(referenceSequence) +1]; for (int binNumber = 0; binNumber < binCount; binNumber++) { final int indexBin = readInteger(); // bin final long lOffset = readLong(); // l_offset final int nChunks = readInteger(); // n_chunk List<Chunk> chunks;