From d4577782830d423825a1705090d8d1f77447200f Mon Sep 17 00:00:00 2001 From: depristo Date: Wed, 25 Mar 2009 16:01:58 +0000 Subject: [PATCH] Unified byLoci and byLociByInterval traversals. It now figures out what to do for you based on the presence of an index and set of required locations to process. git-svn-id: file:///humgen/gsa-scr1/gsa-engineering/svn_contents/trunk@191 348d0f76-0448-11de-a6fe-93d51630548a --- .../sting/gatk/GenomeAnalysisTK.java | 5 +- .../sting/gatk/TraversalEngine.java | 64 ++++++++----------- 2 files changed, 27 insertions(+), 42 deletions(-) diff --git a/java/src/org/broadinstitute/sting/gatk/GenomeAnalysisTK.java b/java/src/org/broadinstitute/sting/gatk/GenomeAnalysisTK.java index 591b29287..c90cd2c2b 100644 --- a/java/src/org/broadinstitute/sting/gatk/GenomeAnalysisTK.java +++ b/java/src/org/broadinstitute/sting/gatk/GenomeAnalysisTK.java @@ -185,10 +185,7 @@ public class GenomeAnalysisTK extends CommandLineProgram { // Try to get the walker specified try { LocusWalker walker = (LocusWalker) my_walker; - if ( INTERVALS_FILE == null ) - engine.traverseByLoci(walker); - else - engine.traverseByLociByInterval(walker); + engine.traverseByLoci(walker); } catch (java.lang.ClassCastException e) { // I guess we're a read walker LOL diff --git a/java/src/org/broadinstitute/sting/gatk/TraversalEngine.java b/java/src/org/broadinstitute/sting/gatk/TraversalEngine.java index c835dd1ed..c5b996ffd 100755 --- a/java/src/org/broadinstitute/sting/gatk/TraversalEngine.java +++ b/java/src/org/broadinstitute/sting/gatk/TraversalEngine.java @@ -244,6 +244,10 @@ public class TraversalEngine { } } + public boolean hasLocations() { + return this.locs != null; + } + /** * Returns true iff we have a specified series of locations to process AND we are past the last * location in the list. It means that, in a serial processing of the genome, that we are done. @@ -551,15 +555,33 @@ public class TraversalEngine { * @return 0 on success */ protected int traverseByLoci(LocusWalker walker) { - samReadIter = initializeReads(); + samReader = initializeSAMFile(readsFile); verifySortOrder(true); // initialize the walker object walker.initialize(); - - // We aren't locus oriented - T sum = carryWalkerOverInterval(walker, samReadIter, walker.reduceInit(), null); + + T sum = walker.reduceInit(); + if ( samReader.hasIndex() && hasLocations() ) { + // we are doing interval-based traversals + for ( GenomeLoc interval : locs ) { + logger.debug(String.format("Processing locus %s", interval.toString())); + + CloseableIterator readIter = samReader.queryOverlapping( interval.getContig(), + (int)interval.getStart(), + (int)interval.getStop() ); + + Iterator wrappedIter = WrapReadsIterator( readIter, false ); + sum = carryWalkerOverInterval(walker, wrappedIter, sum, interval); + readIter.close(); + } + } + else { + // We aren't locus oriented + samReadIter = WrapReadsIterator(getReadsIterator(samReader), true); + sum = carryWalkerOverInterval(walker, samReadIter, sum, null); + } printOnTraversalDone("loci", sum); walker.onTraversalDone(); @@ -617,40 +639,6 @@ public class TraversalEngine { return sum; } - /** - * Same as the normal locus traverser, but oriented by locus, rather than implicitly - * - * @param walker A locus walker object - * @param MapType -- the result of calling map() on walker - * @param ReduceType -- the result of calling reduce() on the walker - * @return 0 on success - */ - protected int traverseByLociByInterval(LocusWalker walker) { - //verifySortOrder(true); - - // initialize the walker object - walker.initialize(); - // Initialize the T sum using the walker - T sum = walker.reduceInit(); - - samReader = initializeSAMFile(readsFile); - for ( GenomeLoc interval : locs ) { - logger.debug(String.format("Processing locus %s", interval.toString())); - - CloseableIterator readIter = samReader.queryOverlapping( interval.getContig(), - (int)interval.getStart(), - (int)interval.getStop() ); - - Iterator wrappedIter = WrapReadsIterator( readIter, false ); - sum = carryWalkerOverInterval(walker, wrappedIter, sum, interval); - readIter.close(); - } - - printOnTraversalDone("loci", sum); - walker.onTraversalDone(); - return 0; - } - /** * Traverse by read -- the key driver of linearly ordered traversal of reads. Provides a single read to * the walker object, in coordinate order. Supports all of the