public int getParentBinNumber(int binNumber) { if (binNumber >= getMaxBins()) { throw new SAMException("Tried to get parent bin for invalid bin (" + binNumber + ")."); } if (binNumber == 0) { return 0; } return (binNumber - 1) >> 3; }
@Test public static void testGetMaxBins() { Assert.assertEquals(csi.getMaxBins(), 37449); Assert.assertEquals(ucsi.getMaxBins(), 299593); } @Test
@Override public int getLevelForBin(Bin bin) { if(bin == null || bin.getBinNumber() > getMaxBins()) { throw new SAMException("Tried to get level for invalid bin: " + bin); } for (int i = getBinDepth()-1; i > -1 ; i--) { if (bin.getBinNumber() >= getFirstBinInLevelForCSI(i)) { return i; } } throw new SAMException("Unable to find correct level for bin: " + bin); }
/** * The maximum possible bin number for this reference sequence. * This is based on the maximum coordinate position of the reference * which is based on the size of the reference */ private int getMaxBinNumberForReference(final int reference) { try { final int sequenceLength = getBamDictionary().getSequence(reference).getSequenceLength(); return getFirstBinInLevelForCSI(getBinDepth() - 1) + (sequenceLength >> getMinShift()); } catch (final Exception e) { return getMaxBins(); } }
@Override public int getFirstLocusInBin(Bin bin) { if(bin == null || bin.getBinNumber() > getMaxBins()) { throw new SAMException("Tried to get first locus for invalid bin: " + bin); } int level = getLevelForBin(bin); int firstBinOnLevel = getFirstBinInLevelForCSI(level); int levelSize = getLevelSize(level); return (bin.getBinNumber() - firstBinOnLevel)*(getMaxSpan()/levelSize) + 1; }
@Override public int getLastLocusInBin(Bin bin) { if(bin == null || bin.getBinNumber() > getMaxBins()) { throw new SAMException("Tried to get last locus for invalid bin: " + bin); } int level = getLevelForBin(bin); int firstBinOnLevel = getFirstBinInLevelForCSI(level); int levelSize = getLevelSize(level); return (bin.getBinNumber() - firstBinOnLevel + 1)*(getMaxSpan()/levelSize); }
/** * 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); }
chunks = new ArrayList<Chunk>(nChunks); readChunks(nChunks, chunks); } else if (indexBin == getMaxBins() + 1) {