From 78343be52ceff8a5710ac105195ee101da0e917d Mon Sep 17 00:00:00 2001 From: hanna Date: Thu, 30 Sep 2010 15:58:43 +0000 Subject: [PATCH] At some time in the recent past, we lost our ability to process the '-L all' argument. Brought it back, and added an integrationtest to make sure it stays around. git-svn-id: file:///humgen/gsa-scr1/gsa-engineering/svn_contents/trunk@4390 348d0f76-0448-11de-a6fe-93d51630548a --- .../gatk/AbstractGenomeAnalysisEngine.java | 54 +++++++++------- .../interval/IntervalIntegrationTest.java | 63 +++++++++++++++++++ 2 files changed, 94 insertions(+), 23 deletions(-) create mode 100644 java/test/org/broadinstitute/sting/utils/interval/IntervalIntegrationTest.java diff --git a/java/src/org/broadinstitute/sting/gatk/AbstractGenomeAnalysisEngine.java b/java/src/org/broadinstitute/sting/gatk/AbstractGenomeAnalysisEngine.java index bc9903380..a0dc2d49c 100755 --- a/java/src/org/broadinstitute/sting/gatk/AbstractGenomeAnalysisEngine.java +++ b/java/src/org/broadinstitute/sting/gatk/AbstractGenomeAnalysisEngine.java @@ -156,36 +156,44 @@ public abstract class AbstractGenomeAnalysisEngine { */ protected void initializeIntervals() { - // return null if no interval arguments at all + // return if no interval arguments at all if ((argCollection.intervals == null) && (argCollection.excludeIntervals == null) && (argCollection.RODToInterval == null)) return; - else { - // if include argument isn't given, create new set of all possible intervals - GenomeLocSortedSet includeSortedSet = (argCollection.intervals == null && argCollection.RODToInterval == null ? - GenomeLocSortedSet.createSetFromSequenceDictionary(this.referenceDataSource.getReference().getSequenceDictionary()) : - loadIntervals(argCollection.intervals, - argCollection.intervalMerging, - GenomeLocParser.mergeIntervalLocations(checkRODToIntervalArgument(),argCollection.intervalMerging))); + // if '-L all' was specified, verify that it was the only -L specified and return if so. + for(String interval: argCollection.intervals) { + if(interval.trim().equals("all")) { + if(argCollection.intervals.size() > 1) + throw new UserException("'-L all' was specified along with other intervals or interval lists; the GATK cannot combine '-L all' with other intervals."); - // if no exclude arguments, can return parseIntervalArguments directly - if (argCollection.excludeIntervals == null) - intervals = includeSortedSet; + // '-L all' was specified and seems valid. Return. + return; + } + } + + // if include argument isn't given, create new set of all possible intervals + GenomeLocSortedSet includeSortedSet = (argCollection.intervals == null && argCollection.RODToInterval == null ? + GenomeLocSortedSet.createSetFromSequenceDictionary(this.referenceDataSource.getReference().getSequenceDictionary()) : + loadIntervals(argCollection.intervals, + argCollection.intervalMerging, + GenomeLocParser.mergeIntervalLocations(checkRODToIntervalArgument(),argCollection.intervalMerging))); + + // if no exclude arguments, can return parseIntervalArguments directly + if (argCollection.excludeIntervals == null) + intervals = includeSortedSet; // otherwise there are exclude arguments => must merge include and exclude GenomeLocSortedSets - else { - GenomeLocSortedSet excludeSortedSet = loadIntervals(argCollection.excludeIntervals, argCollection.intervalMerging, null); - intervals = includeSortedSet.subtractRegions(excludeSortedSet); - - // logging messages only printed when exclude (-XL) arguments are given - long toPruneSize = includeSortedSet.coveredSize(); - long toExcludeSize = excludeSortedSet.coveredSize(); - long intervalSize = intervals.coveredSize(); - logger.info(String.format("Initial include intervals span %d loci; exclude intervals span %d loci", toPruneSize, toExcludeSize)); - logger.info(String.format("Excluding %d loci from original intervals (%.2f%% reduction)", - toPruneSize - intervalSize, (toPruneSize - intervalSize) / (0.01 * toPruneSize))); - } + else { + GenomeLocSortedSet excludeSortedSet = loadIntervals(argCollection.excludeIntervals, argCollection.intervalMerging, null); + intervals = includeSortedSet.subtractRegions(excludeSortedSet); + // logging messages only printed when exclude (-XL) arguments are given + long toPruneSize = includeSortedSet.coveredSize(); + long toExcludeSize = excludeSortedSet.coveredSize(); + long intervalSize = intervals.coveredSize(); + logger.info(String.format("Initial include intervals span %d loci; exclude intervals span %d loci", toPruneSize, toExcludeSize)); + logger.info(String.format("Excluding %d loci from original intervals (%.2f%% reduction)", + toPruneSize - intervalSize, (toPruneSize - intervalSize) / (0.01 * toPruneSize))); } } diff --git a/java/test/org/broadinstitute/sting/utils/interval/IntervalIntegrationTest.java b/java/test/org/broadinstitute/sting/utils/interval/IntervalIntegrationTest.java new file mode 100644 index 000000000..d181f7ab5 --- /dev/null +++ b/java/test/org/broadinstitute/sting/utils/interval/IntervalIntegrationTest.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2010, 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. + */ + +package org.broadinstitute.sting.utils.interval; + +import org.broadinstitute.sting.WalkerTest; +import org.junit.Test; + +import java.util.Arrays; +import java.util.Collections; + +/** + * Test the GATK core interval parsing mechanism. + */ +public class IntervalIntegrationTest extends WalkerTest { + @Test + public void testAllImplicitIntervalParsing() { + String md5 = "7821db9e14d4f8e07029ff1959cd5a99"; + WalkerTest.WalkerTestSpec spec = new WalkerTest.WalkerTestSpec( + "-T CountLoci" + + " -I " + validationDataLocation + "OV-0930.normal.chunk.bam" + + " -R " + hg18Reference + + " -o %s", + 1, // just one output file + Arrays.asList(md5)); + executeTest("testAllIntervalsImplicit",spec); + } + + @Test + public void testAllExplicitIntervalParsing() { + String md5 = "7821db9e14d4f8e07029ff1959cd5a99"; + WalkerTest.WalkerTestSpec spec = new WalkerTest.WalkerTestSpec( + "-T CountLoci" + + " -I " + validationDataLocation + "OV-0930.normal.chunk.bam" + + " -R " + hg18Reference + + " -L all" + + " -o %s", + 1, // just one output file + Arrays.asList(md5)); + executeTest("testAllIntervalsExplicit",spec); + } +}