diff --git a/protected/gatk-tools-protected/src/test/java/org/broadinstitute/gatk/tools/walkers/varianteval/VariantEvalIntegrationTest.java b/protected/gatk-tools-protected/src/test/java/org/broadinstitute/gatk/tools/walkers/varianteval/VariantEvalIntegrationTest.java index 82acc98b2..16f7cf5d4 100644 --- a/protected/gatk-tools-protected/src/test/java/org/broadinstitute/gatk/tools/walkers/varianteval/VariantEvalIntegrationTest.java +++ b/protected/gatk-tools-protected/src/test/java/org/broadinstitute/gatk/tools/walkers/varianteval/VariantEvalIntegrationTest.java @@ -350,6 +350,17 @@ public class VariantEvalIntegrationTest extends WalkerTest { executeTestParallel("testVEMendelianViolationEvaluator" + vcfFile, spec); } + @Test + public void testMVEvalFamilyStrat() { + String vcfFile = "/PhaseByTransmission/PhaseByTransmission.IntegrationTest.TP.vcf"; + String pedFile = "/PhaseByTransmission/PhaseByTransmission.IntegrationTest.goodFamilies.ped"; + + WalkerTestSpec spec = new WalkerTestSpec("-R "+b37KGReference+ " -T VariantEval -ped " + privateTestDir + pedFile + " -eval " + privateTestDir + vcfFile + " -noEV -noST -ST Family -EV MendelianViolationEvaluator -o %s", + 1, + Arrays.asList("d599d3e6b308ac06b2c2e003cf596328")); + executeTestParallel("testMVEvalFamilyStrat", spec); + } + private static String withSelect(String cmd, String select, String name) { return String.format("%s -select '%s' -selectName %s", cmd, select, name); diff --git a/protected/gatk-tools-protected/src/test/java/org/broadinstitute/gatk/tools/walkers/varianteval/VariantEvalWalkerUnitTest.java b/protected/gatk-tools-protected/src/test/java/org/broadinstitute/gatk/tools/walkers/varianteval/VariantEvalWalkerUnitTest.java index d862de991..11b34a0c0 100644 --- a/protected/gatk-tools-protected/src/test/java/org/broadinstitute/gatk/tools/walkers/varianteval/VariantEvalWalkerUnitTest.java +++ b/protected/gatk-tools-protected/src/test/java/org/broadinstitute/gatk/tools/walkers/varianteval/VariantEvalWalkerUnitTest.java @@ -140,7 +140,7 @@ public class VariantEvalWalkerUnitTest extends BaseTest { } @Override - public List getRelevantStates(final ReferenceContext ref, final RefMetaDataTracker tracker, final VariantContext comp, final String compName, final VariantContext eval, final String evalName, final String sampleName) { + public List getRelevantStates(final ReferenceContext ref, final RefMetaDataTracker tracker, final VariantContext comp, final String compName, final VariantContext eval, final String evalName, final String sampleName, final String familyName) { int i = Integer.valueOf(evalName); // a terrible hack, but we can now provide accessible states List states = new ArrayList(); for ( int state : integers ) @@ -180,12 +180,12 @@ public class VariantEvalWalkerUnitTest extends BaseTest { final RefMetaDataTracker tracker = new RefMetaDataTracker(); final ReferenceContext ref = null; final VariantContext comp = null; - final String compName = null, sampleName = null; + final String compName = null, sampleName = null, familyName = null; // increment eval counts for each stratification of divisors of i from from 1...maxI for ( int i = 1; i <= cfg.maxI; i++ ) { final String evalName = String.valueOf(i); // terrible hack to stratify by divisor - for ( EvaluationContext nec : VEwalker.getEvaluationContexts(tracker, ref, eval, evalName, comp, compName, sampleName) ) { + for ( EvaluationContext nec : VEwalker.getEvaluationContexts(tracker, ref, eval, evalName, comp, compName, sampleName, familyName) ) { synchronized (nec) { nec.apply(tracker, ref, null, comp, eval); } diff --git a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/VariantEval.java b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/VariantEval.java index e5bcaebae..1617f4f39 100644 --- a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/VariantEval.java +++ b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/VariantEval.java @@ -29,8 +29,10 @@ import com.google.java.contract.Requires; import htsjdk.samtools.reference.IndexedFastaSequenceFile; import htsjdk.samtools.util.IntervalTree; import htsjdk.samtools.SAMSequenceRecord; +import oracle.jrockit.jfr.StringConstantPool; import org.apache.log4j.Logger; import htsjdk.tribble.Feature; +import org.broadinstitute.gatk.engine.samples.Trio; import org.broadinstitute.gatk.engine.walkers.*; import org.broadinstitute.gatk.tools.walkers.varianteval.evaluators.*; import org.broadinstitute.gatk.utils.commandline.*; @@ -105,7 +107,7 @@ import java.util.*; * *

* - *

Usage example

+ *

Usage examples

*
  * java -jar GenomeAnalysisTK.jar \
  *   -T VariantEval \
@@ -116,6 +118,18 @@ import java.util.*;
  *   [--comp comp.vcf]
  * 
* + * Count Mendelian violations for each family in a callset with multiple families (and provided pedigree) + *
+ * Java -jar GenomeAnalysisTK.jar \
+ *   -T VariantEval \
+ *   -R reference.fasta \
+ *   -o output.MVs.byFamily.table \
+ *   --eval multiFamilyCallset.vcf \
+ *   -noEV -noST \
+ *   -ST Family \
+ *   -EV MendelianViolationEvaluator
+ * 
+ * *

Caveat

* *

Some stratifications and evaluators are incompatible with each other due to their respective memory requirements, @@ -249,14 +263,18 @@ public class VariantEval extends RodWalker implements TreeRedu private boolean isSubsettingSamples; private Set sampleNamesForEvaluation = new LinkedHashSet(); + private Set familyNamesForEvaluation = new LinkedHashSet(); private Set sampleNamesForStratification = new LinkedHashSet(); + private Set familyNamesForStratification = new LinkedHashSet(); // important stratifications private boolean byFilterIsEnabled = false; private boolean perSampleIsEnabled = false; + private boolean perFamilyIsEnabled = false; // Public constants - private static String ALL_SAMPLE_NAME = "all"; + final private static String ALL_SAMPLE_NAME = "all"; + final private static String ALL_FAMILY_NAME = "all"; // the number of processed bp for this walker long nProcessedLoci = 0; @@ -303,12 +321,22 @@ public class VariantEval extends RodWalker implements TreeRedu final Set allSampleNames = SampleUtils.getSamplesFromCommandLineInput(vcfSamples); sampleNamesForEvaluation.addAll(new TreeSet(SampleUtils.getSamplesFromCommandLineInput(vcfSamples, SAMPLE_EXPRESSIONS))); isSubsettingSamples = ! sampleNamesForEvaluation.containsAll(allSampleNames); + familyNamesForEvaluation.addAll(getSampleDB().getFamilyIDs()); - if (Arrays.asList(STRATIFICATIONS_TO_USE).contains("Sample")) { + //If stratifying by sample name, assign a stratification for each sample we're evaluating (based on commandline args)... + if (Arrays.asList(STRATIFICATIONS_TO_USE).contains("Sample") ) { sampleNamesForStratification.addAll(sampleNamesForEvaluation); } + //...and also a stratification for the sum over all samples sampleNamesForStratification.add(ALL_SAMPLE_NAME); + //If stratifying by sample name, assign a stratification for each family... + if ( Arrays.asList(STRATIFICATIONS_TO_USE).contains("Family") ) { + familyNamesForStratification.addAll(familyNamesForEvaluation); + } + //...and also a stratification for the sum over all families + familyNamesForStratification.add(ALL_FAMILY_NAME); + // Initialize select expressions for (VariantContextUtils.JexlVCMatchExp jexl : VariantContextUtils.initializeMatchExps(SELECT_NAMES, SELECT_EXPS)) { SortableJexlVCMatchExp sjexl = new SortableJexlVCMatchExp(jexl.name, jexl.exp); @@ -327,8 +355,17 @@ public class VariantEval extends RodWalker implements TreeRedu byFilterIsEnabled = true; else if ( vs.getName().equals("Sample") ) perSampleIsEnabled = true; + else if ( vs.getName().equals("Family")) + perFamilyIsEnabled = true; } + if (perSampleIsEnabled && perFamilyIsEnabled) + throw new UserException.BadArgumentValue("ST", "Variants cannot be stratified by sample and family at the same time"); + + if (perFamilyIsEnabled && getSampleDB().getTrios().isEmpty()) + throw new UserException.BadArgumentValue("ST", "Cannot stratify by family without *.ped file"); + + if ( intervalsFile != null ) { boolean fail = true; for ( final VariantStratifier vs : stratificationObjects ) { @@ -420,17 +457,24 @@ public class VariantEval extends RodWalker implements TreeRedu // } // --------- track --------- sample - VariantContexts - - HashMap, HashMap>> evalVCs = variantEvalUtils.bindVariantContexts(tracker, ref, evals, byFilterIsEnabled, true, perSampleIsEnabled, mergeEvals); - HashMap, HashMap>> compVCs = variantEvalUtils.bindVariantContexts(tracker, ref, comps, byFilterIsEnabled, false, false, false); + HashMap, HashMap>> evalVCs = variantEvalUtils.bindVariantContexts(tracker, ref, evals, byFilterIsEnabled, true, perSampleIsEnabled, perFamilyIsEnabled, mergeEvals); + HashMap, HashMap>> compVCs = variantEvalUtils.bindVariantContexts(tracker, ref, comps, byFilterIsEnabled, false, false, false, false); // for each eval track for ( final RodBinding evalRod : evals ) { final Map> emptyEvalMap = Collections.emptyMap(); final Map> evalSet = evalVCs.containsKey(evalRod) ? evalVCs.get(evalRod) : emptyEvalMap; + Set statificationLevels; + // for each sample stratifier - for ( final String sampleName : sampleNamesForStratification ) { - Collection evalSetBySample = evalSet.get(sampleName); + if (perFamilyIsEnabled) + statificationLevels = familyNamesForStratification; + else + statificationLevels = sampleNamesForStratification; + for ( final String stratLevelName : statificationLevels ) { + Collection evalSetBySample = evalSet.get(stratLevelName); + if ( evalSetBySample == null ) { evalSetBySample = new HashSet(1); evalSetBySample.add(null); @@ -452,7 +496,18 @@ public class VariantEval extends RodWalker implements TreeRedu // find the comp final VariantContext comp = findMatchingComp(eval, compSet); - for ( EvaluationContext nec : getEvaluationContexts(tracker, ref, eval, evalRod.getName(), comp, compRod.getName(), sampleName) ) { + Collection contextsForStratification; + if (perFamilyIsEnabled) + contextsForStratification = getEvaluationContexts(tracker, ref, eval, evalRod.getName(), comp, compRod.getName(), null, stratLevelName); + else { + String familyID; + if (stratLevelName.equals("all")) + familyID = "all"; + else + familyID = getSampleDB().getSample(stratLevelName).getFamilyID(); + contextsForStratification = getEvaluationContexts(tracker, ref, eval, evalRod.getName(), comp, compRod.getName(), stratLevelName, familyID); + } + for ( EvaluationContext nec : contextsForStratification ) { // eval against the comp synchronized (nec) { @@ -521,10 +576,11 @@ public class VariantEval extends RodWalker implements TreeRedu final String evalName, final VariantContext comp, final String compName, - final String sampleName ) { + final String sampleName, + final String familyName) { final List> states = new LinkedList>(); for ( final VariantStratifier vs : stratManager.getStratifiers() ) { - states.add(vs.getRelevantStates(ref, tracker, comp, compName, eval, evalName, sampleName)); + states.add(vs.getRelevantStates(ref, tracker, comp, compName, eval, evalName, sampleName, familyName)); } return stratManager.values(states); } @@ -649,6 +705,7 @@ public class VariantEval extends RodWalker implements TreeRedu public double getMendelianViolationQualThreshold() { return MENDELIAN_VIOLATION_QUAL_THRESHOLD; } public static String getAllSampleName() { return ALL_SAMPLE_NAME; } + public static String getAllFamilyName() { return ALL_FAMILY_NAME; } public List> getKnowns() { return knowns; } @@ -657,6 +714,8 @@ public class VariantEval extends RodWalker implements TreeRedu public boolean isSubsettingToSpecificSamples() { return isSubsettingSamples; } public Set getSampleNamesForEvaluation() { return sampleNamesForEvaluation; } + public Set getFamilyNamesForEvaluation() { return familyNamesForEvaluation; } + public int getNumberOfSamplesForEvaluation() { if (sampleNamesForEvaluation!= null && !sampleNamesForEvaluation.isEmpty()) return sampleNamesForEvaluation.size(); @@ -667,6 +726,8 @@ public class VariantEval extends RodWalker implements TreeRedu } public Set getSampleNamesForStratification() { return sampleNamesForStratification; } + public Set getFamilyNamesForStratification() { return familyNamesForStratification; } + public List> getComps() { return comps; } public Set getJexlExpressions() { return jexlExpressions; } diff --git a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/evaluators/MendelianViolationEvaluator.java b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/evaluators/MendelianViolationEvaluator.java index b78ef2ddf..29d81ce96 100644 --- a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/evaluators/MendelianViolationEvaluator.java +++ b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/evaluators/MendelianViolationEvaluator.java @@ -172,7 +172,7 @@ public class MendelianViolationEvaluator extends VariantEvaluator { HomVarHet_inheritedRef += mv.getParentsVarHetInheritedRef(); HomVarHet_inheritedVar += mv.getParentsVarHetInheritedVar(); - if(mv.getFamilyCalledCount()>0){ + if(mv.getFamilyCalledCount()>0 || mv.getFamilyLowQualsCount()>0 || mv.getFamilyCalledCount()>0){ nVariants++; nFamCalled += mv.getFamilyCalledCount(); nLowQual += mv.getFamilyLowQualsCount(); diff --git a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/AlleleCount.java b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/AlleleCount.java index 9b3a94eae..2ab005ae2 100644 --- a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/AlleleCount.java +++ b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/AlleleCount.java @@ -67,7 +67,7 @@ public class AlleleCount extends VariantStratifier { getVariantEvalWalker().getLogger().info("AlleleCount using " + nchrom + " chromosomes"); } - public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { + public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName, String familyName) { if (eval != null) { int AC = 0; // by default, the site is considered monomorphic diff --git a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/AlleleFrequency.java b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/AlleleFrequency.java index 50597067f..d52ea8f41 100644 --- a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/AlleleFrequency.java +++ b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/AlleleFrequency.java @@ -47,7 +47,7 @@ public class AlleleFrequency extends VariantStratifier { } } - public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { + public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName, String FamilyName) { if (eval != null) { try { return Collections.singletonList((Object)String.format("%.3f", (5.0 * MathUtils.round(eval.getAttributeAsDouble("AF", 0.0) / 5.0, 3)))); diff --git a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/CompRod.java b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/CompRod.java index 7eb781d1b..72006196b 100644 --- a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/CompRod.java +++ b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/CompRod.java @@ -45,7 +45,7 @@ public class CompRod extends VariantStratifier implements RequiredStratification } } - public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { + public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName, String FamilyName) { return Collections.singletonList((Object)compName); } } diff --git a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/Contig.java b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/Contig.java index 6bcd06856..0645fd53f 100644 --- a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/Contig.java +++ b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/Contig.java @@ -44,7 +44,7 @@ public class Contig extends VariantStratifier { } @Override - public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { + public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName, String FamilyName) { if (eval != null) { return Arrays.asList((Object)"all", eval.getChr()); } else { diff --git a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/CpG.java b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/CpG.java index 2566ceea5..f4c31a5d1 100644 --- a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/CpG.java +++ b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/CpG.java @@ -53,7 +53,7 @@ public class CpG extends VariantStratifier { } @Override - public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { + public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName, String FamilyName) { boolean isCpG = false; if (ref != null && ref.getBases() != null) { String fwRefBases = new String(ref.getBases()); diff --git a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/Degeneracy.java b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/Degeneracy.java index ddfdef600..1e8368f91 100644 --- a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/Degeneracy.java +++ b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/Degeneracy.java @@ -103,7 +103,7 @@ public class Degeneracy extends VariantStratifier { } } - public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { + public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName, String FamilyName) { ArrayList relevantStates = new ArrayList(); relevantStates.add("all"); diff --git a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/EvalRod.java b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/EvalRod.java index 695d48c87..dddb20197 100644 --- a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/EvalRod.java +++ b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/EvalRod.java @@ -46,7 +46,7 @@ public class EvalRod extends VariantStratifier implements RequiredStratification } } - public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { + public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName, String FamilyName) { return Arrays.asList((Object)evalName); } } diff --git a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/Family.java b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/Family.java new file mode 100644 index 000000000..e4acb9ea1 --- /dev/null +++ b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/Family.java @@ -0,0 +1,55 @@ +/* +* Copyright 2012-2015 Broad Institute, Inc. +* +* 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.gatk.tools.walkers.varianteval.stratifications; + +import org.broadinstitute.gatk.utils.contexts.ReferenceContext; +import org.broadinstitute.gatk.utils.refdata.RefMetaDataTracker; +import org.broadinstitute.gatk.tools.walkers.varianteval.evaluators.VariantEvaluator; +import org.broadinstitute.gatk.tools.walkers.varianteval.evaluators.VariantSummary; +import htsjdk.variant.variantcontext.VariantContext; + +import java.util.*; + +/** + * Stratifies the eval RODs by each family in the eval ROD, as described by the pedigree. + * + * This allows the system to analyze each family separately. This is particularly useful for the MendelianViolationEvaluator module. + */ +public class Family extends VariantStratifier { + @Override + public void initialize() { + states.addAll(getVariantEvalWalker().getFamilyNamesForStratification()); + } + + public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName, String familyName) { + return Collections.singletonList((Object) familyName); + } + + @Override + public Set> getIncompatibleEvaluators() { + return new HashSet>(Arrays.asList(VariantSummary.class)); + } +} diff --git a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/Filter.java b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/Filter.java index ddeb2e75a..ac9b9e497 100644 --- a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/Filter.java +++ b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/Filter.java @@ -43,7 +43,7 @@ public class Filter extends VariantStratifier { states.add("raw"); } - public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { + public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName, String FamilyName) { ArrayList relevantStates = new ArrayList(); relevantStates.add("raw"); diff --git a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/FunctionalClass.java b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/FunctionalClass.java index 628e938be..89ffe8691 100644 --- a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/FunctionalClass.java +++ b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/FunctionalClass.java @@ -53,7 +53,7 @@ public class FunctionalClass extends VariantStratifier { } - public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { + public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName, String FamilyName) { ArrayList relevantStates = new ArrayList(); relevantStates.add("all"); diff --git a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/IndelSize.java b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/IndelSize.java index 3bff75529..48efe1ee4 100644 --- a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/IndelSize.java +++ b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/IndelSize.java @@ -48,7 +48,7 @@ public class IndelSize extends VariantStratifier { } } - public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { + public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName, String FamilyName) { if (eval != null && eval.isIndel() && eval.isBiallelic()) { try { int eventLength = 0; diff --git a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/IntervalStratification.java b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/IntervalStratification.java index d00783f70..57ba0e7bb 100644 --- a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/IntervalStratification.java +++ b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/IntervalStratification.java @@ -75,7 +75,7 @@ public class IntervalStratification extends VariantStratifier { states.addAll(Arrays.asList("all", "overlaps.intervals", "outside.intervals")); } - public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { + public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName, String FamilyName) { if (eval != null) { final GenomeLoc loc = getVariantEvalWalker().getToolkit().getGenomeLocParser().createGenomeLoc(eval); IntervalTree intervalTree = intervalTreeByContig.get(loc.getContig()); diff --git a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/JexlExpression.java b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/JexlExpression.java index 7a4a113e1..7a1106241 100644 --- a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/JexlExpression.java +++ b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/JexlExpression.java @@ -54,7 +54,7 @@ public class JexlExpression extends VariantStratifier implements StandardStratif } } - public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { + public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName, String FamilyName) { ArrayList relevantStates = new ArrayList(); relevantStates.add("none"); diff --git a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/Novelty.java b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/Novelty.java index bebebec59..1faf818f1 100644 --- a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/Novelty.java +++ b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/Novelty.java @@ -48,7 +48,7 @@ public class Novelty extends VariantStratifier implements StandardStratification knowns = getVariantEvalWalker().getKnowns(); } - public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { + public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName, String FamilyName) { if (tracker != null && eval != null) { final Collection knownComps = tracker.getValues(knowns, ref.getLocus()); for ( final VariantContext c : knownComps ) { diff --git a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/OneBPIndel.java b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/OneBPIndel.java index b4f27e477..9430d9faa 100644 --- a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/OneBPIndel.java +++ b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/OneBPIndel.java @@ -47,7 +47,7 @@ public class OneBPIndel extends VariantStratifier { } @Override - public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { + public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName, String FamilyName) { if (eval != null && eval.isIndel()) { for ( int l : eval.getIndelLengths() ) if ( Math.abs(l) > 1 ) diff --git a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/Sample.java b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/Sample.java index c563e92c6..c052dcaa5 100644 --- a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/Sample.java +++ b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/Sample.java @@ -46,7 +46,7 @@ public class Sample extends VariantStratifier { states.addAll(getVariantEvalWalker().getSampleNamesForStratification()); } - public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { + public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName, String FamilyName) { return Collections.singletonList((Object) sampleName); } diff --git a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/SnpEffPositionModifier.java b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/SnpEffPositionModifier.java index 99be53fa3..a09feae98 100644 --- a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/SnpEffPositionModifier.java +++ b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/SnpEffPositionModifier.java @@ -64,7 +64,8 @@ public class SnpEffPositionModifier extends VariantStratifier { final String compName, final VariantContext eval, final String evalName, - final String sampleName) + final String sampleName, + final String FamilyName) { final List relevantStates = new ArrayList(); if (eval != null && eval.isVariant() && eval.hasAttribute(InfoFieldKey.EFFECT_KEY.getKeyName())) { diff --git a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/TandemRepeat.java b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/TandemRepeat.java index 6f349851c..7349ccbfa 100644 --- a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/TandemRepeat.java +++ b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/TandemRepeat.java @@ -48,7 +48,7 @@ public class TandemRepeat extends VariantStratifier { } @Override - public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { + public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName, String FamilyName) { if ( eval == null || ! eval.isIndel() ) return ALL; else if ( GATKVariantContextUtils.isTandemRepeat(eval, ref.getForwardBases()) ) { diff --git a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/VariantStratifier.java b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/VariantStratifier.java index b5bd4aabf..5b4e6c089 100644 --- a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/VariantStratifier.java +++ b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/VariantStratifier.java @@ -54,7 +54,7 @@ public abstract class VariantStratifier implements Comparable public abstract void initialize(); - public abstract List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName); + public abstract List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName, String familyName); // ------------------------------------------------------------------------------------- // diff --git a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/VariantType.java b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/VariantType.java index e3fed5de4..bc017db56 100644 --- a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/VariantType.java +++ b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/stratifications/VariantType.java @@ -42,7 +42,7 @@ public class VariantType extends VariantStratifier { states.add(t.toString()); } - public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { + public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName, String FamilyName) { return eval == null ? Collections.emptyList() : Collections.singletonList((Object)eval.getType().toString()); } diff --git a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/util/VariantEvalUtils.java b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/util/VariantEvalUtils.java index 67430cbc2..15198dd53 100644 --- a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/util/VariantEvalUtils.java +++ b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/util/VariantEvalUtils.java @@ -26,6 +26,7 @@ package org.broadinstitute.gatk.tools.walkers.varianteval.util; import org.apache.log4j.Logger; +import org.broadinstitute.gatk.engine.samples.Sample; import org.broadinstitute.gatk.utils.commandline.RodBinding; import org.broadinstitute.gatk.utils.contexts.ReferenceContext; import org.broadinstitute.gatk.utils.refdata.RefMetaDataTracker; @@ -255,6 +256,7 @@ public class VariantEvalUtils { boolean byFilter, boolean subsetBySample, boolean trackPerSample, + boolean trackPerFamily, boolean mergeTracks) { if (tracker == null) return null; @@ -270,9 +272,10 @@ public class VariantEvalUtils { // First, filter the VariantContext to represent only the samples for evaluation VariantContext vcsub = vc; - if (subsetBySample && vc.hasGenotypes()) + if ((subsetBySample) && vc.hasGenotypes()) vcsub = getSubsetOfVariantContext(vc, variantEvalWalker.getSampleNamesForEvaluation()); + //always add a mapping for all samples together if ((byFilter || !vcsub.isFiltered())) { addMapping(mapping, VariantEval.getAllSampleName(), vcsub); } @@ -287,6 +290,26 @@ public class VariantEvalUtils { } } } + else if (vc.hasGenotypes() && trackPerFamily) { + for (final String familyName : variantEvalWalker.getFamilyNamesForEvaluation()) { + Set familyMemberNames = new HashSet<>(); + //if the current stratification family name is "all", then add all the families to the VC for evaluation here + if (familyName.equals(VariantEval.getAllFamilyName())) { + familyMemberNames = variantEvalWalker.getSampleNamesForEvaluation(); + } + else { + Set familyMembers = variantEvalWalker.getToolkit().getSampleDB().getFamily(familyName); + for (final Sample s : familyMembers) { + familyMemberNames.add(s.getID()); + } + } + VariantContext samplevc = getSubsetOfVariantContext(vc, familyMemberNames); + + if (byFilter || !samplevc.isFiltered()) { + addMapping(mapping, familyName, samplevc); + } + } + } } if (mergeTracks && bindings.containsKey(firstTrack)) {