diff --git a/java/src/org/broadinstitute/sting/gatk/datasources/simpleDataSources/SAMDataSource.java b/java/src/org/broadinstitute/sting/gatk/datasources/simpleDataSources/SAMDataSource.java index 99dd4cb6b..efaf470b4 100755 --- a/java/src/org/broadinstitute/sting/gatk/datasources/simpleDataSources/SAMDataSource.java +++ b/java/src/org/broadinstitute/sting/gatk/datasources/simpleDataSources/SAMDataSource.java @@ -45,7 +45,7 @@ import java.util.List; * User: aaron * Date: Mar 26, 2009 * Time: 2:36:16 PM - * + *

* Converts shards to SAM iterators over the specified region */ public class SAMDataSource implements SimpleDataSource { @@ -76,12 +76,9 @@ public class SAMDataSource implements SimpleDataSource { /** * constructor, given sam files * - * @param reads the list of sam files - * @param byReads are we a by reads traversal, or a loci traversal. We could delete this field - * if we passed in iterGen, which would be a better (although more complicated for the - * consumers of SAMDataSources). + * @param reads the list of sam files */ - public SAMDataSource( Reads reads, boolean byReads ) throws SimpleDataSourceLoadException { + public SAMDataSource( Reads reads ) throws SimpleDataSourceLoadException { this.reads = reads; // check the length @@ -93,7 +90,7 @@ public class SAMDataSource implements SimpleDataSource { throw new SimpleDataSourceLoadException("SAMDataSource: Unable to load file: " + smFile.getName()); } } - iteratorPool = new SAMIteratorPool(reads, byReads); + iteratorPool = new SAMIteratorPool(reads); } /** @@ -116,19 +113,20 @@ public class SAMDataSource implements SimpleDataSource { * @return an iterator for that region */ public StingSAMIterator seekLocus( GenomeLoc location ) throws SimpleDataSourceLoadException { - return iteratorPool.iterator( new MappedStreamSegment(location) ); + return iteratorPool.iterator(new MappedStreamSegment(location)); } /** - *

- * seek - *

- * + * * @param shard the shard to get data for * * @return an iterator for that region */ public StingSAMIterator seek( Shard shard ) throws SimpleDataSourceLoadException { + // setup the iterator pool if it's not setup + boolean queryOverlapping = ( shard.getShardType() == Shard.ShardType.READ ) ? false : true; + iteratorPool.setQueryOverlapping(queryOverlapping); + StingSAMIterator iterator = null; if (shard.getShardType() == Shard.ShardType.READ) { iterator = seekRead((ReadShard) shard); @@ -186,15 +184,15 @@ public class SAMDataSource implements SimpleDataSource { iter = fastMappedReadSeek(shard.getSize(), StingSAMIteratorAdapter.adapt(reads, iteratorPool.iterator(new MappedStreamSegment(lastReadPos)))); } - if( intoUnmappedReads && !includeUnmappedReads ) + if (intoUnmappedReads && !includeUnmappedReads) shard.signalDone(); } if (intoUnmappedReads && includeUnmappedReads) { - if( iter != null ) + if (iter != null) iter.close(); - iter = toUnmappedReads( shard.getSize() ); - if( !iter.hasNext() ) + iter = toUnmappedReads(shard.getSize()); + if (!iter.hasNext()) shard.signalDone(); } @@ -214,12 +212,14 @@ public class SAMDataSource implements SimpleDataSource { } /** - * Retrieve unmapped reads. + * Retrieve unmapped reads. + * * @param readCount how many reads to retrieve + * * @return the bounded iterator that you can use to get the intervaled reads from */ - StingSAMIterator toUnmappedReads( long readCount ) { - StingSAMIterator iter = iteratorPool.iterator( new UnmappedStreamSegment( readsTaken,readCount) ); + StingSAMIterator toUnmappedReads( long readCount ) { + StingSAMIterator iter = iteratorPool.iterator(new UnmappedStreamSegment(readsTaken, readCount)); readsTaken += readCount; return iter; } @@ -342,7 +342,7 @@ class SAMIteratorPool extends ResourcePool protected Reads reads; /** Is this a by-reads traversal or a by-locus? */ - protected boolean byReads; + protected boolean queryOverlapping; /** File header for the combined file. */ protected SAMFileHeader header; @@ -350,9 +350,9 @@ class SAMIteratorPool extends ResourcePool /** our log, which we want to capture anything from this class */ protected static Logger logger = Logger.getLogger(SAMIteratorPool.class); - public SAMIteratorPool( Reads reads, boolean byReads ) { + public SAMIteratorPool( Reads reads ) { this.reads = reads; - this.byReads = byReads; + this.queryOverlapping = true; ReadStreamPointer streamPointer = createNewResource(); this.header = streamPointer.getHeader(); @@ -366,8 +366,8 @@ class SAMIteratorPool extends ResourcePool } protected ReadStreamPointer selectBestExistingResource( DataStreamSegment segment, List pointers ) { - for( ReadStreamPointer pointer: pointers ) { - if( pointer.canAccessSegmentEfficiently( segment ) ) { + for (ReadStreamPointer pointer : pointers) { + if (pointer.canAccessSegmentEfficiently(segment)) { return pointer; } } @@ -375,18 +375,18 @@ class SAMIteratorPool extends ResourcePool } protected ReadStreamPointer createNewResource() { - return new ReadStreamPointer( reads ); + return new ReadStreamPointer(reads); } protected StingSAMIterator createIteratorFromResource( DataStreamSegment segment, ReadStreamPointer streamPointer ) { StingSAMIterator iterator = null; - if( byReads ) - iterator = streamPointer.getReadsContainedBy( segment ); + if (!queryOverlapping) + iterator = streamPointer.getReadsContainedBy(segment); else { - if( !(segment instanceof MappedStreamSegment) ) + if (!( segment instanceof MappedStreamSegment )) throw new StingException("Segment is unmapped; true overlaps cannot be determined."); - iterator = streamPointer.getReadsOverlapping( (MappedStreamSegment)segment ); + iterator = streamPointer.getReadsOverlapping((MappedStreamSegment) segment); } return new ReleasingIterator(iterator); @@ -399,18 +399,41 @@ class SAMIteratorPool extends ResourcePool private class ReleasingIterator implements StingSAMIterator { private final StingSAMIterator wrappedIterator; - public Reads getSourceInfo() { return wrappedIterator.getSourceInfo(); } + public Reads getSourceInfo() { + return wrappedIterator.getSourceInfo(); + } - public ReleasingIterator( StingSAMIterator wrapped ) { this.wrappedIterator = wrapped; } + public ReleasingIterator( StingSAMIterator wrapped ) { + this.wrappedIterator = wrapped; + } + + public ReleasingIterator iterator() { + return this; + } + + public void remove() { + throw new UnsupportedOperationException("Can't remove from a StingSAMIterator"); + } - public ReleasingIterator iterator() { return this; } - public void remove() { throw new UnsupportedOperationException("Can't remove from a StingSAMIterator"); } public void close() { wrappedIterator.close(); release(this); } - public boolean hasNext() { return wrappedIterator.hasNext(); } - public SAMRecord next() { return wrappedIterator.next(); } + public boolean hasNext() { + return wrappedIterator.hasNext(); + } + + public SAMRecord next() { + return wrappedIterator.next(); + } + } + + public boolean isQueryOverlapping() { + return queryOverlapping; + } + + public void setQueryOverlapping( boolean queryOverlapping ) { + this.queryOverlapping = queryOverlapping; } } diff --git a/java/src/org/broadinstitute/sting/gatk/executive/MicroScheduler.java b/java/src/org/broadinstitute/sting/gatk/executive/MicroScheduler.java index 52be738ae..4e7f2a62a 100755 --- a/java/src/org/broadinstitute/sting/gatk/executive/MicroScheduler.java +++ b/java/src/org/broadinstitute/sting/gatk/executive/MicroScheduler.java @@ -104,19 +104,15 @@ public abstract class MicroScheduler { */ protected MicroScheduler(Walker walker, Reads reads, File refFile, List> rods) { if (walker instanceof ReadWalker) { - traversalEngine = new TraverseReads(reads.getReadsFiles(), refFile, rods); - this.reads = getReadsDataSource(reads, true); + traversalEngine = new TraverseReads(reads.getReadsFiles(), refFile, rods); } else if (walker instanceof LocusWalker) { traversalEngine = new TraverseLoci(reads.getReadsFiles(), refFile, rods); - this.reads = getReadsDataSource(reads, false); } else if (walker instanceof DuplicateWalker) { traversalEngine = new TraverseDuplicates(reads.getReadsFiles(), refFile, rods); - this.reads = getReadsDataSource(reads, true); } else { throw new UnsupportedOperationException("Unable to determine traversal type, the walker is an unknown type."); } - - + this.reads = getReadsDataSource(reads); this.reference = openReferenceSequenceFile(refFile); this.rods = getReferenceOrderedDataSources(rods); } @@ -209,16 +205,15 @@ public abstract class MicroScheduler { * Gets a data source for the given set of reads. * * @param reads the read source information - * @param byReads are we a by reads traversal, or not * * @return A data source for the given set of reads. */ - private SAMDataSource getReadsDataSource(Reads reads, boolean byReads) { + private SAMDataSource getReadsDataSource(Reads reads) { // By reference traversals are happy with no reads. Make sure that case is handled. if (reads.getReadsFiles().size() == 0) return null; - SAMDataSource dataSource = new SAMDataSource(reads, byReads); + SAMDataSource dataSource = new SAMDataSource(reads); // Side effect: initialize the traversal engine with reads data. // TODO: Give users a dedicated way of getting the header so that the MicroScheduler diff --git a/java/test/org/broadinstitute/sting/gatk/datasources/simpleDataSources/ArtificialResourcePool.java b/java/test/org/broadinstitute/sting/gatk/datasources/simpleDataSources/ArtificialResourcePool.java new file mode 100644 index 000000000..452502592 --- /dev/null +++ b/java/test/org/broadinstitute/sting/gatk/datasources/simpleDataSources/ArtificialResourcePool.java @@ -0,0 +1,96 @@ +package org.broadinstitute.sting.gatk.datasources.simpleDataSources; + +import net.sf.samtools.SAMFileReader; +import net.sf.samtools.SAMFileHeader; +import org.broadinstitute.sting.utils.sam.ArtificialSAMIterator; +import org.broadinstitute.sting.utils.sam.ArtificialSAMQueryIterator; +import org.broadinstitute.sting.utils.StingException; +import org.broadinstitute.sting.gatk.Reads; +import org.broadinstitute.sting.gatk.iterators.StingSAMIterator; +import org.broadinstitute.sting.gatk.iterators.BoundedReadIterator; + +import java.util.Collections; +import java.io.File; + + +/* + * Copyright (c) 2009 The Broad Institute + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +/** + * use this to inject into SAMDataSource for testing + */ +public class ArtificialResourcePool extends SAMIteratorPool { + // How strict should we be with SAM/BAM parsing? + protected SAMFileReader.ValidationStringency strictness = SAMFileReader.ValidationStringency.SILENT; + + // the header + private SAMFileHeader header; + private ArtificialSAMIterator iterator; + + /** + * Track the iterator to see whether it's venturing into unmapped reads for the first + * time. If so, query straight there. Only works for query iterators. + * + * TODO: Clean up. + */ + private boolean intoUnmappedReads = false; + + public ArtificialResourcePool( SAMFileHeader header, ArtificialSAMIterator iterator ) { + super( new Reads(Collections.emptyList()) ); + this.header = header; + this.iterator = iterator; + } + + @Override + public StingSAMIterator iterator( DataStreamSegment segment ) { + if (segment instanceof MappedStreamSegment && iterator instanceof ArtificialSAMQueryIterator) { + ArtificialSAMQueryIterator queryIterator = (ArtificialSAMQueryIterator)iterator; + MappedStreamSegment mappedSegment = (MappedStreamSegment)segment; + queryIterator.queryContained(mappedSegment.locus.getContig(), (int)mappedSegment.locus.getStart(), (int)mappedSegment.locus.getStop()); + return queryIterator; + } + else if (segment instanceof UnmappedStreamSegment) { + if( !intoUnmappedReads ) { + if( iterator instanceof ArtificialSAMQueryIterator ) { + ArtificialSAMQueryIterator queryIterator = (ArtificialSAMQueryIterator)iterator; + queryIterator.queryUnmappedReads(); + } + intoUnmappedReads = true; + } + return new BoundedReadIterator(iterator,((UnmappedStreamSegment)segment).size); + } + else + throw new StingException("Unsupported segment type passed to test"); + } + + /** + * get the merged header + * + * @return the merged header + */ + public SAMFileHeader getHeader() { + return this.header; + } +} diff --git a/java/test/org/broadinstitute/sting/gatk/datasources/simpleDataSources/SAMBAMDataSourceTest.java b/java/test/org/broadinstitute/sting/gatk/datasources/simpleDataSources/SAMBAMDataSourceTest.java index 3cf2a42d0..52d70c57c 100755 --- a/java/test/org/broadinstitute/sting/gatk/datasources/simpleDataSources/SAMBAMDataSourceTest.java +++ b/java/test/org/broadinstitute/sting/gatk/datasources/simpleDataSources/SAMBAMDataSourceTest.java @@ -88,7 +88,7 @@ public class SAMBAMDataSourceTest extends BaseTest { Reads reads = new Reads(fl); try { - SAMDataSource data = new SAMDataSource(reads,false); + SAMDataSource data = new SAMDataSource(reads); for (Shard sh : strat) { int readCount = 0; count++; @@ -138,7 +138,7 @@ public class SAMBAMDataSourceTest extends BaseTest { int count = 0; try { - SAMDataSource data = new SAMDataSource(reads,false); + SAMDataSource data = new SAMDataSource(reads); for (Shard sh : strat) { int readCount = 0; count++; @@ -175,7 +175,7 @@ public class SAMBAMDataSourceTest extends BaseTest { logger.debug("Pile two:"); try { - SAMDataSource data = new SAMDataSource(reads,false); + SAMDataSource data = new SAMDataSource(reads); for (Shard sh : strat) { int readCount = 0; count++; diff --git a/java/test/org/broadinstitute/sting/gatk/datasources/simpleDataSources/SAMByIntervalTest.java b/java/test/org/broadinstitute/sting/gatk/datasources/simpleDataSources/SAMByIntervalTest.java new file mode 100644 index 000000000..520594ae7 --- /dev/null +++ b/java/test/org/broadinstitute/sting/gatk/datasources/simpleDataSources/SAMByIntervalTest.java @@ -0,0 +1,150 @@ +package org.broadinstitute.sting.gatk.datasources.simpleDataSources; + +import org.broadinstitute.sting.BaseTest; +import org.broadinstitute.sting.utils.sam.ArtificialSAMUtils; +import org.broadinstitute.sting.utils.GenomeLocParser; +import org.broadinstitute.sting.utils.GenomeLocSortedSet; +import org.broadinstitute.sting.gatk.Reads; +import org.broadinstitute.sting.gatk.iterators.StingSAMIterator; +import org.broadinstitute.sting.gatk.datasources.shards.ShardStrategy; +import org.broadinstitute.sting.gatk.datasources.shards.ShardStrategyFactory; +import org.junit.Before; +import org.junit.Test; +import static org.junit.Assert.assertEquals; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import net.sf.samtools.SAMFileHeader; +import net.sf.samtools.SAMRecord; + + +/* + * Copyright (c) 2009 The Broad Institute + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +/** + * @author aaron + *

+ * Class SAMByIntervalTest + *

+ * Test that the SAM data source behaves well given intervals + */ +public class SAMByIntervalTest extends BaseTest { + private List fl; + ShardStrategy shardStrategy; + Reads reads; + private int targetReadCount = 14; + + + // constants we use throughout the tests + protected final int READ_COUNT; + protected final int ENDING_CHROMO; + protected final int STARTING_CHROMO; + protected final int UNMAPPED_READ_COUNT; + + public SAMByIntervalTest() { + READ_COUNT = 100; + ENDING_CHROMO = 10; + STARTING_CHROMO = 1; + UNMAPPED_READ_COUNT = 1000; + } + + /** + * This function does the setup of our parser, before each method call. + *

+ * Called before every test case method. + */ + @Before + public void doForEachTest() { + fl = new ArrayList(); + + // sequence + //seq = new FastaSequenceFile2(new File(seqLocation + "/references/Homo_sapiens_assembly17/v0/Homo_sapiens_assembly17.fasta")); + //GenomeLoc.setupRefContigOrdering(seq.getSequenceDictionary()); + + // setup the test files + fl.add(new File("/humgen/gsa-scr1/GATK_Data/Validation_Data/index_test.bam")); + reads = new Reads(fl); + } + + + /** run a test on data over a specific interval */ + private void testRead( int start, int stop, int readCount ) { + ArtificialResourcePool gen = new ArtificialResourcePool(createArtificialSamHeader(STARTING_CHROMO, ENDING_CHROMO, READ_COUNT, UNMAPPED_READ_COUNT), + ArtificialSAMUtils.mappedAndUnmappedReadIterator(STARTING_CHROMO, ENDING_CHROMO, READ_COUNT, UNMAPPED_READ_COUNT)); + + GenomeLocParser.setupRefContigOrdering(gen.getHeader().getSequenceDictionary()); + int unmappedReadsSeen = 0; + int iterations = 0; + + SAMDataSource data = new SAMDataSource(reads); + data.setResourcePool(gen); + GenomeLocSortedSet set = new GenomeLocSortedSet(); + set.add(GenomeLocParser.createGenomeLoc(0, start, stop)); + ShardStrategy strat = ShardStrategyFactory.shatter(ShardStrategyFactory.SHATTER_STRATEGY.INTERVAL, gen.getHeader().getSequenceDictionary(), UNMAPPED_READ_COUNT, set); + + StingSAMIterator iter = data.seek(strat.next()); + int count = 0; + while (iter.hasNext()) { + SAMRecord r = iter.next(); + // uncomment for debugging - System.err.println(r.getAlignmentStart() + " " + r.getAlignmentEnd()); + count++; + } + assertEquals(readCount, count); + + } + + /** + * test out that we get a single read, given the specific size + */ + @Test + public void testSingleRead() { + testRead(1,ArtificialSAMUtils.DEFAULT_READ_LENGTH,1); + } + + /** + * test out that we get the expected amount for a whole chromosome + */ + @Test + public void testChromosome() { + testRead(1, READ_COUNT, READ_COUNT -ArtificialSAMUtils.DEFAULT_READ_LENGTH+1); // +1 because we go from 1 up to 101 + } + + /** + * test out that we get the expected amount for a whole chromosome + */ + @Test + public void testMiddle() { + testRead(20, READ_COUNT-20, READ_COUNT -ArtificialSAMUtils.DEFAULT_READ_LENGTH-40+2); + } + + + private SAMFileHeader createArtificialSamHeader( int startingChr, int endingChr, int readCount, int readSize ) { + return ArtificialSAMUtils.createArtificialSamHeader(( endingChr - startingChr ) + 1, + startingChr, + readCount + readSize); + } +} diff --git a/java/test/org/broadinstitute/sting/gatk/datasources/simpleDataSources/SAMByReadsTest.java b/java/test/org/broadinstitute/sting/gatk/datasources/simpleDataSources/SAMByReadsTest.java index c9a31ddf8..01e3de5f9 100755 --- a/java/test/org/broadinstitute/sting/gatk/datasources/simpleDataSources/SAMByReadsTest.java +++ b/java/test/org/broadinstitute/sting/gatk/datasources/simpleDataSources/SAMByReadsTest.java @@ -1,19 +1,14 @@ package org.broadinstitute.sting.gatk.datasources.simpleDataSources; import static junit.framework.Assert.fail; -import net.sf.samtools.SAMFileReader; import net.sf.samtools.SAMFileHeader; import org.broadinstitute.sting.BaseTest; import org.broadinstitute.sting.gatk.datasources.shards.ShardStrategy; import org.broadinstitute.sting.gatk.datasources.shards.ShardStrategyFactory; -import org.broadinstitute.sting.gatk.iterators.BoundedReadIterator; import org.broadinstitute.sting.gatk.iterators.*; import org.broadinstitute.sting.gatk.Reads; import org.broadinstitute.sting.utils.GenomeLocParser; -import org.broadinstitute.sting.utils.StingException; import org.broadinstitute.sting.utils.sam.ArtificialSAMUtils; -import org.broadinstitute.sting.utils.sam.ArtificialSAMQueryIterator; -import org.broadinstitute.sting.utils.sam.ArtificialSAMIterator; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import org.junit.Before; @@ -22,7 +17,6 @@ import org.junit.Test; import java.io.File; import java.util.ArrayList; import java.util.List; -import java.util.Collections; /** * @@ -78,14 +72,14 @@ public class SAMByReadsTest extends BaseTest { @Test public void testToUnmappedReads() { ArtificialResourcePool gen = new ArtificialResourcePool(createArtificialSamHeader(1,10,100,1000), - ArtificialSAMUtils.unmappedReadIterator(1, 100, 10, 1000) ); + ArtificialSAMUtils.mappedAndUnmappedReadIterator(1, 100, 10, 1000) ); GenomeLocParser.setupRefContigOrdering(gen.getHeader().getSequenceDictionary()); try { int unmappedReadsSeen = 0; int iterations = 0; - SAMDataSource data = new SAMDataSource(reads,true); + SAMDataSource data = new SAMDataSource(reads); data.setResourcePool(gen); for (int x = 0; x < 10; x++) { @@ -121,7 +115,7 @@ public class SAMByReadsTest extends BaseTest { try { int iterations = 0; int readCount = 0; - SAMDataSource data = new SAMDataSource(reads,true); + SAMDataSource data = new SAMDataSource(reads); ArrayList readsPerShard = new ArrayList(); @@ -176,7 +170,7 @@ public class SAMByReadsTest extends BaseTest { try { int iterations = 0; int readCount = 0; - SAMDataSource data = new SAMDataSource(reads,true); + SAMDataSource data = new SAMDataSource(reads); data.setResourcePool(gen); @@ -224,59 +218,3 @@ public class SAMByReadsTest extends BaseTest { } } -/** - * use this to inject into SAMDataSource for testing - */ -class ArtificialResourcePool extends SAMIteratorPool { - // How strict should we be with SAM/BAM parsing? - protected SAMFileReader.ValidationStringency strictness = SAMFileReader.ValidationStringency.SILENT; - - // the header - private SAMFileHeader header; - private ArtificialSAMIterator iterator; - - /** - * Track the iterator to see whether it's venturing into unmapped reads for the first - * time. If so, query straight there. Only works for query iterators. - * - * TODO: Clean up. - */ - private boolean intoUnmappedReads = false; - - public ArtificialResourcePool( SAMFileHeader header, ArtificialSAMIterator iterator ) { - super( new Reads(Collections.emptyList()),true ); - this.header = header; - this.iterator = iterator; - } - - @Override - public StingSAMIterator iterator( DataStreamSegment segment ) { - if (segment instanceof MappedStreamSegment && iterator instanceof ArtificialSAMQueryIterator) { - ArtificialSAMQueryIterator queryIterator = (ArtificialSAMQueryIterator)iterator; - MappedStreamSegment mappedSegment = (MappedStreamSegment)segment; - queryIterator.queryContained(mappedSegment.locus.getContig(), (int)mappedSegment.locus.getStart(), (int)mappedSegment.locus.getStop()); - return queryIterator; - } - else if (segment instanceof UnmappedStreamSegment) { - if( !intoUnmappedReads ) { - if( iterator instanceof ArtificialSAMQueryIterator ) { - ArtificialSAMQueryIterator queryIterator = (ArtificialSAMQueryIterator)iterator; - queryIterator.queryUnmappedReads(); - } - intoUnmappedReads = true; - } - return new BoundedReadIterator(iterator,((UnmappedStreamSegment)segment).size); - } - else - throw new StingException("Unsupported segment type passed to test"); - } - - /** - * get the merged header - * - * @return the merged header - */ - public SAMFileHeader getHeader() { - return this.header; - } -} diff --git a/java/test/org/broadinstitute/sting/gatk/iterators/BoundedReadIteratorTest.java b/java/test/org/broadinstitute/sting/gatk/iterators/BoundedReadIteratorTest.java index 548324f70..bbfa1e5ba 100755 --- a/java/test/org/broadinstitute/sting/gatk/iterators/BoundedReadIteratorTest.java +++ b/java/test/org/broadinstitute/sting/gatk/iterators/BoundedReadIteratorTest.java @@ -95,7 +95,7 @@ public class BoundedReadIteratorTest extends BaseTest { long shardReadCount = 0; try { - SAMDataSource data = new SAMDataSource(reads,true); + SAMDataSource data = new SAMDataSource(reads); // make sure we have a shard if (!strat.hasNext()) { diff --git a/java/test/org/broadinstitute/sting/gatk/traversals/TraverseReadsTest.java b/java/test/org/broadinstitute/sting/gatk/traversals/TraverseReadsTest.java index 5f8f2c1c6..af717c9f7 100755 --- a/java/test/org/broadinstitute/sting/gatk/traversals/TraverseReadsTest.java +++ b/java/test/org/broadinstitute/sting/gatk/traversals/TraverseReadsTest.java @@ -122,7 +122,7 @@ public class TraverseReadsTest extends BaseTest { ref.getSequenceDictionary(), readSize); - SAMDataSource dataSource = new SAMDataSource(new Reads(bamList),true); + SAMDataSource dataSource = new SAMDataSource(new Reads(bamList)); dataSource.viewUnmappedReads(false); countReadWalker.initialize(); @@ -169,7 +169,7 @@ public class TraverseReadsTest extends BaseTest { ref.getSequenceDictionary(), readSize); - SAMDataSource dataSource = new SAMDataSource(new Reads(bamList),true); + SAMDataSource dataSource = new SAMDataSource(new Reads(bamList)); dataSource.viewUnmappedReads(true); countReadWalker.initialize(); diff --git a/java/test/org/broadinstitute/sting/utils/sam/ArtificialSAMUtilsTest.java b/java/test/org/broadinstitute/sting/utils/sam/ArtificialSAMUtilsTest.java index 2275084a7..ab4a8ea89 100644 --- a/java/test/org/broadinstitute/sting/utils/sam/ArtificialSAMUtilsTest.java +++ b/java/test/org/broadinstitute/sting/utils/sam/ArtificialSAMUtilsTest.java @@ -2,7 +2,6 @@ package org.broadinstitute.sting.utils.sam; import org.broadinstitute.sting.BaseTest; import org.broadinstitute.sting.gatk.iterators.StingSAMIterator; -import org.broadinstitute.sting.gatk.iterators.QueryIterator; import org.junit.Test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; @@ -21,7 +20,7 @@ public class ArtificialSAMUtilsTest extends BaseTest { @Test public void basicReadIteratorTest() { - StingSAMIterator iter = ArtificialSAMUtils.unmappedReadIterator(1, 100, 100); + StingSAMIterator iter = ArtificialSAMUtils.mappedReadIterator(1, 100, 100); int count = 0; while (iter.hasNext()) { SAMRecord rec = iter.next(); @@ -32,7 +31,7 @@ public class ArtificialSAMUtilsTest extends BaseTest { @Test public void tenPerChromosome() { - StingSAMIterator iter = ArtificialSAMUtils.unmappedReadIterator(1, 100, 10); + StingSAMIterator iter = ArtificialSAMUtils.mappedReadIterator(1, 100, 10); int count = 0; while (iter.hasNext()) { SAMRecord rec = iter.next(); @@ -45,7 +44,7 @@ public class ArtificialSAMUtilsTest extends BaseTest { @Test public void onePerChromosome() { - StingSAMIterator iter = ArtificialSAMUtils.unmappedReadIterator(1, 100, 1); + StingSAMIterator iter = ArtificialSAMUtils.mappedReadIterator(1, 100, 1); int count = 0; while (iter.hasNext()) { SAMRecord rec = iter.next(); @@ -58,7 +57,7 @@ public class ArtificialSAMUtilsTest extends BaseTest { @Test public void basicUnmappedIteratorTest() { - StingSAMIterator iter = ArtificialSAMUtils.unmappedReadIterator(1, 100, 100, 1000); + StingSAMIterator iter = ArtificialSAMUtils.mappedAndUnmappedReadIterator(1, 100, 100, 1000); int count = 0; for (int x = 0; x < (100* 100); x++ ) { if (!iter.hasNext()) {