From c869d1c9cf6a74db699309d65d3fae2106890640 Mon Sep 17 00:00:00 2001 From: hanna Date: Mon, 28 Feb 2011 21:14:18 +0000 Subject: [PATCH] Fix misc issues in new protosharder regarding proper iterator termination when an unexpectedly small amount of data is present. git-svn-id: file:///humgen/gsa-scr1/gsa-engineering/svn_contents/trunk@5338 348d0f76-0448-11de-a6fe-93d51630548a --- .../sting/gatk/datasources/reads/BinTree.java | 11 +++++++++-- .../datasources/reads/LowMemoryIntervalSharder.java | 7 +++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/java/src/org/broadinstitute/sting/gatk/datasources/reads/BinTree.java b/java/src/org/broadinstitute/sting/gatk/datasources/reads/BinTree.java index 95c33d552..94cebe9e7 100644 --- a/java/src/org/broadinstitute/sting/gatk/datasources/reads/BinTree.java +++ b/java/src/org/broadinstitute/sting/gatk/datasources/reads/BinTree.java @@ -160,14 +160,16 @@ class BinTreeIterator implements Iterator { final int firstBinInLowestLevel = GATKBAMIndex.getFirstBinInLevel(lowestLevel); final int binsInLowestLevel = index.getLevelSize(lowestLevel); - currentBinInLowestLevel++; - GATKBin[] bins = new GATKBin[GATKBAMIndex.getNumIndexLevels()]; nextBinTree = null; while(nextBinTree == null) { + currentBinInLowestLevel++; + boolean levelIteratorsExhausted = true; + for(int level = lowestLevel; level >= 0; level--) { if(!levelIterators[level].hasNext()) continue; + levelIteratorsExhausted = false; final int firstBinInThisLevel = GATKBAMIndex.getFirstBinInLevel(level); final int binsInThisLevel = index.getLevelSize(level); @@ -180,6 +182,11 @@ class BinTreeIterator implements Iterator { bins[level] = levelIterators[level].peek(); } + // No more bins available for this reference sequence? Break out of the loop. + if(levelIteratorsExhausted) + break; + + // Found a compelling bin tree? Break out of the loop. for(int level = 0; level <= lowestLevel; level++) { if(bins[level] != null) { nextBinTree = new BinTree(index,bins); diff --git a/java/src/org/broadinstitute/sting/gatk/datasources/reads/LowMemoryIntervalSharder.java b/java/src/org/broadinstitute/sting/gatk/datasources/reads/LowMemoryIntervalSharder.java index 45ad7e081..e44261d63 100644 --- a/java/src/org/broadinstitute/sting/gatk/datasources/reads/LowMemoryIntervalSharder.java +++ b/java/src/org/broadinstitute/sting/gatk/datasources/reads/LowMemoryIntervalSharder.java @@ -104,6 +104,13 @@ public class LowMemoryIntervalSharder implements Iterator { } } + // Early exit if no bins were found. + if(coveredRegion == null) { + nextFilePointer.addLocation(currentLocus); + currentLocus = locusIterator.next(); + continue; + } + // Define the initial range of the file pointer, aka the region where the locus currently being processed intersects the BAM list. GenomeLoc initialLocation = currentLocus.intersect(coveredRegion); nextFilePointer.addLocation(initialLocation);