From bb4ced3201b62b7f35843cd389b606b3aeeaf21f Mon Sep 17 00:00:00 2001 From: David Roazen Date: Fri, 12 Aug 2011 15:04:33 -0400 Subject: [PATCH] SnpEff-related fixes. -To correctly handle indels and MNPs, only consider features that start at the current locus, rather than features that span the current locus, when selecting the most significant effect. -Throw a UserException when a SnpEff rodbinding is not provided instead of simply not adding any annotations and silently returning. --- .../sting/gatk/walkers/annotator/SnpEff.java | 14 ++++++++++++-- .../gatk/walkers/annotator/VariantAnnotator.java | 2 +- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/SnpEff.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/SnpEff.java index 635afd158..fc5014885 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/SnpEff.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/SnpEff.java @@ -36,6 +36,7 @@ import org.broadinstitute.sting.utils.codecs.snpEff.SnpEffConstants; import org.broadinstitute.sting.utils.codecs.snpEff.SnpEffFeature; import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; +import org.broadinstitute.sting.utils.exceptions.UserException; import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.*; @@ -70,9 +71,11 @@ public class SnpEff extends InfoFieldAnnotation implements ExperimentalAnnotatio public static final String CODON_NUM_KEY = "CODON_NUM"; public static final String CDS_SIZE_KEY = "CDS_SIZE"; - public Map annotate(RefMetaDataTracker tracker, AnnotatorCompatibleWalker walker, ReferenceContext ref, Map stratifiedContexts, VariantContext vc) { + public Map annotate ( RefMetaDataTracker tracker, AnnotatorCompatibleWalker walker, ReferenceContext ref, Map stratifiedContexts, VariantContext vc ) { RodBinding snpEffRodBinding = walker.getSnpEffRodBinding(); - List features = tracker.getValues(snpEffRodBinding); + validateRodBinding(snpEffRodBinding); + + List features = tracker.getValues(snpEffRodBinding, ref.getLocus()); // Add only annotations for one of the most biologically-significant effects as defined in // the SnpEffConstants class: @@ -85,6 +88,13 @@ public class SnpEff extends InfoFieldAnnotation implements ExperimentalAnnotatio return generateAnnotations(mostSignificantEffect); } + private void validateRodBinding ( RodBinding snpEffRodBinding ) { + if ( snpEffRodBinding == null || ! snpEffRodBinding.isBound() ) { + throw new UserException("The SnpEff annotator requires that a SnpEff output file be provided " + + "as a rodbinding on the command line, but no SnpEff rodbinding was found."); + } + } + private SnpEffFeature getMostSignificantEffect ( List snpEffFeatures ) { SnpEffFeature mostSignificantEffect = null; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/VariantAnnotator.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/VariantAnnotator.java index 492606688..8c8bd19d0 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/VariantAnnotator.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/VariantAnnotator.java @@ -64,7 +64,7 @@ public class VariantAnnotator extends RodWalker implements Ann * The INFO field will be annotated with information on the most biologically-significant effect * listed in the SnpEff output file for each variant. */ - @Input(fullName="snpEffFile", shortName = "snpEffFile", doc="SnpEff file", required=false) + @Input(fullName="snpEffFile", shortName = "snpEffFile", doc="A SnpEff output file from which to add annotations", required=false) public RodBinding snpEffFile; public RodBinding getSnpEffRodBinding() { return snpEffFile; }