diff --git a/build.xml b/build.xml index f879d0411..737c64122 100644 --- a/build.xml +++ b/build.xml @@ -2,7 +2,7 @@ Compile and distribute the Sting toolkit - + @@ -256,10 +256,6 @@ - - - - diff --git a/java/src/org/broadinstitute/sting/gatk/dataSources/providers/IterableLocusContextQueue.java b/java/src/org/broadinstitute/sting/gatk/dataSources/providers/IterableLocusContextQueue.java new file mode 100755 index 000000000..851383eef --- /dev/null +++ b/java/src/org/broadinstitute/sting/gatk/dataSources/providers/IterableLocusContextQueue.java @@ -0,0 +1,103 @@ +package org.broadinstitute.sting.gatk.dataSources.providers; + +import net.sf.samtools.SAMRecord; + +import java.util.Iterator; +import java.util.NoSuchElementException; + +import edu.mit.broad.picard.filter.FilteringIterator; +import org.broadinstitute.sting.gatk.traversals.TraversalEngine; +import org.broadinstitute.sting.gatk.iterators.LocusContextIteratorByHanger; +import org.broadinstitute.sting.gatk.iterators.LocusContextIterator; +import org.broadinstitute.sting.gatk.iterators.LocusIterator; +import org.broadinstitute.sting.gatk.LocusContext; +import org.broadinstitute.sting.gatk.dataSources.shards.Shard; +import org.broadinstitute.sting.utils.GenomeLoc; +/** + * User: hanna + * Date: May 13, 2009 + * Time: 3:32:30 PM + * BROAD INSTITUTE SOFTWARE COPYRIGHT NOTICE AND AGREEMENT + * Software and documentation are copyright 2005 by the Broad Institute. + * All rights are reserved. + * + * Users acknowledge that this software is supplied without any warranty or support. + * The Broad Institute is not responsible for its use, misuse, or + * functionality. + */ + +/** + * A LocusContextQueue over which the user can iterate. + */ + +public class IterableLocusContextQueue implements LocusContextQueue, LocusIterator { + private Shard shard; + private LocusContextIterator loci; + + /** + * What's the context for the last locus accessed? + * @param provider + */ + private LocusContext nextLocusContext = null; + + /** + * Create a new queue of locus contexts. + * @param provider + */ + public IterableLocusContextQueue(ShardDataProvider provider) { + Iterator reads = new FilteringIterator(provider.getReadIterator(), new TraversalEngine.locusStreamFilterFunc()); + this.loci = new LocusContextIteratorByHanger(reads); + this.shard = provider.getShard(); + } + + /** + * Is there another locus present in this iterator. + * @return True if another locus present in this iterator. Otherwise, false. + */ + public boolean hasNext() { + return loci.hasNext(); + } + + /** + * Retrieves the next element in the queue. + * @return Next element in the queue. + */ + public GenomeLoc next() { + do { + nextLocusContext = loci.next(); + } + while( nextLocusContext.getLocation().isBefore(shard.getGenomeLoc()) ); + + return nextLocusContext.getLocation(); + } + + /** + * Unsupported. + */ + public void remove() { + throw new UnsupportedOperationException("Unable to remove elements from this queue."); + } + + /** + * Peek at the next locus context in the chain. + * @return + */ + public LocusContext peek() { + if( nextLocusContext == null ) + throw new NoSuchElementException("No more elements remaining in queue"); + return nextLocusContext; + } + + /** + * Seek to the specified position in the contig. + * @param seekPoint + */ + public LocusContextQueue seek( GenomeLoc seekPoint ) { + if( nextLocusContext == null || !seekPoint.equals(nextLocusContext.getLocation()) ) { + nextLocusContext = null; + throw new IllegalArgumentException("IterableLocusContextQueue doesn't support seeking and iterator is in the wrong position."); + } + return this; + } + +} diff --git a/java/src/org/broadinstitute/sting/gatk/dataSources/providers/LocusContextQueue.java b/java/src/org/broadinstitute/sting/gatk/dataSources/providers/SeekableLocusContextQueue.java similarity index 94% rename from java/src/org/broadinstitute/sting/gatk/dataSources/providers/LocusContextQueue.java rename to java/src/org/broadinstitute/sting/gatk/dataSources/providers/SeekableLocusContextQueue.java index 23cbeea7e..2009f597a 100755 --- a/java/src/org/broadinstitute/sting/gatk/dataSources/providers/LocusContextQueue.java +++ b/java/src/org/broadinstitute/sting/gatk/dataSources/providers/SeekableLocusContextQueue.java @@ -31,7 +31,7 @@ import edu.mit.broad.picard.filter.FilteringIterator; * implementation of java.util.Queue interface. */ -public class LocusContextQueue { +public class SeekableLocusContextQueue implements LocusContextQueue { private Shard shard; private LocusContextIterator loci; @@ -46,13 +46,13 @@ public class LocusContextQueue { */ private LocusContext nextLocusContext = null; - private static Logger logger = Logger.getLogger(LocusContextQueue.class); + private static Logger logger = Logger.getLogger(SeekableLocusContextQueue.class); /** - * Create a new queue of locus contexts, sorted in + * Create a new queue of locus contexts. * @param provider */ - public LocusContextQueue(ShardDataProvider provider) { + public SeekableLocusContextQueue(ShardDataProvider provider) { Iterator reads = new FilteringIterator(provider.getReadIterator(), new TraversalEngine.locusStreamFilterFunc()); this.loci = new LocusContextIteratorByHanger(reads); this.shard = provider.getShard(); diff --git a/java/src/org/broadinstitute/sting/gatk/traversals/TraverseLociByReference.java b/java/src/org/broadinstitute/sting/gatk/traversals/TraverseLociByReference.java index 12e9f2e5e..a79258c47 100755 --- a/java/src/org/broadinstitute/sting/gatk/traversals/TraverseLociByReference.java +++ b/java/src/org/broadinstitute/sting/gatk/traversals/TraverseLociByReference.java @@ -6,7 +6,7 @@ import org.broadinstitute.sting.gatk.LocusContext; import org.broadinstitute.sting.gatk.dataSources.shards.Shard; import org.broadinstitute.sting.gatk.dataSources.providers.ReferenceLocusIterator; import org.broadinstitute.sting.gatk.dataSources.providers.ShardDataProvider; -import org.broadinstitute.sting.gatk.dataSources.providers.LocusContextQueue; +import org.broadinstitute.sting.gatk.dataSources.providers.SeekableLocusContextQueue; import org.broadinstitute.sting.gatk.refdata.ReferenceOrderedData; import org.broadinstitute.sting.gatk.refdata.ReferenceOrderedDatum; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; @@ -58,7 +58,7 @@ public class TraverseLociByReference extends TraversalEngine { LocusWalker locusWalker = (LocusWalker)walker; LocusIterator locusIterator = new ReferenceLocusIterator( dataProvider ); - LocusContextQueue locusContextQueue = new LocusContextQueue( dataProvider ); + SeekableLocusContextQueue locusContextQueue = new SeekableLocusContextQueue( dataProvider ); // We keep processing while the next reference location is within the interval while( locusIterator.hasNext() ) { diff --git a/java/test/org/broadinstitute/sting/gatk/OutputTrackerTest.java b/java/test/org/broadinstitute/sting/gatk/OutputTrackerTest.java index 4a616d793..9b458ee23 100755 --- a/java/test/org/broadinstitute/sting/gatk/OutputTrackerTest.java +++ b/java/test/org/broadinstitute/sting/gatk/OutputTrackerTest.java @@ -4,11 +4,13 @@ import org.junit.Test; import org.junit.After; import org.junit.Assert; import org.broadinstitute.sting.utils.io.RedirectingOutputStream; +import org.broadinstitute.sting.BaseTest; import java.io.File; import java.io.FileNotFoundException; import java.io.PrintWriter; -import java.util.Scanner; /** +import java.util.Scanner; +/** * User: hanna * Date: Apr 30, 2009 * Time: 10:20:18 AM @@ -25,7 +27,7 @@ import java.util.Scanner; /** * For the file opening and closing mechanisms. */ -public class OutputTrackerTest { +public class OutputTrackerTest extends BaseTest { public static final String OUTPUT_FILENAME = "OutputTrackerTest.out"; public static final String ERROR_FILENAME = "OutputTrackerTest.err"; diff --git a/java/test/org/broadinstitute/sting/gatk/dataSources/providers/IterableLocusContextQueueTest.java b/java/test/org/broadinstitute/sting/gatk/dataSources/providers/IterableLocusContextQueueTest.java new file mode 100755 index 000000000..41c69529a --- /dev/null +++ b/java/test/org/broadinstitute/sting/gatk/dataSources/providers/IterableLocusContextQueueTest.java @@ -0,0 +1,90 @@ +package org.broadinstitute.sting.gatk.dataSources.providers; + +import org.junit.Test; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.broadinstitute.sting.utils.GenomeLoc; +import org.broadinstitute.sting.gatk.dataSources.shards.Shard; +import org.broadinstitute.sting.gatk.dataSources.shards.LocusShard; +import org.broadinstitute.sting.gatk.iterators.StingSAMIterator; +import org.broadinstitute.sting.gatk.LocusContext; +import org.broadinstitute.sting.BaseTest; +import net.sf.samtools.SAMRecord; +import net.sf.samtools.Cigar; +import net.sf.samtools.CigarElement; +import net.sf.samtools.CigarOperator; +import net.sf.samtools.SAMSequenceDictionary; +import net.sf.samtools.SAMSequenceRecord; +import net.sf.samtools.SAMFileHeader; + +import java.util.List; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.Collections; +import java.io.FileNotFoundException; + +import edu.mit.broad.picard.reference.ReferenceSequenceFile; +import edu.mit.broad.picard.reference.ReferenceSequence; +/** + * User: hanna + * Date: May 12, 2009 + * Time: 2:34:46 PM + * BROAD INSTITUTE SOFTWARE COPYRIGHT NOTICE AND AGREEMENT + * Software and documentation are copyright 2005 by the Broad Institute. + * All rights are reserved. + * + * Users acknowledge that this software is supplied without any warranty or support. + * The Broad Institute is not responsible for its use, misuse, or + * functionality. + */ + +/** + * Test the locus context queue. + */ +public class IterableLocusContextQueueTest extends LocusContextQueueTemplate { + + @Override + protected LocusContextQueue createQueue(ShardDataProvider provider) { + return new IterableLocusContextQueue(provider); + } + + /** + * Test the reads according to an independently derived context. + * @param queue + * @param bounds + * @param reads + */ + @Override + protected void testReadsInContext( LocusContextQueue queue, GenomeLoc bounds, List reads ) { + IterableLocusContextQueue iterableQueue = (IterableLocusContextQueue)queue; + + for( long i = bounds.getStart(); i <= bounds.getStop(); i++ ) { + GenomeLoc site = new GenomeLoc("chr1",i); + + int expectedReadsAtSite = 0; + for( SAMRecord read: reads ) { + if( new GenomeLoc(read).containsP(site) ) + expectedReadsAtSite++; + } + + if( expectedReadsAtSite < 1 ) + continue; + + Assert.assertTrue("Incorrect number of loci in queue",iterableQueue.hasNext()); + + GenomeLoc nextLocus = iterableQueue.next(); + Assert.assertEquals("Next locus context returned is incorrect", site, nextLocus ); + + LocusContext locusContext = iterableQueue.seek(site).peek(); + Assert.assertEquals("Target locus context location is incorrect", site, locusContext.getLocation() ); + Assert.assertEquals("Found wrong number of reads at site", expectedReadsAtSite, locusContext.getReads().size()); + + for( SAMRecord read: reads ) { + if(new GenomeLoc(read).containsP(locusContext.getLocation())) + Assert.assertTrue("Target locus context does not contain reads", locusContext.getReads().contains(read) ); + } + + } + } +} diff --git a/java/test/org/broadinstitute/sting/gatk/dataSources/providers/LocusContextQueueTest.java b/java/test/org/broadinstitute/sting/gatk/dataSources/providers/LocusContextQueueTemplate.java similarity index 80% rename from java/test/org/broadinstitute/sting/gatk/dataSources/providers/LocusContextQueueTest.java rename to java/test/org/broadinstitute/sting/gatk/dataSources/providers/LocusContextQueueTemplate.java index 9ec317c27..aee5e39d6 100755 --- a/java/test/org/broadinstitute/sting/gatk/dataSources/providers/LocusContextQueueTest.java +++ b/java/test/org/broadinstitute/sting/gatk/dataSources/providers/LocusContextQueueTemplate.java @@ -1,35 +1,33 @@ package org.broadinstitute.sting.gatk.dataSources.providers; -import org.junit.Test; -import org.junit.Assert; import org.junit.BeforeClass; +import org.junit.Test; import org.broadinstitute.sting.utils.GenomeLoc; +import org.broadinstitute.sting.BaseTest; +import org.broadinstitute.sting.gatk.iterators.StingSAMIterator; import org.broadinstitute.sting.gatk.dataSources.shards.Shard; import org.broadinstitute.sting.gatk.dataSources.shards.LocusShard; -import org.broadinstitute.sting.gatk.iterators.StingSAMIterator; -import org.broadinstitute.sting.gatk.LocusContext; -import org.broadinstitute.sting.BaseTest; -import net.sf.samtools.SAMRecord; -import net.sf.samtools.Cigar; -import net.sf.samtools.CigarElement; -import net.sf.samtools.CigarOperator; -import net.sf.samtools.SAMSequenceDictionary; -import net.sf.samtools.SAMSequenceRecord; -import net.sf.samtools.SAMFileHeader; +import java.io.FileNotFoundException; +import java.util.Collections; import java.util.List; +import java.util.Iterator; import java.util.ArrayList; import java.util.Arrays; -import java.util.Iterator; -import java.util.Collections; -import java.io.FileNotFoundException; import edu.mit.broad.picard.reference.ReferenceSequenceFile; import edu.mit.broad.picard.reference.ReferenceSequence; +import net.sf.samtools.SAMSequenceDictionary; +import net.sf.samtools.SAMSequenceRecord; +import net.sf.samtools.SAMRecord; +import net.sf.samtools.SAMFileHeader; +import net.sf.samtools.Cigar; +import net.sf.samtools.CigarElement; +import net.sf.samtools.CigarOperator; /** * User: hanna - * Date: May 12, 2009 - * Time: 2:34:46 PM + * Date: May 13, 2009 + * Time: 4:29:08 PM * BROAD INSTITUTE SOFTWARE COPYRIGHT NOTICE AND AGREEMENT * Software and documentation are copyright 2005 by the Broad Institute. * All rights are reserved. @@ -40,10 +38,11 @@ import edu.mit.broad.picard.reference.ReferenceSequence; */ /** - * Test the locus context queue. + * Base support for testing variants of the LocusContextQueue family of classes. */ -public class LocusContextQueueTest extends BaseTest { - private static ReferenceSequenceFile sequenceSourceFile = null; + +public abstract class LocusContextQueueTemplate extends BaseTest { + protected static ReferenceSequenceFile sequenceSourceFile = null; @BeforeClass public static void setupGenomeLoc() throws FileNotFoundException { @@ -51,17 +50,6 @@ public class LocusContextQueueTest extends BaseTest { GenomeLoc.setupRefContigOrdering(sequenceSourceFile); } - private static ReferenceSequenceFile fakeReferenceSequenceFile() { - return new ReferenceSequenceFile() { - public SAMSequenceDictionary getSequenceDictionary() { - SAMSequenceRecord sequenceRecord = new SAMSequenceRecord("chr1"); - SAMSequenceDictionary dictionary = new SAMSequenceDictionary(Collections.singletonList(sequenceRecord)); - return dictionary; - } - public ReferenceSequence nextSequence() { throw new UnsupportedOperationException("Fake implementation doesn't support a getter"); } - }; - } - @Test public void emptyLocusContextTest() { SAMRecordIterator iterator = new SAMRecordIterator(); @@ -70,7 +58,7 @@ public class LocusContextQueueTest extends BaseTest { Shard shard = new LocusShard(shardBounds); ShardDataProvider dataProvider = new ShardDataProvider( shard, iterator ); - LocusContextQueue queue = new LocusContextQueue( dataProvider ); + LocusContextQueue queue = createQueue( dataProvider ); testReadsInContext( queue, shard.getGenomeLoc(), Collections.emptyList() ); } @@ -84,9 +72,9 @@ public class LocusContextQueueTest extends BaseTest { Shard shard = new LocusShard(shardBounds); ShardDataProvider dataProvider = new ShardDataProvider( shard, iterator ); - LocusContextQueue queue = new LocusContextQueue( dataProvider ); + LocusContextQueue queue = createQueue( dataProvider ); - testReadsInContext( queue, shard.getGenomeLoc(), Collections.singletonList(read) ); + testReadsInContext( queue, shard.getGenomeLoc(), Collections.singletonList(read) ); } @Test @@ -96,7 +84,7 @@ public class LocusContextQueueTest extends BaseTest { Shard shard = new LocusShard(new GenomeLoc("chr1",1,10)); ShardDataProvider dataProvider = new ShardDataProvider( shard, iterator ); - LocusContextQueue queue = new LocusContextQueue( dataProvider ); + LocusContextQueue queue = createQueue( dataProvider ); testReadsInContext( queue, shard.getGenomeLoc(), Collections.singletonList(read) ); } @@ -108,7 +96,7 @@ public class LocusContextQueueTest extends BaseTest { Shard shard = new LocusShard(new GenomeLoc("chr1",1,10)); ShardDataProvider dataProvider = new ShardDataProvider( shard, iterator ); - LocusContextQueue queue = new LocusContextQueue( dataProvider ); + LocusContextQueue queue = createQueue( dataProvider ); testReadsInContext( queue, shard.getGenomeLoc(), Collections.singletonList(read) ); } @@ -120,7 +108,7 @@ public class LocusContextQueueTest extends BaseTest { Shard shard = new LocusShard(new GenomeLoc("chr1",1,10)); ShardDataProvider dataProvider = new ShardDataProvider( shard, iterator ); - LocusContextQueue queue = new LocusContextQueue( dataProvider ); + LocusContextQueue queue = createQueue( dataProvider ); testReadsInContext( queue, shard.getGenomeLoc(), Collections.singletonList(read) ); } @@ -132,7 +120,7 @@ public class LocusContextQueueTest extends BaseTest { Shard shard = new LocusShard(new GenomeLoc("chr1",6,15)); ShardDataProvider dataProvider = new ShardDataProvider( shard, iterator ); - LocusContextQueue queue = new LocusContextQueue( dataProvider ); + LocusContextQueue queue = createQueue( dataProvider ); testReadsInContext( queue, shard.getGenomeLoc(), Collections.singletonList(read) ); } @@ -144,7 +132,7 @@ public class LocusContextQueueTest extends BaseTest { Shard shard = new LocusShard(new GenomeLoc("chr1",1,10)); ShardDataProvider dataProvider = new ShardDataProvider( shard, iterator ); - LocusContextQueue queue = new LocusContextQueue( dataProvider ); + LocusContextQueue queue = createQueue( dataProvider ); testReadsInContext( queue, shard.getGenomeLoc(), Collections.singletonList(read) ); } @@ -157,7 +145,7 @@ public class LocusContextQueueTest extends BaseTest { Shard shard = new LocusShard(new GenomeLoc("chr1",1,10)); ShardDataProvider dataProvider = new ShardDataProvider( shard, iterator ); - LocusContextQueue queue = new LocusContextQueue( dataProvider ); + LocusContextQueue queue = createQueue( dataProvider ); List expectedReads = new ArrayList(); Collections.addAll(expectedReads,read1,read2); @@ -174,7 +162,7 @@ public class LocusContextQueueTest extends BaseTest { Shard shard = new LocusShard(new GenomeLoc("chr1",1,10)); ShardDataProvider dataProvider = new ShardDataProvider( shard, iterator ); - LocusContextQueue queue = new LocusContextQueue( dataProvider ); + LocusContextQueue queue = createQueue( dataProvider ); List expectedReads = new ArrayList(); Collections.addAll(expectedReads,read1,read2,read3,read4); @@ -191,7 +179,7 @@ public class LocusContextQueueTest extends BaseTest { Shard shard = new LocusShard(new GenomeLoc("chr1",1,10)); ShardDataProvider dataProvider = new ShardDataProvider( shard, iterator ); - LocusContextQueue queue = new LocusContextQueue( dataProvider ); + LocusContextQueue queue = createQueue( dataProvider ); List expectedReads = new ArrayList(); Collections.addAll(expectedReads,read1,read2,read3,read4); @@ -210,7 +198,7 @@ public class LocusContextQueueTest extends BaseTest { Shard shard = new LocusShard(new GenomeLoc("chr1",1,10)); ShardDataProvider dataProvider = new ShardDataProvider( shard, iterator ); - LocusContextQueue queue = new LocusContextQueue( dataProvider ); + LocusContextQueue queue = createQueue( dataProvider ); List expectedReads = new ArrayList(); Collections.addAll(expectedReads,read1,read2,read3,read4,read5,read6); @@ -236,13 +224,19 @@ public class LocusContextQueueTest extends BaseTest { Shard shard = new LocusShard(new GenomeLoc("chr1",6,15)); ShardDataProvider dataProvider = new ShardDataProvider( shard, iterator ); - LocusContextQueue queue = new LocusContextQueue( dataProvider ); + LocusContextQueue queue = createQueue( dataProvider ); List expectedReads = new ArrayList(); Collections.addAll(expectedReads,read01,read02,read03,read04,read05,read06, read07,read08,read09,read10,read11,read12); testReadsInContext( queue, shard.getGenomeLoc(), expectedReads ); - } + } + + /** + * Creates a queue of the type required for testing. + * @return The correct queue to test. + */ + protected abstract LocusContextQueue createQueue( ShardDataProvider provider ); /** * Test the reads according to an independently derived context. @@ -250,45 +244,48 @@ public class LocusContextQueueTest extends BaseTest { * @param bounds * @param reads */ - private void testReadsInContext( LocusContextQueue queue, GenomeLoc bounds, List reads ) { - Assert.assertEquals("Initial position of queue is incorrect", new GenomeLoc(bounds.getContig(),bounds.getStart()), queue.getSeekPoint() ); + protected abstract void testReadsInContext( LocusContextQueue queue, GenomeLoc bounds, List reads ); - for( long i = bounds.getStart(); i <= bounds.getStop(); i++ ) { - GenomeLoc site = new GenomeLoc("chr1",i); - queue.seek(site); - Assert.assertEquals("Seeked queue is incorrect", site, queue.getSeekPoint() ); - - LocusContext locusContext = queue.peek(); - Assert.assertEquals("Target locus context location is incorrect", site, locusContext.getLocation() ); - int expectedReadsAtSite = 0; - - for( SAMRecord read: reads ) { - if(new GenomeLoc(read).containsP(locusContext.getLocation())) { - Assert.assertTrue("Target locus context does not contain reads", locusContext.getReads().contains(read) ); - expectedReadsAtSite++; - } + /** + * Fake a reference sequence file. Essentially, seek a header with a bunch of dummy data. + * @return A 'fake' reference sequence file + */ + private static ReferenceSequenceFile fakeReferenceSequenceFile() { + return new ReferenceSequenceFile() { + public SAMSequenceDictionary getSequenceDictionary() { + SAMSequenceRecord sequenceRecord = new SAMSequenceRecord("chr1"); + SAMSequenceDictionary dictionary = new SAMSequenceDictionary(Collections.singletonList(sequenceRecord)); + return dictionary; } - - Assert.assertEquals("Found wrong number of reads at site", expectedReadsAtSite, locusContext.getReads().size()); - } - + public ReferenceSequence nextSequence() { throw new UnsupportedOperationException("Fake implementation doesn't support a getter"); } + }; } - private SAMRecord buildSAMRecord( String contig, int alignmentStart, int alignmentEnd ) { + /** + * Build a SAM record featuring the absolute minimum required dataset. + * @param contig Contig to populate. + * @param alignmentStart start of alignment + * @param alignmentEnd end of alignment + * @return New SAM Record + */ + protected SAMRecord buildSAMRecord( String contig, int alignmentStart, int alignmentEnd ) { SAMFileHeader header = new SAMFileHeader(); header.setSequenceDictionary(sequenceSourceFile.getSequenceDictionary()); - SAMRecord record = new SAMRecord(header); + SAMRecord record = new SAMRecord(header); record.setReferenceIndex(sequenceSourceFile.getSequenceDictionary().getSequenceIndex(contig)); record.setAlignmentStart(alignmentStart); Cigar cigar = new Cigar(); - cigar.add(new CigarElement(alignmentEnd-alignmentStart+1,CigarOperator.M)); + cigar.add(new CigarElement(alignmentEnd-alignmentStart+1, CigarOperator.M)); record.setCigar(cigar); return record; } - private class SAMRecordIterator implements StingSAMIterator { + /** + * A simple iterator which iterates over a list of reads. + */ + protected class SAMRecordIterator implements StingSAMIterator { private Iterator backingIterator = null; public SAMRecordIterator( SAMRecord... reads ) { @@ -317,4 +314,6 @@ public class LocusContextQueueTest extends BaseTest { throw new UnsupportedOperationException("Can't remove from a read-only iterator"); } } + + } diff --git a/java/test/org/broadinstitute/sting/gatk/dataSources/providers/SeekableLocusContextQueueTest.java b/java/test/org/broadinstitute/sting/gatk/dataSources/providers/SeekableLocusContextQueueTest.java new file mode 100755 index 000000000..80cb080ff --- /dev/null +++ b/java/test/org/broadinstitute/sting/gatk/dataSources/providers/SeekableLocusContextQueueTest.java @@ -0,0 +1,90 @@ +package org.broadinstitute.sting.gatk.dataSources.providers; + +import org.junit.Test; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.broadinstitute.sting.utils.GenomeLoc; +import org.broadinstitute.sting.gatk.dataSources.shards.Shard; +import org.broadinstitute.sting.gatk.dataSources.shards.LocusShard; +import org.broadinstitute.sting.gatk.iterators.StingSAMIterator; +import org.broadinstitute.sting.gatk.LocusContext; +import org.broadinstitute.sting.BaseTest; +import net.sf.samtools.SAMRecord; +import net.sf.samtools.Cigar; +import net.sf.samtools.CigarElement; +import net.sf.samtools.CigarOperator; +import net.sf.samtools.SAMSequenceDictionary; +import net.sf.samtools.SAMSequenceRecord; +import net.sf.samtools.SAMFileHeader; + +import java.util.List; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.Collections; +import java.io.FileNotFoundException; + +import edu.mit.broad.picard.reference.ReferenceSequenceFile; +import edu.mit.broad.picard.reference.ReferenceSequence; +/** + * User: hanna + * Date: May 12, 2009 + * Time: 2:34:46 PM + * BROAD INSTITUTE SOFTWARE COPYRIGHT NOTICE AND AGREEMENT + * Software and documentation are copyright 2005 by the Broad Institute. + * All rights are reserved. + * + * Users acknowledge that this software is supplied without any warranty or support. + * The Broad Institute is not responsible for its use, misuse, or + * functionality. + */ + +/** + * Test the locus context queue. + */ +public class SeekableLocusContextQueueTest extends LocusContextQueueTemplate { + + + + /** + * Retrieve a seekable locus context queue. + */ + @Override + protected LocusContextQueue createQueue(ShardDataProvider provider) { + return new SeekableLocusContextQueue(provider); + } + + /** + * Test the reads according to an independently derived context. + * @param queue + * @param bounds + * @param reads + */ + @Override + protected void testReadsInContext( LocusContextQueue queue, GenomeLoc bounds, List reads ) { + SeekableLocusContextQueue seekableQueue = (SeekableLocusContextQueue)queue; + + Assert.assertEquals("Initial position of queue is incorrect", new GenomeLoc(bounds.getContig(),bounds.getStart()), seekableQueue.getSeekPoint() ); + + for( long i = bounds.getStart(); i <= bounds.getStop(); i++ ) { + GenomeLoc site = new GenomeLoc("chr1",i); + seekableQueue.seek(site); + Assert.assertEquals("Seeked queue is incorrect", site, seekableQueue.getSeekPoint() ); + + LocusContext locusContext = seekableQueue.peek(); + Assert.assertEquals("Target locus context location is incorrect", site, locusContext.getLocation() ); + int expectedReadsAtSite = 0; + + for( SAMRecord read: reads ) { + if(new GenomeLoc(read).containsP(locusContext.getLocation())) { + Assert.assertTrue("Target locus context does not contain reads", locusContext.getReads().contains(read) ); + expectedReadsAtSite++; + } + } + + Assert.assertEquals("Found wrong number of reads at site", expectedReadsAtSite, locusContext.getReads().size()); + } + + } + +} diff --git a/java/test/org/broadinstitute/sting/gatk/executive/ReduceTreeTest.java b/java/test/org/broadinstitute/sting/gatk/executive/ReduceTreeTest.java index 9d5495e07..1333f0c67 100755 --- a/java/test/org/broadinstitute/sting/gatk/executive/ReduceTreeTest.java +++ b/java/test/org/broadinstitute/sting/gatk/executive/ReduceTreeTest.java @@ -5,6 +5,7 @@ import org.junit.Test; import org.junit.Before; import org.junit.After; import org.junit.Ignore; +import org.broadinstitute.sting.BaseTest; import java.util.concurrent.Callable; import java.util.concurrent.Future; @@ -29,7 +30,7 @@ import java.util.ArrayList; * Make sure the reduce tree organizes reduces in the correct way. */ -public class ReduceTreeTest implements ReduceTree.TreeReduceNotifier { +public class ReduceTreeTest extends BaseTest implements ReduceTree.TreeReduceNotifier { /** * The tree indicating reduce order. diff --git a/java/test/org/broadinstitute/sting/utils/threading/ThreadPoolMonitorTest.java b/java/test/org/broadinstitute/sting/utils/threading/ThreadPoolMonitorTest.java index 551533fec..4ecba448a 100755 --- a/java/test/org/broadinstitute/sting/utils/threading/ThreadPoolMonitorTest.java +++ b/java/test/org/broadinstitute/sting/utils/threading/ThreadPoolMonitorTest.java @@ -1,9 +1,11 @@ package org.broadinstitute.sting.utils.threading; import org.junit.Test; +import org.broadinstitute.sting.BaseTest; import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; /** +import java.util.concurrent.Executors; +/** * User: hanna * Date: Apr 29, 2009 * Time: 4:30:55 PM @@ -20,7 +22,7 @@ import java.util.concurrent.Executors; /** * Tests for the thread pool monitor class. */ -public class ThreadPoolMonitorTest { +public class ThreadPoolMonitorTest extends BaseTest { private ExecutorService threadPool = Executors.newFixedThreadPool(1); /**