From cdce639bae6f66a3bfc3d9b07865e26a45d490d4 Mon Sep 17 00:00:00 2001 From: hanna Date: Tue, 9 Mar 2010 12:36:11 +0000 Subject: [PATCH] Partially reclaim performance lost during integration test fixes. git-svn-id: file:///humgen/gsa-scr1/gsa-engineering/svn_contents/trunk@2961 348d0f76-0448-11de-a6fe-93d51630548a --- .../sting/gatk/executive/WindowMaker.java | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/java/src/org/broadinstitute/sting/gatk/executive/WindowMaker.java b/java/src/org/broadinstitute/sting/gatk/executive/WindowMaker.java index f7400d3df..3314aa669 100644 --- a/java/src/org/broadinstitute/sting/gatk/executive/WindowMaker.java +++ b/java/src/org/broadinstitute/sting/gatk/executive/WindowMaker.java @@ -4,10 +4,7 @@ import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.gatk.iterators.StingSAMIterator; import org.broadinstitute.sting.gatk.Reads; -import java.util.List; -import java.util.Queue; -import java.util.ArrayDeque; -import java.util.Iterator; +import java.util.*; import net.sf.samtools.SAMRecord; import net.sf.picard.util.PeekableIterator; @@ -21,10 +18,15 @@ import net.sf.picard.util.PeekableIterator; * @version 0.1 */ public class WindowMaker implements Iterable, Iterator { + /** + * Source information for iteration. + */ + private final Reads sourceInfo; + /** * The data source for reads. Will probably come directly from the BAM file. */ - private final StingSAMIterator sourceIterator; + private final PeekableIterator sourceIterator; /** * Stores the sequence of intervals that the windowmaker should be tracking. @@ -43,7 +45,8 @@ public class WindowMaker implements Iterable, I * @param intervals The set of intervals over which to traverse. */ public WindowMaker(StingSAMIterator iterator, List intervals) { - this.sourceIterator = iterator; + this.sourceInfo = iterator.getSourceInfo(); + this.sourceIterator = new PeekableIterator(iterator); this.intervalIterator = new PeekableIterator(intervals.iterator()); } @@ -83,7 +86,7 @@ public class WindowMaker implements Iterable, I } public Reads getSourceInfo() { - return sourceIterator.getSourceInfo(); + return sourceInfo; } public GenomeLoc getLocus() { @@ -95,10 +98,20 @@ public class WindowMaker implements Iterable, I } public boolean hasNext() { - return overlappingReads.size() > 0 || sourceIterator.hasNext(); + if(overlappingReads.size() > 0) return true; + if(sourceIterator.hasNext()) { + SAMRecord nextRead = sourceIterator.peek(); + if((nextRead.getAlignmentStart() >= locus.getStart() && nextRead.getAlignmentStart() <= locus.getStop()) || + (nextRead.getAlignmentEnd() >= locus.getStart() && nextRead.getAlignmentEnd() <= locus.getStop()) || + (nextRead.getAlignmentStart() < locus.getStart() && nextRead.getAlignmentEnd() > locus.getStop())) + return true; + + } + return false; } public SAMRecord next() { + if(!hasNext()) throw new NoSuchElementException("WindowMakerIterator is out of elements for this interval."); SAMRecord nextRead = overlappingReads.size() > 0 ? overlappingReads.remove() : sourceIterator.next(); if(intervalIterator.hasNext() && nextRead.getAlignmentEnd() >= intervalIterator.peek().getStart()) pendingOverlaps.add(nextRead);