LocusIteratorByState and ReadBackedPileups no long use Sample

This commit is contained in:
Mark DePristo 2011-09-29 14:52:11 -04:00
parent b3a2371925
commit 625ffb6a07
9 changed files with 59 additions and 103 deletions

View File

@ -70,7 +70,7 @@ public class WindowMaker implements Iterable<WindowMaker.WindowMakerIterator>, I
this.sourceInfo = shard.getReadProperties(); this.sourceInfo = shard.getReadProperties();
this.readIterator = iterator; this.readIterator = iterator;
this.sourceIterator = new PeekableIterator<AlignmentContext>(new LocusIteratorByState(iterator,sourceInfo,genomeLocParser,sampleData)); this.sourceIterator = new PeekableIterator<AlignmentContext>(new LocusIteratorByState(iterator,sourceInfo,genomeLocParser,sampleData.getSampleNames()));
this.intervalIterator = intervals.size()>0 ? new PeekableIterator<GenomeLoc>(intervals.iterator()) : null; this.intervalIterator = intervals.size()>0 ? new PeekableIterator<GenomeLoc>(intervals.iterator()) : null;
} }

View File

@ -35,8 +35,6 @@ import org.broadinstitute.sting.gatk.DownsampleType;
import org.broadinstitute.sting.gatk.DownsamplingMethod; import org.broadinstitute.sting.gatk.DownsamplingMethod;
import org.broadinstitute.sting.gatk.ReadProperties; import org.broadinstitute.sting.gatk.ReadProperties;
import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.AlignmentContext;
import org.broadinstitute.sting.gatk.samples.Sample;
import org.broadinstitute.sting.gatk.samples.SampleDataSource;
import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.GenomeLoc;
import org.broadinstitute.sting.utils.GenomeLocParser; import org.broadinstitute.sting.utils.GenomeLocParser;
import org.broadinstitute.sting.utils.MathUtils; import org.broadinstitute.sting.utils.MathUtils;
@ -69,7 +67,7 @@ public class LocusIteratorByState extends LocusIterator {
* Used to create new GenomeLocs. * Used to create new GenomeLocs.
*/ */
private final GenomeLocParser genomeLocParser; private final GenomeLocParser genomeLocParser;
private final ArrayList<Sample> samples; private final ArrayList<String> samples;
private final ReadStateManager readStates; private final ReadStateManager readStates;
static private class SAMRecordState { static private class SAMRecordState {
@ -278,15 +276,15 @@ public class LocusIteratorByState extends LocusIterator {
// //
// ----------------------------------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------------------------------
public LocusIteratorByState(final Iterator<SAMRecord> samIterator, ReadProperties readInformation, GenomeLocParser genomeLocParser, SampleDataSource sampleData ) { public LocusIteratorByState(final Iterator<SAMRecord> samIterator, ReadProperties readInformation, GenomeLocParser genomeLocParser, Collection<String> samples ) {
this.readInfo = readInformation; this.readInfo = readInformation;
this.genomeLocParser = genomeLocParser; this.genomeLocParser = genomeLocParser;
this.samples = new ArrayList<String>(samples);
this.readStates = new ReadStateManager(samIterator,readInformation.getDownsamplingMethod());
}
// get the list of samples public LocusIteratorByState(final Iterator<SAMRecord> samIterator, ReadProperties readInformation, GenomeLocParser genomeLocParser ) {
this.samples = new ArrayList<Sample>(sampleData.getSamples()); this(samIterator, readInformation, genomeLocParser, Collections.<String>emptySet());
readStates = new ReadStateManager(samIterator,readInformation.getDownsamplingMethod());
} }
public Iterator<AlignmentContext> iterator() { public Iterator<AlignmentContext> iterator() {
@ -303,19 +301,6 @@ public class LocusIteratorByState extends LocusIterator {
//if ( DEBUG ) System.out.printf("hasNext() = %b%n", r); //if ( DEBUG ) System.out.printf("hasNext() = %b%n", r);
} }
public void printState() {
for(Sample sample: samples) {
Iterator<SAMRecordState> iterator = readStates.iterator(sample);
while(iterator.hasNext()) {
SAMRecordState state = iterator.next();
logger.debug(String.format("printState():"));
SAMRecord read = state.getRead();
int offset = state.getReadOffset();
logger.debug(String.format(" read: %s(%d)=%s, cigar=%s", read.getReadName(), offset, (char)read.getReadBases()[offset], read.getCigarString()));
}
}
}
private GenomeLoc getLocation() { private GenomeLoc getLocation() {
return readStates.isEmpty() ? null : readStates.getFirst().getLocation(genomeLocParser); return readStates.isEmpty() ? null : readStates.getFirst().getLocation(genomeLocParser);
} }
@ -355,14 +340,14 @@ public class LocusIteratorByState extends LocusIterator {
// In this case, the subsequent call to next() will emit the normal pileup at the current base // In this case, the subsequent call to next() will emit the normal pileup at the current base
// and shift the position. // and shift the position.
if (readInfo.generateExtendedEvents() && hasExtendedEvents) { if (readInfo.generateExtendedEvents() && hasExtendedEvents) {
Map<Sample,ReadBackedExtendedEventPileupImpl> fullExtendedEventPileup = new HashMap<Sample,ReadBackedExtendedEventPileupImpl>(); Map<String,ReadBackedExtendedEventPileupImpl> fullExtendedEventPileup = new HashMap<String,ReadBackedExtendedEventPileupImpl>();
// get current location on the reference and decrement it by 1: the indels we just stepped over // get current location on the reference and decrement it by 1: the indels we just stepped over
// are associated with the *previous* reference base // are associated with the *previous* reference base
GenomeLoc loc = genomeLocParser.incPos(getLocation(),-1); GenomeLoc loc = genomeLocParser.incPos(getLocation(),-1);
boolean hasBeenSampled = false; boolean hasBeenSampled = false;
for(Sample sample: samples) { for(final String sample: samples) {
Iterator<SAMRecordState> iterator = readStates.iterator(sample); Iterator<SAMRecordState> iterator = readStates.iterator(sample);
List<ExtendedEventPileupElement> indelPile = new ArrayList<ExtendedEventPileupElement>(readStates.size(sample)); List<ExtendedEventPileupElement> indelPile = new ArrayList<ExtendedEventPileupElement>(readStates.size(sample));
hasBeenSampled |= loc.getStart() <= readStates.getDownsamplingExtent(sample); hasBeenSampled |= loc.getStart() <= readStates.getDownsamplingExtent(sample);
@ -426,10 +411,10 @@ public class LocusIteratorByState extends LocusIterator {
nextAlignmentContext = new AlignmentContext(loc, new ReadBackedExtendedEventPileupImpl(loc, fullExtendedEventPileup), hasBeenSampled); nextAlignmentContext = new AlignmentContext(loc, new ReadBackedExtendedEventPileupImpl(loc, fullExtendedEventPileup), hasBeenSampled);
} else { } else {
GenomeLoc location = getLocation(); GenomeLoc location = getLocation();
Map<Sample,ReadBackedPileupImpl> fullPileup = new HashMap<Sample,ReadBackedPileupImpl>(); Map<String,ReadBackedPileupImpl> fullPileup = new HashMap<String,ReadBackedPileupImpl>();
boolean hasBeenSampled = false; boolean hasBeenSampled = false;
for(Sample sample: samples) { for(final String sample: samples) {
Iterator<SAMRecordState> iterator = readStates.iterator(sample); Iterator<SAMRecordState> iterator = readStates.iterator(sample);
List<PileupElement> pile = new ArrayList<PileupElement>(readStates.size(sample)); List<PileupElement> pile = new ArrayList<PileupElement>(readStates.size(sample));
hasBeenSampled |= location.getStart() <= readStates.getDownsamplingExtent(sample); hasBeenSampled |= location.getStart() <= readStates.getDownsamplingExtent(sample);
@ -495,7 +480,7 @@ public class LocusIteratorByState extends LocusIterator {
} }
private void updateReadStates() { private void updateReadStates() {
for(Sample sample: samples) { for(final String sample: samples) {
Iterator<SAMRecordState> it = readStates.iterator(sample); Iterator<SAMRecordState> it = readStates.iterator(sample);
while ( it.hasNext() ) { while ( it.hasNext() ) {
SAMRecordState state = it.next(); SAMRecordState state = it.next();
@ -522,7 +507,7 @@ public class LocusIteratorByState extends LocusIterator {
private final PeekableIterator<SAMRecord> iterator; private final PeekableIterator<SAMRecord> iterator;
private final DownsamplingMethod downsamplingMethod; private final DownsamplingMethod downsamplingMethod;
private final SamplePartitioner samplePartitioner; private final SamplePartitioner samplePartitioner;
private final Map<Sample,PerSampleReadStateManager> readStatesBySample = new HashMap<Sample,PerSampleReadStateManager>(); private final Map<String,PerSampleReadStateManager> readStatesBySample = new HashMap<String,PerSampleReadStateManager>();
private final int targetCoverage; private final int targetCoverage;
private int totalReadStates = 0; private int totalReadStates = 0;
@ -540,9 +525,9 @@ public class LocusIteratorByState extends LocusIterator {
} }
Map<String,ReadSelector> readSelectors = new HashMap<String,ReadSelector>(); Map<String,ReadSelector> readSelectors = new HashMap<String,ReadSelector>();
for(Sample sample: samples) { for(final String sample: samples) {
readStatesBySample.put(sample,new PerSampleReadStateManager()); readStatesBySample.put(sample,new PerSampleReadStateManager());
readSelectors.put(sample.getID(),downsamplingMethod.type == DownsampleType.BY_SAMPLE ? new NRandomReadSelector(null,targetCoverage) : new AllReadsSelector()); readSelectors.put(sample,downsamplingMethod.type == DownsampleType.BY_SAMPLE ? new NRandomReadSelector(null,targetCoverage) : new AllReadsSelector());
} }
samplePartitioner = new SamplePartitioner(readSelectors); samplePartitioner = new SamplePartitioner(readSelectors);
@ -554,7 +539,7 @@ public class LocusIteratorByState extends LocusIterator {
* @param sample The sample. * @param sample The sample.
* @return Iterator over the reads associated with that sample. * @return Iterator over the reads associated with that sample.
*/ */
public Iterator<SAMRecordState> iterator(final Sample sample) { public Iterator<SAMRecordState> iterator(final String sample) {
return new Iterator<SAMRecordState>() { return new Iterator<SAMRecordState>() {
private Iterator<SAMRecordState> wrappedIterator = readStatesBySample.get(sample).iterator(); private Iterator<SAMRecordState> wrappedIterator = readStatesBySample.get(sample).iterator();
@ -590,7 +575,7 @@ public class LocusIteratorByState extends LocusIterator {
* @param sample The sample. * @param sample The sample.
* @return Total number of reads in the given sample. * @return Total number of reads in the given sample.
*/ */
public int size(final Sample sample) { public int size(final String sample) {
return readStatesBySample.get(sample).size(); return readStatesBySample.get(sample).size();
} }
@ -600,12 +585,12 @@ public class LocusIteratorByState extends LocusIterator {
* @param sample Sample, downsampled independently. * @param sample Sample, downsampled independently.
* @return Integer stop of the furthest undownsampled region. * @return Integer stop of the furthest undownsampled region.
*/ */
public int getDownsamplingExtent(final Sample sample) { public int getDownsamplingExtent(final String sample) {
return readStatesBySample.get(sample).getDownsamplingExtent(); return readStatesBySample.get(sample).getDownsamplingExtent();
} }
public SAMRecordState getFirst() { public SAMRecordState getFirst() {
for(Sample sample: samples) { for(final String sample: samples) {
PerSampleReadStateManager reads = readStatesBySample.get(sample); PerSampleReadStateManager reads = readStatesBySample.get(sample);
if(!reads.isEmpty()) if(!reads.isEmpty())
return reads.peek(); return reads.peek();
@ -639,8 +624,8 @@ public class LocusIteratorByState extends LocusIterator {
} }
samplePartitioner.complete(); samplePartitioner.complete();
for(Sample sample: samples) { for(final String sample: samples) {
ReadSelector aggregator = samplePartitioner.getSelectedReads(sample.getID()); ReadSelector aggregator = samplePartitioner.getSelectedReads(sample);
Collection<SAMRecord> newReads = new ArrayList<SAMRecord>(aggregator.getSelectedReads()); Collection<SAMRecord> newReads = new ArrayList<SAMRecord>(aggregator.getSelectedReads());
@ -1072,6 +1057,3 @@ class SamplePartitioner implements ReadSelector {
} }
} }

View File

@ -182,12 +182,15 @@ public class SampleDataSource {
return children; return children;
} }
public Set<Sample> getSamples() { public Collection<Sample> getSamples() {
HashSet<Sample> set = new HashSet<Sample>(); return Collections.unmodifiableCollection(samples.values());
set.addAll(samples.values());
return set;
} }
public Collection<String> getSampleNames() {
return Collections.unmodifiableCollection(samples.keySet());
}
/** /**
* Takes a collection of sample names and returns their corresponding sample objects * Takes a collection of sample names and returns their corresponding sample objects
* Note that, since a set is returned, if you pass in a list with duplicates names there will not be any duplicates in the returned set * Note that, since a set is returned, if you pass in a list with duplicates names there will not be any duplicates in the returned set

View File

@ -26,11 +26,9 @@ package org.broadinstitute.sting.utils.pileup;
import net.sf.samtools.SAMRecord; import net.sf.samtools.SAMRecord;
import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; import org.broadinstitute.sting.gatk.GenomeAnalysisEngine;
import org.broadinstitute.sting.gatk.samples.Sample;
import org.broadinstitute.sting.utils.BaseUtils; import org.broadinstitute.sting.utils.BaseUtils;
import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.GenomeLoc;
import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException;
import org.broadinstitute.sting.utils.exceptions.StingException;
import java.util.*; import java.util.*;
@ -114,10 +112,10 @@ public abstract class AbstractReadBackedPileup<RBP extends AbstractReadBackedPil
calculateCachedData(); calculateCachedData();
} }
protected AbstractReadBackedPileup(GenomeLoc loc, Map<Sample,? extends AbstractReadBackedPileup<RBP,PE>> pileupsBySample) { protected AbstractReadBackedPileup(GenomeLoc loc, Map<String,? extends AbstractReadBackedPileup<RBP,PE>> pileupsBySample) {
this.loc = loc; this.loc = loc;
PerSamplePileupElementTracker<PE> tracker = new PerSamplePileupElementTracker<PE>(); PerSamplePileupElementTracker<PE> tracker = new PerSamplePileupElementTracker<PE>();
for(Map.Entry<Sample,? extends AbstractReadBackedPileup<RBP,PE>> pileupEntry: pileupsBySample.entrySet()) { for(Map.Entry<String,? extends AbstractReadBackedPileup<RBP,PE>> pileupEntry: pileupsBySample.entrySet()) {
tracker.addElements(pileupEntry.getKey(),pileupEntry.getValue().pileupElementTracker); tracker.addElements(pileupEntry.getKey(),pileupEntry.getValue().pileupElementTracker);
addPileupToCumulativeStats(pileupEntry.getValue()); addPileupToCumulativeStats(pileupEntry.getValue());
} }
@ -213,7 +211,7 @@ public abstract class AbstractReadBackedPileup<RBP extends AbstractReadBackedPil
PerSamplePileupElementTracker<PE> tracker = (PerSamplePileupElementTracker<PE>)pileupElementTracker; PerSamplePileupElementTracker<PE> tracker = (PerSamplePileupElementTracker<PE>)pileupElementTracker;
PerSamplePileupElementTracker<PE> filteredTracker = new PerSamplePileupElementTracker<PE>(); PerSamplePileupElementTracker<PE> filteredTracker = new PerSamplePileupElementTracker<PE>();
for(Sample sample: tracker.getSamples()) { for(final String sample: tracker.getSamples()) {
PileupElementTracker<PE> perSampleElements = tracker.getElements(sample); PileupElementTracker<PE> perSampleElements = tracker.getElements(sample);
AbstractReadBackedPileup<RBP,PE> pileup = createNewPileup(loc,perSampleElements).getPileupWithoutDeletions(); AbstractReadBackedPileup<RBP,PE> pileup = createNewPileup(loc,perSampleElements).getPileupWithoutDeletions();
filteredTracker.addElements(sample,pileup.pileupElementTracker); filteredTracker.addElements(sample,pileup.pileupElementTracker);
@ -251,7 +249,7 @@ public abstract class AbstractReadBackedPileup<RBP extends AbstractReadBackedPil
PerSamplePileupElementTracker<PE> tracker = (PerSamplePileupElementTracker<PE>)pileupElementTracker; PerSamplePileupElementTracker<PE> tracker = (PerSamplePileupElementTracker<PE>)pileupElementTracker;
PerSamplePileupElementTracker<PE> filteredTracker = new PerSamplePileupElementTracker<PE>(); PerSamplePileupElementTracker<PE> filteredTracker = new PerSamplePileupElementTracker<PE>();
for(Sample sample: tracker.getSamples()) { for(final String sample: tracker.getSamples()) {
PileupElementTracker<PE> perSampleElements = tracker.getElements(sample); PileupElementTracker<PE> perSampleElements = tracker.getElements(sample);
AbstractReadBackedPileup<RBP,PE> pileup = createNewPileup(loc,perSampleElements).getOverlappingFragmentFilteredPileup(); AbstractReadBackedPileup<RBP,PE> pileup = createNewPileup(loc,perSampleElements).getOverlappingFragmentFilteredPileup();
filteredTracker.addElements(sample,pileup.pileupElementTracker); filteredTracker.addElements(sample,pileup.pileupElementTracker);
@ -305,7 +303,7 @@ public abstract class AbstractReadBackedPileup<RBP extends AbstractReadBackedPil
PerSamplePileupElementTracker<PE> tracker = (PerSamplePileupElementTracker<PE>)pileupElementTracker; PerSamplePileupElementTracker<PE> tracker = (PerSamplePileupElementTracker<PE>)pileupElementTracker;
PerSamplePileupElementTracker<PE> filteredTracker = new PerSamplePileupElementTracker<PE>(); PerSamplePileupElementTracker<PE> filteredTracker = new PerSamplePileupElementTracker<PE>();
for(Sample sample: tracker.getSamples()) { for(final String sample: tracker.getSamples()) {
PileupElementTracker<PE> perSampleElements = tracker.getElements(sample); PileupElementTracker<PE> perSampleElements = tracker.getElements(sample);
AbstractReadBackedPileup<RBP,PE> pileup = createNewPileup(loc,perSampleElements).getPileupWithoutMappingQualityZeroReads(); AbstractReadBackedPileup<RBP,PE> pileup = createNewPileup(loc,perSampleElements).getPileupWithoutMappingQualityZeroReads();
filteredTracker.addElements(sample,pileup.pileupElementTracker); filteredTracker.addElements(sample,pileup.pileupElementTracker);
@ -334,7 +332,7 @@ public abstract class AbstractReadBackedPileup<RBP extends AbstractReadBackedPil
PerSamplePileupElementTracker<PE> tracker = (PerSamplePileupElementTracker<PE>)pileupElementTracker; PerSamplePileupElementTracker<PE> tracker = (PerSamplePileupElementTracker<PE>)pileupElementTracker;
PerSamplePileupElementTracker<PE> filteredTracker = new PerSamplePileupElementTracker<PE>(); PerSamplePileupElementTracker<PE> filteredTracker = new PerSamplePileupElementTracker<PE>();
for(Sample sample: tracker.getSamples()) { for(final String sample: tracker.getSamples()) {
PileupElementTracker<PE> perSampleElements = tracker.getElements(sample); PileupElementTracker<PE> perSampleElements = tracker.getElements(sample);
AbstractReadBackedPileup<RBP,PE> pileup = createNewPileup(loc,perSampleElements).getPositiveStrandPileup(); AbstractReadBackedPileup<RBP,PE> pileup = createNewPileup(loc,perSampleElements).getPositiveStrandPileup();
filteredTracker.addElements(sample,pileup.pileupElementTracker); filteredTracker.addElements(sample,pileup.pileupElementTracker);
@ -363,7 +361,7 @@ public abstract class AbstractReadBackedPileup<RBP extends AbstractReadBackedPil
PerSamplePileupElementTracker<PE> tracker = (PerSamplePileupElementTracker<PE>)pileupElementTracker; PerSamplePileupElementTracker<PE> tracker = (PerSamplePileupElementTracker<PE>)pileupElementTracker;
PerSamplePileupElementTracker<PE> filteredTracker = new PerSamplePileupElementTracker<PE>(); PerSamplePileupElementTracker<PE> filteredTracker = new PerSamplePileupElementTracker<PE>();
for(Sample sample: tracker.getSamples()) { for(final String sample: tracker.getSamples()) {
PileupElementTracker<PE> perSampleElements = tracker.getElements(sample); PileupElementTracker<PE> perSampleElements = tracker.getElements(sample);
AbstractReadBackedPileup<RBP,PE> pileup = createNewPileup(loc,perSampleElements).getNegativeStrandPileup(); AbstractReadBackedPileup<RBP,PE> pileup = createNewPileup(loc,perSampleElements).getNegativeStrandPileup();
filteredTracker.addElements(sample,pileup.pileupElementTracker); filteredTracker.addElements(sample,pileup.pileupElementTracker);
@ -393,7 +391,7 @@ public abstract class AbstractReadBackedPileup<RBP extends AbstractReadBackedPil
PerSamplePileupElementTracker<PE> tracker = (PerSamplePileupElementTracker<PE>)pileupElementTracker; PerSamplePileupElementTracker<PE> tracker = (PerSamplePileupElementTracker<PE>)pileupElementTracker;
PerSamplePileupElementTracker<PE> filteredTracker = new PerSamplePileupElementTracker<PE>(); PerSamplePileupElementTracker<PE> filteredTracker = new PerSamplePileupElementTracker<PE>();
for(Sample sample: tracker.getSamples()) { for(final String sample: tracker.getSamples()) {
PileupElementTracker<PE> perSampleElements = tracker.getElements(sample); PileupElementTracker<PE> perSampleElements = tracker.getElements(sample);
AbstractReadBackedPileup<RBP,PE> pileup = createNewPileup(loc,perSampleElements).getFilteredPileup(filter); AbstractReadBackedPileup<RBP,PE> pileup = createNewPileup(loc,perSampleElements).getFilteredPileup(filter);
filteredTracker.addElements(sample,pileup.pileupElementTracker); filteredTracker.addElements(sample,pileup.pileupElementTracker);
@ -425,7 +423,7 @@ public abstract class AbstractReadBackedPileup<RBP extends AbstractReadBackedPil
PerSamplePileupElementTracker<PE> tracker = (PerSamplePileupElementTracker<PE>)pileupElementTracker; PerSamplePileupElementTracker<PE> tracker = (PerSamplePileupElementTracker<PE>)pileupElementTracker;
PerSamplePileupElementTracker<PE> filteredTracker = new PerSamplePileupElementTracker<PE>(); PerSamplePileupElementTracker<PE> filteredTracker = new PerSamplePileupElementTracker<PE>();
for(Sample sample: tracker.getSamples()) { for(final String sample: tracker.getSamples()) {
PileupElementTracker<PE> perSampleElements = tracker.getElements(sample); PileupElementTracker<PE> perSampleElements = tracker.getElements(sample);
AbstractReadBackedPileup<RBP,PE> pileup = createNewPileup(loc,perSampleElements).getBaseAndMappingFilteredPileup(minBaseQ,minMapQ); AbstractReadBackedPileup<RBP,PE> pileup = createNewPileup(loc,perSampleElements).getBaseAndMappingFilteredPileup(minBaseQ,minMapQ);
filteredTracker.addElements(sample,pileup.pileupElementTracker); filteredTracker.addElements(sample,pileup.pileupElementTracker);
@ -492,7 +490,7 @@ public abstract class AbstractReadBackedPileup<RBP extends AbstractReadBackedPil
PerSamplePileupElementTracker<PE> tracker = (PerSamplePileupElementTracker<PE>)pileupElementTracker; PerSamplePileupElementTracker<PE> tracker = (PerSamplePileupElementTracker<PE>)pileupElementTracker;
PerSamplePileupElementTracker<PE> filteredTracker = new PerSamplePileupElementTracker<PE>(); PerSamplePileupElementTracker<PE> filteredTracker = new PerSamplePileupElementTracker<PE>();
for(Sample sample: tracker.getSamples()) { for(final String sample: tracker.getSamples()) {
PileupElementTracker<PE> perSampleElements = tracker.getElements(sample); PileupElementTracker<PE> perSampleElements = tracker.getElements(sample);
AbstractReadBackedPileup<RBP,PE> pileup = createNewPileup(loc,perSampleElements).getPileupForReadGroup(targetReadGroupId); AbstractReadBackedPileup<RBP,PE> pileup = createNewPileup(loc,perSampleElements).getPileupForReadGroup(targetReadGroupId);
if(pileup != null) if(pileup != null)
@ -523,7 +521,7 @@ public abstract class AbstractReadBackedPileup<RBP extends AbstractReadBackedPil
PerSamplePileupElementTracker<PE> tracker = (PerSamplePileupElementTracker<PE>)pileupElementTracker; PerSamplePileupElementTracker<PE> tracker = (PerSamplePileupElementTracker<PE>)pileupElementTracker;
PerSamplePileupElementTracker<PE> filteredTracker = new PerSamplePileupElementTracker<PE>(); PerSamplePileupElementTracker<PE> filteredTracker = new PerSamplePileupElementTracker<PE>();
for(Sample sample: tracker.getSamples()) { for(final String sample: tracker.getSamples()) {
PileupElementTracker<PE> perSampleElements = tracker.getElements(sample); PileupElementTracker<PE> perSampleElements = tracker.getElements(sample);
AbstractReadBackedPileup<RBP,PE> pileup = createNewPileup(loc,perSampleElements).getPileupForLane(laneID); AbstractReadBackedPileup<RBP,PE> pileup = createNewPileup(loc,perSampleElements).getPileupForLane(laneID);
if(pileup != null) if(pileup != null)
@ -553,11 +551,7 @@ public abstract class AbstractReadBackedPileup<RBP extends AbstractReadBackedPil
public Collection<String> getSampleNames() { public Collection<String> getSampleNames() {
if(pileupElementTracker instanceof PerSamplePileupElementTracker) { if(pileupElementTracker instanceof PerSamplePileupElementTracker) {
PerSamplePileupElementTracker<PE> tracker = (PerSamplePileupElementTracker<PE>)pileupElementTracker; PerSamplePileupElementTracker<PE> tracker = (PerSamplePileupElementTracker<PE>)pileupElementTracker;
Collection<String> sampleNames = new HashSet<String>(); return new HashSet<String>(tracker.getSamples());
for (Sample sample : tracker.getSamples()) {
sampleNames.add(sample.getID());
}
return sampleNames;
} }
else { else {
Collection<String> sampleNames = new HashSet<String>(); Collection<String> sampleNames = new HashSet<String>();
@ -594,7 +588,7 @@ public abstract class AbstractReadBackedPileup<RBP extends AbstractReadBackedPil
int current = 0; int current = 0;
for(Sample sample: tracker.getSamples()) { for(final String sample: tracker.getSamples()) {
PileupElementTracker<PE> perSampleElements = tracker.getElements(sample); PileupElementTracker<PE> perSampleElements = tracker.getElements(sample);
List<PileupElement> filteredPileup = new ArrayList<PileupElement>(); List<PileupElement> filteredPileup = new ArrayList<PileupElement>();
@ -767,7 +761,7 @@ public abstract class AbstractReadBackedPileup<RBP extends AbstractReadBackedPil
if(pileupElementTracker instanceof PerSamplePileupElementTracker) { if(pileupElementTracker instanceof PerSamplePileupElementTracker) {
PerSamplePileupElementTracker<PE> tracker = (PerSamplePileupElementTracker<PE>)pileupElementTracker; PerSamplePileupElementTracker<PE> tracker = (PerSamplePileupElementTracker<PE>)pileupElementTracker;
for(Sample sample: tracker.getSamples()) { for(final String sample: tracker.getSamples()) {
int[] countsBySample = createNewPileup(loc,tracker.getElements(sample)).getBaseCounts(); int[] countsBySample = createNewPileup(loc,tracker.getElements(sample)).getBaseCounts();
for(int i = 0; i < counts.length; i++) for(int i = 0; i < counts.length; i++)
counts[i] += countsBySample[i]; counts[i] += countsBySample[i];

View File

@ -25,7 +25,6 @@
package org.broadinstitute.sting.utils.pileup; package org.broadinstitute.sting.utils.pileup;
import net.sf.picard.util.PeekableIterator; import net.sf.picard.util.PeekableIterator;
import org.broadinstitute.sting.gatk.samples.Sample;
import java.util.Comparator; import java.util.Comparator;
import java.util.Iterator; import java.util.Iterator;
@ -42,7 +41,7 @@ class MergingPileupElementIterator<PE extends PileupElement> implements Iterator
public MergingPileupElementIterator(PerSamplePileupElementTracker<PE> tracker) { public MergingPileupElementIterator(PerSamplePileupElementTracker<PE> tracker) {
perSampleIterators = new PriorityQueue<PeekableIterator<PE>>(Math.max(1,tracker.getSamples().size()),new PileupElementIteratorComparator()); perSampleIterators = new PriorityQueue<PeekableIterator<PE>>(Math.max(1,tracker.getSamples().size()),new PileupElementIteratorComparator());
for(Sample sample: tracker.getSamples()) { for(final String sample: tracker.getSamples()) {
PileupElementTracker<PE> trackerPerSample = tracker.getElements(sample); PileupElementTracker<PE> trackerPerSample = tracker.getElements(sample);
if(trackerPerSample.size() != 0) if(trackerPerSample.size() != 0)
perSampleIterators.add(new PeekableIterator<PE>(trackerPerSample.iterator())); perSampleIterators.add(new PeekableIterator<PE>(trackerPerSample.iterator()));

View File

@ -24,8 +24,6 @@
package org.broadinstitute.sting.utils.pileup; package org.broadinstitute.sting.utils.pileup;
import org.broadinstitute.sting.gatk.samples.Sample;
import java.util.*; import java.util.*;
/** /**
@ -60,52 +58,35 @@ class UnifiedPileupElementTracker<PE extends PileupElement> extends PileupElemen
} }
class PerSamplePileupElementTracker<PE extends PileupElement> extends PileupElementTracker<PE> { class PerSamplePileupElementTracker<PE extends PileupElement> extends PileupElementTracker<PE> {
private final Map<Sample,PileupElementTracker<PE>> pileup; private final Map<String,PileupElementTracker<PE>> pileup;
private final Map<String, Sample> sampleNames = new HashMap<String, Sample>();
private int size = 0; private int size = 0;
public PerSamplePileupElementTracker() { public PerSamplePileupElementTracker() {
pileup = new HashMap<Sample,PileupElementTracker<PE>>(); pileup = new HashMap<String,PileupElementTracker<PE>>();
}
public PerSamplePileupElementTracker(Map<Sample,AbstractReadBackedPileup<?,PE>> pileupsBySample) {
pileup = new HashMap<Sample,PileupElementTracker<PE>>();
for(Map.Entry<Sample,AbstractReadBackedPileup<?,PE>> entry: pileupsBySample.entrySet()) {
Sample sample = entry.getKey();
AbstractReadBackedPileup<?,PE> pileupBySample = entry.getValue();
pileup.put(sample,pileupBySample.pileupElementTracker);
sampleNames.put(sample.getID(), sample);
}
} }
/** /**
* Gets a list of all the samples stored in this pileup. * Gets a list of all the samples stored in this pileup.
* @return List of samples in this pileup. * @return List of samples in this pileup.
*/ */
public Collection<Sample> getSamples() { public Collection<String> getSamples() {
return pileup.keySet(); return pileup.keySet();
} }
public PileupElementTracker<PE> getElements(final Sample sample) { public PileupElementTracker<PE> getElements(final String sample) {
return pileup.get(sample); return pileup.get(sample);
} }
public PileupElementTracker<PE> getElements(final String sampleName) {
return pileup.get(sampleNames.get(sampleName));
}
public PileupElementTracker<PE> getElements(final Collection<String> selectSampleNames) { public PileupElementTracker<PE> getElements(final Collection<String> selectSampleNames) {
PerSamplePileupElementTracker<PE> result = new PerSamplePileupElementTracker<PE>(); PerSamplePileupElementTracker<PE> result = new PerSamplePileupElementTracker<PE>();
for (String sample : selectSampleNames) { for (final String sample : selectSampleNames) {
Sample sampleObject = sampleNames.get(sample); result.addElements(sample, pileup.get(sample));
result.addElements(sampleObject, pileup.get(sampleObject));
} }
return result; return result;
} }
public void addElements(final Sample sample, PileupElementTracker<PE> elements) { public void addElements(final String sample, PileupElementTracker<PE> elements) {
pileup.put(sample,elements); pileup.put(sample,elements);
sampleNames.put(sample.getID(), sample);
size += elements.size(); size += elements.size();
} }

View File

@ -24,7 +24,6 @@
package org.broadinstitute.sting.utils.pileup; package org.broadinstitute.sting.utils.pileup;
import net.sf.samtools.SAMRecord; import net.sf.samtools.SAMRecord;
import org.broadinstitute.sting.gatk.samples.Sample;
import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.GenomeLoc;
import org.broadinstitute.sting.utils.collections.Pair; import org.broadinstitute.sting.utils.collections.Pair;
import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException;
@ -56,7 +55,7 @@ public class ReadBackedExtendedEventPileupImpl extends AbstractReadBackedPileup<
} }
// this is the good new one // this is the good new one
public ReadBackedExtendedEventPileupImpl(GenomeLoc loc, Map<Sample,? extends ReadBackedExtendedEventPileupImpl> pileupElementsBySample) { public ReadBackedExtendedEventPileupImpl(GenomeLoc loc, Map<String,? extends ReadBackedExtendedEventPileupImpl> pileupElementsBySample) {
super(loc,pileupElementsBySample); super(loc,pileupElementsBySample);
} }

View File

@ -24,7 +24,6 @@
package org.broadinstitute.sting.utils.pileup; package org.broadinstitute.sting.utils.pileup;
import net.sf.samtools.SAMRecord; import net.sf.samtools.SAMRecord;
import org.broadinstitute.sting.gatk.samples.Sample;
import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.GenomeLoc;
import java.util.List; import java.util.List;
@ -48,7 +47,7 @@ public class ReadBackedPileupImpl extends AbstractReadBackedPileup<ReadBackedPil
super(loc,pileupElements); super(loc,pileupElements);
} }
public ReadBackedPileupImpl(GenomeLoc loc, Map<Sample,ReadBackedPileupImpl> pileupElementsBySample) { public ReadBackedPileupImpl(GenomeLoc loc, Map<String,ReadBackedPileupImpl> pileupElementsBySample) {
super(loc,pileupElementsBySample); super(loc,pileupElementsBySample);
} }

View File

@ -28,7 +28,6 @@ import java.util.*;
* testing of the LocusIteratorByState * testing of the LocusIteratorByState
*/ */
public class LocusIteratorByStateUnitTest extends BaseTest { public class LocusIteratorByStateUnitTest extends BaseTest {
private final int MAX_READS = 10; private final int MAX_READS = 10;
private static SAMFileHeader header; private static SAMFileHeader header;
private LocusIteratorByState li; private LocusIteratorByState li;
@ -67,7 +66,7 @@ public class LocusIteratorByStateUnitTest extends BaseTest {
List<SAMRecord> reads = Arrays.asList(before,during,after); List<SAMRecord> reads = Arrays.asList(before,during,after);
// create the iterator by state with the fake reads and fake records // create the iterator by state with the fake reads and fake records
li = new LocusIteratorByState(new FakeCloseableIterator<SAMRecord>(reads.iterator()),readAttributes,genomeLocParser, new SampleDataSource()); li = new LocusIteratorByState(new FakeCloseableIterator<SAMRecord>(reads.iterator()),readAttributes,genomeLocParser);
boolean foundExtendedEventPileup = false; boolean foundExtendedEventPileup = false;
while (li.hasNext()) { while (li.hasNext()) {
@ -119,7 +118,7 @@ public class LocusIteratorByStateUnitTest extends BaseTest {
List<SAMRecord> reads = Arrays.asList(before,during,after); List<SAMRecord> reads = Arrays.asList(before,during,after);
// create the iterator by state with the fake reads and fake records // create the iterator by state with the fake reads and fake records
li = new LocusIteratorByState(new FakeCloseableIterator<SAMRecord>(reads.iterator()),readAttributes,genomeLocParser, new SampleDataSource()); li = new LocusIteratorByState(new FakeCloseableIterator<SAMRecord>(reads.iterator()),readAttributes,genomeLocParser);
boolean foundExtendedEventPileup = false; boolean foundExtendedEventPileup = false;
while (li.hasNext()) { while (li.hasNext()) {
@ -153,7 +152,7 @@ public class LocusIteratorByStateUnitTest extends BaseTest {
List<SAMRecord> reads = Arrays.asList(indelOnlyRead); List<SAMRecord> reads = Arrays.asList(indelOnlyRead);
// create the iterator by state with the fake reads and fake records // create the iterator by state with the fake reads and fake records
li = new LocusIteratorByState(new FakeCloseableIterator<SAMRecord>(reads.iterator()),readAttributes,genomeLocParser,new SampleDataSource()); li = new LocusIteratorByState(new FakeCloseableIterator<SAMRecord>(reads.iterator()),readAttributes,genomeLocParser);
// Traditionally, reads that end with indels bleed into the pileup at the following locus. Verify that the next pileup contains this read // Traditionally, reads that end with indels bleed into the pileup at the following locus. Verify that the next pileup contains this read
// and considers it to be an indel-containing read. // and considers it to be an indel-containing read.
@ -166,7 +165,7 @@ public class LocusIteratorByStateUnitTest extends BaseTest {
// Turn on extended events, and make sure the event is found. // Turn on extended events, and make sure the event is found.
JVMUtils.setFieldValue(JVMUtils.findField(ReadProperties.class,"generateExtendedEvents"),readAttributes,true); JVMUtils.setFieldValue(JVMUtils.findField(ReadProperties.class,"generateExtendedEvents"),readAttributes,true);
li = new LocusIteratorByState(new FakeCloseableIterator<SAMRecord>(reads.iterator()),readAttributes,genomeLocParser,new SampleDataSource()); li = new LocusIteratorByState(new FakeCloseableIterator<SAMRecord>(reads.iterator()),readAttributes,genomeLocParser);
Assert.assertTrue(li.hasNext(),"LocusIteratorByState with extended events should contain exactly one pileup"); Assert.assertTrue(li.hasNext(),"LocusIteratorByState with extended events should contain exactly one pileup");
alignmentContext = li.next(); alignmentContext = li.next();
@ -202,7 +201,7 @@ public class LocusIteratorByStateUnitTest extends BaseTest {
List<SAMRecord> reads = Arrays.asList(leadingRead,indelOnlyRead,fullMatchAfterIndel); List<SAMRecord> reads = Arrays.asList(leadingRead,indelOnlyRead,fullMatchAfterIndel);
// create the iterator by state with the fake reads and fake records // create the iterator by state with the fake reads and fake records
li = new LocusIteratorByState(new FakeCloseableIterator<SAMRecord>(reads.iterator()),createTestReadProperties(),genomeLocParser,new SampleDataSource()); li = new LocusIteratorByState(new FakeCloseableIterator<SAMRecord>(reads.iterator()),createTestReadProperties(),genomeLocParser);
int currentLocus = firstLocus; int currentLocus = firstLocus;
int numAlignmentContextsFound = 0; int numAlignmentContextsFound = 0;
@ -259,7 +258,7 @@ public class LocusIteratorByStateUnitTest extends BaseTest {
List<SAMRecord> reads = Arrays.asList(leadingRead,indelOnlyRead,fullMatchAfterIndel); List<SAMRecord> reads = Arrays.asList(leadingRead,indelOnlyRead,fullMatchAfterIndel);
// create the iterator by state with the fake reads and fake records // create the iterator by state with the fake reads and fake records
li = new LocusIteratorByState(new FakeCloseableIterator<SAMRecord>(reads.iterator()),readAttributes,genomeLocParser,new SampleDataSource()); li = new LocusIteratorByState(new FakeCloseableIterator<SAMRecord>(reads.iterator()),readAttributes,genomeLocParser);
Assert.assertTrue(li.hasNext(),"Missing first locus at " + firstLocus); Assert.assertTrue(li.hasNext(),"Missing first locus at " + firstLocus);
AlignmentContext alignmentContext = li.next(); AlignmentContext alignmentContext = li.next();