From e93735a28d45689035fdfcf178c4170c02737dc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Famke=20B=C3=A4uerle?= <45968370+famosab@users.noreply.github.com> Date: Wed, 8 Jan 2025 15:28:28 +0100 Subject: [PATCH] Release 1.1.0 (#11) * feat: add modules * feat: add docker image * fix: swap to wave containers * feat: update schema and config * feat: add modules to workflow * fix: usage of vcf2mat * fix: remove .view and add more comments explaining the code * feat: add gvcf to vcf conversion * feat: add GATK iGenomes * feat: add tabix * update docs * update input schema * update sbwf * update schemas * add pipeline tests * feat: add correct tests * change access to index bool * prettier to hopefullly fix linting? * fix indentation * add env to local module * fix linting for first version * add nf-test and ignore external configs * wip on nf-test * finalize tests * Template update for nf-core/tools version 3.0.2 * Template update for nf-core/tools version 3.1.0 * Apply suggestions from code review * fix: filename collision by using different subsets of the filename (#4) * Fix/filenamecoll (#5) * First release :) (#1) * feat: add modules * feat: add docker image * fix: swap to wave containers * feat: update schema and config * feat: add modules to workflow * fix: usage of vcf2mat * fix: remove .view and add more comments explaining the code * feat: add gvcf to vcf conversion * feat: add GATK iGenomes * feat: add tabix * update docs * update input schema * update sbwf * update schemas * add pipeline tests * feat: add correct tests * change access to index bool * prettier to hopefullly fix linting? * fix indentation * add env to local module * fix linting for first version * add nf-test and ignore external configs * wip on nf-test * finalize tests * Template update for nf-core/tools version 3.0.2 * Template update for nf-core/tools version 3.1.0 * Apply suggestions from code review * Change famosab to qbic-pipelines after transfer (#2) * Update README.md after transfer * change famosab to qbic-pipelines * update main * fix: filename collision by using filebasename and include modules config again * fix: update snaps * prettier * add sample names to columns and restructure (#7) * add sample names and restructure * add new param * prettier * expand docs * remove weird param * bump-version to dev * prettier * tests * add concatenation of same saples with same label (#8) * add concatenation of same saples with same label * update changelog and docs * maybe we need to switch to a subway map soon * try other ci file * try other ci file * fix name * remove ci from linting * update pipeline level tests * ignore modules * add nft-vcf * update ci and snaps * modify * revert * prepare release 1.1.0 (#10) * prepare release * version correction * prettier * fix schema * remove dev Co-authored-by: Daniel Straub <42973691+d4straub@users.noreply.github.com> * add forgotten explanations to output * prettier --------- Co-authored-by: Daniel Straub <42973691+d4straub@users.noreply.github.com> --- .gitignore | 8 + .nf-core.yml | 5 +- CHANGELOG.md | 12 + README.md | 19 +- assets/multiqc_config.yml | 4 +- assets/samplesheet.csv | 9 +- assets/schema_input.json | 8 +- conf/modules.config | 33 +- docs/images/vcftomat.excalidraw.png | Bin 61402 -> 113127 bytes docs/output.md | 20 +- docs/usage.md | 19 +- modules.json | 10 + .../nf-core/bcftools/concat/environment.yml | 5 + modules/nf-core/bcftools/concat/main.nf | 59 +++ modules/nf-core/bcftools/concat/meta.yml | 83 ++++ .../bcftools/concat/tests/main.nf.test | 316 ++++++++++++ .../bcftools/concat/tests/main.nf.test.snap | 395 +++++++++++++++ .../bcftools/concat/tests/nextflow.config | 3 + .../nf-core/bcftools/concat/tests/tags.yml | 2 + .../bcftools/concat/tests/vcf_gz_index.config | 4 + .../concat/tests/vcf_gz_index_csi.config | 4 + .../concat/tests/vcf_gz_index_tbi.config | 4 + .../nf-core/bcftools/reheader/environment.yml | 5 + modules/nf-core/bcftools/reheader/main.nf | 79 +++ modules/nf-core/bcftools/reheader/meta.yml | 76 +++ .../bcftools/reheader/tests/bcf.config | 4 + .../bcftools/reheader/tests/main.nf.test | 394 +++++++++++++++ .../bcftools/reheader/tests/main.nf.test.snap | 469 ++++++++++++++++++ .../nf-core/bcftools/reheader/tests/tags.yml | 2 + .../bcftools/reheader/tests/vcf.config | 4 + .../bcftools/reheader/tests/vcf.gz.config | 4 + .../reheader/tests/vcf_gz_index.config | 4 + .../reheader/tests/vcf_gz_index_csi.config | 4 + .../reheader/tests/vcf_gz_index_tbi.config | 5 + nextflow.config | 44 +- nextflow_schema.json | 23 +- nf-test.config | 1 + ro-crate-metadata.json | 140 +++++- tests/.nftignore | 19 + tests/default.nf.test | 16 +- tests/default.nf.test.snap | 55 +- tests/full.nf.test | 20 +- tests/full.nf.test.snap | 168 ++++--- tests/input-full.csv | 17 +- tests/input.csv | 4 +- workflows/vcftomat.nf | 94 +++- 46 files changed, 2486 insertions(+), 187 deletions(-) create mode 100644 modules/nf-core/bcftools/concat/environment.yml create mode 100644 modules/nf-core/bcftools/concat/main.nf create mode 100644 modules/nf-core/bcftools/concat/meta.yml create mode 100644 modules/nf-core/bcftools/concat/tests/main.nf.test create mode 100644 modules/nf-core/bcftools/concat/tests/main.nf.test.snap create mode 100644 modules/nf-core/bcftools/concat/tests/nextflow.config create mode 100644 modules/nf-core/bcftools/concat/tests/tags.yml create mode 100644 modules/nf-core/bcftools/concat/tests/vcf_gz_index.config create mode 100644 modules/nf-core/bcftools/concat/tests/vcf_gz_index_csi.config create mode 100644 modules/nf-core/bcftools/concat/tests/vcf_gz_index_tbi.config create mode 100644 modules/nf-core/bcftools/reheader/environment.yml create mode 100644 modules/nf-core/bcftools/reheader/main.nf create mode 100644 modules/nf-core/bcftools/reheader/meta.yml create mode 100644 modules/nf-core/bcftools/reheader/tests/bcf.config create mode 100644 modules/nf-core/bcftools/reheader/tests/main.nf.test create mode 100644 modules/nf-core/bcftools/reheader/tests/main.nf.test.snap create mode 100644 modules/nf-core/bcftools/reheader/tests/tags.yml create mode 100644 modules/nf-core/bcftools/reheader/tests/vcf.config create mode 100644 modules/nf-core/bcftools/reheader/tests/vcf.gz.config create mode 100644 modules/nf-core/bcftools/reheader/tests/vcf_gz_index.config create mode 100644 modules/nf-core/bcftools/reheader/tests/vcf_gz_index_csi.config create mode 100644 modules/nf-core/bcftools/reheader/tests/vcf_gz_index_tbi.config diff --git a/.gitignore b/.gitignore index 007cbf2..0e42d4d 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,11 @@ null/ .nf-test .nf-test* .nf-test/* + +.vscode +.vscode/* + +tests/unmergedgvcfs +tests/unmergedgvcfs/* +tests/input-full-ncgm.csv +conf/test_full_ncgm.config diff --git a/.nf-core.yml b/.nf-core.yml index 60f9cf0..474e44e 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -18,6 +18,7 @@ lint: - docs/images/nf-core-vcftomat_logo_dark.png - .github/ISSUE_TEMPLATE/bug_report.yml included_configs: false + actions_ci: false multiqc_config: - report_comment nextflow_config: @@ -30,7 +31,7 @@ lint: nf_core_version: 3.1.0 repository_type: pipeline template: - author: "Famke B\xE4uerle, Dorothy Ellis" + author: "Famke Bäuerle, Dorothy Ellis" description: Nextflow pipeline to convert (g)vcfs to matrices suitable for statistical analysis force: false @@ -43,4 +44,4 @@ template: - codespaces - fastqc - adaptivecard - version: 1.0.0dev + version: 1.1.0 diff --git a/CHANGELOG.md b/CHANGELOG.md index 655cef6..a21bb96 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,18 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## v1.1.0 - Newton Puccoon - 08.01.2025 + +### Added + +- [#7](https://github.com/qbic-pipelines/vcftomat/pull/7) - samplenames to columns +- [#8](https://github.com/qbic-pipelines/vcftomat/pull/8) - concat for sample, label pairs + +### Fixed + +- [#5](https://github.com/qbic-pipelines/vcftomat/pull/5) - filename collision +- [#10](https://github.com/qbic-pipelines/vcftomat/pull/10) - prepare release 1.1.0 + ## v1.0.0 - Curie Purpureal - 16.12.2024 Initial release of qbic-pipelines/vcftomat, created with the [nf-core](https://nf-co.re/) template. diff --git a/README.md b/README.md index c4a78f1..0bd6998 100644 --- a/README.md +++ b/README.md @@ -16,9 +16,11 @@ 1. Indexes (g.)vcf files ([`tabix`](http://www.htslib.org/doc/tabix.html)) 2. Converts g.vcf files to vcf with `genotypegvcf` ([`GATK`](https://gatk.broadinstitute.org/hc/en-us)) -3. Merges all vcfs from the same sample with `bcftools/merge` ([`bcftools`](https://samtools.github.io/bcftools/bcftools.html)) -4. Converts the (merged) vcfs to a matrix using a custom R script written by @ellisdoro ([`R`](https://www.r-project.org/)) -5. Collects all reports into a MultiQC report ([`MultiQC`](http://multiqc.info/)) +3. Concatenates all vcfs that have the same id and the same label with `bcftools/concat` ([`bcftools`](https://samtools.github.io/bcftools/bcftools.html)) +4. Changes the sample name in the vcf file to the filename with `bcftools/reheader` ([`bcftools`](https://samtools.github.io/bcftools/bcftools.html)) - This can be turned off by adding `--rename false` to the `nextflow run` command. +5. Merges all vcfs from the same sample with `bcftools/merge` ([`bcftools`](https://samtools.github.io/bcftools/bcftools.html)) +6. Converts the (merged) vcfs to a matrix using a custom R script written by @ellisdoro ([`R`](https://www.r-project.org/)) +7. Collects all reports into a MultiQC report ([`MultiQC`](http://multiqc.info/)) ![](./docs/images/vcftomat.excalidraw.png) @@ -32,13 +34,14 @@ First, prepare a samplesheet with your input data that looks as follows: `samplesheet.csv`: ```csv -sample,gvcf,vcf_path,vcf_index_path -SAMPLE-1,false,path/to/vcf.gz,path/to/.vcf.gz.tbi -SAMPLE-1,false,path/to/vcf.gz,path/to/.vcf.gz.tbi -SAMPLE-2,true,path/to/g.vcf.gz,path/to/g.vcf.gz.tbi +sample,label,gvcf,vcf_path,vcf_index_path +SAMPLE-1,pipelineA-callerA,false,path/to/vcf.gz,path/to/.vcf.gz.tbi +SAMPLE-1,pipelineB-callerA,false,path/to/vcf.gz,path/to/.vcf.gz.tbi +SAMPLE-2,pipelineB-callerB,true,path/to/g.vcf.gz,path/to/g.vcf.gz.tbi +SAMPLE-2,pipelineB-callerB,true,path/to/g.vcf.gz,path/to/g.vcf.gz.tbi ``` -Each row represents a VCF file coming from a sample. The `gvcf` column indicates whether the file is a g.vcf file or not. The `vcf_path` and `vcf_index_path` columns contain the path to the VCF file and its index, respectively. +Each row represents a VCF file coming from a sample. The `label` column enables concatenation of vcfs (for example when the pipeline produces different vcfs for chrM and chrY). The `gvcf` column indicates whether the file is a g.vcf file or not. The `vcf_path` and `vcf_index_path` columns contain the path to the VCF file and its index, respectively. Now, you can run the pipeline using: diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index 59cb191..b1d5749 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -1,6 +1,6 @@ report_comment: > - This report has been generated by the qbic-pipelines/vcftomat - analysis pipeline. + This report has been generated by the qbic-pipelines/vcftomat analysis pipeline. report_section_order: "qbic-pipelines-vcftomat-methods-description": order: -1000 diff --git a/assets/samplesheet.csv b/assets/samplesheet.csv index 2231c37..1551a8c 100644 --- a/assets/samplesheet.csv +++ b/assets/samplesheet.csv @@ -1,4 +1,5 @@ -sample,gvcf,vcf_path,vcf_index_path -SAMPLE-1,false,path/to/vcf.gz,path/to/.vcf.gz.tbi -SAMPLE-1,false,path/to/vcf.gz,path/to/.vcf.gz.tbi -SAMPLE-2,true,path/to/g.vcf.gz,path/to/g.vcf.gz.tbi +sample,label,gvcf,vcf_path,vcf_index_path +SAMPLE-1,pipelineA-callerA,false,path/to/vcf.gz,path/to/.vcf.gz.tbi +SAMPLE-1,pipelineB-callerA,false,path/to/vcf.gz,path/to/.vcf.gz.tbi +SAMPLE-2,pipelineB-callerB,true,path/to/g.vcf.gz,path/to/g.vcf.gz.tbi +SAMPLE-2,pipelineB-callerB,true,path/to/g.vcf.gz,path/to/g.vcf.gz.tbi diff --git a/assets/schema_input.json b/assets/schema_input.json index 13e869f..e64606b 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -13,6 +13,12 @@ "errorMessage": "Sample name must be provided and cannot contain spaces", "meta": ["id"] }, + "label": { + "type": "string", + "pattern": "^\\S+$", + "errorMessage": "Label must be provided and cannot contain spaces", + "meta": ["label"] + }, "gvcf": { "type": "boolean", "errorMessage": "", @@ -40,6 +46,6 @@ "errorMessage": "Index of VCF file must have extension '.tbi'- Optional" } }, - "required": ["sample", "gvcf", "vcf_path"] + "required": ["sample", "label", "gvcf", "vcf_path"] } } diff --git a/conf/modules.config b/conf/modules.config index e1b4e63..1cf6704 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -23,13 +23,38 @@ process { } withName: 'GATK4_GENOTYPEGVCFS' { - ext.prefix = { "${input.baseName.tokenize('.')[0]}" } + ext.prefix = { "${meta.name}" } + } + + withName: 'BCFTOOLS_CONCAT' { + memory = 8.GB + ext.prefix = { "${meta.label}.concat" } + ext.args = { " --allow-overlaps --output-type z --write-index=tbi" } + publishDir = [ + mode: params.publish_dir_mode, + path: { "${params.outdir}/bcftools/concat/" }, + ] + } + + withName: 'BCFTOOLS_REHEADER' { + beforeScript = { "echo ${meta.label} > ${meta.label}.txt" } + ext.args = { "--samples ${meta.label}.txt" } + ext.prefix = { "${meta.label}.reheader" } + ext.args2 = { "--output-type z --write-index=tbi" } + publishDir = [ + mode: params.publish_dir_mode, + path: { "${params.outdir}/bcftools/reheader/" }, + ] } withName: 'BCFTOOLS_MERGE' { - memory = 8.GB - ext.args = { '--force-samples' } - ext.prefix = { "${meta.id}.merged" } + memory = 8.GB + ext.args = { "--force-samples --output-type z --write-index=tbi" } + ext.prefix = { "${meta.id}.merge" } + publishDir = [ + mode: params.publish_dir_mode, + path: { "${params.outdir}/bcftools/merge/" }, + ] } withName: 'MULTIQC' { diff --git a/docs/images/vcftomat.excalidraw.png b/docs/images/vcftomat.excalidraw.png index aa81f82dd5adcdd7b007e16151dc03a4f025d753..543f8a0ace43fe87e0593288d464e588e00f2182 100644 GIT binary patch literal 113127 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

C(08{+-aTI2%TKBwi}t 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∾ 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 z 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 U?LS=mpVJ@xE7!EkHEo0c7YsS^?EnA( diff --git a/docs/output.md b/docs/output.md index 55f881f..82c23e5 100644 --- a/docs/output.md +++ b/docs/output.md @@ -6,14 +6,14 @@ This document describes the output produced by the pipeline. Most of the plots a The directories listed below will be created in the results directory after the pipeline has finished. All paths are relative to the top-level results directory. - - ## Pipeline overview The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using the following steps: - [Tabix](#tabix) - Indexes (g.)vcf files - [GenotypeGVCFs](#genotypegvcfs) - Converts g.vcf files to vcf with GATK +- [Concatenate VCFs](#concatenate-vcfs) - Concatenates all vcfs that have the same id and the same label with bcftools/concat +- [Rename Samples](#rename-samples) - Changes the sample name in the vcf file to the label with bcftools/reheader - [Merge VCFs](#merge-vcfs) - Merges all vcfs from the same sample with bcftools/merge - [Convert to matrix](#convert-to-matrix) - Converts the (merged) vcfs to a matrix using a custom R script written by @ellisdoro - [MultiQC](#multiqc) - Aggregate report describing results and QC from the whole pipeline @@ -21,12 +21,28 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d ### Tabix +Tabix generated index files with `.tbi` extension for all `(g).vcf` files that are given to the pipeline without index. + ### GenotypeGVCFs +The GATK GenotypeGVCFs module translates genotype (g) vcf files into classic vcf files. The key difference between a regular VCF and a GVCF is that the GVCF has records for all sites, whether there is a variant call there or not. + +### Concatenate VCFs + +Some variant calling pipelines will return multiple (g)VCF files for one patient. The `concatenate` function of `bcftools` is used to add these VCFs to one VCF. + +### Rename Samples + +To make enable the comparison of the finalized CSV files, `bcftools reheader` can be enabled to rename the variant sample name from the generic name given by the variant caller to a custom label given with the samplesheet. + ### Merge VCFs +To enable comparison of different variant callers or variant calling pipelines, all VCFs that come from the same sample are merged based on the sample ID submitted by the user. + ### Convert to matrix +A custom R script is used to convert the finalized VCF to a CSV which can be used for further downstream analysis. Script was written by [Dorothy Ellis](https://github.com/ellisdoro). + ### MultiQC

diff --git a/docs/usage.md b/docs/usage.md index 16348df..9d8cefa 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -19,15 +19,17 @@ You will need to create a samplesheet with information about the samples you wou The `sample` identifiers have to be the same when the vcfs originate from the same bam but were yielded with different callers. The pipeline will merge all vcfs from the same sample into one vcf file but is also able to handle if there is only one vcf file for a sample (merging will then be skipped). ```csv title="samplesheet.csv" -sample,gvcf,vcf_path,vcf_index_path -SAMPLE-1,false,path/to/vcf.gz,path/to/.vcf.gz.tbi -SAMPLE-1,false,path/to/vcf.gz,path/to/.vcf.gz.tbi -SAMPLE-2,true,path/to/g.vcf.gz,path/to/g.vcf.gz.tbi +sample,label,gvcf,vcf_path,vcf_index_path +SAMPLE-1,pipelineA-callerA,false,path/to/vcf.gz,path/to/.vcf.gz.tbi +SAMPLE-1,pipelineB-callerA,false,path/to/vcf.gz,path/to/.vcf.gz.tbi +SAMPLE-2,pipelineB-callerB,true,path/to/g.vcf.gz,path/to/g.vcf.gz.tbi +SAMPLE-2,pipelineB-callerB,true,path/to/g.vcf.gz,path/to/g.vcf.gz.tbi ``` | Column | Description | | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `sample` | Custom sample name. This entry will be identical for vcfs that originate from the same bam but were yielded with different callers. Spaces in sample names are automatically converted to underscores (`_`). | +| `label` | Label for the vcf file. This is used to concatenate vcfs with the same label. | | `gvcf` | Boolean whether the supplied sample is a gvcf (true) or a normal vcf (false). | | `vcf_path` | Full path to VCF file, should have the extension ".g.vcf.gz", ".vcf.gz", ".g.vcf" or ".vcf". | | `vcf_index_path` | Full path to index of (g)VCF file. Optional. Should have extension ".tbi". | @@ -39,7 +41,7 @@ An [example samplesheet](../assets/samplesheet.csv) has been provided with the p The typical command for running the pipeline is as follows: ```bash -nextflow run qbic-pipelines/vcftomat --input ./samplesheet.csv --outdir ./results --genome GATK.GRCh38 -profile docker +nextflow run qbic-pipelines/vcftomat --input ./samplesheet.csv --outdir ./results --genome GATK.GRCh38 --rename true -profile docker ``` This will launch the pipeline with the `docker` configuration profile. See below for more information about profiles. @@ -69,10 +71,9 @@ nextflow run qbic-pipelines/vcftomat -profile docker -params-file params.yaml with: ```yaml title="params.yaml" -input: './samplesheet.csv' -outdir: './results/' -genome: 'GATK.GRCh38' -<...> +input: "./samplesheet.csv" +outdir: "./results/" +genome: "GATK.GRCh38" ``` You can also generate such `YAML`/`JSON` files via [nf-core/launch](https://nf-co.re/launch). diff --git a/modules.json b/modules.json index 4e13864..ef0f8d3 100644 --- a/modules.json +++ b/modules.json @@ -5,11 +5,21 @@ "https://github.com/nf-core/modules.git": { "modules": { "nf-core": { + "bcftools/concat": { + "branch": "master", + "git_sha": "d1e0ec7670fa77905a378627232566ce54c3c26d", + "installed_by": ["modules"] + }, "bcftools/merge": { "branch": "master", "git_sha": "666652151335353eef2fcd58880bcef5bc2928e1", "installed_by": ["modules"] }, + "bcftools/reheader": { + "branch": "master", + "git_sha": "666652151335353eef2fcd58880bcef5bc2928e1", + "installed_by": ["modules"] + }, "gatk4/genotypegvcfs": { "branch": "master", "git_sha": "1999eff2c530b2b185a25cc42117a1686f09b685", diff --git a/modules/nf-core/bcftools/concat/environment.yml b/modules/nf-core/bcftools/concat/environment.yml new file mode 100644 index 0000000..5c00b11 --- /dev/null +++ b/modules/nf-core/bcftools/concat/environment.yml @@ -0,0 +1,5 @@ +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::bcftools=1.20 diff --git a/modules/nf-core/bcftools/concat/main.nf b/modules/nf-core/bcftools/concat/main.nf new file mode 100644 index 0000000..a94b28d --- /dev/null +++ b/modules/nf-core/bcftools/concat/main.nf @@ -0,0 +1,59 @@ +process BCFTOOLS_CONCAT { + tag "$meta.id" + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/bcftools:1.20--h8b25389_0': + 'biocontainers/bcftools:1.20--h8b25389_0' }" + + input: + tuple val(meta), path(vcfs), path(tbi) + + output: + tuple val(meta), path("${prefix}.vcf.gz") , emit: vcf + tuple val(meta), path("${prefix}.vcf.gz.tbi"), emit: tbi, optional: true + tuple val(meta), path("${prefix}.vcf.gz.csi"), emit: csi, optional: true + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + def tbi_names = tbi.findAll { file -> !(file instanceof List) }.collect { file -> file.name } + def create_input_index = vcfs.collect { vcf -> tbi_names.contains(vcf.name + ".tbi") ? "" : "tabix ${vcf}" }.join("\n ") + """ + ${create_input_index} + + bcftools concat \\ + --output ${prefix}.vcf.gz \\ + $args \\ + --threads $task.cpus \\ + ${vcfs} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + def index = args.contains("--write-index=tbi") || args.contains("-W=tbi") ? "tbi" : + args.contains("--write-index=csi") || args.contains("-W=csi") ? "csi" : + args.contains("--write-index") || args.contains("-W") ? "csi" : + "" + def create_index = index.matches("csi|tbi") ? "touch ${prefix}.vcf.gz.${index}" : "" + """ + echo "" | gzip > ${prefix}.vcf.gz + ${create_index} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/bcftools/concat/meta.yml b/modules/nf-core/bcftools/concat/meta.yml new file mode 100644 index 0000000..d2565b2 --- /dev/null +++ b/modules/nf-core/bcftools/concat/meta.yml @@ -0,0 +1,83 @@ +name: bcftools_concat +description: Concatenate VCF files +keywords: + - variant calling + - concat + - bcftools + - VCF +tools: + - concat: + description: | + Concatenate VCF files. + homepage: http://samtools.github.io/bcftools/bcftools.html + documentation: http://www.htslib.org/doc/bcftools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] + identifier: biotools:bcftools +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcfs: + type: list + description: | + List containing 2 or more vcf files + e.g. [ 'file1.vcf', 'file2.vcf' ] + - tbi: + type: list + description: | + List containing 2 or more index files (optional) + e.g. [ 'file1.tbi', 'file2.tbi' ] +output: + - vcf: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + pattern: "*.{vcf.gz}" + - ${prefix}.vcf.gz: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + pattern: "*.{vcf.gz}" + - tbi: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + pattern: "*.tbi" + - ${prefix}.vcf.gz.tbi: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + pattern: "*.tbi" + - csi: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + pattern: "*.csi" + - ${prefix}.vcf.gz.csi: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + pattern: "*.csi" + - versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@abhi18av" + - "@nvnieuwk" +maintainers: + - "@abhi18av" + - "@nvnieuwk" diff --git a/modules/nf-core/bcftools/concat/tests/main.nf.test b/modules/nf-core/bcftools/concat/tests/main.nf.test new file mode 100644 index 0000000..cb4642b --- /dev/null +++ b/modules/nf-core/bcftools/concat/tests/main.nf.test @@ -0,0 +1,316 @@ +nextflow_process { + + name "Test Process BCFTOOLS_CONCAT" + script "../main.nf" + process "BCFTOOLS_CONCAT" + + tag "modules" + tag "modules_nfcore" + tag "bcftools" + tag "bcftools/concat" + + + test("homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]]") { + + config "./nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'test3' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/haplotypecaller_calls/test_haplotcaller.cnn.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/haplotypecaller_calls/test_haplotcaller.cnn.vcf.gz.tbi', checkIfExists: true) + ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index") { + + config "./vcf_gz_index.config" + + when { + process { + """ + input[0] = [ + [ id:'test3' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/haplotypecaller_calls/test_haplotcaller.cnn.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/haplotypecaller_calls/test_haplotcaller.cnn.vcf.gz.tbi', checkIfExists: true) + ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.versions + ).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + + } + + test("homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index_csi") { + + config "./vcf_gz_index_csi.config" + + when { + process { + """ + input[0] = [ + [ id:'test3' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/haplotypecaller_calls/test_haplotcaller.cnn.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/haplotypecaller_calls/test_haplotcaller.cnn.vcf.gz.tbi', checkIfExists: true) + ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.versions + ).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + + } + + test("homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index_tbi") { + + config "./vcf_gz_index_tbi.config" + + when { + process { + """ + input[0] = [ + [ id:'test3' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/haplotypecaller_calls/test_haplotcaller.cnn.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/haplotypecaller_calls/test_haplotcaller.cnn.vcf.gz.tbi', checkIfExists: true) + ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.versions + ).match() }, + { assert process.out.tbi[0][1].endsWith(".tbi") } + ) + } + + } + + + test("homo_sapiens - [[vcf1, vcf2], []]") { + + config "./nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'test3' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/haplotypecaller_calls/test_haplotcaller.cnn.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz', checkIfExists: true) + ], + [] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - stub") { + + config "./nextflow.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test3' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/haplotypecaller_calls/test_haplotcaller.cnn.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/haplotypecaller_calls/test_haplotcaller.cnn.vcf.gz.tbi', checkIfExists: true) + ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index - stub") { + + config "./vcf_gz_index.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test3' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/haplotypecaller_calls/test_haplotcaller.cnn.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/haplotypecaller_calls/test_haplotcaller.cnn.vcf.gz.tbi', checkIfExists: true) + ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + + } + + test("homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index_csi - stub") { + + config "./vcf_gz_index_csi.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test3' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/haplotypecaller_calls/test_haplotcaller.cnn.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/haplotypecaller_calls/test_haplotcaller.cnn.vcf.gz.tbi', checkIfExists: true) + ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + + } + + test("homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index_tbi - stub") { + + config "./vcf_gz_index_tbi.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test3' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/haplotypecaller_calls/test_haplotcaller.cnn.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/haplotypecaller_calls/test_haplotcaller.cnn.vcf.gz.tbi', checkIfExists: true) + ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.tbi[0][1].endsWith(".tbi") } + ) + } + + } + + +} \ No newline at end of file diff --git a/modules/nf-core/bcftools/concat/tests/main.nf.test.snap b/modules/nf-core/bcftools/concat/tests/main.nf.test.snap new file mode 100644 index 0000000..09e87cd --- /dev/null +++ b/modules/nf-core/bcftools/concat/tests/main.nf.test.snap @@ -0,0 +1,395 @@ +{ + "homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + + ], + "2": [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,c6e19f105510a46af1c5da9064e2e659" + ], + "csi": [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,c6e19f105510a46af1c5da9064e2e659" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-26T11:04:11.178539482" + }, + "homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]]": { + "content": [ + { + "0": [ + [ + { + "id": "test3" + }, + "test3.vcf.gz:md5,5f6796c3ae109a1a5b87353954693f5a" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,c6e19f105510a46af1c5da9064e2e659" + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test3" + }, + "test3.vcf.gz:md5,5f6796c3ae109a1a5b87353954693f5a" + ] + ], + "versions": [ + "versions.yml:md5,c6e19f105510a46af1c5da9064e2e659" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-26T11:03:08.765639958" + }, + "homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index": { + "content": [ + [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz:md5,5f6796c3ae109a1a5b87353954693f5a" + ] + ], + [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz.csi" + ] + ], + [ + + ], + [ + "versions.yml:md5,c6e19f105510a46af1c5da9064e2e659" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-26T11:03:21.607274757" + }, + "homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index_tbi - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,c6e19f105510a46af1c5da9064e2e659" + ], + "csi": [ + + ], + "tbi": [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "vcf": [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,c6e19f105510a46af1c5da9064e2e659" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-26T11:04:27.332133878" + }, + "homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index_csi": { + "content": [ + [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz:md5,5f6796c3ae109a1a5b87353954693f5a" + ] + ], + [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz.csi" + ] + ], + [ + + ], + [ + "versions.yml:md5,c6e19f105510a46af1c5da9064e2e659" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-26T11:03:36.575719606" + }, + "homo_sapiens - [[vcf1, vcf2], []]": { + "content": [ + { + "0": [ + [ + { + "id": "test3" + }, + "test3.vcf.gz:md5,5f6796c3ae109a1a5b87353954693f5a" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,c6e19f105510a46af1c5da9064e2e659" + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test3" + }, + "test3.vcf.gz:md5,5f6796c3ae109a1a5b87353954693f5a" + ] + ], + "versions": [ + "versions.yml:md5,c6e19f105510a46af1c5da9064e2e659" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-26T11:03:54.069826178" + }, + "homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test3" + }, + "test3.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,c6e19f105510a46af1c5da9064e2e659" + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test3" + }, + "test3.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,c6e19f105510a46af1c5da9064e2e659" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-26T11:04:02.45346063" + }, + "homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index_tbi": { + "content": [ + [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz:md5,5f6796c3ae109a1a5b87353954693f5a" + ] + ], + [ + + ], + [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz.tbi" + ] + ], + [ + "versions.yml:md5,c6e19f105510a46af1c5da9064e2e659" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-26T11:03:44.618596639" + }, + "homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index_csi - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + + ], + "2": [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,c6e19f105510a46af1c5da9064e2e659" + ], + "csi": [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,c6e19f105510a46af1c5da9064e2e659" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-26T11:04:19.745768656" + } +} \ No newline at end of file diff --git a/modules/nf-core/bcftools/concat/tests/nextflow.config b/modules/nf-core/bcftools/concat/tests/nextflow.config new file mode 100644 index 0000000..f3e1e98 --- /dev/null +++ b/modules/nf-core/bcftools/concat/tests/nextflow.config @@ -0,0 +1,3 @@ +process { + ext.args = "--no-version" +} \ No newline at end of file diff --git a/modules/nf-core/bcftools/concat/tests/tags.yml b/modules/nf-core/bcftools/concat/tests/tags.yml new file mode 100644 index 0000000..21710d4 --- /dev/null +++ b/modules/nf-core/bcftools/concat/tests/tags.yml @@ -0,0 +1,2 @@ +bcftools/concat: + - "modules/nf-core/bcftools/concat/**" diff --git a/modules/nf-core/bcftools/concat/tests/vcf_gz_index.config b/modules/nf-core/bcftools/concat/tests/vcf_gz_index.config new file mode 100644 index 0000000..7dd696e --- /dev/null +++ b/modules/nf-core/bcftools/concat/tests/vcf_gz_index.config @@ -0,0 +1,4 @@ +process { + ext.prefix = { "${meta.id}_vcf" } + ext.args = "--output-type z --write-index --no-version" +} diff --git a/modules/nf-core/bcftools/concat/tests/vcf_gz_index_csi.config b/modules/nf-core/bcftools/concat/tests/vcf_gz_index_csi.config new file mode 100644 index 0000000..aebffb6 --- /dev/null +++ b/modules/nf-core/bcftools/concat/tests/vcf_gz_index_csi.config @@ -0,0 +1,4 @@ +process { + ext.prefix = { "${meta.id}_vcf" } + ext.args = "--output-type z --write-index=csi --no-version" +} diff --git a/modules/nf-core/bcftools/concat/tests/vcf_gz_index_tbi.config b/modules/nf-core/bcftools/concat/tests/vcf_gz_index_tbi.config new file mode 100644 index 0000000..b192ae7 --- /dev/null +++ b/modules/nf-core/bcftools/concat/tests/vcf_gz_index_tbi.config @@ -0,0 +1,4 @@ +process { + ext.prefix = { "${meta.id}_vcf" } + ext.args = "--output-type z --write-index=tbi --no-version" +} diff --git a/modules/nf-core/bcftools/reheader/environment.yml b/modules/nf-core/bcftools/reheader/environment.yml new file mode 100644 index 0000000..5c00b11 --- /dev/null +++ b/modules/nf-core/bcftools/reheader/environment.yml @@ -0,0 +1,5 @@ +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::bcftools=1.20 diff --git a/modules/nf-core/bcftools/reheader/main.nf b/modules/nf-core/bcftools/reheader/main.nf new file mode 100644 index 0000000..9cf6d0d --- /dev/null +++ b/modules/nf-core/bcftools/reheader/main.nf @@ -0,0 +1,79 @@ +process BCFTOOLS_REHEADER { + tag "$meta.id" + label 'process_low' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/bcftools:1.20--h8b25389_0': + 'biocontainers/bcftools:1.20--h8b25389_0' }" + + input: + tuple val(meta), path(vcf), path(header), path(samples) + tuple val(meta2), path(fai) + + output: + tuple val(meta), path("*.{vcf,vcf.gz,bcf,bcf.gz}"), emit: vcf + tuple val(meta), path("*.{csi,tbi}") , emit: index, optional: true + 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 fai_argument = fai ? "--fai $fai" : "" + def header_argument = header ? "--header $header" : "" + def samples_argument = samples ? "--samples $samples" : "" + + def args2 = task.ext.args2 ?: '--output-type z' + def extension = args2.contains("--output-type b") || args2.contains("-Ob") ? "bcf.gz" : + args2.contains("--output-type u") || args2.contains("-Ou") ? "bcf" : + args2.contains("--output-type z") || args2.contains("-Oz") ? "vcf.gz" : + args2.contains("--output-type v") || args2.contains("-Ov") ? "vcf" : + "vcf" + """ + bcftools \\ + reheader \\ + $fai_argument \\ + $header_argument \\ + $samples_argument \\ + $args \\ + --threads $task.cpus \\ + $vcf \\ + | bcftools view \\ + $args2 \\ + --output ${prefix}.${extension} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ + + stub: + def args2 = task.ext.args2 ?: '--output-type z' + def prefix = task.ext.prefix ?: "${meta.id}" + + def extension = args2.contains("--output-type b") || args2.contains("-Ob") ? "bcf.gz" : + args2.contains("--output-type u") || args2.contains("-Ou") ? "bcf" : + args2.contains("--output-type z") || args2.contains("-Oz") ? "vcf.gz" : + args2.contains("--output-type v") || args2.contains("-Ov") ? "vcf" : + "vcf" + def index = args2.contains("--write-index=tbi") || args2.contains("-W=tbi") ? "tbi" : + args2.contains("--write-index=csi") || args2.contains("-W=csi") ? "csi" : + args2.contains("--write-index") || args2.contains("-W") ? "csi" : + "" + def create_cmd = extension.endsWith(".gz") ? "echo '' | gzip >" : "touch" + def create_index = extension.endsWith(".gz") && index.matches("csi|tbi") ? "touch ${prefix}.${extension}.${index}" : "" + + """ + ${create_cmd} ${prefix}.${extension} + ${create_index} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/bcftools/reheader/meta.yml b/modules/nf-core/bcftools/reheader/meta.yml new file mode 100644 index 0000000..47e5344 --- /dev/null +++ b/modules/nf-core/bcftools/reheader/meta.yml @@ -0,0 +1,76 @@ +name: bcftools_reheader +description: Reheader a VCF file +keywords: + - reheader + - vcf + - update header +tools: + - reheader: + description: | + Modify header of VCF/BCF files, change sample names. + homepage: http://samtools.github.io/bcftools/bcftools.html + documentation: http://samtools.github.io/bcftools/bcftools.html#reheader + doi: 10.1093/gigascience/giab008 + licence: ["MIT"] + identifier: biotools:bcftools +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: VCF/BCF file + pattern: "*.{vcf.gz,vcf,bcf}" + - header: + type: file + description: New header to add to the VCF + pattern: "*.{header.txt}" + - samples: + type: file + description: File containing sample names to update (one sample per line) + pattern: "*.{samples.txt}" + - - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome' ] + - fai: + type: file + description: Fasta index to update header sequences with + pattern: "*.{fai}" +output: + - vcf: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.{vcf,vcf.gz,bcf,bcf.gz}": + type: file + description: VCF with updated header, bgzipped per default + pattern: "*.{vcf,vcf.gz,bcf,bcf.gz}" + - index: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.{csi,tbi}": + type: file + description: Index of VCF with updated header + pattern: "*.{csi,tbi}" + - versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@bjohnnyd" + - "@jemten" + - "@ramprasadn" +maintainers: + - "@bjohnnyd" + - "@jemten" + - "@ramprasadn" diff --git a/modules/nf-core/bcftools/reheader/tests/bcf.config b/modules/nf-core/bcftools/reheader/tests/bcf.config new file mode 100644 index 0000000..2b7dff5 --- /dev/null +++ b/modules/nf-core/bcftools/reheader/tests/bcf.config @@ -0,0 +1,4 @@ +process { + ext.args2 = { "--no-version --output-type b" } + ext.prefix = "tested" +} \ No newline at end of file diff --git a/modules/nf-core/bcftools/reheader/tests/main.nf.test b/modules/nf-core/bcftools/reheader/tests/main.nf.test new file mode 100644 index 0000000..96c1b7b --- /dev/null +++ b/modules/nf-core/bcftools/reheader/tests/main.nf.test @@ -0,0 +1,394 @@ +nextflow_process { + + name "Test Process BCFTOOLS_REHEADER" + script "../main.nf" + process "BCFTOOLS_REHEADER" + tag "modules" + tag "modules_nfcore" + tag "bcftools" + tag "bcftools/reheader" + + test("sarscov2 - [vcf, [], []], fai - vcf output") { + + config "./vcf.config" + when { + + process { + """ + input[0] = [ + [ id:'test', single_end:false ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + [], + [] + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - [vcf, [], []], fai - vcf.gz output") { + + config "./vcf.gz.config" + when { + + process { + """ + input[0] = [ + [ id:'test', single_end:false ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + [], + [] + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - [vcf, [], []], fai - vcf.gz output - index") { + + config "./vcf_gz_index.config" + when { + + process { + """ + input[0] = [ + [ id:'test', single_end:false ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + [], + [] + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.index.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.versions + ).match() }, + { assert process.out.index[0][1].endsWith(".csi") } + ) + } + + } + + test("sarscov2 - [vcf, [], []], fai - vcf.gz output - csi index") { + + config "./vcf_gz_index_csi.config" + when { + + process { + """ + input[0] = [ + [ id:'test', single_end:false ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + [], + [] + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.index.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.versions + ).match() }, + { assert process.out.index[0][1].endsWith(".csi") } + ) + } + + } + + test("sarscov2 - [vcf, [], []], fai - vcf.gz output - tbi index") { + + config "./vcf_gz_index_tbi.config" + when { + + process { + """ + input[0] = [ + [ id:'test', single_end:false ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + [], + [] + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.index.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.versions + ).match() }, + { assert process.out.index[0][1].endsWith(".tbi") } + ) + } + + } + + test("sarscov2 - [vcf, [], []], fai - bcf output") { + + config "./bcf.config" + when { + + process { + """ + input[0] = [ + [ id:'test', single_end:false ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + [], + [] + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - [vcf, header, []], []") { + + config "./vcf.config" + when { + + process { + """ + input[0] = [ + [ id:'test', single_end:false ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf', checkIfExists: true), + [] + ] + input[1] = [ + [ id:'genome' ], // meta map + [] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - [vcf, [], samples], fai") { + + config "./vcf.config" + when { + + process { + """ + ch_no_samples = Channel.of([ + [ id:'test', single_end:false ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + [] + ]) + ch_samples = Channel.of(["samples.txt", "new_name"]) + .collectFile(newLine:true) + input[0] = ch_no_samples.combine(ch_samples) + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - [vcf, [], []], fai - stub") { + + options "-stub" + config "./vcf.config" + when { + + process { + """ + input[0] = [ + [ id:'test', single_end:false ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + [], + [] + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.vcf[0][1]).name, + process.out.versions, + ).match() } + ) + } + + } + test("sarscov2 - [vcf, [], []], fai - vcf.gz output - index -stub") { + + options "-stub" + config "./vcf_gz_index.config" + when { + + process { + """ + input[0] = [ + [ id:'test', single_end:false ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + [], + [] + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - [vcf, [], []], fai - vcf.gz output - csi index -stub") { + + options "-stub" + config "./vcf_gz_index_csi.config" + when { + + process { + """ + input[0] = [ + [ id:'test', single_end:false ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + [], + [] + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - [vcf, [], []], fai - vcf.gz output - tbi index -stub") { + + options "-stub" + config "./vcf_gz_index_tbi.config" + when { + + process { + """ + input[0] = [ + [ id:'test', single_end:false ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + [], + [] + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + +} diff --git a/modules/nf-core/bcftools/reheader/tests/main.nf.test.snap b/modules/nf-core/bcftools/reheader/tests/main.nf.test.snap new file mode 100644 index 0000000..87a3654 --- /dev/null +++ b/modules/nf-core/bcftools/reheader/tests/main.nf.test.snap @@ -0,0 +1,469 @@ +{ + "sarscov2 - [vcf, [], []], fai - vcf.gz output - tbi index": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test_vcf.vcf.gz:md5,8e722884ffb75155212a3fc053918766" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test_vcf.vcf.gz.tbi" + ] + ], + [ + "versions.yml:md5,486e3d4ebc1dbf5c0a4dfaebae12ea34" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-09-03T10:09:05.955833763" + }, + "sarscov2 - [vcf, [], []], fai - vcf.gz output - index -stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + "versions.yml:md5,486e3d4ebc1dbf5c0a4dfaebae12ea34" + ], + "index": [ + [ + { + "id": "test", + "single_end": false + }, + "test_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "vcf": [ + [ + { + "id": "test", + "single_end": false + }, + "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,486e3d4ebc1dbf5c0a4dfaebae12ea34" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-09-03T09:52:41.444952182" + }, + "sarscov2 - [vcf, [], []], fai - vcf.gz output - tbi index -stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test_vcf.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + "versions.yml:md5,486e3d4ebc1dbf5c0a4dfaebae12ea34" + ], + "index": [ + [ + { + "id": "test", + "single_end": false + }, + "test_vcf.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "vcf": [ + [ + { + "id": "test", + "single_end": false + }, + "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,486e3d4ebc1dbf5c0a4dfaebae12ea34" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-09-03T09:53:04.314827944" + }, + "sarscov2 - [vcf, [], []], fai - vcf output": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "tested.vcf:md5,8e722884ffb75155212a3fc053918766" + ] + ], + "1": [ + + ], + "2": [ + "versions.yml:md5,486e3d4ebc1dbf5c0a4dfaebae12ea34" + ], + "index": [ + + ], + "vcf": [ + [ + { + "id": "test", + "single_end": false + }, + "tested.vcf:md5,8e722884ffb75155212a3fc053918766" + ] + ], + "versions": [ + "versions.yml:md5,486e3d4ebc1dbf5c0a4dfaebae12ea34" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-09-03T09:50:41.983008108" + }, + "sarscov2 - [vcf, [], []], fai - bcf output": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "tested.bcf.gz:md5,c8a304c8d2892039201154153c8cd536" + ] + ], + "1": [ + + ], + "2": [ + "versions.yml:md5,486e3d4ebc1dbf5c0a4dfaebae12ea34" + ], + "index": [ + + ], + "vcf": [ + [ + { + "id": "test", + "single_end": false + }, + "tested.bcf.gz:md5,c8a304c8d2892039201154153c8cd536" + ] + ], + "versions": [ + "versions.yml:md5,486e3d4ebc1dbf5c0a4dfaebae12ea34" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-09-03T09:51:43.072513252" + }, + "sarscov2 - [vcf, [], []], fai - vcf.gz output": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "tested.vcf.gz:md5,8e722884ffb75155212a3fc053918766" + ] + ], + "1": [ + + ], + "2": [ + "versions.yml:md5,486e3d4ebc1dbf5c0a4dfaebae12ea34" + ], + "index": [ + + ], + "vcf": [ + [ + { + "id": "test", + "single_end": false + }, + "tested.vcf.gz:md5,8e722884ffb75155212a3fc053918766" + ] + ], + "versions": [ + "versions.yml:md5,486e3d4ebc1dbf5c0a4dfaebae12ea34" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-09-03T09:50:53.055630152" + }, + "sarscov2 - [vcf, [], []], fai - vcf.gz output - index": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test_vcf.vcf.gz:md5,8e722884ffb75155212a3fc053918766" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test_vcf.vcf.gz.csi" + ] + ], + [ + "versions.yml:md5,486e3d4ebc1dbf5c0a4dfaebae12ea34" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-09-03T10:08:37.999924355" + }, + "sarscov2 - [vcf, [], []], fai - vcf.gz output - csi index -stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + "versions.yml:md5,486e3d4ebc1dbf5c0a4dfaebae12ea34" + ], + "index": [ + [ + { + "id": "test", + "single_end": false + }, + "test_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "vcf": [ + [ + { + "id": "test", + "single_end": false + }, + "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,486e3d4ebc1dbf5c0a4dfaebae12ea34" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-09-03T09:52:52.512269206" + }, + "sarscov2 - [vcf, [], []], fai - stub": { + "content": [ + "tested.vcf", + [ + "versions.yml:md5,486e3d4ebc1dbf5c0a4dfaebae12ea34" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-31T15:16:36.337112514" + }, + "sarscov2 - [vcf, [], []], fai - vcf.gz output - csi index": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test_vcf.vcf.gz:md5,8e722884ffb75155212a3fc053918766" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test_vcf.vcf.gz.csi" + ] + ], + [ + "versions.yml:md5,486e3d4ebc1dbf5c0a4dfaebae12ea34" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-09-03T10:08:55.434831174" + }, + "sarscov2 - [vcf, [], samples], fai": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "tested.vcf:md5,c64c373c10b0be24b29d6f18708ec1e8" + ] + ], + "1": [ + + ], + "2": [ + "versions.yml:md5,486e3d4ebc1dbf5c0a4dfaebae12ea34" + ], + "index": [ + + ], + "vcf": [ + [ + { + "id": "test", + "single_end": false + }, + "tested.vcf:md5,c64c373c10b0be24b29d6f18708ec1e8" + ] + ], + "versions": [ + "versions.yml:md5,486e3d4ebc1dbf5c0a4dfaebae12ea34" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-09-03T09:52:12.216002665" + }, + "sarscov2 - [vcf, header, []], []": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "tested.vcf:md5,3189bc9a720d5d5d3006bf72d91300cb" + ] + ], + "1": [ + + ], + "2": [ + "versions.yml:md5,486e3d4ebc1dbf5c0a4dfaebae12ea34" + ], + "index": [ + + ], + "vcf": [ + [ + { + "id": "test", + "single_end": false + }, + "tested.vcf:md5,3189bc9a720d5d5d3006bf72d91300cb" + ] + ], + "versions": [ + "versions.yml:md5,486e3d4ebc1dbf5c0a4dfaebae12ea34" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-09-03T09:51:54.062386022" + } +} \ No newline at end of file diff --git a/modules/nf-core/bcftools/reheader/tests/tags.yml b/modules/nf-core/bcftools/reheader/tests/tags.yml new file mode 100644 index 0000000..c252941 --- /dev/null +++ b/modules/nf-core/bcftools/reheader/tests/tags.yml @@ -0,0 +1,2 @@ +bcftools/reheader: + - modules/nf-core/bcftools/reheader/** diff --git a/modules/nf-core/bcftools/reheader/tests/vcf.config b/modules/nf-core/bcftools/reheader/tests/vcf.config new file mode 100644 index 0000000..820f2ae --- /dev/null +++ b/modules/nf-core/bcftools/reheader/tests/vcf.config @@ -0,0 +1,4 @@ +process { + ext.args2 = { "--no-version" } + ext.prefix = "tested" +} \ No newline at end of file diff --git a/modules/nf-core/bcftools/reheader/tests/vcf.gz.config b/modules/nf-core/bcftools/reheader/tests/vcf.gz.config new file mode 100644 index 0000000..c3031c3 --- /dev/null +++ b/modules/nf-core/bcftools/reheader/tests/vcf.gz.config @@ -0,0 +1,4 @@ +process { + ext.args2 = { "--no-version --output-type z" } + ext.prefix = "tested" +} \ No newline at end of file diff --git a/modules/nf-core/bcftools/reheader/tests/vcf_gz_index.config b/modules/nf-core/bcftools/reheader/tests/vcf_gz_index.config new file mode 100644 index 0000000..1e050ec --- /dev/null +++ b/modules/nf-core/bcftools/reheader/tests/vcf_gz_index.config @@ -0,0 +1,4 @@ +process { + ext.prefix = { "${meta.id}_vcf" } + ext.args2 = "--output-type z --write-index --no-version" +} diff --git a/modules/nf-core/bcftools/reheader/tests/vcf_gz_index_csi.config b/modules/nf-core/bcftools/reheader/tests/vcf_gz_index_csi.config new file mode 100644 index 0000000..536e4b4 --- /dev/null +++ b/modules/nf-core/bcftools/reheader/tests/vcf_gz_index_csi.config @@ -0,0 +1,4 @@ +process { + ext.prefix = { "${meta.id}_vcf" } + ext.args2 = "--output-type z --write-index=csi --no-version" +} diff --git a/modules/nf-core/bcftools/reheader/tests/vcf_gz_index_tbi.config b/modules/nf-core/bcftools/reheader/tests/vcf_gz_index_tbi.config new file mode 100644 index 0000000..91a80db --- /dev/null +++ b/modules/nf-core/bcftools/reheader/tests/vcf_gz_index_tbi.config @@ -0,0 +1,5 @@ +process { + ext.prefix = { "${meta.id}_vcf" } + ext.args2 = "--output-type z --write-index=tbi --no-version" + +} diff --git a/nextflow.config b/nextflow.config index bb03373..16515b3 100644 --- a/nextflow.config +++ b/nextflow.config @@ -11,6 +11,7 @@ params { // Input options input = null + rename = true // References genome = null @@ -18,10 +19,10 @@ params { igenomes_ignore = false // MultiQC options - multiqc_config = null - multiqc_title = null - multiqc_logo = null - max_multiqc_email_size = '25.MB' + multiqc_config = null + multiqc_title = null + multiqc_logo = null + max_multiqc_email_size = '25.MB' multiqc_methods_description = null // Boilerplate options @@ -37,20 +38,21 @@ params { show_hidden = false version = false pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/' - trace_report_suffix = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss')// Config options - config_profile_name = null - config_profile_description = null - custom_config_version = 'master' - custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" - config_profile_contact = null - config_profile_url = null + trace_report_suffix = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss') + config_profile_name = null + config_profile_description = null + custom_config_version = 'master' + custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" + config_profile_contact = null + config_profile_url = null // Schema validation default options - validate_params = true + validate_params = true } // Load base.config by default for all pipelines includeConfig 'conf/base.config' +includeConfig 'conf/modules.config' profiles { debug { @@ -209,23 +211,21 @@ dag { manifest { name = 'qbic-pipelines/vcftomat' - author = """Famke Bäuerle, Dorothy Ellis""" // The author field is deprecated from Nextflow version 24.10.0, use contributors instead contributors = [ - // TODO nf-core: Update the field with the details of the contributors to your pipeline. New with Nextflow version 24.10.0 [ name: 'Famke Bäuerle', - affiliation: '', - email: '', - github: '', - contribution: [], // List of contribution types ('author', 'maintainer' or 'contributor') - orcid: '' + affiliation: 'University of Tuebingen', + email: 'famke.baeuerle@uni-tuebingen.de', + github: '@famosab', + contribution: ['author', 'maintainer'], // List of contribution types ('author', 'maintainer' or 'contributor') + orcid: '0000-0003-1387-0251' ], [ name: ' Dorothy Ellis', affiliation: '', email: '', - github: '', - contribution: [], // List of contribution types ('author', 'maintainer' or 'contributor') + github: '@ellisdoro', + contribution: ['contributor'], // List of contribution types ('author', 'maintainer' or 'contributor') orcid: '' ], ] @@ -234,7 +234,7 @@ manifest { mainScript = 'main.nf' defaultBranch = 'master' nextflowVersion = '!>=24.04.2' - version = '1.0.0' + version = '1.1.0' doi = '' } diff --git a/nextflow_schema.json b/nextflow_schema.json index e51d58a..6dc73b2 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -23,6 +23,11 @@ "help_text": "You will need to create a design file with information about the samples in your experiment before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 3 columns, and a header row.", "fa_icon": "fas fa-file-csv" }, + "rename": { + "type": "boolean", + "default": true, + "description": "Renaming the sample names within the VCF file to the VCF filename." + }, "outdir": { "type": "string", "format": "directory-path", @@ -65,6 +70,14 @@ "help_text": "This parameter is *mandatory* if `--genome` is not specified. If you don't have a BWA index available this will be generated for you automatically. Combine with `--save_reference` to save BWA index for future runs.", "fa_icon": "far fa-file-code" }, + "fai": { + "type": "string", + "description": "Path to FASTA FAI genome index file." + }, + "dict": { + "type": "string", + "description": "Path to genome dict file" + }, "igenomes_ignore": { "type": "boolean", "description": "Do not load the iGenomes reference config.", @@ -241,13 +254,5 @@ { "$ref": "#/$defs/generic_options" } - ], - "properties": { - "fai": { - "type": "string" - }, - "dict": { - "type": "string" - } - } + ] } diff --git a/nf-test.config b/nf-test.config index b206777..7b60f87 100644 --- a/nf-test.config +++ b/nf-test.config @@ -14,5 +14,6 @@ config { plugins { load "nft-bam@0.5.0" load "nft-utils@0.0.3" + load "nft-vcf@1.0.7" } } diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 82d6934..d73a10f 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -19,10 +19,93 @@ ], "@graph": [ { - "@id": "#", - "@type": "Person", - "email": "", - "name": "Famke Ba\u0308uerle" + "@id": "./", + "@type": "Dataset", + "creativeWorkStatus": "Stable", + "datePublished": "2025-01-08T12:21:55+00:00", + "description": "# qbic-pipelines/vcftomat\n\n[![GitHub Actions CI Status](https://github.com/qbic-pipelines/vcftomat/actions/workflows/ci.yml/badge.svg)](https://github.com/qbic-pipelines/vcftomat/actions/workflows/ci.yml)\n[![GitHub Actions Linting Status](https://github.com/qbic-pipelines/vcftomat/actions/workflows/linting.yml/badge.svg)](https://github.com/qbic-pipelines/vcftomat/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A524.04.2-23aa62.svg)](https://www.nextflow.io/)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/qbic-pipelines/vcftomat)\n\n## Introduction\n\n**qbic-pipelines/vcftomat** is a bioinformatics pipeline that processes g.vcf files to a matrix suitable for downstream analysis. The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using the following steps:\n\n1. Indexes (g.)vcf files ([`tabix`](http://www.htslib.org/doc/tabix.html))\n2. Converts g.vcf files to vcf with `genotypegvcf` ([`GATK`](https://gatk.broadinstitute.org/hc/en-us))\n3. Concatenates all vcfs that have the same id and the same label with `bcftools/concat` ([`bcftools`](https://samtools.github.io/bcftools/bcftools.html))\n4. Changes the sample name in the vcf file to the filename with `bcftools/reheader` ([`bcftools`](https://samtools.github.io/bcftools/bcftools.html)) - This can be turned off by adding `--rename false` to the `nextflow run` command.\n5. Merges all vcfs from the same sample with `bcftools/merge` ([`bcftools`](https://samtools.github.io/bcftools/bcftools.html))\n6. Converts the (merged) vcfs to a matrix using a custom R script written by @ellisdoro ([`R`](https://www.r-project.org/))\n7. Collects all reports into a MultiQC report ([`MultiQC`](http://multiqc.info/))\n\n![](./docs/images/vcftomat.excalidraw.png)\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\nFirst, prepare a samplesheet with your input data that looks as follows:\n\n`samplesheet.csv`:\n\n```csv\nsample,label,gvcf,vcf_path,vcf_index_path\nSAMPLE-1,pipelineA-callerA,false,path/to/vcf.gz,path/to/.vcf.gz.tbi\nSAMPLE-1,pipelineB-callerA,false,path/to/vcf.gz,path/to/.vcf.gz.tbi\nSAMPLE-2,pipelineB-callerB,true,path/to/g.vcf.gz,path/to/g.vcf.gz.tbi\nSAMPLE-2,pipelineB-callerB,true,path/to/g.vcf.gz,path/to/g.vcf.gz.tbi\n```\n\nEach row represents a VCF file coming from a sample. The `label` column enables concatenation of vcfs (for example when the pipeline produces different vcfs for chrM and chrY). The `gvcf` column indicates whether the file is a g.vcf file or not. The `vcf_path` and `vcf_index_path` columns contain the path to the VCF file and its index, respectively.\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run qbic-pipelines/vcftomat \\\n -profile \\\n --input samplesheet.csv \\\n --genome GATK.GRCh38 \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\n## Credits\n\nqbic-pipelines/vcftomat was originally written by Famke B\u00e4uerle, Dorothy Ellis.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nThis pipeline uses code and infrastructure developed and maintained by the [nf-core](https://nf-co.re) community, reused here under the [MIT license](https://github.com/nf-core/tools/blob/main/LICENSE).\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", + "hasPart": [ + { + "@id": "main.nf" + }, + { + "@id": "assets/" + }, + { + "@id": "bin/" + }, + { + "@id": "conf/" + }, + { + "@id": "docs/" + }, + { + "@id": "docs/images/" + }, + { + "@id": "modules/" + }, + { + "@id": "modules/local/" + }, + { + "@id": "modules/nf-core/" + }, + { + "@id": "workflows/" + }, + { + "@id": "subworkflows/" + }, + { + "@id": "nextflow.config" + }, + { + "@id": "README.md" + }, + { + "@id": "nextflow_schema.json" + }, + { + "@id": "CHANGELOG.md" + }, + { + "@id": "LICENSE" + }, + { + "@id": "CITATIONS.md" + }, + { + "@id": "modules.json" + }, + { + "@id": "docs/usage.md" + }, + { + "@id": "docs/output.md" + }, + { + "@id": ".nf-core.yml" + }, + { + "@id": ".pre-commit-config.yaml" + }, + { + "@id": ".prettierignore" + } + ], + "isBasedOn": "https://github.com/qbic-pipelines/vcftomat", + "license": "MIT", + "mainEntity": { + "@id": "main.nf" + }, + "mentions": [ + { + "@id": "#52a401c6-dec9-4dfe-92eb-d33149004223" + } + ], + "name": "qbic-pipelines/vcftomat" }, { "@id": "ro-crate-metadata.json", @@ -44,14 +127,22 @@ "@type": ["File", "SoftwareSourceCode", "ComputationalWorkflow"], "creator": [ { - "@id": "#" + "@id": "https://orcid.org/0000-0003-1387-0251" + }, + { + "@id": "#45968370+famosab@users.noreply.github.com" } ], "dateCreated": "", - "dateModified": "2024-12-16T14:54:00Z", + "dateModified": "2025-01-08T13:21:55Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": ["nf-core", "nextflow"], "license": ["MIT"], + "maintainer": [ + { + "@id": "https://orcid.org/0000-0003-1387-0251" + } + ], "name": ["qbic-pipelines/vcftomat"], "programmingLanguage": { "@id": "https://w3id.org/workflowhub/workflow-ro-crate#nextflow" @@ -59,8 +150,8 @@ "sdPublisher": { "@id": "https://nf-co.re/" }, - "url": ["https://github.com/qbic-pipelines/vcftomat", "https://nf-co.re/qbic-pipelines/vcftomat/dev/"], - "version": ["1.0.0dev"] + "url": ["https://github.com/qbic-pipelines/vcftomat", "https://nf-co.re/qbic-pipelines/vcftomat/1.1.0/"], + "version": ["1.1.0"] }, { "@id": "https://w3id.org/workflowhub/workflow-ro-crate#nextflow", @@ -75,11 +166,11 @@ "version": "!>=24.04.2" }, { - "@id": "#d5224f03-284f-41f1-93d1-e813bdaeb009", + "@id": "#52a401c6-dec9-4dfe-92eb-d33149004223", "@type": "TestSuite", "instance": [ { - "@id": "#812ae302-1686-4339-815d-ec28877e71f6" + "@id": "#2a6b4982-255a-44b9-9ff1-e0690f6c6e9d" } ], "mainEntity": { @@ -88,7 +179,7 @@ "name": "Test suite for qbic-pipelines/vcftomat" }, { - "@id": "#812ae302-1686-4339-815d-ec28877e71f6", + "@id": "#2a6b4982-255a-44b9-9ff1-e0690f6c6e9d", "@type": "TestInstance", "name": "GitHub Actions workflow for testing qbic-pipelines/vcftomat", "resource": "repos/qbic-pipelines/vcftomat/actions/workflows/ci.yml", @@ -110,6 +201,11 @@ "@type": "Dataset", "description": "Additional files" }, + { + "@id": "bin/", + "@type": "Dataset", + "description": "Scripts that must be callable from a pipeline process" + }, { "@id": "conf/", "@type": "Dataset", @@ -120,11 +216,21 @@ "@type": "Dataset", "description": "Markdown files for documenting the pipeline" }, + { + "@id": "docs/images/", + "@type": "Dataset", + "description": "Images for the documentation files" + }, { "@id": "modules/", "@type": "Dataset", "description": "Modules used by the pipeline" }, + { + "@id": "modules/local/", + "@type": "Dataset", + "description": "Pipeline-specific modules" + }, { "@id": "modules/nf-core/", "@type": "Dataset", @@ -205,6 +311,18 @@ "@type": "Organization", "name": "nf-core", "url": "https://nf-co.re/" + }, + { + "@id": "https://orcid.org/0000-0003-1387-0251", + "@type": "Person", + "email": "45968370+famosab@users.noreply.github.com", + "name": "Famke B\u00e4uerle" + }, + { + "@id": "#45968370+famosab@users.noreply.github.com", + "@type": "Person", + "email": "45968370+famosab@users.noreply.github.com", + "name": "Famke Ba\u0308uerle" } ] } diff --git a/tests/.nftignore b/tests/.nftignore index e69de29..4b801d5 100644 --- a/tests/.nftignore +++ b/tests/.nftignore @@ -0,0 +1,19 @@ +**/*.vcf.{gz,gz.tbi,gz.csi} +tabix/*.vcf.{gz,gz.tbi,gz.csi} +gatk/*.vcf.{gz,gz.tbi} +bcftools/concat/*.vcf.{gz,gz.tbi} +bcftools/reheader/*.vcf.{gz,gz.tbi} +bcftools/merge/*.vcf.{gz,gz.tbi} +pipeline_info/*.{html,json,txt} +multiqc/multiqc_data/multiqc.log +multiqc/multiqc_data/multiqc_data.json +multiqc/multiqc_data/multiqc_general_stats.txt +multiqc/multiqc_data/multiqc_picard_dups.txt +multiqc/multiqc_data/multiqc_software_versions.txt +multiqc/multiqc_data/multiqc_sources.txt +multiqc/multiqc_data/picard_deduplication.txt +multiqc/multiqc_data/vcftools_tstv_by_qual.txt +multiqc/multiqc_plots/{svg,pdf,png}/*.{svg,pdf,png} +multiqc/multiqc_report.html +**/toindex_concat_merge.csv +pipeline_info/vcftomat_software_mqc_versions.yml diff --git a/tests/default.nf.test b/tests/default.nf.test index 37c0549..e13a6d8 100644 --- a/tests/default.nf.test +++ b/tests/default.nf.test @@ -18,17 +18,21 @@ nextflow_pipeline { def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) // stable_path: All files in ${params.outdir}/ with stable content def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') + // vcf_files: All files in ${params.outdir} + def vcf_files = getAllFilesFromDir(params.outdir, include: ['**/*.vcf.gz', '**/*.vcf']) assertAll( { assert workflow.success}, { assert snapshot( // Number of successful tasks workflow.trace.succeeded().size(), // pipeline versions.yml file for multiqc from which Nextflow version is removed because we tests pipelines on multiple Nextflow versions - removeNextflowVersion("$outputDir/pipeline_info/pipeline_software_mqc_versions.yml"), + removeNextflowVersion("$outputDir/pipeline_info/vcftomat_software_mqc_versions.yml"), // All stable path name, with a relative path stable_name, // All files with stable contents - stable_path + stable_path, + // All vcf files + vcf_files.collect{ file -> file.name + ":md5," + path(file.path).vcf.variantsMD5 } ).match() } ) } @@ -51,17 +55,21 @@ nextflow_pipeline { def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) // stable_path: All files in ${params.outdir}/ with stable content def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') + // vcf_files: All files in ${params.outdir} + def vcf_files = getAllFilesFromDir(params.outdir, include: ['**/*.vcf.gz', '**/*.vcf']) assertAll( { assert workflow.success}, { assert snapshot( // Number of successful tasks workflow.trace.succeeded().size(), // pipeline versions.yml file for multiqc from which Nextflow version is removed because we tests pipelines on multiple Nextflow versions - removeNextflowVersion("$outputDir/pipeline_info/pipeline_software_mqc_versions.yml"), + removeNextflowVersion("$outputDir/pipeline_info/vcftomat_software_mqc_versions.yml"), // All stable path name, with a relative path stable_name, // All files with stable contents - stable_path + stable_path, + // All vcf files + vcf_files ).match() } ) } diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 53659f6..ba51107 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -1,8 +1,11 @@ { "Params: default - stub": { "content": [ - 3, + 4, { + "BCFTOOLS_REHEADER": { + "bcftools": 1.2 + }, "TABIX_TABIX": { "tabix": 1.2 }, @@ -10,16 +13,21 @@ "vcf2counts.R": "1.0.0" }, "Workflow": { - "qbic-pipelines/vcftomat": "v1.0.0" + "qbic-pipelines/vcftomat": "v1.1.0" } }, [ + "bcftools", + "bcftools/reheader", + "bcftools/reheader/chr22.reheader.vcf.gz", + "bcftools/reheader/chr22.reheader.vcf.gz.tbi", + "bcftools/reheader/versions.yml", "multiqc", "multiqc/multiqc_data", "multiqc/multiqc_plots", "multiqc/multiqc_report.html", "pipeline_info", - "pipeline_info/pipeline_software_mqc_versions.yml", + "pipeline_info/vcftomat_software_mqc_versions.yml", "tabix", "tabix/NA12878.chr22.1X.vcf.gz.csi", "tabix/NA12878.chr22.1X.vcf.gz.tbi", @@ -27,24 +35,26 @@ "vcf2mat/chr22.csv" ], [ - "multiqc_report.html:md5,d41d8cd98f00b204e9800998ecf8427e", - "params_2024-12-11_11-15-12.json:md5,968166186e8c46974d7165db1f4e84b0", - "pipeline_software_mqc_versions.yml:md5,4a3c08d739de008e8cfee04b52a64b05", - "NA12878.chr22.1X.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e", - "NA12878.chr22.1X.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", + "versions.yml:md5,c030f20e1b02bd49b0a4ec369f5b4429", "chr22.csv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "chr22.reheader.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], "meta": { "nf-test": "0.9.2", "nextflow": "24.10.2" }, - "timestamp": "2024-12-11T11:15:19.55845" + "timestamp": "2024-12-20T12:10:59.547851" }, "Params: default": { "content": [ - 3, + 4, { + "BCFTOOLS_REHEADER": { + "bcftools": 1.2 + }, "TABIX_TABIX": { "tabix": 1.2 }, @@ -52,10 +62,15 @@ "vcf2counts.R": "1.0.0" }, "Workflow": { - "qbic-pipelines/vcftomat": "v1.0.0" + "qbic-pipelines/vcftomat": "v1.1.0" } }, [ + "bcftools", + "bcftools/reheader", + "bcftools/reheader/chr22.reheader.vcf.gz", + "bcftools/reheader/chr22.reheader.vcf.gz.tbi", + "bcftools/reheader/versions.yml", "multiqc", "multiqc/multiqc_data", "multiqc/multiqc_data/multiqc.log", @@ -65,29 +80,25 @@ "multiqc/multiqc_data/multiqc_sources.txt", "multiqc/multiqc_report.html", "pipeline_info", - "pipeline_info/pipeline_software_mqc_versions.yml", + "pipeline_info/vcftomat_software_mqc_versions.yml", "tabix", "tabix/NA12878.chr22.1X.vcf.gz.tbi", "vcf2mat", "vcf2mat/chr22.csv" ], [ - "multiqc.log:md5,5b8c6067298a490674b646971f716100", + "versions.yml:md5,c030f20e1b02bd49b0a4ec369f5b4429", "multiqc_citations.txt:md5,4c806e63a283ec1b7e78cdae3a923d4f", - "multiqc_data.json:md5,949e3064280a0e919782c85d64fda606", - "multiqc_software_versions.txt:md5,5b52328f6144cbad9faab2aebb879f2a", - "multiqc_sources.txt:md5,d2a044df39ce3c6abe5cdc2d67473490", - "multiqc_report.html:md5,b7e65cff7abafa2795efb34b52f5a0d7", - "params_2024-12-11_11-14-49.json:md5,b088670a94ed20471600d3ac5928ba66", - "pipeline_software_mqc_versions.yml:md5,4a3c08d739de008e8cfee04b52a64b05", - "NA12878.chr22.1X.vcf.gz.tbi:md5,3ca6e94f86c548be87dd5fcc391a2525", - "chr22.csv:md5,765ece7265a0b6abac7df8d8632a1500" + "chr22.csv:md5,06c743150691cd38f4a2caf65ca6c115" + ], + [ + "chr22.reheader.vcf.gz:md5,11558863c409ca2d6278e699cd5fde1a" ] ], "meta": { "nf-test": "0.9.2", "nextflow": "24.10.2" }, - "timestamp": "2024-12-11T11:15:08.98074" + "timestamp": "2024-12-20T12:10:25.903469" } } diff --git a/tests/full.nf.test b/tests/full.nf.test index 7f1557a..c8319b4 100644 --- a/tests/full.nf.test +++ b/tests/full.nf.test @@ -18,17 +18,25 @@ nextflow_pipeline { def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) // stable_path: All files in ${params.outdir}/ with stable content def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') + // vcf_files: All files in ${params.outdir} + def vcf_files = getAllFilesFromDir(params.outdir, + include: ['**/*.vcf.gz', '**/*.vcf'], + ignore: ['**/concat.concat.vcf.gz', + '**/toindex_concat_merge.merge.vcf.gz', + '**/concat.reheader.vcf.gz']) assertAll( { assert workflow.success}, { assert snapshot( // Number of successful tasks workflow.trace.succeeded().size(), // pipeline versions.yml file for multiqc from which Nextflow version is removed because we tests pipelines on multiple Nextflow versions - removeNextflowVersion("$outputDir/pipeline_info/pipeline_software_mqc_versions.yml"), + removeNextflowVersion("$outputDir/pipeline_info/vcftomat_software_mqc_versions.yml"), // All stable path name, with a relative path stable_name, // All files with stable contents - stable_path + stable_path, + // All vcf files + vcf_files.collect{ file -> file.name + ":md5," + path(file.path).vcf.variantsMD5 } ).match() } ) } @@ -51,17 +59,21 @@ nextflow_pipeline { def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) // stable_path: All files in ${params.outdir}/ with stable content def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') + // vcf_files: All files in ${params.outdir} + def vcf_files = getAllFilesFromDir(params.outdir, include: ['**/*.vcf.gz', '**/*.vcf']) assertAll( { assert workflow.success}, { assert snapshot( // Number of successful tasks workflow.trace.succeeded().size(), // pipeline versions.yml file for multiqc from which Nextflow version is removed because we tests pipelines on multiple Nextflow versions - removeNextflowVersion("$outputDir/pipeline_info/pipeline_software_mqc_versions.yml"), + removeNextflowVersion("$outputDir/pipeline_info/vcftomat_software_mqc_versions.yml"), // All stable path name, with a relative path stable_name, // All files with stable contents - stable_path + stable_path, + // All vcf files + vcf_files ).match() } ) } diff --git a/tests/full.nf.test.snap b/tests/full.nf.test.snap index 3761602..bda1ed8 100644 --- a/tests/full.nf.test.snap +++ b/tests/full.nf.test.snap @@ -1,11 +1,17 @@ { "Params: default | input full-size": { "content": [ - 15, + 23, { + "BCFTOOLS_CONCAT": { + "bcftools": 1.2 + }, "BCFTOOLS_MERGE": { "bcftools": 1.2 }, + "BCFTOOLS_REHEADER": { + "bcftools": 1.2 + }, "GATK4_GENOTYPEGVCFS": { "gatk4": "4.6.1.0" }, @@ -16,13 +22,35 @@ "vcf2counts.R": "1.0.0" }, "Workflow": { - "qbic-pipelines/vcftomat": "v1.0.0" + "qbic-pipelines/vcftomat": "v1.1.0" } }, [ "bcftools", - "bcftools/indexed_merge.merged.vcf", - "bcftools/toindex_gvcf_merge.merged.vcf", + "bcftools/concat", + "bcftools/concat/concat.concat.vcf.gz", + "bcftools/concat/concat.concat.vcf.gz.tbi", + "bcftools/concat/versions.yml", + "bcftools/merge", + "bcftools/merge/indexed_merge.merge.vcf.gz", + "bcftools/merge/indexed_merge.merge.vcf.gz.tbi", + "bcftools/merge/toindex_concat_merge.merge.vcf.gz", + "bcftools/merge/toindex_concat_merge.merge.vcf.gz.tbi", + "bcftools/merge/toindex_gvcf_merge.merge.vcf.gz", + "bcftools/merge/toindex_gvcf_merge.merge.vcf.gz.tbi", + "bcftools/merge/versions.yml", + "bcftools/reheader", + "bcftools/reheader/callerA.reheader.vcf.gz", + "bcftools/reheader/callerA.reheader.vcf.gz.tbi", + "bcftools/reheader/callerB.reheader.vcf.gz", + "bcftools/reheader/callerB.reheader.vcf.gz.tbi", + "bcftools/reheader/concat.reheader.vcf.gz", + "bcftools/reheader/concat.reheader.vcf.gz.tbi", + "bcftools/reheader/empty.reheader.vcf.gz", + "bcftools/reheader/empty.reheader.vcf.gz.tbi", + "bcftools/reheader/merge.reheader.vcf.gz", + "bcftools/reheader/merge.reheader.vcf.gz.tbi", + "bcftools/reheader/versions.yml", "gatk4", "gatk4/test.vcf.gz", "gatk4/test.vcf.gz.tbi", @@ -37,56 +65,58 @@ "multiqc/multiqc_data/multiqc_sources.txt", "multiqc/multiqc_report.html", "pipeline_info", - "pipeline_info/pipeline_software_mqc_versions.yml", + "pipeline_info/vcftomat_software_mqc_versions.yml", "tabix", "tabix/NA12878.chr22.1X.vcf.gz.tbi", + "tabix/NA12878_GIAB.chr22.vcf.gz.tbi", + "tabix/NA24385_sv.vcf.gz.tbi", "tabix/test.genome.g.vcf.gz.tbi", "tabix/test2.genome.vcf.gz.tbi", "vcf2mat", "vcf2mat/empty.csv", "vcf2mat/indexed_merge.csv", - "vcf2mat/toindex_gvcf_merge.csv", - "vcf2mat/toindex_gvcf_nomerge.csv", - "vcf2mat/toindex_nomerge.csv" + "vcf2mat/toindex_concat_merge.csv", + "vcf2mat/toindex_gvcf_merge.csv" ], [ - "indexed_merge.merged.vcf:md5,6e7b63a467a7490760a772503dc45e2f", - "toindex_gvcf_merge.merged.vcf:md5,89b6ab10b8c019287cf987f9eaaa6490", - "test.vcf.gz:md5,ab2e3acf677384a527d6fd15279e1308", - "test.vcf.gz.tbi:md5,0613c73f14e6004eadbfc526e0fc65a0", - "test2.vcf.gz:md5,ef3d1e3200d95bc2a4b622e74b6c7dad", - "test2.vcf.gz.tbi:md5,fea49a9f40baf32f545a7751e83349f5", - "multiqc.log:md5,a4724d0703c65afa594812ffbbe2cee6", + "versions.yml:md5,8e4cc1068ff64a583811f3e3bd8a4771", + "versions.yml:md5,0567f354f7d4ddac23b392f94e760ea2", + "versions.yml:md5,c030f20e1b02bd49b0a4ec369f5b4429", "multiqc_citations.txt:md5,4c806e63a283ec1b7e78cdae3a923d4f", - "multiqc_data.json:md5,2458fdbc4e37592ee1369405a45fff8f", - "multiqc_software_versions.txt:md5,7cd6280ad9aab78724d0729c9a3e22ef", - "multiqc_sources.txt:md5,d2a044df39ce3c6abe5cdc2d67473490", - "multiqc_report.html:md5,7a88b785de013b9be1e80d10599f6623", - "params_2024-12-11_13-01-24.json:md5,b230863e6e2b61cce98fb66078d01f59", - "pipeline_software_mqc_versions.yml:md5,1b2f9328e5885175a2b6f3a5cd03f323", - "NA12878.chr22.1X.vcf.gz.tbi:md5,3ca6e94f86c548be87dd5fcc391a2525", - "test.genome.g.vcf.gz.tbi:md5,e7611a7f7d2eb07d5adeb4d4569578ab", - "test2.genome.vcf.gz.tbi:md5,6fe54f8e8d38cbbc0046f4427b21e11a", - "empty.csv:md5,77f0670b6b6ac7830e02d4c0222075c5", - "indexed_merge.csv:md5,c79bcada2daab2953452c076920e1c00", - "toindex_gvcf_merge.csv:md5,22a6203ce9bdf4763f30c54c6e4d2b77", - "toindex_gvcf_nomerge.csv:md5,317e9254f321fa886a990221d261e3de", - "toindex_nomerge.csv:md5,765ece7265a0b6abac7df8d8632a1500" + "empty.csv:md5,1bd32757621943a049881f0f99e4a2c4", + "indexed_merge.csv:md5,b59aae2be818fd1ddc1fb3b9e8e8e89b", + "toindex_gvcf_merge.csv:md5,bb0cc37d7f55f611a8d0f11c4d80dece" + ], + [ + "indexed_merge.merge.vcf.gz:md5,5089e377e380c78d3ff29a8d36db14dd", + "toindex_gvcf_merge.merge.vcf.gz:md5,6f6b4664d06ccb50ceead526cec7aa0d", + "callerA.reheader.vcf.gz:md5,16b9e984ed9af8f4d147900f9b8e0bee", + "callerB.reheader.vcf.gz:md5,9faa7fb1a37a48c4444b498e39ca4c01", + "empty.reheader.vcf.gz:md5,d41d8cd98f00b204e9800998ecf8427e", + "merge.reheader.vcf.gz:md5,9faa7fb1a37a48c4444b498e39ca4c01", + "test.vcf.gz:md5,1ab95fbc5ec55b208f3001572bec54fa", + "test2.vcf.gz:md5,4046f52f4ea6616b7295c7f16b987710" ] ], "meta": { "nf-test": "0.9.2", "nextflow": "24.10.2" }, - "timestamp": "2024-12-11T13:02:46.414504" + "timestamp": "2024-12-20T12:11:20.624762" }, "Params: default | input full-size - stub": { "content": [ - 15, + 23, { + "BCFTOOLS_CONCAT": { + "bcftools": 1.2 + }, "BCFTOOLS_MERGE": { "bcftools": 1.2 }, + "BCFTOOLS_REHEADER": { + "bcftools": 1.2 + }, "GATK4_GENOTYPEGVCFS": { "gatk4": "4.6.1.0" }, @@ -97,13 +127,35 @@ "vcf2counts.R": "1.0.0" }, "Workflow": { - "qbic-pipelines/vcftomat": "v1.0.0" + "qbic-pipelines/vcftomat": "v1.1.0" } }, [ "bcftools", - "bcftools/indexed_merge.merged.vcf", - "bcftools/toindex_gvcf_merge.merged.vcf", + "bcftools/concat", + "bcftools/concat/concat.concat.vcf.gz", + "bcftools/concat/concat.concat.vcf.gz.tbi", + "bcftools/concat/versions.yml", + "bcftools/merge", + "bcftools/merge/indexed_merge.merge.vcf.gz", + "bcftools/merge/indexed_merge.merge.vcf.gz.tbi", + "bcftools/merge/toindex_concat_merge.merge.vcf.gz", + "bcftools/merge/toindex_concat_merge.merge.vcf.gz.tbi", + "bcftools/merge/toindex_gvcf_merge.merge.vcf.gz", + "bcftools/merge/toindex_gvcf_merge.merge.vcf.gz.tbi", + "bcftools/merge/versions.yml", + "bcftools/reheader", + "bcftools/reheader/callerA.reheader.vcf.gz", + "bcftools/reheader/callerA.reheader.vcf.gz.tbi", + "bcftools/reheader/callerB.reheader.vcf.gz", + "bcftools/reheader/callerB.reheader.vcf.gz.tbi", + "bcftools/reheader/concat.reheader.vcf.gz", + "bcftools/reheader/concat.reheader.vcf.gz.tbi", + "bcftools/reheader/empty.reheader.vcf.gz", + "bcftools/reheader/empty.reheader.vcf.gz.tbi", + "bcftools/reheader/merge.reheader.vcf.gz", + "bcftools/reheader/merge.reheader.vcf.gz.tbi", + "bcftools/reheader/versions.yml", "gatk4", "gatk4/test.vcf.gz", "gatk4/test.vcf.gz.tbi", @@ -114,10 +166,14 @@ "multiqc/multiqc_plots", "multiqc/multiqc_report.html", "pipeline_info", - "pipeline_info/pipeline_software_mqc_versions.yml", + "pipeline_info/vcftomat_software_mqc_versions.yml", "tabix", "tabix/NA12878.chr22.1X.vcf.gz.csi", "tabix/NA12878.chr22.1X.vcf.gz.tbi", + "tabix/NA12878_GIAB.chr22.vcf.gz.csi", + "tabix/NA12878_GIAB.chr22.vcf.gz.tbi", + "tabix/NA24385_sv.vcf.gz.csi", + "tabix/NA24385_sv.vcf.gz.tbi", "tabix/test.genome.g.vcf.gz.csi", "tabix/test.genome.g.vcf.gz.tbi", "tabix/test2.genome.vcf.gz.csi", @@ -125,37 +181,35 @@ "vcf2mat", "vcf2mat/empty.csv", "vcf2mat/indexed_merge.csv", - "vcf2mat/toindex_gvcf_merge.csv", - "vcf2mat/toindex_gvcf_nomerge.csv", - "vcf2mat/toindex_nomerge.csv" + "vcf2mat/toindex_concat_merge.csv", + "vcf2mat/toindex_gvcf_merge.csv" ], [ - "indexed_merge.merged.vcf:md5,d41d8cd98f00b204e9800998ecf8427e", - "toindex_gvcf_merge.merged.vcf:md5,d41d8cd98f00b204e9800998ecf8427e", - "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", - "test2.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test2.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", - "multiqc_report.html:md5,d41d8cd98f00b204e9800998ecf8427e", - "params_2024-12-11_13-02-50.json:md5,9d3347ebf0840fd1553b6a3cf4bf5061", - "pipeline_software_mqc_versions.yml:md5,1b2f9328e5885175a2b6f3a5cd03f323", - "NA12878.chr22.1X.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e", - "NA12878.chr22.1X.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", - "test.genome.g.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e", - "test.genome.g.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", - "test2.genome.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e", - "test2.genome.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", + "versions.yml:md5,8e4cc1068ff64a583811f3e3bd8a4771", + "versions.yml:md5,0567f354f7d4ddac23b392f94e760ea2", + "versions.yml:md5,c030f20e1b02bd49b0a4ec369f5b4429", "empty.csv:md5,d41d8cd98f00b204e9800998ecf8427e", "indexed_merge.csv:md5,d41d8cd98f00b204e9800998ecf8427e", - "toindex_gvcf_merge.csv:md5,d41d8cd98f00b204e9800998ecf8427e", - "toindex_gvcf_nomerge.csv:md5,d41d8cd98f00b204e9800998ecf8427e", - "toindex_nomerge.csv:md5,d41d8cd98f00b204e9800998ecf8427e" + "toindex_gvcf_merge.csv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "concat.concat.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "indexed_merge.merge.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "toindex_concat_merge.merge.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "toindex_gvcf_merge.merge.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "callerA.reheader.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "callerB.reheader.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "concat.reheader.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "empty.reheader.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "merge.reheader.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test2.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], "meta": { "nf-test": "0.9.2", "nextflow": "24.10.2" }, - "timestamp": "2024-12-11T13:03:31.768336" + "timestamp": "2024-12-20T12:12:11.055567" } } diff --git a/tests/input-full.csv b/tests/input-full.csv index 212e1f4..d525459 100644 --- a/tests/input-full.csv +++ b/tests/input-full.csv @@ -1,8 +1,9 @@ -sample,gvcf,vcf_path,vcf_index_path -toindex_nomerge,false,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz, -toindex_gvcf_nomerge,true,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/homo_sapiens/illumina/gvcf/test.genome.g.vcf.gz, -indexed_merge,false,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/homo_sapiens/illumina/vcf/NA12878_chrM.vcf.gz,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/homo_sapiens/illumina/vcf/NA12878_chrM.vcf.gz.tbi -indexed_merge,false,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/homo_sapiens/illumina/vcf/NA24385_sv.vcf.gz,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/homo_sapiens/illumina/vcf/NA24385_sv.vcf.gz.tbi -toindex_gvcf_merge,true,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/homo_sapiens/illumina/gvcf/test.genome.g.vcf.gz, -toindex_gvcf_merge,true,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/homo_sapiens/illumina/gvcf/test2.genome.vcf.gz, -empty,false,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/homo_sapiens/illumina/vcf/empty.vcf.gz,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/homo_sapiens/illumina/vcf/empty.vcf.gz.tbi +sample,label,gvcf,vcf_path,vcf_index_path +indexed_merge,callerA,false,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/homo_sapiens/illumina/vcf/NA12878_chrM.vcf.gz,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/homo_sapiens/illumina/vcf/NA12878_chrM.vcf.gz.tbi +indexed_merge,callerB,false,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/homo_sapiens/illumina/vcf/NA24385_sv.vcf.gz,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/homo_sapiens/illumina/vcf/NA24385_sv.vcf.gz.tbi +toindex_gvcf_merge,callerA,true,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/homo_sapiens/illumina/gvcf/test.genome.g.vcf.gz, +toindex_gvcf_merge,callerB,true,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/homo_sapiens/illumina/gvcf/test2.genome.vcf.gz, +empty,empty,false,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/homo_sapiens/illumina/vcf/empty.vcf.gz,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/homo_sapiens/illumina/vcf/empty.vcf.gz.tbi +toindex_concat_merge,concat,false,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz, +toindex_concat_merge,concat,false,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz, +toindex_concat_merge,merge,false,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/homo_sapiens/illumina/vcf/NA24385_sv.vcf.gz, diff --git a/tests/input.csv b/tests/input.csv index c81c040..d97d5ea 100644 --- a/tests/input.csv +++ b/tests/input.csv @@ -1,2 +1,2 @@ -sample,gvcf,vcf_path,vcf_index_path -chr22,false,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz, +sample,label,gvcf,vcf_path,vcf_index_path +chr22,chr22,false,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz, diff --git a/workflows/vcftomat.nf b/workflows/vcftomat.nf index 1191aef..35f0b24 100644 --- a/workflows/vcftomat.nf +++ b/workflows/vcftomat.nf @@ -5,6 +5,8 @@ */ include { MULTIQC } from '../modules/nf-core/multiqc/main' include { GATK4_GENOTYPEGVCFS } from '../modules/nf-core/gatk4/genotypegvcfs/main' +include { BCFTOOLS_CONCAT } from '../modules/nf-core/bcftools/concat/main' +include { BCFTOOLS_REHEADER } from '../modules/nf-core/bcftools/reheader/main' include { BCFTOOLS_MERGE } from '../modules/nf-core/bcftools/merge/main' include { TABIX_TABIX } from '../modules/nf-core/tabix/tabix/main' include { VCF2MAT } from '../modules/local/vcf2mat/main' @@ -34,19 +36,28 @@ workflow VCFTOMAT { // // add index to non-indexed VCFs // - (ch_has_index, ch_has_no_index) = ch_samplesheet.branch{ - has_index: !it[0].to_index - to_index: it[0].to_index - } - - // Remove empty index [] from channel = it[2] and add file name for joining - input_to_index = ch_has_no_index.map{ it -> [ it[0] + [name:it[1][0].baseName], it[1] ] } + (ch_has_index, ch_has_no_index) = ch_samplesheet + .map{ it -> + def name = it[1][0].baseName + name = name + .replaceFirst(/\.g\.vcf$/, "") + .replaceFirst(/\.genome\.vcf$/, "") + .replaceFirst(/\.genome\.g\.vcf$/, "") + .replaceFirst(/\.g$/, "") + .replaceFirst(/\.genome$/, "") + .replaceFirst(/\.vcf$/, "") + [ it[0] + [ name:name ], it[1] ] + } + .branch{ + has_index: !it[0].to_index + to_index: it[0].to_index + } - TABIX_TABIX( input_to_index ) + TABIX_TABIX( ch_has_no_index ) ch_versions = ch_versions.mix(TABIX_TABIX.out.versions.first()) - ch_indexed = input_to_index.join( + ch_indexed = ch_has_no_index.join( TABIX_TABIX.out.tbi .map{ it -> [ it[0], [it[1]] ] } ).map { meta, vcf, tbi -> [ meta, [ vcf[0], tbi[0] ] ] } @@ -80,12 +91,63 @@ workflow VCFTOMAT { ch_versions = ch_versions.mix(GATK4_GENOTYPEGVCFS.out.versions) // - // Merge multiple VCFs per sample with BCFTOOLS_MERGE + // Concatenate converted VCFs if the entries for "id" and "label" are the same + // + (ch_single_vcf, ch_multiple_vcf) = ch_vcf + .map { meta, files -> + // Assuming files is a list of all VCF and TBI files + def vcfs = files.findAll { it.name.endsWith('.vcf.gz') } + def tbis = files.findAll { it.name.endsWith('.vcf.gz.tbi') } + [ [meta.id, meta.label], meta, vcfs, tbis] + } + .groupTuple(by: 0) + .map { id_label, metas, vcfs, tbis -> + def meta = metas[0] + def vcf_count = vcfs.flatten().size() + meta.single_vcf = (vcf_count == 1) + [meta, vcfs.flatten(), tbis.flatten()] + }.branch { + single: it[0].single_vcf + multiple: !it[0].single_vcf + } + + BCFTOOLS_CONCAT( ch_multiple_vcf ) + + ch_vcf_index = BCFTOOLS_CONCAT.out.vcf + .join(BCFTOOLS_CONCAT.out.tbi) + + ch_vcf_concat = ch_single_vcf.mix(ch_vcf_index) + .map { meta, vcf, tbi + -> [ meta.findAll { it.key != 'name' }, [ vcf, tbi ] ] } + + ch_versions = ch_versions.mix(BCFTOOLS_CONCAT.out.versions) + + if (params.rename) { + // + // Rename samples in vcf with the label + // + BCFTOOLS_REHEADER( + ch_vcf_concat.map{ it -> [ it[0], it[1][0], [], [] ] }, + [[],[]] + ) + + ch_vcf_index_rh = BCFTOOLS_REHEADER.out.vcf + .join(BCFTOOLS_REHEADER.out.index) + .map { meta, vcf, tbi -> [ meta, [ vcf, tbi ] ] } + + ch_versions = ch_versions.mix(BCFTOOLS_REHEADER.out.versions) + } else { + ch_vcf_index_rh = ch_vcf_concat + } + + + // + // Merge multiple VCFs per sample (patient) with BCFTOOLS_MERGE // // Bring all vcfs from one sample into a channel // Branch based on the number of VCFs per sample - (ch_single_vcf, ch_multiple_vcf) = ch_vcf + (ch_single_id, ch_multiple_id) = ch_vcf_index_rh .map { meta, files -> // Assuming files is a list of all VCF and TBI files def vcfs = files.findAll { it.name.endsWith('.vcf.gz') } @@ -96,23 +158,23 @@ workflow VCFTOMAT { .map { id, metas, vcfs, tbis -> def meta = metas[0] // Take the first meta, they should all be the same for a given ID def vcf_count = vcfs.flatten().size() - meta.single_vcf = (vcf_count == 1) + meta.single_id = (vcf_count == 1) [meta, vcfs.flatten(), tbis.flatten()] }.branch { - single: it[0].single_vcf - multiple: !it[0].single_vcf + single: it[0].single_id + multiple: !it[0].single_id } // Run BCFTOOLS_MERGE only on samples with multiple VCFs BCFTOOLS_MERGE( - ch_multiple_vcf, + ch_multiple_id, [[],[]], // fasta reference only needed for gvcf [[],[]], // fasta.fai reference only needed for gvcf [[],[]] // bed ) // Merge the results back into a single channel - ch_merged_vcfs = ch_single_vcf.mix(BCFTOOLS_MERGE.out.vcf) + ch_merged_vcfs = ch_single_id.mix(BCFTOOLS_MERGE.out.vcf) ch_versions = ch_versions.mix(BCFTOOLS_MERGE.out.versions)