@Override protected void verifyIndexMagicNumber(final String sourceName) { // Verify the magic number. if (BAMFileConstants.CSI_MAGIC_OFFSET != position()) { seek(BAMFileConstants.CSI_MAGIC_OFFSET); } final byte[] buffer = new byte[BAMFileConstants.CSI_MINSHIFT_OFFSET]; readBytes(buffer); // magic if (!Arrays.equals(buffer, BAMFileConstants.CSI_INDEX_MAGIC)) { throw new RuntimeIOException("Invalid file header in BAM CSI index " + sourceName + ": " + new String(buffer)); } }
/** * Returns count of records unassociated with any reference. Call before the index file is closed * * @return meta data at the end of the bam index that indicates count of records holding no coordinates * or null if no meta data (old index format) */ @Override public Long getNoCoordinateCount() { if (metaDataPos > 0 && position() != metaDataPos) { seek(metaDataPos); } skipToSequence(getNumberOfReferences()); try { // in case of old index file without meta data return readLong(); } catch (final Exception e) { return null; } }
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(); } }
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 }
@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); }
@Override protected BAMIndexContent query(final int referenceSequence, final int startPos, final int endPos) { if (metaDataPos > 0 && position() != metaDataPos) { seek(metaDataPos);