@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; }
/** * 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); }
continue; // don't create a Bin } else { skipBytes(BAMFileConstants.CSI_CHUNK_SIZE * nChunks); chunks = Collections.emptyList();
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(); } }