Merge pull request #1624 from nvnieuwk/new-module-rtg/vcfeval

New module rtg/vcfeval
This commit is contained in:
nvnieuwk 2022-05-10 13:41:20 +02:00 committed by GitHub
commit 914e56163a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 394 additions and 83 deletions

View file

@ -0,0 +1,59 @@
process RTGTOOLS_VCFEVAL {
tag "$meta.id"
label 'process_medium'
conda (params.enable_conda ? "bioconda::rtg-tools=3.12.1" : null)
container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ?
'https://depot.galaxyproject.org/singularity/rtg-tools:3.12.1--hdfd78af_0':
'quay.io/biocontainers/rtg-tools:3.12.1--hdfd78af_0' }"
input:
tuple val(meta), path(query_vcf), path(query_vcf_tbi)
tuple path(truth_vcf), path(truth_vcf_tbi)
path(truth_regions)
path(evaluation_regions)
path(sdf)
output:
tuple val(meta), path("**results/{done,progress,*.log}") , emit: logs
tuple val(meta), path("**tp.vcf.gz"), path("**tp.vcf.gz.tbi") , emit: tp
tuple val(meta), path("**fn.vcf.gz"), path("**fn.vcf.gz.tbi") , emit: fn
tuple val(meta), path("**fp.vcf.gz"), path("**fp.vcf.gz.tbi") , emit: fp
tuple val(meta), path("**baseline.vcf.gz"), path("**baseline.vcf.gz.tbi") , emit: baseline
tuple val(meta), path("**.tsv.gz") , emit: roc
tuple val(meta), path("**results/summary.txt") , emit: summary
tuple val(meta), path("**results/phasing.txt") , emit: phasing
path "versions.yml" , emit: versions
when:
task.ext.when == null || task.ext.when
script:
def args = task.ext.args ?: ""
def prefix = task.ext.prefix ?: "${meta.id}"
def bed_regions = truth_regions ? "--bed-regions=$truth_regions" : ""
def eval_regions = evaluation_regions ? "--evaluation-regions=$evaluation_regions" : ""
def truth_index = truth_vcf_tbi ? "" : "rtg index $truth_vcf"
def query_index = query_vcf_tbi ? "" : "rtg index $query_vcf"
"""
$truth_index
$query_index
rtg vcfeval \\
$args \\
--baseline=$truth_vcf \\
$bed_regions \\
$eval_regions \\
--calls=$query_vcf \\
--output=${prefix}_results \\
--template=$sdf \\
--threads=$task.cpus \\
cat <<-END_VERSIONS > versions.yml
"${task.process}":
rtg-tools: \$(echo \$(rtg version | head -n 1 | awk '{print \$4}'))
END_VERSIONS
"""
}

View file

@ -0,0 +1,95 @@
name: "rtgtools_vcfeval"
description: The VCFeval tool of RTG tools. It is used to evaluate called variants for agreement with a baseline variant set
keywords:
- benchmarking
- vcf
- rtg-tools
tools:
- "rtgtools":
description: "RealTimeGenomics Tools -- Utilities for accurate VCF comparison and manipulation"
homepage: "https://www.realtimegenomics.com/products/rtg-tools"
documentation: "https://github.com/RealTimeGenomics/rtg-tools"
tool_dev_url: "https://github.com/RealTimeGenomics/rtg-tools"
doi: ""
licence: "['BSD']"
input:
- meta:
type: map
description: |
Groovy Map containing sample information
e.g. [ id:'test', single_end:false ]
- truth_vcf:
type: file
description: A standard VCF to compare against
pattern: "*.{vcf,vcf.gz}"
- truth_vcf_index:
type: file
description: The index of the standard VCF (optional)
pattern: "*.tbi"
- query_vcf:
type: file
description: A VCF with called variants to benchmark against the standard
pattern: "*.{vcf,vcf.gz}"
- query_vcf_index:
type: file
description: The index of the called VCF (optional)
pattern: "*.tbi"
- truth_regions:
type: file
description: A BED file containining the strict regions where VCFeval should only evaluate the fully overlapping variants (optional)
pattern: "*.bed"
- evaluation_regions:
type: file
description: A BED file containing the regions where VCFeval will evaluate every fully and partially overlapping variant (optional)
pattern: "*.bed"
- sdf:
type: file
description: The SDF (RTG Sequence Data File) folder of the reference genome
pattern: "*"
output:
- meta:
type: map
description: |
Groovy Map containing sample information
e.g. [ id:'test', single_end:false ]
- versions:
type: file
description: File containing software versions
pattern: "versions.yml"
- logging:
type: file
description: Files containing logging from vcfeval
pattern: "*{done,progress,.log}"
- tp:
type: file
description: A tuple containing the VCF and TBI file for the true positive variants
pattern: "tp.vcf{.gz,.gz.tbi}"
- baseline:
type: file
description: A tuple containing the VCF and TBI file for the baseline true positive variants
pattern: "tp-baseline.vcf{.gz,.gz.tbi}"
- fp:
type: file
description: A tuple containing the VCF and TBI file for the false positive variants
pattern: "fp.vcf{.gz,.gz.tbi}"
- fn:
type: file
description: A tuple containing the VCF and TBI file for the false negative variants
pattern: "fn.vcf{.gz,.gz.tbi}"
- roc:
type: file
description: TSV files containing ROC data for the evaluated variants
pattern: "*.tsv.gz"
- summary:
type: file
description: A TXT file containing the summary of the evaluation
pattern: "summary.txt"
- phasing:
type: file
description: A TXT file containing the data on the phasing
pattern: "phasing.txt"
authors:
- "@nvnieuwk"

View file

@ -1619,6 +1619,10 @@ rseqc/tin:
- modules/rseqc/tin/**
- tests/modules/rseqc/tin/**
rtgtools/vcfeval:
- modules/rtgtools/vcfeval/**
- tests/modules/rtgtools/vcfeval/**
salmon/index:
- modules/salmon/index/**
- tests/modules/salmon/index/**

View file

@ -135,6 +135,7 @@ params {
transcriptome_fasta = "${test_data_dir}/genomics/homo_sapiens/genome/transcriptome.fasta"
genome2_fasta = "${test_data_dir}/genomics/homo_sapiens/genome/genome2.fasta"
genome_chain_gz = "${test_data_dir}/genomics/homo_sapiens/genome/genome.chain.gz"
genome_21_sdf = "${test_data_dir}/genomics/homo_sapiens/genome/chr21/sequence/genome_sdf.tar.gz"
genome_21_fasta = "${test_data_dir}/genomics/homo_sapiens/genome/chr21/sequence/genome.fasta"
genome_21_fasta_fai = "${test_data_dir}/genomics/homo_sapiens/genome/chr21/sequence/genome.fasta.fai"
genome_21_dict = "${test_data_dir}/genomics/homo_sapiens/genome/chr21/sequence/genome.dict"
@ -212,7 +213,6 @@ params {
test_paired_end_hla = "${test_data_dir}/genomics/homo_sapiens/illumina/bam/example_hla_pe.bam"
test_paired_end_hla_sorted_bam = "${test_data_dir}/genomics/homo_sapiens/illumina/bam/example_hla_pe.sorted.bam"
test_paired_end_hla_sorted_bam_bai = "${test_data_dir}/genomics/homo_sapiens/illumina/bam/example_hla_pe.sorted.bam.bai"
test2_paired_end_sorted_bam = "${test_data_dir}/genomics/homo_sapiens/illumina/bam/test2.paired_end.sorted.bam"
test2_paired_end_sorted_bam_bai = "${test_data_dir}/genomics/homo_sapiens/illumina/bam/test2.paired_end.sorted.bam.bai"
test2_paired_end_name_sorted_bam = "${test_data_dir}/genomics/homo_sapiens/illumina/bam/test2.paired_end.name.sorted.bam"
@ -227,6 +227,7 @@ params {
test2_paired_end_umi_unsorted_bam = "${test_data_dir}/genomics/homo_sapiens/illumina/bam/umi/test2.paired_end.umi_unsorted.bam"
test2_paired_end_umi_unsorted_tagged_bam = "${test_data_dir}/genomics/homo_sapiens/illumina/bam/umi/test2.paired_end.unsorted_tagged.bam"
mitochon_standin_recalibrated_sorted_bam = "${test_data_dir}/genomics/homo_sapiens/illumina/bam/mitochon_standin.recalibrated.sorted.bam"
mitochon_standin_recalibrated_sorted_bam_bai = "${test_data_dir}/genomics/homo_sapiens/illumina/bam/mitochon_standin.recalibrated.sorted.bam.bai"
@ -266,6 +267,9 @@ params {
test2_haplotc_ann_vcf_gz = "${test_data_dir}/genomics/homo_sapiens/illumina/gatk/haplotypecaller_calls/test2_haplotc.ann.vcf.gz"
test2_haplotc_ann_vcf_gz_tbi = "${test_data_dir}/genomics/homo_sapiens/illumina/gatk/haplotypecaller_calls/test2_haplotc.ann.vcf.gz.tbi"
test2_haplotc_vcf_gz = "${test_data_dir}/genomics/homo_sapiens/illumina/gatk/haplotypecaller_calls/test2_haplotc.vcf.gz"
test2_haplotc_vcf_gz_tbi = "${test_data_dir}/genomics/homo_sapiens/illumina/gatk/haplotypecaller_calls/test2_haplotc.vcf.gz.tbi"
test2_recal = "${test_data_dir}/genomics/homo_sapiens/illumina/gatk/variantrecalibrator/test2.recal"
test2_recal_idx = "${test_data_dir}/genomics/homo_sapiens/illumina/gatk/variantrecalibrator/test2.recal.idx"
test2_tranches = "${test_data_dir}/genomics/homo_sapiens/illumina/gatk/variantrecalibrator/test2.tranches"

View file

@ -0,0 +1,69 @@
#!/usr/bin/env nextflow
nextflow.enable.dsl = 2
include { RTGTOOLS_VCFEVAL } from '../../../../modules/rtgtools/vcfeval/main.nf'
include { UNTAR } from '../../../modules/untar/main.nf'
workflow test_rtgtools_vcfeval {
input = [
[ id:'test' ], // meta map
file(params.test_data['homo_sapiens']['illumina']['test2_haplotc_vcf_gz'], checkIfExists: true),
file(params.test_data['homo_sapiens']['illumina']['test2_haplotc_vcf_gz_tbi'], checkIfExists: true),
]
truth = [
file(params.test_data['homo_sapiens']['illumina']['test2_haplotc_ann_vcf_gz'], checkIfExists: true),
file(params.test_data['homo_sapiens']['illumina']['test2_haplotc_ann_vcf_gz_tbi'], checkIfExists: true)
]
truth_regions = file(params.test_data['homo_sapiens']['genome']['genome_21_multi_interval_bed'], checkIfExists: true)
evaluation_regions = file(params.test_data['homo_sapiens']['genome']['genome_bed'], checkIfExists: true)
compressed_sdf = [
[],
file(params.test_data['homo_sapiens']['genome']['genome_21_sdf'])
]
sdf = UNTAR( compressed_sdf ).untar
.map({
meta, folder ->
folder
})
RTGTOOLS_VCFEVAL ( input, truth, truth_regions, evaluation_regions, sdf )
}
workflow test_rtgtools_vcfeval_no_optional_inputs {
input = [
[ id:'test' ], // meta map
file(params.test_data['homo_sapiens']['illumina']['test2_haplotc_vcf_gz'], checkIfExists: true),
[],
]
truth = [
file(params.test_data['homo_sapiens']['illumina']['test2_haplotc_ann_vcf_gz'], checkIfExists: true),
[]
]
truth_regions = []
evaluation_regions = []
compressed_sdf = [
[],
file(params.test_data['homo_sapiens']['genome']['genome_21_sdf'])
]
sdf = UNTAR( compressed_sdf ).untar
.map({
meta, folder ->
[folder]
})
RTGTOOLS_VCFEVAL ( input, truth, truth_regions, evaluation_regions, sdf )
}

View file

@ -0,0 +1,5 @@
process {
publishDir = { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }
}

View file

@ -0,0 +1,75 @@
- name: rtgtools vcfeval test_rtgtools_vcfeval
command: nextflow run tests/modules/rtgtools/vcfeval -entry test_rtgtools_vcfeval -c tests/config/nextflow.config
tags:
- rtgtools
- rtgtools/vcfeval
files:
- path: output/rtgtools/test_results/done
- path: output/rtgtools/test_results/fn.vcf.gz
md5sum: be9c9106055bfad4c5985bc0d33efd56
- path: output/rtgtools/test_results/fn.vcf.gz.tbi
md5sum: 092a7a3162e7cff25d273525751eb284
- path: output/rtgtools/test_results/fp.vcf.gz
md5sum: e0f0ff841dc63e9fb61fd3a5db137ced
- path: output/rtgtools/test_results/fp.vcf.gz.tbi
md5sum: 092a7a3162e7cff25d273525751eb284
- path: output/rtgtools/test_results/non_snp_roc.tsv.gz
md5sum: ad5bad32c48f05aef232e2c0e708877a
- path: output/rtgtools/test_results/phasing.txt
md5sum: 133677dbd8be657439ea2b03fdfb8795
- path: output/rtgtools/test_results/progress
- path: output/rtgtools/test_results/snp_roc.tsv.gz
md5sum: 6785b83d66486e7e6c75c5a5b1574c09
- path: output/rtgtools/test_results/summary.txt
md5sum: f4c8df93c8bdab603036bbc27b4a28c3
- path: output/rtgtools/test_results/tp-baseline.vcf.gz
md5sum: be9c9106055bfad4c5985bc0d33efd56
- path: output/rtgtools/test_results/tp-baseline.vcf.gz.tbi
md5sum: 092a7a3162e7cff25d273525751eb284
- path: output/rtgtools/test_results/tp.vcf.gz
md5sum: e0f0ff841dc63e9fb61fd3a5db137ced
- path: output/rtgtools/test_results/tp.vcf.gz.tbi
md5sum: 092a7a3162e7cff25d273525751eb284
- path: output/rtgtools/test_results/vcfeval.log
- path: output/rtgtools/test_results/weighted_roc.tsv.gz
md5sum: fa7c046ea0084172f1ef91f19de07b2b
- path: output/rtgtools/versions.yml
md5sum: 270ed7a5a8e347b251eb4aa2198f98e8
- name: rtgtools vcfeval test_rtgtools_vcfeval_no_optional_inputs
command: nextflow run tests/modules/rtgtools/vcfeval -entry test_rtgtools_vcfeval_no_optional_inputs -c tests/config/nextflow.config
tags:
- rtgtools
- rtgtools/vcfeval
files:
- path: output/rtgtools/test_results/done
- path: output/rtgtools/test_results/fn.vcf.gz
md5sum: c11c889a4f42c8ea325748bd768ea34d
- path: output/rtgtools/test_results/fn.vcf.gz.tbi
md5sum: 092a7a3162e7cff25d273525751eb284
- path: output/rtgtools/test_results/fp.vcf.gz
md5sum: 138e85c1cd79f8fea9a33e81ce0c734c
- path: output/rtgtools/test_results/fp.vcf.gz.tbi
md5sum: 092a7a3162e7cff25d273525751eb284
- path: output/rtgtools/test_results/non_snp_roc.tsv.gz
md5sum: 34fb78a008dfc0bef02807b8a7012b07
- path: output/rtgtools/test_results/phasing.txt
md5sum: 133677dbd8be657439ea2b03fdfb8795
- path: output/rtgtools/test_results/progress
- path: output/rtgtools/test_results/snp_roc.tsv.gz
md5sum: a4c5761c2653e2d04fc84c1cea13b1f0
- path: output/rtgtools/test_results/summary.txt
md5sum: f33feb32f84958fb931063044fba369b
- path: output/rtgtools/test_results/tp-baseline.vcf.gz
md5sum: d1c2d990899edf127ea5fcca8866fcb0
- path: output/rtgtools/test_results/tp-baseline.vcf.gz.tbi
md5sum: 3307008fea47adb75c46d395c5567bc0
- path: output/rtgtools/test_results/tp.vcf.gz
md5sum: e35b4dab82894eee9b77c81f9bc89cca
- path: output/rtgtools/test_results/tp.vcf.gz.tbi
md5sum: 45d8f8793140944f129e728299918c88
- path: output/rtgtools/test_results/vcfeval.log
- path: output/rtgtools/test_results/weighted_roc.tsv.gz
md5sum: 5b8efc9e9381f604880412800f58e4e9
- path: output/rtgtools/versions.yml
md5sum: 55568e4bbe5ab7e634a1f392abb89cc4