Bin bin = bins.get(index); while (bin == null) { bin = new Bin(); if (!bins.compareAndSet(index, null, bin)) { // some other thread already set the bin in the meantime bin = bins.get(index); } } // use bin as usual
/** * Gets the first locus that this bin can index into. * @param bin The bin to test. * @return first position that associated with given bin number */ @Override public int getFirstLocusInBin(Bin bin) { if (bin.getBinNumber() < SRA_BIN_INDEX_OFFSET) { throw new RuntimeException("SRA only supports bins from the last level"); } return (bin.getBinNumber() - SRA_BIN_INDEX_OFFSET) * SRA_BIN_SIZE + 1; }
/** * @param bin Requested bin * @return chunks that represent all bases of requested bin */ private List<Chunk> getBinChunks(Bin bin) { if (bin.containsChunks()) { return bin.getChunkList(); } if (bin.getBinNumber() < SRA_BIN_INDEX_OFFSET) { throw new RuntimeException("SRA only supports bins from the last level"); } int binNumber = bin.getBinNumber() - SRA_BIN_INDEX_OFFSET; long refOffset = recordRangeInfo.getReferenceOffsets().get(bin.getReferenceSequence()); // move requested position MAX_FRAGMENT_OVERLAP bases behind, so that we take all the reads that overlap requested position int firstChunkCorrection = binNumber == 0 ? 0 : -MAX_FRAGMENT_OVERLAP; long binGlobalOffset = binNumber * SRA_BIN_SIZE + refOffset; long firstChunkNumber = (binGlobalOffset + firstChunkCorrection) / SRA_CHUNK_SIZE; long lastChunkNumber = (binGlobalOffset + SRA_BIN_SIZE - 1) / SRA_CHUNK_SIZE; List<Chunk> chunks = new ArrayList<Chunk>(); for (long chunkNumber = firstChunkNumber; chunkNumber <= lastChunkNumber; chunkNumber++) { chunks.add(new Chunk(chunkNumber * SRA_CHUNK_SIZE, (chunkNumber + 1) * SRA_CHUNK_SIZE)); } return chunks; } }
public GATKBin(Bin bin) { this(bin.getReferenceSequence(),bin.getBinNumber()); }
/** * Adds the first chunk to the bin */ public void addInitialChunk(final Chunk newChunk){ final List<Chunk> oldChunks = new ArrayList<Chunk>(); setChunkList(oldChunks); setLastChunk(newChunk); oldChunks.add(newChunk); }
bin = bins[binNum]; } else { bin = new Bin(referenceSequence, binNum); bins[binNum] = bin; binsSeen++; final long chunkEnd = newChunk.getChunkEnd(); final List<Chunk> oldChunks = bin.getChunkList(); if (!bin.containsChunks()) { bin.addInitialChunk(newChunk); final Chunk lastChunk = bin.getLastChunk(); bin.setLastChunk(newChunk);
private void writeBin(final Bin bin, final LittleEndianOutputStream los) throws IOException { los.writeInt(bin.getBinNumber()); final List<Chunk> chunkList = bin.getChunkList(); los.writeInt(chunkList.size()); for (final Chunk chunk: chunkList) { los.writeLong(chunk.getChunkStart()); los.writeLong(chunk.getChunkEnd()); } }
final int referenceSequence = bin.getReferenceSequence(); final BAMIndexContent queryResults = getQueryResults(referenceSequence); binTree.add(queryResults.getBins().getBin(bin.getBinNumber())); for(final Chunk chunk: coveringBin.getChunkList()) chunkList.add(chunk.clone());
chunks = Collections.emptyList(); final Bin bin = new Bin(referenceSequence, indexBin); bin.setChunkList(chunks); bin.setLastChunk(lastChunk); bins[indexBin] = bin;
private Bin loadBin(final int referenceSequenceIndex, final LittleEndianInputStream dis) throws IOException { final int binNumber = dis.readInt(); final Bin ret = new Bin(referenceSequenceIndex, binNumber); final int numChunks = dis.readInt(); final List<Chunk> chunkList = new ArrayList<Chunk>(numChunks); for (int i = 0; i < numChunks; ++i) { chunkList.add(loadChunk(dis)); } ret.setChunkList(chunkList); return ret; }
/** * @return all chunks associated with all bins in this content */ public List<Chunk> getAllChunks() { final List<Chunk> allChunks = new ArrayList<Chunk>(); for (final Bin b : mBinList) if (b.getChunkList() != null) { allChunks.addAll(b.getChunkList()); } return Collections.unmodifiableList(allChunks); }
@Test public void testEmptyBin() { // Construct a new empty bin and ensure that the bin list is empty, not null. Bin bin = new Bin(1,4681); Assert.assertEquals(bin.getChunkList(),Collections.<Chunk>emptyList(),"getChunkList() in an empty bin should return an empty list."); } }
bin = bins[binNum]; } else { bin = new Bin(referenceSequence, binNum); bins[binNum] = bin; binsSeen++; final long chunkEnd = newChunk.getChunkEnd(); final List<Chunk> oldChunks = bin.getChunkList(); if (!bin.containsChunks()) { bin.addInitialChunk(newChunk); final Chunk lastChunk = bin.getLastChunk(); bin.setLastChunk(newChunk);
private void writeBin(final Bin bin, final LittleEndianOutputStream los) throws IOException { los.writeInt(bin.getBinNumber()); final List<Chunk> chunkList = bin.getChunkList(); los.writeInt(chunkList.size()); for (final Chunk chunk : chunkList) { los.writeLong(chunk.getChunkStart()); los.writeLong(chunk.getChunkEnd()); } }
return null; final int referenceSequence = bin.getReferenceSequence(); final BAMIndexContent indexQuery = getQueryResults(referenceSequence); binTree.add(indexQuery.getBins().getBin(bin.getBinNumber())); for(final Chunk chunk: coveringBin.getChunkList()) chunkList.add(chunk.clone());
chunks = Collections.emptyList(); final Bin bin = new Bin(referenceSequence, indexBin); bin.setChunkList(chunks); bin.setLastChunk(lastChunk); bins[indexBin] = bin;
private Bin loadBin(final int referenceSequenceIndex, final LittleEndianInputStream dis) throws IOException { final int binNumber = dis.readInt(); final Bin ret = new Bin(referenceSequenceIndex, binNumber); final int numChunks = dis.readInt(); final List<Chunk> chunkList = new ArrayList<Chunk>(numChunks); for (int i = 0; i < numChunks; ++i) { chunkList.add(loadChunk(dis)); } ret.setChunkList(chunkList); return ret; }
/** * @return all chunks associated with all bins in this content */ public List<Chunk> getAllChunks() { final List<Chunk> allChunks = new ArrayList<Chunk>(); for (final Bin b : mBinList) if (b.getChunkList() != null) { allChunks.addAll(b.getChunkList()); } return Collections.unmodifiableList(allChunks); }
/** * Adds the first chunk to the bin */ public void addInitialChunk(final Chunk newChunk){ final List<Chunk> oldChunks = new ArrayList<Chunk>(); setChunkList(oldChunks); setLastChunk(newChunk); oldChunks.add(newChunk); }
bin = bins[binNum]; } else { bin = new Bin(referenceSequence, binNum); bins[binNum] = bin; binsSeen++; final long chunkEnd = newChunk.getChunkEnd(); final List<Chunk> oldChunks = bin.getChunkList(); if (!bin.containsChunks()) { bin.addInitialChunk(newChunk); final Chunk lastChunk = bin.getLastChunk(); bin.setLastChunk(newChunk);