diff --git a/java/src/org/broadinstitute/sting/gatk/datasources/shards/BlockDelimitedReadShardStrategy.java b/java/src/org/broadinstitute/sting/gatk/datasources/shards/BlockDelimitedReadShardStrategy.java index 1deb0dbfd..f0df40a79 100644 --- a/java/src/org/broadinstitute/sting/gatk/datasources/shards/BlockDelimitedReadShardStrategy.java +++ b/java/src/org/broadinstitute/sting/gatk/datasources/shards/BlockDelimitedReadShardStrategy.java @@ -35,7 +35,17 @@ public class BlockDelimitedReadShardStrategy extends ReadShardStrategy { private final List filePointers = new ArrayList(); /** - * Position of the last shard in the file. + * Iterator over the list of file pointers. + */ + private final Iterator filePointerIterator; + + /** + * The file pointer currently being processed. + */ + private FilePointer currentFilePointer; + + /** + * Ending position of the last shard in the file. */ private Map position; @@ -51,6 +61,11 @@ public class BlockDelimitedReadShardStrategy extends ReadShardStrategy { this.position = this.dataSource.getCurrentPosition(); if(locations != null) filePointers.addAll(IntervalSharder.shardIntervals(this.dataSource,locations.toList(),this.dataSource.getNumIndexLevels()-1)); + + filePointerIterator = filePointers.iterator(); + if(filePointerIterator.hasNext()) + currentFilePointer = filePointerIterator.next(); + advance(); } @@ -81,10 +96,10 @@ public class BlockDelimitedReadShardStrategy extends ReadShardStrategy { SamRecordFilter filter = null; if(!filePointers.isEmpty()) { - for(FilePointer filePointer: filePointers) { - shardPosition = dataSource.getFilePointersBounding(filePointer.bin); + Map> selectedReaders = new HashMap>(); + while(selectedReaders.size() == 0 && currentFilePointer != null) { + shardPosition = dataSource.getFilePointersBounding(currentFilePointer.bin); - Map> selectedReaders = new HashMap>(); for(SAMReaderID id: shardPosition.keySet()) { List chunks = shardPosition.get(id); List selectedChunks = new ArrayList(); @@ -98,17 +113,19 @@ public class BlockDelimitedReadShardStrategy extends ReadShardStrategy { if(selectedChunks.size() > 0) selectedReaders.put(id,selectedChunks); } - if(selectedReaders.size() > 0) { - filter = new ReadOverlapFilter(filePointer.locations); + if(selectedReaders.size() > 0) { BAMFormatAwareShard shard = new BlockDelimitedReadShard(dataSource.getReadsInfo(),selectedReaders,filter,Shard.ShardType.READ); dataSource.fillShard(shard); if(!shard.isBufferEmpty()) { + filter = new ReadOverlapFilter(currentFilePointer.locations); nextShard = shard; break; } } + + currentFilePointer = filePointerIterator.hasNext() ? filePointerIterator.next() : null; } } else { diff --git a/java/src/org/broadinstitute/sting/gatk/datasources/shards/ReadDelimitedReadShardStrategy.java b/java/src/org/broadinstitute/sting/gatk/datasources/shards/ReadDelimitedReadShardStrategy.java index 149316ff9..bd6e877ba 100644 --- a/java/src/org/broadinstitute/sting/gatk/datasources/shards/ReadDelimitedReadShardStrategy.java +++ b/java/src/org/broadinstitute/sting/gatk/datasources/shards/ReadDelimitedReadShardStrategy.java @@ -11,7 +11,7 @@ import java.util.Iterator; */ public class ReadDelimitedReadShardStrategy extends ReadShardStrategy { // our read bucket size, default - protected long readCount = 100000L; + protected long readCount = 1000L; // our hasnext flag boolean hasNext = true;