From 506958a0b7293719f5d5cacc7ba83f09820e8022 Mon Sep 17 00:00:00 2001 From: Kate Noblett Date: Fri, 25 Sep 2015 13:52:57 -0400 Subject: [PATCH] Implemented a new VariantEval evaulation module, MetricsCollection. Fixed null pointer exception, updated tests. --- .../VariantEvalIntegrationTest.java | 8 +-- .../walkers/varianteval/VariantEval.java | 31 ++++++++- .../evaluators/MetricsCollection.java | 67 +++++++++++++++++++ .../varianteval/util/VariantEvalUtils.java | 5 ++ 4 files changed, 105 insertions(+), 6 deletions(-) create mode 100644 public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/evaluators/MetricsCollection.java 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 1a37d8069..82acc98b2 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 @@ -335,7 +335,7 @@ public class VariantEvalIntegrationTest extends WalkerTest { " --eval " + validationDataLocation + "yri.trio.gatk_glftrio.intersection.annotated.filtered.chr1.vcf" + " --comp:comp_genotypes " + privateTestDir + "yri.trio.gatk.ug.head.vcf"; WalkerTestSpec spec = new WalkerTestSpec(withSelect(tests, "DP < 50", "DP50") + " " + extraArgs + " -ST CpG -o %s", - 1, Arrays.asList("4b9dcbce0717285e3c0c736c1bed744c")); + 1, Arrays.asList("eaa3708d9db22fca0844a652bb73b82f")); executeTestParallel("testSelect1", spec); } @@ -377,7 +377,7 @@ public class VariantEvalIntegrationTest extends WalkerTest { " --dbsnp " + b37dbSNP132 + " --eval:evalBI " + variantEvalTestDataRoot + "ALL.20100201.chr20.bi.sites.vcf" + " -noST -ST Novelty -o %s"; - WalkerTestSpec spec = new WalkerTestSpec(extraArgs,1,Arrays.asList("112bb3221688acad83f29542bfb33151")); + WalkerTestSpec spec = new WalkerTestSpec(extraArgs,1,Arrays.asList("fe9dcf4933a645f55be1cb0e33497e49")); executeTestParallel("testEvalTrackWithoutGenotypes",spec); } @@ -404,7 +404,7 @@ public class VariantEvalIntegrationTest extends WalkerTest { " --eval:evalBI " + variantEvalTestDataRoot + "ALL.20100201.chr20.bi.sites.vcf" + " --eval:evalBC " + variantEvalTestDataRoot + "ALL.20100201.chr20.bc.sites.vcf" + " -noST -ST Novelty -o %s"; - WalkerTestSpec spec = new WalkerTestSpec(extraArgs,1,Arrays.asList("81dcdde458c1ebb9aa35289ea8f12bc8")); + WalkerTestSpec spec = new WalkerTestSpec(extraArgs,1,Arrays.asList("8dfdec264fcff9472bdee7d223fdb3ca")); executeTestParallel("testMultipleEvalTracksWithoutGenotypes",spec); } @@ -586,7 +586,7 @@ public class VariantEvalIntegrationTest extends WalkerTest { "-o %s" ), 1, - Arrays.asList("f8460af997436a5ce4407fefb0e2724d") + Arrays.asList("af317f1ea1b80e5d4bc4f2d8523ef73d") ); executeTest("testModernVCFWithLargeIndels", spec); } 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 1b6b01beb..e5bcaebae 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 @@ -32,6 +32,7 @@ import htsjdk.samtools.SAMSequenceRecord; import org.apache.log4j.Logger; import htsjdk.tribble.Feature; import org.broadinstitute.gatk.engine.walkers.*; +import org.broadinstitute.gatk.tools.walkers.varianteval.evaluators.*; import org.broadinstitute.gatk.utils.commandline.*; import org.broadinstitute.gatk.engine.CommandLineGATK; import org.broadinstitute.gatk.engine.GenomeAnalysisEngine; @@ -39,7 +40,6 @@ import org.broadinstitute.gatk.engine.arguments.DbsnpArgumentCollection; import org.broadinstitute.gatk.utils.contexts.AlignmentContext; 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.stratifications.IntervalStratification; import org.broadinstitute.gatk.tools.walkers.varianteval.stratifications.VariantStratifier; import org.broadinstitute.gatk.tools.walkers.varianteval.stratifications.manager.StratificationManager; @@ -609,7 +609,34 @@ public class VariantEval extends RodWalker implements TreeRedu for ( final EvaluationContext nec : stratManager.values() ) for ( final VariantEvaluator ve : nec.getVariantEvaluators() ) ve.finalizeEvaluation(); - + + //send data to MetricsCollection + CompOverlap compOverlap = null; + IndelSummary indelSummary = null; + CountVariants countVariants = null; + MultiallelicSummary multiallelicSummary = null; + TiTvVariantEvaluator tiTvVariantEvaluator = null; + MetricsCollection metricsCollection = null; + for(final EvaluationContext nec: stratManager.values()) { + for(final VariantEvaluator ve : nec.getVariantEvaluators()) { + if (ve instanceof CompOverlap) + compOverlap = (CompOverlap) ve; + else if (ve instanceof IndelSummary) + indelSummary = (IndelSummary) ve; + else if (ve instanceof CountVariants) + countVariants = (CountVariants) ve; + else if (ve instanceof MultiallelicSummary) + multiallelicSummary = (MultiallelicSummary) ve; + else if (ve instanceof TiTvVariantEvaluator) + tiTvVariantEvaluator = (TiTvVariantEvaluator) ve; + else if (ve instanceof MetricsCollection) + metricsCollection = (MetricsCollection) ve; + } + + if(metricsCollection != null) + metricsCollection.setData(compOverlap.concordantRate, indelSummary.n_SNPs, countVariants.nSNPs, indelSummary.n_indels, multiallelicSummary.nIndels, indelSummary.insertion_to_deletion_ratio, countVariants.insertionDeletionRatio, tiTvVariantEvaluator.tiTvRatio); + } + VariantEvalReportWriter.writeReport(out, stratManager, stratManager.getStratifiers(), stratManager.get(0).getVariantEvaluators()); } diff --git a/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/evaluators/MetricsCollection.java b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/evaluators/MetricsCollection.java new file mode 100644 index 000000000..ea7394461 --- /dev/null +++ b/public/gatk-tools-public/src/main/java/org/broadinstitute/gatk/tools/walkers/varianteval/evaluators/MetricsCollection.java @@ -0,0 +1,67 @@ +/* +* 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.evaluators; + +import org.broadinstitute.gatk.tools.walkers.varianteval.util.Analysis; +import org.broadinstitute.gatk.tools.walkers.varianteval.util.DataPoint; + +/** + * Created by knoblett on 9/15/15. + */ + +@Analysis(description = "Metrics Collection") +public class MetricsCollection extends VariantEvaluator { + + @DataPoint(description = "The concordance rate from CompOverlap", format = "%.2f") + public double concordantRate; + @DataPoint(description = "Number of SNPs from IndelSummary", format = "%d") + public int nSNPs; + @DataPoint(description = "Number of SNP loci from CountVariants", format = "%d") + public long nSNPloci; + @DataPoint(description = "Number of indels from IndelSummary", format = "%d") + public int nIndels; + @DataPoint(description = "Number of indel loci from MultiallelicSummary", format = "%d") + public int nIndelLoci; + @DataPoint(description = "Insertion to deletion ratio from IndelSummary") + public String indelRatio; + @DataPoint(description = "Insertion to deletion ratio from CountVariants", format = "%.2f") + public double indelRatioLociBased; + @DataPoint(description = "The transition to transversion ratio from TiTvVariantEvaluator", format = "%.2f") + public double tiTvRatio; + + public int getComparisonOrder() {return 2;} + + public void setData(double concordantRate, int nSNPs, long nSNPloci, int nIndels, int nIndelLoci, String indelRatio, double indelRatioLociBased, double tiTvRatio){ + this.concordantRate = concordantRate; + this.nSNPs = nSNPs; + this.nSNPloci = nSNPloci; + this.nIndels = nIndels; + this.nIndelLoci = nIndelLoci; + this.indelRatio = indelRatio; + this.indelRatioLociBased = indelRatioLociBased; + this.tiTvRatio = tiTvRatio; + } +} 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 f03ee2b61..67430cbc2 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 @@ -176,6 +176,11 @@ public class VariantEvalUtils { } } + //add MetricsCollection if required modules are included + + if(evals.contains(classMap.get("CompOverlap")) && evals.contains(classMap.get("IndelSummary")) && evals.contains(classMap.get("TiTvVariantEvaluator")) && evals.contains(classMap.get("CountVariants")) && evals.contains(classMap.get("MultiallelicSummary")) ) + evals.add(classMap.get("MetricsCollection")); + return evals; }