Reduce unnecessary repetitive accesses to the BAM index file.
git-svn-id: file:///humgen/gsa-scr1/gsa-engineering/svn_contents/trunk@5607 348d0f76-0448-11de-a6fe-93d51630548a
This commit is contained in:
parent
0a58d7aa1a
commit
b4b52cc0fe
|
|
@ -103,6 +103,7 @@ public class BAMSchedule implements CloseableIterator<BAMScheduleEntry> {
|
||||||
|
|
||||||
for(final SAMReaderID reader: readerIDs) {
|
for(final SAMReaderID reader: readerIDs) {
|
||||||
GATKBAMIndex index = indices.get(reader);
|
GATKBAMIndex index = indices.get(reader);
|
||||||
|
BAMIndexContent indexContent = index.getQueryResults(referenceSequence);
|
||||||
|
|
||||||
int currentBinInLowestLevel = GATKBAMIndex.getFirstBinInLevel(GATKBAMIndex.getNumIndexLevels()-1);
|
int currentBinInLowestLevel = GATKBAMIndex.getFirstBinInLevel(GATKBAMIndex.getNumIndexLevels()-1);
|
||||||
Iterator<GenomeLoc> locusIterator = intervals.iterator();
|
Iterator<GenomeLoc> locusIterator = intervals.iterator();
|
||||||
|
|
@ -132,7 +133,7 @@ public class BAMSchedule implements CloseableIterator<BAMScheduleEntry> {
|
||||||
|
|
||||||
// Code at this point knows that the current bin is neither before nor after the current locus,
|
// 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.
|
// 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()) {
|
if(!fileSpan.isEmpty()) {
|
||||||
// File format is binary in little endian; start of region, end of region, num chunks, then the chunks themselves.
|
// File format is binary in little endian; start of region, end of region, num chunks, then the chunks themselves.
|
||||||
|
|
|
||||||
|
|
@ -304,7 +304,21 @@ public class GATKBAMIndex implements BAMIndex, BrowseableBAMIndex {
|
||||||
final int referenceSequence = gatkBin.getReferenceSequence();
|
final int referenceSequence = gatkBin.getReferenceSequence();
|
||||||
BAMIndexContent indexQuery = getQueryResults(referenceSequence);
|
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;
|
return null;
|
||||||
|
|
||||||
final int binLevel = getLevelForBin(bin);
|
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.
|
// Add the specified bin to the tree if it exists.
|
||||||
List<GATKBin> binTree = new ArrayList<GATKBin>();
|
List<GATKBin> binTree = new ArrayList<GATKBin>();
|
||||||
if(indexQuery.containsBin(gatkBin))
|
if(indexContent.containsBin(gatkBin))
|
||||||
binTree.add(indexQuery.getBins().getBin(gatkBin.getBinNumber()));
|
binTree.add(indexContent.getBins().getBin(gatkBin.getBinNumber()));
|
||||||
|
|
||||||
int currentBinLevel = binLevel;
|
int currentBinLevel = binLevel;
|
||||||
while(--currentBinLevel >= 0) {
|
while(--currentBinLevel >= 0) {
|
||||||
final int binStart = getFirstBinInLevel(currentBinLevel);
|
final int binStart = getFirstBinInLevel(currentBinLevel);
|
||||||
final int binWidth = getMaxAddressibleGenomicLocation()/getLevelSize(currentBinLevel);
|
final int binWidth = getMaxAddressibleGenomicLocation()/getLevelSize(currentBinLevel);
|
||||||
final int binNumber = firstLocusInBin/binWidth + binStart;
|
final int binNumber = firstLocusInBin/binWidth + binStart;
|
||||||
GATKBin parentBin = indexQuery.getBins().getBin(binNumber);
|
GATKBin parentBin = indexContent.getBins().getBin(binNumber);
|
||||||
if(parentBin != null && indexQuery.containsBin(parentBin))
|
if(parentBin != null && indexContent.containsBin(parentBin))
|
||||||
binTree.add(parentBin);
|
binTree.add(parentBin);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -332,7 +346,7 @@ public class GATKBAMIndex implements BAMIndex, BrowseableBAMIndex {
|
||||||
}
|
}
|
||||||
|
|
||||||
final int start = getFirstLocusInBin(bin);
|
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()]));
|
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.
|
* @param referenceIndex The reference to load. CachingBAMFileIndex only stores index data for entire references.
|
||||||
* @return The index information for this reference.
|
* @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.
|
// If not in the cache, attempt to load it from disk.
|
||||||
return query(referenceIndex,1,-1);
|
return query(referenceIndex,1,-1);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue