From 388dd8d64d36423aa7e5b6bb262cc0c32ac64fde Mon Sep 17 00:00:00 2001 From: hanna Date: Fri, 21 May 2010 02:53:12 +0000 Subject: [PATCH] Fixing bugs in downsampler introduced when I added Ryan's dup eliminator. git-svn-id: file:///humgen/gsa-scr1/gsa-engineering/svn_contents/trunk@3407 348d0f76-0448-11de-a6fe-93d51630548a --- .../DownsamplingLocusIteratorByState.java | 46 +++++++++---------- 1 file changed, 21 insertions(+), 25 deletions(-) diff --git a/java/src/org/broadinstitute/sting/gatk/iterators/DownsamplingLocusIteratorByState.java b/java/src/org/broadinstitute/sting/gatk/iterators/DownsamplingLocusIteratorByState.java index 76e9e6347..c9bd16a69 100755 --- a/java/src/org/broadinstitute/sting/gatk/iterators/DownsamplingLocusIteratorByState.java +++ b/java/src/org/broadinstitute/sting/gatk/iterators/DownsamplingLocusIteratorByState.java @@ -538,17 +538,22 @@ public class DownsamplingLocusIteratorByState extends LocusIterator { public Iterator iterator() { return new Iterator() { - private final Iterator>> alignmentStartIterator; + private Iterator>> alignmentStartIterator; + private Map> currentAlignmentStart; + private Iterator> sampleIterator; + private List currentSample; + private Iterator readStateIterator; private SAMRecordState nextReadState; private int readsInHanger = countReadsInHanger(); { - pruneEmptyElementsInHanger(); alignmentStartIterator = readStatesByAlignmentStart.iterator(); - sampleIterator = alignmentStartIterator.hasNext() ? alignmentStartIterator.next().values().iterator() : null; - readStateIterator = (sampleIterator!=null && sampleIterator.hasNext()) ? sampleIterator.next().iterator() : null; + currentAlignmentStart = alignmentStartIterator.hasNext() ? alignmentStartIterator.next() : null; + sampleIterator = currentAlignmentStart!=null ? currentAlignmentStart.values().iterator() : null; + currentSample = sampleIterator!=null && sampleIterator.hasNext() ? sampleIterator.next() : null; + readStateIterator = currentSample!=null ? currentSample.iterator() : null; } public boolean hasNext() { @@ -570,6 +575,8 @@ public class DownsamplingLocusIteratorByState extends LocusIterator { if(readStateIterator == null) throw new StingException("Attempted to remove read, but no previous read was found."); readStateIterator.remove(); + if(currentSample.isEmpty()) sampleIterator.remove(); + if(currentAlignmentStart.isEmpty()) alignmentStartIterator.remove(); } private void advance() { @@ -577,12 +584,15 @@ public class DownsamplingLocusIteratorByState extends LocusIterator { if(readStateIterator!=null && readStateIterator.hasNext()) nextReadState = readStateIterator.next(); else if(sampleIterator!=null && sampleIterator.hasNext()) { - readStateIterator = sampleIterator.next().iterator(); + currentSample = sampleIterator.next(); + readStateIterator = currentSample.iterator(); nextReadState = readStateIterator.hasNext() ? readStateIterator.next() : null; } else if(alignmentStartIterator!=null && alignmentStartIterator.hasNext()) { - sampleIterator = alignmentStartIterator.next().values().iterator(); - readStateIterator = sampleIterator.hasNext() ? sampleIterator.next().iterator() : null; + currentAlignmentStart = alignmentStartIterator.next(); + sampleIterator = currentAlignmentStart != null ? currentAlignmentStart.values().iterator() : null; + currentSample = (sampleIterator!=null && sampleIterator.hasNext()) ? sampleIterator.next() : null; + readStateIterator = currentSample!=null ? currentSample.iterator() : null; nextReadState = (readStateIterator!=null && readStateIterator.hasNext()) ? readStateIterator.next() : null; } @@ -592,7 +602,6 @@ public class DownsamplingLocusIteratorByState extends LocusIterator { } public boolean isEmpty() { - pruneEmptyElementsInHanger(); return readStatesByAlignmentStart.isEmpty(); } @@ -610,7 +619,6 @@ public class DownsamplingLocusIteratorByState extends LocusIterator { } public boolean hasNext() { - pruneEmptyElementsInHanger(); return !readStatesByAlignmentStart.isEmpty() || iterator.hasNext(); } @@ -669,9 +677,9 @@ public class DownsamplingLocusIteratorByState extends LocusIterator { addReadsToHanger(culledReadStatesBySample,sampleName,newReads,targetCoverage-readsInHanger); } - - readStatesByAlignmentStart.add(culledReadStatesBySample); } + if(!culledReadStatesBySample.isEmpty()) + readStatesByAlignmentStart.add(culledReadStatesBySample); } private ReservoirDownsampler getDownsampler(String sampleName) { @@ -700,6 +708,8 @@ public class DownsamplingLocusIteratorByState extends LocusIterator { } private void addReadsToHanger(final Map> newHanger, final String sampleName, final Collection reads, final int maxReads) { + if(reads.isEmpty()) + return; List hangerEntry = new LinkedList(); int readCount = 0; for(SAMRecord read: reads) { @@ -714,20 +724,6 @@ public class DownsamplingLocusIteratorByState extends LocusIterator { } newHanger.put(sampleName,hangerEntry); } - - private void pruneEmptyElementsInHanger() { - Iterator>> hangerIterator = readStatesByAlignmentStart.iterator(); - while(hangerIterator.hasNext()) { - Map> hangerEntry = hangerIterator.next(); - Iterator> entryBySampleIterator = hangerEntry.values().iterator(); - while(entryBySampleIterator.hasNext()) { - if(entryBySampleIterator.next().size() == 0) - entryBySampleIterator.remove(); - } - if(hangerEntry.size() == 0) - hangerIterator.remove(); - } - } } }