From 2c55ac1374ef86c94f13b8adb72617424430f42a Mon Sep 17 00:00:00 2001 From: aaron Date: Wed, 12 May 2010 06:13:26 +0000 Subject: [PATCH] fixes for parallel processing problems with Tribble, a small bug in the resource pool, and some more documentation. git-svn-id: file:///humgen/gsa-scr1/gsa-engineering/svn_contents/trunk@3349 348d0f76-0448-11de-a6fe-93d51630548a --- .../ReferenceOrderedDataSource.java | 127 +++++++----------- .../simpleDataSources/ResourcePool.java | 23 ++-- .../io/storage/GenotypeWriterStorage.java | 1 + .../io/storage/VCFGenotypeWriterStorage.java | 4 +- .../gatk/iterators/PeekableRODIterator.java | 46 ------- .../gatk/iterators/PushbackIterator.java | 2 - .../gatk/refdata/SeekableRODIterator.java | 9 +- .../refdata/tracks/FeatureReaderTrack.java | 11 +- .../gatk/refdata/tracks/QueryableTrack.java | 9 +- .../sting/gatk/refdata/tracks/RMDTrack.java | 3 +- .../gatk/refdata/tracks/RODRMDTrack.java | 3 +- .../builders/TribbleRMDTrackBuilder.java | 28 ++-- .../utils/FeatureToGATKFeatureIterator.java | 12 +- .../refdata/utils/GATKFeatureIterator.java | 8 +- .../LocationAwareSeekableRODIterator.java | 6 +- .../walkers/sequenom/PickSequenomProbes.java | 3 +- .../walkers/DbSNPWindowCounter.java | 4 +- .../utils/genotype/vcf/VCFGenotypeWriter.java | 2 +- .../sting/utils/genotype/vcf/VCFReader.java | 54 ++++++-- ...ReadBasedReferenceOrderedViewUnitTest.java | 5 + .../LocusIteratorByStateUnitTest.java | 34 ++++- .../TribbleRMDTrackBuilderUnitTest.java | 2 +- .../utils/FlashBackIteratorUnitTest.java | 5 + settings/repository/org.broad/tribble-79.xml | 3 - .../{tribble-79.jar => tribble-80.jar} | Bin 211708 -> 197063 bytes settings/repository/org.broad/tribble-80.xml | 3 + 26 files changed, 204 insertions(+), 203 deletions(-) delete mode 100644 java/src/org/broadinstitute/sting/gatk/iterators/PeekableRODIterator.java delete mode 100644 settings/repository/org.broad/tribble-79.xml rename settings/repository/org.broad/{tribble-79.jar => tribble-80.jar} (81%) create mode 100644 settings/repository/org.broad/tribble-80.xml diff --git a/java/src/org/broadinstitute/sting/gatk/datasources/simpleDataSources/ReferenceOrderedDataSource.java b/java/src/org/broadinstitute/sting/gatk/datasources/simpleDataSources/ReferenceOrderedDataSource.java index eba717cd0..55f4d1f3f 100755 --- a/java/src/org/broadinstitute/sting/gatk/datasources/simpleDataSources/ReferenceOrderedDataSource.java +++ b/java/src/org/broadinstitute/sting/gatk/datasources/simpleDataSources/ReferenceOrderedDataSource.java @@ -1,12 +1,13 @@ package org.broadinstitute.sting.gatk.datasources.simpleDataSources; +import org.broad.tribble.FeatureReader; import org.broadinstitute.sting.gatk.datasources.shards.Shard; import org.broadinstitute.sting.gatk.refdata.SeekableRODIterator; -import org.broadinstitute.sting.gatk.refdata.tracks.QueryableTrack; import org.broadinstitute.sting.gatk.refdata.tracks.RMDTrack; +import org.broadinstitute.sting.gatk.refdata.tracks.builders.TribbleRMDTrackBuilder; +import org.broadinstitute.sting.gatk.refdata.utils.FeatureToGATKFeatureIterator; import org.broadinstitute.sting.gatk.refdata.utils.FlashBackIterator; import org.broadinstitute.sting.gatk.refdata.utils.LocationAwareSeekableRODIterator; -import org.broadinstitute.sting.gatk.refdata.utils.RODRecordList; import org.broadinstitute.sting.gatk.walkers.ReadWalker; import org.broadinstitute.sting.gatk.walkers.Walker; import org.broadinstitute.sting.utils.GenomeLoc; @@ -41,7 +42,7 @@ public class ReferenceOrderedDataSource implements SimpleDataSource { /** * A pool of iterators for navigating through the genome. */ - private final ReferenceOrderedDataPool iteratorPool; + private final ResourcePool iteratorPool; /** * Create a new reference-ordered data source. @@ -49,8 +50,10 @@ public class ReferenceOrderedDataSource implements SimpleDataSource { */ public ReferenceOrderedDataSource( Walker walker, RMDTrack rod) { this.rod = rod; - if (rod.supportsQuery()) iteratorPool = null; - else iteratorPool = new ReferenceOrderedDataPool( walker, rod ); + if (rod.supportsQuery()) + iteratorPool = new ReferenceOrderedQueryDataPool(new TribbleRMDTrackBuilder(), rod); + else + iteratorPool = new ReferenceOrderedDataPool( walker, rod ); } /** @@ -75,11 +78,8 @@ public class ReferenceOrderedDataSource implements SimpleDataSource { * @return Iterator through the data. */ public LocationAwareSeekableRODIterator seek( Shard shard ) { - if (iteratorPool == null) // use query - return getQuery(shard.getGenomeLocs() == null || shard.getGenomeLocs().size() == 0 ? null : shard.getGenomeLocs()); DataStreamSegment dataStreamSegment = shard.getGenomeLocs().size() != 0 ? new MappedStreamSegment(shard.getGenomeLocs().get(0)) : new EntireStream(); - LocationAwareSeekableRODIterator RODIterator = iteratorPool.iterator(dataStreamSegment); - return RODIterator; + return iteratorPool.iterator(dataStreamSegment); } /** @@ -90,30 +90,17 @@ public class ReferenceOrderedDataSource implements SimpleDataSource { * @return Iterator through the data. */ public LocationAwareSeekableRODIterator seek(GenomeLoc loc) { - if (iteratorPool == null) // use query - return getQuery(loc == null ? null : Arrays.asList(loc)); DataStreamSegment dataStreamSegment = loc != null ? new MappedStreamSegment(loc) : new EntireStream(); - LocationAwareSeekableRODIterator RODIterator = iteratorPool.iterator(dataStreamSegment); - return RODIterator; + return iteratorPool.iterator(dataStreamSegment); } - /** - * assuming the ROD is a queryable ROD, use that interface to get an iterator to the selected region - * @param loc the region to query for - * @return a LocationAwareSeekableRODIterator over the selected region - */ - private LocationAwareSeekableRODIterator getQuery(List loc) { - if (loc == null) // for the mono shard case - return new SeekableRODIterator(rod.getIterator()); - return new StitchingLocationAwareSeekableRODIterator(loc,(QueryableTrack)rod); - } /** * Close the specified iterator, returning it to the pool. * @param iterator Iterator to close. */ public void close( LocationAwareSeekableRODIterator iterator ) { - if (iteratorPool != null) iteratorPool.release(iterator); + iteratorPool.release(iterator); } } @@ -189,78 +176,54 @@ class ReferenceOrderedDataPool extends ResourcePool { - // the list of intervals we're iterating over - private final LinkedList locationList; + // the reference-ordered data itself. + private final RMDTrack rod; - // The reference-ordered data itself. - private final QueryableTrack rod; + // our tribble track builder + private final TribbleRMDTrackBuilder builder; - // the current iterator - private SeekableRODIterator iterator; - - StitchingLocationAwareSeekableRODIterator(List list, QueryableTrack rmd) { - rod = rmd; - locationList = new LinkedList(); - locationList.addAll(list); - fetchNextInterval(); + public ReferenceOrderedQueryDataPool( TribbleRMDTrackBuilder builder, RMDTrack rod ) { + this.rod = rod; + this.builder = builder; } @Override - public GenomeLoc peekNextLocation() { - if (iterator == null) return null; - return iterator.peekNextLocation(); + protected FeatureReader createNewResource() { + return builder.createFeatureReader(rod.getType(),rod.getFile()); } @Override - public GenomeLoc position() { - if (iterator == null) return null; - return iterator.position(); + protected FeatureReader selectBestExistingResource(DataStreamSegment segment, List availableResources) { + for (FeatureReader reader : availableResources) + if (reader != null) return reader; + return null; } @Override - public RODRecordList seekForward(GenomeLoc interval) { - RODRecordList list = iterator.seekForward(interval); - if (list == null) { // we were unable to seek the current interval to the location - fetchNextInterval(); - list = iterator.seekForward(interval); - } - return list; - } - - @Override - public boolean hasNext() { - if (iterator == null) return false; - return iterator.hasNext(); - } - - @Override - public RODRecordList next() { - if (!hasNext()) throw new IllegalStateException("StitchingLocationAwareSeekableRODIterator: We do not have a next"); - RODRecordList list = iterator.next(); - if (!iterator.hasNext()) fetchNextInterval(); - return list; - } - - @Override - public void remove() { - throw new UnsupportedOperationException("\"Thou shall not remove()!\" - Software Engineering Team"); - } - - private void fetchNextInterval() { - if (locationList != null && locationList.size() > 0) { - GenomeLoc loc = locationList.getFirst(); - locationList.removeFirst(); - if (rod == null) throw new StingException("Unable to query(), target rod is null, next location = " + ((locationList != null) ? locationList.getFirst() : "null")); - try { - iterator = new SeekableRODIterator(rod.query(loc)); - } catch (IOException e) { - throw new StingException("Unable to query iterator with location " + loc + " and rod name of " + ((RMDTrack)rod).getName()); + protected LocationAwareSeekableRODIterator createIteratorFromResource(DataStreamSegment position, FeatureReader resource) { + try { + if (position instanceof MappedStreamSegment) { + GenomeLoc pos = ((MappedStreamSegment) position).locus; + //System.err.println("Querying position1 " + pos.getContig() + " start " + pos.getStart() + " stop " + pos.getStop()); + return new SeekableRODIterator(new FeatureToGATKFeatureIterator(resource.query(pos.getContig(), (int) pos.getStart(), (int) pos.getStop()),rod.getName())); + } else { + return new SeekableRODIterator(new FeatureToGATKFeatureIterator(resource.iterator(),rod.getName())); } + } catch (IOException e) { + throw new StingException("Unable to create iterator for rod named " + rod.getName()); + } + } + + @Override + protected void closeResource(FeatureReader resource) { + try { + resource.close(); + } catch (IOException e) { + throw new StingException("Unable to close reader for rod named " + rod.getName()); } } } diff --git a/java/src/org/broadinstitute/sting/gatk/datasources/simpleDataSources/ResourcePool.java b/java/src/org/broadinstitute/sting/gatk/datasources/simpleDataSources/ResourcePool.java index 91d92a7b2..90564444a 100755 --- a/java/src/org/broadinstitute/sting/gatk/datasources/simpleDataSources/ResourcePool.java +++ b/java/src/org/broadinstitute/sting/gatk/datasources/simpleDataSources/ResourcePool.java @@ -50,26 +50,27 @@ abstract class ResourcePool { public I iterator( DataStreamSegment segment ) { // Grab the first iterator in the list whose position is before the requested position. T selectedResource = null; - synchronized(this) { - selectedResource = selectBestExistingResource( segment, availableResources ); + synchronized (this) { + selectedResource = selectBestExistingResource(segment, availableResources); // No iterator found? Create another. It is expected that // each iterator created will have its own file handle. - if( selectedResource == null ) { + if (selectedResource == null) { selectedResource = createNewResource(); - addNewResource( selectedResource ); + addNewResource(selectedResource); } // Remove the iterator from the list of available iterators. availableResources.remove(selectedResource); + + + I iterator = createIteratorFromResource(segment, selectedResource); + + // Make a note of this assignment for proper releasing later. + resourceAssignments.put(iterator, selectedResource); + + return iterator; } - - I iterator = createIteratorFromResource( segment, selectedResource ); - - // Make a note of this assignment for proper releasing later. - resourceAssignments.put( iterator, selectedResource ); - - return iterator; } /** diff --git a/java/src/org/broadinstitute/sting/gatk/io/storage/GenotypeWriterStorage.java b/java/src/org/broadinstitute/sting/gatk/io/storage/GenotypeWriterStorage.java index a0351a81e..145169d09 100755 --- a/java/src/org/broadinstitute/sting/gatk/io/storage/GenotypeWriterStorage.java +++ b/java/src/org/broadinstitute/sting/gatk/io/storage/GenotypeWriterStorage.java @@ -73,6 +73,7 @@ public abstract class GenotypeWriterStorage implements this.stream = null; writer = GenotypeWriterFactory.create(stub.getFormat(), file); Set samples = SampleUtils.getSAMFileSamples(stub.getSAMFileHeader()); + // TODO: this line is a problem, creating with an empty hashset eliminates any genotype FORMAT fields in the calls (besides GT) GenotypeWriterFactory.writeHeader(writer, stub.getSAMFileHeader(), samples, new HashSet()); } diff --git a/java/src/org/broadinstitute/sting/gatk/io/storage/VCFGenotypeWriterStorage.java b/java/src/org/broadinstitute/sting/gatk/io/storage/VCFGenotypeWriterStorage.java index d142a5ffb..873e51b1c 100644 --- a/java/src/org/broadinstitute/sting/gatk/io/storage/VCFGenotypeWriterStorage.java +++ b/java/src/org/broadinstitute/sting/gatk/io/storage/VCFGenotypeWriterStorage.java @@ -64,11 +64,11 @@ public class VCFGenotypeWriterStorage extends GenotypeWriterStorage - * Class PeekableRODIterator - *

- * the methods attached to a peekable ROD iterator - */ -public interface PeekableRODIterator extends Iterator> { - public GenomeLoc peekNextLocation(); - - public RODRecordList seekForward(GenomeLoc interval); -} - diff --git a/java/src/org/broadinstitute/sting/gatk/iterators/PushbackIterator.java b/java/src/org/broadinstitute/sting/gatk/iterators/PushbackIterator.java index b8633c401..d3b6e3e14 100755 --- a/java/src/org/broadinstitute/sting/gatk/iterators/PushbackIterator.java +++ b/java/src/org/broadinstitute/sting/gatk/iterators/PushbackIterator.java @@ -30,7 +30,6 @@ public class PushbackIterator implements Iterator, Iterable { /** * Retrieves, but does not remove, the head of this iterator. * @return T the next element in the iterator - * @throws NoSuchElementException - if the iterator doesn't have a next element */ public T element() { T x = next(); @@ -40,7 +39,6 @@ public class PushbackIterator implements Iterator, Iterable { /** * @return the next element in the iteration. - * @throws NoSuchElementException - iteration has no more elements. */ public T next() { if (pushedElement != null) { diff --git a/java/src/org/broadinstitute/sting/gatk/refdata/SeekableRODIterator.java b/java/src/org/broadinstitute/sting/gatk/refdata/SeekableRODIterator.java index 3992c129b..d670c9bfc 100644 --- a/java/src/org/broadinstitute/sting/gatk/refdata/SeekableRODIterator.java +++ b/java/src/org/broadinstitute/sting/gatk/refdata/SeekableRODIterator.java @@ -1,5 +1,6 @@ package org.broadinstitute.sting.gatk.refdata; +import net.sf.samtools.util.CloseableIterator; import org.broadinstitute.sting.gatk.iterators.PushbackIterator; import org.broadinstitute.sting.gatk.refdata.utils.GATKFeature; import org.broadinstitute.sting.gatk.refdata.utils.LocationAwareSeekableRODIterator; @@ -78,7 +79,7 @@ public class SeekableRODIterator implements LocationAwareSeekableRODIterator { // This implementation tracks the query history and makes next() illegal after a seekforward query of length > 1, // but re-enables next() again after a length-1 query. - public SeekableRODIterator(Iterator it) { + public SeekableRODIterator(CloseableIterator it) { this.it = new PushbackIterator(it); records = new LinkedList(); // the following is a trick: we would like the iterator to know the actual name assigned to @@ -169,7 +170,7 @@ public class SeekableRODIterator implements LocationAwareSeekableRODIterator { if ( r.getLocation().getStart() < curr_position ) throw new StingException("LocationAwareSeekableRODIterator: track "+r.getName() + - " is out of coordinate order on contig "+r.getLocation().getContig()); + " is out of coordinate order on contig "+r.getLocation() + " compared to " + curr_contig + ":" + curr_position); if ( r.getLocation().getStart() > curr_position ) break; // next record starts after the current position; we do not need it yet @@ -334,4 +335,8 @@ public class SeekableRODIterator implements LocationAwareSeekableRODIterator { } + @Override + public void close() { + if (this.it != null) ((CloseableIterator)this.it.getUnderlyingIterator()).close(); + } } diff --git a/java/src/org/broadinstitute/sting/gatk/refdata/tracks/FeatureReaderTrack.java b/java/src/org/broadinstitute/sting/gatk/refdata/tracks/FeatureReaderTrack.java index e88f1b43b..b70cc9921 100644 --- a/java/src/org/broadinstitute/sting/gatk/refdata/tracks/FeatureReaderTrack.java +++ b/java/src/org/broadinstitute/sting/gatk/refdata/tracks/FeatureReaderTrack.java @@ -23,6 +23,7 @@ package org.broadinstitute.sting.gatk.refdata.tracks; +import net.sf.samtools.util.CloseableIterator; import org.broad.tribble.FeatureReader; import org.broadinstitute.sting.gatk.refdata.utils.FeatureToGATKFeatureIterator; import org.broadinstitute.sting.gatk.refdata.utils.GATKFeature; @@ -64,7 +65,7 @@ public class FeatureReaderTrack extends RMDTrack implements QueryableTrack { * but other more advanced tracks support the query interface */ @Override - public Iterator getIterator() { + public CloseableIterator getIterator() { try { return new FeatureToGATKFeatureIterator(reader.iterator(),this.getName()); } catch (IOException e) { @@ -83,22 +84,22 @@ public class FeatureReaderTrack extends RMDTrack implements QueryableTrack { } @Override - public Iterator query(GenomeLoc interval) throws IOException { + public CloseableIterator query(GenomeLoc interval) throws IOException { return new FeatureToGATKFeatureIterator(reader.query(interval.getContig(),(int)interval.getStart(),(int)interval.getStop()),this.getName()); } @Override - public Iterator query(GenomeLoc interval, boolean contained) throws IOException { + public CloseableIterator query(GenomeLoc interval, boolean contained) throws IOException { return new FeatureToGATKFeatureIterator(reader.query(interval.getContig(),(int)interval.getStart(),(int)interval.getStop(), contained),this.getName()); } @Override - public Iterator query(String contig, int start, int stop) throws IOException { + public CloseableIterator query(String contig, int start, int stop) throws IOException { return new FeatureToGATKFeatureIterator(reader.query(contig,start,stop),this.getName()); } @Override - public Iterator query(String contig, int start, int stop, boolean contained) throws IOException { + public CloseableIterator query(String contig, int start, int stop, boolean contained) throws IOException { return new FeatureToGATKFeatureIterator(reader.query(contig,start,stop, contained),this.getName()); } diff --git a/java/src/org/broadinstitute/sting/gatk/refdata/tracks/QueryableTrack.java b/java/src/org/broadinstitute/sting/gatk/refdata/tracks/QueryableTrack.java index a8dc82de3..19050ae11 100644 --- a/java/src/org/broadinstitute/sting/gatk/refdata/tracks/QueryableTrack.java +++ b/java/src/org/broadinstitute/sting/gatk/refdata/tracks/QueryableTrack.java @@ -23,6 +23,7 @@ package org.broadinstitute.sting.gatk.refdata.tracks; +import net.sf.samtools.util.CloseableIterator; import org.broadinstitute.sting.gatk.refdata.utils.GATKFeature; import org.broadinstitute.sting.utils.GenomeLoc; @@ -37,9 +38,9 @@ import java.util.Iterator; * a decorator interface for tracks that are queryable */ public interface QueryableTrack { - public Iterator query(final GenomeLoc interval) throws IOException; - public Iterator query(final GenomeLoc interval, final boolean contained) throws IOException; - public Iterator query(final String contig, final int start, final int stop) throws IOException; - public Iterator query(final String contig, final int start, final int stop, final boolean contained) throws IOException; + public CloseableIterator query(final GenomeLoc interval) throws IOException; + public CloseableIterator query(final GenomeLoc interval, final boolean contained) throws IOException; + public CloseableIterator query(final String contig, final int start, final int stop) throws IOException; + public CloseableIterator query(final String contig, final int start, final int stop, final boolean contained) throws IOException; public void close(); } diff --git a/java/src/org/broadinstitute/sting/gatk/refdata/tracks/RMDTrack.java b/java/src/org/broadinstitute/sting/gatk/refdata/tracks/RMDTrack.java index d37d16860..aedac5305 100644 --- a/java/src/org/broadinstitute/sting/gatk/refdata/tracks/RMDTrack.java +++ b/java/src/org/broadinstitute/sting/gatk/refdata/tracks/RMDTrack.java @@ -23,6 +23,7 @@ package org.broadinstitute.sting.gatk.refdata.tracks; +import net.sf.samtools.util.CloseableIterator; import org.broadinstitute.sting.gatk.refdata.utils.GATKFeature; import java.io.File; @@ -73,7 +74,7 @@ public abstract class RMDTrack { * @return how to get an iterator of the underlying data. This is all a track has to support, * but other more advanced tracks support the query interface */ - public abstract Iterator getIterator(); + public abstract CloseableIterator getIterator(); /** * helper function for determining if we are the same track diff --git a/java/src/org/broadinstitute/sting/gatk/refdata/tracks/RODRMDTrack.java b/java/src/org/broadinstitute/sting/gatk/refdata/tracks/RODRMDTrack.java index 0ee93193c..88a19005c 100644 --- a/java/src/org/broadinstitute/sting/gatk/refdata/tracks/RODRMDTrack.java +++ b/java/src/org/broadinstitute/sting/gatk/refdata/tracks/RODRMDTrack.java @@ -23,6 +23,7 @@ package org.broadinstitute.sting.gatk.refdata.tracks; +import net.sf.samtools.util.CloseableIterator; import org.broadinstitute.sting.gatk.refdata.ReferenceOrderedData; import org.broadinstitute.sting.gatk.refdata.utils.GATKFeature; import org.broadinstitute.sting.gatk.refdata.utils.GATKFeatureIterator; @@ -64,7 +65,7 @@ public class RODRMDTrack extends RMDTrack { * but other more advanced tracks support the query interface */ @Override - public Iterator getIterator() { + public CloseableIterator getIterator() { return new GATKFeatureIterator(data.iterator()); } diff --git a/java/src/org/broadinstitute/sting/gatk/refdata/tracks/builders/TribbleRMDTrackBuilder.java b/java/src/org/broadinstitute/sting/gatk/refdata/tracks/builders/TribbleRMDTrackBuilder.java index c46f012b6..3d64aaa7c 100644 --- a/java/src/org/broadinstitute/sting/gatk/refdata/tracks/builders/TribbleRMDTrackBuilder.java +++ b/java/src/org/broadinstitute/sting/gatk/refdata/tracks/builders/TribbleRMDTrackBuilder.java @@ -26,11 +26,10 @@ package org.broadinstitute.sting.gatk.refdata.tracks.builders; import org.apache.log4j.Logger; -import org.broad.tribble.Feature; -import org.broad.tribble.FeatureCodec; -import org.broad.tribble.FeatureReader; +import org.broad.tribble.*; import org.broad.tribble.index.linear.LinearIndex; import org.broad.tribble.index.linear.LinearIndexCreator; +import org.broad.tribble.readers.BasicFeatureReader; import org.broadinstitute.sting.gatk.refdata.tracks.FeatureReaderTrack; import org.broadinstitute.sting.gatk.refdata.tracks.RMDTrack; import org.broadinstitute.sting.gatk.refdata.tracks.RMDTrackCreationException; @@ -53,16 +52,6 @@ import java.util.Map; * This class keeps track of the available codecs, and knows how to put together a track of * that gets iterators from the FeatureReader using Tribble. * - * Here's an example run command to find SNPs 200 base pairs up and downstream of the target file. - * - * java -jar dist/GenomeAnalysisTK.jar \ - * -R /broad/1KG/reference/human_b36_both.fasta \ - * -L 1:1863 \ - * -L MT:16520 \ - * -db /humgen/gsa-hpprojects/GATK/data/Comparisons/Validated/dbSNP/dbsnp_129_b36.rod \ - * -dbw 200 \ - * -l INFO \ - * -T DbSNPWindowCounter */ public class TribbleRMDTrackBuilder extends PluginManager implements RMDTrackBuilder { /** @@ -120,11 +109,11 @@ public class TribbleRMDTrackBuilder extends PluginManager implemen // check to see if the input file has an index if (requireIndex(inputFile)) { logger.warn("Creating Tribble Index for file " + inputFile); - LinearIndex index = createIndex(inputFile, this.createByType(targetClass)); - reader = new FeatureReader(inputFile,index, this.createByType(targetClass)); + LinearIndex index = createIndex(inputFile, this.createByType(targetClass), true); + reader = new BasicFeatureReader(inputFile,index, this.createByType(targetClass)); } else { - reader = new FeatureReader(inputFile,this.createByType(targetClass)); + reader = new BasicFeatureReader(inputFile,this.createByType(targetClass)); } } catch (FileNotFoundException e) { throw new StingException("Unable to create reader with file " + inputFile, e); @@ -138,18 +127,19 @@ public class TribbleRMDTrackBuilder extends PluginManager implemen * create an index for the input file * @param inputFile the input file * @param codec the codec to use + * @param onDisk write the index to disk? * @return a linear index for the specified type * @throws IOException if we cannot write the index file */ - public static LinearIndex createIndex(File inputFile, FeatureCodec codec) throws IOException { + public static LinearIndex createIndex(File inputFile, FeatureCodec codec, boolean onDisk) throws IOException { LinearIndexCreator create = new LinearIndexCreator(inputFile, codec); // if we can write the index, we should, but if not just create it in memory File indexFile = new File(inputFile.getAbsoluteFile() + linearIndexExtension); - if (indexFile.getParentFile().canWrite() && (!indexFile.exists() || indexFile.canWrite())) + if (indexFile.getParentFile().canWrite() && (!indexFile.exists() || indexFile.canWrite()) && onDisk) return create.createIndex(); else { - logger.info("Unable to write to location " + indexFile + " for index file, creating index in memory only"); + if (onDisk) logger.info("Unable to write to location " + indexFile + " for index file, creating index in memory only"); return create.createIndex(null); } diff --git a/java/src/org/broadinstitute/sting/gatk/refdata/utils/FeatureToGATKFeatureIterator.java b/java/src/org/broadinstitute/sting/gatk/refdata/utils/FeatureToGATKFeatureIterator.java index 99a93f72c..f2fb8ffd5 100644 --- a/java/src/org/broadinstitute/sting/gatk/refdata/utils/FeatureToGATKFeatureIterator.java +++ b/java/src/org/broadinstitute/sting/gatk/refdata/utils/FeatureToGATKFeatureIterator.java @@ -23,6 +23,7 @@ package org.broadinstitute.sting.gatk.refdata.utils; +import net.sf.samtools.util.CloseableIterator; import org.broad.tribble.Feature; import java.util.Iterator; @@ -36,11 +37,11 @@ import java.util.Iterator; * * a wrapper on Tribble feature iterators so that they produce GATKFeatures (which produce GenomeLocs) */ -public class FeatureToGATKFeatureIterator implements Iterator { - private final Iterator iterator; +public class FeatureToGATKFeatureIterator implements CloseableIterator { + private final CloseableIterator iterator; private final String name; - public FeatureToGATKFeatureIterator(Iterator iter, String name) { + public FeatureToGATKFeatureIterator(CloseableIterator iter, String name) { this.name = name; this.iterator = iter; } @@ -59,4 +60,9 @@ public class FeatureToGATKFeatureIterator implements Iterator { public void remove() { throw new UnsupportedOperationException("Why does Iterator have this method? We always throw an exception here"); } + + @Override + public void close() { + this.iterator.close(); + } } diff --git a/java/src/org/broadinstitute/sting/gatk/refdata/utils/GATKFeatureIterator.java b/java/src/org/broadinstitute/sting/gatk/refdata/utils/GATKFeatureIterator.java index c366cffaa..17c9fa718 100644 --- a/java/src/org/broadinstitute/sting/gatk/refdata/utils/GATKFeatureIterator.java +++ b/java/src/org/broadinstitute/sting/gatk/refdata/utils/GATKFeatureIterator.java @@ -23,6 +23,7 @@ package org.broadinstitute.sting.gatk.refdata.utils; +import net.sf.samtools.util.CloseableIterator; import org.broadinstitute.sting.gatk.refdata.ReferenceOrderedDatum; import java.util.Iterator; @@ -36,7 +37,7 @@ import java.util.Iterator; * * Takes a RODatum iterator and makes it an iterator of GATKFeatures. Shazam! */ -public class GATKFeatureIterator implements Iterator { +public class GATKFeatureIterator implements CloseableIterator { private final Iterator iter; public GATKFeatureIterator(Iterator iter) { this.iter = iter; @@ -56,4 +57,9 @@ public class GATKFeatureIterator implements Iterator { public void remove() { throw new UnsupportedOperationException("Remove not supported"); } + + @Override + public void close() { + // do nothing, our underlying iterator doesn't support this + } } diff --git a/java/src/org/broadinstitute/sting/gatk/refdata/utils/LocationAwareSeekableRODIterator.java b/java/src/org/broadinstitute/sting/gatk/refdata/utils/LocationAwareSeekableRODIterator.java index df2cc8b33..29e42eab6 100644 --- a/java/src/org/broadinstitute/sting/gatk/refdata/utils/LocationAwareSeekableRODIterator.java +++ b/java/src/org/broadinstitute/sting/gatk/refdata/utils/LocationAwareSeekableRODIterator.java @@ -1,5 +1,6 @@ package org.broadinstitute.sting.gatk.refdata.utils; +import net.sf.samtools.util.CloseableIterator; import org.broadinstitute.sting.gatk.refdata.ReferenceOrderedDatum; import org.broadinstitute.sting.utils.GenomeLoc; @@ -13,11 +14,10 @@ import java.util.List; *

* combine iteration with a position aware interface */ -public interface LocationAwareSeekableRODIterator extends Iterator { +public interface LocationAwareSeekableRODIterator extends CloseableIterator { public GenomeLoc peekNextLocation(); public GenomeLoc position(); - public RODRecordList seekForward(GenomeLoc interval); - + public RODRecordList seekForward(GenomeLoc interval); } diff --git a/java/src/org/broadinstitute/sting/gatk/walkers/sequenom/PickSequenomProbes.java b/java/src/org/broadinstitute/sting/gatk/walkers/sequenom/PickSequenomProbes.java index 7e0eff304..7ca79fdd6 100755 --- a/java/src/org/broadinstitute/sting/gatk/walkers/sequenom/PickSequenomProbes.java +++ b/java/src/org/broadinstitute/sting/gatk/walkers/sequenom/PickSequenomProbes.java @@ -25,6 +25,7 @@ package org.broadinstitute.sting.gatk.walkers.sequenom; +import net.sf.samtools.util.CloseableIterator; import org.broad.tribble.dbsnp.DbSNPFeature; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; @@ -73,7 +74,7 @@ public class PickSequenomProbes extends RodWalker { ReferenceOrderedData snp_mask; if ( SNP_MASK.contains(DbSNPHelper.STANDARD_DBSNP_TRACK_NAME)) { TribbleRMDTrackBuilder builder = new TribbleRMDTrackBuilder(); - Iterator iter = builder.createInstanceOfTrack(DbSNPFeature.class,"snp_mask",new java.io.File(SNP_MASK)).getIterator(); + CloseableIterator iter = builder.createInstanceOfTrack(DbSNPFeature.class,"snp_mask",new java.io.File(SNP_MASK)).getIterator(); snpMaskIterator = new SeekableRODIterator(iter); } else { diff --git a/java/src/org/broadinstitute/sting/oneoffprojects/walkers/DbSNPWindowCounter.java b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/DbSNPWindowCounter.java index 30b84a3dd..b9ed2cf3b 100644 --- a/java/src/org/broadinstitute/sting/oneoffprojects/walkers/DbSNPWindowCounter.java +++ b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/DbSNPWindowCounter.java @@ -1,9 +1,11 @@ package org.broadinstitute.sting.oneoffprojects.walkers; +import net.sf.samtools.util.CloseableIterator; import org.broad.tribble.FeatureIterator; import org.broad.tribble.FeatureReader; import org.broad.tribble.dbsnp.DbSNPCodec; import org.broad.tribble.dbsnp.DbSNPFeature; +import org.broad.tribble.util.CloseableTribbleIterator; import org.broadinstitute.sting.commandline.Argument; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; @@ -49,7 +51,7 @@ public class DbSNPWindowCounter extends LocusWalker { public Integer map(RefMetaDataTracker tracker, ReferenceContext ref, AlignmentContext context) { - FeatureIterator dbSNPs; + CloseableTribbleIterator dbSNPs; // our upstream and downstream window locations int windowStart = (int)Math.max(context.getLocation().getStart()-windowSize,0); diff --git a/java/src/org/broadinstitute/sting/utils/genotype/vcf/VCFGenotypeWriter.java b/java/src/org/broadinstitute/sting/utils/genotype/vcf/VCFGenotypeWriter.java index a7f705272..9cd3b875e 100644 --- a/java/src/org/broadinstitute/sting/utils/genotype/vcf/VCFGenotypeWriter.java +++ b/java/src/org/broadinstitute/sting/utils/genotype/vcf/VCFGenotypeWriter.java @@ -7,7 +7,7 @@ import org.broadinstitute.sting.utils.genotype.GenotypeWriter; import java.util.Set; /** - * An extension of eth GenotypeWriter interface with support + * An extension of the GenotypeWriter interface with support * for adding header lines. * * @author mhanna diff --git a/java/src/org/broadinstitute/sting/utils/genotype/vcf/VCFReader.java b/java/src/org/broadinstitute/sting/utils/genotype/vcf/VCFReader.java index 5a22f8466..109fd0dcc 100644 --- a/java/src/org/broadinstitute/sting/utils/genotype/vcf/VCFReader.java +++ b/java/src/org/broadinstitute/sting/utils/genotype/vcf/VCFReader.java @@ -22,6 +22,7 @@ import java.util.zip.GZIPInputStream; import org.broad.tribble.FeatureReader; import org.broad.tribble.index.linear.LinearIndex; +import org.broad.tribble.readers.BasicFeatureReader; import org.broad.tribble.vcf.*; import org.broadinstitute.sting.gatk.refdata.tracks.builders.TribbleRMDTrackBuilder; import org.broadinstitute.sting.utils.StingException; @@ -45,7 +46,16 @@ public class VCFReader implements Iterator, Iterable { * @param vcfFile the vcf file to write */ public VCFReader(File vcfFile) { - initialize(vcfFile, null); + initialize(vcfFile, null, true); + } + + /** + * Create a VCF reader, given a VCF file + * + * @param vcfFile the vcf file to write + */ + public VCFReader(File vcfFile, boolean createIndexOnDisk) { + initialize(vcfFile, null, createIndexOnDisk); } /** @@ -54,22 +64,21 @@ public class VCFReader implements Iterator, Iterable { * @param vcfFile the vcf file to write */ public VCFReader(File vcfFile, VCFCodec.LineTransform transform) { - initialize(vcfFile, transform); + initialize(vcfFile, transform, true); } - private void initialize(File vcfFile, VCFCodec.LineTransform transform) { + /** + * initialize the VCF reader + * @param vcfFile the VCF file to open + * @param transform the line transformer to use, if any + * @param createIndexOnDisk do we need to create an index on disk? + */ + private void initialize(File vcfFile, VCFCodec.LineTransform transform, boolean createIndexOnDisk) { VCFCodec codec = new VCFCodec(); - LinearIndex index = null; - if (TribbleRMDTrackBuilder.requireIndex(vcfFile)) { - try { - index = TribbleRMDTrackBuilder.createIndex(vcfFile, new VCFCodec()); - } catch (IOException e) { - throw new StingException("Unable to make required index for file " + vcfFile + " do you have write permissions to the directory?"); - } - } + LinearIndex index = createIndex(vcfFile, createIndexOnDisk); if (transform != null) codec.setTransformer(transform); try { - vcfReader = new FeatureReader(vcfFile,index,codec); + vcfReader = new BasicFeatureReader(vcfFile,index,codec); iterator= vcfReader.iterator(); } catch (FileNotFoundException e) { throw new StingException("Unable to read VCF File from " + vcfFile, e); @@ -79,6 +88,24 @@ public class VCFReader implements Iterator, Iterable { mHeader = codec.getHeader(); } + /** + * create an index given: + * @param vcfFile the vcf file + * @param createIndexOnDisk do we create the index on disk (or only in memory?) + * @return an instance of an index + */ + private LinearIndex createIndex(File vcfFile, boolean createIndexOnDisk) { + LinearIndex index = null; + if (TribbleRMDTrackBuilder.requireIndex(vcfFile)) { + try { + index = TribbleRMDTrackBuilder.createIndex(vcfFile, new VCFCodec(), createIndexOnDisk); + } catch (IOException e) { + throw new StingException("Unable to make required index for file " + vcfFile + " do you have write permissions to the directory?"); + } + } + return index; + } + /** @return true if we have another VCF record to return */ public boolean hasNext() { @@ -110,6 +137,9 @@ public class VCFReader implements Iterator, Iterable { return this; } + /** + * close the files + */ public void close() { if (vcfReader != null) try { vcfReader.close(); diff --git a/java/test/org/broadinstitute/sting/gatk/datasources/providers/ReadBasedReferenceOrderedViewUnitTest.java b/java/test/org/broadinstitute/sting/gatk/datasources/providers/ReadBasedReferenceOrderedViewUnitTest.java index 22742b469..5dc52fcba 100644 --- a/java/test/org/broadinstitute/sting/gatk/datasources/providers/ReadBasedReferenceOrderedViewUnitTest.java +++ b/java/test/org/broadinstitute/sting/gatk/datasources/providers/ReadBasedReferenceOrderedViewUnitTest.java @@ -142,6 +142,11 @@ class FakePeekingRODIterator implements LocationAwareSeekableRODIterator { public void remove() { throw new IllegalStateException("GRRR"); } + + @Override + public void close() { + // nothing to do + } } class FakeRODRecordList extends AbstractList implements RODRecordList { diff --git a/java/test/org/broadinstitute/sting/gatk/iterators/LocusIteratorByStateUnitTest.java b/java/test/org/broadinstitute/sting/gatk/iterators/LocusIteratorByStateUnitTest.java index 1f8d536ff..804d26f09 100644 --- a/java/test/org/broadinstitute/sting/gatk/iterators/LocusIteratorByStateUnitTest.java +++ b/java/test/org/broadinstitute/sting/gatk/iterators/LocusIteratorByStateUnitTest.java @@ -5,6 +5,7 @@ import net.sf.picard.filter.SamRecordFilter; import net.sf.samtools.SAMFileHeader; import net.sf.samtools.SAMFileReader; import net.sf.samtools.SAMRecord; +import net.sf.samtools.util.CloseableIterator; import org.broadinstitute.sting.BaseTest; import org.broadinstitute.sting.gatk.Reads; import org.broadinstitute.sting.gatk.arguments.ValidationExclusion; @@ -17,6 +18,7 @@ import org.junit.Test; import java.io.File; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; /** @@ -47,7 +49,7 @@ public class LocusIteratorByStateUnitTest extends BaseTest { reads.setMaxPileupSize(MAX_READS); // create the iterator by state with the fake reads and fake records - li = new LocusIteratorByState(records.iterator(), reads); + li = new LocusIteratorByState(new FakeCloseableIterator(records.iterator()), reads); // inject the testing version of the locus iterator watcher li.setLocusOverflowTracker(new LocusIteratorOverride(MAX_READS)); @@ -73,7 +75,7 @@ public class LocusIteratorByStateUnitTest extends BaseTest { reads.setMaxPileupSize(MAX_READS); // create the iterator by state with the fake reads and fake records - li = new LocusIteratorByState(records.iterator(), reads); + li = new LocusIteratorByState(new FakeCloseableIterator(records.iterator()), reads); // inject the testing version of the locus iterator watcher li.setLocusOverflowTracker(new LocusIteratorOverride(MAX_READS)); @@ -102,4 +104,32 @@ class TestReads extends Reads { public void setMaxPileupSize(int maxSize) { this.maximumReadsAtLocus = maxSize; } +} + +class FakeCloseableIterator implements CloseableIterator { + Iterator iterator; + + public FakeCloseableIterator(Iterator it) { + iterator = it; + } + + @Override + public void close() { + return; + } + + @Override + public boolean hasNext() { + return iterator.hasNext(); + } + + @Override + public T next() { + return iterator.next(); + } + + @Override + public void remove() { + throw new UnsupportedOperationException("Don't remove!"); + } } \ No newline at end of file diff --git a/java/test/org/broadinstitute/sting/gatk/refdata/tracks/builders/TribbleRMDTrackBuilderUnitTest.java b/java/test/org/broadinstitute/sting/gatk/refdata/tracks/builders/TribbleRMDTrackBuilderUnitTest.java index b5a5d5ac3..b02026880 100644 --- a/java/test/org/broadinstitute/sting/gatk/refdata/tracks/builders/TribbleRMDTrackBuilderUnitTest.java +++ b/java/test/org/broadinstitute/sting/gatk/refdata/tracks/builders/TribbleRMDTrackBuilderUnitTest.java @@ -61,7 +61,7 @@ public class TribbleRMDTrackBuilderUnitTest extends BaseTest { public void testBuilderIndexUnwriteable() { File vcfFile = new File(validationDataLocation + "/ROD_validation/mixedup.vcf"); try { - builder.createIndex(vcfFile,new VCFCodec()); + builder.createIndex(vcfFile,new VCFCodec(), true); } catch (IOException e) { Assert.fail("Unable to make index because of IO exception " + e.getMessage()); } diff --git a/java/test/org/broadinstitute/sting/gatk/refdata/utils/FlashBackIteratorUnitTest.java b/java/test/org/broadinstitute/sting/gatk/refdata/utils/FlashBackIteratorUnitTest.java index 6f421e6d4..14c57ab7f 100644 --- a/java/test/org/broadinstitute/sting/gatk/refdata/utils/FlashBackIteratorUnitTest.java +++ b/java/test/org/broadinstitute/sting/gatk/refdata/utils/FlashBackIteratorUnitTest.java @@ -186,6 +186,11 @@ class FakeSeekableRODIterator implements LocationAwareSeekableRODIterator { public void remove() { throw new IllegalStateException("GRRR"); } + + @Override + public void close() { + // nothing to do + } } diff --git a/settings/repository/org.broad/tribble-79.xml b/settings/repository/org.broad/tribble-79.xml deleted file mode 100644 index 9d57d65d0..000000000 --- a/settings/repository/org.broad/tribble-79.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/settings/repository/org.broad/tribble-79.jar b/settings/repository/org.broad/tribble-80.jar similarity index 81% rename from settings/repository/org.broad/tribble-79.jar rename to settings/repository/org.broad/tribble-80.jar index 2d2da49da8cefe3e4964c4d08411e44e3aa235c1..dba37922ddcc0f2ab973d64163f56ccd1a4fa01e 100644 GIT binary patch delta 8922 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 I7paK$N&HU delta 16710 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 S$M+(p(O|elk7i@tqyGjC#@tQ- diff --git a/settings/repository/org.broad/tribble-80.xml b/settings/repository/org.broad/tribble-80.xml new file mode 100644 index 000000000..e5bc6a855 --- /dev/null +++ b/settings/repository/org.broad/tribble-80.xml @@ -0,0 +1,3 @@ + + +