From 3554897222dcc740db29e2eb79a3425bf0fda72a Mon Sep 17 00:00:00 2001 From: ebanks Date: Wed, 29 Jul 2009 17:38:15 +0000 Subject: [PATCH] allow filters to specify whether they want to work with mapping quality zero reads; the VariantFiltrationWalker passes in the appropriate contextual reads git-svn-id: file:///humgen/gsa-scr1/gsa-engineering/svn_contents/trunk@1333 348d0f76-0448-11de-a6fe-93d51630548a --- .../gatk/walkers/variants/RatioFilter.java | 2 ++ .../walkers/variants/VECDepthOfCoverage.java | 2 ++ .../walkers/variants/VECFisherStrand.java | 4 ++- .../walkers/variants/VECLodThreshold.java | 2 ++ .../variants/VariantExclusionCriterion.java | 1 + .../variants/VariantFiltrationWalker.java | 30 ++++++++++++++++++- 6 files changed, 39 insertions(+), 2 deletions(-) diff --git a/java/src/org/broadinstitute/sting/playground/gatk/walkers/variants/RatioFilter.java b/java/src/org/broadinstitute/sting/playground/gatk/walkers/variants/RatioFilter.java index 2130b623f..177d9097d 100755 --- a/java/src/org/broadinstitute/sting/playground/gatk/walkers/variants/RatioFilter.java +++ b/java/src/org/broadinstitute/sting/playground/gatk/walkers/variants/RatioFilter.java @@ -254,6 +254,8 @@ public abstract class RatioFilter implements VariantExclusionCriterion { protected abstract boolean applyToVariant(rodVariants variant); protected abstract Pair scoreVariant(char ref, ReadBackedPileup pileup, rodVariants variant); + public boolean useZeroQualityReads() { return false; } + public boolean exclude(char ref, LocusContext context, rodVariants variant) { boolean exclude = false; diff --git a/java/src/org/broadinstitute/sting/playground/gatk/walkers/variants/VECDepthOfCoverage.java b/java/src/org/broadinstitute/sting/playground/gatk/walkers/variants/VECDepthOfCoverage.java index e26c72291..2d107754e 100755 --- a/java/src/org/broadinstitute/sting/playground/gatk/walkers/variants/VECDepthOfCoverage.java +++ b/java/src/org/broadinstitute/sting/playground/gatk/walkers/variants/VECDepthOfCoverage.java @@ -19,6 +19,8 @@ public class VECDepthOfCoverage implements VariantExclusionCriterion { } } + public boolean useZeroQualityReads() { return false; } + public boolean exclude(char ref, LocusContext context, rodVariants variant) { return context.getReads().size() > maximum; } diff --git a/java/src/org/broadinstitute/sting/playground/gatk/walkers/variants/VECFisherStrand.java b/java/src/org/broadinstitute/sting/playground/gatk/walkers/variants/VECFisherStrand.java index 88b0f0651..be57d5d5a 100644 --- a/java/src/org/broadinstitute/sting/playground/gatk/walkers/variants/VECFisherStrand.java +++ b/java/src/org/broadinstitute/sting/playground/gatk/walkers/variants/VECFisherStrand.java @@ -30,6 +30,8 @@ public class VECFisherStrand implements VariantExclusionCriterion { return false; } + public boolean useZeroQualityReads() { return false; } + public static boolean strandTest(char ref, LocusContext context, int allele1, int allele2, double threshold, StringBuffer out) { int[][] table = getContingencyTable(context, allele1, allele2); if ( !variantIsHet(table) ) @@ -81,7 +83,7 @@ public class VECFisherStrand implements VariantExclusionCriterion { return ((table[0][1] != 0 || table[0][1] != 0) && (table[1][0] != 0 || table[1][1] != 0)); } - private void printTable(int[][] table, double pValue) { + private static void printTable(int[][] table, double pValue) { System.out.printf("%d %d; %d %d : %f\n", table[0][0], table[0][1], table[1][0], table[1][1], pValue); } diff --git a/java/src/org/broadinstitute/sting/playground/gatk/walkers/variants/VECLodThreshold.java b/java/src/org/broadinstitute/sting/playground/gatk/walkers/variants/VECLodThreshold.java index f9ffcd7db..9415c9bce 100755 --- a/java/src/org/broadinstitute/sting/playground/gatk/walkers/variants/VECLodThreshold.java +++ b/java/src/org/broadinstitute/sting/playground/gatk/walkers/variants/VECLodThreshold.java @@ -12,6 +12,8 @@ public class VECLodThreshold implements VariantExclusionCriterion { } } + public boolean useZeroQualityReads() { return false; } + public boolean exclude(char ref, LocusContext context, rodVariants variant) { return (variant.getLodBtr() < lodThreshold); } diff --git a/java/src/org/broadinstitute/sting/playground/gatk/walkers/variants/VariantExclusionCriterion.java b/java/src/org/broadinstitute/sting/playground/gatk/walkers/variants/VariantExclusionCriterion.java index 6e4a763a5..3b2a8f504 100755 --- a/java/src/org/broadinstitute/sting/playground/gatk/walkers/variants/VariantExclusionCriterion.java +++ b/java/src/org/broadinstitute/sting/playground/gatk/walkers/variants/VariantExclusionCriterion.java @@ -7,4 +7,5 @@ public interface VariantExclusionCriterion { public void initialize(String arguments); public boolean exclude(char ref, LocusContext context, rodVariants variant); + public boolean useZeroQualityReads(); } diff --git a/java/src/org/broadinstitute/sting/playground/gatk/walkers/variants/VariantFiltrationWalker.java b/java/src/org/broadinstitute/sting/playground/gatk/walkers/variants/VariantFiltrationWalker.java index 7d719ca37..d68d96fe2 100755 --- a/java/src/org/broadinstitute/sting/playground/gatk/walkers/variants/VariantFiltrationWalker.java +++ b/java/src/org/broadinstitute/sting/playground/gatk/walkers/variants/VariantFiltrationWalker.java @@ -18,6 +18,8 @@ import java.io.FileNotFoundException; import java.io.PrintWriter; import java.util.*; +import net.sf.samtools.SAMRecord; + /** * VariantFiltrationWalker applies specified conditionally independent features to pre-called variants, thus modifying * the likelihoods of each genotype. At the moment, the variants are expected to be in gelitext format. @@ -191,8 +193,12 @@ public class VariantFiltrationWalker extends LocusWalker { // Apply exclusion tests that accept or reject the variant call ArrayList exclusionResults = new ArrayList(); + // we need to provide an alternative context without mapping quality 0 reads + // for those exclusion criterion that don't want them + LocusContext Q0freeContext = removeQ0reads(context); + for ( VariantExclusionCriterion vec : requestedExclusions ) { - boolean excludeResult = vec.exclude(ref, context, variant); + boolean excludeResult = vec.exclude(ref, (vec.useZeroQualityReads() ? context : Q0freeContext), variant); if (excludeResult) { exclusionResults.add(rationalizeClassName(vec.getClass())); @@ -223,6 +229,28 @@ public class VariantFiltrationWalker extends LocusWalker { return 0; } + private LocusContext removeQ0reads(LocusContext context) { + // set up the variables + List reads = context.getReads(); + List offsets = context.getOffsets(); + Iterator readIter = reads.iterator(); + Iterator offsetIter = offsets.iterator(); + ArrayList Q0freeReads = new ArrayList(); + ArrayList Q0freeOffsets = new ArrayList(); + + // copy over good reads/offsets + while ( readIter.hasNext() ) { + SAMRecord read = readIter.next(); + Integer offset = offsetIter.next(); + if ( read.getMappingQuality() > 0 ) { + Q0freeReads.add(read); + Q0freeOffsets.add(offset); + } + } + + return new LocusContext(context.getLocation(), Q0freeReads, Q0freeOffsets); + } + /** * Increment the number of loci processed. *