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
This commit is contained in:
parent
a10fca0d5c
commit
388dd8d64d
|
|
@ -538,17 +538,22 @@ public class DownsamplingLocusIteratorByState extends LocusIterator {
|
||||||
|
|
||||||
public Iterator<SAMRecordState> iterator() {
|
public Iterator<SAMRecordState> iterator() {
|
||||||
return new Iterator<SAMRecordState>() {
|
return new Iterator<SAMRecordState>() {
|
||||||
private final Iterator<Map<String,List<SAMRecordState>>> alignmentStartIterator;
|
private Iterator<Map<String,List<SAMRecordState>>> alignmentStartIterator;
|
||||||
|
private Map<String,List<SAMRecordState>> currentAlignmentStart;
|
||||||
|
|
||||||
private Iterator<List<SAMRecordState>> sampleIterator;
|
private Iterator<List<SAMRecordState>> sampleIterator;
|
||||||
|
private List<SAMRecordState> currentSample;
|
||||||
|
|
||||||
private Iterator<SAMRecordState> readStateIterator;
|
private Iterator<SAMRecordState> readStateIterator;
|
||||||
private SAMRecordState nextReadState;
|
private SAMRecordState nextReadState;
|
||||||
private int readsInHanger = countReadsInHanger();
|
private int readsInHanger = countReadsInHanger();
|
||||||
|
|
||||||
{
|
{
|
||||||
pruneEmptyElementsInHanger();
|
|
||||||
alignmentStartIterator = readStatesByAlignmentStart.iterator();
|
alignmentStartIterator = readStatesByAlignmentStart.iterator();
|
||||||
sampleIterator = alignmentStartIterator.hasNext() ? alignmentStartIterator.next().values().iterator() : null;
|
currentAlignmentStart = alignmentStartIterator.hasNext() ? alignmentStartIterator.next() : null;
|
||||||
readStateIterator = (sampleIterator!=null && sampleIterator.hasNext()) ? sampleIterator.next().iterator() : 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() {
|
public boolean hasNext() {
|
||||||
|
|
@ -570,6 +575,8 @@ public class DownsamplingLocusIteratorByState extends LocusIterator {
|
||||||
if(readStateIterator == null)
|
if(readStateIterator == null)
|
||||||
throw new StingException("Attempted to remove read, but no previous read was found.");
|
throw new StingException("Attempted to remove read, but no previous read was found.");
|
||||||
readStateIterator.remove();
|
readStateIterator.remove();
|
||||||
|
if(currentSample.isEmpty()) sampleIterator.remove();
|
||||||
|
if(currentAlignmentStart.isEmpty()) alignmentStartIterator.remove();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void advance() {
|
private void advance() {
|
||||||
|
|
@ -577,12 +584,15 @@ public class DownsamplingLocusIteratorByState extends LocusIterator {
|
||||||
if(readStateIterator!=null && readStateIterator.hasNext())
|
if(readStateIterator!=null && readStateIterator.hasNext())
|
||||||
nextReadState = readStateIterator.next();
|
nextReadState = readStateIterator.next();
|
||||||
else if(sampleIterator!=null && sampleIterator.hasNext()) {
|
else if(sampleIterator!=null && sampleIterator.hasNext()) {
|
||||||
readStateIterator = sampleIterator.next().iterator();
|
currentSample = sampleIterator.next();
|
||||||
|
readStateIterator = currentSample.iterator();
|
||||||
nextReadState = readStateIterator.hasNext() ? readStateIterator.next() : null;
|
nextReadState = readStateIterator.hasNext() ? readStateIterator.next() : null;
|
||||||
}
|
}
|
||||||
else if(alignmentStartIterator!=null && alignmentStartIterator.hasNext()) {
|
else if(alignmentStartIterator!=null && alignmentStartIterator.hasNext()) {
|
||||||
sampleIterator = alignmentStartIterator.next().values().iterator();
|
currentAlignmentStart = alignmentStartIterator.next();
|
||||||
readStateIterator = sampleIterator.hasNext() ? sampleIterator.next().iterator() : null;
|
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;
|
nextReadState = (readStateIterator!=null && readStateIterator.hasNext()) ? readStateIterator.next() : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -592,7 +602,6 @@ public class DownsamplingLocusIteratorByState extends LocusIterator {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isEmpty() {
|
public boolean isEmpty() {
|
||||||
pruneEmptyElementsInHanger();
|
|
||||||
return readStatesByAlignmentStart.isEmpty();
|
return readStatesByAlignmentStart.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -610,7 +619,6 @@ public class DownsamplingLocusIteratorByState extends LocusIterator {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasNext() {
|
public boolean hasNext() {
|
||||||
pruneEmptyElementsInHanger();
|
|
||||||
return !readStatesByAlignmentStart.isEmpty() || iterator.hasNext();
|
return !readStatesByAlignmentStart.isEmpty() || iterator.hasNext();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -669,9 +677,9 @@ public class DownsamplingLocusIteratorByState extends LocusIterator {
|
||||||
|
|
||||||
addReadsToHanger(culledReadStatesBySample,sampleName,newReads,targetCoverage-readsInHanger);
|
addReadsToHanger(culledReadStatesBySample,sampleName,newReads,targetCoverage-readsInHanger);
|
||||||
}
|
}
|
||||||
|
|
||||||
readStatesByAlignmentStart.add(culledReadStatesBySample);
|
|
||||||
}
|
}
|
||||||
|
if(!culledReadStatesBySample.isEmpty())
|
||||||
|
readStatesByAlignmentStart.add(culledReadStatesBySample);
|
||||||
}
|
}
|
||||||
|
|
||||||
private ReservoirDownsampler<SAMRecord> getDownsampler(String sampleName) {
|
private ReservoirDownsampler<SAMRecord> getDownsampler(String sampleName) {
|
||||||
|
|
@ -700,6 +708,8 @@ public class DownsamplingLocusIteratorByState extends LocusIterator {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addReadsToHanger(final Map<String,List<SAMRecordState>> newHanger, final String sampleName, final Collection<SAMRecord> reads, final int maxReads) {
|
private void addReadsToHanger(final Map<String,List<SAMRecordState>> newHanger, final String sampleName, final Collection<SAMRecord> reads, final int maxReads) {
|
||||||
|
if(reads.isEmpty())
|
||||||
|
return;
|
||||||
List<SAMRecordState> hangerEntry = new LinkedList<SAMRecordState>();
|
List<SAMRecordState> hangerEntry = new LinkedList<SAMRecordState>();
|
||||||
int readCount = 0;
|
int readCount = 0;
|
||||||
for(SAMRecord read: reads) {
|
for(SAMRecord read: reads) {
|
||||||
|
|
@ -714,20 +724,6 @@ public class DownsamplingLocusIteratorByState extends LocusIterator {
|
||||||
}
|
}
|
||||||
newHanger.put(sampleName,hangerEntry);
|
newHanger.put(sampleName,hangerEntry);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void pruneEmptyElementsInHanger() {
|
|
||||||
Iterator<Map<String,List<SAMRecordState>>> hangerIterator = readStatesByAlignmentStart.iterator();
|
|
||||||
while(hangerIterator.hasNext()) {
|
|
||||||
Map<String,List<SAMRecordState>> hangerEntry = hangerIterator.next();
|
|
||||||
Iterator<List<SAMRecordState>> entryBySampleIterator = hangerEntry.values().iterator();
|
|
||||||
while(entryBySampleIterator.hasNext()) {
|
|
||||||
if(entryBySampleIterator.next().size() == 0)
|
|
||||||
entryBySampleIterator.remove();
|
|
||||||
}
|
|
||||||
if(hangerEntry.size() == 0)
|
|
||||||
hangerIterator.remove();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue