From 374c0deba20e8c33eca3e8fd054b39eef10b28b5 Mon Sep 17 00:00:00 2001 From: bthomas Date: Fri, 19 Nov 2010 19:59:05 +0000 Subject: [PATCH] Updating the core LocusWalker tools to include the Sample infrastructure that I added last month. This commit touches a lot of files, but only significantly changes a few: LocusIteratorByState and ReadBackedPileup and associated classes. git-svn-id: file:///humgen/gsa-scr1/gsa-engineering/svn_contents/trunk@4711 348d0f76-0448-11de-a6fe-93d51630548a --- .../gatk/AbstractGenomeAnalysisEngine.java | 14 +++ .../contexts/StratifiedAlignmentContext.java | 69 +++++++++-- .../sting/gatk/datasources/sample/Sample.java | 2 +- .../datasources/sample/SampleDataSource.java | 24 +++- .../gatk/executive/LinearMicroScheduler.java | 2 +- .../sting/gatk/executive/ShardTraverser.java | 2 +- .../sting/gatk/executive/WindowMaker.java | 10 +- .../gatk/iterators/LocusIteratorByState.java | 88 ++++++++------ .../walkers/annotator/VariantAnnotator.java | 4 +- .../genomicannotator/GenomicAnnotator.java | 2 +- .../genotyper/UnifiedGenotyperEngine.java | 6 +- .../phasing/ReadBackedPhasingWalker.java | 7 +- .../walkers/AlleleBalanceHistogramWalker.java | 2 +- .../walkers/MendelianViolationClassifier.java | 4 +- .../genotyper/UnifiedGenotyperEngine.java | 6 +- .../pileup/AbstractReadBackedPileup.java | 111 ++++++++++++------ .../pileup/MergingPileupElementIterator.java | 5 +- .../utils/pileup/PileupElementTracker.java | 29 +++-- .../pileup/ReadBackedExtendedEventPileup.java | 15 ++- .../ReadBackedExtendedEventPileupImpl.java | 6 +- .../sting/utils/pileup/ReadBackedPileup.java | 20 +++- .../utils/pileup/ReadBackedPileupImpl.java | 3 +- .../providers/LocusViewTemplate.java | 25 ++-- .../sample/SampleDataSourceUnitTest.java | 13 +- .../LocusIteratorByStateUnitTest.java | 5 +- .../pileup/ReadBackedPileupUnitTest.java | 7 +- 26 files changed, 325 insertions(+), 156 deletions(-) diff --git a/java/src/org/broadinstitute/sting/gatk/AbstractGenomeAnalysisEngine.java b/java/src/org/broadinstitute/sting/gatk/AbstractGenomeAnalysisEngine.java index 6b06ec97c..2f1cc00cc 100755 --- a/java/src/org/broadinstitute/sting/gatk/AbstractGenomeAnalysisEngine.java +++ b/java/src/org/broadinstitute/sting/gatk/AbstractGenomeAnalysisEngine.java @@ -320,6 +320,8 @@ public abstract class AbstractGenomeAnalysisEngine { validateSuppliedReads(); readsDataSource = createReadsDataSource(genomeLocParser); + sampleDataSource = new SampleDataSource(getSAMFileHeader(), argCollection.sampleFiles); + for (SamRecordFilter filter : filters) if (filter instanceof SamRecordHeaderFilter) ((SamRecordHeaderFilter)filter).setHeader(this.getSAMFileHeader()); @@ -744,6 +746,10 @@ public abstract class AbstractGenomeAnalysisEngine { return unpackedReads; } + public SampleDataSource getSampleMetadata() { + return this.sampleDataSource; + } + /** * Get a sample by its ID * If an alias is passed in, return the main sample object @@ -802,6 +808,14 @@ public abstract class AbstractGenomeAnalysisEngine { return sampleDataSource.getChildren(sample); } + /** + * Gets all the samples + * @return + */ + public Collection getSamples() { + return sampleDataSource.getSamples(); + } + /** * Takes a list of sample names and returns their corresponding sample objects * diff --git a/java/src/org/broadinstitute/sting/gatk/contexts/StratifiedAlignmentContext.java b/java/src/org/broadinstitute/sting/gatk/contexts/StratifiedAlignmentContext.java index a75eea37b..046d874b7 100755 --- a/java/src/org/broadinstitute/sting/gatk/contexts/StratifiedAlignmentContext.java +++ b/java/src/org/broadinstitute/sting/gatk/contexts/StratifiedAlignmentContext.java @@ -25,6 +25,8 @@ package org.broadinstitute.sting.gatk.contexts; +import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; +import org.broadinstitute.sting.gatk.datasources.sample.Sample; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.exceptions.UserException; @@ -84,7 +86,7 @@ public class StratifiedAlignmentContext { * @return a Map of sample name to StratifiedAlignmentContext * **/ - public static Map splitContextBySample(RBP pileup) { + public static Map splitContextBySample(RBP pileup) { return splitContextBySample(pileup, null); } @@ -97,20 +99,20 @@ public class StratifiedAlignmentContext { * @return a Map of sample name to StratifiedAlignmentContext * **/ - public static Map splitContextBySample(RBP pileup, String assumedSingleSample) { + public static Map splitContextBySample(RBP pileup, Sample assumedSingleSample) { GenomeLoc loc = pileup.getLocation(); - HashMap contexts = new HashMap(); + HashMap contexts = new HashMap(); - for(String sampleName: pileup.getSamples()) { - RBP pileupBySample = (RBP)pileup.getPileupForSample(sampleName); + for(Sample sample: pileup.getSamples()) { + RBP pileupBySample = (RBP)pileup.getPileupForSample(sample); // Don't add empty pileups to the split context. if(pileupBySample.size() == 0) continue; - if(sampleName != null) - contexts.put(sampleName,new StratifiedAlignmentContext(loc,pileupBySample)); + if(sample != null) + contexts.put(sample,new StratifiedAlignmentContext(loc,pileupBySample)); else { if(assumedSingleSample == null) { throw new UserException.ReadMissingReadGroup(pileupBySample.iterator().next().getRead()); @@ -122,7 +124,48 @@ public class StratifiedAlignmentContext { return contexts; } - /** + + + public static Map splitContextBySampleName(RBP pileup) { + return splitContextBySampleName(pileup, null); + } + + /** + * Splits the given AlignmentContext into a StratifiedAlignmentContext per sample, but referencd by sample name instead + * of sample object. + * + * @param pileup the original pileup + * + * @return a Map of sample name to StratifiedAlignmentContext + * + **/ + public static Map splitContextBySampleName(RBP pileup, String assumedSingleSample) { + + GenomeLoc loc = pileup.getLocation(); + HashMap contexts = new HashMap(); + + for(String sample: pileup.getSampleNames()) { + RBP pileupBySample = (RBP)pileup.getPileupForSampleName(sample); + + // Don't add empty pileups to the split context. + if(pileupBySample.size() == 0) + continue; + + if(sample != null) + contexts.put(sample,new StratifiedAlignmentContext(loc,pileupBySample)); + else { + if(assumedSingleSample == null) { + throw new UserException.ReadMissingReadGroup(pileupBySample.iterator().next().getRead()); + } + contexts.put(assumedSingleSample,new StratifiedAlignmentContext(loc,pileupBySample)); + } + } + + return contexts; + } + + + /** * Splits the given AlignmentContext into a StratifiedAlignmentContext per read group. * * @param pileup the original pileup @@ -131,14 +174,14 @@ public class StratifiedAlignmentContext { * **/ public static Map> splitContextByReadGroup(RBP pileup) { - HashMap> contexts = new HashMap>(); - for(String readGroupId: pileup.getReadGroups()) - contexts.put(readGroupId,new StratifiedAlignmentContext(pileup.getLocation(),(RBP)pileup.getPileupForReadGroup(readGroupId))); - return contexts; + HashMap> contexts = new HashMap>(); + for(String readGroupId: pileup.getReadGroups()) + contexts.put(readGroupId,new StratifiedAlignmentContext(pileup.getLocation(),(RBP)pileup.getPileupForReadGroup(readGroupId))); + return contexts; } public static AlignmentContext joinContexts(Collection contexts) { - + // validation GenomeLoc loc = contexts.iterator().next().getLocation(); boolean isExtended = contexts.iterator().next().basePileup instanceof ReadBackedExtendedEventPileup; diff --git a/java/src/org/broadinstitute/sting/gatk/datasources/sample/Sample.java b/java/src/org/broadinstitute/sting/gatk/datasources/sample/Sample.java index 09f1912c6..6a38350e9 100644 --- a/java/src/org/broadinstitute/sting/gatk/datasources/sample/Sample.java +++ b/java/src/org/broadinstitute/sting/gatk/datasources/sample/Sample.java @@ -194,6 +194,6 @@ public class Sample implements java.io.Serializable { @Override public int hashCode() { - return id.hashCode(); + return id != null ? id.hashCode() : "".hashCode(); } } diff --git a/java/src/org/broadinstitute/sting/gatk/datasources/sample/SampleDataSource.java b/java/src/org/broadinstitute/sting/gatk/datasources/sample/SampleDataSource.java index 2b7efcba4..e85ef80be 100644 --- a/java/src/org/broadinstitute/sting/gatk/datasources/sample/SampleDataSource.java +++ b/java/src/org/broadinstitute/sting/gatk/datasources/sample/SampleDataSource.java @@ -37,13 +37,13 @@ public class SampleDataSource { /** * SAMFileHeader that has been created for this analysis. */ - private final SAMFileHeader header; + private SAMFileHeader header; /** * This is where Sample objects are stored. Samples are usually accessed by their ID, which is unique, so * this is stored as a HashMap. */ - private HashMap samples = new HashMap(); + private final HashMap samples = new HashMap(); /** * Samples can have "aliases", because sometimes the same sample is referenced by different IDs in different @@ -65,6 +65,7 @@ public class SampleDataSource { * @param sampleFiles Sample files that were included on the command line */ public SampleDataSource(SAMFileHeader header, List sampleFiles) { + this(); this.header = header; // create empty sample object for each sample referenced in the SAM header for (String sampleName : SampleUtils.getSAMFileSamples(header)) { @@ -83,10 +84,14 @@ public class SampleDataSource { } } + public SampleDataSource() { + samples.put(null, new Sample(null)); + } + /** * Hallucinates sample objects for all the samples in the SAM file and stores them */ - private void getSamplesFromSAMFile() { + public void addSamplesFromSAMHeader(SAMFileHeader header) { for (String sampleName : SampleUtils.getSAMFileSamples(header)) { if (!hasSample(sampleName)) { Sample newSample = new Sample(sampleName); @@ -100,7 +105,7 @@ public class SampleDataSource { * Parse one sample file and integrate it with samples that are already there * Fail quickly if we find any errors in the file */ - private void addFile(File sampleFile) { + public void addFile(File sampleFile) { BufferedReader reader; try { @@ -466,6 +471,12 @@ public class SampleDataSource { return children; } + public Set getSamples() { + HashSet set = new HashSet(); + set.addAll(samples.values()); + return set; + } + /** * 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 @@ -572,4 +583,9 @@ public class SampleDataSource { return context.subContextFromGenotypes(genotypes.values()); } + public static SampleDataSource createEmptyDataSource() { + SAMFileHeader header = new SAMFileHeader(); + return new SampleDataSource(header, null); + } + } diff --git a/java/src/org/broadinstitute/sting/gatk/executive/LinearMicroScheduler.java b/java/src/org/broadinstitute/sting/gatk/executive/LinearMicroScheduler.java index 4290b4960..caf395730 100644 --- a/java/src/org/broadinstitute/sting/gatk/executive/LinearMicroScheduler.java +++ b/java/src/org/broadinstitute/sting/gatk/executive/LinearMicroScheduler.java @@ -53,7 +53,7 @@ public class LinearMicroScheduler extends MicroScheduler { // New experimental code for managing locus intervals. if(shard.getShardType() == Shard.ShardType.LOCUS) { LocusWalker lWalker = (LocusWalker)walker; - WindowMaker windowMaker = new WindowMaker(shard, engine.getGenomeLocParser(), getReadIterator(shard), shard.getGenomeLocs(), lWalker.getDiscards()); + WindowMaker windowMaker = new WindowMaker(shard, engine.getGenomeLocParser(), getReadIterator(shard), shard.getGenomeLocs(), lWalker.getDiscards(), engine.getSampleMetadata()); for(WindowMaker.WindowMakerIterator iterator: windowMaker) { ShardDataProvider dataProvider = new LocusShardDataProvider(shard,iterator.getSourceInfo(),engine.getGenomeLocParser(),iterator.getLocus(),iterator,reference,rods); Object result = traversalEngine.traverse(walker, dataProvider, accumulator.getReduceInit()); diff --git a/java/src/org/broadinstitute/sting/gatk/executive/ShardTraverser.java b/java/src/org/broadinstitute/sting/gatk/executive/ShardTraverser.java index cbd3e822d..16d750420 100755 --- a/java/src/org/broadinstitute/sting/gatk/executive/ShardTraverser.java +++ b/java/src/org/broadinstitute/sting/gatk/executive/ShardTraverser.java @@ -61,7 +61,7 @@ public class ShardTraverser implements Callable { Object accumulator = walker.reduceInit(); LocusWalker lWalker = (LocusWalker)walker; - WindowMaker windowMaker = new WindowMaker(shard,microScheduler.getEngine().getGenomeLocParser(),microScheduler.getReadIterator(shard),shard.getGenomeLocs(),lWalker.getDiscards()); + WindowMaker windowMaker = new WindowMaker(shard,microScheduler.getEngine().getGenomeLocParser(),microScheduler.getReadIterator(shard),shard.getGenomeLocs(),lWalker.getDiscards(), microScheduler.engine.getSampleMetadata()); // todo: microScheduler.engine is protected - is it okay to user it here? ShardDataProvider dataProvider = null; for(WindowMaker.WindowMakerIterator iterator: windowMaker) { diff --git a/java/src/org/broadinstitute/sting/gatk/executive/WindowMaker.java b/java/src/org/broadinstitute/sting/gatk/executive/WindowMaker.java index 5172079af..1044f1a40 100644 --- a/java/src/org/broadinstitute/sting/gatk/executive/WindowMaker.java +++ b/java/src/org/broadinstitute/sting/gatk/executive/WindowMaker.java @@ -1,5 +1,8 @@ package org.broadinstitute.sting.gatk.executive; +import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; +import org.broadinstitute.sting.gatk.datasources.sample.Sample; +import org.broadinstitute.sting.gatk.datasources.sample.SampleDataSource; import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.gatk.iterators.*; import org.broadinstitute.sting.gatk.ReadProperties; @@ -50,13 +53,16 @@ public class WindowMaker implements Iterable, I * the given intervals. * @param iterator The data source for this window. * @param intervals The set of intervals over which to traverse. + * @param sampleData SampleDataSource that we can reference reads with * @param discards a filter at that indicates read position relative to some locus? */ - public WindowMaker(Shard shard, GenomeLocParser genomeLocParser, StingSAMIterator iterator, List intervals, List discards ) { + + public WindowMaker(Shard shard, GenomeLocParser genomeLocParser, StingSAMIterator iterator, List intervals, List discards, SampleDataSource sampleData ) { this.sourceInfo = shard.getReadProperties(); this.readIterator = iterator; - LocusIterator locusIterator = new LocusIteratorByState(iterator,sourceInfo,genomeLocParser,discards); + LocusIterator locusIterator = new LocusIteratorByState(iterator,sourceInfo,genomeLocParser,sampleData,discards); + this.sourceIterator = new PeekableIterator(locusIterator); this.intervalIterator = intervals.size()>0 ? new PeekableIterator(intervals.iterator()) : null; diff --git a/java/src/org/broadinstitute/sting/gatk/iterators/LocusIteratorByState.java b/java/src/org/broadinstitute/sting/gatk/iterators/LocusIteratorByState.java index 659884526..fd764c775 100755 --- a/java/src/org/broadinstitute/sting/gatk/iterators/LocusIteratorByState.java +++ b/java/src/org/broadinstitute/sting/gatk/iterators/LocusIteratorByState.java @@ -33,6 +33,8 @@ import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; import org.broadinstitute.sting.gatk.DownsamplingMethod; import org.broadinstitute.sting.gatk.DownsampleType; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; +import org.broadinstitute.sting.gatk.datasources.sample.Sample; +import org.broadinstitute.sting.gatk.datasources.sample.SampleDataSource; import org.broadinstitute.sting.utils.*; import org.broadinstitute.sting.utils.exceptions.UserException; import org.broadinstitute.sting.utils.pileup.*; @@ -65,8 +67,11 @@ public class LocusIteratorByState extends LocusIterator { * Used to create new GenomeLocs. */ private final GenomeLocParser genomeLocParser; - - private final Collection sampleNames = new ArrayList(); + + private final SampleDataSource sampleData; + + private final ArrayList samples; + private final ReadStateManager readStates; static private class SAMRecordState { @@ -273,19 +278,23 @@ public class LocusIteratorByState extends LocusIterator { // constructors and other basic operations // // ----------------------------------------------------------------------------------------------------------------- - public LocusIteratorByState(final Iterator samIterator, ReadProperties readInformation, GenomeLocParser genomeLocParser ) { - this(samIterator, readInformation, genomeLocParser, NO_FILTERS); + + public LocusIteratorByState(final Iterator samIterator, ReadProperties readInformation, GenomeLocParser genomeLocParser, SampleDataSource sampleData ) { + this(samIterator, readInformation, genomeLocParser, sampleData, NO_FILTERS); } - - public LocusIteratorByState(final Iterator samIterator, ReadProperties readInformation, GenomeLocParser genomeLocParser, List filters ) { + + public LocusIteratorByState(final Iterator samIterator, ReadProperties readInformation, GenomeLocParser genomeLocParser, SampleDataSource sampleData, List filters ) { this.readInfo = readInformation; this.genomeLocParser = genomeLocParser; this.filters = filters; - // Aggregate all sample names. - sampleNames.addAll(SampleUtils.getSAMFileSamples(readInfo.getHeader())); - // Add a null sample name as a catch-all for reads without samples - if(!sampleNames.contains(null)) sampleNames.add(null); - readStates = new ReadStateManager(samIterator,readInformation.getDownsamplingMethod(),sampleNames); + + // set up the sample data + this.sampleData = sampleData; + this.samples = new ArrayList(); + this.samples.addAll(sampleData.getSamples()); + + readStates = new ReadStateManager(samIterator,readInformation.getDownsamplingMethod(),sampleData); + } public Iterator iterator() { @@ -303,8 +312,8 @@ public class LocusIteratorByState extends LocusIterator { } public void printState() { - for(String sampleName: sampleNames) { - Iterator iterator = readStates.iteratorForSample(sampleName); + for(Sample sample: samples) { + Iterator iterator = readStates.iteratorForSample(sample); while(iterator.hasNext()) { SAMRecordState state = iterator.next(); logger.debug(String.format("printState():")); @@ -354,8 +363,8 @@ public class LocusIteratorByState extends LocusIterator { // In this case, the subsequent call to next() will emit the normal pileup at the current base // and shift the position. if (readInfo.generateExtendedEvents() && hasExtendedEvents) { - Map fullExtendedEventPileup = - new HashMap(); + Map fullExtendedEventPileup = + new HashMap(); SAMRecordState our1stState = readStates.getFirst(); // get current location on the reference and decrement it by 1: the indels we just stepped over @@ -363,10 +372,10 @@ public class LocusIteratorByState extends LocusIterator { GenomeLoc loc = genomeLocParser.incPos(our1stState.getLocation(genomeLocParser),-1); boolean hasBeenSampled = false; - for(String sampleName: sampleNames) { - Iterator iterator = readStates.iteratorForSample(sampleName); + for(Sample sample: samples) { + Iterator iterator = readStates.iteratorForSample(sample); ArrayList indelPile = new ArrayList(readStates.size()); - hasBeenSampled |= loc.getStart() <= readStates.readStatesBySample.get(sampleName).getDownsamplingExtent(); + hasBeenSampled |= loc.getStart() <= readStates.readStatesBySample.get(sample).getDownsamplingExtent(); size = 0; nDeletions = 0; @@ -419,7 +428,7 @@ public class LocusIteratorByState extends LocusIterator { nMQ0Reads++; } } - if( indelPile.size() != 0 ) fullExtendedEventPileup.put(sampleName,new ReadBackedExtendedEventPileupImpl(loc,indelPile,size,maxDeletionLength,nInsertions,nDeletions,nMQ0Reads)); + if( indelPile.size() != 0 ) fullExtendedEventPileup.put(sample,new ReadBackedExtendedEventPileupImpl(loc,indelPile,size,maxDeletionLength,nInsertions,nDeletions,nMQ0Reads)); } hasExtendedEvents = false; // we are done with extended events prior to current ref base // System.out.println("Indel(s) at "+loc); @@ -427,14 +436,14 @@ public class LocusIteratorByState extends LocusIterator { nextAlignmentContext = new AlignmentContext(loc, new ReadBackedExtendedEventPileupImpl(loc, fullExtendedEventPileup), hasBeenSampled); } else { GenomeLoc location = getLocation(); - Map fullPileup = new HashMap(); + Map fullPileup = new HashMap(); // todo -- performance problem -- should be lazy, really boolean hasBeenSampled = false; - for(String sampleName: sampleNames) { - Iterator iterator = readStates.iteratorForSample(sampleName); + for(Sample sample: samples) { + Iterator iterator = readStates.iteratorForSample(sample); ArrayList pile = new ArrayList(readStates.size()); - hasBeenSampled |= location.getStart() <= readStates.readStatesBySample.get(sampleName).getDownsamplingExtent(); + hasBeenSampled |= location.getStart() <= readStates.readStatesBySample.get(sample).getDownsamplingExtent(); size = 0; nDeletions = 0; @@ -464,7 +473,7 @@ public class LocusIteratorByState extends LocusIterator { nMQ0Reads++; } } - if( pile.size() != 0 ) fullPileup.put(sampleName,new ReadBackedPileupImpl(location,pile,size,nDeletions,nMQ0Reads)); + if( pile.size() != 0 ) fullPileup.put(sample,new ReadBackedPileupImpl(location,pile,size,nDeletions,nMQ0Reads)); } updateReadStates(); // critical - must be called after we get the current state offsets and location @@ -507,8 +516,8 @@ public class LocusIteratorByState extends LocusIterator { // } private void updateReadStates() { - for(String sampleName: sampleNames) { - Iterator it = readStates.iteratorForSample(sampleName); + for(Sample sample: samples) { + Iterator it = readStates.iteratorForSample(sample); while ( it.hasNext() ) { SAMRecordState state = it.next(); CigarOperator op = state.stepForwardOnGenome(); @@ -536,13 +545,13 @@ public class LocusIteratorByState extends LocusIterator { private final SamplePartitioner samplePartitioner; - private final Map readStatesBySample = new HashMap(); + private final Map readStatesBySample = new HashMap(); private final int targetCoverage; private int totalReadStates = 0; - public ReadStateManager(Iterator source, DownsamplingMethod downsamplingMethod, Collection sampleNames) { + public ReadStateManager(Iterator source, DownsamplingMethod downsamplingMethod, SampleDataSource sampleData) { this.iterator = new PeekableIterator(source); this.downsamplingMethod = downsamplingMethod.type != null ? downsamplingMethod : DownsamplingMethod.NONE; switch(this.downsamplingMethod.type) { @@ -556,17 +565,17 @@ public class LocusIteratorByState extends LocusIterator { } Map readSelectors = new HashMap(); - for(String sampleName: sampleNames) { - readStatesBySample.put(sampleName,new PerSampleReadStateManager()); - readSelectors.put(sampleName,downsamplingMethod.type == DownsampleType.BY_SAMPLE ? new NRandomReadSelector(null,targetCoverage) : new AllReadsSelector()); + for(Sample sample: samples) { + readStatesBySample.put(sample,new PerSampleReadStateManager()); + readSelectors.put(sample.getId(),downsamplingMethod.type == DownsampleType.BY_SAMPLE ? new NRandomReadSelector(null,targetCoverage) : new AllReadsSelector()); } samplePartitioner = new SamplePartitioner(readSelectors); } - public Iterator iteratorForSample(final String sampleName) { + public Iterator iteratorForSample(final Sample sample) { return new Iterator() { - private Iterator wrappedIterator = readStatesBySample.get(sampleName).iterator(); + private Iterator wrappedIterator = readStatesBySample.get(sample).iterator(); public boolean hasNext() { return wrappedIterator.hasNext(); @@ -592,8 +601,8 @@ public class LocusIteratorByState extends LocusIterator { } public SAMRecordState getFirst() { - for(String sampleName: sampleNames) { - PerSampleReadStateManager reads = readStatesBySample.get(sampleName); + for(Sample sample: samples) { + PerSampleReadStateManager reads = readStatesBySample.get(sample); if(!reads.isEmpty()) return reads.peek(); } @@ -626,12 +635,12 @@ public class LocusIteratorByState extends LocusIterator { } samplePartitioner.complete(); - for(String sampleName: sampleNames) { - ReadSelector aggregator = samplePartitioner.getSelectedReads(sampleName); + for(Sample sample: samples) { + ReadSelector aggregator = samplePartitioner.getSelectedReads(sample.getId()); Collection newReads = new ArrayList(aggregator.getSelectedReads()); - PerSampleReadStateManager statesBySample = readStatesBySample.get(sampleName); + PerSampleReadStateManager statesBySample = readStatesBySample.get(sample); int numReads = statesBySample.size(); int downsamplingExtent = aggregator.getDownsamplingExtent(); @@ -998,6 +1007,9 @@ class NRandomReadSelector implements ReadSelector { } } +/** + * Note: stores reads by sample ID string, not by sample object + */ class SamplePartitioner implements ReadSelector { private final Map readsBySample; private long readsSeen = 0; diff --git a/java/src/org/broadinstitute/sting/gatk/walkers/annotator/VariantAnnotator.java b/java/src/org/broadinstitute/sting/gatk/walkers/annotator/VariantAnnotator.java index be80ede2f..f3b5097c6 100755 --- a/java/src/org/broadinstitute/sting/gatk/walkers/annotator/VariantAnnotator.java +++ b/java/src/org/broadinstitute/sting/gatk/walkers/annotator/VariantAnnotator.java @@ -211,9 +211,9 @@ public class VariantAnnotator extends RodWalker { Map stratifiedContexts; if ( BaseUtils.simpleBaseToBaseIndex(ref.getBase()) != -1 ) { if ( ! context.hasExtendedEventPileup() ) { - stratifiedContexts = StratifiedAlignmentContext.splitContextBySample(context.getBasePileup(), ASSUME_SINGLE_SAMPLE); + stratifiedContexts = StratifiedAlignmentContext.splitContextBySampleName(context.getBasePileup(), ASSUME_SINGLE_SAMPLE); } else { - stratifiedContexts = StratifiedAlignmentContext.splitContextBySample(context.getExtendedEventPileup(), ASSUME_SINGLE_SAMPLE); + stratifiedContexts = StratifiedAlignmentContext.splitContextBySampleName(context.getExtendedEventPileup(), ASSUME_SINGLE_SAMPLE); } if ( stratifiedContexts != null ) { annotatedVCs = engine.annotateContext(tracker, ref, stratifiedContexts, vc); diff --git a/java/src/org/broadinstitute/sting/gatk/walkers/annotator/genomicannotator/GenomicAnnotator.java b/java/src/org/broadinstitute/sting/gatk/walkers/annotator/genomicannotator/GenomicAnnotator.java index 01df8d0b9..761576c73 100644 --- a/java/src/org/broadinstitute/sting/gatk/walkers/annotator/genomicannotator/GenomicAnnotator.java +++ b/java/src/org/broadinstitute/sting/gatk/walkers/annotator/genomicannotator/GenomicAnnotator.java @@ -249,7 +249,7 @@ public class GenomicAnnotator extends RodWalker implements Tre (vc.isVariant() && !vc.isBiallelic()) ) { results.add(vc); } else { - Map stratifiedContexts = StratifiedAlignmentContext.splitContextBySample(context.getBasePileup()); + Map stratifiedContexts = StratifiedAlignmentContext.splitContextBySampleName(context.getBasePileup()); if ( stratifiedContexts != null ) results.addAll(engine.annotateContext(tracker, ref, stratifiedContexts, vc)); else diff --git a/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/UnifiedGenotyperEngine.java b/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/UnifiedGenotyperEngine.java index 573e38460..892639c77 100755 --- a/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/UnifiedGenotyperEngine.java +++ b/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/UnifiedGenotyperEngine.java @@ -150,7 +150,7 @@ public class UnifiedGenotyperEngine { return null; // stratify the AlignmentContext and cut by sample - Map stratifiedContexts = StratifiedAlignmentContext.splitContextBySample(pileup, UAC.ASSUME_SINGLE_SAMPLE); + Map stratifiedContexts = StratifiedAlignmentContext.splitContextBySampleName(pileup, UAC.ASSUME_SINGLE_SAMPLE); if ( stratifiedContexts == null ) return null; @@ -177,7 +177,7 @@ public class UnifiedGenotyperEngine { return null; // stratify the AlignmentContext and cut by sample - Map stratifiedContexts = StratifiedAlignmentContext.splitContextBySample(pileup, UAC.ASSUME_SINGLE_SAMPLE); + Map stratifiedContexts = StratifiedAlignmentContext.splitContextBySampleName(pileup, UAC.ASSUME_SINGLE_SAMPLE); if ( stratifiedContexts == null ) return null; @@ -187,7 +187,7 @@ public class UnifiedGenotyperEngine { // annotate the call, if possible if ( call != null && call.vc != null && annotationEngine != null ) { // first off, we want to use the *unfiltered* context for the annotations - stratifiedContexts = StratifiedAlignmentContext.splitContextBySample(rawContext.getBasePileup(), UAC.ASSUME_SINGLE_SAMPLE); + stratifiedContexts = StratifiedAlignmentContext.splitContextBySampleName(rawContext.getBasePileup(), UAC.ASSUME_SINGLE_SAMPLE); Collection variantContexts = annotationEngine.annotateContext(tracker, refContext, stratifiedContexts, call.vc); call.vc = variantContexts.iterator().next(); //We know the collection will always have exactly 1 element. diff --git a/java/src/org/broadinstitute/sting/gatk/walkers/phasing/ReadBackedPhasingWalker.java b/java/src/org/broadinstitute/sting/gatk/walkers/phasing/ReadBackedPhasingWalker.java index 26b8eb07f..69eb712e5 100755 --- a/java/src/org/broadinstitute/sting/gatk/walkers/phasing/ReadBackedPhasingWalker.java +++ b/java/src/org/broadinstitute/sting/gatk/walkers/phasing/ReadBackedPhasingWalker.java @@ -32,6 +32,7 @@ import org.broadinstitute.sting.commandline.Hidden; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.contexts.variantcontext.VariantContextUtils; +import org.broadinstitute.sting.gatk.datasources.sample.Sample; import org.broadinstitute.sting.gatk.filters.ZeroMappingQualityReadFilter; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.refdata.ReferenceOrderedDatum; @@ -1025,14 +1026,14 @@ public class ReadBackedPhasingWalker extends RodWalker } private HashMap getAlleleBalanceBySample(VariantContext vc, ReferenceContext ref, AlignmentContext context) { - Map sampleContext = StratifiedAlignmentContext.splitContextBySample(context.getBasePileup(),null); + Map sampleContext = StratifiedAlignmentContext.splitContextBySampleName(context.getBasePileup(),null); HashMap balances = new HashMap(); System.out.println("----- "+ref.getLocus()+" -----"); int returnedBalances = 0; diff --git a/java/src/org/broadinstitute/sting/oneoffprojects/walkers/MendelianViolationClassifier.java b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/MendelianViolationClassifier.java index 66969da79..977efff9e 100644 --- a/java/src/org/broadinstitute/sting/oneoffprojects/walkers/MendelianViolationClassifier.java +++ b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/MendelianViolationClassifier.java @@ -467,7 +467,7 @@ public class MendelianViolationClassifier extends LocusWalker splitContext = StratifiedAlignmentContext.splitContextBySample(context.getBasePileup()); + Map splitContext = StratifiedAlignmentContext.splitContextBySampleName(context.getBasePileup()); Double proportion = getAlleleProportion(parental,splitContext.get(trioStructure.child)); if ( proportion != null ) { violation.addAttribute(MendelianInfoKey.ProportionOfParentAllele.getKey(), proportion); @@ -501,7 +501,7 @@ public class MendelianViolationClassifier extends LocusWalker splitCon = StratifiedAlignmentContext.splitContextBySample(context.getBasePileup()); + Map splitCon = StratifiedAlignmentContext.splitContextBySampleName(context.getBasePileup()); Pair triAl = getTriAllelicQuality(tracker, ref, trio, splitCon); if ( triAl != null ) { violation.addAttribute(MendelianInfoKey.TriAllelicBase.getKey(),triAl.first.toString()); diff --git a/java/src/org/broadinstitute/sting/playground/gatk/walkers/genotyper/UnifiedGenotyperEngine.java b/java/src/org/broadinstitute/sting/playground/gatk/walkers/genotyper/UnifiedGenotyperEngine.java index a398bbc4a..9c1dd99bb 100755 --- a/java/src/org/broadinstitute/sting/playground/gatk/walkers/genotyper/UnifiedGenotyperEngine.java +++ b/java/src/org/broadinstitute/sting/playground/gatk/walkers/genotyper/UnifiedGenotyperEngine.java @@ -300,7 +300,7 @@ public class UnifiedGenotyperEngine { else if (rawContext.hasBasePileup()) pileup = rawContext.getBasePileup(); - stratifiedContexts = StratifiedAlignmentContext.splitContextBySample(pileup, UAC.ASSUME_SINGLE_SAMPLE); + stratifiedContexts = StratifiedAlignmentContext.splitContextBySampleName(pileup, UAC.ASSUME_SINGLE_SAMPLE); Collection variantContexts = annotationEngine.annotateContext(tracker, refContext, stratifiedContexts, vc); vc = variantContexts.iterator().next(); //We know the collection will always have exactly 1 element. @@ -330,7 +330,7 @@ public class UnifiedGenotyperEngine { return null; // stratify the AlignmentContext and cut by sample - stratifiedContexts = StratifiedAlignmentContext.splitContextBySample(pileup, UAC.ASSUME_SINGLE_SAMPLE); + stratifiedContexts = StratifiedAlignmentContext.splitContextBySampleName(pileup, UAC.ASSUME_SINGLE_SAMPLE); } else if ( UAC.GLmodel == GenotypeLikelihoodsCalculationModel.Model.SNP && !rawContext.hasExtendedEventPileup() ) { @@ -339,7 +339,7 @@ public class UnifiedGenotyperEngine { return null; // stratify the AlignmentContext and cut by sample - stratifiedContexts = StratifiedAlignmentContext.splitContextBySample(rawContext.getBasePileup(), UAC.ASSUME_SINGLE_SAMPLE); + stratifiedContexts = StratifiedAlignmentContext.splitContextBySampleName(rawContext.getBasePileup(), UAC.ASSUME_SINGLE_SAMPLE); // filter the reads (and test for bad pileups) if ( !filterPileup(stratifiedContexts, badBaseFilter) ) diff --git a/java/src/org/broadinstitute/sting/utils/pileup/AbstractReadBackedPileup.java b/java/src/org/broadinstitute/sting/utils/pileup/AbstractReadBackedPileup.java index 6ee64cabb..f50d7a5af 100644 --- a/java/src/org/broadinstitute/sting/utils/pileup/AbstractReadBackedPileup.java +++ b/java/src/org/broadinstitute/sting/utils/pileup/AbstractReadBackedPileup.java @@ -24,6 +24,7 @@ package org.broadinstitute.sting.utils.pileup; +import org.broadinstitute.sting.gatk.datasources.sample.Sample; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.BaseUtils; @@ -32,6 +33,7 @@ import org.broadinstitute.sting.gatk.iterators.IterableIterator; import java.util.*; import net.sf.samtools.SAMRecord; +import org.broadinstitute.sting.utils.exceptions.StingException; /** * A generic implementation of read-backed pileups. @@ -113,10 +115,10 @@ public abstract class AbstractReadBackedPileup> pileupsBySample) { + protected AbstractReadBackedPileup(GenomeLoc loc, Map> pileupsBySample) { this.loc = loc; PerSamplePileupElementTracker tracker = new PerSamplePileupElementTracker(); - for(Map.Entry> pileupEntry: pileupsBySample.entrySet()) { + for(Map.Entry> pileupEntry: pileupsBySample.entrySet()) { tracker.addElements(pileupEntry.getKey(),pileupEntry.getValue().pileupElementTracker); addPileupToCumulativeStats(pileupEntry.getValue()); } @@ -212,10 +214,10 @@ public abstract class AbstractReadBackedPileup tracker = (PerSamplePileupElementTracker)pileupElementTracker; PerSamplePileupElementTracker filteredTracker = new PerSamplePileupElementTracker(); - for(String sampleName: tracker.getSamples()) { - PileupElementTracker perSampleElements = tracker.getElements(sampleName); + for(Sample sample: tracker.getSamples()) { + PileupElementTracker perSampleElements = tracker.getElements(sample); AbstractReadBackedPileup pileup = createNewPileup(loc,perSampleElements).getPileupWithoutDeletions(); - filteredTracker.addElements(sampleName,pileup.pileupElementTracker); + filteredTracker.addElements(sample,pileup.pileupElementTracker); } return (RBP)createNewPileup(loc,filteredTracker); @@ -250,10 +252,10 @@ public abstract class AbstractReadBackedPileup tracker = (PerSamplePileupElementTracker)pileupElementTracker; PerSamplePileupElementTracker filteredTracker = new PerSamplePileupElementTracker(); - for(String sampleName: tracker.getSamples()) { - PileupElementTracker perSampleElements = tracker.getElements(sampleName); + for(Sample sample: tracker.getSamples()) { + PileupElementTracker perSampleElements = tracker.getElements(sample); AbstractReadBackedPileup pileup = createNewPileup(loc,perSampleElements).getOverlappingFragmentFilteredPileup(); - filteredTracker.addElements(sampleName,pileup.pileupElementTracker); + filteredTracker.addElements(sample,pileup.pileupElementTracker); } return (RBP)createNewPileup(loc,filteredTracker); } @@ -304,10 +306,10 @@ public abstract class AbstractReadBackedPileup tracker = (PerSamplePileupElementTracker)pileupElementTracker; PerSamplePileupElementTracker filteredTracker = new PerSamplePileupElementTracker(); - for(String sampleName: tracker.getSamples()) { - PileupElementTracker perSampleElements = tracker.getElements(sampleName); + for(Sample sample: tracker.getSamples()) { + PileupElementTracker perSampleElements = tracker.getElements(sample); AbstractReadBackedPileup pileup = createNewPileup(loc,perSampleElements).getPileupWithoutMappingQualityZeroReads(); - filteredTracker.addElements(sampleName,pileup.pileupElementTracker); + filteredTracker.addElements(sample,pileup.pileupElementTracker); } return (RBP)createNewPileup(loc,filteredTracker); @@ -333,10 +335,10 @@ public abstract class AbstractReadBackedPileup tracker = (PerSamplePileupElementTracker)pileupElementTracker; PerSamplePileupElementTracker filteredTracker = new PerSamplePileupElementTracker(); - for(String sampleName: tracker.getSamples()) { - PileupElementTracker perSampleElements = tracker.getElements(sampleName); + for(Sample sample: tracker.getSamples()) { + PileupElementTracker perSampleElements = tracker.getElements(sample); AbstractReadBackedPileup pileup = createNewPileup(loc,perSampleElements).getPositiveStrandPileup(); - filteredTracker.addElements(sampleName,pileup.pileupElementTracker); + filteredTracker.addElements(sample,pileup.pileupElementTracker); } return (RBP)createNewPileup(loc,filteredTracker); } @@ -362,10 +364,10 @@ public abstract class AbstractReadBackedPileup tracker = (PerSamplePileupElementTracker)pileupElementTracker; PerSamplePileupElementTracker filteredTracker = new PerSamplePileupElementTracker(); - for(String sampleName: tracker.getSamples()) { - PileupElementTracker perSampleElements = tracker.getElements(sampleName); + for(Sample sample: tracker.getSamples()) { + PileupElementTracker perSampleElements = tracker.getElements(sample); AbstractReadBackedPileup pileup = createNewPileup(loc,perSampleElements).getNegativeStrandPileup(); - filteredTracker.addElements(sampleName,pileup.pileupElementTracker); + filteredTracker.addElements(sample,pileup.pileupElementTracker); } return (RBP)createNewPileup(loc,filteredTracker); } @@ -392,10 +394,10 @@ public abstract class AbstractReadBackedPileup tracker = (PerSamplePileupElementTracker)pileupElementTracker; PerSamplePileupElementTracker filteredTracker = new PerSamplePileupElementTracker(); - for(String sampleName: tracker.getSamples()) { - PileupElementTracker perSampleElements = tracker.getElements(sampleName); + for(Sample sample: tracker.getSamples()) { + PileupElementTracker perSampleElements = tracker.getElements(sample); AbstractReadBackedPileup pileup = createNewPileup(loc,perSampleElements).getFilteredPileup(filter); - filteredTracker.addElements(sampleName,pileup.pileupElementTracker); + filteredTracker.addElements(sample,pileup.pileupElementTracker); } return (RBP)createNewPileup(loc,filteredTracker); @@ -424,10 +426,10 @@ public abstract class AbstractReadBackedPileup tracker = (PerSamplePileupElementTracker)pileupElementTracker; PerSamplePileupElementTracker filteredTracker = new PerSamplePileupElementTracker(); - for(String sampleName: tracker.getSamples()) { - PileupElementTracker perSampleElements = tracker.getElements(sampleName); + for(Sample sample: tracker.getSamples()) { + PileupElementTracker perSampleElements = tracker.getElements(sample); AbstractReadBackedPileup pileup = createNewPileup(loc,perSampleElements).getBaseAndMappingFilteredPileup(minBaseQ,minMapQ); - filteredTracker.addElements(sampleName,pileup.pileupElementTracker); + filteredTracker.addElements(sample,pileup.pileupElementTracker); } return (RBP)createNewPileup(loc,filteredTracker); @@ -491,11 +493,11 @@ public abstract class AbstractReadBackedPileup tracker = (PerSamplePileupElementTracker)pileupElementTracker; PerSamplePileupElementTracker filteredTracker = new PerSamplePileupElementTracker(); - for(String sampleName: tracker.getSamples()) { - PileupElementTracker perSampleElements = tracker.getElements(sampleName); + for(Sample sample: tracker.getSamples()) { + PileupElementTracker perSampleElements = tracker.getElements(sample); AbstractReadBackedPileup pileup = createNewPileup(loc,perSampleElements).getPileupForReadGroup(targetReadGroupId); if(pileup != null) - filteredTracker.addElements(sampleName,pileup.pileupElementTracker); + filteredTracker.addElements(sample,pileup.pileupElementTracker); } return (RBP)createNewPileup(loc,filteredTracker); @@ -517,10 +519,14 @@ public abstract class AbstractReadBackedPileup getSamples() { + public Collection getSampleNames() { if(pileupElementTracker instanceof PerSamplePileupElementTracker) { PerSamplePileupElementTracker tracker = (PerSamplePileupElementTracker)pileupElementTracker; - return tracker.getSamples(); + Collection sampleNames = new HashSet(); + for (Sample sample : tracker.getSamples()) { + sampleNames.add(sample.getId()); + } + return sampleNames; } else { Collection sampleNames = new HashSet(); @@ -533,6 +539,16 @@ public abstract class AbstractReadBackedPileup getSamples() { + if(!(pileupElementTracker instanceof PerSamplePileupElementTracker)) { + throw new StingException("Must be an instance of PerSampleElementTracker"); + } + PerSamplePileupElementTracker tracker = (PerSamplePileupElementTracker)pileupElementTracker; + return tracker.getSamples(); + } + + /** * Returns a pileup randomly downsampled to the desiredCoverage. * @@ -558,8 +574,8 @@ public abstract class AbstractReadBackedPileup perSampleElements = tracker.getElements(sampleName); + for(Sample sample: tracker.getSamples()) { + PileupElementTracker perSampleElements = tracker.getElements(sample); List filteredPileup = new ArrayList(); for(PileupElement p: perSampleElements) { @@ -569,7 +585,7 @@ public abstract class AbstractReadBackedPileup pileup = createNewPileup(loc,perSampleElements); - filteredTracker.addElements(sampleName,pileup.pileupElementTracker); + filteredTracker.addElements(sample,pileup.pileupElementTracker); } current++; @@ -593,7 +609,7 @@ public abstract class AbstractReadBackedPileup tracker = (PerSamplePileupElementTracker)pileupElementTracker; return (RBP)createNewPileup(loc,tracker.getElements(sampleName)); @@ -615,6 +631,29 @@ public abstract class AbstractReadBackedPileup tracker = (PerSamplePileupElementTracker)pileupElementTracker; + return (RBP)createNewPileup(loc,tracker.getElements(sample)); + } + else { + UnifiedPileupElementTracker filteredTracker = new UnifiedPileupElementTracker(); + for(PE p: pileupElementTracker) { + SAMRecord read = p.getRead(); + if(sample != null) { + if(read.getReadGroup() != null && sample.getId().equals(read.getReadGroup().getSample())) + filteredTracker.add(p); + } + else { + if(read.getReadGroup() == null || read.getReadGroup().getSample() == null) + filteredTracker.add(p); + } + } + return filteredTracker.size()>0 ? (RBP)createNewPileup(loc,filteredTracker) : null; + } + } + // -------------------------------------------------------- // // iterators @@ -693,8 +732,8 @@ public abstract class AbstractReadBackedPileup tracker = (PerSamplePileupElementTracker)pileupElementTracker; boolean hasSecondaryBases = false; - for(String sampleName: tracker.getSamples()) { - hasSecondaryBases |= createNewPileup(loc,tracker.getElements(sampleName)).hasSecondaryBases(); + for(Sample sample: tracker.getSamples()) { + hasSecondaryBases |= createNewPileup(loc,tracker.getElements(sample)).hasSecondaryBases(); } return hasSecondaryBases; @@ -722,8 +761,8 @@ public abstract class AbstractReadBackedPileup tracker = (PerSamplePileupElementTracker)pileupElementTracker; - for(String sampleName: tracker.getSamples()) { - int[] countsBySample = createNewPileup(loc,tracker.getElements(sampleName)).getBaseCounts(); + for(Sample sample: tracker.getSamples()) { + int[] countsBySample = createNewPileup(loc,tracker.getElements(sample)).getBaseCounts(); for(int i = 0; i < counts.length; i++) counts[i] += countsBySample[i]; } diff --git a/java/src/org/broadinstitute/sting/utils/pileup/MergingPileupElementIterator.java b/java/src/org/broadinstitute/sting/utils/pileup/MergingPileupElementIterator.java index 212fbb42a..d5db0e6fe 100644 --- a/java/src/org/broadinstitute/sting/utils/pileup/MergingPileupElementIterator.java +++ b/java/src/org/broadinstitute/sting/utils/pileup/MergingPileupElementIterator.java @@ -25,6 +25,7 @@ package org.broadinstitute.sting.utils.pileup; import net.sf.picard.util.PeekableIterator; +import org.broadinstitute.sting.gatk.datasources.sample.Sample; import java.util.PriorityQueue; import java.util.Comparator; @@ -41,8 +42,8 @@ class MergingPileupElementIterator implements Iterator public MergingPileupElementIterator(PerSamplePileupElementTracker tracker) { perSampleIterators = new PriorityQueue>(tracker.getSamples().size(),new PileupElementIteratorComparator()); - for(String sampleName: tracker.getSamples()) { - PileupElementTracker trackerPerSample = tracker.getElements(sampleName); + for(Sample sample: tracker.getSamples()) { + PileupElementTracker trackerPerSample = tracker.getElements(sample); if(trackerPerSample.size() != 0) perSampleIterators.add(new PeekableIterator(trackerPerSample.iterator())); } diff --git a/java/src/org/broadinstitute/sting/utils/pileup/PileupElementTracker.java b/java/src/org/broadinstitute/sting/utils/pileup/PileupElementTracker.java index 047f5b0ee..2f5d2672b 100644 --- a/java/src/org/broadinstitute/sting/utils/pileup/PileupElementTracker.java +++ b/java/src/org/broadinstitute/sting/utils/pileup/PileupElementTracker.java @@ -24,6 +24,8 @@ package org.broadinstitute.sting.utils.pileup; +import org.broadinstitute.sting.gatk.datasources.sample.Sample; + import java.util.*; /** @@ -58,19 +60,21 @@ class UnifiedPileupElementTracker extends PileupElemen } class PerSamplePileupElementTracker extends PileupElementTracker { - private final Map> pileup; + private final Map> pileup; + private final Map sampleNames = new HashMap(); private int size = 0; public PerSamplePileupElementTracker() { - pileup = new HashMap>(); + pileup = new HashMap>(); } - public PerSamplePileupElementTracker(Map> pileupsBySample) { - pileup = new HashMap>(); - for(Map.Entry> entry: pileupsBySample.entrySet()) { - String sampleName = entry.getKey(); + public PerSamplePileupElementTracker(Map> pileupsBySample) { + pileup = new HashMap>(); + for(Map.Entry> entry: pileupsBySample.entrySet()) { + Sample sample = entry.getKey(); AbstractReadBackedPileup pileupBySample = entry.getValue(); - pileup.put(sampleName,pileupBySample.pileupElementTracker); + pileup.put(sample,pileupBySample.pileupElementTracker); + sampleNames.put(sample.getId(), sample); } } @@ -78,16 +82,21 @@ class PerSamplePileupElementTracker extends PileupElem * Gets a list of all the samples stored in this pileup. * @return List of samples in this pileup. */ - public Collection getSamples() { + public Collection getSamples() { return pileup.keySet(); } - public PileupElementTracker getElements(final String sample) { + public PileupElementTracker getElements(final Sample sample) { return pileup.get(sample); } - public void addElements(final String sample, PileupElementTracker elements) { + public PileupElementTracker getElements(final String sampleName) { + return pileup.get(sampleNames.get(sampleName)); + } + + public void addElements(final Sample sample, PileupElementTracker elements) { pileup.put(sample,elements); + sampleNames.put(sample.getId(), sample); size += elements.size(); } diff --git a/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedExtendedEventPileup.java b/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedExtendedEventPileup.java index e36d97939..a32aa5645 100644 --- a/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedExtendedEventPileup.java +++ b/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedExtendedEventPileup.java @@ -24,6 +24,7 @@ package org.broadinstitute.sting.utils.pileup; +import org.broadinstitute.sting.gatk.datasources.sample.Sample; import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.collections.Pair; @@ -122,14 +123,20 @@ public interface ReadBackedExtendedEventPileup extends ReadBackedPileup { * Gets a list of all the samples stored in this pileup. * @return List of samples in this pileup. */ - public Collection getSamples(); + public Collection getSampleNames(); + + /** + * Gets a list of all the samples stored in this pileup. + * @return List of samples in this pileup. + */ + public Collection getSamples(); /** * Gets the particular subset of this pileup with the given sample name. - * @param sampleName Name of the sample to use. + * @param sample Name of the sample to use. * @return A subset of this pileup containing only reads with the given sample. */ - public ReadBackedExtendedEventPileup getPileupForSample(String sampleName); + public ReadBackedExtendedEventPileup getPileupForSample(Sample sample); public Iterable toExtendedIterable(); @@ -212,5 +219,5 @@ public interface ReadBackedExtendedEventPileup extends ReadBackedPileup { * Get an array of the mapping qualities * @return */ - public byte[] getMappingQuals(); + public byte[] getMappingQuals(); } diff --git a/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedExtendedEventPileupImpl.java b/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedExtendedEventPileupImpl.java index b64ef8ce0..a1a08c95f 100644 --- a/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedExtendedEventPileupImpl.java +++ b/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedExtendedEventPileupImpl.java @@ -23,6 +23,7 @@ */ package org.broadinstitute.sting.utils.pileup; +import org.broadinstitute.sting.gatk.datasources.sample.Sample; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.collections.Pair; @@ -55,7 +56,8 @@ public class ReadBackedExtendedEventPileupImpl extends AbstractReadBackedPileup< this.nInsertions = nInsertions; } - public ReadBackedExtendedEventPileupImpl(GenomeLoc loc, Map pileupElementsBySample) { + // this is the good new one + public ReadBackedExtendedEventPileupImpl(GenomeLoc loc, Map pileupElementsBySample) { super(loc,pileupElementsBySample); } @@ -221,5 +223,5 @@ public class ReadBackedExtendedEventPileupImpl extends AbstractReadBackedPileup< } else { return "-"+new String(refBases,1,length).toUpperCase(); } - } + } } \ No newline at end of file diff --git a/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedPileup.java b/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedPileup.java index ff6b2c122..f4232e7fd 100644 --- a/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedPileup.java +++ b/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedPileup.java @@ -24,6 +24,7 @@ package org.broadinstitute.sting.utils.pileup; +import org.broadinstitute.sting.gatk.datasources.sample.Sample; import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.gatk.iterators.IterableIterator; import net.sf.samtools.SAMRecord; @@ -128,18 +129,31 @@ public interface ReadBackedPileup extends Iterable { */ public ReadBackedPileup getPileupForReadGroup(String readGroupId); - /** + /** * Gets a collection of all the samples stored in this pileup. * @return Collection of samples in this pileup. */ - public Collection getSamples(); + public Collection getSamples(); + + /** + * Gets a collection of *names* of all the samples stored in this pileup. + * @return Collection of names + */ + public Collection getSampleNames(); /** * Gets the particular subset of this pileup with the given sample name. * @param sampleName Name of the sample to use. * @return A subset of this pileup containing only reads with the given sample. */ - public ReadBackedPileup getPileupForSample(String sampleName); + public ReadBackedPileup getPileupForSampleName(String sampleName); + + /** + * Gets the particular subset of this pileup with the given sample. + * @param sample Sample to use. + * @return A subset of this pileup containing only reads with the given sample. + */ + public ReadBackedPileup getPileupForSample(Sample sample); /** * Simple useful routine to count the number of deletion bases in this pileup diff --git a/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedPileupImpl.java b/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedPileupImpl.java index 4ebb13ea4..70eba577c 100644 --- a/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedPileupImpl.java +++ b/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedPileupImpl.java @@ -23,6 +23,7 @@ */ package org.broadinstitute.sting.utils.pileup; +import org.broadinstitute.sting.gatk.datasources.sample.Sample; import org.broadinstitute.sting.utils.GenomeLoc; import net.sf.samtools.SAMRecord; @@ -47,7 +48,7 @@ public class ReadBackedPileupImpl extends AbstractReadBackedPileup pileupElementsBySample) { + public ReadBackedPileupImpl(GenomeLoc loc, Map pileupElementsBySample) { super(loc,pileupElementsBySample); } diff --git a/java/test/org/broadinstitute/sting/gatk/datasources/providers/LocusViewTemplate.java b/java/test/org/broadinstitute/sting/gatk/datasources/providers/LocusViewTemplate.java index e4d478d61..aa8ac5377 100755 --- a/java/test/org/broadinstitute/sting/gatk/datasources/providers/LocusViewTemplate.java +++ b/java/test/org/broadinstitute/sting/gatk/datasources/providers/LocusViewTemplate.java @@ -7,6 +7,7 @@ import net.sf.samtools.*; import org.broadinstitute.sting.BaseTest; import org.broadinstitute.sting.gatk.ReadProperties; import org.broadinstitute.sting.gatk.executive.WindowMaker; +import org.broadinstitute.sting.gatk.datasources.sample.SampleDataSource; import org.broadinstitute.sting.gatk.datasources.shards.LocusShard; import org.broadinstitute.sting.gatk.datasources.shards.Shard; import org.broadinstitute.sting.gatk.datasources.shards.MockLocusShard; @@ -52,7 +53,7 @@ public abstract class LocusViewTemplate extends BaseTest { GenomeLoc shardBounds = genomeLocParser.createGenomeLoc("chr1", 1, 5); Shard shard = new LocusShard(new SAMDataSource(Collections.emptyList(),genomeLocParser),Collections.singletonList(shardBounds),Collections.emptyMap()); - WindowMaker windowMaker = new WindowMaker(shard,genomeLocParser,iterator,shard.getGenomeLocs(),LocusIteratorByState.NO_FILTERS); + WindowMaker windowMaker = new WindowMaker(shard,genomeLocParser,iterator,shard.getGenomeLocs(),LocusIteratorByState.NO_FILTERS, new SampleDataSource()); WindowMaker.WindowMakerIterator window = windowMaker.next(); LocusShardDataProvider dataProvider = new LocusShardDataProvider(shard, null, genomeLocParser, window.getLocus(), window, null, null); @@ -68,7 +69,7 @@ public abstract class LocusViewTemplate extends BaseTest { GenomeLoc shardBounds = genomeLocParser.createGenomeLoc("chr1", 1, 5); Shard shard = new MockLocusShard(genomeLocParser,Collections.singletonList(shardBounds)); - WindowMaker windowMaker = new WindowMaker(shard,genomeLocParser,iterator,shard.getGenomeLocs(),LocusIteratorByState.NO_FILTERS); + WindowMaker windowMaker = new WindowMaker(shard,genomeLocParser,iterator,shard.getGenomeLocs(),LocusIteratorByState.NO_FILTERS, new SampleDataSource()); WindowMaker.WindowMakerIterator window = windowMaker.next(); LocusShardDataProvider dataProvider = new LocusShardDataProvider(shard, window.getSourceInfo(), genomeLocParser, window.getLocus(), window, null, null); @@ -83,7 +84,7 @@ public abstract class LocusViewTemplate extends BaseTest { SAMRecordIterator iterator = new SAMRecordIterator(read); Shard shard = new MockLocusShard(genomeLocParser,Collections.singletonList(genomeLocParser.createGenomeLoc("chr1", 1, 10))); - WindowMaker windowMaker = new WindowMaker(shard,genomeLocParser,iterator,shard.getGenomeLocs(),LocusIteratorByState.NO_FILTERS); + WindowMaker windowMaker = new WindowMaker(shard,genomeLocParser,iterator,shard.getGenomeLocs(),LocusIteratorByState.NO_FILTERS, new SampleDataSource()); WindowMaker.WindowMakerIterator window = windowMaker.next(); LocusShardDataProvider dataProvider = new LocusShardDataProvider(shard, window.getSourceInfo(), genomeLocParser, window.getLocus(), window, null, null); LocusView view = createView(dataProvider); @@ -97,7 +98,7 @@ public abstract class LocusViewTemplate extends BaseTest { SAMRecordIterator iterator = new SAMRecordIterator(read); Shard shard = new MockLocusShard(genomeLocParser,Collections.singletonList(genomeLocParser.createGenomeLoc("chr1", 1, 10))); - WindowMaker windowMaker = new WindowMaker(shard,genomeLocParser,iterator,shard.getGenomeLocs(),LocusIteratorByState.NO_FILTERS); + WindowMaker windowMaker = new WindowMaker(shard,genomeLocParser,iterator,shard.getGenomeLocs(),LocusIteratorByState.NO_FILTERS, new SampleDataSource()); WindowMaker.WindowMakerIterator window = windowMaker.next(); LocusShardDataProvider dataProvider = new LocusShardDataProvider(shard, window.getSourceInfo(), genomeLocParser, window.getLocus(), window, null, null); LocusView view = createView(dataProvider); @@ -111,7 +112,7 @@ public abstract class LocusViewTemplate extends BaseTest { SAMRecordIterator iterator = new SAMRecordIterator(read); Shard shard = new MockLocusShard(genomeLocParser,Collections.singletonList(genomeLocParser.createGenomeLoc("chr1", 1, 10))); - WindowMaker windowMaker = new WindowMaker(shard,genomeLocParser,iterator,shard.getGenomeLocs(),LocusIteratorByState.NO_FILTERS); + WindowMaker windowMaker = new WindowMaker(shard,genomeLocParser,iterator,shard.getGenomeLocs(),LocusIteratorByState.NO_FILTERS, new SampleDataSource()); WindowMaker.WindowMakerIterator window = windowMaker.next(); LocusShardDataProvider dataProvider = new LocusShardDataProvider(shard, window.getSourceInfo(), genomeLocParser, window.getLocus(), window, null, null); LocusView view = createView(dataProvider); @@ -125,7 +126,7 @@ public abstract class LocusViewTemplate extends BaseTest { SAMRecordIterator iterator = new SAMRecordIterator(read); Shard shard = new MockLocusShard(genomeLocParser,Collections.singletonList(genomeLocParser.createGenomeLoc("chr1", 6, 15))); - WindowMaker windowMaker = new WindowMaker(shard,genomeLocParser,iterator,shard.getGenomeLocs(),LocusIteratorByState.NO_FILTERS); + WindowMaker windowMaker = new WindowMaker(shard,genomeLocParser,iterator,shard.getGenomeLocs(),LocusIteratorByState.NO_FILTERS, new SampleDataSource()); WindowMaker.WindowMakerIterator window = windowMaker.next(); LocusShardDataProvider dataProvider = new LocusShardDataProvider(shard, window.getSourceInfo(), genomeLocParser, window.getLocus(), window, null, null); LocusView view = createView(dataProvider); @@ -139,7 +140,7 @@ public abstract class LocusViewTemplate extends BaseTest { SAMRecordIterator iterator = new SAMRecordIterator(read); Shard shard = new MockLocusShard(genomeLocParser,Collections.singletonList(genomeLocParser.createGenomeLoc("chr1", 1, 10))); - WindowMaker windowMaker = new WindowMaker(shard,genomeLocParser,iterator,shard.getGenomeLocs(),LocusIteratorByState.NO_FILTERS); + WindowMaker windowMaker = new WindowMaker(shard,genomeLocParser,iterator,shard.getGenomeLocs(),LocusIteratorByState.NO_FILTERS, new SampleDataSource()); WindowMaker.WindowMakerIterator window = windowMaker.next(); LocusShardDataProvider dataProvider = new LocusShardDataProvider(shard, window.getSourceInfo(), genomeLocParser, window.getLocus(), window, null, null); LocusView view = createView(dataProvider); @@ -154,7 +155,7 @@ public abstract class LocusViewTemplate extends BaseTest { SAMRecordIterator iterator = new SAMRecordIterator(read1, read2); Shard shard = new MockLocusShard(genomeLocParser,Collections.singletonList(genomeLocParser.createGenomeLoc("chr1", 1, 10))); - WindowMaker windowMaker = new WindowMaker(shard,genomeLocParser,iterator,shard.getGenomeLocs(),LocusIteratorByState.NO_FILTERS); + WindowMaker windowMaker = new WindowMaker(shard,genomeLocParser,iterator,shard.getGenomeLocs(),LocusIteratorByState.NO_FILTERS, new SampleDataSource()); WindowMaker.WindowMakerIterator window = windowMaker.next(); LocusShardDataProvider dataProvider = new LocusShardDataProvider(shard, window.getSourceInfo(), genomeLocParser, window.getLocus(), window, null, null); LocusView view = createView(dataProvider); @@ -173,7 +174,7 @@ public abstract class LocusViewTemplate extends BaseTest { SAMRecordIterator iterator = new SAMRecordIterator(read1, read2, read3, read4); Shard shard = new MockLocusShard(genomeLocParser,Collections.singletonList(genomeLocParser.createGenomeLoc("chr1", 1, 10))); - WindowMaker windowMaker = new WindowMaker(shard,genomeLocParser,iterator,shard.getGenomeLocs(),LocusIteratorByState.NO_FILTERS); + WindowMaker windowMaker = new WindowMaker(shard,genomeLocParser,iterator,shard.getGenomeLocs(),LocusIteratorByState.NO_FILTERS, new SampleDataSource()); WindowMaker.WindowMakerIterator window = windowMaker.next(); LocusShardDataProvider dataProvider = new LocusShardDataProvider(shard, window.getSourceInfo(), genomeLocParser, window.getLocus(), window, null, null); LocusView view = createView(dataProvider); @@ -192,7 +193,7 @@ public abstract class LocusViewTemplate extends BaseTest { SAMRecordIterator iterator = new SAMRecordIterator(read1, read2, read3, read4); Shard shard = new MockLocusShard(genomeLocParser,Collections.singletonList(genomeLocParser.createGenomeLoc("chr1", 1, 10))); - WindowMaker windowMaker = new WindowMaker(shard,genomeLocParser,iterator,shard.getGenomeLocs(),LocusIteratorByState.NO_FILTERS); + WindowMaker windowMaker = new WindowMaker(shard,genomeLocParser,iterator,shard.getGenomeLocs(),LocusIteratorByState.NO_FILTERS, new SampleDataSource()); WindowMaker.WindowMakerIterator window = windowMaker.next(); LocusShardDataProvider dataProvider = new LocusShardDataProvider(shard, window.getSourceInfo(), genomeLocParser, window.getLocus(), window, null, null); LocusView view = createView(dataProvider); @@ -213,7 +214,7 @@ public abstract class LocusViewTemplate extends BaseTest { SAMRecordIterator iterator = new SAMRecordIterator(read1, read2, read3, read4, read5, read6); Shard shard = new MockLocusShard(genomeLocParser,Collections.singletonList(genomeLocParser.createGenomeLoc("chr1", 1, 10))); - WindowMaker windowMaker = new WindowMaker(shard,genomeLocParser,iterator,shard.getGenomeLocs(), LocusIteratorByState.NO_FILTERS); + WindowMaker windowMaker = new WindowMaker(shard,genomeLocParser,iterator,shard.getGenomeLocs(), LocusIteratorByState.NO_FILTERS, new SampleDataSource()); WindowMaker.WindowMakerIterator window = windowMaker.next(); LocusShardDataProvider dataProvider = new LocusShardDataProvider(shard, window.getSourceInfo(), genomeLocParser, window.getLocus(), window, null, null); LocusView view = createView(dataProvider); @@ -241,7 +242,7 @@ public abstract class LocusViewTemplate extends BaseTest { read07, read08, read09, read10, read11, read12); Shard shard = new MockLocusShard(genomeLocParser,Collections.singletonList(genomeLocParser.createGenomeLoc("chr1", 6, 15))); - WindowMaker windowMaker = new WindowMaker(shard,genomeLocParser,iterator,shard.getGenomeLocs(),LocusIteratorByState.NO_FILTERS); + WindowMaker windowMaker = new WindowMaker(shard,genomeLocParser,iterator,shard.getGenomeLocs(),LocusIteratorByState.NO_FILTERS, new SampleDataSource()); WindowMaker.WindowMakerIterator window = windowMaker.next(); LocusShardDataProvider dataProvider = new LocusShardDataProvider(shard, window.getSourceInfo(), genomeLocParser, window.getLocus(), window, null, null); LocusView view = createView(dataProvider); diff --git a/java/test/org/broadinstitute/sting/gatk/datasources/sample/SampleDataSourceUnitTest.java b/java/test/org/broadinstitute/sting/gatk/datasources/sample/SampleDataSourceUnitTest.java index 1bf71c326..8e04fd24e 100644 --- a/java/test/org/broadinstitute/sting/gatk/datasources/sample/SampleDataSourceUnitTest.java +++ b/java/test/org/broadinstitute/sting/gatk/datasources/sample/SampleDataSourceUnitTest.java @@ -39,7 +39,7 @@ public class SampleDataSourceUnitTest extends BaseTest { public void basicLoadSampleFileTest() { File sampleFile = new File(sampleFilesDir + "basicSampleFile.yaml"); SampleDataSource s = new SampleDataSource(header, makeFileList(sampleFile)); - Assert.assertTrue(s.sampleCount() == 4); + Assert.assertTrue(s.sampleCount() == 5); Sample sampleA = s.getSampleById("sampleA"); Sample sampleB = s.getSampleById("sampleB"); Assert.assertTrue(sampleB.getMother() == sampleA); @@ -78,7 +78,7 @@ public class SampleDataSourceUnitTest extends BaseTest { File sampleFile = new File(sampleFilesDir + "basicSampleFileWithAlias.yaml"); SampleDataSource s = new SampleDataSource(header, makeFileList(sampleFile)); // this file has two samples, but one has an alias. let's make sure that checks out... - Assert.assertTrue(s.sampleCount() == 2); + Assert.assertTrue(s.sampleCount() == 3); Assert.assertTrue(s.getSampleById("sampleA") == s.getSampleById("sampleC")); } @@ -129,20 +129,21 @@ public class SampleDataSourceUnitTest extends BaseTest { files.add(new File(sampleFilesDir + "basicSampleFileExt.yaml")); files.add(new File(sampleFilesDir + "basicSampleFileExt2.yaml")); SampleDataSource s = new SampleDataSource(header, files); - Assert.assertTrue(s.sampleCount() == 5); + Assert.assertTrue(s.sampleCount() == 6); Assert.assertTrue(s.getSampleById("sampleE").getProperty("propC").equals("valC")); Assert.assertTrue(s.getSampleById("sampleA").getProperty("propA").equals("valA")); } /** * testing getSamplesWithProperty - * in this file there are 4 samples - 2 with population "CEU", 1 with population "ABC", 1 with no population + * in this file there are 5 samples - 2 with population "CEU", 1 with population "ABC", 1 with no population, + * and then the default null sample */ @Test() public void getSamplesWithPropertyTest() { File sampleFile = new File(sampleFilesDir + "sampleFileWithProperties.yaml"); SampleDataSource s = new SampleDataSource(header, makeFileList(sampleFile)); - Assert.assertTrue(s.sampleCount() == 4); + Assert.assertTrue(s.sampleCount() == 5); Set ceuSamples = s.getSamplesWithProperty("population", "CEU"); Assert.assertTrue(ceuSamples.size() == 2); @@ -209,7 +210,7 @@ public class SampleDataSourceUnitTest extends BaseTest { File sampleFile = new File(sampleFilesDir + "sampleFileWithProperties.yaml"); SampleDataSource s = new SampleDataSource(header, makeFileList(sampleFile)); - Assert.assertTrue(s.sampleCount() == 4); + Assert.assertTrue(s.sampleCount() == 5); List alleleCollection = new ArrayList(); Allele a1 = Allele.create("A", true); diff --git a/java/test/org/broadinstitute/sting/gatk/iterators/LocusIteratorByStateUnitTest.java b/java/test/org/broadinstitute/sting/gatk/iterators/LocusIteratorByStateUnitTest.java index 7c8cd922b..8541f6fbf 100644 --- a/java/test/org/broadinstitute/sting/gatk/iterators/LocusIteratorByStateUnitTest.java +++ b/java/test/org/broadinstitute/sting/gatk/iterators/LocusIteratorByStateUnitTest.java @@ -9,6 +9,7 @@ import org.testng.Assert; import org.broadinstitute.sting.BaseTest; import org.broadinstitute.sting.gatk.ReadProperties; import org.broadinstitute.sting.gatk.arguments.ValidationExclusion; +import org.broadinstitute.sting.gatk.datasources.sample.SampleDataSource; import org.broadinstitute.sting.gatk.datasources.simpleDataSources.SAMReaderID; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.utils.GenomeLocParser; @@ -63,7 +64,7 @@ public class LocusIteratorByStateUnitTest extends BaseTest { List reads = Arrays.asList(before,during,after); // create the iterator by state with the fake reads and fake records - li = new LocusIteratorByState(new FakeCloseableIterator(reads.iterator()),readAttributes,genomeLocParser); + li = new LocusIteratorByState(new FakeCloseableIterator(reads.iterator()),readAttributes,genomeLocParser, new SampleDataSource()); boolean foundExtendedEventPileup = false; while (li.hasNext()) { @@ -115,7 +116,7 @@ public class LocusIteratorByStateUnitTest extends BaseTest { List reads = Arrays.asList(before,during,after); // create the iterator by state with the fake reads and fake records - li = new LocusIteratorByState(new FakeCloseableIterator(reads.iterator()),readAttributes,genomeLocParser); + li = new LocusIteratorByState(new FakeCloseableIterator(reads.iterator()),readAttributes,genomeLocParser, new SampleDataSource()); boolean foundExtendedEventPileup = false; while (li.hasNext()) { diff --git a/java/test/org/broadinstitute/sting/utils/pileup/ReadBackedPileupUnitTest.java b/java/test/org/broadinstitute/sting/utils/pileup/ReadBackedPileupUnitTest.java index cc404e7ba..c031aa2da 100644 --- a/java/test/org/broadinstitute/sting/utils/pileup/ReadBackedPileupUnitTest.java +++ b/java/test/org/broadinstitute/sting/utils/pileup/ReadBackedPileupUnitTest.java @@ -28,6 +28,7 @@ import net.sf.samtools.SAMFileHeader; import net.sf.samtools.SAMReadGroupRecord; import net.sf.samtools.SAMRecord; import org.testng.Assert; +import org.broadinstitute.sting.gatk.datasources.sample.Sample; import org.broadinstitute.sting.utils.sam.ArtificialSAMUtils; import org.testng.annotations.Test; @@ -143,9 +144,9 @@ public class ReadBackedPileupUnitTest { ReadBackedPileupImpl sample2Pileup = new ReadBackedPileupImpl(null, Arrays.asList(read2,read4), Arrays.asList(1,1)); - Map sampleToPileupMap = new HashMap(); - sampleToPileupMap.put(readGroupOne.getSample(),sample1Pileup); - sampleToPileupMap.put(readGroupTwo.getSample(),sample2Pileup); + Map sampleToPileupMap = new HashMap(); + sampleToPileupMap.put(new Sample(readGroupOne.getSample()),sample1Pileup); + sampleToPileupMap.put(new Sample(readGroupTwo.getSample()),sample2Pileup); ReadBackedPileup compositePileup = new ReadBackedPileupImpl(null,sampleToPileupMap);