diff --git a/java/src/org/broadinstitute/sting/gatk/datasources/reads/BAMSchedule.java b/java/src/org/broadinstitute/sting/gatk/datasources/reads/BAMSchedule.java index bab22f5aa..b86187405 100644 --- a/java/src/org/broadinstitute/sting/gatk/datasources/reads/BAMSchedule.java +++ b/java/src/org/broadinstitute/sting/gatk/datasources/reads/BAMSchedule.java @@ -103,6 +103,7 @@ public class BAMSchedule implements CloseableIterator { for(final SAMReaderID reader: readerIDs) { GATKBAMIndex index = indices.get(reader); + BAMIndexContent indexContent = index.getQueryResults(referenceSequence); int currentBinInLowestLevel = GATKBAMIndex.getFirstBinInLevel(GATKBAMIndex.getNumIndexLevels()-1); Iterator locusIterator = intervals.iterator(); @@ -132,7 +133,7 @@ public class BAMSchedule implements CloseableIterator { // Code at this point knows that the current bin is neither before nor after the current locus, // so it must overlap. Add this region to the filesystem. - final GATKBAMFileSpan fileSpan = index.getSpanOverlapping(bin); + final GATKBAMFileSpan fileSpan = index.getSpanOverlapping(indexContent,bin); if(!fileSpan.isEmpty()) { // File format is binary in little endian; start of region, end of region, num chunks, then the chunks themselves. diff --git a/java/src/org/broadinstitute/sting/gatk/datasources/reads/GATKBAMIndex.java b/java/src/org/broadinstitute/sting/gatk/datasources/reads/GATKBAMIndex.java index 7cf53fc11..458fb4ede 100644 --- a/java/src/org/broadinstitute/sting/gatk/datasources/reads/GATKBAMIndex.java +++ b/java/src/org/broadinstitute/sting/gatk/datasources/reads/GATKBAMIndex.java @@ -304,7 +304,21 @@ public class GATKBAMIndex implements BAMIndex, BrowseableBAMIndex { final int referenceSequence = gatkBin.getReferenceSequence(); BAMIndexContent indexQuery = getQueryResults(referenceSequence); - if(indexQuery == null) + return getSpanOverlapping(indexQuery,bin); + } + + /** + * Perform an overlapping query of all bins bounding the given location. + * @param bin The bin over which to perform an overlapping query. + * @return The file pointers + */ + public GATKBAMFileSpan getSpanOverlapping(final BAMIndexContent indexContent, final Bin bin) { + if(bin == null) + return null; + + GATKBin gatkBin = new GATKBin(bin); + + if(indexContent == null) return null; final int binLevel = getLevelForBin(bin); @@ -312,16 +326,16 @@ public class GATKBAMIndex implements BAMIndex, BrowseableBAMIndex { // Add the specified bin to the tree if it exists. List binTree = new ArrayList(); - if(indexQuery.containsBin(gatkBin)) - binTree.add(indexQuery.getBins().getBin(gatkBin.getBinNumber())); + if(indexContent.containsBin(gatkBin)) + binTree.add(indexContent.getBins().getBin(gatkBin.getBinNumber())); int currentBinLevel = binLevel; while(--currentBinLevel >= 0) { final int binStart = getFirstBinInLevel(currentBinLevel); final int binWidth = getMaxAddressibleGenomicLocation()/getLevelSize(currentBinLevel); final int binNumber = firstLocusInBin/binWidth + binStart; - GATKBin parentBin = indexQuery.getBins().getBin(binNumber); - if(parentBin != null && indexQuery.containsBin(parentBin)) + GATKBin parentBin = indexContent.getBins().getBin(binNumber); + if(parentBin != null && indexContent.containsBin(parentBin)) binTree.add(parentBin); } @@ -332,7 +346,7 @@ public class GATKBAMIndex implements BAMIndex, BrowseableBAMIndex { } final int start = getFirstLocusInBin(bin); - chunkList = optimizeChunkList(chunkList,indexQuery.getLinearIndex().getMinimumOffset(start)); + chunkList = optimizeChunkList(chunkList,indexContent.getLinearIndex().getMinimumOffset(start)); return new GATKBAMFileSpan(chunkList.toArray(new GATKChunk[chunkList.size()])); } @@ -462,7 +476,7 @@ public class GATKBAMIndex implements BAMIndex, BrowseableBAMIndex { * @param referenceIndex The reference to load. CachingBAMFileIndex only stores index data for entire references. * @return The index information for this reference. */ - protected BAMIndexContent getQueryResults(final int referenceIndex) { + public BAMIndexContent getQueryResults(final int referenceIndex) { // If not in the cache, attempt to load it from disk. return query(referenceIndex,1,-1); }